@google/gemini-cli 0.15.0-preview.6 → 0.15.0-preview.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/dist/google-gemini-cli-0.15.0-preview.6.tgz +0 -0
  2. package/dist/package.json +3 -3
  3. package/dist/src/config/keyBindings.d.ts +6 -0
  4. package/dist/src/config/keyBindings.js +14 -0
  5. package/dist/src/config/keyBindings.js.map +1 -1
  6. package/dist/src/config/settingsSchema.d.ts +10 -1
  7. package/dist/src/config/settingsSchema.js +10 -1
  8. package/dist/src/config/settingsSchema.js.map +1 -1
  9. package/dist/src/gemini.js +14 -22
  10. package/dist/src/gemini.js.map +1 -1
  11. package/dist/src/gemini.test.js +4 -0
  12. package/dist/src/gemini.test.js.map +1 -1
  13. package/dist/src/generated/git-commit.d.ts +2 -2
  14. package/dist/src/generated/git-commit.js +2 -2
  15. package/dist/src/test-utils/render.js +5 -1
  16. package/dist/src/test-utils/render.js.map +1 -1
  17. package/dist/src/ui/AppContainer.js +9 -2
  18. package/dist/src/ui/AppContainer.js.map +1 -1
  19. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js +1 -4
  20. package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js.map +1 -1
  21. package/dist/src/ui/components/StickyHeader.d.ts +3 -0
  22. package/dist/src/ui/components/StickyHeader.js +2 -2
  23. package/dist/src/ui/components/StickyHeader.js.map +1 -1
  24. package/dist/src/ui/components/StickyHeader.test.js +2 -2
  25. package/dist/src/ui/components/StickyHeader.test.js.map +1 -1
  26. package/dist/src/ui/components/messages/ToolConfirmationMessage.js +5 -7
  27. package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
  28. package/dist/src/ui/components/messages/ToolGroupMessage.js +18 -12
  29. package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
  30. package/dist/src/ui/components/messages/ToolGroupMessage.test.js +22 -1
  31. package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
  32. package/dist/src/ui/components/messages/ToolMessage.d.ts +3 -0
  33. package/dist/src/ui/components/messages/ToolMessage.js +5 -9
  34. package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
  35. package/dist/src/ui/components/messages/ToolMessage.test.js +3 -0
  36. package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
  37. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js +3 -0
  38. package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js.map +1 -1
  39. package/dist/src/ui/components/shared/ScrollableList.js +99 -9
  40. package/dist/src/ui/components/shared/ScrollableList.js.map +1 -1
  41. package/dist/src/ui/components/shared/ScrollableList.test.js +66 -0
  42. package/dist/src/ui/components/shared/ScrollableList.test.js.map +1 -1
  43. package/dist/src/ui/contexts/ScrollProvider.d.ts +1 -0
  44. package/dist/src/ui/contexts/ScrollProvider.drag.test.d.ts +6 -0
  45. package/dist/src/ui/contexts/ScrollProvider.drag.test.js +307 -0
  46. package/dist/src/ui/contexts/ScrollProvider.drag.test.js.map +1 -0
  47. package/dist/src/ui/contexts/ScrollProvider.js +112 -2
  48. package/dist/src/ui/contexts/ScrollProvider.js.map +1 -1
  49. package/dist/src/ui/contexts/ScrollProvider.test.js +138 -0
  50. package/dist/src/ui/contexts/ScrollProvider.test.js.map +1 -1
  51. package/dist/src/ui/hooks/useAlternateBuffer.d.ts +2 -0
  52. package/dist/src/ui/hooks/useAlternateBuffer.js +2 -1
  53. package/dist/src/ui/hooks/useAlternateBuffer.js.map +1 -1
  54. package/dist/src/ui/keyMatchers.test.js +37 -0
  55. package/dist/src/ui/keyMatchers.test.js.map +1 -1
  56. package/dist/src/ui/utils/CodeColorizer.js +5 -5
  57. package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
  58. package/dist/src/ui/utils/CodeColorizer.test.d.ts +6 -0
  59. package/dist/src/ui/utils/CodeColorizer.test.js +38 -0
  60. package/dist/src/ui/utils/CodeColorizer.test.js.map +1 -0
  61. package/dist/src/ui/utils/ui-sizing.js +2 -1
  62. package/dist/src/ui/utils/ui-sizing.js.map +1 -1
  63. package/dist/tsconfig.tsbuildinfo +1 -1
  64. package/package.json +4 -4
  65. package/dist/google-gemini-cli-0.15.0-preview.5.tgz +0 -0
@@ -0,0 +1,307 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ /**
3
+ * @license
4
+ * Copyright 2025 Google LLC
5
+ * SPDX-License-Identifier: Apache-2.0
6
+ */
7
+ import { render } from '../../test-utils/render.js';
8
+ import { ScrollProvider, useScrollable, } from './ScrollProvider.js';
9
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
10
+ import { useRef, useImperativeHandle, forwardRef } from 'react';
11
+ import { Box } from 'ink';
12
+ // Mock useMouse hook
13
+ const mockUseMouseCallbacks = new Set();
14
+ vi.mock('../hooks/useMouse.js', async () => {
15
+ // We need to import React dynamically because this factory runs before top-level imports
16
+ const React = await import('react');
17
+ return {
18
+ useMouse: (callback) => {
19
+ React.useEffect(() => {
20
+ mockUseMouseCallbacks.add(callback);
21
+ return () => {
22
+ mockUseMouseCallbacks.delete(callback);
23
+ };
24
+ }, [callback]);
25
+ },
26
+ };
27
+ });
28
+ // Mock ink's getBoundingBox
29
+ vi.mock('ink', async (importOriginal) => {
30
+ const actual = await importOriginal();
31
+ return {
32
+ ...actual,
33
+ getBoundingBox: vi.fn(() => ({ x: 0, y: 0, width: 10, height: 10 })),
34
+ };
35
+ });
36
+ const TestScrollable = forwardRef((props, ref) => {
37
+ const elementRef = useRef(null);
38
+ useImperativeHandle(ref, () => elementRef.current);
39
+ useScrollable({
40
+ ref: elementRef,
41
+ getScrollState: props.getScrollState,
42
+ scrollBy: props.scrollBy,
43
+ hasFocus: () => true,
44
+ flashScrollbar: () => { },
45
+ }, true);
46
+ return _jsx(Box, { ref: elementRef });
47
+ });
48
+ TestScrollable.displayName = 'TestScrollable';
49
+ describe('ScrollProvider Drag', () => {
50
+ beforeEach(() => {
51
+ vi.useFakeTimers();
52
+ mockUseMouseCallbacks.clear();
53
+ });
54
+ afterEach(() => {
55
+ vi.useRealTimers();
56
+ });
57
+ it('drags the scrollbar thumb', async () => {
58
+ const scrollBy = vi.fn();
59
+ const getScrollState = vi.fn(() => ({
60
+ scrollTop: 0,
61
+ scrollHeight: 100,
62
+ innerHeight: 10,
63
+ }));
64
+ render(_jsx(ScrollProvider, { children: _jsx(TestScrollable, { id: "test-scrollable", scrollBy: scrollBy, getScrollState: getScrollState }) }));
65
+ // Scrollbar at x + width = 10.
66
+ // Height 10.
67
+ // scrollHeight 100, innerHeight 10.
68
+ // thumbHeight = 1.
69
+ // maxScrollTop = 90. maxThumbY = 9. Ratio = 10.
70
+ // Thumb at 0.
71
+ // 1. Click on thumb (row 0)
72
+ for (const callback of mockUseMouseCallbacks) {
73
+ callback({
74
+ name: 'left-press',
75
+ col: 10,
76
+ row: 0,
77
+ shift: false,
78
+ ctrl: false,
79
+ meta: false,
80
+ });
81
+ }
82
+ // 2. Move mouse to row 1
83
+ for (const callback of mockUseMouseCallbacks) {
84
+ callback({
85
+ name: 'move',
86
+ col: 10, // col doesn't matter for move if dragging
87
+ row: 1,
88
+ shift: false,
89
+ ctrl: false,
90
+ meta: false,
91
+ });
92
+ }
93
+ // Delta row = 1. Delta scroll = 10.
94
+ // scrollBy called with 10.
95
+ expect(scrollBy).toHaveBeenCalledWith(10);
96
+ // 3. Move mouse to row 2
97
+ scrollBy.mockClear();
98
+ for (const callback of mockUseMouseCallbacks) {
99
+ callback({
100
+ name: 'move',
101
+ col: 10,
102
+ row: 2,
103
+ shift: false,
104
+ ctrl: false,
105
+ meta: false,
106
+ });
107
+ }
108
+ // Delta row from start (0) is 2. Delta scroll = 20.
109
+ // startScrollTop was 0. target 20.
110
+ // scrollBy called with (20 - scrollTop). scrollTop is still 0 in mock.
111
+ expect(scrollBy).toHaveBeenCalledWith(20);
112
+ // 4. Release
113
+ for (const callback of mockUseMouseCallbacks) {
114
+ callback({
115
+ name: 'left-release',
116
+ col: 10,
117
+ row: 2,
118
+ shift: false,
119
+ ctrl: false,
120
+ meta: false,
121
+ });
122
+ }
123
+ // 5. Move again - should not scroll
124
+ scrollBy.mockClear();
125
+ for (const callback of mockUseMouseCallbacks) {
126
+ callback({
127
+ name: 'move',
128
+ col: 10,
129
+ row: 3,
130
+ shift: false,
131
+ ctrl: false,
132
+ meta: false,
133
+ });
134
+ }
135
+ expect(scrollBy).not.toHaveBeenCalled();
136
+ });
137
+ it('jumps to position and starts drag when clicking track below thumb', async () => {
138
+ const scrollBy = vi.fn();
139
+ const getScrollState = vi.fn(() => ({
140
+ scrollTop: 0,
141
+ scrollHeight: 100,
142
+ innerHeight: 10,
143
+ }));
144
+ render(_jsx(ScrollProvider, { children: _jsx(TestScrollable, { id: "test-scrollable", scrollBy: scrollBy, getScrollState: getScrollState }) }));
145
+ // Thumb at 0. Click at 5.
146
+ // thumbHeight 1.
147
+ // targetThumbY = 5.
148
+ // targetScrollTop = 50.
149
+ // 1. Click on track below thumb
150
+ for (const callback of mockUseMouseCallbacks) {
151
+ callback({
152
+ name: 'left-press',
153
+ col: 10,
154
+ row: 5,
155
+ shift: false,
156
+ ctrl: false,
157
+ meta: false,
158
+ });
159
+ }
160
+ // Should jump to 50 (delta 50)
161
+ expect(scrollBy).toHaveBeenCalledWith(50);
162
+ scrollBy.mockClear();
163
+ // 2. Move mouse to 6 - should drag
164
+ // Start drag captured at row 5, startScrollTop 50.
165
+ // Move to 6. Delta row 1. Delta scroll 10.
166
+ // Target = 60.
167
+ // scrollBy called with 60 - 0 (current state still 0).
168
+ // Note: In real app, state would update, but here getScrollState is static mock 0.
169
+ for (const callback of mockUseMouseCallbacks) {
170
+ callback({
171
+ name: 'move',
172
+ col: 10,
173
+ row: 6,
174
+ shift: false,
175
+ ctrl: false,
176
+ meta: false,
177
+ });
178
+ }
179
+ expect(scrollBy).toHaveBeenCalledWith(60);
180
+ });
181
+ it('jumps to position when clicking track above thumb', async () => {
182
+ const scrollBy = vi.fn();
183
+ // Start scrolled down
184
+ const getScrollState = vi.fn(() => ({
185
+ scrollTop: 50,
186
+ scrollHeight: 100,
187
+ innerHeight: 10,
188
+ }));
189
+ render(_jsx(ScrollProvider, { children: _jsx(TestScrollable, { id: "test-scrollable", scrollBy: scrollBy, getScrollState: getScrollState }) }));
190
+ // Thumb at 5. Click at 2.
191
+ // targetThumbY = 2.
192
+ // targetScrollTop = 20.
193
+ for (const callback of mockUseMouseCallbacks) {
194
+ callback({
195
+ name: 'left-press',
196
+ col: 10,
197
+ row: 2,
198
+ shift: false,
199
+ ctrl: false,
200
+ meta: false,
201
+ });
202
+ }
203
+ // Jump to 20 (delta = 20 - 50 = -30)
204
+ expect(scrollBy).toHaveBeenCalledWith(-30);
205
+ });
206
+ it('jumps to top when clicking very top of track', async () => {
207
+ const scrollBy = vi.fn();
208
+ const getScrollState = vi.fn(() => ({
209
+ scrollTop: 50,
210
+ scrollHeight: 100,
211
+ innerHeight: 10,
212
+ }));
213
+ render(_jsx(ScrollProvider, { children: _jsx(TestScrollable, { id: "test-scrollable", scrollBy: scrollBy, getScrollState: getScrollState }) }));
214
+ // Thumb at 5. Click at 0.
215
+ // targetThumbY = 0.
216
+ // targetScrollTop = 0.
217
+ for (const callback of mockUseMouseCallbacks) {
218
+ callback({
219
+ name: 'left-press',
220
+ col: 10,
221
+ row: 0,
222
+ shift: false,
223
+ ctrl: false,
224
+ meta: false,
225
+ });
226
+ }
227
+ // Scroll to top (delta = 0 - 50 = -50)
228
+ expect(scrollBy).toHaveBeenCalledWith(-50);
229
+ });
230
+ it('jumps to bottom when clicking very bottom of track', async () => {
231
+ const scrollBy = vi.fn();
232
+ const getScrollState = vi.fn(() => ({
233
+ scrollTop: 0,
234
+ scrollHeight: 100,
235
+ innerHeight: 10,
236
+ }));
237
+ render(_jsx(ScrollProvider, { children: _jsx(TestScrollable, { id: "test-scrollable", scrollBy: scrollBy, getScrollState: getScrollState }) }));
238
+ // Thumb at 0. Click at 9.
239
+ // targetThumbY = 9.
240
+ // targetScrollTop = 90.
241
+ for (const callback of mockUseMouseCallbacks) {
242
+ callback({
243
+ name: 'left-press',
244
+ col: 10,
245
+ row: 9,
246
+ shift: false,
247
+ ctrl: false,
248
+ meta: false,
249
+ });
250
+ }
251
+ // Scroll to bottom (delta = 90 - 0 = 90)
252
+ expect(scrollBy).toHaveBeenCalledWith(90);
253
+ });
254
+ it('uses scrollTo with 0 duration if provided', async () => {
255
+ const scrollBy = vi.fn();
256
+ const scrollTo = vi.fn();
257
+ const getScrollState = vi.fn(() => ({
258
+ scrollTop: 0,
259
+ scrollHeight: 100,
260
+ innerHeight: 10,
261
+ }));
262
+ // Custom component that provides scrollTo
263
+ const TestScrollableWithScrollTo = forwardRef((props, ref) => {
264
+ const elementRef = useRef(null);
265
+ useImperativeHandle(ref, () => elementRef.current);
266
+ useScrollable({
267
+ ref: elementRef,
268
+ getScrollState: props.getScrollState,
269
+ scrollBy: props.scrollBy,
270
+ scrollTo: props.scrollTo,
271
+ hasFocus: () => true,
272
+ flashScrollbar: () => { },
273
+ }, true);
274
+ return _jsx(Box, { ref: elementRef });
275
+ });
276
+ TestScrollableWithScrollTo.displayName = 'TestScrollableWithScrollTo';
277
+ render(_jsx(ScrollProvider, { children: _jsx(TestScrollableWithScrollTo, { id: "test-scrollable-scrollto", scrollBy: scrollBy, scrollTo: scrollTo, getScrollState: getScrollState }) }));
278
+ // Click on track (jump)
279
+ for (const callback of mockUseMouseCallbacks) {
280
+ callback({
281
+ name: 'left-press',
282
+ col: 10,
283
+ row: 5,
284
+ shift: false,
285
+ ctrl: false,
286
+ meta: false,
287
+ });
288
+ }
289
+ // Expect scrollTo to be called with target (and undefined/default duration)
290
+ expect(scrollTo).toHaveBeenCalledWith(50);
291
+ scrollTo.mockClear();
292
+ // Move mouse (drag)
293
+ for (const callback of mockUseMouseCallbacks) {
294
+ callback({
295
+ name: 'move',
296
+ col: 10,
297
+ row: 6,
298
+ shift: false,
299
+ ctrl: false,
300
+ meta: false,
301
+ });
302
+ }
303
+ // Expect scrollTo to be called with target and duration 0
304
+ expect(scrollTo).toHaveBeenCalledWith(60, 0);
305
+ });
306
+ });
307
+ //# sourceMappingURL=ScrollProvider.drag.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScrollProvider.drag.test.js","sourceRoot":"","sources":["../../../../src/ui/contexts/ScrollProvider.drag.test.tsx"],"names":[],"mappings":"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"}
@@ -43,6 +43,11 @@ export const ScrollProvider = ({ children, }) => {
43
43
  }, [scrollables]);
44
44
  const pendingScrollsRef = useRef(new Map());
45
45
  const flushScheduledRef = useRef(false);
46
+ const dragStateRef = useRef({
47
+ active: false,
48
+ id: null,
49
+ offset: 0,
50
+ });
46
51
  const scheduleFlush = useCallback(() => {
47
52
  if (!flushScheduledRef.current) {
48
53
  flushScheduledRef.current = true;
@@ -80,13 +85,112 @@ export const ScrollProvider = ({ children, }) => {
80
85
  }
81
86
  }
82
87
  };
83
- const handleClick = (mouseEvent) => {
88
+ const handleLeftPress = (mouseEvent) => {
89
+ // Check for scrollbar interaction first
90
+ for (const entry of scrollablesRef.current.values()) {
91
+ if (!entry.ref.current || !entry.hasFocus()) {
92
+ continue;
93
+ }
94
+ const boundingBox = getBoundingBox(entry.ref.current);
95
+ if (!boundingBox)
96
+ continue;
97
+ const { x, y, width, height } = boundingBox;
98
+ // Check if click is on the scrollbar column (x + width)
99
+ // The findScrollableCandidates logic implies scrollbar is at x + width.
100
+ if (mouseEvent.col === x + width &&
101
+ mouseEvent.row >= y &&
102
+ mouseEvent.row < y + height) {
103
+ const { scrollTop, scrollHeight, innerHeight } = entry.getScrollState();
104
+ if (scrollHeight <= innerHeight)
105
+ continue;
106
+ const thumbHeight = Math.max(1, Math.floor((innerHeight / scrollHeight) * innerHeight));
107
+ const maxScrollTop = scrollHeight - innerHeight;
108
+ const maxThumbY = innerHeight - thumbHeight;
109
+ if (maxThumbY <= 0)
110
+ continue;
111
+ const currentThumbY = Math.round((scrollTop / maxScrollTop) * maxThumbY);
112
+ const absoluteThumbTop = y + currentThumbY;
113
+ const absoluteThumbBottom = absoluteThumbTop + thumbHeight;
114
+ const isTop = mouseEvent.row === y;
115
+ const isBottom = mouseEvent.row === y + height - 1;
116
+ const hitTop = isTop ? absoluteThumbTop : absoluteThumbTop - 1;
117
+ const hitBottom = isBottom
118
+ ? absoluteThumbBottom
119
+ : absoluteThumbBottom + 1;
120
+ const isThumbClick = mouseEvent.row >= hitTop && mouseEvent.row < hitBottom;
121
+ let offset = 0;
122
+ const relativeMouseY = mouseEvent.row - y;
123
+ if (isThumbClick) {
124
+ offset = relativeMouseY - currentThumbY;
125
+ }
126
+ else {
127
+ // Track click - Jump to position
128
+ // Center the thumb on the mouse click
129
+ const targetThumbY = Math.max(0, Math.min(maxThumbY, relativeMouseY - Math.floor(thumbHeight / 2)));
130
+ const newScrollTop = Math.round((targetThumbY / maxThumbY) * maxScrollTop);
131
+ if (entry.scrollTo) {
132
+ entry.scrollTo(newScrollTop);
133
+ }
134
+ else {
135
+ entry.scrollBy(newScrollTop - scrollTop);
136
+ }
137
+ offset = relativeMouseY - targetThumbY;
138
+ }
139
+ // Start drag (for both thumb and track clicks)
140
+ dragStateRef.current = {
141
+ active: true,
142
+ id: entry.id,
143
+ offset,
144
+ };
145
+ return;
146
+ }
147
+ }
84
148
  const candidates = findScrollableCandidates(mouseEvent, scrollablesRef.current);
85
149
  if (candidates.length > 0) {
86
150
  // The first candidate is the innermost one.
87
151
  candidates[0].flashScrollbar();
88
152
  }
89
153
  };
154
+ const handleMove = (mouseEvent) => {
155
+ const state = dragStateRef.current;
156
+ if (!state.active || !state.id)
157
+ return;
158
+ const entry = scrollablesRef.current.get(state.id);
159
+ if (!entry || !entry.ref.current) {
160
+ state.active = false;
161
+ return;
162
+ }
163
+ const boundingBox = getBoundingBox(entry.ref.current);
164
+ if (!boundingBox)
165
+ return;
166
+ const { y } = boundingBox;
167
+ const { scrollTop, scrollHeight, innerHeight } = entry.getScrollState();
168
+ const thumbHeight = Math.max(1, Math.floor((innerHeight / scrollHeight) * innerHeight));
169
+ const maxScrollTop = scrollHeight - innerHeight;
170
+ const maxThumbY = innerHeight - thumbHeight;
171
+ if (maxThumbY <= 0)
172
+ return;
173
+ const relativeMouseY = mouseEvent.row - y;
174
+ // Calculate the target thumb position based on the mouse position and the offset.
175
+ // We clamp it to the valid range [0, maxThumbY].
176
+ const targetThumbY = Math.max(0, Math.min(maxThumbY, relativeMouseY - state.offset));
177
+ const targetScrollTop = Math.round((targetThumbY / maxThumbY) * maxScrollTop);
178
+ if (entry.scrollTo) {
179
+ entry.scrollTo(targetScrollTop, 0);
180
+ }
181
+ else {
182
+ entry.scrollBy(targetScrollTop - scrollTop);
183
+ }
184
+ };
185
+ const handleLeftRelease = () => {
186
+ if (dragStateRef.current.active) {
187
+ dragStateRef.current = {
188
+ active: false,
189
+ id: null,
190
+ offset: 0,
191
+ };
192
+ }
193
+ };
90
194
  useMouse((event) => {
91
195
  if (event.name === 'scroll-up') {
92
196
  handleScroll('up', event);
@@ -95,7 +199,13 @@ export const ScrollProvider = ({ children, }) => {
95
199
  handleScroll('down', event);
96
200
  }
97
201
  else if (event.name === 'left-press') {
98
- handleClick(event);
202
+ handleLeftPress(event);
203
+ }
204
+ else if (event.name === 'move') {
205
+ handleMove(event);
206
+ }
207
+ else if (event.name === 'left-release') {
208
+ handleLeftRelease();
99
209
  }
100
210
  }, { isActive: true });
101
211
  const contextValue = useMemo(() => ({ register, unregister }), [register, unregister]);
@@ -1 +1 @@
1
- {"version":3,"file":"ScrollProvider.js","sourceRoot":"","sources":["../../../../src/ui/contexts/ScrollProvider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ScrollProvider.js","sourceRoot":"","sources":["../../../../src/ui/contexts/ScrollProvider.tsx"],"names":[],"mappings":"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"}
@@ -40,6 +40,7 @@ const TestScrollable = forwardRef((props, ref) => {
40
40
  ref: elementRef,
41
41
  getScrollState: props.getScrollState,
42
42
  scrollBy: props.scrollBy,
43
+ scrollTo: props.scrollTo,
43
44
  hasFocus: () => true,
44
45
  flashScrollbar: () => { },
45
46
  }, true);
@@ -54,6 +55,56 @@ describe('ScrollProvider', () => {
54
55
  afterEach(() => {
55
56
  vi.useRealTimers();
56
57
  });
58
+ it('calls scrollTo when clicking scrollbar track if available', async () => {
59
+ const scrollBy = vi.fn();
60
+ const scrollTo = vi.fn();
61
+ const getScrollState = vi.fn(() => ({
62
+ scrollTop: 0,
63
+ scrollHeight: 100,
64
+ innerHeight: 10,
65
+ }));
66
+ render(_jsx(ScrollProvider, { children: _jsx(TestScrollable, { id: "test-scrollable", scrollBy: scrollBy, scrollTo: scrollTo, getScrollState: getScrollState }) }));
67
+ // Scrollbar is at x + width = 0 + 10 = 10.
68
+ // Height is 10. y is 0.
69
+ // Click at col 10, row 5.
70
+ // Thumb height = 10/100 * 10 = 1.
71
+ // Max thumb Y = 10 - 1 = 9.
72
+ // Current thumb Y = 0.
73
+ // Click at row 5 (relative Y = 5). This is outside the thumb (0).
74
+ // It's a track click.
75
+ for (const callback of mockUseMouseCallbacks) {
76
+ callback({
77
+ name: 'left-press',
78
+ col: 10,
79
+ row: 5,
80
+ shift: false,
81
+ ctrl: false,
82
+ meta: false,
83
+ });
84
+ }
85
+ expect(scrollTo).toHaveBeenCalled();
86
+ expect(scrollBy).not.toHaveBeenCalled();
87
+ });
88
+ it('calls scrollBy when clicking scrollbar track if scrollTo is not available', async () => {
89
+ const scrollBy = vi.fn();
90
+ const getScrollState = vi.fn(() => ({
91
+ scrollTop: 0,
92
+ scrollHeight: 100,
93
+ innerHeight: 10,
94
+ }));
95
+ render(_jsx(ScrollProvider, { children: _jsx(TestScrollable, { id: "test-scrollable", scrollBy: scrollBy, getScrollState: getScrollState }) }));
96
+ for (const callback of mockUseMouseCallbacks) {
97
+ callback({
98
+ name: 'left-press',
99
+ col: 10,
100
+ row: 5,
101
+ shift: false,
102
+ ctrl: false,
103
+ meta: false,
104
+ });
105
+ }
106
+ expect(scrollBy).toHaveBeenCalled();
107
+ });
57
108
  it('batches multiple scroll events into a single update', async () => {
58
109
  const scrollBy = vi.fn();
59
110
  const getScrollState = vi.fn(() => ({
@@ -169,5 +220,92 @@ describe('ScrollProvider', () => {
169
220
  expect(scrollBy).toHaveBeenCalledTimes(1);
170
221
  expect(scrollBy).toHaveBeenCalledWith(1);
171
222
  });
223
+ it('calls scrollTo when dragging scrollbar thumb if available', async () => {
224
+ const scrollBy = vi.fn();
225
+ const scrollTo = vi.fn();
226
+ const getScrollState = vi.fn(() => ({
227
+ scrollTop: 0,
228
+ scrollHeight: 100,
229
+ innerHeight: 10,
230
+ }));
231
+ render(_jsx(ScrollProvider, { children: _jsx(TestScrollable, { id: "test-scrollable", scrollBy: scrollBy, scrollTo: scrollTo, getScrollState: getScrollState }) }));
232
+ // Start drag on thumb
233
+ for (const callback of mockUseMouseCallbacks) {
234
+ callback({
235
+ name: 'left-press',
236
+ col: 10,
237
+ row: 0,
238
+ shift: false,
239
+ ctrl: false,
240
+ meta: false,
241
+ });
242
+ }
243
+ // Move mouse down
244
+ for (const callback of mockUseMouseCallbacks) {
245
+ callback({
246
+ name: 'move',
247
+ col: 10,
248
+ row: 5, // Move down 5 units
249
+ shift: false,
250
+ ctrl: false,
251
+ meta: false,
252
+ });
253
+ }
254
+ // Release
255
+ for (const callback of mockUseMouseCallbacks) {
256
+ callback({
257
+ name: 'left-release',
258
+ col: 10,
259
+ row: 5,
260
+ shift: false,
261
+ ctrl: false,
262
+ meta: false,
263
+ });
264
+ }
265
+ expect(scrollTo).toHaveBeenCalled();
266
+ expect(scrollBy).not.toHaveBeenCalled();
267
+ });
268
+ it('calls scrollBy when dragging scrollbar thumb if scrollTo is not available', async () => {
269
+ const scrollBy = vi.fn();
270
+ const getScrollState = vi.fn(() => ({
271
+ scrollTop: 0,
272
+ scrollHeight: 100,
273
+ innerHeight: 10,
274
+ }));
275
+ render(_jsx(ScrollProvider, { children: _jsx(TestScrollable, { id: "test-scrollable", scrollBy: scrollBy, getScrollState: getScrollState }) }));
276
+ // Start drag on thumb
277
+ for (const callback of mockUseMouseCallbacks) {
278
+ callback({
279
+ name: 'left-press',
280
+ col: 10,
281
+ row: 0,
282
+ shift: false,
283
+ ctrl: false,
284
+ meta: false,
285
+ });
286
+ }
287
+ // Move mouse down
288
+ for (const callback of mockUseMouseCallbacks) {
289
+ callback({
290
+ name: 'move',
291
+ col: 10,
292
+ row: 5,
293
+ shift: false,
294
+ ctrl: false,
295
+ meta: false,
296
+ });
297
+ }
298
+ for (const callback of mockUseMouseCallbacks) {
299
+ callback({
300
+ name: 'left-release',
301
+ col: 10,
302
+ row: 5,
303
+ shift: false,
304
+ ctrl: false,
305
+ meta: false,
306
+ });
307
+ }
308
+ expect(scrollBy).toHaveBeenCalled();
309
+ });
172
310
  });
173
311
  //# sourceMappingURL=ScrollProvider.test.js.map