e.preventDefault()}
onMouseDown={handleScrollRegionMouseDown}
>
{tabs.map((tab, index) => (
{ tabRefs.current.set(tab.sessionId, node) }}
tab={tab}
isActive={tab.sessionId === activeTabId}
isDragOver={dragOverIndex === index}
- onClick={() => setActiveTab(tab.sessionId)}
+ isDragging={tab.sessionId === draggingSessionId}
+ dragOffsetX={tab.sessionId === draggingSessionId ? dragOffsetX : 0}
+ onClick={() => handleTabClick(tab.sessionId)}
onClose={() => handleClose(tab.sessionId)}
onContextMenu={(e) => handleContextMenu(e, tab.sessionId)}
- onDragStart={() => handleDragStart(index)}
- onDragOver={(e) => handleDragOver(e, index)}
- onDrop={() => handleDrop(index)}
- onDragEnd={handleDragEnd}
+ onMouseDown={(event) => handleTabMouseDown(event, index)}
/>
))}
@@ -291,36 +355,40 @@ export function TabBar() {
)
}
-function TabItem({ tab, isActive, isDragOver, onClick, onClose, onContextMenu, onDragStart, onDragOver, onDrop, onDragEnd }: {
+const TabItem = forwardRef void
onClose: () => void
onContextMenu: (e: React.MouseEvent) => void
- onDragStart: () => void
- onDragOver: (e: React.DragEvent) => void
- onDrop: () => void
- onDragEnd: () => void
-}) {
+ onMouseDown: (event: React.MouseEvent) => void
+}>(({ tab, isActive, isDragOver, isDragging, dragOffsetX, onClick, onClose, onContextMenu, onMouseDown }, ref) => {
return (
{tab.type === 'session' && tab.status === 'running' && (
@@ -340,6 +408,7 @@ function TabItem({ tab, isActive, isDragOver, onClick, onClose, onContextMenu, o
)
-}
+})
+TabItem.displayName = 'TabItem'
diff --git a/desktop/src/theme/globals.css b/desktop/src/theme/globals.css
index eeb72334..57f11120 100644
--- a/desktop/src/theme/globals.css
+++ b/desktop/src/theme/globals.css
@@ -412,6 +412,10 @@ button, input, textarea, select, a, [role="button"] {
[draggable="true"] {
-webkit-app-region: no-drag;
}
+.tab-bar-hit-area,
+.tab-bar-hit-area * {
+ -webkit-app-region: no-drag;
+}
/* Custom shadow from prototype */
.custom-shadow {