virtua 0.53.2 → 0.53.4

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 (49) 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 +586 -586
  8. package/lib/angular/index.js.map +1 -1
  9. package/lib/core/index.cjs +405 -404
  10. package/lib/core/index.cjs.map +1 -1
  11. package/lib/core/index.d.ts +1 -1
  12. package/lib/core/index.js +416 -415
  13. package/lib/core/index.js.map +1 -1
  14. package/lib/index.cjs +645 -645
  15. package/lib/index.cjs.map +1 -1
  16. package/lib/index.js +639 -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 +672 -671
  27. package/lib/solid/index.cjs.map +1 -1
  28. package/lib/solid/index.js +671 -671
  29. package/lib/solid/index.js.map +1 -1
  30. package/lib/solid/index.jsx +165 -214
  31. package/lib/solid/index.jsx.map +1 -1
  32. package/lib/svelte/VGrid.svelte +15 -20
  33. package/lib/svelte/VGrid.type.d.ts +1 -1
  34. package/lib/svelte/VMasonry.svelte +10 -13
  35. package/lib/svelte/VMasonry.type.d.ts +1 -1
  36. package/lib/svelte/Virtualizer.svelte +8 -8
  37. package/lib/svelte/Virtualizer.type.d.ts +1 -1
  38. package/lib/svelte/WindowVirtualizer.svelte +5 -7
  39. package/lib/svelte/WindowVirtualizer.type.d.ts +1 -1
  40. package/lib/vue/VGrid.d.ts +1 -1
  41. package/lib/vue/VMasonry.d.ts +1 -1
  42. package/lib/vue/Virtualizer.d.ts +1 -1
  43. package/lib/vue/WindowVirtualizer.d.ts +1 -1
  44. package/lib/vue/index.cjs +800 -797
  45. package/lib/vue/index.cjs.map +1 -1
  46. package/lib/vue/index.js +771 -768
  47. package/lib/vue/index.js.map +1 -1
  48. package/package.json +1 -1
  49. package/lib/core/observer.d.ts +0 -1
@@ -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,
@@ -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,7 +10,7 @@
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,
@@ -51,7 +51,7 @@
51
51
  cache,
52
52
  );
53
53
  const store = createVirtualStore(layout);
54
- const driver = createContainerDriver(store, false);
54
+ const driver = createContainerDriver(store, layout, false);
55
55
  store.$subscribe(UPDATE_VIRTUAL_STATE, () => {
56
56
  stateVersion = store.$getStateVersion();
57
57
  });
@@ -94,8 +94,10 @@
94
94
  for (let i = start; i <= end; i++) {
95
95
  mounted.add(i);
96
96
  }
97
+ // The store may still have the previous length in async mode, as the range does
98
+ const storeLen = stateVersion && layout.$getLength();
97
99
  for (const index of sort([...mounted])) {
98
- if (index < len) {
100
+ if (index < len && index < storeLen) {
99
101
  arr.push(index);
100
102
  }
101
103
  }
@@ -120,15 +122,10 @@
120
122
  });
121
123
 
122
124
  $effect.pre(() => {
123
- if (data.length !== store.$getItemsLength()) {
124
- store.$update(ACTION_ITEMS_LENGTH_CHANGE, [data.length]);
125
- }
125
+ store.$update(ACTION_ITEMS_LENGTH_CHANGE, data.length);
126
126
  });
127
127
  $effect.pre(() => {
128
- store.$update(
129
- ACTION_RELAYOUT,
130
- layout.$relayout(lanesProp, gapProp, store.$getVisibleOffset()),
131
- );
128
+ relayout(store, layout, lanesProp, gapProp);
132
129
  });
133
130
 
134
131
  let prevStateVersion: StateVersion | undefined;
@@ -151,9 +148,9 @@
151
148
  export const getItemOffset =
152
149
  store.$getItemOffset satisfies VMasonryHandle["getItemOffset"] as VMasonryHandle["getItemOffset"];
153
150
  export const getItemSize =
154
- store.$getItemSize satisfies VMasonryHandle["getItemSize"] as VMasonryHandle["getItemSize"];
151
+ layout.$getItemSize satisfies VMasonryHandle["getItemSize"] as VMasonryHandle["getItemSize"];
155
152
  export const scrollToIndex: VMasonryHandle["scrollToIndex"] = (index, opts) =>
156
- _scrollToIndex(driver, store, index, opts);
153
+ _scrollToIndex(driver, store, layout, index, opts);
157
154
  export const scrollTo: VMasonryHandle["scrollTo"] = (offset) =>
158
155
  _scrollTo(driver, offset);
159
156
  export const scrollBy: VMasonryHandle["scrollBy"] = (offset) =>
@@ -195,7 +192,7 @@
195
192
  offset={stateVersion && store.$getItemOffset(index)}
196
193
  crossOffset={toCrossValue(lane / lanes, (lane * gap) / lanes)}
197
194
  {crossSize}
198
- hide={stateVersion && store.$isUnmeasuredItem(index)}
195
+ hide={stateVersion && layout.$isSizeEqual(index)}
199
196
  resizer={driver.$observeItem}
200
197
  />
201
198
  {/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;
@@ -50,7 +50,7 @@
50
50
 
51
51
  const layout = createListLayout(data.length, itemSize, cache);
52
52
  const store = createVirtualStore(layout, ssrCount);
53
- const driver = createContainerDriver(store, horizontal);
53
+ const driver = createContainerDriver(store, layout, horizontal);
54
54
  store.$subscribe(UPDATE_VIRTUAL_STATE, () => {
55
55
  stateVersion = store.$getStateVersion();
56
56
  });
@@ -92,8 +92,10 @@
92
92
  for (let i = start; i <= end; i++) {
93
93
  mounted.add(i);
94
94
  }
95
+ // The store may still have the previous length in async mode, as the range does
96
+ const storeLen = stateVersion && layout.$getLength();
95
97
  for (const index of sort([...mounted])) {
96
- if (index < len) {
98
+ if (index < len && index < storeLen) {
97
99
  arr.push(index);
98
100
  }
99
101
  }
@@ -130,9 +132,7 @@
130
132
  });
131
133
 
132
134
  $effect.pre(() => {
133
- if (data.length !== store.$getItemsLength()) {
134
- store.$update(ACTION_ITEMS_LENGTH_CHANGE, [data.length, shift]);
135
- }
135
+ store.$update(ACTION_ITEMS_LENGTH_CHANGE, data.length, shift);
136
136
  });
137
137
 
138
138
  $effect.pre(() => {
@@ -165,11 +165,11 @@
165
165
  export const getItemOffset =
166
166
  store.$getItemOffset satisfies VirtualizerHandle["getItemOffset"] as VirtualizerHandle["getItemOffset"];
167
167
  export const getItemSize =
168
- store.$getItemSize satisfies VirtualizerHandle["getItemSize"] as VirtualizerHandle["getItemSize"];
168
+ layout.$getItemSize satisfies VirtualizerHandle["getItemSize"] as VirtualizerHandle["getItemSize"];
169
169
  export const scrollToIndex: VirtualizerHandle["scrollToIndex"] = (
170
170
  index,
171
171
  opts,
172
- ) => _scrollToIndex(driver, store, index, opts);
172
+ ) => _scrollToIndex(driver, store, layout, index, opts);
173
173
  export const scrollTo: VirtualizerHandle["scrollTo"] = (offset) =>
174
174
  _scrollTo(driver, offset);
175
175
  export const scrollBy: VirtualizerHandle["scrollBy"] = (offset) =>
@@ -201,7 +201,7 @@
201
201
  {index}
202
202
  as={itemAs}
203
203
  offset={stateVersion && store.$getItemOffset(index)}
204
- hide={stateVersion && store.$isUnmeasuredItem(index)}
204
+ hide={stateVersion && layout.$isSizeEqual(index)}
205
205
  {horizontal}
206
206
  {isSSR}
207
207
  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;
@@ -40,7 +40,7 @@
40
40
 
41
41
  const layout = createListLayout(data.length, itemSize, cache);
42
42
  const store = createVirtualStore(layout, ssrCount);
43
- const driver = createWindowDriver(store, horizontal);
43
+ const driver = createWindowDriver(store, layout, horizontal);
44
44
  store.$subscribe(UPDATE_VIRTUAL_STATE, () => {
45
45
  stateVersion = store.$getStateVersion();
46
46
  });
@@ -99,9 +99,7 @@
99
99
  });
100
100
 
101
101
  $effect.pre(() => {
102
- if (data.length !== store.$getItemsLength()) {
103
- store.$update(ACTION_ITEMS_LENGTH_CHANGE, [data.length, shift]);
104
- }
102
+ store.$update(ACTION_ITEMS_LENGTH_CHANGE, data.length, shift);
105
103
  });
106
104
 
107
105
  let prevStateVersion: StateVersion | undefined;
@@ -124,11 +122,11 @@
124
122
  export const getItemOffset =
125
123
  store.$getItemOffset satisfies WindowVirtualizerHandle["getItemOffset"] as WindowVirtualizerHandle["getItemOffset"];
126
124
  export const getItemSize =
127
- store.$getItemSize satisfies WindowVirtualizerHandle["getItemSize"] as WindowVirtualizerHandle["getItemSize"];
125
+ layout.$getItemSize satisfies WindowVirtualizerHandle["getItemSize"] as WindowVirtualizerHandle["getItemSize"];
128
126
  export const scrollToIndex: WindowVirtualizerHandle["scrollToIndex"] = (
129
127
  index,
130
128
  opts,
131
- ) => _scrollToIndex(driver, store, index, opts);
129
+ ) => _scrollToIndex(driver, store, layout, index, opts);
132
130
 
133
131
  let containerStyle = $derived(
134
132
  styleToString({
@@ -156,7 +154,7 @@
156
154
  {index}
157
155
  as="div"
158
156
  offset={stateVersion && store.$getItemOffset(index)}
159
- hide={stateVersion && store.$isUnmeasuredItem(index)}
157
+ hide={stateVersion && layout.$isSizeEqual(index)}
160
158
  {horizontal}
161
159
  {isSSR}
162
160
  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;