Conversation
There was a problem hiding this comment.
Pull request overview
This PR refines the Chat Question Carousel UI and interactions by adding ArrowUp/ArrowDown keyboard navigation between the option list and the freeform textarea, and by updating styling (badge opacity, border radius tokens, padding) to better match the chat list visual language, including theme tweaks for the 2026 theme.
Changes:
- Add ArrowUp/ArrowDown keyboard navigation between the options list and the freeform textarea (single- and multi-select).
- Update carousel styling (background token, border radius tokens, list spacing, badge styling, textarea chrome removal).
- Adjust 2026 theme styling (border radius override and
list.activeSelectionBackground).
Reviewed changes
Copilot reviewed 4 out of 4 changed files in this pull request and generated 2 comments.
| File | Description |
|---|---|
| src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatQuestionCarousel.css | Visual polish for carousel container/header/list/freeform input; adjusts spacing, tokens, and badge styling. |
| src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.ts | Adds ArrowUp/ArrowDown navigation between list items and freeform textarea for single- and multi-select. |
| extensions/theme-2026/themes/styles.css | Applies 2026 theme border-radius styling to the question carousel container. |
| extensions/theme-2026/themes/2026-dark.json | Tweaks list.activeSelectionBackground color for the 2026 Dark theme. |
Comments suppressed due to low confidence (2)
src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.ts:844
- Calling
updateSelection(-1)clears the selected styling butupdateSelectionnever clearsaria-activedescendanton the listbox, so assistive tech may still treat the previously selected option as the active descendant while focus is moved to the freeform textarea. Consider removing thearia-activedescendantattribute (or setting it to an empty string) when switching to the freeform input to keep ARIA state accurate.
if (data.selectedIndex >= listItems.length - 1) {
updateSelection(-1);
freeformTextarea.focus();
return;
src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatQuestionCarousel.css:287
.chat-question-freeform-textarea:focus { outline: none; }combined withborder: noneremoves the primary visible focus indicator for the custom answer input. Highlighting the number badge via:focus-withinhelps, but it doesn’t clearly indicate the actual input focus/caret target. Consider restoring a:focus-visibleoutline (or equivalent focus ring) on the textarea or its container to keep keyboard focus discoverable.
.chat-question-freeform-textarea:focus {
outline: none;
}
src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.ts
Show resolved
Hide resolved
src/vs/workbench/contrib/chat/browser/widget/chatContentParts/media/chatQuestionCarousel.css
Show resolved
Hide resolved
…-carousel-polish # Conflicts: # extensions/theme-2026/themes/styles.css
…Q:/A: summary, Cmd+Enter submit
src/vs/workbench/contrib/chat/test/common/tools/builtinTools/askQuestionsTool.test.ts
Outdated
Show resolved
Hide resolved
src/vs/workbench/contrib/chat/browser/actions/chatQueueActions.ts
Outdated
Show resolved
Hide resolved
src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.ts
Show resolved
Hide resolved
src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.ts
Outdated
Show resolved
Hide resolved
src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.ts
Show resolved
Hide resolved
src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.ts
Outdated
Show resolved
Hide resolved
…/steer, deduplicate format helper, fix JSDoc
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 7 out of 7 changed files in this pull request and generated 3 comments.
Comments suppressed due to low confidence (1)
src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.ts:275
saveCurrentAnswer()only writes whenanswer !== undefined, but it never deletes a previously stored answer when the user clears their selection/freeform input. This can cause stale answers to be submitted (e.g. answer a question, go back, clear it, navigate away — the old value remains in_answers). Consider deleting the key whengetCurrentAnswer()returnsundefinedso the map reflects the current UI state.
private saveCurrentAnswer(): void {
const currentQuestion = this.carousel.questions[this._currentIndex];
if (!currentQuestion) {
return; // Review tab or out of bounds
}
const answer = this.getCurrentAnswer();
if (answer !== undefined) {
this._answers.set(currentQuestion.id, answer);
}
}
src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.ts
Show resolved
Hide resolved
src/vs/workbench/contrib/chat/browser/widget/chatContentParts/chatQuestionCarouselPart.ts
Show resolved
Hide resolved
| ChatContextKeys.Editing.hasQuestionCarousel, | ||
| ); | ||
| const whenNotInProgress = ChatContextKeys.requestInProgress.negate(); | ||
| const whenNoRequestOrPendingToolCall = requestInProgressOrPendingToolCall!.negate(); |
There was a problem hiding this comment.
Send hidden while a request is in progress or a pending tool call / question carousel is active (previously only hidden during request progress).
What's the reasoning behind this change? This is a pretty common pattern imo. It's something I personally do a lot and I know other people folks do that from hearing feedback on steering/queuing
There was a problem hiding this comment.
Checking, but the idea should be similar to the regular prompting experience where the steer button shows up as soon as you type
There was a problem hiding this comment.
Fixed per DM chat
…yped - Cancel button now hides when input has text during question carousel (matches behavior during regular in-progress requests) - Queue/steer submenu now appears during question carousel and tool confirmation states, since requestInProgress is false in those states - Removed unused requestInProgressWithoutInput and pendingToolCall vars
This reverts commit 2f76a2d.
|
Reverting this in #299079. Will re-raise with some a11y tweaks. |


Polishes the question carousel from a flat list of questions into a tabbed multi-step flow with a final review step.
CleanShot.2026-03-02.at.11.45.23.mp4
What changed
⌘⏎ to submit(macOS) /Ctrl+Enter to submitso the shortcut is discoverable.FocusArea,snake_case_header) are normalized to sentence case (Focus area,Snake case header) for display. Original headers are preserved for answer correlation.Execute toolbar
requestInProgress, which isfalseduring these paused states.requestInProgressWithoutInputandpendingToolCallvariables.Accessibility
role="tablist"/role="tab"witharia-selected,aria-controls, and rovingtabIndex.role="tabpanel".Theme / CSS
list.activeSelectionBackgroundadjusted for 2026-dark.Tests
formatHeaderForDisplaycovering camelCase, already-spaced, and snake_case inputs.