diff --git a/packages/ui/src/components/session/SessionSidebar.tsx b/packages/ui/src/components/session/SessionSidebar.tsx index 17745518..e9f5e365 100644 --- a/packages/ui/src/components/session/SessionSidebar.tsx +++ b/packages/ui/src/components/session/SessionSidebar.tsx @@ -44,6 +44,7 @@ import { RiGitBranchLine, RiGitPullRequestLine, RiGitRepositoryLine, + RiNodeTree, RiStickyNoteLine, RiLinkUnlinkM, @@ -1758,7 +1759,7 @@ export const SessionSidebar: React.FC = ({ }, [activeProjectForHeader, projectRenameDraft, renameProject]); const headerActionButtonClass = - 'inline-flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground hover:text-foreground hover:bg-interactive-hover/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/50'; + 'inline-flex h-6 w-6 items-center justify-center rounded-md leading-none text-muted-foreground hover:text-foreground hover:bg-interactive-hover/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary/50'; // Track when project sticky headers become "stuck" React.useEffect(() => { @@ -2535,9 +2536,9 @@ export const SessionSidebar: React.FC = ({ )} {reserveHeaderActionsSpace ? ( -
+
{activeProjectForHeader ? ( -
+
{stableActiveProjectIsRepo ? ( <> @@ -2564,7 +2565,7 @@ export const SessionSidebar: React.FC = ({ className={headerActionButtonClass} aria-label="New worktree" > - +

New worktree

diff --git a/packages/ui/src/lib/persistence.ts b/packages/ui/src/lib/persistence.ts index 880894d6..262ec4f7 100644 --- a/packages/ui/src/lib/persistence.ts +++ b/packages/ui/src/lib/persistence.ts @@ -147,6 +147,12 @@ const sanitizeProjects = (value: unknown): DesktopSettings['projects'] | undefin if (typeof candidate.label === 'string' && candidate.label.trim().length > 0) { project.label = candidate.label.trim(); } + if (typeof candidate.icon === 'string' && candidate.icon.trim().length > 0) { + project.icon = candidate.icon.trim(); + } + if (typeof candidate.color === 'string' && candidate.color.trim().length > 0) { + project.color = candidate.color.trim(); + } if (typeof candidate.addedAt === 'number' && Number.isFinite(candidate.addedAt) && candidate.addedAt >= 0) { project.addedAt = candidate.addedAt; } diff --git a/packages/ui/src/stores/useProjectsStore.ts b/packages/ui/src/stores/useProjectsStore.ts index c3c1012b..4bcfbcdd 100644 --- a/packages/ui/src/stores/useProjectsStore.ts +++ b/packages/ui/src/stores/useProjectsStore.ts @@ -116,6 +116,12 @@ const sanitizeProjects = (value: unknown): ProjectEntry[] => { if (typeof candidate.label === 'string' && candidate.label.trim().length > 0) { project.label = candidate.label.trim(); } + if (typeof candidate.icon === 'string' && candidate.icon.trim().length > 0) { + project.icon = candidate.icon.trim(); + } + if (typeof candidate.color === 'string' && candidate.color.trim().length > 0) { + project.color = candidate.color.trim(); + } if (typeof candidate.addedAt === 'number' && Number.isFinite(candidate.addedAt) && candidate.addedAt >= 0) { project.addedAt = candidate.addedAt; } diff --git a/packages/web/server/index.js b/packages/web/server/index.js index cf030305..2dfb83a9 100644 --- a/packages/web/server/index.js +++ b/packages/web/server/index.js @@ -1325,6 +1325,8 @@ const sanitizeProjects = (input) => { const rawPath = typeof candidate.path === 'string' ? candidate.path.trim() : ''; const normalizedPath = rawPath ? path.resolve(normalizeDirectoryPath(rawPath)) : ''; const label = typeof candidate.label === 'string' ? candidate.label.trim() : ''; + const icon = typeof candidate.icon === 'string' ? candidate.icon.trim() : ''; + const color = typeof candidate.color === 'string' ? candidate.color.trim() : ''; const addedAt = Number.isFinite(candidate.addedAt) ? Number(candidate.addedAt) : null; const lastOpenedAt = Number.isFinite(candidate.lastOpenedAt) ? Number(candidate.lastOpenedAt) @@ -1341,6 +1343,8 @@ const sanitizeProjects = (input) => { id, path: normalizedPath, ...(label ? { label } : {}), + ...(icon ? { icon } : {}), + ...(color ? { color } : {}), ...(Number.isFinite(addedAt) && addedAt >= 0 ? { addedAt } : {}), ...(Number.isFinite(lastOpenedAt) && lastOpenedAt >= 0 ? { lastOpenedAt } : {}), };