@teaui/core 1.7.8 → 1.9.8

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 (118) hide show
  1. package/.dist/Buffer.d.ts +5 -0
  2. package/.dist/Buffer.js +23 -0
  3. package/.dist/Buffer.js.map +1 -1
  4. package/.dist/Color.js.map +1 -1
  5. package/.dist/Screen.d.ts +2 -1
  6. package/.dist/Screen.js +24 -10
  7. package/.dist/Screen.js.map +1 -1
  8. package/.dist/Theme.d.ts +7 -3
  9. package/.dist/Theme.js +42 -25
  10. package/.dist/Theme.js.map +1 -1
  11. package/.dist/UI.js +3 -1
  12. package/.dist/UI.js.map +1 -1
  13. package/.dist/View.d.ts +29 -0
  14. package/.dist/View.js +40 -2
  15. package/.dist/View.js.map +1 -1
  16. package/.dist/Viewport.d.ts +17 -3
  17. package/.dist/Viewport.js +21 -11
  18. package/.dist/Viewport.js.map +1 -1
  19. package/.dist/components/Alert.d.ts +76 -0
  20. package/.dist/components/Alert.js +133 -0
  21. package/.dist/components/Alert.js.map +1 -0
  22. package/.dist/components/Box.d.ts +6 -2
  23. package/.dist/components/Box.js +51 -14
  24. package/.dist/components/Box.js.map +1 -1
  25. package/.dist/components/Button.d.ts +5 -2
  26. package/.dist/components/Button.js +44 -13
  27. package/.dist/components/Button.js.map +1 -1
  28. package/.dist/components/Calendar.d.ts +4 -1
  29. package/.dist/components/Calendar.js +371 -137
  30. package/.dist/components/Calendar.js.map +1 -1
  31. package/.dist/components/Callout.d.ts +12 -0
  32. package/.dist/components/Callout.js +82 -0
  33. package/.dist/components/Callout.js.map +1 -0
  34. package/.dist/components/Checkbox.js +1 -1
  35. package/.dist/components/Checkbox.js.map +1 -1
  36. package/.dist/components/Drawer.d.ts +3 -0
  37. package/.dist/components/Drawer.js +71 -2
  38. package/.dist/components/Drawer.js.map +1 -1
  39. package/.dist/components/Dropdown.js +20 -12
  40. package/.dist/components/Dropdown.js.map +1 -1
  41. package/.dist/components/Header.d.ts +1 -1
  42. package/.dist/components/Header.js +12 -10
  43. package/.dist/components/Header.js.map +1 -1
  44. package/.dist/components/Input.d.ts +1 -0
  45. package/.dist/components/Input.js +39 -15
  46. package/.dist/components/Input.js.map +1 -1
  47. package/.dist/components/Legend.d.ts +20 -0
  48. package/.dist/components/Legend.js +180 -0
  49. package/.dist/components/Legend.js.map +1 -0
  50. package/.dist/components/Log.js +3 -4
  51. package/.dist/components/Log.js.map +1 -1
  52. package/.dist/components/Modal.js +1 -1
  53. package/.dist/components/Modal.js.map +1 -1
  54. package/.dist/components/Notification.d.ts +35 -0
  55. package/.dist/components/Notification.js +120 -0
  56. package/.dist/components/Notification.js.map +1 -0
  57. package/.dist/components/Page.d.ts +55 -0
  58. package/.dist/components/Page.js +374 -0
  59. package/.dist/components/Page.js.map +1 -0
  60. package/.dist/components/Progress.d.ts +15 -0
  61. package/.dist/components/Progress.js +62 -16
  62. package/.dist/components/Progress.js.map +1 -1
  63. package/.dist/components/Scrollable.d.ts +60 -15
  64. package/.dist/components/Scrollable.js +209 -58
  65. package/.dist/components/Scrollable.js.map +1 -1
  66. package/.dist/components/ScrollableList.d.ts +16 -9
  67. package/.dist/components/ScrollableList.js +50 -19
  68. package/.dist/components/ScrollableList.js.map +1 -1
  69. package/.dist/components/Slider.d.ts +2 -1
  70. package/.dist/components/Slider.js +151 -46
  71. package/.dist/components/Slider.js.map +1 -1
  72. package/.dist/components/Space.d.ts +0 -3
  73. package/.dist/components/Space.js +0 -1
  74. package/.dist/components/Space.js.map +1 -1
  75. package/.dist/components/Spinner.js +1 -1
  76. package/.dist/components/Spinner.js.map +1 -1
  77. package/.dist/components/Stack.js +33 -2
  78. package/.dist/components/Stack.js.map +1 -1
  79. package/.dist/components/Table.js +43 -60
  80. package/.dist/components/Table.js.map +1 -1
  81. package/.dist/components/Tabs.d.ts +8 -0
  82. package/.dist/components/Tabs.js +22 -5
  83. package/.dist/components/Tabs.js.map +1 -1
  84. package/.dist/components/ToggleGroup.js +1 -1
  85. package/.dist/components/ToggleGroup.js.map +1 -1
  86. package/.dist/components/ZStack.d.ts +9 -0
  87. package/.dist/components/ZStack.js +68 -5
  88. package/.dist/components/ZStack.js.map +1 -1
  89. package/.dist/components/index.d.ts +5 -2
  90. package/.dist/components/index.js +4 -1
  91. package/.dist/components/index.js.map +1 -1
  92. package/.dist/events/index.d.ts +6 -2
  93. package/.dist/events/key.d.ts +18 -4
  94. package/.dist/events/key.js +42 -6
  95. package/.dist/events/key.js.map +1 -1
  96. package/.dist/events/mouse.d.ts +1 -0
  97. package/.dist/events/mouse.js.map +1 -1
  98. package/.dist/events/translate.js +17 -4
  99. package/.dist/events/translate.js.map +1 -1
  100. package/.dist/index.d.ts +1 -1
  101. package/.dist/index.js.map +1 -1
  102. package/.dist/inspect.js +3 -0
  103. package/.dist/inspect.js.map +1 -1
  104. package/.dist/managers/FocusManager.d.ts +2 -1
  105. package/.dist/managers/FocusManager.js +39 -4
  106. package/.dist/managers/FocusManager.js.map +1 -1
  107. package/.dist/managers/MouseManager.js +2 -0
  108. package/.dist/managers/MouseManager.js.map +1 -1
  109. package/.dist/renderToAnsi.js +1 -1
  110. package/.dist/renderToAnsi.js.map +1 -1
  111. package/.dist/terminal.d.ts +1 -0
  112. package/.dist/testing.d.ts +29 -2
  113. package/.dist/testing.js +34 -27
  114. package/.dist/testing.js.map +1 -1
  115. package/package.json +5 -4
  116. package/.dist/components/Pin.d.ts +0 -25
  117. package/.dist/components/Pin.js +0 -80
  118. package/.dist/components/Pin.js.map +0 -1
@@ -2,12 +2,26 @@ import { Container } from '../Container.js';
2
2
  import { Point, Rect, Size, interpolate } from '../geometry.js';
3
3
  import { isMouseWheel } from '../events/index.js';
4
4
  import { Style } from '../Style.js';
5
+ import { Stack } from './Stack.js';
6
+ function fromShorthand(props, direction, extraProps = {}) {
7
+ if (Array.isArray(props)) {
8
+ return { children: props, direction, ...extraProps };
9
+ }
10
+ else {
11
+ return { ...props, direction, ...extraProps };
12
+ }
13
+ }
5
14
  /**
6
- * Scrollable is meant to scroll _a single view_, ie a Stack view. But all the
7
- * container views are optimized to check their _visibleRect_, and won't render
8
- * children that are not in view, saving some CPU cycles.
15
+ * Scrollable manages an internal Stack for layout and adds scroll offset,
16
+ * scrollbar rendering, and mouse wheel handling on top.
17
+ *
18
+ * Children added to the Scrollable are delegated to the internal Stack.
19
+ * Use `direction` to control layout (default: 'down'), or the static
20
+ * constructors `Scrollable.down()`, `Scrollable.right()`, etc.
9
21
  */
10
22
  export class Scrollable extends Container {
23
+ #stack;
24
+ #scrollable = 'both';
11
25
  #showScrollbars = true;
12
26
  #scrollHeight = 1;
13
27
  #scrollWidth = 2;
@@ -15,25 +29,95 @@ export class Scrollable extends Container {
15
29
  #isAtBottom = true;
16
30
  #contentOffset;
17
31
  #contentSize = Size.zero;
32
+ #contentSizeOverride;
18
33
  #visibleSize = Size.zero;
19
34
  #prevMouseDown = undefined;
20
- constructor(props) {
35
+ #onOffsetChange;
36
+ static down(props = {}, extraProps = {}) {
37
+ return new Scrollable(fromShorthand(props, 'down', extraProps));
38
+ }
39
+ static up(props = {}, extraProps = {}) {
40
+ return new Scrollable(fromShorthand(props, 'up', extraProps));
41
+ }
42
+ static right(props = {}, extraProps = {}) {
43
+ return new Scrollable(fromShorthand(props, 'right', extraProps));
44
+ }
45
+ static left(props = {}, extraProps = {}) {
46
+ return new Scrollable(fromShorthand(props, 'left', extraProps));
47
+ }
48
+ constructor({ children, child, direction, gap, ...props }) {
21
49
  super(props);
50
+ this.#stack = new Stack({ direction: direction ?? 'down', gap });
51
+ // Add the Stack as the actual child of the Container
52
+ super.add(this.#stack);
22
53
  this.#contentOffset = { x: 0, y: 0 };
23
54
  this.#update(props);
55
+ // Add user children to the internal Stack
56
+ if (child) {
57
+ this.#stack.add(child);
58
+ }
59
+ if (children) {
60
+ for (const c of children) {
61
+ this.#stack.add(c);
62
+ }
63
+ }
24
64
  }
25
- update(props) {
65
+ update({ children, child, direction, gap, ...props }) {
26
66
  this.#update(props);
67
+ if (direction !== undefined) {
68
+ this.#stack.direction = direction;
69
+ }
70
+ if (gap !== undefined) {
71
+ this.#stack.gap = gap;
72
+ }
73
+ // Delegate child management to the internal Stack
74
+ if (child !== undefined || children !== undefined) {
75
+ const allChildren = [];
76
+ if (children) {
77
+ allChildren.push(...children);
78
+ }
79
+ if (child) {
80
+ allChildren.push(child);
81
+ }
82
+ this.#stack.update({
83
+ direction: direction ?? this.#stack.direction,
84
+ gap: gap ?? this.#stack.gap,
85
+ children: allChildren,
86
+ });
87
+ }
27
88
  super.update(props);
28
89
  }
29
- #update({ scrollHeight, scrollWidth, showScrollbars, keepAtBottom }) {
90
+ #update({ scrollable, showScrollbars, keepAtBottom, contentSize: contentSizeOverride, offset, onOffsetChange, }) {
91
+ this.#scrollable = scrollable ?? 'both';
30
92
  this.#showScrollbars = showScrollbars ?? true;
31
- this.#scrollHeight = scrollHeight ?? 1;
32
- this.#scrollWidth = scrollWidth ?? 2;
33
93
  this.#keepAtBottom = keepAtBottom ?? false;
94
+ this.#contentSizeOverride = contentSizeOverride;
95
+ this.#onOffsetChange = onOffsetChange;
96
+ if (offset) {
97
+ this.#contentOffset = { x: -offset.x, y: -offset.y };
98
+ }
99
+ }
100
+ /**
101
+ * Children are delegated to the internal Stack.
102
+ */
103
+ add(child, at) {
104
+ this.#stack.add(child, at);
105
+ }
106
+ removeChild(child) {
107
+ this.#stack.removeChild(child);
108
+ }
109
+ removeAllChildren() {
110
+ this.#stack.removeAllChildren();
111
+ }
112
+ /**
113
+ * Returns the children of the internal Stack (the user's children),
114
+ * not the Scrollable's direct children (which is just the Stack).
115
+ */
116
+ get children() {
117
+ return this.#stack.children;
34
118
  }
35
119
  naturalSize(available) {
36
- const size = super.naturalSize(available).mutableCopy();
120
+ const size = this.#stack.naturalSize(available).mutableCopy();
37
121
  size.width = Math.min(size.width, available.width);
38
122
  size.height = Math.min(size.height, available.height);
39
123
  return size;
@@ -80,23 +164,35 @@ export class Scrollable extends Container {
80
164
  receiveMouseDown(event) {
81
165
  const tooWide = this.#contentSize.width > this.contentSize.width;
82
166
  const tooTall = this.#contentSize.height > this.contentSize.height;
167
+ const showVBar = this.#showVerticalScrollbar() && tooTall;
168
+ const showHBar = this.#showHorizontalScrollbar() && tooWide;
169
+ const visibleWidth = this.contentSize.width - (showVBar ? 1 : 0);
170
+ const visibleHeight = this.contentSize.height - (showHBar ? 1 : 0);
83
171
  if (tooWide && this.#prevMouseDown === 'horizontal') {
84
- const maxX = this.#maxOffsetX();
85
- const offsetX = Math.round(interpolate(event.position.x, [0, this.contentSize.width - (tooTall ? 1 : 0)], [0, maxX]));
172
+ const trackWidth = visibleWidth;
173
+ const maxOffsetX = Math.max(0, this.#contentSize.width - visibleWidth);
174
+ const thumbWidth = this.#scrollbarThumbLength(trackWidth, visibleWidth, this.#contentSize.width);
175
+ const maxScrollbarX = Math.max(0, trackWidth - thumbWidth);
176
+ const thumbX = Math.max(0, Math.min(maxScrollbarX, event.position.x - Math.floor(thumbWidth / 2)));
177
+ const offsetX = this.#scrollbarThumbPosition(thumbX, maxScrollbarX, maxOffsetX);
86
178
  this.#contentOffset = {
87
- x: Math.max(maxX, Math.min(0, offsetX)),
179
+ x: -offsetX,
88
180
  y: this.#contentOffset.y,
89
181
  };
90
182
  }
91
183
  else if (tooTall && this.#prevMouseDown === 'vertical') {
92
- const maxY = this.#maxOffsetY();
93
- const offsetY = Math.round(interpolate(event.position.y, [0, this.contentSize.height - (tooWide ? 1 : 0)], [0, maxY]));
94
- const y = Math.max(maxY, Math.min(0, offsetY));
184
+ const trackHeight = visibleHeight;
185
+ const maxOffsetY = Math.max(0, this.#contentSize.height - visibleHeight);
186
+ const thumbHeight = this.#scrollbarThumbLength(trackHeight, visibleHeight, this.#contentSize.height);
187
+ const maxScrollbarY = Math.max(0, trackHeight - thumbHeight);
188
+ const thumbY = Math.max(0, Math.min(maxScrollbarY, event.position.y - Math.floor(thumbHeight / 2)));
189
+ const offsetY = this.#scrollbarThumbPosition(thumbY, maxScrollbarY, maxOffsetY);
190
+ const y = -offsetY;
95
191
  this.#contentOffset = {
96
192
  x: this.#contentOffset.x,
97
193
  y,
98
194
  };
99
- this.#isAtBottom = y <= maxY;
195
+ this.#isAtBottom = y <= this.#maxOffsetY();
100
196
  }
101
197
  }
102
198
  receiveWheel(event) {
@@ -135,6 +231,16 @@ export class Scrollable extends Container {
135
231
  * to point to the top-most row.
136
232
  */
137
233
  scrollBy(offsetX, offsetY) {
234
+ if (offsetX === 0 && offsetY === 0) {
235
+ return;
236
+ }
237
+ // Restrict scrolling to allowed direction(s)
238
+ if (this.#scrollable === 'horizontal') {
239
+ offsetY = 0;
240
+ }
241
+ else if (this.#scrollable === 'vertical') {
242
+ offsetX = 0;
243
+ }
138
244
  if (offsetX === 0 && offsetY === 0) {
139
245
  return;
140
246
  }
@@ -148,10 +254,38 @@ export class Scrollable extends Container {
148
254
  this.#contentOffset = { x, y };
149
255
  // Track whether we're at the bottom (for keepAtBottom)
150
256
  this.#isAtBottom = y <= maxY;
257
+ this.#onOffsetChange?.(new Point(-x || 0, -y || 0));
258
+ }
259
+ #showHorizontalScrollbar() {
260
+ return (this.#showScrollbars === true || this.#showScrollbars === 'horizontal');
261
+ }
262
+ #showVerticalScrollbar() {
263
+ return this.#showScrollbars === true || this.#showScrollbars === 'vertical';
264
+ }
265
+ #scrollbarStyle() {
266
+ return new Style({
267
+ foreground: this.theme.darkenColor,
268
+ background: this.theme.darkenColor,
269
+ });
270
+ }
271
+ #scrollbarThumbStyle() {
272
+ return new Style({
273
+ foreground: this.theme.highlightColor,
274
+ background: this.theme.highlightColor,
275
+ });
276
+ }
277
+ #scrollbarThumbLength(trackLength, visibleLength, contentLength) {
278
+ const proportionalLength = Math.round((visibleLength / contentLength) * trackLength);
279
+ const maxLength = contentLength > visibleLength ? trackLength - 1 : trackLength;
280
+ return Math.max(1, Math.min(maxLength, proportionalLength));
281
+ }
282
+ #scrollbarThumbPosition(contentOffset, maxContentOffset, maxScrollbarOffset) {
283
+ return Math.round(interpolate(contentOffset, [0, maxContentOffset], [0, maxScrollbarOffset], true));
151
284
  }
152
285
  get contentSize() {
153
- const delta = this.#showScrollbars ? 1 : 0;
154
- return super.contentSize.shrink(delta, delta);
286
+ const deltaW = this.#showVerticalScrollbar() ? 1 : 0;
287
+ const deltaH = this.#showHorizontalScrollbar() ? 1 : 0;
288
+ return super.contentSize.shrink(deltaW, deltaH);
155
289
  }
156
290
  render(viewport) {
157
291
  if (viewport.isEmpty) {
@@ -159,72 +293,89 @@ export class Scrollable extends Container {
159
293
  }
160
294
  viewport.registerMouse('mouse.wheel');
161
295
  let contentSize = Size.zero.mutableCopy();
162
- for (const child of this.children) {
163
- const childSize = child.naturalSize(viewport.contentSize);
164
- contentSize.width = Math.max(contentSize.width, childSize.width);
165
- contentSize.height = Math.max(contentSize.height, childSize.height);
296
+ if (this.#contentSizeOverride) {
297
+ contentSize.width =
298
+ this.#contentSizeOverride.width ?? viewport.contentSize.width;
299
+ contentSize.height =
300
+ this.#contentSizeOverride.height ?? viewport.contentSize.height;
301
+ }
302
+ else {
303
+ const stackSize = this.#stack.naturalSize(viewport.contentSize);
304
+ contentSize.width = stackSize.width;
305
+ contentSize.height = stackSize.height;
166
306
  }
167
307
  this.#contentSize = contentSize;
168
- const tooWide = contentSize.width > viewport.contentSize.width;
169
- const tooTall = contentSize.height > viewport.contentSize.height;
308
+ const canScrollHoriz = this.#scrollable !== 'vertical';
309
+ const canScrollVert = this.#scrollable !== 'horizontal';
310
+ const tooWide = canScrollHoriz && contentSize.width > viewport.contentSize.width;
311
+ const tooTall = canScrollVert && contentSize.height > viewport.contentSize.height;
170
312
  // keepAtBottom: snap to end when content grows and we were at the bottom
171
313
  if (this.#keepAtBottom && this.#isAtBottom && tooTall) {
172
314
  const maxY = this.#maxOffsetY();
173
315
  this.#contentOffset = { x: this.#contentOffset.x, y: maxY };
174
316
  }
317
+ const showVBar = this.#showVerticalScrollbar() && tooTall;
318
+ const showHBar = this.#showHorizontalScrollbar() && tooWide;
175
319
  // #contentOffset is _negative_ (indicates the amount to move the view away
176
320
  // from the origin, which will always be up/left of 0,0)
177
- const outside = new Rect([this.#contentOffset.x, this.#contentOffset.y], viewport.contentSize
178
- .shrink(this.#contentOffset.x, this.#contentOffset.y)
179
- .shrink(this.#showScrollbars && tooTall ? 1 : 0, this.#showScrollbars && tooWide ? 1 : 0));
180
- viewport.clipped(outside, inside => {
181
- for (const child of this.children) {
182
- child.render(inside);
183
- }
321
+ // Children are laid out in a region that is at least as wide/tall as the
322
+ // content, and at least as wide/tall as the viewport (minus scrollbars).
323
+ // This ensures flex children expand to fill the visible area, while
324
+ // children that overflow extend beyond it.
325
+ const visibleWidth = viewport.contentSize.width - (showVBar ? 1 : 0);
326
+ const visibleHeight = viewport.contentSize.height - (showHBar ? 1 : 0);
327
+ // First clip to exclude scrollbar area — this ensures that the inner
328
+ // viewport's visibleRect does not include the scrollbar column/row.
329
+ // Without this, pinned children (which size to visibleRect) would
330
+ // overlap the scrollbar.
331
+ const scrollableArea = new Rect(Point.zero, new Size(visibleWidth, visibleHeight));
332
+ const outside = new Rect([this.#contentOffset.x, this.#contentOffset.y], [
333
+ Math.max(contentSize.width, visibleWidth),
334
+ Math.max(contentSize.height, visibleHeight),
335
+ ]);
336
+ viewport.clipped(scrollableArea, contentViewport => {
337
+ contentViewport.clipped(outside, inside => {
338
+ this.#stack.render(inside);
339
+ });
184
340
  });
341
+ // Note: #visibleSize is used in #maxOffsetX/#maxOffsetY calculations.
342
+ // The formula requires shrinking by overflow status (not scrollbar visibility)
343
+ // because the +1 correction in the offset formulas compensates for this.
185
344
  this.#visibleSize = viewport.visibleRect.size.shrink(tooWide ? 1 : 0, tooTall ? 1 : 0);
186
- if (this.#showScrollbars && (tooWide || tooTall)) {
187
- const scrollBar = new Style({
188
- foreground: this.theme.darkenColor,
189
- background: this.theme.darkenColor,
190
- });
191
- const scrollControl = new Style({
192
- foreground: this.theme.highlightColor,
193
- background: this.theme.highlightColor,
194
- });
345
+ if (showVBar || showHBar) {
346
+ const scrollBar = this.#scrollbarStyle();
347
+ const scrollControl = this.#scrollbarThumbStyle();
195
348
  // scrollMaxX: x of the last column of the view
196
349
  // scrollMaxY: y of the last row of the view
197
350
  // scrollMaxHorizX: horizontal scroll bar is drawn from 0 to scrollMaxHorizX
198
351
  // scrollMaxHorizY: vertical scroll bar is drawn from 0 to scrollMaxHorizY
199
- const scrollMaxX = viewport.contentSize.width - 1, scrollMaxY = viewport.contentSize.height - 1, scrollMaxHorizX = scrollMaxX - (tooTall ? 1 : 0), scrollMaxVertY = scrollMaxY - (tooWide ? 1 : 0);
200
- if (tooWide && tooTall) {
352
+ const scrollMaxX = viewport.contentSize.width - 1, scrollMaxY = viewport.contentSize.height - 1, scrollMaxHorizX = scrollMaxX - (showVBar ? 1 : 0), scrollMaxVertY = scrollMaxY - (showHBar ? 1 : 0);
353
+ if (showHBar && showVBar) {
201
354
  viewport.write('█', new Point(scrollMaxX, scrollMaxY), scrollBar);
202
355
  }
203
- if (tooWide) {
356
+ if (showHBar) {
204
357
  viewport.registerMouse('mouse.button.left', new Rect(new Point(0, scrollMaxY), new Size(scrollMaxHorizX + 1, 1)));
358
+ const trackWidth = scrollMaxHorizX + 1;
359
+ const maxOffsetX = Math.max(0, contentSize.width - visibleWidth);
360
+ const thumbWidth = this.#scrollbarThumbLength(trackWidth, visibleWidth, contentSize.width);
361
+ const maxScrollbarX = Math.max(0, trackWidth - thumbWidth);
205
362
  const contentOffsetX = -this.#contentOffset.x;
206
- const viewX = Math.round(interpolate(contentOffsetX, [
207
- 0,
208
- contentSize.width -
209
- viewport.contentSize.width +
210
- (tooTall ? 1 : 0),
211
- ], [0, scrollMaxHorizX]));
363
+ const viewX = this.#scrollbarThumbPosition(contentOffsetX, maxOffsetX, maxScrollbarX);
212
364
  for (let x = 0; x <= scrollMaxHorizX; x++) {
213
- const inRange = x === viewX;
365
+ const inRange = x >= viewX && x < viewX + thumbWidth;
214
366
  viewport.write(inRange ? '█' : ' ', new Point(x, scrollMaxY), inRange ? scrollControl : scrollBar);
215
367
  }
216
368
  }
217
- if (tooTall) {
369
+ if (showVBar) {
218
370
  viewport.registerMouse('mouse.button.left', new Rect(new Point(scrollMaxX, 0), new Size(1, scrollMaxVertY + 1)));
371
+ const trackHeight = scrollMaxVertY + 1;
372
+ const maxOffsetY = Math.max(0, contentSize.height - visibleHeight);
373
+ const thumbHeight = this.#scrollbarThumbLength(trackHeight, visibleHeight, contentSize.height);
374
+ const maxScrollbarY = Math.max(0, trackHeight - thumbHeight);
219
375
  const contentOffsetY = -this.#contentOffset.y;
220
- const viewY = Math.round(interpolate(contentOffsetY, [
221
- 0,
222
- contentSize.height -
223
- viewport.contentSize.height +
224
- (tooWide ? 1 : 0),
225
- ], [0, scrollMaxVertY]));
376
+ const viewY = this.#scrollbarThumbPosition(contentOffsetY, maxOffsetY, maxScrollbarY);
226
377
  for (let y = 0; y <= scrollMaxVertY; y++) {
227
- const inRange = y === viewY;
378
+ const inRange = y >= viewY && y < viewY + thumbHeight;
228
379
  viewport.write(inRange ? '█' : ' ', new Point(scrollMaxX, y), inRange ? scrollControl : scrollBar);
229
380
  }
230
381
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Scrollable.js","sourceRoot":"","sources":["../../lib/components/Scrollable.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Scrollable.js","sourceRoot":"","sources":["../../lib/components/Scrollable.ts"],"names":[],"mappings":"AACA,OAAO,EAA+B,SAAS,EAAC,MAAM,iBAAiB,CAAA;AAEvE,OAAO,EAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAC,MAAM,gBAAgB,CAAA;AAC7D,OAAO,EAAC,YAAY,EAAkB,MAAM,oBAAoB,CAAA;AAChE,OAAO,EAAC,KAAK,EAAC,MAAM,aAAa,CAAA;AAEjC,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAA;AAiDhC,SAAS,aAAa,CACpB,KAAqB,EACrB,SAAoB,EACpB,aAAoD,EAAE;IAEtD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,UAAU,EAAC,CAAA;IACpD,CAAC;SAAM,CAAC;QACN,OAAO,EAAC,GAAG,KAAK,EAAE,SAAS,EAAE,GAAG,UAAU,EAAC,CAAA;IAC7C,CAAC;AACH,CAAC;AAOD;;;;;;;GAOG;AACH,MAAM,OAAO,UAAW,SAAQ,SAAS;IACvC,MAAM,CAAO;IACb,WAAW,GAAuC,MAAM,CAAA;IACxD,eAAe,GAAwC,IAAI,CAAA;IAC3D,aAAa,GAAW,CAAC,CAAA;IACzB,YAAY,GAAW,CAAC,CAAA;IACxB,aAAa,GAAY,KAAK,CAAA;IAC9B,WAAW,GAAY,IAAI,CAAA;IAC3B,cAAc,CAAe;IAC7B,YAAY,GAAS,IAAI,CAAC,IAAI,CAAA;IAC9B,oBAAoB,CAAoC;IACxD,YAAY,GAAS,IAAI,CAAC,IAAI,CAAA;IAC9B,cAAc,GAAiB,SAAS,CAAA;IACxC,eAAe,CAA0B;IAEzC,MAAM,CAAC,IAAI,CACT,QAAwB,EAAE,EAC1B,aAAoD,EAAE;QAEtD,OAAO,IAAI,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;IACjE,CAAC;IAED,MAAM,CAAC,EAAE,CACP,QAAwB,EAAE,EAC1B,aAAoD,EAAE;QAEtD,OAAO,IAAI,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC,CAAA;IAC/D,CAAC;IAED,MAAM,CAAC,KAAK,CACV,QAAwB,EAAE,EAC1B,aAAoD,EAAE;QAEtD,OAAO,IAAI,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAA;IAClE,CAAC;IAED,MAAM,CAAC,IAAI,CACT,QAAwB,EAAE,EAC1B,aAAoD,EAAE;QAEtD,OAAO,IAAI,UAAU,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;IACjE,CAAC;IAED,YAAY,EAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,KAAK,EAAQ;QAC5D,KAAK,CAAC,KAAK,CAAC,CAAA;QAEZ,IAAI,CAAC,MAAM,GAAG,IAAI,KAAK,CAAC,EAAC,SAAS,EAAE,SAAS,IAAI,MAAM,EAAE,GAAG,EAAC,CAAC,CAAA;QAC9D,qDAAqD;QACrD,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAEtB,IAAI,CAAC,cAAc,GAAG,EAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAC,CAAA;QAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAEnB,0CAA0C;QAC1C,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QACxB,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;YACpB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,EAAC,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,KAAK,EAAQ;QACvD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;QAEnB,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAA;QACnC,CAAC;QACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,MAAM,CAAC,GAAG,GAAG,GAAG,CAAA;QACvB,CAAC;QAED,kDAAkD;QAClD,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAClD,MAAM,WAAW,GAAW,EAAE,CAAA;YAC9B,IAAI,QAAQ,EAAE,CAAC;gBACb,WAAW,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,CAAA;YAC/B,CAAC;YACD,IAAI,KAAK,EAAE,CAAC;gBACV,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACzB,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;gBACjB,SAAS,EAAE,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS;gBAC7C,GAAG,EAAE,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG;gBAC3B,QAAQ,EAAE,WAAW;aACtB,CAAC,CAAA;QACJ,CAAC;QAED,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACrB,CAAC;IAED,OAAO,CAAC,EACN,UAAU,EACV,cAAc,EACd,YAAY,EACZ,WAAW,EAAE,mBAAmB,EAChC,MAAM,EACN,cAAc,GACR;QACN,IAAI,CAAC,WAAW,GAAG,UAAU,IAAI,MAAM,CAAA;QACvC,IAAI,CAAC,eAAe,GAAG,cAAc,IAAI,IAAI,CAAA;QAC7C,IAAI,CAAC,aAAa,GAAG,YAAY,IAAI,KAAK,CAAA;QAC1C,IAAI,CAAC,oBAAoB,GAAG,mBAAmB,CAAA;QAC/C,IAAI,CAAC,eAAe,GAAG,cAAc,CAAA;QACrC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,cAAc,GAAG,EAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,EAAC,CAAA;QACpD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,GAAG,CAAC,KAAW,EAAE,EAAW;QAC1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAC5B,CAAC;IAED,WAAW,CAAC,KAAW;QACrB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;IAChC,CAAC;IAED,iBAAiB;QACf,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAA;IACjC,CAAC;IAED;;;OAGG;IACH,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAA;IAC7B,CAAC;IAED,WAAW,CAAC,SAAe;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAA;QAC7D,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,CAAA;QAClD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAA;QACrD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,WAAW;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAA;QAElE,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9E,CAAC;IAED,WAAW;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAA;QAEhE,OAAO,CACL,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACxE,CAAA;IACH,CAAC;IAED,YAAY,CAAC,KAAiB;QAC5B,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;YACxB,OAAM;QACR,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;YACrC,IAAI,CAAC,cAAc,GAAG,SAAS,CAAA;YAC/B,OAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAA;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAA;QAElE,IACE,OAAO;YACP,OAAO;YACP,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC;YAChD,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,EAC/C,CAAC;YACD,4BAA4B;YAC5B,OAAM;QACR,CAAC;QAED,IAAI,IAAI,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;gBAC5D,IAAI,CAAC,cAAc,GAAG,YAAY,CAAA;YACpC,CAAC;iBAAM,IAAI,OAAO,IAAI,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;gBAClE,IAAI,CAAC,cAAc,GAAG,UAAU,CAAA;YAClC,CAAC;iBAAM,CAAC;gBACN,OAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAA;IAC9B,CAAC;IAED,gBAAgB,CAAC,KAAiB;QAChC,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAA;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAA;QAClE,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE,IAAI,OAAO,CAAA;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,EAAE,IAAI,OAAO,CAAA;QAC3D,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAChE,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAElE,IAAI,OAAO,IAAI,IAAI,CAAC,cAAc,KAAK,YAAY,EAAE,CAAC;YACpD,MAAM,UAAU,GAAG,YAAY,CAAA;YAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,CAAA;YACtE,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAC3C,UAAU,EACV,YAAY,EACZ,IAAI,CAAC,YAAY,CAAC,KAAK,CACxB,CAAA;YACD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,CAAA;YAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CACrB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,CACvE,CAAA;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAC1C,MAAM,EACN,aAAa,EACb,UAAU,CACX,CAAA;YACD,IAAI,CAAC,cAAc,GAAG;gBACpB,CAAC,EAAE,CAAC,OAAO;gBACX,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;aACzB,CAAA;QACH,CAAC;aAAM,IAAI,OAAO,IAAI,IAAI,CAAC,cAAc,KAAK,UAAU,EAAE,CAAC;YACzD,MAAM,WAAW,GAAG,aAAa,CAAA;YACjC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,aAAa,CAAC,CAAA;YACxE,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAC5C,WAAW,EACX,aAAa,EACb,IAAI,CAAC,YAAY,CAAC,MAAM,CACzB,CAAA;YACD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC,CAAA;YAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CACrB,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CACxE,CAAA;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,uBAAuB,CAC1C,MAAM,EACN,aAAa,EACb,UAAU,CACX,CAAA;YACD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAA;YAClB,IAAI,CAAC,cAAc,GAAG;gBACpB,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;gBACxB,CAAC;aACF,CAAA;YACD,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAA;QAC5C,CAAC;IACH,CAAC;IAED,YAAY,CAAC,KAAiB;QAC5B,IAAI,MAAM,GAAG,CAAC,EACZ,MAAM,GAAG,CAAC,CAAA;QACZ,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;YACpC,MAAM,GAAG,IAAI,CAAC,aAAa,GAAG,CAAC,CAAC,CAAA;QAClC,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAC7C,MAAM,GAAG,IAAI,CAAC,aAAa,CAAA;QAC7B,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAC7C,MAAM,GAAG,IAAI,CAAC,YAAY,CAAA;QAC5B,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;YAC9C,MAAM,GAAG,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC,CAAA;QACjC,CAAC;QAED,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,CAAA;YACX,MAAM,IAAI,CAAC,CAAA;QACb,CAAC;QAED,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAA;QAC1E,IAAI,CAAC,OAAO,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,MAAM,GAAG,MAAM,CAAA;QACjB,CAAC;QAED,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,CAAC;IAED;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,OAAe,EAAE,OAAe;QACvC,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YACnC,OAAM;QACR,CAAC;QAED,6CAA6C;QAC7C,IAAI,IAAI,CAAC,WAAW,KAAK,YAAY,EAAE,CAAC;YACtC,OAAO,GAAG,CAAC,CAAA;QACb,CAAC;aAAM,IAAI,IAAI,CAAC,WAAW,KAAK,UAAU,EAAE,CAAC;YAC3C,OAAO,GAAG,CAAC,CAAA;QACb,CAAC;QAED,IAAI,OAAO,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,EAAE,CAAC;YACnC,OAAM;QACR,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAA;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAA;QAElE,IAAI,EAAC,CAAC,EAAE,CAAC,EAAC,GAAG,IAAI,CAAC,cAAc,CAAA;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;QAC/B,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAA;QAC5C,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAA;QAC5C,IAAI,CAAC,cAAc,GAAG,EAAC,CAAC,EAAE,CAAC,EAAC,CAAA;QAE5B,uDAAuD;QACvD,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,IAAI,CAAA;QAE5B,IAAI,CAAC,eAAe,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACrD,CAAC;IAED,wBAAwB;QACtB,OAAO,CACL,IAAI,CAAC,eAAe,KAAK,IAAI,IAAI,IAAI,CAAC,eAAe,KAAK,YAAY,CACvE,CAAA;IACH,CAAC;IAED,sBAAsB;QACpB,OAAO,IAAI,CAAC,eAAe,KAAK,IAAI,IAAI,IAAI,CAAC,eAAe,KAAK,UAAU,CAAA;IAC7E,CAAC;IAED,eAAe;QACb,OAAO,IAAI,KAAK,CAAC;YACf,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;YAClC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW;SACnC,CAAC,CAAA;IACJ,CAAC;IAED,oBAAoB;QAClB,OAAO,IAAI,KAAK,CAAC;YACf,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;YACrC,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc;SACtC,CAAC,CAAA;IACJ,CAAC;IAED,qBAAqB,CACnB,WAAmB,EACnB,aAAqB,EACrB,aAAqB;QAErB,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CACnC,CAAC,aAAa,GAAG,aAAa,CAAC,GAAG,WAAW,CAC9C,CAAA;QACD,MAAM,SAAS,GACb,aAAa,GAAG,aAAa,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAA;QAE/D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAA;IAC7D,CAAC;IAED,uBAAuB,CACrB,aAAqB,EACrB,gBAAwB,EACxB,kBAA0B;QAE1B,OAAO,IAAI,CAAC,KAAK,CACf,WAAW,CACT,aAAa,EACb,CAAC,CAAC,EAAE,gBAAgB,CAAC,EACrB,CAAC,CAAC,EAAE,kBAAkB,CAAC,EACvB,IAAI,CACL,CACF,CAAA;IACH,CAAC;IAED,IAAI,WAAW;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACtD,OAAO,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACjD,CAAC;IAED,MAAM,CAAC,QAAkB;QACvB,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAA;QAC/B,CAAC;QAED,QAAQ,CAAC,aAAa,CAAC,aAAa,CAAC,CAAA;QAErC,IAAI,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAA;QACzC,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC9B,WAAW,CAAC,KAAK;gBACf,IAAI,CAAC,oBAAoB,CAAC,KAAK,IAAI,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAA;YAC/D,WAAW,CAAC,MAAM;gBAChB,IAAI,CAAC,oBAAoB,CAAC,MAAM,IAAI,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAA;QACnE,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;YAC/D,WAAW,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAA;YACnC,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAA;QACvC,CAAC;QACD,IAAI,CAAC,YAAY,GAAG,WAAW,CAAA;QAE/B,MAAM,cAAc,GAAG,IAAI,CAAC,WAAW,KAAK,UAAU,CAAA;QACtD,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,KAAK,YAAY,CAAA;QACvD,MAAM,OAAO,GACX,cAAc,IAAI,WAAW,CAAC,KAAK,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAA;QAClE,MAAM,OAAO,GACX,aAAa,IAAI,WAAW,CAAC,MAAM,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAA;QAEnE,yEAAyE;QACzE,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,WAAW,IAAI,OAAO,EAAE,CAAC;YACtD,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAA;YAC/B,IAAI,CAAC,cAAc,GAAG,EAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAC,CAAA;QAC3D,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,EAAE,IAAI,OAAO,CAAA;QACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,wBAAwB,EAAE,IAAI,OAAO,CAAA;QAE3D,2EAA2E;QAC3E,wDAAwD;QACxD,yEAAyE;QACzE,yEAAyE;QACzE,oEAAoE;QACpE,2CAA2C;QAC3C,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QACpE,MAAM,aAAa,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAEtE,qEAAqE;QACrE,oEAAoE;QACpE,kEAAkE;QAClE,yBAAyB;QACzB,MAAM,cAAc,GAAG,IAAI,IAAI,CAC7B,KAAK,CAAC,IAAI,EACV,IAAI,IAAI,CAAC,YAAY,EAAE,aAAa,CAAC,CACtC,CAAA;QACD,MAAM,OAAO,GAAG,IAAI,IAAI,CACtB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAC9C;YACE,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,YAAY,CAAC;YACzC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC;SAC5C,CACF,CAAA;QACD,QAAQ,CAAC,OAAO,CAAC,cAAc,EAAE,eAAe,CAAC,EAAE;YACjD,eAAe,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;gBACxC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YAC5B,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,sEAAsE;QACtE,+EAA+E;QAC/E,yEAAyE;QACzE,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAClD,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACf,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAChB,CAAA;QAED,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;YACxC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAA;YAEjD,+CAA+C;YAC/C,4CAA4C;YAC5C,4EAA4E;YAC5E,0EAA0E;YAC1E,MAAM,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,EAC/C,UAAU,GAAG,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAC5C,eAAe,GAAG,UAAU,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EACjD,cAAc,GAAG,UAAU,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;YAClD,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBACzB,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAA;YACnE,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,aAAa,CACpB,mBAAmB,EACnB,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,IAAI,IAAI,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CACrE,CAAA;gBAED,MAAM,UAAU,GAAG,eAAe,GAAG,CAAC,CAAA;gBACtC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK,GAAG,YAAY,CAAC,CAAA;gBAChE,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAC3C,UAAU,EACV,YAAY,EACZ,WAAW,CAAC,KAAK,CAClB,CAAA;gBACD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,GAAG,UAAU,CAAC,CAAA;gBAC1D,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAA;gBAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CACxC,cAAc,EACd,UAAU,EACV,aAAa,CACd,CAAA;gBACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC1C,MAAM,OAAO,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,UAAU,CAAA;oBACpD,QAAQ,CAAC,KAAK,CACZ,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EACnB,IAAI,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,EACxB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CACpC,CAAA;gBACH,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,aAAa,CACpB,mBAAmB,EACnB,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,EAAE,cAAc,GAAG,CAAC,CAAC,CAAC,CACpE,CAAA;gBAED,MAAM,WAAW,GAAG,cAAc,GAAG,CAAC,CAAA;gBACtC,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,MAAM,GAAG,aAAa,CAAC,CAAA;gBAClE,MAAM,WAAW,GAAG,IAAI,CAAC,qBAAqB,CAC5C,WAAW,EACX,aAAa,EACb,WAAW,CAAC,MAAM,CACnB,CAAA;gBACD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,GAAG,WAAW,CAAC,CAAA;gBAC5D,MAAM,cAAc,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAA;gBAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,uBAAuB,CACxC,cAAc,EACd,UAAU,EACV,aAAa,CACd,CAAA;gBACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzC,MAAM,OAAO,GAAG,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,WAAW,CAAA;oBACrD,QAAQ,CAAC,KAAK,CACZ,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EACnB,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,EACxB,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CACpC,CAAA;gBACH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF"}
@@ -4,18 +4,19 @@ import { Container } from '../Container.js';
4
4
  import { Size } from '../geometry.js';
5
5
  import { type MouseEvent } from '../events/index.js';
6
6
  interface Props<T> extends ViewProps {
7
- items: T[];
8
- renderItem: (item: T, row: number) => View;
7
+ data: T[];
8
+ renderItem?: (item: T, row: number) => View;
9
+ /**
10
+ * Filter function that determines which items are visible.
11
+ * Return `true` to keep the item, `false` to hide it.
12
+ * Cached views are preserved when the filter changes (only cleared when `data` changes).
13
+ */
14
+ filter?: (item: T) => boolean;
9
15
  /**
10
16
  * Show/hide the scrollbars
11
17
  * @default true
12
18
  */
13
19
  showScrollbars?: boolean;
14
- /**
15
- * How many rows to scroll by when using the mouse wheel.
16
- * @default 1
17
- */
18
- scrollHeight?: number;
19
20
  /**
20
21
  * Useful for log views
21
22
  */
@@ -27,7 +28,7 @@ interface ContentOffset {
27
28
  }
28
29
  export declare class ScrollableList<T> extends Container {
29
30
  #private;
30
- constructor({ renderItem, items, keepAtBottom, scrollHeight, showScrollbars, ...viewProps }: Props<T>);
31
+ constructor({ renderItem, data, filter, keepAtBottom, showScrollbars, ...viewProps }: Props<T>);
31
32
  update(props: Props<T>): void;
32
33
  naturalSize(available: Size): Size;
33
34
  /**
@@ -59,7 +60,13 @@ export declare class ScrollableList<T> extends Container {
59
60
  * to point to the top-most row.
60
61
  */
61
62
  scrollBy(offset: number): void;
62
- updateItems(items: T[]): void;
63
+ updateFilter(filter?: (item: T) => boolean): void;
64
+ /**
65
+ * Re-applies the current filter. Useful when the filter function captures
66
+ * external state that has changed without the function reference itself changing.
67
+ */
68
+ refresh(): void;
69
+ updateData(data: T[]): void;
63
70
  viewForRow(row: number): View | undefined;
64
71
  sizeForRow(row: number, contentWidth: number, view: View): Size;
65
72
  sizeForRow(row: number, contentWidth: number): Size | undefined;
@@ -3,36 +3,44 @@ import { Style } from '../Style.js';
3
3
  import { Rect, Point, Size, interpolate } from '../geometry.js';
4
4
  import { isMouseDragging } from '../events/index.js';
5
5
  export class ScrollableList extends Container {
6
+ #data;
7
+ #filteredData;
6
8
  /**
7
- * Your function here need not return "stable" views; the views returned by this
8
- * function will be cached until you call `scrollableList.invalidateCache()` or
9
- * `scrollableList.invalidateRow(row)`.
9
+ * Your renderItem function need not return "stable" views; the views returned by
10
+ * this function will be cached until you call `scrollableList.invalidateCache()`
11
+ * or `scrollableList.invalidateRow(row)`.
10
12
  */
11
- #items;
12
13
  #renderItem;
14
+ #filter;
13
15
  #keepAtBottom;
14
16
  #isAtBottom = true;
15
17
  #showScrollbars;
16
- #scrollHeight;
18
+ #scrollHeight = 1;
17
19
  #contentOffset;
18
20
  #maxWidth = 0;
19
21
  #viewCache = new Map();
20
22
  #sizeCache = new Map();
21
23
  #totalHeight;
22
- constructor({ renderItem, items, keepAtBottom, scrollHeight, showScrollbars, ...viewProps }) {
24
+ constructor({ renderItem, data, filter, keepAtBottom, showScrollbars, ...viewProps }) {
23
25
  super(viewProps);
24
26
  this.#showScrollbars = showScrollbars ?? true;
25
27
  this.#contentOffset = { row: 0, offset: 0 };
26
28
  this.#renderItem = renderItem;
27
- this.#scrollHeight = scrollHeight ?? 1;
28
- this.#items = items;
29
+ this.#filter = filter;
30
+ this.#data = data;
31
+ this.#filteredData = filter ? data.filter(filter) : data;
29
32
  this.#keepAtBottom = keepAtBottom ?? false;
30
33
  }
31
34
  update(props) {
32
35
  this.#update(props);
33
36
  super.update(props);
34
37
  }
35
- #update({}) { }
38
+ #update({ filter }) {
39
+ if (filter !== this.#filter) {
40
+ this.#filter = filter;
41
+ this.#applyFilter();
42
+ }
43
+ }
36
44
  naturalSize(available) {
37
45
  let { row, offset: y } = this.#contentOffset;
38
46
  const scrollWidth = this.#showScrollbars ? 1 : 0;
@@ -48,7 +56,7 @@ export class ScrollableList extends Container {
48
56
  y += rowSize.height;
49
57
  row += 1;
50
58
  }
51
- return new Size(this.#maxWidth + scrollWidth, available.height);
59
+ return new Size(this.#maxWidth + scrollWidth, Math.min(y, available.height));
52
60
  }
53
61
  /**
54
62
  * Tells ScrollableList to re-fetch all rows.
@@ -100,7 +108,7 @@ export class ScrollableList extends Container {
100
108
  const heightY = Math.round(interpolate(Math.max(0, Math.min(this.contentSize.height - 1, event.position.y)), [0, this.contentSize.height - 1], [0, maxY]));
101
109
  this.#isAtBottom = heightY === maxY;
102
110
  const cellWidth = this.contentSize.width;
103
- for (let row = 0, y = 0; row < this.#items.length; row++) {
111
+ for (let row = 0, y = 0; row < this.#filteredData.length; row++) {
104
112
  const rowHeight = this.sizeForRow(row, cellWidth)?.height;
105
113
  if (rowHeight === undefined) {
106
114
  break;
@@ -160,16 +168,39 @@ export class ScrollableList extends Container {
160
168
  this.#contentOffset = { row: row, offset: nextOffset };
161
169
  }
162
170
  }
163
- updateItems(items) {
164
- this.#items = items;
171
+ #applyFilter() {
172
+ this.#filteredData = this.#filter
173
+ ? this.#data.filter(this.#filter)
174
+ : this.#data;
175
+ this.#contentOffset = { row: 0, offset: 0 };
176
+ this.invalidateAllRows('size');
177
+ super.invalidateSize();
178
+ }
179
+ updateFilter(filter) {
180
+ this.#filter = filter;
181
+ this.#applyFilter();
182
+ }
183
+ /**
184
+ * Re-applies the current filter. Useful when the filter function captures
185
+ * external state that has changed without the function reference itself changing.
186
+ */
187
+ refresh() {
188
+ this.#applyFilter();
189
+ }
190
+ updateData(data) {
191
+ this.#data = data;
192
+ this.#filteredData = this.#filter ? data.filter(this.#filter) : data;
165
193
  this.invalidateAllRows('view');
166
194
  this.invalidateSize();
167
195
  }
168
196
  viewForRow(row) {
169
- if (row < 0 || row >= this.#items.length) {
197
+ if (row < 0 || row >= this.#filteredData.length) {
170
198
  return;
171
199
  }
172
- const item = this.#items[row];
200
+ if (!this.#renderItem) {
201
+ return this.children[row];
202
+ }
203
+ const item = this.#filteredData[row];
173
204
  let view = this.#viewCache.get(item);
174
205
  if (!view) {
175
206
  view = this.#renderItem(item, row);
@@ -180,7 +211,7 @@ export class ScrollableList extends Container {
180
211
  return view;
181
212
  }
182
213
  sizeForRow(row, contentWidth, view) {
183
- const item = this.#items[row];
214
+ const item = this.#filteredData[row];
184
215
  if (contentWidth === this.contentSize.width && item) {
185
216
  const size = this.#sizeCache.get(item);
186
217
  if (size !== undefined) {
@@ -201,7 +232,7 @@ export class ScrollableList extends Container {
201
232
  return super.contentSize.shrink(this.#showScrollbars ? 1 : 0, 0);
202
233
  }
203
234
  lastOffset() {
204
- const cellCount = this.#items.length;
235
+ const cellCount = this.#filteredData.length;
205
236
  const cellWidth = this.contentSize.width;
206
237
  let row = cellCount - 1;
207
238
  let y = 0;
@@ -223,7 +254,7 @@ export class ScrollableList extends Container {
223
254
  return super.render(viewport);
224
255
  }
225
256
  viewport.registerMouse('mouse.wheel');
226
- if (this.#contentOffset.row >= this.#items.length ||
257
+ if (this.#contentOffset.row >= this.#filteredData.length ||
227
258
  (this.#keepAtBottom && this.#isAtBottom)) {
228
259
  const offset = this.lastOffset();
229
260
  this.#contentOffset = offset;
@@ -274,7 +305,7 @@ export class ScrollableList extends Container {
274
305
  if (this.#showScrollbars) {
275
306
  viewport.registerMouse('mouse.button.left', new Rect(new Point(cellWidth, 0), new Size(1, viewport.contentSize.height)));
276
307
  heights[2] = heights[1];
277
- for (let i = row; i < this.#items.length; i++) {
308
+ for (let i = row; i < this.#filteredData.length; i++) {
278
309
  const rowHeight = this.sizeForRow(i, cellWidth)?.height;
279
310
  if (rowHeight === undefined) {
280
311
  break;