@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.
- package/dist/google-gemini-cli-0.15.0-preview.6.tgz +0 -0
- package/dist/package.json +3 -3
- package/dist/src/config/keyBindings.d.ts +6 -0
- package/dist/src/config/keyBindings.js +14 -0
- package/dist/src/config/keyBindings.js.map +1 -1
- package/dist/src/config/settingsSchema.d.ts +10 -1
- package/dist/src/config/settingsSchema.js +10 -1
- package/dist/src/config/settingsSchema.js.map +1 -1
- package/dist/src/gemini.js +14 -22
- package/dist/src/gemini.js.map +1 -1
- package/dist/src/gemini.test.js +4 -0
- package/dist/src/gemini.test.js.map +1 -1
- package/dist/src/generated/git-commit.d.ts +2 -2
- package/dist/src/generated/git-commit.js +2 -2
- package/dist/src/test-utils/render.js +5 -1
- package/dist/src/test-utils/render.js.map +1 -1
- package/dist/src/ui/AppContainer.js +9 -2
- package/dist/src/ui/AppContainer.js.map +1 -1
- package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js +1 -4
- package/dist/src/ui/components/AlternateBufferQuittingDisplay.test.js.map +1 -1
- package/dist/src/ui/components/StickyHeader.d.ts +3 -0
- package/dist/src/ui/components/StickyHeader.js +2 -2
- package/dist/src/ui/components/StickyHeader.js.map +1 -1
- package/dist/src/ui/components/StickyHeader.test.js +2 -2
- package/dist/src/ui/components/StickyHeader.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js +5 -7
- package/dist/src/ui/components/messages/ToolConfirmationMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.js +18 -12
- package/dist/src/ui/components/messages/ToolGroupMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js +22 -1
- package/dist/src/ui/components/messages/ToolGroupMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.d.ts +3 -0
- package/dist/src/ui/components/messages/ToolMessage.js +5 -9
- package/dist/src/ui/components/messages/ToolMessage.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessage.test.js +3 -0
- package/dist/src/ui/components/messages/ToolMessage.test.js.map +1 -1
- package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js +3 -0
- package/dist/src/ui/components/messages/ToolMessageRawMarkdown.test.js.map +1 -1
- package/dist/src/ui/components/shared/ScrollableList.js +99 -9
- package/dist/src/ui/components/shared/ScrollableList.js.map +1 -1
- package/dist/src/ui/components/shared/ScrollableList.test.js +66 -0
- package/dist/src/ui/components/shared/ScrollableList.test.js.map +1 -1
- package/dist/src/ui/contexts/ScrollProvider.d.ts +1 -0
- package/dist/src/ui/contexts/ScrollProvider.drag.test.d.ts +6 -0
- package/dist/src/ui/contexts/ScrollProvider.drag.test.js +307 -0
- package/dist/src/ui/contexts/ScrollProvider.drag.test.js.map +1 -0
- package/dist/src/ui/contexts/ScrollProvider.js +112 -2
- package/dist/src/ui/contexts/ScrollProvider.js.map +1 -1
- package/dist/src/ui/contexts/ScrollProvider.test.js +138 -0
- package/dist/src/ui/contexts/ScrollProvider.test.js.map +1 -1
- package/dist/src/ui/hooks/useAlternateBuffer.d.ts +2 -0
- package/dist/src/ui/hooks/useAlternateBuffer.js +2 -1
- package/dist/src/ui/hooks/useAlternateBuffer.js.map +1 -1
- package/dist/src/ui/keyMatchers.test.js +37 -0
- package/dist/src/ui/keyMatchers.test.js.map +1 -1
- package/dist/src/ui/utils/CodeColorizer.js +5 -5
- package/dist/src/ui/utils/CodeColorizer.js.map +1 -1
- package/dist/src/ui/utils/CodeColorizer.test.d.ts +6 -0
- package/dist/src/ui/utils/CodeColorizer.test.js +38 -0
- package/dist/src/ui/utils/CodeColorizer.test.js.map +1 -0
- package/dist/src/ui/utils/ui-sizing.js +2 -1
- package/dist/src/ui/utils/ui-sizing.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- 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
|
|
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
|
-
|
|
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":";AAOA,OAAO,EACL,aAAa,EACb,WAAW,EACX,UAAU,EACV,SAAS,EACT,OAAO,EACP,MAAM,EACN,QAAQ,GACT,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,cAAc,EAAmB,MAAM,KAAK,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAmB,MAAM,sBAAsB,CAAC;
|
|
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
|