Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
2e00796
add initial chat scrollbar marker impl
matthewcorven Jun 20, 2026
33a7ba8
extend chat scrollbar marker to additional types, align styling close…
matthewcorven Jun 21, 2026
a94d299
chat scrollbar marker hardening and test coverage
matthewcorven Jun 21, 2026
ff491d6
commit the plan files for future reference
matthewcorven Jun 21, 2026
3326e04
fix sequencing and dependency issues in chat scrollbar markers valida…
matthewcorven Jun 21, 2026
7c3df9d
fix completeness gaps in chat scrollbar markers validation plan
matthewcorven Jun 21, 2026
f07999e
remove debug logging
matthewcorven Jun 21, 2026
5bfd9b4
validation plan: apply first-pass learnings, remove Scenario L, add h…
matthewcorven Jun 21, 2026
9c731f5
validation plan: document perf:chat-leak disposal blind spot (Issue 7…
matthewcorven Jun 21, 2026
05643ab
validation plan: fix disposal blind spots across §3/§5/§6/Deliverable…
matthewcorven Jun 21, 2026
8989904
refactor: remove unused IFileService dependency from ChatListWidget
matthewcorven Jun 21, 2026
c73bd37
address Copilot review: revert incidental CSS, guard scroll refresh, …
matthewcorven Jun 21, 2026
51e225b
resolve css ordering issues, missing -webkit-* issues
matthewcorven Jun 21, 2026
9769358
removed feature temp planning files
matthewcorven Jun 22, 2026
4bc9efe
add chat.scrollbarPromptMarkers.enabled setting, default off + experi…
matthewcorven Jun 22, 2026
46585e7
react to live chat.scrollbarPromptMarkers.enabled changes, add setEna…
matthewcorven Jun 22, 2026
b62eb7a
re-apply always-construct controller + setScrollbarPromptMarkersEnabl…
matthewcorven Jun 22, 2026
03cbe76
Merge branch 'main' into agents/chat-scrollbar-markers-impl
matthewcorven Jun 23, 2026
e2d4fa9
Merge branch 'main' into agents/chat-scrollbar-markers-impl
matthewcorven Jun 23, 2026
0a2372b
refactor: rename functions and update scrollbar marker behavior for c…
matthewcorven Jun 23, 2026
db1c4d6
Merge branch 'main' into agents/chat-scrollbar-markers-impl
matthewcorven Jun 23, 2026
17c8ddc
feat: enable dynamic control of scrollbar prompt markers in ChatListW…
matthewcorven Jun 23, 2026
30a3206
apply code review comment suggestions
matthewcorven Jun 23, 2026
4ab40f6
Scrollbar .visible layer uses z-index 11; keep markers above it so th…
matthewcorven Jun 23, 2026
76f811c
refactor: simplify scrollbar prompt marker controller initialization …
matthewcorven Jun 23, 2026
9286a82
fix: correct active marker identification in ChatScrollbarPromptMarke…
matthewcorven Jun 23, 2026
9571f85
Restored chat.css from main and reapplied chat-scrollbar-* styles
matthewcorven Jun 23, 2026
1bc2321
Ensure main's chat.css is restored
matthewcorven Jun 23, 2026
4a7c75c
fix: clarify scrollbar marker description in accessibility help text
matthewcorven Jun 23, 2026
1b5209f
fix: address PR review comments - always-create scrollbar marker cont…
matthewcorven Jun 23, 2026
1d7f7a0
Merge branch 'main' into agents/chat-scrollbar-markers-impl
matthewcorven Jun 23, 2026
0160f47
fix: guard getElementTop/getElementHeight against -1 list index in ab…
matthewcorven Jun 23, 2026
b528ce3
fix: short-circuit layout() when disabled, replace flaky setTimeout w…
matthewcorven Jun 23, 2026
6d975be
Merge branch 'main' into agents/chat-scrollbar-markers-impl
matthewcorven Jun 23, 2026
fd33f4f
Merge branch 'main' into agents/chat-scrollbar-markers-impl
matthewcorven Jun 23, 2026
f669829
Merge branch 'main' into agents/chat-scrollbar-markers-impl
matthewcorven Jun 24, 2026
3a12170
Merge branch 'main' into agents/chat-scrollbar-markers-impl
matthewcorven Jun 25, 2026
d4807a9
fix: proactive review fixes — CSS active/hover/HC rules, POINTER_UP, …
matthewcorven Jun 24, 2026
1b886e7
fix(chat): cancel stale scrollbar marker focus retries
matthewcorven Jun 25, 2026
9006aba
fix(chat): align scrollbar marker retries with review feedback
matthewcorven Jun 26, 2026
1914e7d
Merge branch 'main' into agents/chat-scrollbar-markers-impl
matthewcorven Jun 26, 2026
2680d7e
Use VS Code’s sizing token
matthewcorven Jun 26, 2026
528e9f9
Prefer `--vscode-strokeThickness` for 1px borders
matthewcorven Jun 26, 2026
58f499f
Apply suggestions from code review
matthewcorven Jun 26, 2026
d31919b
Add test for dispose method to cancel pending focus retries
matthewcorven Jun 27, 2026
a6f3949
Update min-height in chat.css to use spacing token
matthewcorven Jun 27, 2026
2e7ea2a
Implement click suppression logic in ChatScrollbarPromptMarkerController
matthewcorven Jun 27, 2026
8368be6
fix(chat): harden scrollbar marker pointer gesture state
matthewcorven Jun 27, 2026
6c88417
test(chat): cover scrollbar marker gesture-state edge cases
matthewcorven Jun 27, 2026
c6e079d
Merge upstream/main: resolve chat.css conflict
matthewcorven Jun 27, 2026
465bc5e
fix(chat): address scrollbar marker review findings
matthewcorven Jun 27, 2026
b37ff6a
fix(chat): fully detach overlay and dispose listeners on setEnabled(f…
matthewcorven Jun 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/vs/base/browser/ui/list/listView.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { addDisposableListener, animate, Dimension, getActiveElement, getContent
import { DomEmitter } from '../../event.js';
import { IMouseWheelEvent } from '../../mouseEvent.js';
import { EventType as TouchEventType, Gesture, GestureEvent } from '../../touch.js';
import { SmoothScrollableElement } from '../scrollbar/scrollableElement.js';
import { IOverviewRulerLayoutInfo, SmoothScrollableElement } from '../scrollbar/scrollableElement.js';
import { distinct, equals, splice } from '../../../common/arrays.js';
import { Delayer, disposableTimeout } from '../../../common/async.js';
import { memoize } from '../../../common/decorators.js';
Expand Down Expand Up @@ -233,6 +233,7 @@ export interface IListView<T> extends ISpliceable<T>, IDisposable {
readonly domNode: HTMLElement;
readonly containerDomNode: HTMLElement;
readonly scrollableElementDomNode: HTMLElement;
getOverviewRulerLayoutInfo(): IOverviewRulerLayoutInfo;
readonly length: number;
readonly contentHeight: number;
readonly contentWidth: number;
Expand Down Expand Up @@ -343,6 +344,7 @@ export class ListView<T> implements IListView<T> {
get onWillScroll(): Event<ScrollEvent> { return this.scrollableElement.onWillScroll; }
get containerDomNode(): HTMLElement { return this.rowsContainer; }
get scrollableElementDomNode(): HTMLElement { return this.scrollableElement.getDomNode(); }
getOverviewRulerLayoutInfo(): IOverviewRulerLayoutInfo { return this.scrollableElement.getOverviewRulerLayoutInfo(); }

private _horizontalScrolling: boolean = false;
private get horizontalScrolling(): boolean { return this._horizontalScrolling; }
Expand Down
9 changes: 9 additions & 0 deletions src/vs/base/browser/ui/list/listWidget.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { IKeyboardEvent, StandardKeyboardEvent } from '../../keyboardEvent.js';
import { Gesture } from '../../touch.js';
import { alert, AriaRole } from '../aria/aria.js';
import { CombinedSpliceable } from './splice.js';
import { IOverviewRulerLayoutInfo } from '../scrollbar/scrollableElement.js';
import { ScrollableElementChangeOptions } from '../scrollbar/scrollableElementOptions.js';
import { binarySearch, range } from '../../../common/arrays.js';
import { timeout } from '../../../common/async.js';
Expand Down Expand Up @@ -2029,6 +2030,14 @@ export class List<T> implements ISpliceable<T>, IDisposable {
return this.view.scrollableElementDomNode;
}

getOverviewRulerLayoutInfo(): IOverviewRulerLayoutInfo {
return this.view.getOverviewRulerLayoutInfo();
}

getElementHeight(index: number): number {
return this.view.elementHeight(index);
}

getElementID(index: number): string {
return this.view.getElementDomId(index);
}
Expand Down
21 changes: 21 additions & 0 deletions src/vs/base/browser/ui/tree/abstractTree.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import { autorun, constObservable } from '../../../common/observable.js';
import { alert } from '../aria/aria.js';
import { IMouseWheelEvent } from '../../mouseEvent.js';
import { type IHoverLifecycleOptions } from '../hover/hover.js';
import { IOverviewRulerLayoutInfo } from '../scrollbar/scrollableElement.js';

class TreeElementsDragAndDropData<T, TFilterData, TContext> extends ElementsDragAndDropData<T, TContext> {

Expand Down Expand Up @@ -2778,6 +2779,10 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
return this.view.getHTMLElement();
}

getOverviewRulerLayoutInfo(): IOverviewRulerLayoutInfo {
return this.view.getOverviewRulerLayoutInfo();
}

get contentHeight(): number {
return this.view.contentHeight;
}
Expand Down Expand Up @@ -2814,6 +2819,22 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
return this.view.scrollHeight;
}

getElementTop(element: TRef): number {
const index = this.model.getListIndex(element);
if (index === -1) {
return 0;
}
return this.view.getElementTop(index);
}

getElementHeight(element: TRef): number {
const index = this.model.getListIndex(element);
if (index === -1) {
return 0;
}
return this.view.getElementHeight(index);
}

get renderHeight(): number {
return this.view.renderHeight;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,9 @@ export function getAccessibilityHelpText(type: 'panelChat' | 'inlineChat' | 'age
content.push(localize('workbench.action.chat.nextCodeBlock', 'To focus the next code block within a response, invoke the Chat: Next Code Block command{0}.', '<keybinding:workbench.action.chat.nextCodeBlock>'));
content.push(localize('workbench.action.chat.nextUserPrompt', 'To navigate to the next user prompt in the conversation, invoke the Next User Prompt command{0}.', '<keybinding:workbench.action.chat.nextUserPrompt>'));
content.push(localize('workbench.action.chat.previousUserPrompt', 'To navigate to the previous user prompt in the conversation, invoke the Previous User Prompt command{0}.', '<keybinding:workbench.action.chat.previousUserPrompt>'));
if (type === 'panelChat' || type === 'agentView') {
content.push(localize('chat.scrollbarMarkers', 'When enabled, the chat scrollbar displays visual markers for prompts, questions, file changes, and errors. These markers are mouse-only; use the Next and Previous User Prompt commands above to navigate by keyboard.'));
}
content.push(localize('workbench.action.chat.announceConfirmation', 'To focus pending chat confirmation dialogs, invoke the Focus Chat Confirmation Status command{0}.', '<keybinding:workbench.action.chat.focusConfirmation>'));
content.push(localize('chat.showHiddenTerminals', 'If there are any hidden chat terminals, you can view them by invoking the View Hidden Chat Terminals command{0}.', '<keybinding:workbench.action.terminal.chat.viewHiddenChatTerminals>'));
content.push(localize('chat.focusMostRecentTerminal', 'To focus the last chat terminal that ran a tool, invoke the Focus Most Recent Chat Terminal command{0}.', `<keybinding:${TerminalContribCommandId.FocusMostRecentChatTerminal}>`));
Expand Down
Loading