virtua 0.46.7 → 0.47.1

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.
@@ -105,19 +105,18 @@ const getItemOffset = (cache, index) => {
105
105
  */
106
106
  const findIndex = (cache, offset, low = 0, high = cache._length - 1) => {
107
107
  // Find with binary search
108
+ let found = low;
108
109
  while (low <= high) {
109
110
  const mid = floor((low + high) / 2);
110
111
  if (getItemOffset(cache, mid) <= offset) {
111
- if (getItemOffset(cache, mid + 1) > offset) {
112
- return mid;
113
- }
112
+ found = mid;
114
113
  low = mid + 1;
115
114
  }
116
115
  else {
117
116
  high = mid - 1;
118
117
  }
119
118
  }
120
- return clamp(low, 0, cache._length - 1);
119
+ return clamp(found, 0, cache._length - 1);
121
120
  };
122
121
  /**
123
122
  * @internal
@@ -168,12 +167,12 @@ const estimateDefaultItemSize = (cache, startIndex) => {
168
167
  /**
169
168
  * @internal
170
169
  */
171
- const initCache = (length, itemSize, snapshot) => {
170
+ const initCache = (length, itemSize, sizes) => {
172
171
  return {
173
- _defaultItemSize: snapshot ? snapshot[1] : itemSize,
174
- _sizes: snapshot && snapshot[0]
172
+ _defaultItemSize: itemSize,
173
+ _sizes: sizes
175
174
  ? // https://github.com/inokawa/virtua/issues/441
176
- fill(snapshot[0].slice(0, min(length, snapshot[0].length)), max(0, length - snapshot[0].length))
175
+ fill(sizes.slice(0, min(length, sizes.length)), max(0, length - sizes.length))
177
176
  : fill([], length),
178
177
  _length: length,
179
178
  _computedOffsetIndex: -1,
@@ -306,7 +305,10 @@ const createVirtualStore = (elementsCount, itemSize = 40, ssrCount = 0, cacheSna
306
305
  let _frozenRange = NULL;
307
306
  let _prevRange = [0, isSSR ? max(ssrCount - 1, 0) : -1];
308
307
  let _totalMeasuredSize = 0;
309
- const cache = initCache(elementsCount, itemSize, cacheSnapshot);
308
+ let _isViewportMeasured = false;
309
+ const cache = initCache(elementsCount, cacheSnapshot
310
+ ? cacheSnapshot[1]
311
+ : itemSize, cacheSnapshot && cacheSnapshot[0]);
310
312
  const subscribers = new Set();
311
313
  const getRelativeScrollOffset = () => scrollOffset - startSpacerSize;
312
314
  const getVisibleOffset = () => getRelativeScrollOffset() + pendingJump + jump;
@@ -347,10 +349,10 @@ const createVirtualStore = (elementsCount, itemSize = 40, ssrCount = 0, cacheSna
347
349
  return takeCacheSnapshot(cache);
348
350
  },
349
351
  $getRange: (bufferSize = 200) => {
350
- if (!viewportSize || isSSR) {
351
- // Empty viewportSize means the first render.
352
- // We return range for SSR here, or return [0, -1] to render nothing, until the scroll offset and viewport size are determined.
352
+ if (!_isViewportMeasured || isSSR) {
353
+ // Return range for SSR, or return [0, -1] to render nothing, until the scroll offset and viewport size are determined.
353
354
  // https://github.com/inokawa/virtua/issues/415
355
+ // https://github.com/inokawa/virtua/pull/818
354
356
  return _prevRange;
355
357
  }
356
358
  let startIndex;
@@ -381,8 +383,7 @@ const createVirtualStore = (elementsCount, itemSize = 40, ssrCount = 0, cacheSna
381
383
  }
382
384
  return [max(startIndex, 0), min(endIndex, cache._length - 1)];
383
385
  },
384
- $findStartIndex: () => findIndex(cache, getVisibleOffset()),
385
- $findEndIndex: () => findIndex(cache, getVisibleOffset() + viewportSize),
386
+ $findItemIndex: (offset) => findIndex(cache, offset - startSpacerSize),
386
387
  $isUnmeasuredItem: isSizeEqual,
387
388
  $getItemOffset: getItemOffset$1,
388
389
  $getItemSize: getItemSize$1,
@@ -523,7 +524,7 @@ const createVirtualStore = (elementsCount, itemSize = 40, ssrCount = 0, cacheSna
523
524
  case ACTION_VIEWPORT_RESIZE: {
524
525
  if (viewportSize !== payload) {
525
526
  if (!viewportSize) {
526
- shouldSync = true;
527
+ _isViewportMeasured = shouldSync = true;
527
528
  }
528
529
  viewportSize = payload;
529
530
  mutated = UPDATE_VIRTUAL_STATE + UPDATE_SIZE_EVENT;
@@ -994,32 +995,44 @@ const createWindowScroller = (store, isHorizontal) => {
994
995
  * @internal
995
996
  */
996
997
  const createGridScroller = (rowStore, colStore) => {
997
- const vScroller = createScroller(rowStore, false);
998
- const hScroller = createScroller(colStore, true);
998
+ const rowScroller = createScroller(rowStore, false);
999
+ const colScroller = createScroller(colStore, true);
999
1000
  return {
1000
1001
  $observe(viewportElement) {
1001
- vScroller.$observe(viewportElement);
1002
- hScroller.$observe(viewportElement);
1002
+ rowScroller.$observe(viewportElement);
1003
+ colScroller.$observe(viewportElement);
1003
1004
  },
1004
1005
  $dispose() {
1005
- vScroller.$dispose();
1006
- hScroller.$dispose();
1006
+ rowScroller.$dispose();
1007
+ colScroller.$dispose();
1007
1008
  },
1008
- $scrollTo(offsetX, offsetY) {
1009
- vScroller.$scrollTo(offsetY);
1010
- hScroller.$scrollTo(offsetX);
1009
+ $scrollTo(row, col) {
1010
+ if (row != null) {
1011
+ rowScroller.$scrollTo(row);
1012
+ }
1013
+ if (col != null) {
1014
+ colScroller.$scrollTo(col);
1015
+ }
1011
1016
  },
1012
- $scrollBy(offsetX, offsetY) {
1013
- vScroller.$scrollBy(offsetY);
1014
- hScroller.$scrollBy(offsetX);
1017
+ $scrollBy(row, col) {
1018
+ if (row != null) {
1019
+ rowScroller.$scrollBy(row);
1020
+ }
1021
+ if (col != null) {
1022
+ colScroller.$scrollBy(col);
1023
+ }
1015
1024
  },
1016
- $scrollToIndex(indexX, indexY) {
1017
- vScroller.$scrollToIndex(indexY);
1018
- hScroller.$scrollToIndex(indexX);
1025
+ $scrollToIndex(row, col) {
1026
+ if (row != null) {
1027
+ rowScroller.$scrollToIndex(row);
1028
+ }
1029
+ if (col != null) {
1030
+ colScroller.$scrollToIndex(col);
1031
+ }
1019
1032
  },
1020
1033
  $fixScrollJump() {
1021
- vScroller.$fixScrollJump();
1022
- hScroller.$fixScrollJump();
1034
+ rowScroller.$fixScrollJump();
1035
+ colScroller.$fixScrollJump();
1023
1036
  },
1024
1037
  };
1025
1038
  };
@@ -1345,8 +1358,7 @@ const Virtualizer = (props) => {
1345
1358
  get viewportSize() {
1346
1359
  return store.$getViewportSize();
1347
1360
  },
1348
- findStartIndex: store.$findStartIndex,
1349
- findEndIndex: store.$findEndIndex,
1361
+ findItemIndex: store.$findItemIndex,
1350
1362
  getItemOffset: store.$getItemOffset,
1351
1363
  getItemSize: store.$getItemSize,
1352
1364
  scrollToIndex: scroller.$scrollToIndex,
@@ -1511,8 +1523,15 @@ const WindowVirtualizer = (props) => {
1511
1523
  get cache() {
1512
1524
  return store.$getCacheSnapshot();
1513
1525
  },
1514
- findStartIndex: store.$findStartIndex,
1515
- findEndIndex: store.$findEndIndex,
1526
+ get scrollOffset() {
1527
+ return store.$getScrollOffset();
1528
+ },
1529
+ get viewportSize() {
1530
+ return store.$getViewportSize();
1531
+ },
1532
+ findItemIndex: store.$findItemIndex,
1533
+ getItemOffset: store.$getItemOffset,
1534
+ getItemSize: store.$getItemSize,
1516
1535
  scrollToIndex: scroller.$scrollToIndex,
1517
1536
  });
1518
1537
  }