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.
- package/README.md +10 -5
- package/lib/angular/Virtualizer.d.ts +2 -2
- package/lib/angular/WindowVirtualizer.d.ts +2 -2
- package/lib/angular/index.js +245 -270
- package/lib/angular/index.js.map +1 -1
- package/lib/core/index.cjs +261 -298
- package/lib/core/index.cjs.map +1 -1
- package/lib/core/index.js +276 -313
- package/lib/core/index.js.map +1 -1
- package/lib/index.cjs +460 -497
- package/lib/index.cjs.map +1 -1
- package/lib/index.js +461 -498
- 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 +262 -289
- package/lib/solid/index.cjs.map +1 -1
- package/lib/solid/index.js +273 -298
- package/lib/solid/index.js.map +1 -1
- package/lib/solid/index.jsx +160 -220
- package/lib/solid/index.jsx.map +1 -1
- package/lib/svelte/ListItem.svelte +1 -1
- package/lib/svelte/Virtualizer.svelte +12 -4
- package/lib/svelte/Virtualizer.type.d.ts +2 -2
- package/lib/svelte/WindowVirtualizer.svelte +12 -4
- package/lib/svelte/WindowVirtualizer.type.d.ts +2 -2
- package/lib/svelte/utils.d.ts +2 -0
- package/lib/svelte/utils.js +4 -1
- package/lib/svelte/utils.js.map +1 -1
- package/lib/vue/Virtualizer.d.ts +2 -2
- package/lib/vue/WindowVirtualizer.d.ts +2 -2
- package/lib/vue/index.cjs +365 -415
- package/lib/vue/index.cjs.map +1 -1
- package/lib/vue/index.js +316 -365
- package/lib/vue/index.js.map +1 -1
- package/package.json +3 -4
package/lib/solid/index.jsx
CHANGED
|
@@ -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
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
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
|
|
94
|
-
|
|
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
|
|
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
|
-
|
|
491
|
+
if (stillMomentumScrolling && onMomentumJump) {
|
|
492
|
+
onMomentumJump();
|
|
493
|
+
}
|
|
499
494
|
stillMomentumScrolling = false;
|
|
500
|
-
|
|
501
|
-
|
|
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
|
-
|
|
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
|
-
|
|
532
|
-
|
|
533
|
-
|
|
510
|
+
},
|
|
511
|
+
_scroll: (getTargetOffset, smooth) => {
|
|
512
|
+
if (cancelScroll) {
|
|
513
|
+
cancelScroll();
|
|
534
514
|
}
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
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
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
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
|
|
556
|
-
|
|
557
|
-
queued
|
|
558
|
-
|
|
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
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
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
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
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
|
-
$
|
|
647
|
-
|
|
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
|
|
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
|
|
705
|
-
|
|
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
|
-
|
|
681
|
+
resizeObserver._observe(viewport);
|
|
709
682
|
cleanupOnWindowResize = () => {
|
|
710
683
|
window.removeEventListener("resize", onWindowResize);
|
|
711
684
|
};
|
|
712
|
-
|
|
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
|
-
|
|
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
|
-
$
|
|
741
|
-
|
|
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
|
-
|
|
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
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
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
|
-
|
|
866
|
-
|
|
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
|
-
$
|
|
913
|
-
|
|
914
|
-
|
|
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) -
|
|
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 ? "
|
|
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()
|
|
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()
|
|
1207
|
+
return store.$getItemOffset(itemIndex());
|
|
1268
1208
|
});
|
|
1269
1209
|
const hide = createMemo(() => {
|
|
1270
1210
|
stateVersion();
|