diff --git a/package-lock.json b/package-lock.json index 5299353e945c27..5617a2dba1275f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,7 +23,7 @@ "@microsoft/dev-tunnels-ssh-tcp": "^3.12.22", "@parcel/watcher": "^2.5.6", "@types/semver": "^7.5.8", - "@vscode/codicons": "^0.0.46-43", + "@vscode/codicons": "^0.0.46-44", "@vscode/copilot-api": "^0.5.2", "@vscode/deviceid": "^0.1.1", "@vscode/diff": "0.0.2-7", @@ -4293,9 +4293,9 @@ } }, "node_modules/@vscode/codicons": { - "version": "0.0.46-43", - "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.46-43.tgz", - "integrity": "sha512-E9PUY2D+koeiVN6Pe3QBAVDxc0ZTLIlXbgTvqla2vt9eL+9Z9GtJzSsIfQ9GUgwQ9KEHDx2iTMylTzFfdWCfDg==", + "version": "0.0.46-44", + "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.46-44.tgz", + "integrity": "sha512-Oy9BsJ0Yr4cQc8vTgqY4F8vXsByIwOfXpGxnWKIwaJ6V9twR35C96uIIHPxNDW64oxQpx8oRR+9L7+Y7oPp+8w==", "license": "CC-BY-4.0" }, "node_modules/@vscode/component-explorer": { diff --git a/package.json b/package.json index 12e8a7fcfa704f..4faf8c49b396fc 100644 --- a/package.json +++ b/package.json @@ -113,7 +113,7 @@ "@microsoft/dev-tunnels-ssh-tcp": "^3.12.22", "@parcel/watcher": "^2.5.6", "@types/semver": "^7.5.8", - "@vscode/codicons": "^0.0.46-43", + "@vscode/codicons": "^0.0.46-44", "@vscode/copilot-api": "^0.5.2", "@vscode/deviceid": "^0.1.1", "@vscode/diff": "0.0.2-7", diff --git a/remote/web/package-lock.json b/remote/web/package-lock.json index 1c2da8933ee128..44b9a4ae340d96 100644 --- a/remote/web/package-lock.json +++ b/remote/web/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@vscode/codicons": "^0.0.46-43", + "@vscode/codicons": "^0.0.46-44", "@vscode/iconv-lite-umd": "0.7.1", "@vscode/tree-sitter-wasm": "^0.3.1", "@vscode/vscode-languagedetection": "1.0.23", @@ -73,9 +73,9 @@ "integrity": "sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ==" }, "node_modules/@vscode/codicons": { - "version": "0.0.46-43", - "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.46-43.tgz", - "integrity": "sha512-E9PUY2D+koeiVN6Pe3QBAVDxc0ZTLIlXbgTvqla2vt9eL+9Z9GtJzSsIfQ9GUgwQ9KEHDx2iTMylTzFfdWCfDg==", + "version": "0.0.46-44", + "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.46-44.tgz", + "integrity": "sha512-Oy9BsJ0Yr4cQc8vTgqY4F8vXsByIwOfXpGxnWKIwaJ6V9twR35C96uIIHPxNDW64oxQpx8oRR+9L7+Y7oPp+8w==", "license": "CC-BY-4.0" }, "node_modules/@vscode/iconv-lite-umd": { diff --git a/remote/web/package.json b/remote/web/package.json index 5336935c7c552a..4659a40bd13183 100644 --- a/remote/web/package.json +++ b/remote/web/package.json @@ -5,7 +5,7 @@ "dependencies": { "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", - "@vscode/codicons": "^0.0.46-43", + "@vscode/codicons": "^0.0.46-44", "@vscode/iconv-lite-umd": "0.7.1", "@vscode/tree-sitter-wasm": "^0.3.1", "@vscode/vscode-languagedetection": "1.0.23", diff --git a/src/vs/base/common/codiconsLibrary.ts b/src/vs/base/common/codiconsLibrary.ts index 1eaeeefbe1e247..c9f29b29d84ae5 100644 --- a/src/vs/base/common/codiconsLibrary.ts +++ b/src/vs/base/common/codiconsLibrary.ts @@ -771,4 +771,5 @@ export const codiconsLibrary = { layoutDensityDefault: register('layout-density-default', 0xecf5), gripperCorner: register('gripper-corner', 0xecf6), meteredConnection: register('metered-connection', 0xecf7), + reportQuestion: register('report-question', 0xecf8), } as const; diff --git a/src/vs/sessions/contrib/sessions/test/browser/sessionsList.fixture.ts b/src/vs/sessions/contrib/sessions/test/browser/sessionsList.fixture.ts index 58596bf45c4627..6b6405a1f13f3b 100644 --- a/src/vs/sessions/contrib/sessions/test/browser/sessionsList.fixture.ts +++ b/src/vs/sessions/contrib/sessions/test/browser/sessionsList.fixture.ts @@ -317,7 +317,7 @@ export default defineThemedFixtureGroup({ path: 'sessions/' }, { }, { labels: { kind: 'screenshot' }, additionalThemes: ['darkHighContrast', 'lightHighContrast'], - expectedVisualDescriptions: ['All sections are collapsed. Orange report icons replace the icons for Release work and vscode-docs, taking priority over unread indicators. The vscode section retains its folder icon because its needs-attention session appears only in Release work.'], + expectedVisualDescriptions: ['All sections are collapsed. Orange report-question icons replace the icons for Release work and vscode-docs, taking priority over unread indicators. The vscode section retains its folder icon because its needs-attention session appears only in Release work.'], }), SessionsList_CollapsedNeedsInputSections_Disabled: defineSessionsListFixture({ sessions: COLLAPSED_NEEDS_INPUT_SESSIONS, diff --git a/src/vs/sessions/contrib/sessions/test/browser/sessionsList.test.ts b/src/vs/sessions/contrib/sessions/test/browser/sessionsList.test.ts index e14004d1ee02b3..60c33cfd24325e 100644 --- a/src/vs/sessions/contrib/sessions/test/browser/sessionsList.test.ts +++ b/src/vs/sessions/contrib/sessions/test/browser/sessionsList.test.ts @@ -1162,7 +1162,7 @@ suite('Sessions - SessionsList', () => { function needsInputSections(container: HTMLElement): string[] { return [...container.querySelectorAll('.session-section')] - .filter(header => header.querySelector('.session-section-icon .codicon-report')) + .filter(header => header.querySelector('.session-section-icon .codicon-report-question')) .map(header => header.querySelector('.session-section-label')!.textContent!); } @@ -1253,7 +1253,7 @@ suite('Sessions - SessionsList', () => { return { ariaLabel: header.closest('.monaco-list-row')?.getAttribute('aria-label'), icon: header.querySelector('.session-section-icon')?.className, - indicator: !!header.querySelector('.codicon-circle-filled, .codicon-report, .monaco-pixel-spinner'), + indicator: !!header.querySelector('.codicon-circle-filled, .codicon-report-question, .monaco-pixel-spinner'), }; }), [ { ariaLabel: 'Group A, 1', icon: 'session-section-icon codicon codicon-folder-library', indicator: false }, @@ -1362,7 +1362,7 @@ suite('Sessions - SessionsList', () => { const label = grouped ? group.name : 'Workspace'; const header = getHeader(container, label); const getStatus = () => { - if (header.querySelector('.codicon-report')) { + if (header.querySelector('.codicon-report-question')) { return 'needsInput'; } const dot = header.querySelector('.codicon-circle-filled'); @@ -1412,17 +1412,17 @@ suite('Sessions - SessionsList', () => { } : {}); const label = grouped ? group.name : 'Workspace'; const header = getHeader(container, label); - const getStatus = () => header.querySelector('.codicon-report') ? 'needsInput' : header.querySelector('.codicon-circle-filled') ? 'unread' : 'none'; + const getStatus = () => header.querySelector('.codicon-report-question') ? 'needsInput' : header.querySelector('.codicon-circle-filled') ? 'unread' : 'none'; const states = [getStatus()]; const hiddenNeedsInput = !list.getVisibleSessions().some(session => session.sessionId === needsInput.session.sessionId); list.collapseAllSections(); states.push(getStatus()); - const reportIcon = header.querySelector('.codicon-report'); + const reportQuestionIcon = header.querySelector('.codicon-report-question'); const needsInputAria = header.closest('.monaco-list-row')?.getAttribute('aria-label'); unread.isRead.set(true, undefined); unread.isRead.set(false, undefined); - const preservesReportIcon = !!reportIcon && reportIcon === header.querySelector('.codicon-report'); + const preservesReportQuestionIcon = !!reportQuestionIcon && reportQuestionIcon === header.querySelector('.codicon-report-question'); needsInput.status.set(SessionStatus.Completed, undefined); states.push(getStatus()); const unreadAria = header.closest('.monaco-list-row')?.getAttribute('aria-label'); @@ -1445,8 +1445,8 @@ suite('Sessions - SessionsList', () => { assert.deepStrictEqual({ hiddenNeedsInput, states, - preservesReportIcon, - color: reportIcon?.style.color, + preservesReportQuestionIcon, + color: reportQuestionIcon?.style.color, needsInputAria, unreadAria, expandedPulse, @@ -1454,7 +1454,7 @@ suite('Sessions - SessionsList', () => { }, { hiddenNeedsInput: true, states: ['none', 'needsInput', 'unread', 'needsInput', 'unread', 'needsInput', 'none', 'needsInput', 'unread', 'none'], - preservesReportIcon: true, + preservesReportQuestionIcon: true, color: 'var(--vscode-list-warningForeground)', needsInputAria: `${label}, 6, session needs attention`, unreadAria: `${label}, 6, contains unread sessions`, @@ -1588,7 +1588,7 @@ suite('Sessions - SessionsList', () => { }); }); - test('uses the report icon for needs-attention with reduced motion', () => { + test('uses the report-question icon for needs-attention with reduced motion', () => { const { session } = createTestSession('Needs input', { status: SessionStatus.NeedsInput }); const { list, container } = renderList([session], {}, true); list.collapseAllSections(); @@ -1596,12 +1596,12 @@ suite('Sessions - SessionsList', () => { assert.deepStrictEqual({ hasSpinner: !!header.querySelector('.monaco-pixel-spinner'), - hasReportIcon: !!header.querySelector('.codicon-report'), - color: header.querySelector('.codicon-report')?.style.color, + hasReportQuestionIcon: !!header.querySelector('.codicon-report-question'), + color: header.querySelector('.codicon-report-question')?.style.color, ariaLabel: header.closest('.monaco-list-row')?.getAttribute('aria-label'), }, { hasSpinner: false, - hasReportIcon: true, + hasReportQuestionIcon: true, color: 'var(--vscode-list-warningForeground)', ariaLabel: 'Workspace, 1, session needs attention', }); @@ -1624,7 +1624,7 @@ suite('Sessions - SessionsList', () => { const header = getHeader(container, label); return { ariaLabel: header.closest('.monaco-list-row')?.getAttribute('aria-label'), - indicator: !!header.querySelector('.codicon-circle-filled, .codicon-report, .monaco-pixel-spinner'), + indicator: !!header.querySelector('.codicon-circle-filled, .codicon-report-question, .monaco-pixel-spinner'), }; }), [ { ariaLabel: 'Group A, 0', indicator: false }, diff --git a/src/vs/sessions/services/sessions/browser/sessionsListModelService.ts b/src/vs/sessions/services/sessions/browser/sessionsListModelService.ts index 3ddae8a2fb0beb..034d61930fdc81 100644 --- a/src/vs/sessions/services/sessions/browser/sessionsListModelService.ts +++ b/src/vs/sessions/services/sessions/browser/sessionsListModelService.ts @@ -89,7 +89,7 @@ export interface ISessionsListModelService { * * Note: when motion is allowed, surfaces that host a {@link SessionStatusIcon} * (sessions list, session header) render a pixel spinner for `InProgress`. - * Other states, including the pulsing report icon for `NeedsInput`, use the + * Other states, including the pulsing report-question icon for `NeedsInput`, use the * icon returned here. Surfaces that don't host the widget, such as the * sessions picker, also use these icons. */ @@ -338,7 +338,7 @@ export class SessionsListModelService extends Disposable implements ISessionsLis case SessionStatus.InProgress: return { ...Codicon.sessionInProgress, color: themeColorFromId('textLink.foreground') }; case SessionStatus.NeedsInput: - return { ...Codicon.report, color: themeColorFromId('list.warningForeground') }; + return { ...Codicon.reportQuestion, color: themeColorFromId('list.warningForeground') }; case SessionStatus.Error: return { ...Codicon.error, color: themeColorFromId('errorForeground') }; default: diff --git a/src/vs/sessions/services/sessions/test/browser/sessionsListModelService.test.ts b/src/vs/sessions/services/sessions/test/browser/sessionsListModelService.test.ts index 85b5e731606ee6..11d69d429a4e0f 100644 --- a/src/vs/sessions/services/sessions/test/browser/sessionsListModelService.test.ts +++ b/src/vs/sessions/services/sessions/test/browser/sessionsListModelService.test.ts @@ -86,12 +86,12 @@ suite('SessionsListModelService', () => { }); }); - test('uses the report icon when a session needs attention', () => { + test('uses the report-question icon when a session needs attention', () => { const icon = service.getStatusIcon(SessionStatus.NeedsInput, true, false); assert.deepStrictEqual( { id: icon.id, color: icon.color?.id }, - { id: Codicon.report.id, color: 'list.warningForeground' }, + { id: Codicon.reportQuestion.id, color: 'list.warningForeground' }, ); }); diff --git a/src/vs/sessions/test/browser/sessionStatusIcon.test.ts b/src/vs/sessions/test/browser/sessionStatusIcon.test.ts index bb41e9f65d60b1..6e82cea518d6de 100644 --- a/src/vs/sessions/test/browser/sessionStatusIcon.test.ts +++ b/src/vs/sessions/test/browser/sessionStatusIcon.test.ts @@ -85,11 +85,11 @@ suite('Sessions - SessionStatusIcon', () => { }); for (const reducedMotion of [false, true]) { - test(`renders needs-attention as a pulsing report icon${reducedMotion ? ' with reduced motion' : ''}`, () => { + test(`renders needs-attention as a pulsing report-question icon${reducedMotion ? ' with reduced motion' : ''}`, () => { const container = document.createElement('div'); const modelService = new class extends mock() { override getStatusIcon() { - return Codicon.report; + return Codicon.reportQuestion; } }(); const accessibilityService = new class extends TestAccessibilityService { @@ -104,7 +104,7 @@ suite('Sessions - SessionStatusIcon', () => { pulses: container.classList.contains('session-icon-pulse'), }, { icons: [{ - className: 'codicon codicon-report', + className: 'codicon codicon-report-question', fadingOut: undefined, opacity: '', transition: '', diff --git a/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.ts b/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.ts index d5fe82cc8efb5e..a25334cc0a4df4 100644 --- a/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.ts +++ b/src/vs/workbench/contrib/chat/browser/agentSessions/agentSessionsViewer.ts @@ -195,7 +195,7 @@ export function getAgentSessionStatusIcon(session: IAgentSession): ThemeIcon { } if (session.status === AgentSessionStatus.NeedsInput) { - return { ...Codicon.report, color: themeColorFromId('list.warningForeground') }; + return { ...Codicon.reportQuestion, color: themeColorFromId('list.warningForeground') }; } if (session.status === AgentSessionStatus.Failed) { diff --git a/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentTitleBarStatusWidget.ts b/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentTitleBarStatusWidget.ts index 2c567f280f3e1c..add387cf748f47 100644 --- a/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentTitleBarStatusWidget.ts +++ b/src/vs/workbench/contrib/chat/browser/agentSessions/experiments/agentTitleBarStatusWidget.ts @@ -515,14 +515,14 @@ export class AgentTitleBarStatusWidget extends BaseActionViewItem { const isCompactMode = true; pill.classList.toggle('compact-mode', isCompactMode); - // Left icon container (sparkle by default, report+count when attention needed, search on hover) + // Left icon container (sparkle by default, attention icon+count when attention needed, search on hover) const leftIcon = $('span.agent-status-left-icon'); if (hasAttentionNeeded) { - // Show report icon + count when sessions need attention - const reportIcon = renderIcon(Codicon.report); + // Show attention icon + count when sessions need attention + const attentionIcon = renderIcon(Codicon.reportQuestion); const countSpan = $('span.agent-status-attention-count'); countSpan.textContent = String(attentionNeededSessions.length); - reset(leftIcon, reportIcon, countSpan); + reset(leftIcon, attentionIcon, countSpan); leftIcon.classList.add('has-attention'); } else { reset(leftIcon, renderIcon(Codicon.searchSparkle)); @@ -992,7 +992,7 @@ export class AgentTitleBarStatusWidget extends BaseActionViewItem { needsInputSection.setAttribute('role', 'button'); needsInputSection.tabIndex = 0; const needsInputIcon = $('span.agent-status-icon'); - reset(needsInputIcon, renderIcon(Codicon.report)); + reset(needsInputIcon, renderIcon(Codicon.reportQuestion)); needsInputSection.appendChild(needsInputIcon); const needsInputCount = $('span.agent-status-text'); needsInputCount.textContent = String(attentionNeededSessions.length); diff --git a/src/vs/workbench/contrib/chat/test/browser/agentSessions/agentSessionsDataSource.test.ts b/src/vs/workbench/contrib/chat/test/browser/agentSessions/agentSessionsDataSource.test.ts index e3cce1ffe1cc83..32ba0a60ed70e2 100644 --- a/src/vs/workbench/contrib/chat/test/browser/agentSessions/agentSessionsDataSource.test.ts +++ b/src/vs/workbench/contrib/chat/test/browser/agentSessions/agentSessionsDataSource.test.ts @@ -145,7 +145,7 @@ suite('AgentSessionsDataSource', () => { ['unread', { ...Codicon.circleFilled, color: themeColorFromId('textLink.foreground') }], ['archived', { ...Codicon.passFilled, color: themeColorFromId('agentSessionReadIndicator.foreground') }], ['in-progress', { ...Codicon.sessionInProgress, color: themeColorFromId('textLink.foreground') }], - ['needs-input', { ...Codicon.report, color: themeColorFromId('list.warningForeground') }], + ['needs-input', { ...Codicon.reportQuestion, color: themeColorFromId('list.warningForeground') }], ['failed', { ...Codicon.error, color: themeColorFromId('errorForeground') }], ]); }); diff --git a/test/componentFixtures/blocks-ci-screenshots.md b/test/componentFixtures/blocks-ci-screenshots.md index a1e68b13109659..6821d847ec7ddd 100644 --- a/test/componentFixtures/blocks-ci-screenshots.md +++ b/test/componentFixtures/blocks-ci-screenshots.md @@ -166,13 +166,13 @@ ![screenshot](https://hediet-screenshots.azurewebsites.net/images/133b77cee2dd44df7906261b12cbf019eb0a4dbc2dc9d88a865d04687cdbbf8f) #### sessions/sessionsList/SessionsList_CompactNeedsInput/Light -![screenshot](https://hediet-screenshots.azurewebsites.net/images/0618919023690b82ef2c57c1e058e42dd5f06ebae1d58b07610f116a4a5e312b) +![screenshot](https://hediet-screenshots.azurewebsites.net/images/aec8f9c6a9a7f6941392504d3a0446ba95368a8445fdd07b937b3adfde43516e) #### sessions/sessionsList/SessionsList_CompactNestedChatActions/Light ![screenshot](https://hediet-screenshots.azurewebsites.net/images/8806d13377c47bb5e81a5ddda8756bb91d06b05a07b0a997b6a9947311649169) #### sessions/sessionsList/SessionsList_CompactNestedChatApprovals/Light -![screenshot](https://hediet-screenshots.azurewebsites.net/images/be0ba8245982fc76d83a7ced7acd61bac38c8422a84070af0e6399de6a657632) +![screenshot](https://hediet-screenshots.azurewebsites.net/images/fa63aac9ae39aced7a32e93e8d8f66af2f0a952e458f37deda7a81e62b1d2f2d) #### sessions/sessionsList/SessionsList_CompactNestedChatPrimaryAction/Light ![screenshot](https://hediet-screenshots.azurewebsites.net/images/ed18223f207e2dd6968527c3594213879ca07b1462e6e91b6cfc233d8578cf20) diff --git a/test/componentFixtures/playwright/tests/sessionsListTwistie.spec.ts b/test/componentFixtures/playwright/tests/sessionsListTwistie.spec.ts index 2a8a8c8a994a6b..90c17df3ee8ff5 100644 --- a/test/componentFixtures/playwright/tests/sessionsListTwistie.spec.ts +++ b/test/componentFixtures/playwright/tests/sessionsListTwistie.spec.ts @@ -93,7 +93,7 @@ for (const theme of ['Dark', 'Light']) { for (const theme of ['Dark', 'Light', 'DarkHighContrast', 'LightHighContrast']) { for (const { name, fixture, ariaStatus, indicatorClass, color, count } of [ { name: 'unread', fixture: 'SessionsList_CollapsedUnreadSections', ariaStatus: 'contains unread sessions', indicatorClass: '.codicon-circle-filled', color: '--vscode-textLink-foreground', count: 1 }, - { name: 'needs-input', fixture: 'SessionsList_CollapsedNeedsInputSections', ariaStatus: 'session needs attention', indicatorClass: '.codicon-report', color: '--vscode-list-warningForeground', count: 2 }, + { name: 'needs-input', fixture: 'SessionsList_CollapsedNeedsInputSections', ariaStatus: 'session needs attention', indicatorClass: '.codicon-report-question', color: '--vscode-list-warningForeground', count: 2 }, { name: 'CI-failure', fixture: 'SessionsList_CollapsedCIFailureSections', ariaStatus: 'session has failing CI checks', indicatorClass: '.codicon-circle-filled', color: '--vscode-list-warningForeground', count: 2 }, ]) { test.describe(`collapsed section ${name} indicators (${theme})`, () => {