virtua 0.52.6 → 0.52.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.
@@ -60,8 +60,7 @@ var UPDATE_SCROLL_END_EVENT = 8;
60
60
  var getScrollSize = (store) => {
61
61
  return max(store.$getTotalSize(), store.$getViewportSize());
62
62
  };
63
- var createVirtualStore = ({ $getRange: getRange, $findIndex: findIndex, $getItemOffset: getOffset, $getItemSize: getItemSize, $setItemSize: setItemSize, $isSizeEqual: isSizeEqual, $getTotalSize: getTotalSize, $getLength: getLength, $setLength: setLength, $estimateDefaultSize: estimateDefaultSize }, ssrCount = 0) => {
64
- let shouldAutoEstimateItemSize = !!estimateDefaultSize;
63
+ var createVirtualStore = ({ $getRange: getRange, $findIndex: findIndex, $getItemOffset: getOffset, $getItemSize: getItemSize, $isSizeEqual: isSizeEqual, $getTotalSize: getTotalSize, $getLength: getLength, $setLength: setLength, $isEstimating: isEstimating, $resize: resize, $relayout: relayout }, ssrCount = 0) => {
65
64
  let isSSR = !!ssrCount;
66
65
  let stateVersion = 1;
67
66
  let viewportSize = 0;
@@ -74,7 +73,6 @@ var createVirtualStore = ({ $getRange: getRange, $findIndex: findIndex, $getItem
74
73
  let _scrollMode = SCROLL_BY_NATIVE;
75
74
  let _frozenRange = null;
76
75
  let _prevRange = [0, isSSR ? max(ssrCount - 1, 0) : -1];
77
- let _totalMeasuredSize = 0;
78
76
  let _isViewportMeasured = false;
79
77
  const subscribers = new Set();
80
78
  const getRelativeScrollOffset = () => scrollOffset - startSpacerSize;
@@ -82,6 +80,18 @@ var createVirtualStore = ({ $getRange: getRange, $findIndex: findIndex, $getItem
82
80
  const getItemOffset = (index) => {
83
81
  return getOffset(index) - pendingJump;
84
82
  };
83
+ const shouldKeep = (index) => {
84
+ if (_scrollMode === SCROLL_BY_SHIFT) {
85
+ return true;
86
+ }
87
+ if (_frozenRange && _scrollMode === SCROLL_BY_MANUAL_SCROLL) {
88
+ return index < _frozenRange[0];
89
+ }
90
+ const start = getRelativeScrollOffset();
91
+ const itemOffset = getItemOffset(index);
92
+ const itemSize = getItemSize(index);
93
+ return _scrollDirection !== SCROLL_DOWN && _scrollMode === SCROLL_BY_NATIVE ? itemOffset + itemSize <= start : itemOffset < start && itemOffset + itemSize < start + viewportSize;
94
+ };
85
95
  const applyJump = (j) => {
86
96
  if (j) {
87
97
  if (isIOSWebKit() && _scrollDirection !== SCROLL_IDLE || _frozenRange && _scrollMode === SCROLL_BY_MANUAL_SCROLL) {
@@ -107,7 +117,7 @@ var createVirtualStore = ({ $getRange: getRange, $findIndex: findIndex, $getItem
107
117
  } else {
108
118
  let startOffset = max(0, getVisibleOffset());
109
119
  let endOffset = startOffset + viewportSize;
110
- if (!shouldAutoEstimateItemSize) {
120
+ if (!isEstimating()) {
111
121
  bufferSize = max(0, bufferSize);
112
122
  if (_scrollDirection !== SCROLL_DOWN) {
113
123
  startOffset -= bufferSize;
@@ -191,34 +201,7 @@ var createVirtualStore = ({ $getRange: getRange, $findIndex: findIndex, $getItem
191
201
  if (!updated.length) {
192
202
  break;
193
203
  }
194
- applyJump(updated.reduce((acc, [index, size]) => {
195
- let shouldKeep;
196
- if (_scrollMode === SCROLL_BY_SHIFT) {
197
- shouldKeep = true;
198
- } else if (_frozenRange && _scrollMode === SCROLL_BY_MANUAL_SCROLL) {
199
- shouldKeep = index < _frozenRange[0];
200
- } else {
201
- const start = getRelativeScrollOffset();
202
- const itemOffset = getItemOffset(index);
203
- const itemSize = getItemSize(index);
204
- shouldKeep = _scrollDirection !== SCROLL_DOWN && _scrollMode === SCROLL_BY_NATIVE ? itemOffset + itemSize <= start : itemOffset < start && itemOffset + itemSize < start + viewportSize;
205
- }
206
- if (shouldKeep) {
207
- acc += size - getItemSize(index);
208
- }
209
- return acc;
210
- }, 0));
211
- for (const [index, size] of updated) {
212
- const prevSize = getItemSize(index);
213
- const isInitialMeasurement = setItemSize(index, size);
214
- if (shouldAutoEstimateItemSize) {
215
- _totalMeasuredSize += isInitialMeasurement ? size : size - prevSize;
216
- }
217
- }
218
- if (shouldAutoEstimateItemSize && viewportSize && _totalMeasuredSize > viewportSize) {
219
- applyJump(estimateDefaultSize(findIndex(getVisibleOffset())));
220
- shouldAutoEstimateItemSize = false;
221
- }
204
+ applyJump(resize(updated, shouldKeep, getVisibleOffset(), viewportSize));
222
205
  mutated = 1 + 2;
223
206
  shouldSync = true;
224
207
  break;
@@ -253,8 +236,11 @@ var createVirtualStore = ({ $getRange: getRange, $findIndex: findIndex, $getItem
253
236
  break;
254
237
  }
255
238
  case 9: {
256
- applyJump(payload);
257
- mutated = 1 + 2;
239
+ const relayoutJump = relayout(payload, getVisibleOffset());
240
+ if (relayoutJump != null) {
241
+ applyJump(relayoutJump);
242
+ mutated = 1 + 2;
243
+ }
258
244
  break;
259
245
  }
260
246
  case 8: {
@@ -283,6 +269,13 @@ var createVirtualStore = ({ $getRange: getRange, $findIndex: findIndex, $getItem
283
269
  //#endregion
284
270
  //#region src/core/cache.ts
285
271
  var UNCACHED = -1;
272
+ var fill = (array, length, prepend) => {
273
+ const key = prepend ? "unshift" : "push";
274
+ for (let i = 0; i < length; i++) {
275
+ array[key](-1);
276
+ }
277
+ return array;
278
+ };
286
279
  var findIndex = (getOffset, length, offset, low = 0, high = length - 1) => {
287
280
  let found = low;
288
281
  while (low <= high) {
@@ -299,16 +292,11 @@ var findIndex = (getOffset, length, offset, low = 0, high = length - 1) => {
299
292
 
300
293
  //#endregion
301
294
  //#region src/core/layouts/list.ts
302
- var fill = (array, length, prepend) => {
303
- const key = prepend ? "unshift" : "push";
304
- for (let i = 0; i < length; i++) {
305
- array[key](-1);
306
- }
307
- return array;
308
- };
309
295
  var createListLayout = (length, itemSize, snapshot) => {
310
296
  let defaultItemSize = snapshot && snapshot[1] || itemSize || 40;
311
297
  let computedOffsetIndex = -1;
298
+ let _totalMeasuredSize = 0;
299
+ let shouldAutoEstimateItemSize = !itemSize;
312
300
  let prevStartIndex = 0;
313
301
  const restoredSizes = snapshot && snapshot[0];
314
302
  const sizes = restoredSizes ? fill(restoredSizes.slice(0, min(length, restoredSizes.length)), max(0, length - restoredSizes.length)) : fill([], length);
@@ -353,13 +341,39 @@ var createListLayout = (length, itemSize, snapshot) => {
353
341
  $findIndex: (offset) => findIndex(getOffset, length, offset),
354
342
  $getItemOffset: getOffset,
355
343
  $getItemSize: getSize,
356
- $setItemSize: (index, size) => {
357
- const isInitialMeasurement = sizes[index] === -1;
358
- sizes[index] = size;
359
- computedOffsetIndex = min(index, computedOffsetIndex);
360
- return isInitialMeasurement;
361
- },
362
344
  $isSizeEqual: (index, size = -1) => sizes[index] === size,
345
+ $resize: (resizes, shouldKeep, scrollOffset, viewportSize) => {
346
+ let jump = resizes.reduce((acc, [index, size]) => shouldKeep(index) ? acc + (size - getSize(index)) : acc, 0);
347
+ for (const [index, size] of resizes) {
348
+ _totalMeasuredSize += sizes[index] === -1 ? size : size - getSize(index);
349
+ sizes[index] = size;
350
+ computedOffsetIndex = min(index, computedOffsetIndex);
351
+ }
352
+ if (shouldAutoEstimateItemSize && viewportSize && _totalMeasuredSize > viewportSize) {
353
+ let measuredCountBeforeStart = 0;
354
+ const startIndex = findIndex(getOffset, length, scrollOffset + jump);
355
+ const measuredSizes = [];
356
+ sizes.forEach((s, i) => {
357
+ if (s !== -1) {
358
+ if (s) {
359
+ measuredSizes.push(s);
360
+ }
361
+ if (i < startIndex) {
362
+ measuredCountBeforeStart++;
363
+ }
364
+ }
365
+ });
366
+ computedOffsetIndex = -1;
367
+ sort(measuredSizes);
368
+ const len = measuredSizes.length;
369
+ const mid = len / 2 | 0;
370
+ const median = len % 2 === 0 ? (measuredSizes[mid - 1] + measuredSizes[mid]) / 2 : measuredSizes[mid];
371
+ const prevDefaultItemSize = defaultItemSize;
372
+ jump += ((defaultItemSize = median) - prevDefaultItemSize) * max(startIndex - measuredCountBeforeStart, 0);
373
+ shouldAutoEstimateItemSize = false;
374
+ }
375
+ return jump;
376
+ },
363
377
  $getTotalSize: () => getOffset(length),
364
378
  $getLength: () => length,
365
379
  $setLength: (nextLength, isShift) => {
@@ -375,27 +389,7 @@ var createListLayout = (length, itemSize, snapshot) => {
375
389
  return (isShift ? sizes.splice(0, -diff) : sizes.splice(diff)).reduce((acc, removed) => acc - (removed === -1 ? defaultItemSize : removed), 0);
376
390
  }
377
391
  },
378
- $estimateDefaultSize: itemSize ? undefined : (startIndex) => {
379
- let measuredCountBeforeStart = 0;
380
- const measuredSizes = [];
381
- sizes.forEach((s, i) => {
382
- if (s !== -1) {
383
- if (s) {
384
- measuredSizes.push(s);
385
- }
386
- if (i < startIndex) {
387
- measuredCountBeforeStart++;
388
- }
389
- }
390
- });
391
- computedOffsetIndex = -1;
392
- sort(measuredSizes);
393
- const len = measuredSizes.length;
394
- const mid = len / 2 | 0;
395
- const median = len % 2 === 0 ? (measuredSizes[mid - 1] + measuredSizes[mid]) / 2 : measuredSizes[mid];
396
- const prevDefaultItemSize = defaultItemSize;
397
- return ((defaultItemSize = median) - prevDefaultItemSize) * max(startIndex - measuredCountBeforeStart, 0);
398
- },
392
+ $isEstimating: () => shouldAutoEstimateItemSize,
399
393
  $snapshot: () => [sizes.slice(), defaultItemSize]
400
394
  };
401
395
  };
@@ -405,88 +399,151 @@ var createListLayout = (length, itemSize, snapshot) => {
405
399
  var getAxisLength = (axis) => typeof axis === "number" ? axis : axis.length;
406
400
  var getAxisItem = (axis, index) => typeof axis === "number" ? index : axis[index];
407
401
  var createGridLayout = (axis, size, gap = 0) => {
402
+ let length = getAxisLength(axis);
403
+ const isUniform = typeof size === "number";
404
+ const isAuto = size === "auto";
405
+ let defaultItemSize = (isUniform ? size : 40) + gap;
406
+ let computedOffsetIndex = -1;
407
+ let _totalMeasuredSize = 0;
408
+ let shouldAutoEstimateItemSize = isAuto;
408
409
  let header = 0;
409
410
  let footer = 0;
410
- const setPinned = (nextHeader = 0, nextFooter = 0) => {
411
- header = nextHeader;
412
- footer = nextFooter;
411
+ let currentSizes = null;
412
+ const sizes = [];
413
+ const offsets = [];
414
+ const autos = [];
415
+ const isMeasurable = (index) => isAuto || !!autos[index];
416
+ const materialize = () => {
417
+ if (!sizes.length) {
418
+ fill(sizes, length);
419
+ }
413
420
  };
414
- const getPinnedStart = (length) => min(header, length);
415
- const getTrailStart = (length) => max(length - footer, getPinnedStart(length));
416
- const pinRange = (getRange, getOffset, length, startOffset, endOffset) => {
417
- const insetStart = getOffset(getPinnedStart(length));
418
- const insetEnd = getOffset(length) - getOffset(getTrailStart(length));
419
- const start = startOffset + (insetStart ? insetStart - gap : 0);
420
- return getRange(start, max(start, endOffset - (insetEnd ? insetEnd - gap : 0)));
421
+ const getSize = (index) => {
422
+ const size = sizes[index];
423
+ return size === -1 ? defaultItemSize : size;
421
424
  };
422
- if (typeof size === "number") {
423
- let length = getAxisLength(axis);
424
- let itemSize = size;
425
- const findIndex = (offset) => itemSize + gap ? clamp(floor(offset / (itemSize + gap)), 0, length - 1) : 0;
426
- const getItemOffset = (index) => index * (itemSize + gap);
427
- const findRange = (startOffset, endOffset) => [findIndex(startOffset), findIndex(endOffset)];
428
- const layout = {
429
- $getRange: (startOffset, endOffset) => pinRange(findRange, getItemOffset, length, startOffset, endOffset),
430
- $findIndex: findIndex,
431
- $getItemOffset: getItemOffset,
432
- $getItemSize: () => itemSize,
433
- $setItemSize: () => false,
434
- $isSizeEqual: () => false,
435
- $getTotalSize: () => length ? length * (itemSize + gap) - gap : 0,
436
- $getLength: () => length,
437
- $setLength: (nextLength) => {
438
- length = nextLength;
439
- return 0;
440
- },
441
- $isMeasurable: () => false,
442
- $setPinned: setPinned,
443
- $getPinnedStart: () => getPinnedStart(length),
444
- $getTrailStart: () => getTrailStart(length),
445
- $getSizes: (_axis, nextSize) => typeof nextSize === "number" ? nextSize : null,
446
- $setAxis: (nextSize, scrollOffset) => {
447
- if (nextSize == null || nextSize === itemSize) {
448
- return;
425
+ const getOffset = (index) => {
426
+ if (!length) return 0;
427
+ if (!sizes.length) {
428
+ return index * defaultItemSize;
429
+ }
430
+ if (computedOffsetIndex >= index) {
431
+ return offsets[index];
432
+ }
433
+ if (computedOffsetIndex < 0) {
434
+ offsets[0] = 0;
435
+ computedOffsetIndex = 0;
436
+ }
437
+ let i = computedOffsetIndex;
438
+ let top = offsets[i];
439
+ while (i < index) {
440
+ top += getSize(i);
441
+ offsets[++i] = top;
442
+ }
443
+ computedOffsetIndex = index;
444
+ return top;
445
+ };
446
+ const setSize = (index, size) => {
447
+ sizes[index] = size;
448
+ computedOffsetIndex = min(index, computedOffsetIndex);
449
+ };
450
+ const find = (offset) => sizes.length ? findIndex(getOffset, length, offset) : defaultItemSize ? clamp(floor(offset / defaultItemSize), 0, length - 1) : 0;
451
+ const getPinnedStart = () => min(header, length);
452
+ const getTrailStart = () => max(length - footer, getPinnedStart());
453
+ const getItemSize = (index) => (sizes.length ? getSize(index) : defaultItemSize) - gap;
454
+ return {
455
+ $getRange: (startOffset, endOffset) => {
456
+ const insetStart = getOffset(getPinnedStart());
457
+ const insetEnd = getOffset(length) - getOffset(getTrailStart());
458
+ const start = startOffset + (insetStart ? insetStart - gap : 0);
459
+ return [find(start), find(max(start, endOffset - (insetEnd ? insetEnd - gap : 0)))];
460
+ },
461
+ $findIndex: find,
462
+ $getItemOffset: getOffset,
463
+ $getItemSize: getItemSize,
464
+ $resize: (resizes, shouldKeep, scrollOffset, viewportSize) => {
465
+ let jump = resizes.reduce((acc, [index, size]) => isMeasurable(index) && shouldKeep(index) ? acc + (size - getItemSize(index)) : acc, 0);
466
+ for (const [index, size] of resizes) {
467
+ if (isMeasurable(index)) {
468
+ materialize();
469
+ _totalMeasuredSize += sizes[index] === -1 ? size : size - getItemSize(index);
470
+ setSize(index, size + gap);
449
471
  }
450
- const jump = findIndex(scrollOffset) * (nextSize - itemSize);
451
- itemSize = nextSize;
452
- return jump;
453
472
  }
454
- };
455
- return layout;
456
- }
457
- const isAuto = size === "auto";
458
- let currentSizes = null;
459
- const autos = [];
460
- const inner = createListLayout(getAxisLength(axis), undefined, [[], 40 + gap]);
461
- const isMeasurable = (index) => isAuto || !!autos[index];
462
- const layout = {
463
- $getRange: (startOffset, endOffset) => pinRange(inner.$getRange, inner.$getItemOffset, inner.$getLength(), startOffset, endOffset),
464
- $findIndex: inner.$findIndex,
465
- $getItemOffset: inner.$getItemOffset,
466
- $getItemSize: (index) => inner.$getItemSize(index) - gap,
467
- $setItemSize: (index, s) => isMeasurable(index) && inner.$setItemSize(index, s + gap),
468
- $isSizeEqual: (index, s) => inner.$isSizeEqual(index, s + gap),
469
- $getTotalSize: () => inner.$getLength() ? inner.$getTotalSize() - gap : 0,
470
- $getLength: inner.$getLength,
471
- $setLength: inner.$setLength,
472
- $estimateDefaultSize: isAuto ? inner.$estimateDefaultSize : undefined,
473
+ if (shouldAutoEstimateItemSize && viewportSize && _totalMeasuredSize > viewportSize) {
474
+ let measuredCountBeforeStart = 0;
475
+ const startIndex = find(scrollOffset + jump);
476
+ const measuredSizes = [];
477
+ sizes.forEach((s, i) => {
478
+ if (s !== -1) {
479
+ if (s) {
480
+ measuredSizes.push(s);
481
+ }
482
+ if (i < startIndex) {
483
+ measuredCountBeforeStart++;
484
+ }
485
+ }
486
+ });
487
+ computedOffsetIndex = -1;
488
+ sort(measuredSizes);
489
+ const len = measuredSizes.length;
490
+ const mid = len / 2 | 0;
491
+ const median = len % 2 === 0 ? (measuredSizes[mid - 1] + measuredSizes[mid]) / 2 : measuredSizes[mid];
492
+ const prevDefaultItemSize = defaultItemSize;
493
+ jump += ((defaultItemSize = median) - prevDefaultItemSize) * max(startIndex - measuredCountBeforeStart, 0);
494
+ shouldAutoEstimateItemSize = false;
495
+ }
496
+ return jump;
497
+ },
498
+ $isSizeEqual: (index, size = -1) => {
499
+ const cachedSize = sizes.length ? sizes[index] : -1;
500
+ return size === -1 ? isMeasurable(index) && cachedSize === -1 : cachedSize === size + gap;
501
+ },
502
+ $getTotalSize: () => length ? getOffset(length) - gap : 0,
503
+ $getLength: () => length,
504
+ $setLength: (nextLength) => {
505
+ const diff = nextLength - length;
506
+ computedOffsetIndex = min(nextLength - 1, computedOffsetIndex);
507
+ length = nextLength;
508
+ if (sizes.length) {
509
+ if (diff > 0) {
510
+ fill(sizes, diff);
511
+ } else {
512
+ sizes.splice(diff);
513
+ }
514
+ }
515
+ return 0;
516
+ },
517
+ $isEstimating: () => shouldAutoEstimateItemSize,
473
518
  $isMeasurable: isMeasurable,
474
- $setPinned: setPinned,
475
- $getPinnedStart: () => getPinnedStart(inner.$getLength()),
476
- $getTrailStart: () => getTrailStart(inner.$getLength()),
477
- $getSizes: (nextAxis, nextSize) => isAuto || typeof nextSize !== "string" || nextSize === "auto" ? null : nextAxis.map((item) => item != null ? item[nextSize] : null),
478
- $setAxis: (nextSizes, scrollOffset) => {
479
- if (!nextSizes) {
519
+ $setPinned: (nextHeader = 0, nextFooter = 0) => {
520
+ header = nextHeader;
521
+ footer = nextFooter;
522
+ },
523
+ $getPinnedStart: getPinnedStart,
524
+ $getTrailStart: getTrailStart,
525
+ $getSizes: (nextAxis, nextSize) => typeof nextSize === "number" ? isUniform ? nextSize : null : isUniform || isAuto || nextSize === "auto" ? null : nextAxis.map((item) => item != null ? item[nextSize] : null),
526
+ $relayout: (nextSizes, scrollOffset) => {
527
+ if (nextSizes == null) {
480
528
  return;
481
529
  }
482
- const length = inner.$getLength();
530
+ if (typeof nextSizes === "number") {
531
+ const nextDefaultItemSize = nextSizes + gap;
532
+ if (nextDefaultItemSize === defaultItemSize) {
533
+ return;
534
+ }
535
+ const jump = find(scrollOffset) * (nextDefaultItemSize - defaultItemSize);
536
+ defaultItemSize = nextDefaultItemSize;
537
+ return jump;
538
+ }
483
539
  if (nextSizes === currentSizes && length === autos.length) {
484
540
  return;
485
541
  }
486
542
  currentSizes = nextSizes;
487
543
  autos.length = length;
488
- const anchorIndex = inner.$findIndex(scrollOffset);
489
- const prevOffset = inner.$getItemOffset(anchorIndex);
544
+ materialize();
545
+ const anchorIndex = find(scrollOffset);
546
+ const prevOffset = getOffset(anchorIndex);
490
547
  let changed;
491
548
  for (let i = 0; i < length; i++) {
492
549
  const itemSize = nextSizes[i];
@@ -494,8 +551,8 @@ var createGridLayout = (axis, size, gap = 0) => {
494
551
  if (!isAutoItem || !autos[i]) {
495
552
  autos[i] = isAutoItem;
496
553
  const target = isAutoItem ? -1 : itemSize + gap;
497
- if (!inner.$isSizeEqual(i, target)) {
498
- inner.$setItemSize(i, target);
554
+ if (sizes[i] !== target) {
555
+ setSize(i, target);
499
556
  changed = true;
500
557
  }
501
558
  }
@@ -503,25 +560,13 @@ var createGridLayout = (axis, size, gap = 0) => {
503
560
  if (!changed) {
504
561
  return;
505
562
  }
506
- return inner.$getItemOffset(anchorIndex) - prevOffset;
563
+ return getOffset(anchorIndex) - prevOffset;
507
564
  }
508
565
  };
509
- return layout;
510
566
  };
511
567
 
512
568
  //#endregion
513
569
  //#region src/core/grid.ts
514
- var updateGridAxis = (store, layout, axis, sizes, header, footer) => {
515
- const length = getAxisLength(axis);
516
- layout.$setPinned(header, footer);
517
- if (length !== store.$getItemsLength()) {
518
- store.$update(5, [length]);
519
- }
520
- const jump = layout.$setAxis(sizes, store.$getScrollOffset() - store.$getItemOffset(0));
521
- if (jump != null) {
522
- store.$update(9, jump);
523
- }
524
- };
525
570
  var rowStatesCache = /*#__PURE__*/ new WeakMap();
526
571
  var createGridSpanIndex = (spans = EMPTY) => {
527
572
  const index = new Map();
@@ -957,9 +1002,11 @@ var createScrollObserver = (store, viewport, scroller, isHorizontal, isRtl, onMo
957
1002
  onMomentumJump();
958
1003
  }
959
1004
  stillMomentumScrolling = false;
960
- const target = store.$getScrollOffset() + jump;
961
- if (target <= 0 || target >= store.$getStartSpacerSize() + store.$getTotalSize() - store.$getViewportSize()) {
962
- scrollTo(target);
1005
+ const from = store.$getScrollOffset();
1006
+ const to = from + jump;
1007
+ const end = store.$getStartSpacerSize() + store.$getTotalSize() - store.$getViewportSize();
1008
+ if (to <= 0 || to >= end || from >= end) {
1009
+ scrollTo(to);
963
1010
  } else {
964
1011
  scroller.scrollBy({
965
1012
  [scrollToKey]: normalizeScrollOffset(jump),
@@ -1756,10 +1803,18 @@ var VGrid = (props) => {
1756
1803
  rowStore.$subscribe(8, notifyScrollEnd);
1757
1804
  colStore.$subscribe(8, notifyScrollEnd);
1758
1805
  createComputed(() => {
1759
- updateGridAxis(rowStore, rowLayout, props.rows, rowSizes(), props.headerRows, props.footerRows);
1760
- });
1761
- createComputed(() => {
1762
- updateGridAxis(colStore, colLayout, props.cols, colSizes(), props.headerCols, props.footerCols);
1806
+ rowLayout.$setPinned(props.headerRows, props.footerRows);
1807
+ colLayout.$setPinned(props.headerCols, props.footerCols);
1808
+ const rowLength = getAxisLength(props.rows);
1809
+ const colLength = getAxisLength(props.cols);
1810
+ if (rowLength !== rowStore.$getItemsLength()) {
1811
+ rowStore.$update(5, [rowLength]);
1812
+ }
1813
+ if (colLength !== colStore.$getItemsLength()) {
1814
+ colStore.$update(5, [colLength]);
1815
+ }
1816
+ rowStore.$update(9, rowSizes());
1817
+ colStore.$update(9, colSizes());
1763
1818
  });
1764
1819
  const rowCount = createMemo(() => stateVersion() && rowStore.$getItemsLength());
1765
1820
  const colCount = createMemo(() => stateVersion() && colStore.$getItemsLength());