From c482c93da2f3f6b3478d1c59d86399bda19a003f Mon Sep 17 00:00:00 2001 From: Michael Johnston Date: Wed, 26 Aug 2026 12:44:50 -0700 Subject: [PATCH 1/6] fix(web): align legacy thread metadata columns --- apps/web/src/components/LegacySidebar.tsx | 36 +++++++++++++++-------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/apps/web/src/components/LegacySidebar.tsx b/apps/web/src/components/LegacySidebar.tsx index 0f4201390dae..57145099f624 100644 --- a/apps/web/src/components/LegacySidebar.tsx +++ b/apps/web/src/components/LegacySidebar.tsx @@ -577,10 +577,10 @@ export const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThr /> ); const threadMetaClassName = isConfirmingArchive - ? "pointer-events-none opacity-0" + ? "pointer-events-none inline-flex w-12 justify-end opacity-0" : !isThreadRunning - ? "pointer-events-none transition-opacity duration-150 max-sm:pr-6 group-hover/menu-sub-item:opacity-0 group-focus-within/menu-sub-item:opacity-0" - : "pointer-events-none"; + ? "pointer-events-none inline-flex w-12 justify-end transition-opacity duration-150 group-hover/menu-sub-item:opacity-0 group-focus-within/menu-sub-item:opacity-0" + : "pointer-events-none inline-flex w-12 justify-end"; const [threadRowActive, setThreadRowActive] = useState(false); const clearConfirmingArchive = useCallback(() => { setConfirmingArchiveThreadKey((current) => (current === threadKey ? null : current)); @@ -937,7 +937,7 @@ export const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThr )}
- {cleanup === null && discoveredPorts.length > 0 && ( + {cleanup === null && discoveredPorts.length > 0 ? ( 1 ? ` (+${discoveredPorts.length - 1})` : ""} - )} - {props.showWorktreeIndicators ? : null} - {terminalStatus && ( + ) : null} + {terminalStatus ? ( {terminalStatus.label} - )} + ) : null} + {/* These fixed tracks are the scanning columns for every thread row. + Empty local/worktree cells stay mounted, and the timestamp cannot + widen the grid and push either icon sideways. */}
- + + {props.showWorktreeIndicators ? : null} + + {showsThreadEnvironmentIcon ? ( ) ) : null} - + {jumpLabel ? ( hasActiveAnnotation && thread.annotation ? ( From 4b6bb2cde77d4534122b9ff0d6f98ba53998dafe Mon Sep 17 00:00:00 2001 From: Michael Johnston Date: Thu, 27 Aug 2026 01:18:45 -0700 Subject: [PATCH 2/6] fix(web): preserve sidebar icon spacing when scaled --- apps/web/src/components/LegacySidebar.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/apps/web/src/components/LegacySidebar.tsx b/apps/web/src/components/LegacySidebar.tsx index 57145099f624..b324981fda18 100644 --- a/apps/web/src/components/LegacySidebar.tsx +++ b/apps/web/src/components/LegacySidebar.tsx @@ -577,10 +577,10 @@ export const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThr /> ); const threadMetaClassName = isConfirmingArchive - ? "pointer-events-none inline-flex w-12 justify-end opacity-0" + ? "pointer-events-none inline-flex w-full justify-end opacity-0" : !isThreadRunning - ? "pointer-events-none inline-flex w-12 justify-end transition-opacity duration-150 group-hover/menu-sub-item:opacity-0 group-focus-within/menu-sub-item:opacity-0" - : "pointer-events-none inline-flex w-12 justify-end"; + ? "pointer-events-none inline-flex w-full justify-end transition-opacity duration-150 group-hover/menu-sub-item:opacity-0 group-focus-within/menu-sub-item:opacity-0" + : "pointer-events-none inline-flex w-full justify-end"; const [threadRowActive, setThreadRowActive] = useState(false); const clearConfirmingArchive = useCallback(() => { setConfirmingArchiveThreadKey((current) => (current === threadKey ? null : current)); @@ -979,17 +979,17 @@ export const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThr Empty local/worktree cells stay mounted, and the timestamp cannot widen the grid and push either icon sideways. */}
{props.showWorktreeIndicators ? : null} {showsThreadEnvironmentIcon ? ( From d554b9afca59e903d6ebd2289d4cdf51760e6937 Mon Sep 17 00:00:00 2001 From: Michael Johnston Date: Thu, 27 Aug 2026 01:44:41 -0700 Subject: [PATCH 3/6] fix(web): keep jump hints clear of metadata icons --- apps/web/src/components/LegacySidebar.tsx | 27 ++++++++++++++++------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/apps/web/src/components/LegacySidebar.tsx b/apps/web/src/components/LegacySidebar.tsx index b324981fda18..19f70f899c64 100644 --- a/apps/web/src/components/LegacySidebar.tsx +++ b/apps/web/src/components/LegacySidebar.tsx @@ -576,11 +576,14 @@ export const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThr standalone /> ); - const threadMetaClassName = isConfirmingArchive - ? "pointer-events-none inline-flex w-full justify-end opacity-0" + const threadMetaVisibilityClassName = isConfirmingArchive + ? "opacity-0" : !isThreadRunning - ? "pointer-events-none inline-flex w-full justify-end transition-opacity duration-150 group-hover/menu-sub-item:opacity-0 group-focus-within/menu-sub-item:opacity-0" - : "pointer-events-none inline-flex w-full justify-end"; + ? "transition-opacity duration-150 group-hover/menu-sub-item:opacity-0 group-focus-within/menu-sub-item:opacity-0" + : ""; + const threadMetaClassName = `pointer-events-none inline-flex w-full justify-end ${ + jumpLabel ? "col-span-3 col-start-1 row-start-1 z-10" : "" + } ${threadMetaVisibilityClassName}`; const [threadRowActive, setThreadRowActive] = useState(false); const clearConfirmingArchive = useCallback(() => { setConfirmingArchiveThreadKey((current) => (current === threadKey ? null : current)); @@ -977,7 +980,9 @@ export const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThr ) : null} {/* These fixed tracks are the scanning columns for every thread row. Empty local/worktree cells stay mounted, and the timestamp cannot - widen the grid and push either icon sideways. */} + widen the grid and push either icon sideways. A transient jump + hint replaces all three tracks so a custom shortcut cannot paint + across visible metadata icons. */}
- {props.showWorktreeIndicators ? : null} + {jumpLabel === null && props.showWorktreeIndicators ? ( + + ) : null} - {showsThreadEnvironmentIcon ? ( + {jumpLabel === null && showsThreadEnvironmentIcon ? ( ) ) : null} - + {jumpLabel ? ( hasActiveAnnotation && thread.annotation ? ( From 1ed09c7773aab358ca8e184dbac260fb4f4105f3 Mon Sep 17 00:00:00 2001 From: Michael Johnston Date: Thu, 27 Aug 2026 02:05:57 -0700 Subject: [PATCH 4/6] fix(web): keep jump hints in one grid row --- apps/web/src/components/LegacySidebar.tsx | 85 ++++++++++++----------- 1 file changed, 45 insertions(+), 40 deletions(-) diff --git a/apps/web/src/components/LegacySidebar.tsx b/apps/web/src/components/LegacySidebar.tsx index 19f70f899c64..0abc0800da9a 100644 --- a/apps/web/src/components/LegacySidebar.tsx +++ b/apps/web/src/components/LegacySidebar.tsx @@ -979,50 +979,55 @@ export const SidebarThreadRow = memo(function SidebarThreadRow(props: SidebarThr ) : null} {/* These fixed tracks are the scanning columns for every thread row. - Empty local/worktree cells stay mounted, and the timestamp cannot - widen the grid and push either icon sideways. A transient jump - hint replaces all three tracks so a custom shortcut cannot paint - across visible metadata icons. */} + Empty local/worktree cells stay mounted for ordinary timestamps, + which cannot widen the grid and push either icon sideways. A + transient jump hint replaces all three cells and tracks so a + custom shortcut cannot paint across visible metadata icons or + create an implicit grid row. */}
- - {jumpLabel === null && props.showWorktreeIndicators ? ( - - ) : null} - - - {jumpLabel === null && showsThreadEnvironmentIcon ? ( - - - } - > - - - {threadEnvironmentLabel} - - ) : null} - + {jumpLabel === null ? ( + <> + + {props.showWorktreeIndicators ? ( + + ) : null} + + + {showsThreadEnvironmentIcon ? ( + + + } + > + + + {threadEnvironmentLabel} + + ) : null} + + + ) : null} {isConfirmingArchive ? (