From 6186688e17af89a9bd77001e0eecc8c5efbdda9e Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Tue, 28 Apr 2026 17:12:49 +0300 Subject: [PATCH] fix: polish pinned session indicators Pinned recent sessions stay at top when already recent Default session rows align activity, pin, and chevron indicators Pinned icon no longer crowds session titles --- .../src/components/session/SessionSidebar.tsx | 5 +++-- .../session/sidebar/SessionNodeItem.tsx | 22 ++++++++----------- 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/ui/src/components/session/SessionSidebar.tsx b/packages/ui/src/components/session/SessionSidebar.tsx index 347042fe..6139e9c1 100644 --- a/packages/ui/src/components/session/SessionSidebar.tsx +++ b/packages/ui/src/components/session/SessionSidebar.tsx @@ -994,8 +994,9 @@ export const SessionSidebar: React.FC = ({ }, [projectSections, homeDirectory]); const activeNowSessions = React.useMemo( - () => deriveActiveNowSessions(activeNowEntries, new Map(sessions.map((session) => [session.id, session]))), - [activeNowEntries, sessions], + () => deriveActiveNowSessions(activeNowEntries, new Map(sessions.map((session) => [session.id, session]))) + .sort((a, b) => compareSessionsByPinnedAndTime(a, b, pinnedSessionIds)), + [activeNowEntries, pinnedSessionIds, sessions], ); const liveActiveSessions = React.useMemo( diff --git a/packages/ui/src/components/session/sidebar/SessionNodeItem.tsx b/packages/ui/src/components/session/sidebar/SessionNodeItem.tsx index efa707e5..b933082e 100644 --- a/packages/ui/src/components/session/sidebar/SessionNodeItem.tsx +++ b/packages/ui/src/components/session/sidebar/SessionNodeItem.tsx @@ -494,19 +494,17 @@ function SessionNodeItemComponent(props: Props): React.ReactNode { title={t('sessions.sidebar.session.status.unread')} /> ); - const inlineStatusMarker = !isMinimalMode && showStatusMarker ? ( - - {statusMarkerContent} - - ) : null; - const minimalLeadingStatusMarker = isMinimalMode && showStatusMarker ? ( + const leadingIndicators = showStatusMarker || isPinnedSession ? ( - {statusMarkerContent} + {showStatusMarker ? statusMarkerContent : null} + {isPinnedSession ? : null} ) : null; const subsessionChevron = hasChildren ? ( @@ -525,7 +523,8 @@ function SessionNodeItemComponent(props: Props): React.ReactNode { } }} className={cn( - 'absolute left-[-10px] top-1/2 inline-flex h-3.5 w-3.5 -translate-y-1/2 items-center justify-center rounded-md text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 transition-opacity', + 'absolute left-[-10px] inline-flex h-3.5 w-3.5 items-center justify-center rounded-md text-muted-foreground hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/50 transition-opacity', + isMinimalMode ? 'top-1/2 -translate-y-1/2' : 'top-[14.5px] -translate-y-1/2', isMinimalMode && showStatusMarker ? 'opacity-0 pointer-events-none group-hover:opacity-100 group-hover:pointer-events-auto group-focus-within:opacity-100 group-focus-within:pointer-events-auto' : '', @@ -721,7 +720,7 @@ function SessionNodeItemComponent(props: Props): React.ReactNode { isRowSelected && 'bg-primary/15', )} > - {minimalLeadingStatusMarker} + {leadingIndicators} {subsessionChevron}
{isMinimalMode ? ( @@ -748,7 +747,6 @@ function SessionNodeItemComponent(props: Props): React.ReactNode { )} >
- {isPinnedSession ? : null}
{renderHighlightedText(sessionTitle, normalizedSessionSearchQuery)}
{mobileVariant ? {sessionCompactUpdatedLabel} : null} {!mobileVariant ? ( @@ -813,8 +811,6 @@ function SessionNodeItemComponent(props: Props): React.ReactNode { )} >
- {inlineStatusMarker} - {isPinnedSession ? : null}
{renderHighlightedText(sessionTitle, normalizedSessionSearchQuery)}
{pendingPermissionCount > 0 ? (