virtua 0.50.5 → 0.51.0
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.
- package/README.md +6 -1
- package/lib/angular/Virtualizer.d.ts +2 -2
- package/lib/angular/WindowVirtualizer.d.ts +2 -2
- package/lib/angular/index.js +226 -250
- package/lib/angular/index.js.map +1 -1
- package/lib/core/index.cjs +253 -271
- package/lib/core/index.cjs.map +1 -1
- package/lib/core/index.js +244 -262
- package/lib/core/index.js.map +1 -1
- package/lib/index.cjs +473 -491
- package/lib/index.cjs.map +1 -1
- package/lib/index.js +442 -460
- package/lib/index.js.map +1 -1
- package/lib/react/VGrid.d.ts +3 -3
- package/lib/react/Virtualizer.d.ts +2 -2
- package/lib/react/WindowVirtualizer.d.ts +2 -2
- package/lib/solid/Virtualizer.d.ts +2 -2
- package/lib/solid/WindowVirtualizer.d.ts +2 -2
- package/lib/solid/index.cjs +261 -287
- package/lib/solid/index.cjs.map +1 -1
- package/lib/solid/index.js +276 -300
- package/lib/solid/index.js.map +1 -1
- package/lib/solid/index.jsx +149 -152
- package/lib/solid/index.jsx.map +1 -1
- package/lib/svelte/ListItem.svelte +1 -1
- package/lib/svelte/Virtualizer.svelte +1 -2
- package/lib/svelte/Virtualizer.type.d.ts +2 -2
- package/lib/svelte/WindowVirtualizer.svelte +1 -2
- package/lib/svelte/WindowVirtualizer.type.d.ts +2 -2
- package/lib/vue/Virtualizer.d.ts +2 -2
- package/lib/vue/WindowVirtualizer.d.ts +2 -2
- package/lib/vue/index.cjs +258 -287
- package/lib/vue/index.cjs.map +1 -1
- package/lib/vue/index.js +260 -289
- package/lib/vue/index.js.map +1 -1
- package/package.json +2 -3
package/lib/solid/index.jsx
CHANGED
|
@@ -9,6 +9,7 @@ var sort = (arr) => {
|
|
|
9
9
|
return [...arr].sort((a, b) => a - b);
|
|
10
10
|
};
|
|
11
11
|
var timeout = setTimeout;
|
|
12
|
+
var cancelTimeout = clearTimeout;
|
|
12
13
|
var microtask = typeof queueMicrotask === "function" ? queueMicrotask : (fn) => {
|
|
13
14
|
Promise.resolve().then(fn);
|
|
14
15
|
};
|
|
@@ -33,7 +34,6 @@ var once = (fn) => {
|
|
|
33
34
|
//#endregion
|
|
34
35
|
//#region src/core/environment.ts
|
|
35
36
|
var isBrowser = typeof window !== "undefined";
|
|
36
|
-
var getDocumentElement = (doc) => doc.documentElement;
|
|
37
37
|
var getCurrentDocument = (node) => node.ownerDocument;
|
|
38
38
|
var getCurrentWindow = (doc) => doc.defaultView;
|
|
39
39
|
var isIOSWebKit = /*#__PURE__*/ once(() => {
|
|
@@ -42,9 +42,6 @@ var isIOSWebKit = /*#__PURE__*/ once(() => {
|
|
|
42
42
|
}
|
|
43
43
|
return navigator.platform === "MacIntel" && navigator.maxTouchPoints > 0;
|
|
44
44
|
});
|
|
45
|
-
var isSmoothScrollSupported = /*#__PURE__*/ once(() => {
|
|
46
|
-
return "scrollBehavior" in getDocumentElement(document).style;
|
|
47
|
-
});
|
|
48
45
|
|
|
49
46
|
//#endregion
|
|
50
47
|
//#region src/core/store.ts
|
|
@@ -89,12 +86,8 @@ var createVirtualStore = ({ $getRange: getRange, $findIndex: findIndex, $getItem
|
|
|
89
86
|
const subscribers = new Set();
|
|
90
87
|
const getRelativeScrollOffset = () => scrollOffset - startSpacerSize;
|
|
91
88
|
const getVisibleOffset = () => getRelativeScrollOffset() + pendingJump + jump;
|
|
92
|
-
const getItemOffset = (index
|
|
93
|
-
|
|
94
|
-
if (fromEnd) {
|
|
95
|
-
return getTotalSize() - offset - getItemSize(index);
|
|
96
|
-
}
|
|
97
|
-
return offset;
|
|
89
|
+
const getItemOffset = (index) => {
|
|
90
|
+
return getOffset(index) - pendingJump;
|
|
98
91
|
};
|
|
99
92
|
const applyJump = (j) => {
|
|
100
93
|
if (j) {
|
|
@@ -425,42 +418,30 @@ var createResizeObserver = (cb) => {
|
|
|
425
418
|
}
|
|
426
419
|
};
|
|
427
420
|
};
|
|
428
|
-
var debounce = (fn, ms) => {
|
|
429
|
-
let id;
|
|
430
|
-
const cancel = () => {
|
|
431
|
-
if (id != null) {
|
|
432
|
-
clearTimeout(id);
|
|
433
|
-
}
|
|
434
|
-
};
|
|
435
|
-
const debouncedFn = () => {
|
|
436
|
-
cancel();
|
|
437
|
-
id = timeout(() => {
|
|
438
|
-
id = null;
|
|
439
|
-
fn();
|
|
440
|
-
}, ms);
|
|
441
|
-
};
|
|
442
|
-
debouncedFn._cancel = cancel;
|
|
443
|
-
return debouncedFn;
|
|
444
|
-
};
|
|
445
421
|
var normalizeScrollOffset = (offset, isNegative) => {
|
|
446
422
|
return isNegative ? -offset : offset;
|
|
447
423
|
};
|
|
448
424
|
var createScrollObserver = (store, viewport, isHorizontal, getScrollOffset, updateScrollOffset, getStartOffset) => {
|
|
449
|
-
const now = Date.now;
|
|
450
425
|
let lastScrollTime = 0;
|
|
451
426
|
let wheeling = false;
|
|
452
427
|
let touching = false;
|
|
453
428
|
let justTouchEnded = false;
|
|
454
429
|
let stillMomentumScrolling = false;
|
|
455
|
-
|
|
430
|
+
let scrollEndTimer;
|
|
431
|
+
const now = Date.now;
|
|
432
|
+
const onScrollEnd = () => {
|
|
456
433
|
if (wheeling || touching) {
|
|
457
434
|
wheeling = false;
|
|
458
|
-
|
|
435
|
+
scheduleScrollEnd();
|
|
459
436
|
return;
|
|
460
437
|
}
|
|
461
438
|
justTouchEnded = false;
|
|
462
439
|
store.$update(2);
|
|
463
|
-
}
|
|
440
|
+
};
|
|
441
|
+
const scheduleScrollEnd = () => {
|
|
442
|
+
cancelTimeout(scrollEndTimer);
|
|
443
|
+
scrollEndTimer = timeout(onScrollEnd, 150);
|
|
444
|
+
};
|
|
464
445
|
const onScroll = () => {
|
|
465
446
|
lastScrollTime = now();
|
|
466
447
|
if (justTouchEnded) {
|
|
@@ -470,7 +451,7 @@ var createScrollObserver = (store, viewport, isHorizontal, getScrollOffset, upda
|
|
|
470
451
|
store.$update(6, getStartOffset());
|
|
471
452
|
}
|
|
472
453
|
store.$update(1, getScrollOffset());
|
|
473
|
-
|
|
454
|
+
scheduleScrollEnd();
|
|
474
455
|
};
|
|
475
456
|
const onWheel = ((e) => {
|
|
476
457
|
if (wheeling || !store.$isScrolling() || e.ctrlKey) {
|
|
@@ -501,7 +482,7 @@ var createScrollObserver = (store, viewport, isHorizontal, getScrollOffset, upda
|
|
|
501
482
|
viewport.removeEventListener("wheel", onWheel);
|
|
502
483
|
viewport.removeEventListener("touchstart", onTouchStart);
|
|
503
484
|
viewport.removeEventListener("touchend", onTouchEnd);
|
|
504
|
-
|
|
485
|
+
cancelTimeout(scrollEndTimer);
|
|
505
486
|
},
|
|
506
487
|
_fixScrollJump: () => {
|
|
507
488
|
const [jump, shift] = store._flushJump();
|
|
@@ -526,57 +507,55 @@ var createScrollScheduler = (store, initialized, scroll) => {
|
|
|
526
507
|
if (cancelScroll) {
|
|
527
508
|
cancelScroll();
|
|
528
509
|
}
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
510
|
+
let stopped;
|
|
511
|
+
let timerId;
|
|
512
|
+
let unsubscribe;
|
|
513
|
+
const stop = cancelScroll = () => {
|
|
514
|
+
stopped = true;
|
|
515
|
+
cancelTimeout(timerId);
|
|
516
|
+
unsubscribe && unsubscribe();
|
|
517
|
+
};
|
|
518
|
+
const onMeasured = () => {
|
|
519
|
+
if (stopped) {
|
|
520
|
+
return;
|
|
521
|
+
}
|
|
534
522
|
if (store.$getViewportSize()) {
|
|
535
|
-
|
|
523
|
+
cancelTimeout(timerId);
|
|
524
|
+
timerId = timeout(stop, 150);
|
|
536
525
|
}
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
};
|
|
541
|
-
if (smooth && isSmoothScrollSupported()) {
|
|
542
|
-
store.$update(8, getTargetOffset());
|
|
543
|
-
microtask(async () => {
|
|
544
|
-
while (true) {
|
|
545
|
-
let done = true;
|
|
546
|
-
for (let [i, end] = store.$getRange(); i <= end; i++) {
|
|
547
|
-
if (store.$isUnmeasuredItem(i)) {
|
|
548
|
-
done = false;
|
|
549
|
-
break;
|
|
550
|
-
}
|
|
551
|
-
}
|
|
552
|
-
if (done) {
|
|
553
|
-
break;
|
|
554
|
-
}
|
|
555
|
-
const [promise, unsubscribe] = waitForMeasurement();
|
|
556
|
-
try {
|
|
557
|
-
if (!await promise) {
|
|
558
|
-
return;
|
|
559
|
-
}
|
|
560
|
-
} finally {
|
|
561
|
-
unsubscribe();
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
store.$update(7);
|
|
565
|
-
scroll(getTargetOffset(), smooth);
|
|
566
|
-
});
|
|
567
|
-
} else {
|
|
568
|
-
while (true) {
|
|
569
|
-
const [promise, unsubscribe] = waitForMeasurement();
|
|
570
|
-
try {
|
|
571
|
-
store.$update(7);
|
|
572
|
-
scroll(getTargetOffset());
|
|
573
|
-
if (!await promise) {
|
|
526
|
+
if (smooth) {
|
|
527
|
+
for (let [i, end] = store.$getRange(0); i <= end; i++) {
|
|
528
|
+
if (store.$isUnmeasuredItem(i)) {
|
|
574
529
|
return;
|
|
575
530
|
}
|
|
576
|
-
} finally {
|
|
577
|
-
unsubscribe();
|
|
578
531
|
}
|
|
532
|
+
stop();
|
|
533
|
+
}
|
|
534
|
+
store.$update(7);
|
|
535
|
+
scroll(getTargetOffset(), smooth);
|
|
536
|
+
};
|
|
537
|
+
const start = () => {
|
|
538
|
+
if (stopped) {
|
|
539
|
+
return;
|
|
579
540
|
}
|
|
541
|
+
let queued;
|
|
542
|
+
unsubscribe = store.$subscribe(2, () => {
|
|
543
|
+
if (queued) {
|
|
544
|
+
return;
|
|
545
|
+
}
|
|
546
|
+
queued = true;
|
|
547
|
+
microtask(() => {
|
|
548
|
+
queued = false;
|
|
549
|
+
onMeasured();
|
|
550
|
+
});
|
|
551
|
+
});
|
|
552
|
+
onMeasured();
|
|
553
|
+
};
|
|
554
|
+
if (smooth) {
|
|
555
|
+
store.$update(8, getTargetOffset());
|
|
556
|
+
microtask(start);
|
|
557
|
+
} else {
|
|
558
|
+
start();
|
|
580
559
|
}
|
|
581
560
|
}, () => {
|
|
582
561
|
cancelScroll && cancelScroll();
|
|
@@ -586,19 +565,15 @@ var createContainerDriver = (store, isHorizontal) => {
|
|
|
586
565
|
let viewportElement;
|
|
587
566
|
let scrollObserver;
|
|
588
567
|
let initialized = createPromise();
|
|
589
|
-
let
|
|
568
|
+
let isRtl = false;
|
|
590
569
|
const scrollOffsetKey = isHorizontal ? "scrollLeft" : "scrollTop";
|
|
570
|
+
const scrollToKey = isHorizontal ? "left" : "top";
|
|
591
571
|
const overflowKey = isHorizontal ? "overflowX" : "overflowY";
|
|
592
572
|
const [scheduleScroll, cancelScroll] = createScrollScheduler(store, () => initialized[0], (offset, smooth) => {
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
behavior: "smooth"
|
|
598
|
-
});
|
|
599
|
-
} else {
|
|
600
|
-
viewportElement[scrollOffsetKey] = offset;
|
|
601
|
-
}
|
|
573
|
+
viewportElement.scrollTo({
|
|
574
|
+
[scrollToKey]: normalizeScrollOffset(offset, isRtl),
|
|
575
|
+
behavior: smooth ? "smooth" : "instant"
|
|
576
|
+
});
|
|
602
577
|
});
|
|
603
578
|
const sizeKey = isHorizontal ? "width" : "height";
|
|
604
579
|
const mountedIndexes = new WeakMap();
|
|
@@ -623,9 +598,9 @@ var createContainerDriver = (store, isHorizontal) => {
|
|
|
623
598
|
$observe(containerElement, viewport = containerElement.parentElement) {
|
|
624
599
|
resizeObserver._observe(viewportElement = viewport);
|
|
625
600
|
if (isHorizontal) {
|
|
626
|
-
|
|
601
|
+
isRtl = getComputedStyle(viewport).direction === "rtl";
|
|
627
602
|
}
|
|
628
|
-
scrollObserver = createScrollObserver(store, viewport, isHorizontal, () => normalizeScrollOffset(viewport[scrollOffsetKey],
|
|
603
|
+
scrollObserver = createScrollObserver(store, viewport, isHorizontal, () => normalizeScrollOffset(viewport[scrollOffsetKey], isRtl), (jump, shift, isMomentumScrolling) => {
|
|
629
604
|
if (isMomentumScrolling) {
|
|
630
605
|
const style = viewport.style;
|
|
631
606
|
const prev = style[overflowKey];
|
|
@@ -634,7 +609,18 @@ var createContainerDriver = (store, isHorizontal) => {
|
|
|
634
609
|
style[overflowKey] = prev;
|
|
635
610
|
});
|
|
636
611
|
}
|
|
637
|
-
|
|
612
|
+
const target = store.$getScrollOffset() + jump;
|
|
613
|
+
if (target <= 0 || target >= store.$getStartSpacerSize() + store.$getTotalSize() - store.$getViewportSize()) {
|
|
614
|
+
viewport.scrollTo({
|
|
615
|
+
[scrollToKey]: normalizeScrollOffset(target, isRtl),
|
|
616
|
+
behavior: "instant"
|
|
617
|
+
});
|
|
618
|
+
} else {
|
|
619
|
+
viewport.scrollBy({
|
|
620
|
+
[scrollToKey]: normalizeScrollOffset(jump, isRtl),
|
|
621
|
+
behavior: "instant"
|
|
622
|
+
});
|
|
623
|
+
}
|
|
638
624
|
if (shift) {
|
|
639
625
|
cancelScroll();
|
|
640
626
|
}
|
|
@@ -655,39 +641,38 @@ var createContainerDriver = (store, isHorizontal) => {
|
|
|
655
641
|
resizeObserver._unobserve(el);
|
|
656
642
|
};
|
|
657
643
|
},
|
|
658
|
-
$isNegative: () => isNegative,
|
|
659
644
|
$scroll: scheduleScroll,
|
|
660
645
|
$effect() {
|
|
661
646
|
scrollObserver && scrollObserver._fixScrollJump();
|
|
662
647
|
},
|
|
663
|
-
$getBaseOffset: store.$getStartSpacerSize
|
|
664
|
-
$getScrollbarSize: () => 0
|
|
648
|
+
$getBaseOffset: store.$getStartSpacerSize
|
|
665
649
|
};
|
|
666
650
|
};
|
|
667
651
|
var createWindowDriver = (store, isHorizontal) => {
|
|
668
|
-
let
|
|
652
|
+
let viewportElement;
|
|
669
653
|
let scrollObserver;
|
|
670
654
|
let cleanupOnWindowResize;
|
|
655
|
+
let getBaseOffset;
|
|
656
|
+
let onViewportResize;
|
|
671
657
|
let initialized = createPromise();
|
|
672
|
-
let
|
|
658
|
+
let isRtl = false;
|
|
659
|
+
const scrollOffsetKey = isHorizontal ? "scrollLeft" : "scrollTop";
|
|
673
660
|
const scrollToKey = isHorizontal ? "left" : "top";
|
|
674
|
-
const [scheduleScroll] = createScrollScheduler(store, () => initialized[0], (offset, smooth) => {
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
[scrollToKey]: offset,
|
|
680
|
-
behavior: "smooth"
|
|
681
|
-
});
|
|
682
|
-
} else {
|
|
683
|
-
window.scroll({ [scrollToKey]: offset });
|
|
684
|
-
}
|
|
661
|
+
const [scheduleScroll, cancelScroll] = createScrollScheduler(store, () => initialized[0], (offset, smooth) => {
|
|
662
|
+
viewportElement.scrollTo({
|
|
663
|
+
[scrollToKey]: normalizeScrollOffset(offset, isRtl),
|
|
664
|
+
behavior: smooth ? "smooth" : "instant"
|
|
665
|
+
});
|
|
685
666
|
});
|
|
686
667
|
const sizeKey = isHorizontal ? "width" : "height";
|
|
687
668
|
const mountedIndexes = new WeakMap();
|
|
688
669
|
const resizeObserver = createResizeObserver((entries) => {
|
|
689
670
|
const resizes = [];
|
|
690
671
|
for (const { target, contentRect } of entries) {
|
|
672
|
+
if (target === viewportElement) {
|
|
673
|
+
onViewportResize && onViewportResize();
|
|
674
|
+
continue;
|
|
675
|
+
}
|
|
691
676
|
if (!target.offsetParent) continue;
|
|
692
677
|
const index = mountedIndexes.get(target);
|
|
693
678
|
if (index != null) {
|
|
@@ -698,46 +683,58 @@ var createWindowDriver = (store, isHorizontal) => {
|
|
|
698
683
|
store.$update(3, resizes);
|
|
699
684
|
}
|
|
700
685
|
});
|
|
701
|
-
const calcOffsetToViewport = (node, viewport,
|
|
686
|
+
const calcOffsetToViewport = (node, viewport, until, isHorizontal, offset = 0) => {
|
|
702
687
|
const offsetKey = isHorizontal ? "offsetLeft" : "offsetTop";
|
|
703
|
-
const offsetSum = offset + (
|
|
688
|
+
const offsetSum = offset + (isRtl ? viewport.clientWidth - node[offsetKey] - node.offsetWidth : node[offsetKey]);
|
|
704
689
|
const parent = node.offsetParent;
|
|
705
|
-
if (node ===
|
|
690
|
+
if (node === until || !parent) {
|
|
706
691
|
return offsetSum;
|
|
707
692
|
}
|
|
708
|
-
return calcOffsetToViewport(parent, viewport,
|
|
693
|
+
return calcOffsetToViewport(parent, viewport, until, isHorizontal, offsetSum);
|
|
709
694
|
};
|
|
710
695
|
return {
|
|
711
696
|
$observe(container) {
|
|
712
|
-
containerElement = container;
|
|
713
|
-
const scrollOffsetKey = isHorizontal ? "scrollX" : "scrollY";
|
|
714
697
|
const document = getCurrentDocument(container);
|
|
715
698
|
const window = getCurrentWindow(document);
|
|
716
|
-
const
|
|
717
|
-
|
|
699
|
+
const viewport = viewportElement = document.scrollingElement;
|
|
700
|
+
const baseOffset = getBaseOffset = () => {
|
|
701
|
+
return calcOffsetToViewport(container, viewport, document.body, isHorizontal);
|
|
702
|
+
};
|
|
703
|
+
const onWindowResize = onViewportResize = () => {
|
|
704
|
+
store.$update(4, viewport[isHorizontal ? "clientWidth" : "clientHeight"]);
|
|
718
705
|
};
|
|
719
706
|
window.addEventListener("resize", onWindowResize);
|
|
720
|
-
|
|
707
|
+
resizeObserver._observe(viewport);
|
|
721
708
|
cleanupOnWindowResize = () => {
|
|
722
709
|
window.removeEventListener("resize", onWindowResize);
|
|
723
710
|
};
|
|
724
711
|
if (isHorizontal) {
|
|
725
|
-
|
|
712
|
+
isRtl = getComputedStyle(viewport).direction === "rtl";
|
|
726
713
|
}
|
|
727
|
-
scrollObserver = createScrollObserver(store, window, isHorizontal, () => normalizeScrollOffset(
|
|
728
|
-
|
|
729
|
-
|
|
714
|
+
scrollObserver = createScrollObserver(store, window, isHorizontal, () => normalizeScrollOffset(viewport[scrollOffsetKey], isRtl), (jump, shift) => {
|
|
715
|
+
const target = store.$getScrollOffset() + jump;
|
|
716
|
+
if (target <= 0 || target >= store.$getStartSpacerSize() + store.$getTotalSize() - store.$getViewportSize()) {
|
|
717
|
+
viewport.scrollTo({
|
|
718
|
+
[scrollToKey]: normalizeScrollOffset(target, isRtl),
|
|
719
|
+
behavior: "instant"
|
|
720
|
+
});
|
|
730
721
|
} else {
|
|
731
|
-
|
|
722
|
+
viewport.scrollBy({
|
|
723
|
+
[scrollToKey]: normalizeScrollOffset(jump, isRtl),
|
|
724
|
+
behavior: "instant"
|
|
725
|
+
});
|
|
732
726
|
}
|
|
733
|
-
|
|
727
|
+
if (shift) {
|
|
728
|
+
cancelScroll();
|
|
729
|
+
}
|
|
730
|
+
}, baseOffset);
|
|
734
731
|
initialized[1](true);
|
|
735
732
|
},
|
|
736
733
|
$dispose() {
|
|
737
734
|
cleanupOnWindowResize && cleanupOnWindowResize();
|
|
738
735
|
resizeObserver._dispose();
|
|
739
736
|
scrollObserver && scrollObserver._dispose();
|
|
740
|
-
|
|
737
|
+
viewportElement = undefined;
|
|
741
738
|
initialized[1](false);
|
|
742
739
|
initialized = createPromise();
|
|
743
740
|
},
|
|
@@ -749,18 +746,12 @@ var createWindowDriver = (store, isHorizontal) => {
|
|
|
749
746
|
resizeObserver._unobserve(el);
|
|
750
747
|
};
|
|
751
748
|
},
|
|
752
|
-
$isNegative: () => isNegative,
|
|
753
749
|
$scroll: scheduleScroll,
|
|
754
750
|
$effect() {
|
|
755
751
|
scrollObserver && scrollObserver._fixScrollJump();
|
|
756
752
|
},
|
|
757
753
|
$getBaseOffset() {
|
|
758
|
-
|
|
759
|
-
return calcOffsetToViewport(containerElement, document.body, getCurrentWindow(document), isHorizontal);
|
|
760
|
-
},
|
|
761
|
-
$getScrollbarSize() {
|
|
762
|
-
const html = getDocumentElement(getCurrentDocument(containerElement));
|
|
763
|
-
return store.$getViewportSize() - (isHorizontal ? html.clientWidth : html.clientHeight);
|
|
754
|
+
return getBaseOffset();
|
|
764
755
|
}
|
|
765
756
|
};
|
|
766
757
|
};
|
|
@@ -769,20 +760,18 @@ var createContainerGridDriver = (rowStore, colStore) => {
|
|
|
769
760
|
let rowScrollObserver;
|
|
770
761
|
let colScrollObserver;
|
|
771
762
|
let initialized = createPromise();
|
|
772
|
-
let
|
|
763
|
+
let isRtl = false;
|
|
773
764
|
const [scheduleScrollX, cancelScrollX] = createScrollScheduler(colStore, () => initialized[0], (offset, smooth) => {
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
}
|
|
778
|
-
viewportElement.scrollTo(opts);
|
|
765
|
+
viewportElement.scrollTo({
|
|
766
|
+
left: normalizeScrollOffset(offset, isRtl),
|
|
767
|
+
behavior: smooth ? "smooth" : "instant"
|
|
768
|
+
});
|
|
779
769
|
});
|
|
780
770
|
const [scheduleScrollY, cancelScrollY] = createScrollScheduler(rowStore, () => initialized[0], (offset, smooth) => {
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
}
|
|
785
|
-
viewportElement.scrollTo(opts);
|
|
771
|
+
viewportElement.scrollTo({
|
|
772
|
+
top: offset,
|
|
773
|
+
behavior: smooth ? "smooth" : "instant"
|
|
774
|
+
});
|
|
786
775
|
});
|
|
787
776
|
const mountedIndexes = new WeakMap();
|
|
788
777
|
const maybeCachedRowIndexes = new Set();
|
|
@@ -864,8 +853,8 @@ var createContainerGridDriver = (rowStore, colStore) => {
|
|
|
864
853
|
const viewport = viewportElement;
|
|
865
854
|
const scrollOffsetKey = isHorizontal ? "scrollLeft" : "scrollTop";
|
|
866
855
|
const overflowKey = isHorizontal ? "overflowX" : "overflowY";
|
|
867
|
-
const
|
|
868
|
-
return createScrollObserver(store, viewport, isHorizontal, () => normalizeScrollOffset(viewport[scrollOffsetKey],
|
|
856
|
+
const rtl = isHorizontal && isRtl;
|
|
857
|
+
return createScrollObserver(store, viewport, isHorizontal, () => normalizeScrollOffset(viewport[scrollOffsetKey], rtl), (jump, shift, isMomentumScrolling) => {
|
|
869
858
|
if (isMomentumScrolling) {
|
|
870
859
|
const style = viewport.style;
|
|
871
860
|
const prev = style[overflowKey];
|
|
@@ -874,7 +863,18 @@ var createContainerGridDriver = (rowStore, colStore) => {
|
|
|
874
863
|
style[overflowKey] = prev;
|
|
875
864
|
});
|
|
876
865
|
}
|
|
877
|
-
|
|
866
|
+
const target = store.$getScrollOffset() + jump;
|
|
867
|
+
if (target <= 0 || target >= store.$getStartSpacerSize() + store.$getTotalSize() - store.$getViewportSize()) {
|
|
868
|
+
viewport.scrollTo({
|
|
869
|
+
[isHorizontal ? "left" : "top"]: normalizeScrollOffset(target, rtl),
|
|
870
|
+
behavior: "instant"
|
|
871
|
+
});
|
|
872
|
+
} else {
|
|
873
|
+
viewport.scrollBy({
|
|
874
|
+
[isHorizontal ? "left" : "top"]: normalizeScrollOffset(jump, rtl),
|
|
875
|
+
behavior: "instant"
|
|
876
|
+
});
|
|
877
|
+
}
|
|
878
878
|
if (shift) {
|
|
879
879
|
cancelScroll();
|
|
880
880
|
}
|
|
@@ -883,7 +883,7 @@ var createContainerGridDriver = (rowStore, colStore) => {
|
|
|
883
883
|
return {
|
|
884
884
|
$observe(containerElement, viewport = containerElement.parentElement) {
|
|
885
885
|
resizeObserver._observe(viewportElement = viewport);
|
|
886
|
-
|
|
886
|
+
isRtl = getComputedStyle(viewport).direction === "rtl";
|
|
887
887
|
rowScrollObserver = observeAxisScroll(rowStore, false, cancelScrollY);
|
|
888
888
|
colScrollObserver = observeAxisScroll(colStore, true, cancelScrollX);
|
|
889
889
|
initialized[1](true);
|
|
@@ -921,7 +921,6 @@ var createContainerGridDriver = (rowStore, colStore) => {
|
|
|
921
921
|
}
|
|
922
922
|
colStore.$update(3, cols);
|
|
923
923
|
},
|
|
924
|
-
$isNegative: () => isNegative,
|
|
925
924
|
$scrollX: scheduleScrollX,
|
|
926
925
|
$scrollY: scheduleScrollY,
|
|
927
926
|
$effect() {
|
|
@@ -953,7 +952,7 @@ var scrollToIndex = (driver, store, index, { align, smooth, offset = 0 } = {}) =
|
|
|
953
952
|
}
|
|
954
953
|
}
|
|
955
954
|
driver.$scroll(() => {
|
|
956
|
-
return offset + driver.$getBaseOffset() + store.$getItemOffset(index) + (align === "end" ? store.$getItemSize(index) -
|
|
955
|
+
return offset + driver.$getBaseOffset() + store.$getItemOffset(index) + (align === "end" ? store.$getItemSize(index) - store.$getViewportSize() : align === "center" ? (store.$getItemSize(index) - store.$getViewportSize()) / 2 : 0);
|
|
957
956
|
}, smooth);
|
|
958
957
|
};
|
|
959
958
|
var gridScrollTo = (driver, row, col) => {
|
|
@@ -1003,7 +1002,7 @@ var ListItem = (props) => {
|
|
|
1003
1002
|
position: hide && isSSR ? undefined : "absolute",
|
|
1004
1003
|
[isHorizontal ? "height" : "width"]: "100%",
|
|
1005
1004
|
[isHorizontal ? "top" : "left"]: "0px",
|
|
1006
|
-
[isHorizontal ? "
|
|
1005
|
+
[isHorizontal ? "inset-inline-start" : "top"]: props._offset + "px",
|
|
1007
1006
|
visibility: !hide || isSSR ? undefined : "hidden"
|
|
1008
1007
|
};
|
|
1009
1008
|
if (isHorizontal) {
|
|
@@ -1052,7 +1051,6 @@ var Virtualizer = (props) => {
|
|
|
1052
1051
|
});
|
|
1053
1052
|
const isScrolling = createMemo(() => stateVersion() && store.$isScrolling());
|
|
1054
1053
|
const totalSize = createMemo(() => stateVersion() && store.$getTotalSize());
|
|
1055
|
-
const isNegative = createMemo(() => stateVersion() && driver.$isNegative());
|
|
1056
1054
|
onMount(() => {
|
|
1057
1055
|
setIsSSR(false);
|
|
1058
1056
|
if (props.ref) {
|
|
@@ -1126,7 +1124,7 @@ var Virtualizer = (props) => {
|
|
|
1126
1124
|
const renderItem = (data, index) => {
|
|
1127
1125
|
const offset = createMemo(() => {
|
|
1128
1126
|
stateVersion();
|
|
1129
|
-
return store.$getItemOffset(index()
|
|
1127
|
+
return store.$getItemOffset(index());
|
|
1130
1128
|
});
|
|
1131
1129
|
const hide = createMemo(() => {
|
|
1132
1130
|
stateVersion();
|
|
@@ -1217,7 +1215,6 @@ var WindowVirtualizer = (props) => {
|
|
|
1217
1215
|
});
|
|
1218
1216
|
const isScrolling = createMemo(() => stateVersion() && store.$isScrolling());
|
|
1219
1217
|
const totalSize = createMemo(() => stateVersion() && store.$getTotalSize());
|
|
1220
|
-
const isNegative = createMemo(() => stateVersion() && driver.$isNegative());
|
|
1221
1218
|
onMount(() => {
|
|
1222
1219
|
setIsSSR(false);
|
|
1223
1220
|
if (props.ref) {
|
|
@@ -1276,7 +1273,7 @@ var WindowVirtualizer = (props) => {
|
|
|
1276
1273
|
const itemIndex = createMemo(() => range()[0] + index());
|
|
1277
1274
|
const offset = createMemo(() => {
|
|
1278
1275
|
stateVersion();
|
|
1279
|
-
return store.$getItemOffset(itemIndex()
|
|
1276
|
+
return store.$getItemOffset(itemIndex());
|
|
1280
1277
|
});
|
|
1281
1278
|
const hide = createMemo(() => {
|
|
1282
1279
|
stateVersion();
|