virtua 0.50.6 → 0.51.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.
Files changed (39) hide show
  1. package/README.md +10 -5
  2. package/lib/angular/Virtualizer.d.ts +2 -2
  3. package/lib/angular/WindowVirtualizer.d.ts +2 -2
  4. package/lib/angular/index.js +245 -270
  5. package/lib/angular/index.js.map +1 -1
  6. package/lib/core/index.cjs +261 -298
  7. package/lib/core/index.cjs.map +1 -1
  8. package/lib/core/index.js +276 -313
  9. package/lib/core/index.js.map +1 -1
  10. package/lib/index.cjs +460 -497
  11. package/lib/index.cjs.map +1 -1
  12. package/lib/index.js +461 -498
  13. package/lib/index.js.map +1 -1
  14. package/lib/react/VGrid.d.ts +3 -3
  15. package/lib/react/Virtualizer.d.ts +2 -2
  16. package/lib/react/WindowVirtualizer.d.ts +2 -2
  17. package/lib/solid/Virtualizer.d.ts +2 -2
  18. package/lib/solid/WindowVirtualizer.d.ts +2 -2
  19. package/lib/solid/index.cjs +262 -289
  20. package/lib/solid/index.cjs.map +1 -1
  21. package/lib/solid/index.js +273 -298
  22. package/lib/solid/index.js.map +1 -1
  23. package/lib/solid/index.jsx +160 -220
  24. package/lib/solid/index.jsx.map +1 -1
  25. package/lib/svelte/ListItem.svelte +1 -1
  26. package/lib/svelte/Virtualizer.svelte +12 -4
  27. package/lib/svelte/Virtualizer.type.d.ts +2 -2
  28. package/lib/svelte/WindowVirtualizer.svelte +12 -4
  29. package/lib/svelte/WindowVirtualizer.type.d.ts +2 -2
  30. package/lib/svelte/utils.d.ts +2 -0
  31. package/lib/svelte/utils.js +4 -1
  32. package/lib/svelte/utils.js.map +1 -1
  33. package/lib/vue/Virtualizer.d.ts +2 -2
  34. package/lib/vue/WindowVirtualizer.d.ts +2 -2
  35. package/lib/vue/index.cjs +365 -415
  36. package/lib/vue/index.cjs.map +1 -1
  37. package/lib/vue/index.js +316 -365
  38. package/lib/vue/index.js.map +1 -1
  39. package/package.json +3 -4
@@ -20,32 +20,19 @@ var createPromise = () => {
20
20
  });
21
21
  return [promise, resolve];
22
22
  };
23
- var once = (fn) => {
24
- let cache;
25
- return () => {
26
- if (fn) {
27
- cache = fn();
28
- fn = undefined;
29
- }
30
- return cache;
31
- };
32
- };
33
23
 
34
24
  //#endregion
35
25
  //#region src/core/environment.ts
36
26
  var isBrowser = typeof window !== "undefined";
37
- var getDocumentElement = (doc) => doc.documentElement;
38
27
  var getCurrentDocument = (node) => node.ownerDocument;
39
28
  var getCurrentWindow = (doc) => doc.defaultView;
40
- var isIOSWebKit = /*#__PURE__*/ once(() => {
41
- if (/iP(hone|od|ad)/.test(navigator.userAgent)) {
42
- return true;
29
+ var isIOS;
30
+ var isIOSWebKit = () => {
31
+ if (isIOS == null) {
32
+ isIOS = /iP(hone|od|ad)/.test(navigator.userAgent) || navigator.platform === "MacIntel" && navigator.maxTouchPoints > 0;
43
33
  }
44
- return navigator.platform === "MacIntel" && navigator.maxTouchPoints > 0;
45
- });
46
- var isSmoothScrollSupported = /*#__PURE__*/ once(() => {
47
- return "scrollBehavior" in getDocumentElement(document).style;
48
- });
34
+ return isIOS;
35
+ };
49
36
 
50
37
  //#endregion
51
38
  //#region src/core/store.ts
@@ -90,12 +77,8 @@ var createVirtualStore = ({ $getRange: getRange, $findIndex: findIndex, $getItem
90
77
  const subscribers = new Set();
91
78
  const getRelativeScrollOffset = () => scrollOffset - startSpacerSize;
92
79
  const getVisibleOffset = () => getRelativeScrollOffset() + pendingJump + jump;
93
- const getItemOffset = (index, fromEnd) => {
94
- const offset = getOffset(index) - pendingJump;
95
- if (fromEnd) {
96
- return getTotalSize() - offset - getItemSize(index);
97
- }
98
- return offset;
80
+ const getItemOffset = (index) => {
81
+ return getOffset(index) - pendingJump;
99
82
  };
100
83
  const applyJump = (j) => {
101
84
  if (j) {
@@ -426,17 +409,27 @@ var createResizeObserver = (cb) => {
426
409
  }
427
410
  };
428
411
  };
429
- var normalizeScrollOffset = (offset, isNegative) => {
430
- return isNegative ? -offset : offset;
431
- };
432
- var createScrollObserver = (store, viewport, isHorizontal, getScrollOffset, updateScrollOffset, getStartOffset) => {
412
+ var createScrollObserver = (store, viewport, scroller, isHorizontal, isRtl, onMomentumJump, getStartOffset) => {
433
413
  let lastScrollTime = 0;
434
414
  let wheeling = false;
435
415
  let touching = false;
436
416
  let justTouchEnded = false;
437
417
  let stillMomentumScrolling = false;
418
+ let cancelScroll;
438
419
  let scrollEndTimer;
439
420
  const now = Date.now;
421
+ const scrollOffsetKey = isHorizontal ? "scrollLeft" : "scrollTop";
422
+ const scrollToKey = isHorizontal ? "left" : "top";
423
+ const normalizeScrollOffset = (offset) => {
424
+ return isRtl ? -offset : offset;
425
+ };
426
+ const getScrollOffset = () => normalizeScrollOffset(scroller[scrollOffsetKey]);
427
+ const scrollTo = (offset, smooth) => {
428
+ scroller.scrollTo({
429
+ [scrollToKey]: normalizeScrollOffset(offset),
430
+ behavior: smooth ? "smooth" : "instant"
431
+ });
432
+ };
440
433
  const onScrollEnd = () => {
441
434
  if (wheeling || touching) {
442
435
  wheeling = false;
@@ -495,99 +488,90 @@ var createScrollObserver = (store, viewport, isHorizontal, getScrollOffset, upda
495
488
  _fixScrollJump: () => {
496
489
  const [jump, shift] = store._flushJump();
497
490
  if (!jump) return;
498
- updateScrollOffset(jump, shift, stillMomentumScrolling);
491
+ if (stillMomentumScrolling && onMomentumJump) {
492
+ onMomentumJump();
493
+ }
499
494
  stillMomentumScrolling = false;
500
- if (shift && store.$getViewportSize() > store.$getTotalSize()) {
501
- store.$update(1, getScrollOffset());
495
+ const target = store.$getScrollOffset() + jump;
496
+ if (target <= 0 || target >= store.$getStartSpacerSize() + store.$getTotalSize() - store.$getViewportSize()) {
497
+ scrollTo(target);
498
+ } else {
499
+ scroller.scrollBy({
500
+ [scrollToKey]: normalizeScrollOffset(jump),
501
+ behavior: "instant"
502
+ });
502
503
  }
503
- }
504
- };
505
- };
506
-
507
- //#endregion
508
- //#region src/core/driver.ts
509
- var createScrollScheduler = (store, initialized, scroll) => {
510
- let cancelScroll;
511
- return [async (getTargetOffset, smooth) => {
512
- if (!await initialized()) {
513
- return;
514
- }
515
- if (cancelScroll) {
516
- cancelScroll();
517
- }
518
- let stopped;
519
- let timerId;
520
- let unsubscribe;
521
- const isSmooth = smooth && isSmoothScrollSupported();
522
- const stop = cancelScroll = () => {
523
- stopped = true;
524
- cancelTimeout(timerId);
525
- unsubscribe && unsubscribe();
526
- };
527
- const onMeasured = () => {
528
- if (stopped) {
529
- return;
504
+ if (shift) {
505
+ cancelScroll && cancelScroll();
506
+ if (store.$getViewportSize() > store.$getTotalSize()) {
507
+ store.$update(1, getScrollOffset());
508
+ }
530
509
  }
531
- if (store.$getViewportSize()) {
532
- cancelTimeout(timerId);
533
- timerId = timeout(stop, 150);
510
+ },
511
+ _scroll: (getTargetOffset, smooth) => {
512
+ if (cancelScroll) {
513
+ cancelScroll();
534
514
  }
535
- if (isSmooth) {
536
- for (let [i, end] = store.$getRange(0); i <= end; i++) {
537
- if (store.$isUnmeasuredItem(i)) {
538
- return;
515
+ let stopped;
516
+ let timerId;
517
+ let unsubscribe;
518
+ const stop = cancelScroll = () => {
519
+ stopped = true;
520
+ cancelTimeout(timerId);
521
+ unsubscribe && unsubscribe();
522
+ };
523
+ const onMeasured = () => {
524
+ if (stopped) {
525
+ return;
526
+ }
527
+ if (store.$getViewportSize()) {
528
+ cancelTimeout(timerId);
529
+ timerId = timeout(stop, 150);
530
+ }
531
+ if (smooth) {
532
+ for (let [i, end] = store.$getRange(0); i <= end; i++) {
533
+ if (store.$isUnmeasuredItem(i)) {
534
+ return;
535
+ }
539
536
  }
537
+ stop();
540
538
  }
541
- stop();
542
- }
543
- store.$update(7);
544
- scroll(getTargetOffset(), isSmooth);
545
- };
546
- const start = () => {
547
- if (stopped) {
548
- return;
549
- }
550
- let queued;
551
- unsubscribe = store.$subscribe(2, () => {
552
- if (queued) {
539
+ store.$update(7);
540
+ scrollTo(getTargetOffset(), smooth);
541
+ };
542
+ const start = () => {
543
+ if (stopped) {
553
544
  return;
554
545
  }
555
- queued = true;
556
- microtask(() => {
557
- queued = false;
558
- onMeasured();
546
+ let queued;
547
+ unsubscribe = store.$subscribe(2, () => {
548
+ if (queued) {
549
+ return;
550
+ }
551
+ queued = true;
552
+ microtask(() => {
553
+ queued = false;
554
+ onMeasured();
555
+ });
559
556
  });
560
- });
561
- onMeasured();
562
- };
563
- if (isSmooth) {
564
- store.$update(8, getTargetOffset());
565
- microtask(start);
566
- } else {
567
- start();
557
+ onMeasured();
558
+ };
559
+ if (smooth) {
560
+ store.$update(8, getTargetOffset());
561
+ microtask(start);
562
+ } else {
563
+ start();
564
+ }
568
565
  }
569
- }, () => {
570
- cancelScroll && cancelScroll();
571
- }];
566
+ };
572
567
  };
568
+
569
+ //#endregion
570
+ //#region src/core/driver.ts
573
571
  var createContainerDriver = (store, isHorizontal) => {
574
572
  let viewportElement;
575
573
  let scrollObserver;
576
574
  let initialized = createPromise();
577
- let isNegative = false;
578
- const scrollOffsetKey = isHorizontal ? "scrollLeft" : "scrollTop";
579
- const overflowKey = isHorizontal ? "overflowX" : "overflowY";
580
- const [scheduleScroll, cancelScroll] = createScrollScheduler(store, () => initialized[0], (offset, smooth) => {
581
- offset = normalizeScrollOffset(offset, isNegative);
582
- if (smooth) {
583
- viewportElement.scrollTo({
584
- [isHorizontal ? "left" : "top"]: offset,
585
- behavior: "smooth"
586
- });
587
- } else {
588
- viewportElement[scrollOffsetKey] = offset;
589
- }
590
- });
591
575
  const sizeKey = isHorizontal ? "width" : "height";
592
576
  const mountedIndexes = new WeakMap();
593
577
  const resizeObserver = createResizeObserver((entries) => {
@@ -610,22 +594,14 @@ var createContainerDriver = (store, isHorizontal) => {
610
594
  return {
611
595
  $observe(containerElement, viewport = containerElement.parentElement) {
612
596
  resizeObserver._observe(viewportElement = viewport);
613
- if (isHorizontal) {
614
- isNegative = getComputedStyle(viewport).direction === "rtl";
615
- }
616
- scrollObserver = createScrollObserver(store, viewport, isHorizontal, () => normalizeScrollOffset(viewport[scrollOffsetKey], isNegative), (jump, shift, isMomentumScrolling) => {
617
- if (isMomentumScrolling) {
618
- const style = viewport.style;
619
- const prev = style[overflowKey];
620
- style[overflowKey] = "hidden";
621
- timeout(() => {
622
- style[overflowKey] = prev;
623
- });
624
- }
625
- viewport[scrollOffsetKey] = normalizeScrollOffset(store.$getScrollOffset() + jump, isNegative);
626
- if (shift) {
627
- cancelScroll();
628
- }
597
+ scrollObserver = createScrollObserver(store, viewport, viewport, isHorizontal, isHorizontal && getComputedStyle(viewport).direction === "rtl", () => {
598
+ const overflowKey = isHorizontal ? "overflowX" : "overflowY";
599
+ const style = viewport.style;
600
+ const prev = style[overflowKey];
601
+ style[overflowKey] = "hidden";
602
+ timeout(() => {
603
+ style[overflowKey] = prev;
604
+ });
629
605
  });
630
606
  initialized[1](true);
631
607
  },
@@ -643,39 +619,33 @@ var createContainerDriver = (store, isHorizontal) => {
643
619
  resizeObserver._unobserve(el);
644
620
  };
645
621
  },
646
- $isNegative: () => isNegative,
647
- $scroll: scheduleScroll,
622
+ async $scroll(getTargetOffset, smooth) {
623
+ if (await initialized[0]) {
624
+ scrollObserver._scroll(getTargetOffset, smooth);
625
+ }
626
+ },
648
627
  $effect() {
649
628
  scrollObserver && scrollObserver._fixScrollJump();
650
629
  },
651
- $getBaseOffset: store.$getStartSpacerSize,
652
- $getScrollbarSize: () => 0
630
+ $getBaseOffset: store.$getStartSpacerSize
653
631
  };
654
632
  };
655
633
  var createWindowDriver = (store, isHorizontal) => {
656
- let containerElement;
634
+ let viewportElement;
657
635
  let scrollObserver;
658
636
  let cleanupOnWindowResize;
637
+ let getBaseOffset;
638
+ let onViewportResize;
659
639
  let initialized = createPromise();
660
- let isNegative = false;
661
- const scrollToKey = isHorizontal ? "left" : "top";
662
- const [scheduleScroll] = createScrollScheduler(store, () => initialized[0], (offset, smooth) => {
663
- offset = normalizeScrollOffset(offset, isNegative);
664
- const window = getCurrentWindow(getCurrentDocument(containerElement));
665
- if (smooth) {
666
- window.scroll({
667
- [scrollToKey]: offset,
668
- behavior: "smooth"
669
- });
670
- } else {
671
- window.scroll({ [scrollToKey]: offset });
672
- }
673
- });
674
640
  const sizeKey = isHorizontal ? "width" : "height";
675
641
  const mountedIndexes = new WeakMap();
676
642
  const resizeObserver = createResizeObserver((entries) => {
677
643
  const resizes = [];
678
644
  for (const { target, contentRect } of entries) {
645
+ if (target === viewportElement) {
646
+ onViewportResize && onViewportResize();
647
+ continue;
648
+ }
679
649
  if (!target.offsetParent) continue;
680
650
  const index = mountedIndexes.get(target);
681
651
  if (index != null) {
@@ -686,46 +656,40 @@ var createWindowDriver = (store, isHorizontal) => {
686
656
  store.$update(3, resizes);
687
657
  }
688
658
  });
689
- const calcOffsetToViewport = (node, viewport, window, isHorizontal, offset = 0) => {
690
- const offsetKey = isHorizontal ? "offsetLeft" : "offsetTop";
691
- const offsetSum = offset + (isHorizontal && isNegative ? window.innerWidth - node[offsetKey] - node.offsetWidth : node[offsetKey]);
692
- const parent = node.offsetParent;
693
- if (node === viewport || !parent) {
694
- return offsetSum;
695
- }
696
- return calcOffsetToViewport(parent, viewport, window, isHorizontal, offsetSum);
697
- };
698
659
  return {
699
660
  $observe(container) {
700
- containerElement = container;
701
- const scrollOffsetKey = isHorizontal ? "scrollX" : "scrollY";
702
661
  const document = getCurrentDocument(container);
703
662
  const window = getCurrentWindow(document);
704
- const onWindowResize = () => {
705
- store.$update(4, window[isHorizontal ? "innerWidth" : "innerHeight"]);
663
+ const viewport = viewportElement = document.scrollingElement;
664
+ const isRtl = isHorizontal && getComputedStyle(viewport).direction === "rtl";
665
+ const calcOffsetToViewport = (node, viewport, until, isHorizontal, offset = 0) => {
666
+ const offsetKey = isHorizontal ? "offsetLeft" : "offsetTop";
667
+ const offsetSum = offset + (isRtl ? viewport.clientWidth - node[offsetKey] - node.offsetWidth : node[offsetKey]);
668
+ const parent = node.offsetParent;
669
+ if (node === until || !parent) {
670
+ return offsetSum;
671
+ }
672
+ return calcOffsetToViewport(parent, viewport, until, isHorizontal, offsetSum);
673
+ };
674
+ const baseOffset = getBaseOffset = () => {
675
+ return calcOffsetToViewport(container, viewport, document.body, isHorizontal);
676
+ };
677
+ const onWindowResize = onViewportResize = () => {
678
+ store.$update(4, viewport[isHorizontal ? "clientWidth" : "clientHeight"]);
706
679
  };
707
680
  window.addEventListener("resize", onWindowResize);
708
- microtask(onWindowResize);
681
+ resizeObserver._observe(viewport);
709
682
  cleanupOnWindowResize = () => {
710
683
  window.removeEventListener("resize", onWindowResize);
711
684
  };
712
- if (isHorizontal) {
713
- isNegative = getComputedStyle(getDocumentElement(document)).direction === "rtl";
714
- }
715
- scrollObserver = createScrollObserver(store, window, isHorizontal, () => normalizeScrollOffset(window[scrollOffsetKey], isNegative), (jump, shift) => {
716
- if (shift) {
717
- window.scroll({ [scrollToKey]: normalizeScrollOffset(store.$getScrollOffset() + jump, isNegative) });
718
- } else {
719
- window.scrollBy({ [scrollToKey]: normalizeScrollOffset(jump, isNegative) });
720
- }
721
- }, () => calcOffsetToViewport(container, document.body, window, isHorizontal));
685
+ scrollObserver = createScrollObserver(store, window, viewport, isHorizontal, isRtl, null, baseOffset);
722
686
  initialized[1](true);
723
687
  },
724
688
  $dispose() {
725
689
  cleanupOnWindowResize && cleanupOnWindowResize();
726
690
  resizeObserver._dispose();
727
691
  scrollObserver && scrollObserver._dispose();
728
- containerElement = undefined;
692
+ viewportElement = undefined;
729
693
  initialized[1](false);
730
694
  initialized = createPromise();
731
695
  },
@@ -737,18 +701,16 @@ var createWindowDriver = (store, isHorizontal) => {
737
701
  resizeObserver._unobserve(el);
738
702
  };
739
703
  },
740
- $isNegative: () => isNegative,
741
- $scroll: scheduleScroll,
704
+ async $scroll(getTargetOffset, smooth) {
705
+ if (await initialized[0]) {
706
+ scrollObserver._scroll(getTargetOffset, smooth);
707
+ }
708
+ },
742
709
  $effect() {
743
710
  scrollObserver && scrollObserver._fixScrollJump();
744
711
  },
745
712
  $getBaseOffset() {
746
- const document = getCurrentDocument(containerElement);
747
- return calcOffsetToViewport(containerElement, document.body, getCurrentWindow(document), isHorizontal);
748
- },
749
- $getScrollbarSize() {
750
- const html = getDocumentElement(getCurrentDocument(containerElement));
751
- return store.$getViewportSize() - (isHorizontal ? html.clientWidth : html.clientHeight);
713
+ return getBaseOffset();
752
714
  }
753
715
  };
754
716
  };
@@ -757,21 +719,6 @@ var createContainerGridDriver = (rowStore, colStore) => {
757
719
  let rowScrollObserver;
758
720
  let colScrollObserver;
759
721
  let initialized = createPromise();
760
- let isNegative = false;
761
- const [scheduleScrollX, cancelScrollX] = createScrollScheduler(colStore, () => initialized[0], (offset, smooth) => {
762
- const opts = { left: normalizeScrollOffset(offset, isNegative) };
763
- if (smooth) {
764
- opts.behavior = "smooth";
765
- }
766
- viewportElement.scrollTo(opts);
767
- });
768
- const [scheduleScrollY, cancelScrollY] = createScrollScheduler(rowStore, () => initialized[0], (offset, smooth) => {
769
- const opts = { top: offset };
770
- if (smooth) {
771
- opts.behavior = "smooth";
772
- }
773
- viewportElement.scrollTo(opts);
774
- });
775
722
  const mountedIndexes = new WeakMap();
776
723
  const maybeCachedRowIndexes = new Set();
777
724
  const maybeCachedColIndexes = new Set();
@@ -848,32 +795,20 @@ var createContainerGridDriver = (rowStore, colStore) => {
848
795
  colStore.$update(3, widthResizes);
849
796
  }
850
797
  });
851
- const observeAxisScroll = (store, isHorizontal, cancelScroll) => {
852
- const viewport = viewportElement;
853
- const scrollOffsetKey = isHorizontal ? "scrollLeft" : "scrollTop";
854
- const overflowKey = isHorizontal ? "overflowX" : "overflowY";
855
- const negative = isHorizontal && isNegative;
856
- return createScrollObserver(store, viewport, isHorizontal, () => normalizeScrollOffset(viewport[scrollOffsetKey], negative), (jump, shift, isMomentumScrolling) => {
857
- if (isMomentumScrolling) {
798
+ return {
799
+ $observe(containerElement, viewport = containerElement.parentElement) {
800
+ resizeObserver._observe(viewportElement = viewport);
801
+ const isRtl = getComputedStyle(viewport).direction === "rtl";
802
+ const hackOverflow = (overflowKey) => () => {
858
803
  const style = viewport.style;
859
804
  const prev = style[overflowKey];
860
805
  style[overflowKey] = "hidden";
861
806
  timeout(() => {
862
807
  style[overflowKey] = prev;
863
808
  });
864
- }
865
- viewport[scrollOffsetKey] = normalizeScrollOffset(store.$getScrollOffset() + jump, negative);
866
- if (shift) {
867
- cancelScroll();
868
- }
869
- });
870
- };
871
- return {
872
- $observe(containerElement, viewport = containerElement.parentElement) {
873
- resizeObserver._observe(viewportElement = viewport);
874
- isNegative = getComputedStyle(viewport).direction === "rtl";
875
- rowScrollObserver = observeAxisScroll(rowStore, false, cancelScrollY);
876
- colScrollObserver = observeAxisScroll(colStore, true, cancelScrollX);
809
+ };
810
+ rowScrollObserver = createScrollObserver(rowStore, viewport, viewport, false, false, hackOverflow("overflowY"));
811
+ colScrollObserver = createScrollObserver(colStore, viewport, viewport, true, isRtl, hackOverflow("overflowX"));
877
812
  initialized[1](true);
878
813
  },
879
814
  $dispose() {
@@ -909,9 +844,16 @@ var createContainerGridDriver = (rowStore, colStore) => {
909
844
  }
910
845
  colStore.$update(3, cols);
911
846
  },
912
- $isNegative: () => isNegative,
913
- $scrollX: scheduleScrollX,
914
- $scrollY: scheduleScrollY,
847
+ async $scrollX(getTargetOffset, smooth) {
848
+ if (await initialized[0]) {
849
+ colScrollObserver._scroll(getTargetOffset, smooth);
850
+ }
851
+ },
852
+ async $scrollY(getTargetOffset, smooth) {
853
+ if (await initialized[0]) {
854
+ rowScrollObserver._scroll(getTargetOffset, smooth);
855
+ }
856
+ },
915
857
  $effect() {
916
858
  rowScrollObserver && rowScrollObserver._fixScrollJump();
917
859
  colScrollObserver && colScrollObserver._fixScrollJump();
@@ -941,7 +883,7 @@ var scrollToIndex = (driver, store, index, { align, smooth, offset = 0 } = {}) =
941
883
  }
942
884
  }
943
885
  driver.$scroll(() => {
944
- return offset + driver.$getBaseOffset() + store.$getItemOffset(index) + (align === "end" ? store.$getItemSize(index) - (store.$getViewportSize() - driver.$getScrollbarSize()) : align === "center" ? (store.$getItemSize(index) - (store.$getViewportSize() - driver.$getScrollbarSize())) / 2 : 0);
886
+ return offset + driver.$getBaseOffset() + store.$getItemOffset(index) + (align === "end" ? store.$getItemSize(index) - store.$getViewportSize() : align === "center" ? (store.$getItemSize(index) - store.$getViewportSize()) / 2 : 0);
945
887
  }, smooth);
946
888
  };
947
889
  var gridScrollTo = (driver, row, col) => {
@@ -991,7 +933,7 @@ var ListItem = (props) => {
991
933
  position: hide && isSSR ? undefined : "absolute",
992
934
  [isHorizontal ? "height" : "width"]: "100%",
993
935
  [isHorizontal ? "top" : "left"]: "0px",
994
- [isHorizontal ? "left" : "top"]: props._offset + "px",
936
+ [isHorizontal ? "inset-inline-start" : "top"]: props._offset + "px",
995
937
  visibility: !hide || isSSR ? undefined : "hidden"
996
938
  };
997
939
  if (isHorizontal) {
@@ -999,7 +941,7 @@ var ListItem = (props) => {
999
941
  }
1000
942
  return style;
1001
943
  });
1002
- return <Dynamic component={props._as} index={props._index} ref={elementRef} style={style()}>
944
+ return <Dynamic component={props._as} index={typeof props._as === "string" ? undefined : props._index} ref={elementRef} style={style()}>
1003
945
  {props._children}
1004
946
  </Dynamic>;
1005
947
  };
@@ -1040,7 +982,6 @@ var Virtualizer = (props) => {
1040
982
  });
1041
983
  const isScrolling = createMemo(() => stateVersion() && store.$isScrolling());
1042
984
  const totalSize = createMemo(() => stateVersion() && store.$getTotalSize());
1043
- const isNegative = createMemo(() => stateVersion() && driver.$isNegative());
1044
985
  onMount(() => {
1045
986
  setIsSSR(false);
1046
987
  if (props.ref) {
@@ -1114,7 +1055,7 @@ var Virtualizer = (props) => {
1114
1055
  const renderItem = (data, index) => {
1115
1056
  const offset = createMemo(() => {
1116
1057
  stateVersion();
1117
- return store.$getItemOffset(index(), isNegative());
1058
+ return store.$getItemOffset(index());
1118
1059
  });
1119
1060
  const hide = createMemo(() => {
1120
1061
  stateVersion();
@@ -1205,7 +1146,6 @@ var WindowVirtualizer = (props) => {
1205
1146
  });
1206
1147
  const isScrolling = createMemo(() => stateVersion() && store.$isScrolling());
1207
1148
  const totalSize = createMemo(() => stateVersion() && store.$getTotalSize());
1208
- const isNegative = createMemo(() => stateVersion() && driver.$isNegative());
1209
1149
  onMount(() => {
1210
1150
  setIsSSR(false);
1211
1151
  if (props.ref) {
@@ -1264,7 +1204,7 @@ var WindowVirtualizer = (props) => {
1264
1204
  const itemIndex = createMemo(() => range()[0] + index());
1265
1205
  const offset = createMemo(() => {
1266
1206
  stateVersion();
1267
- return store.$getItemOffset(itemIndex(), isNegative());
1207
+ return store.$getItemOffset(itemIndex());
1268
1208
  });
1269
1209
  const hide = createMemo(() => {
1270
1210
  stateVersion();