From a9e2b49e56c868d89d6a2bfb21dddf21632ec252 Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Sat, 21 Mar 2026 17:04:20 -0700 Subject: [PATCH] Add card gap and quick-create in worktree dialog (#10) Co-authored-by: Claude Opus 4.6 --- package.json | 2 +- .../src/components/sidebar/AddWorktreeDialog.tsx | 12 +++++++++++- src/renderer/src/components/sidebar/WorktreeCard.tsx | 11 ++++++----- src/renderer/src/components/sidebar/WorktreeList.tsx | 4 ++-- 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/package.json b/package.json index 473232f82..2426cd338 100644 --- a/package.json +++ b/package.json @@ -15,7 +15,7 @@ "start": "electron-vite preview", "dev": "electron-vite dev", "build": "npm run typecheck && electron-vite build", - "postinstall": "electron-builder install-app-deps", + "postinstall": "pnpm rebuild electron && electron-builder install-app-deps", "build:unpack": "npm run build && electron-builder --dir", "build:win": "npm run build && electron-builder --win", "build:icons": "bash icon/generate.sh", diff --git a/src/renderer/src/components/sidebar/AddWorktreeDialog.tsx b/src/renderer/src/components/sidebar/AddWorktreeDialog.tsx index 56b1b3c2c..d165ccff5 100644 --- a/src/renderer/src/components/sidebar/AddWorktreeDialog.tsx +++ b/src/renderer/src/components/sidebar/AddWorktreeDialog.tsx @@ -198,9 +198,19 @@ const AddWorktreeDialog = React.memo(function AddWorktreeDialog() { } }, [isOpen, repos.length, handleOpenChange]) + const handleKeyDown = useCallback( + (e: React.KeyboardEvent) => { + if (e.key === 'Enter' && !e.shiftKey && repoId && name.trim() && !creating) { + e.preventDefault() + handleCreate() + } + }, + [repoId, name, creating, handleCreate] + ) + return ( - + New Worktree diff --git a/src/renderer/src/components/sidebar/WorktreeCard.tsx b/src/renderer/src/components/sidebar/WorktreeCard.tsx index f4d4d3dc6..bec446a54 100644 --- a/src/renderer/src/components/sidebar/WorktreeCard.tsx +++ b/src/renderer/src/components/sidebar/WorktreeCard.tsx @@ -144,11 +144,12 @@ const WorktreeCard = React.memo(function WorktreeCard({ } }, [repo, worktree.linkedIssue, issue, fetchIssue, issueCacheKey]) - // Stable click handler - const handleClick = useCallback( - () => setActiveWorktree(worktree.id), - [worktree.id, setActiveWorktree] - ) + // Stable click handler – ignore clicks that are really text selections + const handleClick = useCallback(() => { + const selection = window.getSelection() + if (selection && selection.toString().length > 0) return + setActiveWorktree(worktree.id) + }, [worktree.id, setActiveWorktree]) const handleToggleUnreadQuick = useCallback( (event: React.MouseEvent) => { diff --git a/src/renderer/src/components/sidebar/WorktreeList.tsx b/src/renderer/src/components/sidebar/WorktreeList.tsx index 30391bfee..a81a2f345 100644 --- a/src/renderer/src/components/sidebar/WorktreeList.tsx +++ b/src/renderer/src/components/sidebar/WorktreeList.tsx @@ -273,7 +273,7 @@ const WorktreeList = React.memo(function WorktreeList() { const virtualizer = useVirtualizer({ count: rows.length, getScrollElement: () => scrollRef.current, - estimateSize: (index) => (rows[index].type === 'header' ? 38 : 56), + estimateSize: (index) => (rows[index].type === 'header' ? 38 : 56 + 4), overscan: 10, getItemKey: (index) => { const row = rows[index] @@ -450,7 +450,7 @@ const WorktreeList = React.memo(function WorktreeList() { key={vItem.key} data-index={vItem.index} ref={virtualizer.measureElement} - className="absolute left-0 right-0" + className="absolute left-0 right-0 pb-1" style={{ transform: `translateY(${vItem.start}px)` }} >