sessions - enforce icon color from theme icon (#306013)

This commit is contained in:
Benjamin Pasero
2026-03-28 22:16:52 +01:00
committed by GitHub
parent c9b8ed1bcf
commit 1d8f0aa771
4 changed files with 14 additions and 61 deletions

View File

@@ -119,12 +119,7 @@
justify-content: center;
}
&.session-icon-active > .codicon {
color: var(--vscode-textLink-foreground);
}
&.session-icon-pulse > .codicon {
color: var(--vscode-list-warningForeground);
animation: session-needs-input-pulse 2s ease-in-out infinite;
}
@@ -133,19 +128,6 @@
animation: none;
}
}
&.session-icon-unread > .codicon {
color: var(--vscode-textLink-foreground);
}
&.session-icon-error > .codicon {
color: var(--vscode-errorForeground);
}
/* Small dot for read sessions — subtle indicator */
> .codicon.codicon-circle-small-filled {
color: var(--vscode-agentSessionReadIndicator-foreground);
}
}
.session-main {

View File

@@ -16,7 +16,7 @@ import { createMatches, FuzzyScore, IMatch } from '../../../../../base/common/fi
import { Disposable, DisposableStore, MutableDisposable, toDisposable } from '../../../../../base/common/lifecycle.js';
import { MarkdownString } from '../../../../../base/common/htmlContent.js';
import { IReader, autorun } from '../../../../../base/common/observable.js';
import { ThemeIcon } from '../../../../../base/common/themables.js';
import { ThemeIcon, themeColorFromId } from '../../../../../base/common/themables.js';
import { URI } from '../../../../../base/common/uri.js';
import { fromNow } from '../../../../../base/common/date.js';
import { localize } from '../../../../../nls.js';
@@ -236,9 +236,6 @@ class SessionItemRenderer implements ITreeRenderer<SessionListItem, FuzzyScore,
const iconSpan = DOM.append(template.iconContainer, $(`span${ThemeIcon.asCSSSelector(icon)}`));
iconSpan.style.color = icon.color ? asCssVariable(icon.color.id) : '';
template.iconContainer.classList.toggle('session-icon-pulse', sessionStatus === SessionStatus.NeedsInput);
template.iconContainer.classList.toggle('session-icon-active', sessionStatus === SessionStatus.InProgress);
template.iconContainer.classList.toggle('session-icon-error', sessionStatus === SessionStatus.Error);
template.iconContainer.classList.toggle('session-icon-unread', !isRead && !isArchived && sessionStatus !== SessionStatus.InProgress && sessionStatus !== SessionStatus.NeedsInput && sessionStatus !== SessionStatus.Error);
}));
// Title — reactive
@@ -417,19 +414,18 @@ class SessionItemRenderer implements ITreeRenderer<SessionListItem, FuzzyScore,
private getStatusIcon(status: SessionStatus, isRead: boolean, isArchived: boolean, pullRequestIcon?: ThemeIcon): ThemeIcon {
switch (status) {
case SessionStatus.InProgress: return Codicon.sessionInProgress;
case SessionStatus.NeedsInput: return Codicon.circleFilled;
case SessionStatus.Error: return Codicon.error;
case SessionStatus.InProgress: return { ...Codicon.sessionInProgress, color: themeColorFromId('textLink.foreground') };
case SessionStatus.NeedsInput: return { ...Codicon.circleFilled, color: themeColorFromId('list.warningForeground') };
case SessionStatus.Error: return { ...Codicon.error, color: themeColorFromId('errorForeground') };
default:
if (pullRequestIcon) {
return pullRequestIcon;
}
if (!isRead && !isArchived) {
return Codicon.circleFilled;
return { ...Codicon.circleFilled, color: themeColorFromId('textLink.foreground') };
}
// Status-only: show small dot for read sessions
return Codicon.circleSmallFilled;
return { ...Codicon.circleSmallFilled, color: themeColorFromId('agentSessionReadIndicator.foreground') };
}
}

View File

@@ -403,15 +403,15 @@ export class AgentSessionRenderer extends Disposable implements ICompressibleTre
private getIcon(session: IAgentSession, statusOnly?: boolean): ThemeIcon {
if (session.status === AgentSessionStatus.InProgress) {
return Codicon.sessionInProgress;
return { ...Codicon.sessionInProgress, color: themeColorFromId('textLink.foreground') };
}
if (session.status === AgentSessionStatus.NeedsInput) {
return Codicon.circleFilled;
return { ...Codicon.circleFilled, color: themeColorFromId('list.warningForeground') };
}
if (session.status === AgentSessionStatus.Failed) {
return Codicon.error;
return { ...Codicon.error, color: themeColorFromId('errorForeground') };
}
if (statusOnly) {
@@ -433,18 +433,18 @@ export class AgentSessionRenderer extends Disposable implements ICompressibleTre
}
if (!session.isRead() && !session.isArchived()) {
return Codicon.circleFilled;
return { ...Codicon.circleFilled, color: themeColorFromId('textLink.foreground') };
}
if (!statusOnly && session.providerType === AgentSessionProviders.Local) {
return Codicon.circleSmallFilled;
return { ...Codicon.circleSmallFilled, color: themeColorFromId('agentSessionReadIndicator.foreground') };
}
if (!statusOnly) {
return session.icon;
}
return Codicon.circleSmallFilled;
return { ...Codicon.circleSmallFilled, color: themeColorFromId('agentSessionReadIndicator.foreground') };
}
private renderDescription(session: ITreeNode<IAgentSession, FuzzyScore>, template: IAgentSessionItemTemplate): boolean {

View File

@@ -131,37 +131,12 @@
align-items: center;
justify-content: center;
&.codicon.codicon-session-in-progress {
color: var(--vscode-textLink-foreground);
}
&.codicon.codicon-error {
color: var(--vscode-errorForeground);
}
&.codicon.codicon-circle-filled {
color: var(--vscode-textLink-foreground);
}
&.codicon.codicon-circle-filled.needs-input {
color: var(--vscode-list-warningForeground);
&.needs-input {
animation: agent-session-needs-input-pulse 2s ease-in-out infinite;
}
&.codicon.codicon-circle-small-filled {
color: var(--vscode-agentSessionReadIndicator-foreground);
}
&.codicon.codicon-git-pull-request {
color: var(--vscode-charts-green);
}
&.codicon.codicon-git-merge {
color: var(--vscode-charts-purple);
}
@media (prefers-reduced-motion: reduce) {
&.codicon.codicon-circle-filled.needs-input {
&.needs-input {
animation: none;
}
}