virtua 0.53.3 → 0.53.5

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 (51) hide show
  1. package/README.md +37 -32
  2. package/lib/angular/VGrid.d.ts +1 -1
  3. package/lib/angular/VList.d.ts +1 -1
  4. package/lib/angular/VMasonry.d.ts +1 -1
  5. package/lib/angular/Virtualizer.d.ts +1 -1
  6. package/lib/angular/WindowVirtualizer.d.ts +1 -1
  7. package/lib/angular/index.js +588 -586
  8. package/lib/angular/index.js.map +1 -1
  9. package/lib/core/index.cjs +415 -412
  10. package/lib/core/index.cjs.map +1 -1
  11. package/lib/core/index.d.ts +2 -2
  12. package/lib/core/index.js +426 -423
  13. package/lib/core/index.js.map +1 -1
  14. package/lib/index.cjs +647 -645
  15. package/lib/index.cjs.map +1 -1
  16. package/lib/index.js +641 -639
  17. package/lib/index.js.map +1 -1
  18. package/lib/react/VGrid.d.ts +1 -1
  19. package/lib/react/VMasonry.d.ts +1 -1
  20. package/lib/react/Virtualizer.d.ts +1 -1
  21. package/lib/react/WindowVirtualizer.d.ts +1 -1
  22. package/lib/solid/VGrid.d.ts +1 -1
  23. package/lib/solid/VMasonry.d.ts +1 -1
  24. package/lib/solid/Virtualizer.d.ts +1 -1
  25. package/lib/solid/WindowVirtualizer.d.ts +1 -1
  26. package/lib/solid/index.cjs +674 -671
  27. package/lib/solid/index.cjs.map +1 -1
  28. package/lib/solid/index.js +673 -671
  29. package/lib/solid/index.js.map +1 -1
  30. package/lib/solid/index.jsx +167 -216
  31. package/lib/solid/index.jsx.map +1 -1
  32. package/lib/svelte/GridRow.svelte +3 -1
  33. package/lib/svelte/GridRowGroup.svelte +3 -1
  34. package/lib/svelte/VGrid.svelte +18 -21
  35. package/lib/svelte/VGrid.type.d.ts +1 -1
  36. package/lib/svelte/VMasonry.svelte +13 -15
  37. package/lib/svelte/VMasonry.type.d.ts +1 -1
  38. package/lib/svelte/Virtualizer.svelte +12 -13
  39. package/lib/svelte/Virtualizer.type.d.ts +1 -1
  40. package/lib/svelte/WindowVirtualizer.svelte +11 -10
  41. package/lib/svelte/WindowVirtualizer.type.d.ts +1 -1
  42. package/lib/vue/VGrid.d.ts +1 -1
  43. package/lib/vue/VMasonry.d.ts +1 -1
  44. package/lib/vue/Virtualizer.d.ts +1 -1
  45. package/lib/vue/WindowVirtualizer.d.ts +1 -1
  46. package/lib/vue/index.cjs +802 -797
  47. package/lib/vue/index.cjs.map +1 -1
  48. package/lib/vue/index.js +773 -768
  49. package/lib/vue/index.js.map +1 -1
  50. package/package.json +1 -1
  51. package/lib/core/observer.d.ts +0 -1
@@ -26,8 +26,10 @@
26
26
 
27
27
  <div role="row" aria-rowindex={state.$row + 1} {style}>
28
28
  {#each state.$cells as cell (cell.$col)}
29
- <!-- Guard for experimental.async: true, which runs the each block before $effect.pre -->
29
+ <!-- The each block runs before $effect.pre with experimental.async, so the store may still have the length before the update -->
30
+ <!-- https://svelte.dev/docs/svelte/await-expressions#Breaking-changes -->
30
31
  <!-- https://github.com/inokawa/virtua/pull/847 -->
32
+ <!-- https://github.com/inokawa/virtua/pull/1018 -->
31
33
  {#if cell.$col < getAxisLength(cols)}
32
34
  <GridCell
33
35
  state={cell}
@@ -27,8 +27,10 @@
27
27
  <!-- https://www.w3.org/TR/wai-aria-1.2/#rowgroup -->
28
28
  <div role="rowgroup" {style}>
29
29
  {#each state.$rows as row (row.$row)}
30
- <!-- Guard for experimental.async: true, which runs the each block before $effect.pre -->
30
+ <!-- The each block runs before $effect.pre with experimental.async, so the store may still have the length before the update -->
31
+ <!-- https://svelte.dev/docs/svelte/await-expressions#Breaking-changes -->
31
32
  <!-- https://github.com/inokawa/virtua/pull/847 -->
33
+ <!-- https://github.com/inokawa/virtua/pull/1018 -->
32
34
  {#if row.$row < getAxisLength(rows)}
33
35
  <GridRow
34
36
  state={row}
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  type StateVersion,
5
5
  ACTION_ITEMS_LENGTH_CHANGE,
6
- ACTION_RELAYOUT,
6
+ relayout,
7
7
  UPDATE_SCROLL_END_EVENT,
8
8
  UPDATE_SIZE_EVENT,
9
9
  microtask,
@@ -58,7 +58,12 @@
58
58
  let spanIndex = $derived(createGridSpanIndex(spans));
59
59
  const rowStore = createVirtualStore(rowLayout);
60
60
  const colStore = createVirtualStore(colLayout);
61
- const driver = createContainerGridDriver(rowStore, colStore);
61
+ const driver = createContainerGridDriver(
62
+ rowStore,
63
+ colStore,
64
+ rowLayout,
65
+ colLayout,
66
+ );
62
67
 
63
68
  let containerRef: HTMLDivElement | undefined = $state();
64
69
 
@@ -108,23 +113,13 @@
108
113
  colLayout.$setPinned(headerCols, footerCols);
109
114
  const rowLength = getAxisLength(rows);
110
115
  const colLength = getAxisLength(cols);
111
- if (rowLength !== rowStore.$getItemsLength()) {
112
- rowStore.$update(ACTION_ITEMS_LENGTH_CHANGE, [rowLength]);
113
- }
114
- if (colLength !== colStore.$getItemsLength()) {
115
- colStore.$update(ACTION_ITEMS_LENGTH_CHANGE, [colLength]);
116
- }
117
- rowStore.$update(
118
- ACTION_RELAYOUT,
119
- rowLayout.$relayout(rowSizes, rowStore.$getVisibleOffset()),
120
- );
121
- colStore.$update(
122
- ACTION_RELAYOUT,
123
- colLayout.$relayout(colSizes, colStore.$getVisibleOffset()),
124
- );
116
+ rowStore.$update(ACTION_ITEMS_LENGTH_CHANGE, rowLength);
117
+ colStore.$update(ACTION_ITEMS_LENGTH_CHANGE, colLength);
118
+ relayout(rowStore, rowLayout, rowSizes);
119
+ relayout(colStore, colLayout, colSizes);
125
120
  });
126
- let rowCount = $derived(stateVersion && rowStore.$getItemsLength());
127
- let colCount = $derived(stateVersion && colStore.$getItemsLength());
121
+ let rowCount = $derived(stateVersion && rowLayout.$getLength());
122
+ let colCount = $derived(stateVersion && colLayout.$getLength());
128
123
  let plan = $derived.by(() => {
129
124
  stateVersion;
130
125
  return createGridPlan(
@@ -176,8 +171,8 @@
176
171
  rowStore.$getItemOffset;
177
172
  export const getColOffset: VGridHandle["getColOffset"] =
178
173
  colStore.$getItemOffset;
179
- export const getRowSize: VGridHandle["getRowSize"] = rowStore.$getItemSize;
180
- export const getColSize: VGridHandle["getColSize"] = colStore.$getItemSize;
174
+ export const getRowSize: VGridHandle["getRowSize"] = rowLayout.$getItemSize;
175
+ export const getColSize: VGridHandle["getColSize"] = colLayout.$getItemSize;
181
176
  export const scrollToIndex: VGridHandle["scrollToIndex"] = (opts) =>
182
177
  gridScrollToIndex(
183
178
  driver,
@@ -247,8 +242,10 @@
247
242
  resizer={driver.$observeItem}
248
243
  />
249
244
  {:else}
250
- <!-- Guard for experimental.async: true, which runs the each block before $effect.pre -->
245
+ <!-- The each block runs before $effect.pre with experimental.async, so the store may still have the length before the update -->
246
+ <!-- https://svelte.dev/docs/svelte/await-expressions#Breaking-changes -->
251
247
  <!-- https://github.com/inokawa/virtua/pull/847 -->
248
+ <!-- https://github.com/inokawa/virtua/pull/1018 -->
252
249
  {#if state.$row < getAxisLength(rows)}
253
250
  <GridRow
254
251
  {state}
@@ -73,7 +73,7 @@ export interface VGridProps<R = number, C = number> extends Omit<ViewportCompone
73
73
  */
74
74
  keepMounted?: readonly GridCell[];
75
75
  /**
76
- * Extra space in pixels to render before/after the viewport. The minimum value is 0. Lower value will give better performance but you can increase to avoid showing blank cells in fast scrolling.
76
+ * Extra space in pixels to render before/after the viewport. The default value is recommended for most cases. A smaller value gives better performance, and a larger value avoids showing blank cells in fast scrolling.
77
77
  * @defaultValue 200
78
78
  */
79
79
  bufferSize?: number;
@@ -10,12 +10,13 @@
10
10
  createContainerDriver,
11
11
  createMasonryLayout,
12
12
  ACTION_ITEMS_LENGTH_CHANGE,
13
- ACTION_RELAYOUT,
13
+ relayout,
14
14
  createVirtualStore,
15
15
  getScrollSize as _getScrollSize,
16
16
  scrollTo as _scrollTo,
17
17
  scrollBy as _scrollBy,
18
18
  scrollToIndex as _scrollToIndex,
19
+ min,
19
20
  sort,
20
21
  } from "../core/index.js";
21
22
  import { defaultGetKey, isSameRange, styleToString } from "./utils.js";
@@ -51,7 +52,7 @@
51
52
  cache,
52
53
  );
53
54
  const store = createVirtualStore(layout);
54
- const driver = createContainerDriver(store, false);
55
+ const driver = createContainerDriver(store, layout, false);
55
56
  store.$subscribe(UPDATE_VIRTUAL_STATE, () => {
56
57
  stateVersion = store.$getStateVersion();
57
58
  });
@@ -86,7 +87,11 @@
86
87
  let crossSize = $derived(toCrossValue(1 / lanes, gap / lanes - gap));
87
88
 
88
89
  let indexes = $derived.by(() => {
89
- const len = data.length;
90
+ // The each block runs before $effect.pre with experimental.async, so the store may still have the length before the update
91
+ // https://svelte.dev/docs/svelte/await-expressions#Breaking-changes
92
+ // https://github.com/inokawa/virtua/pull/847
93
+ // https://github.com/inokawa/virtua/pull/1018
94
+ const len = stateVersion && min(data.length, layout.$getLength());
90
95
  const [start, end] = range;
91
96
  const arr: number[] = [];
92
97
  if (keepMounted) {
@@ -101,8 +106,6 @@
101
106
  }
102
107
  } else {
103
108
  for (let i = start; i <= end; i++) {
104
- // Guard for experimental.async: true, which runs the each block before $effect.pre
105
- // https://github.com/inokawa/virtua/pull/847
106
109
  if (i < len) {
107
110
  arr.push(i);
108
111
  }
@@ -120,15 +123,10 @@
120
123
  });
121
124
 
122
125
  $effect.pre(() => {
123
- if (data.length !== store.$getItemsLength()) {
124
- store.$update(ACTION_ITEMS_LENGTH_CHANGE, [data.length]);
125
- }
126
+ store.$update(ACTION_ITEMS_LENGTH_CHANGE, data.length);
126
127
  });
127
128
  $effect.pre(() => {
128
- store.$update(
129
- ACTION_RELAYOUT,
130
- layout.$relayout(lanesProp, gapProp, store.$getVisibleOffset()),
131
- );
129
+ relayout(store, layout, lanesProp, gapProp);
132
130
  });
133
131
 
134
132
  let prevStateVersion: StateVersion | undefined;
@@ -151,9 +149,9 @@
151
149
  export const getItemOffset =
152
150
  store.$getItemOffset satisfies VMasonryHandle["getItemOffset"] as VMasonryHandle["getItemOffset"];
153
151
  export const getItemSize =
154
- store.$getItemSize satisfies VMasonryHandle["getItemSize"] as VMasonryHandle["getItemSize"];
152
+ layout.$getItemSize satisfies VMasonryHandle["getItemSize"] as VMasonryHandle["getItemSize"];
155
153
  export const scrollToIndex: VMasonryHandle["scrollToIndex"] = (index, opts) =>
156
- _scrollToIndex(driver, store, index, opts);
154
+ _scrollToIndex(driver, store, layout, index, opts);
157
155
  export const scrollTo: VMasonryHandle["scrollTo"] = (offset) =>
158
156
  _scrollTo(driver, offset);
159
157
  export const scrollBy: VMasonryHandle["scrollBy"] = (offset) =>
@@ -195,7 +193,7 @@
195
193
  offset={stateVersion && store.$getItemOffset(index)}
196
194
  crossOffset={toCrossValue(lane / lanes, (lane * gap) / lanes)}
197
195
  {crossSize}
198
- hide={stateVersion && store.$isUnmeasuredItem(index)}
196
+ hide={stateVersion && layout.$isSizeEqual(index)}
199
197
  resizer={driver.$observeItem}
200
198
  />
201
199
  {/each}
@@ -35,7 +35,7 @@ export interface VMasonryProps<T> extends ViewportComponentAttributes {
35
35
  */
36
36
  itemSize?: number;
37
37
  /**
38
- * Extra item space in pixels to render before/after the viewport. The minimum value is 0. Lower value will give better performance but you can increase to avoid showing blank items in fast scrolling.
38
+ * Extra space in pixels to render before/after the viewport. The default value is recommended for most cases. A smaller value gives better performance, and a larger value avoids showing blank items in fast scrolling.
39
39
  * @defaultValue 200
40
40
  */
41
41
  bufferSize?: number;
@@ -16,6 +16,7 @@
16
16
  createVirtualStore,
17
17
  createListLayout,
18
18
  getScrollSize as _getScrollSize,
19
+ min,
19
20
  sort,
20
21
  } from "../core/index.js";
21
22
  import { defaultGetKey, isSameRange, styleToString } from "./utils.js";
@@ -50,7 +51,7 @@
50
51
 
51
52
  const layout = createListLayout(data.length, itemSize, cache);
52
53
  const store = createVirtualStore(layout, ssrCount);
53
- const driver = createContainerDriver(store, horizontal);
54
+ const driver = createContainerDriver(store, layout, horizontal);
54
55
  store.$subscribe(UPDATE_VIRTUAL_STATE, () => {
55
56
  stateVersion = store.$getStateVersion();
56
57
  });
@@ -83,7 +84,11 @@
83
84
  let totalSize = $derived(stateVersion && store.$getTotalSize());
84
85
 
85
86
  let indexes = $derived.by(() => {
86
- const len = data.length;
87
+ // The each block runs before $effect.pre with experimental.async, so the store may still have the length before the update
88
+ // https://svelte.dev/docs/svelte/await-expressions#Breaking-changes
89
+ // https://github.com/inokawa/virtua/pull/847
90
+ // https://github.com/inokawa/virtua/pull/1018
91
+ const len = stateVersion && min(data.length, layout.$getLength());
87
92
 
88
93
  const [start, end] = range;
89
94
  const arr: number[] = [];
@@ -99,8 +104,6 @@
99
104
  }
100
105
  } else {
101
106
  for (let i = start; i <= end; i++) {
102
- // Guard for experimental.async: true, which runs the each block before $effect.pre
103
- // https://github.com/inokawa/virtua/pull/847
104
107
  if (i < len) {
105
108
  arr.push(i);
106
109
  }
@@ -130,15 +133,11 @@
130
133
  });
131
134
 
132
135
  $effect.pre(() => {
133
- if (data.length !== store.$getItemsLength()) {
134
- store.$update(ACTION_ITEMS_LENGTH_CHANGE, [data.length, shift]);
135
- }
136
+ store.$update(ACTION_ITEMS_LENGTH_CHANGE, data.length, shift);
136
137
  });
137
138
 
138
139
  $effect.pre(() => {
139
- if (startMargin !== store.$getStartSpacerSize()) {
140
- store.$update(ACTION_START_OFFSET_CHANGE, startMargin);
141
- }
140
+ store.$update(ACTION_START_OFFSET_CHANGE, startMargin);
142
141
  });
143
142
 
144
143
  let prevStateVersion: StateVersion | undefined;
@@ -165,11 +164,11 @@
165
164
  export const getItemOffset =
166
165
  store.$getItemOffset satisfies VirtualizerHandle["getItemOffset"] as VirtualizerHandle["getItemOffset"];
167
166
  export const getItemSize =
168
- store.$getItemSize satisfies VirtualizerHandle["getItemSize"] as VirtualizerHandle["getItemSize"];
167
+ layout.$getItemSize satisfies VirtualizerHandle["getItemSize"] as VirtualizerHandle["getItemSize"];
169
168
  export const scrollToIndex: VirtualizerHandle["scrollToIndex"] = (
170
169
  index,
171
170
  opts,
172
- ) => _scrollToIndex(driver, store, index, opts);
171
+ ) => _scrollToIndex(driver, store, layout, index, opts);
173
172
  export const scrollTo: VirtualizerHandle["scrollTo"] = (offset) =>
174
173
  _scrollTo(driver, offset);
175
174
  export const scrollBy: VirtualizerHandle["scrollBy"] = (offset) =>
@@ -201,7 +200,7 @@
201
200
  {index}
202
201
  as={itemAs}
203
202
  offset={stateVersion && store.$getItemOffset(index)}
204
- hide={stateVersion && store.$isUnmeasuredItem(index)}
203
+ hide={stateVersion && layout.$isSizeEqual(index)}
205
204
  {horizontal}
206
205
  {isSSR}
207
206
  resizer={driver.$observeItem}
@@ -34,7 +34,7 @@ export interface VirtualizerProps<T> {
34
34
  */
35
35
  itemProps?: ItemProps<T>;
36
36
  /**
37
- * Extra item space in pixels to render before/after the viewport. The minimum value is 0. Lower value will give better performance but you can increase to avoid showing blank items in fast scrolling.
37
+ * Extra space in pixels to render before/after the viewport. The default value is recommended for most cases. A smaller value gives better performance, and a larger value avoids showing blank items in fast scrolling.
38
38
  * @defaultValue 200
39
39
  */
40
40
  bufferSize?: number;
@@ -13,6 +13,7 @@
13
13
  getScrollSize as _getScrollSize,
14
14
  createWindowDriver,
15
15
  scrollToIndex as _scrollToIndex,
16
+ min,
16
17
  } from "../core/index.js";
17
18
  import { defaultGetKey, isSameRange, styleToString } from "./utils.js";
18
19
  import ListItem from "./ListItem.svelte";
@@ -40,7 +41,7 @@
40
41
 
41
42
  const layout = createListLayout(data.length, itemSize, cache);
42
43
  const store = createVirtualStore(layout, ssrCount);
43
- const driver = createWindowDriver(store, horizontal);
44
+ const driver = createWindowDriver(store, layout, horizontal);
44
45
  store.$subscribe(UPDATE_VIRTUAL_STATE, () => {
45
46
  stateVersion = store.$getStateVersion();
46
47
  });
@@ -74,13 +75,15 @@
74
75
  let totalSize = $derived(stateVersion && store.$getTotalSize());
75
76
 
76
77
  let indexes = $derived.by(() => {
77
- const len = data.length;
78
+ // The each block runs before $effect.pre with experimental.async, so the store may still have the length before the update
79
+ // https://svelte.dev/docs/svelte/await-expressions#Breaking-changes
80
+ // https://github.com/inokawa/virtua/pull/847
81
+ // https://github.com/inokawa/virtua/pull/1018
82
+ const len = stateVersion && min(data.length, layout.$getLength());
78
83
 
79
84
  const [start, end] = range;
80
85
  const arr: number[] = [];
81
86
  for (let i = start; i <= end; i++) {
82
- // Guard for experimental.async: true, which runs the each block before $effect.pre
83
- // https://github.com/inokawa/virtua/pull/847
84
87
  if (i < len) {
85
88
  arr.push(i);
86
89
  }
@@ -99,9 +102,7 @@
99
102
  });
100
103
 
101
104
  $effect.pre(() => {
102
- if (data.length !== store.$getItemsLength()) {
103
- store.$update(ACTION_ITEMS_LENGTH_CHANGE, [data.length, shift]);
104
- }
105
+ store.$update(ACTION_ITEMS_LENGTH_CHANGE, data.length, shift);
105
106
  });
106
107
 
107
108
  let prevStateVersion: StateVersion | undefined;
@@ -124,11 +125,11 @@
124
125
  export const getItemOffset =
125
126
  store.$getItemOffset satisfies WindowVirtualizerHandle["getItemOffset"] as WindowVirtualizerHandle["getItemOffset"];
126
127
  export const getItemSize =
127
- store.$getItemSize satisfies WindowVirtualizerHandle["getItemSize"] as WindowVirtualizerHandle["getItemSize"];
128
+ layout.$getItemSize satisfies WindowVirtualizerHandle["getItemSize"] as WindowVirtualizerHandle["getItemSize"];
128
129
  export const scrollToIndex: WindowVirtualizerHandle["scrollToIndex"] = (
129
130
  index,
130
131
  opts,
131
- ) => _scrollToIndex(driver, store, index, opts);
132
+ ) => _scrollToIndex(driver, store, layout, index, opts);
132
133
 
133
134
  let containerStyle = $derived(
134
135
  styleToString({
@@ -156,7 +157,7 @@
156
157
  {index}
157
158
  as="div"
158
159
  offset={stateVersion && store.$getItemOffset(index)}
159
- hide={stateVersion && store.$isUnmeasuredItem(index)}
160
+ hide={stateVersion && layout.$isSizeEqual(index)}
160
161
  {horizontal}
161
162
  {isSSR}
162
163
  resizer={driver.$observeItem}
@@ -18,7 +18,7 @@ export interface WindowVirtualizerProps<T> {
18
18
  */
19
19
  getKey?: (data: T, index: number) => string | number;
20
20
  /**
21
- * Extra item space in pixels to render before/after the viewport. The minimum value is 0. Lower value will give better performance but you can increase to avoid showing blank items in fast scrolling.
21
+ * Extra space in pixels to render before/after the viewport. The default value is recommended for most cases. A smaller value gives better performance, and a larger value avoids showing blank items in fast scrolling.
22
22
  * @defaultValue 200
23
23
  */
24
24
  bufferSize?: number;
@@ -65,7 +65,7 @@ export interface VGridProps<R = number, C = number> extends PublicProps {
65
65
  */
66
66
  keepMounted?: readonly GridCellType[];
67
67
  /**
68
- * Extra space in pixels to render before/after the viewport. The minimum value is 0. Lower value will give better performance but you can increase to avoid showing blank cells in fast scrolling.
68
+ * Extra space in pixels to render before/after the viewport. The default value is recommended for most cases. A smaller value gives better performance, and a larger value avoids showing blank cells in fast scrolling.
69
69
  * @defaultValue 200
70
70
  */
71
71
  bufferSize?: number;
@@ -72,7 +72,7 @@ export interface VMasonryProps<T> extends PublicProps {
72
72
  */
73
73
  itemSize?: number;
74
74
  /**
75
- * Extra item space in pixels to render before/after the viewport. The minimum value is 0. Lower value will give better performance but you can increase to avoid showing blank items in fast scrolling.
75
+ * Extra space in pixels to render before/after the viewport. The default value is recommended for most cases. A smaller value gives better performance, and a larger value avoids showing blank items in fast scrolling.
76
76
  * @defaultValue 200
77
77
  */
78
78
  bufferSize?: number;
@@ -10,7 +10,7 @@ export interface VirtualizerProps<T = unknown> extends PublicProps {
10
10
  */
11
11
  data: T[];
12
12
  /**
13
- * Extra item space in pixels to render before/after the viewport. The minimum value is 0. Lower value will give better performance but you can increase to avoid showing blank items in fast scrolling.
13
+ * Extra space in pixels to render before/after the viewport. The default value is recommended for most cases. A smaller value gives better performance, and a larger value avoids showing blank items in fast scrolling.
14
14
  * @defaultValue 200
15
15
  */
16
16
  bufferSize?: number;
@@ -9,7 +9,7 @@ export interface WindowVirtualizerProps<T = unknown> extends PublicProps {
9
9
  */
10
10
  data: T[];
11
11
  /**
12
- * Extra item space in pixels to render before/after the viewport. The minimum value is 0. Lower value will give better performance but you can increase to avoid showing blank items in fast scrolling.
12
+ * Extra space in pixels to render before/after the viewport. The default value is recommended for most cases. A smaller value gives better performance, and a larger value avoids showing blank items in fast scrolling.
13
13
  * @defaultValue 200
14
14
  */
15
15
  bufferSize?: number;