ctx.onWorkspaceStatusDrop(event, headerWorkspaceStatus)
- : undefined
- }
- onPointerDown={
- isDraggableRepoHeader && headerRepo
- ? (event) => headerDrag.repoDrag.onHandlePointerDown(event, headerRepo)
- : isDraggableProjectGroupHeader && projectGroupIdForHeader
- ? (event) =>
- headerDrag.projectGroupDrag.onHandlePointerDown(event, projectGroupIdForHeader)
- : undefined
- }
- onClick={(event) => {
- if (shouldIgnoreRepoHeaderToggle(event)) {
- return
}
- ctx.toggleGroupWithScrollAnchor(collapseKey)
- }}
- onKeyDown={(e) => {
- if (shouldIgnoreRepoHeaderToggle(e)) {
- return
+ // Why: row keeps handle attrs so indent/padding still arms drag; grab
+ // cursor lives only on the title surface so … / + never inherit it.
+ data-repo-header-drag-handle={isDraggableRepoHeader ? '' : undefined}
+ data-project-group-header-id={projectGroupIdForHeader}
+ data-project-group-header-index={projectGroupHeaderIndex}
+ data-project-group-header-bucket={projectGroupHeaderBucketKey}
+ data-project-group-header-section-end={
+ projectGroupIdForHeader
+ ? headerDrag.projectGroupHeaderSectionEndByGroupId.get(projectGroupIdForHeader)
+ : undefined
}
- if (e.key === 'Enter' || e.key === ' ') {
- e.preventDefault()
+ data-project-group-header-drag-handle={isDraggableProjectGroupHeader ? '' : undefined}
+ data-workspace-status-drop-target={headerWorkspaceStatus ? '' : undefined}
+ data-workspace-status={headerWorkspaceStatus ?? undefined}
+ data-workspace-pin-drop-target={isPinnedHeader ? '' : undefined}
+ className={cn(
+ // Why: no row-level grab — only the title surface below shows the hand;
+ // actions use cursor-pointer so … / + never look reorderable.
+ 'group relative flex h-7 w-full items-center gap-1.5 pr-2 text-left transition-all',
+ !(isDraggableRepoHeader || isDraggableProjectGroupHeader) && 'cursor-pointer',
+ ctx.highlightedRevealRowKey === row.key &&
+ 'rounded-md bg-worktree-sidebar-accent ring-1 ring-worktree-sidebar-ring/50',
+ (isDraggingThis || isDraggingThisProjectGroup) &&
+ 'bg-accent/80 ring-1 ring-ring/40 shadow-md rounded-md scale-[1.01]',
+ headerWorkspaceStatus &&
+ ctx.dragOverStatus === headerWorkspaceStatus &&
+ 'rounded-md bg-worktree-sidebar-accent ring-1 ring-worktree-sidebar-ring/40',
+ isPinnedHeader &&
+ ctx.pinDragOver &&
+ 'rounded-md bg-worktree-sidebar-accent ring-1 ring-worktree-sidebar-ring/40',
+ row.repo && 'overflow-hidden'
+ )}
+ style={{
+ // Why: non-project headers like "All" are flat-list labels; don't reserve project hierarchy indent.
+ paddingLeft:
+ isRepoHeader || isProjectGroupHeader
+ ? getProjectGroupHeaderPaddingLeft(row.projectGroupDepth ?? 0)
+ : WORKTREE_SECTION_HEADER_PADDING_LEFT
+ }}
+ onDragOver={
+ isPinnedHeader
+ ? ctx.onWorkspacePinDragOver
+ : headerWorkspaceStatus
+ ? (event) => ctx.onWorkspaceStatusDragOver(event, headerWorkspaceStatus)
+ : undefined
+ }
+ onDragLeave={
+ isPinnedHeader
+ ? ctx.onWorkspacePinDragLeave
+ : headerWorkspaceStatus
+ ? ctx.onWorkspaceStatusDragLeave
+ : undefined
+ }
+ onDrop={
+ headerWorkspaceStatus
+ ? (event) => ctx.onWorkspaceStatusDrop(event, headerWorkspaceStatus)
+ : undefined
+ }
+ onPointerDown={
+ isDraggableRepoHeader && headerRepo
+ ? (event) => headerDrag.repoDrag.onHandlePointerDown(event, headerRepo)
+ : isDraggableProjectGroupHeader && projectGroupIdForHeader
+ ? (event) =>
+ headerDrag.projectGroupDrag.onHandlePointerDown(event, projectGroupIdForHeader)
+ : undefined
+ }
+ onClick={(event) => {
+ if (shouldIgnoreRepoHeaderToggle(event)) {
+ return
+ }
ctx.toggleGroupWithScrollAnchor(collapseKey)
- }
- }}
- >
- {/* Why: grab cursor on icon+title only. Row still has handle attrs so
+ }}
+ onKeyDown={(e) => {
+ if (shouldIgnoreRepoHeaderToggle(e)) {
+ return
+ }
+ if (e.key === 'Enter' || e.key === ' ') {
+ e.preventDefault()
+ ctx.toggleGroupWithScrollAnchor(collapseKey)
+ }
+ }}
+ >
+ {/* Why: grab cursor on icon+title only. Row still has handle attrs so
indent/padding can arm drag; actions are excluded via data-repo-header-actions.
self-stretch fills h-7 so grab matches the full title column height. */}
-
- {row.repo ? (
-
- ) : (
-
- )}
-
-
-
-
-
{label}
-
-
- {isRepoHeader ?
: null}
-
-
-
-
-
- {showHeaderCollapseAffordance ? (
{
- event.preventDefault()
- event.stopPropagation()
- ctx.toggleGroupWithScrollAnchor(collapseKey)
- }}
+ className={cn(
+ 'flex size-4 shrink-0 items-center justify-center rounded-[4px]',
+ repoHeaderColor ? 'text-muted-foreground' : headerVisual.tone
+ )}
>
-
+ {row.repo ? (
+
+ ) : (
+
+ )}
- ) : null}
- {isProjectGroupHeader && !row.repo && projectGroupIdForHeader ? (
-
- ) : null}
+
+
+
{label}
+ {hostContext ?
: null}
+
+
+ {isRepoHeader ?
: null}
+
+
+
- {folderBackedProjectGroup ? (
-