@rethink-js/rt-slider 1.1.0 → 1.2.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 +162 -39
- package/dist/index.js +506 -20
- package/dist/index.js.map +3 -3
- package/dist/index.min.js +2 -2
- package/dist/index.min.js.map +3 -3
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! @rethink-js/rt-slider v1.1
|
|
1
|
+
/*! @rethink-js/rt-slider v1.2.1 | MIT */
|
|
2
2
|
(() => {
|
|
3
3
|
// src/index.js
|
|
4
4
|
(function() {
|
|
@@ -118,6 +118,11 @@
|
|
|
118
118
|
function clamp(i) {
|
|
119
119
|
return i < 0 ? 0 : i > 1 ? 1 : i;
|
|
120
120
|
}
|
|
121
|
+
function round(n, d) {
|
|
122
|
+
if (!Number.isFinite(n)) return 0;
|
|
123
|
+
var m = Math.pow(10, d || 0);
|
|
124
|
+
return Math.round(n * m) / m;
|
|
125
|
+
}
|
|
121
126
|
function parseEasing(name) {
|
|
122
127
|
var n = String(name || "").trim();
|
|
123
128
|
if (!n) return null;
|
|
@@ -310,6 +315,11 @@
|
|
|
310
315
|
this._injectedKey = null;
|
|
311
316
|
this._lastGutterPx = 0;
|
|
312
317
|
this._lastGapPx = 0;
|
|
318
|
+
this.slideState = null;
|
|
319
|
+
this._slideStateSig = "";
|
|
320
|
+
this._progressSig = "";
|
|
321
|
+
this._lastSlideStateActiveIndex = -1;
|
|
322
|
+
this._lastSlideStateScrollLeft = 0;
|
|
313
323
|
var self = this;
|
|
314
324
|
this.ro = typeof ResizeObserver !== "undefined" ? new ResizeObserver(function() {
|
|
315
325
|
if (self._roTicking) return;
|
|
@@ -327,6 +337,9 @@
|
|
|
327
337
|
var dpr = Math.max(1, window.devicePixelRatio || 1);
|
|
328
338
|
return 1 / dpr;
|
|
329
339
|
};
|
|
340
|
+
Slider.prototype.scrollEdgeEpsilon = function() {
|
|
341
|
+
return Math.max(2, this.devicePixelEpsilon() * 4);
|
|
342
|
+
};
|
|
330
343
|
Slider.prototype.listGap = function() {
|
|
331
344
|
var cs = getComputedStyle(this.list);
|
|
332
345
|
var g1 = parseFloat(cs.columnGap || "0") || 0;
|
|
@@ -427,6 +440,38 @@
|
|
|
427
440
|
Slider.prototype.maxScroll = function() {
|
|
428
441
|
return Math.max(0, this.scroller.scrollWidth - this.scroller.clientWidth);
|
|
429
442
|
};
|
|
443
|
+
Slider.prototype.getLiveScrollMetrics = function() {
|
|
444
|
+
var scrollWidth = Math.max(0, this.scroller.scrollWidth || 0);
|
|
445
|
+
var clientWidth = Math.max(0, this.scroller.clientWidth || 0);
|
|
446
|
+
var max = Math.max(0, scrollWidth - clientWidth);
|
|
447
|
+
var current = this.safeClampScroll(this.scroller.scrollLeft);
|
|
448
|
+
var epsilon = this.scrollEdgeEpsilon();
|
|
449
|
+
if (max <= 0 || scrollWidth <= clientWidth + epsilon) {
|
|
450
|
+
return {
|
|
451
|
+
current: 0,
|
|
452
|
+
max: 0,
|
|
453
|
+
progress: 0,
|
|
454
|
+
progressPercent: 0,
|
|
455
|
+
isAtStart: true,
|
|
456
|
+
isAtEnd: true
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
var atStart = current <= epsilon;
|
|
460
|
+
var atEnd = current >= max - epsilon || current + clientWidth >= scrollWidth - epsilon;
|
|
461
|
+
if (atStart) current = 0;
|
|
462
|
+
if (atEnd) current = max;
|
|
463
|
+
var progress = max > 0 ? clamp(current / max) : 0;
|
|
464
|
+
if (atEnd) progress = 1;
|
|
465
|
+
if (atStart) progress = 0;
|
|
466
|
+
return {
|
|
467
|
+
current,
|
|
468
|
+
max,
|
|
469
|
+
progress,
|
|
470
|
+
progressPercent: progress * 100,
|
|
471
|
+
isAtStart: atStart,
|
|
472
|
+
isAtEnd: atEnd
|
|
473
|
+
};
|
|
474
|
+
};
|
|
430
475
|
Slider.prototype.updateOverlays = function() {
|
|
431
476
|
if (!this.overlayStart && !this.overlayEnd) return;
|
|
432
477
|
var total = this.scroller.scrollWidth;
|
|
@@ -442,13 +487,9 @@
|
|
|
442
487
|
setVis(this.overlayEnd, false);
|
|
443
488
|
return;
|
|
444
489
|
}
|
|
445
|
-
var
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
var atStart = current <= tolerance;
|
|
449
|
-
var atEnd = current >= m - tolerance;
|
|
450
|
-
setVis(this.overlayStart, !atStart);
|
|
451
|
-
setVis(this.overlayEnd, !atEnd);
|
|
490
|
+
var metrics = this.getLiveScrollMetrics();
|
|
491
|
+
setVis(this.overlayStart, !metrics.isAtStart);
|
|
492
|
+
setVis(this.overlayEnd, !metrics.isAtEnd);
|
|
452
493
|
};
|
|
453
494
|
Slider.prototype.updateButtons = function() {
|
|
454
495
|
if (!this.btnPrev && !this.btnNext) return;
|
|
@@ -468,17 +509,13 @@
|
|
|
468
509
|
}
|
|
469
510
|
if (this.btnPrev) this.btnPrev.style.display = "";
|
|
470
511
|
if (this.btnNext) this.btnNext.style.display = "";
|
|
471
|
-
var
|
|
472
|
-
var current = this.scroller.scrollLeft;
|
|
473
|
-
var tolerance = 10;
|
|
474
|
-
var atStart = current <= tolerance;
|
|
475
|
-
var atEnd = current >= m - tolerance;
|
|
512
|
+
var metrics = this.getLiveScrollMetrics();
|
|
476
513
|
if (this.btnPrev) {
|
|
477
|
-
if (
|
|
514
|
+
if (metrics.isAtStart) this.btnPrev.classList.add("inactive");
|
|
478
515
|
else this.btnPrev.classList.remove("inactive");
|
|
479
516
|
}
|
|
480
517
|
if (this.btnNext) {
|
|
481
|
-
if (
|
|
518
|
+
if (metrics.isAtEnd) this.btnNext.classList.add("inactive");
|
|
482
519
|
else this.btnNext.classList.remove("inactive");
|
|
483
520
|
}
|
|
484
521
|
};
|
|
@@ -492,10 +529,10 @@
|
|
|
492
529
|
var avgItemWidth = total / Math.max(1, items + 2);
|
|
493
530
|
var visibleItems = Math.max(1, Math.round(visible / avgItemWidth));
|
|
494
531
|
var barWidth = Math.max(8, visibleItems / (items + 2) * trackWidth);
|
|
495
|
-
var
|
|
532
|
+
var metrics = this.getLiveScrollMetrics();
|
|
533
|
+
var maxS = Math.max(1, metrics.max);
|
|
496
534
|
var maxX = Math.max(0, trackWidth - barWidth);
|
|
497
|
-
var
|
|
498
|
-
var x = maxX * progress;
|
|
535
|
+
var x = maxX * metrics.progress;
|
|
499
536
|
return {
|
|
500
537
|
trackWidth,
|
|
501
538
|
barWidth,
|
|
@@ -522,6 +559,7 @@
|
|
|
522
559
|
this.updateScrollbar();
|
|
523
560
|
this.updateButtons();
|
|
524
561
|
this.updateOverlays();
|
|
562
|
+
this.updateSlideState(false);
|
|
525
563
|
};
|
|
526
564
|
Slider.prototype.safeClampScroll = function(x) {
|
|
527
565
|
var clamped = Math.min(Math.max(x, 0), this.maxScroll());
|
|
@@ -546,6 +584,7 @@
|
|
|
546
584
|
this.updateScrollbar();
|
|
547
585
|
this.updateButtons();
|
|
548
586
|
this.updateOverlays();
|
|
587
|
+
this.updateSlideState(false);
|
|
549
588
|
};
|
|
550
589
|
Slider.prototype.scheduleTouchClamp = function() {
|
|
551
590
|
var self = this;
|
|
@@ -554,7 +593,9 @@
|
|
|
554
593
|
self._touchClampTimer = 0;
|
|
555
594
|
var cur = self.scroller.scrollLeft;
|
|
556
595
|
var max = self.maxScroll();
|
|
557
|
-
var
|
|
596
|
+
var clientWidth = Math.max(0, self.scroller.clientWidth || 0);
|
|
597
|
+
var scrollWidth = Math.max(0, self.scroller.scrollWidth || 0);
|
|
598
|
+
var eps = self.scrollEdgeEpsilon();
|
|
558
599
|
if (!Number.isFinite(cur)) {
|
|
559
600
|
self.scroller.scrollLeft = 0;
|
|
560
601
|
} else if (cur < -eps || cur > max + eps) {
|
|
@@ -563,10 +604,15 @@
|
|
|
563
604
|
self.scroller.scrollLeft = 0;
|
|
564
605
|
} else if (cur > max) {
|
|
565
606
|
self.scroller.scrollLeft = max;
|
|
607
|
+
} else if (cur <= eps) {
|
|
608
|
+
self.scroller.scrollLeft = 0;
|
|
609
|
+
} else if (cur + clientWidth >= scrollWidth - eps) {
|
|
610
|
+
self.scroller.scrollLeft = max;
|
|
566
611
|
}
|
|
567
612
|
self.updateScrollbar();
|
|
568
613
|
self.updateButtons();
|
|
569
614
|
self.updateOverlays();
|
|
615
|
+
self.updateSlideState(false);
|
|
570
616
|
}, 90);
|
|
571
617
|
};
|
|
572
618
|
Slider.prototype.onScroll = function() {
|
|
@@ -575,6 +621,7 @@
|
|
|
575
621
|
this.updateScrollbar();
|
|
576
622
|
this.updateButtons();
|
|
577
623
|
this.updateOverlays();
|
|
624
|
+
this.updateSlideState(false);
|
|
578
625
|
this.scheduleTouchClamp();
|
|
579
626
|
return;
|
|
580
627
|
}
|
|
@@ -594,6 +641,7 @@
|
|
|
594
641
|
self.updateScrollbar();
|
|
595
642
|
self.updateButtons();
|
|
596
643
|
self.updateOverlays();
|
|
644
|
+
self.updateSlideState(false);
|
|
597
645
|
self.ticking = false;
|
|
598
646
|
});
|
|
599
647
|
};
|
|
@@ -644,6 +692,426 @@
|
|
|
644
692
|
}
|
|
645
693
|
return bestIdx;
|
|
646
694
|
};
|
|
695
|
+
Slider.prototype.getItemAnchorScrolls = function(items) {
|
|
696
|
+
var metrics = this.getLiveScrollMetrics();
|
|
697
|
+
var current = metrics.current;
|
|
698
|
+
var alignLeft = this.getAlignTargetLeft();
|
|
699
|
+
var anchors = [];
|
|
700
|
+
var last = -Infinity;
|
|
701
|
+
for (var i = 0; i < items.length; i++) {
|
|
702
|
+
var item = items[i];
|
|
703
|
+
item.setAttribute("data-rt-slider-item-index", String(i));
|
|
704
|
+
var rect = item.getBoundingClientRect();
|
|
705
|
+
var raw = current + (rect.left - alignLeft);
|
|
706
|
+
var anchor = this.safeClampScroll(raw);
|
|
707
|
+
if (anchor < last) anchor = last;
|
|
708
|
+
anchors.push(anchor);
|
|
709
|
+
last = anchor;
|
|
710
|
+
}
|
|
711
|
+
if (anchors.length) {
|
|
712
|
+
var max = this.maxScroll();
|
|
713
|
+
var eps = this.scrollEdgeEpsilon();
|
|
714
|
+
if (anchors[0] <= eps) anchors[0] = 0;
|
|
715
|
+
if (anchors[anchors.length - 1] >= max - eps)
|
|
716
|
+
anchors[anchors.length - 1] = max;
|
|
717
|
+
}
|
|
718
|
+
return anchors;
|
|
719
|
+
};
|
|
720
|
+
Slider.prototype.cloneSlideState = function(state2) {
|
|
721
|
+
if (!state2) return null;
|
|
722
|
+
return {
|
|
723
|
+
sliderId: state2.sliderId,
|
|
724
|
+
itemCount: state2.itemCount,
|
|
725
|
+
scroll: {
|
|
726
|
+
current: state2.scroll.current,
|
|
727
|
+
max: state2.scroll.max,
|
|
728
|
+
progress: state2.scroll.progress,
|
|
729
|
+
progressPercent: state2.scroll.progressPercent,
|
|
730
|
+
direction: state2.scroll.direction,
|
|
731
|
+
isAtStart: state2.scroll.isAtStart,
|
|
732
|
+
isAtEnd: state2.scroll.isAtEnd
|
|
733
|
+
},
|
|
734
|
+
active: {
|
|
735
|
+
index: state2.active.index,
|
|
736
|
+
element: state2.active.element,
|
|
737
|
+
anchorScrollLeft: state2.active.anchorScrollLeft,
|
|
738
|
+
distancePx: state2.active.distancePx
|
|
739
|
+
},
|
|
740
|
+
previous: {
|
|
741
|
+
index: state2.previous.index,
|
|
742
|
+
element: state2.previous.element
|
|
743
|
+
},
|
|
744
|
+
next: {
|
|
745
|
+
index: state2.next.index,
|
|
746
|
+
element: state2.next.element
|
|
747
|
+
},
|
|
748
|
+
segment: {
|
|
749
|
+
fromIndex: state2.segment.fromIndex,
|
|
750
|
+
fromElement: state2.segment.fromElement,
|
|
751
|
+
toIndex: state2.segment.toIndex,
|
|
752
|
+
toElement: state2.segment.toElement,
|
|
753
|
+
progress: state2.segment.progress,
|
|
754
|
+
progressPercent: state2.segment.progressPercent,
|
|
755
|
+
distancePx: state2.segment.distancePx,
|
|
756
|
+
spanPx: state2.segment.spanPx,
|
|
757
|
+
remainingPx: state2.segment.remainingPx,
|
|
758
|
+
isBetween: state2.segment.isBetween
|
|
759
|
+
},
|
|
760
|
+
slides: state2.slides.map(function(slide) {
|
|
761
|
+
return {
|
|
762
|
+
index: slide.index,
|
|
763
|
+
element: slide.element,
|
|
764
|
+
anchorScrollLeft: slide.anchorScrollLeft,
|
|
765
|
+
anchorProgress: slide.anchorProgress,
|
|
766
|
+
anchorProgressPercent: slide.anchorProgressPercent,
|
|
767
|
+
distanceFromCurrentPx: slide.distanceFromCurrentPx,
|
|
768
|
+
isActive: slide.isActive,
|
|
769
|
+
isPrevious: slide.isPrevious,
|
|
770
|
+
isNext: slide.isNext,
|
|
771
|
+
isFrom: slide.isFrom,
|
|
772
|
+
isTo: slide.isTo,
|
|
773
|
+
isBeforeActive: slide.isBeforeActive,
|
|
774
|
+
isAfterActive: slide.isAfterActive
|
|
775
|
+
};
|
|
776
|
+
})
|
|
777
|
+
};
|
|
778
|
+
};
|
|
779
|
+
Slider.prototype.cloneScrollState = function(scroll) {
|
|
780
|
+
if (!scroll) return null;
|
|
781
|
+
return {
|
|
782
|
+
current: scroll.current,
|
|
783
|
+
max: scroll.max,
|
|
784
|
+
progress: scroll.progress,
|
|
785
|
+
progressPercent: scroll.progressPercent,
|
|
786
|
+
direction: scroll.direction,
|
|
787
|
+
isAtStart: scroll.isAtStart,
|
|
788
|
+
isAtEnd: scroll.isAtEnd
|
|
789
|
+
};
|
|
790
|
+
};
|
|
791
|
+
Slider.prototype.dispatchSliderEvent = function(name, detail) {
|
|
792
|
+
var payload = this.cloneSlideState(detail);
|
|
793
|
+
try {
|
|
794
|
+
this.root.dispatchEvent(
|
|
795
|
+
new CustomEvent(name, {
|
|
796
|
+
bubbles: true,
|
|
797
|
+
detail: payload
|
|
798
|
+
})
|
|
799
|
+
);
|
|
800
|
+
} catch (e) {
|
|
801
|
+
var ev = document.createEvent("CustomEvent");
|
|
802
|
+
ev.initCustomEvent(name, true, false, payload);
|
|
803
|
+
this.root.dispatchEvent(ev);
|
|
804
|
+
}
|
|
805
|
+
};
|
|
806
|
+
Slider.prototype.dispatchProgressEvent = function(name, detail) {
|
|
807
|
+
var payload = this.cloneScrollState(detail);
|
|
808
|
+
try {
|
|
809
|
+
this.root.dispatchEvent(
|
|
810
|
+
new CustomEvent(name, {
|
|
811
|
+
bubbles: true,
|
|
812
|
+
detail: payload
|
|
813
|
+
})
|
|
814
|
+
);
|
|
815
|
+
} catch (e) {
|
|
816
|
+
var ev = document.createEvent("CustomEvent");
|
|
817
|
+
ev.initCustomEvent(name, true, false, payload);
|
|
818
|
+
this.root.dispatchEvent(ev);
|
|
819
|
+
}
|
|
820
|
+
};
|
|
821
|
+
Slider.prototype.applySlideStateAttributes = function(state2) {
|
|
822
|
+
var root = this.root;
|
|
823
|
+
root.setAttribute(
|
|
824
|
+
"data-rt-slider-active-index",
|
|
825
|
+
String(state2.active.index)
|
|
826
|
+
);
|
|
827
|
+
root.setAttribute(
|
|
828
|
+
"data-rt-slider-from-index",
|
|
829
|
+
String(state2.segment.fromIndex)
|
|
830
|
+
);
|
|
831
|
+
root.setAttribute("data-rt-slider-to-index", String(state2.segment.toIndex));
|
|
832
|
+
root.setAttribute(
|
|
833
|
+
"data-rt-slider-segment-progress",
|
|
834
|
+
String(round(state2.segment.progress, 6))
|
|
835
|
+
);
|
|
836
|
+
root.setAttribute(
|
|
837
|
+
"data-rt-slider-segment-progress-percent",
|
|
838
|
+
String(round(state2.segment.progressPercent, 4))
|
|
839
|
+
);
|
|
840
|
+
root.setAttribute(
|
|
841
|
+
"data-rt-slider-scroll-current",
|
|
842
|
+
String(round(state2.scroll.current, 4))
|
|
843
|
+
);
|
|
844
|
+
root.setAttribute(
|
|
845
|
+
"data-rt-slider-scroll-max",
|
|
846
|
+
String(round(state2.scroll.max, 4))
|
|
847
|
+
);
|
|
848
|
+
root.setAttribute(
|
|
849
|
+
"data-rt-slider-scroll-progress",
|
|
850
|
+
String(round(state2.scroll.progress, 6))
|
|
851
|
+
);
|
|
852
|
+
root.setAttribute(
|
|
853
|
+
"data-rt-slider-scroll-progress-percent",
|
|
854
|
+
String(round(state2.scroll.progressPercent, 4))
|
|
855
|
+
);
|
|
856
|
+
root.setAttribute(
|
|
857
|
+
"data-rt-slider-scroll-direction",
|
|
858
|
+
state2.scroll.direction
|
|
859
|
+
);
|
|
860
|
+
root.setAttribute(
|
|
861
|
+
"data-rt-slider-scroll-at-start",
|
|
862
|
+
state2.scroll.isAtStart ? "true" : "false"
|
|
863
|
+
);
|
|
864
|
+
root.setAttribute(
|
|
865
|
+
"data-rt-slider-scroll-at-end",
|
|
866
|
+
state2.scroll.isAtEnd ? "true" : "false"
|
|
867
|
+
);
|
|
868
|
+
for (var i = 0; i < state2.slides.length; i++) {
|
|
869
|
+
var slide = state2.slides[i];
|
|
870
|
+
var el = slide.element;
|
|
871
|
+
if (!el) continue;
|
|
872
|
+
el.setAttribute("data-rt-slider-item-index", String(slide.index));
|
|
873
|
+
el.setAttribute(
|
|
874
|
+
"data-rt-slider-item-active",
|
|
875
|
+
slide.isActive ? "true" : "false"
|
|
876
|
+
);
|
|
877
|
+
el.setAttribute(
|
|
878
|
+
"data-rt-slider-item-from",
|
|
879
|
+
slide.isFrom ? "true" : "false"
|
|
880
|
+
);
|
|
881
|
+
el.setAttribute("data-rt-slider-item-to", slide.isTo ? "true" : "false");
|
|
882
|
+
el.setAttribute(
|
|
883
|
+
"data-rt-slider-item-previous",
|
|
884
|
+
slide.isPrevious ? "true" : "false"
|
|
885
|
+
);
|
|
886
|
+
el.setAttribute(
|
|
887
|
+
"data-rt-slider-item-next",
|
|
888
|
+
slide.isNext ? "true" : "false"
|
|
889
|
+
);
|
|
890
|
+
el.setAttribute(
|
|
891
|
+
"data-rt-slider-item-before-active",
|
|
892
|
+
slide.isBeforeActive ? "true" : "false"
|
|
893
|
+
);
|
|
894
|
+
el.setAttribute(
|
|
895
|
+
"data-rt-slider-item-after-active",
|
|
896
|
+
slide.isAfterActive ? "true" : "false"
|
|
897
|
+
);
|
|
898
|
+
el.setAttribute(
|
|
899
|
+
"data-rt-slider-item-anchor-progress",
|
|
900
|
+
String(round(slide.anchorProgress, 6))
|
|
901
|
+
);
|
|
902
|
+
el.setAttribute(
|
|
903
|
+
"data-rt-slider-item-anchor-progress-percent",
|
|
904
|
+
String(round(slide.anchorProgressPercent, 4))
|
|
905
|
+
);
|
|
906
|
+
el.setAttribute(
|
|
907
|
+
"data-rt-slider-item-distance",
|
|
908
|
+
String(round(slide.distanceFromCurrentPx, 4))
|
|
909
|
+
);
|
|
910
|
+
}
|
|
911
|
+
};
|
|
912
|
+
Slider.prototype.buildSlideState = function() {
|
|
913
|
+
var items = this.getOrderedItems();
|
|
914
|
+
var metrics = this.getLiveScrollMetrics();
|
|
915
|
+
var max = metrics.max;
|
|
916
|
+
var current = metrics.current;
|
|
917
|
+
var prevScroll = this._lastSlideStateScrollLeft;
|
|
918
|
+
var scrollDirection = "none";
|
|
919
|
+
if (current > prevScroll + 0.01) scrollDirection = "forward";
|
|
920
|
+
else if (current < prevScroll - 0.01) scrollDirection = "backward";
|
|
921
|
+
if (!items.length) {
|
|
922
|
+
return {
|
|
923
|
+
sliderId: this.sliderId,
|
|
924
|
+
itemCount: 0,
|
|
925
|
+
scroll: {
|
|
926
|
+
current,
|
|
927
|
+
max,
|
|
928
|
+
progress: metrics.progress,
|
|
929
|
+
progressPercent: metrics.progressPercent,
|
|
930
|
+
direction: scrollDirection,
|
|
931
|
+
isAtStart: metrics.isAtStart,
|
|
932
|
+
isAtEnd: metrics.isAtEnd
|
|
933
|
+
},
|
|
934
|
+
active: {
|
|
935
|
+
index: -1,
|
|
936
|
+
element: null,
|
|
937
|
+
anchorScrollLeft: 0,
|
|
938
|
+
distancePx: 0
|
|
939
|
+
},
|
|
940
|
+
previous: {
|
|
941
|
+
index: -1,
|
|
942
|
+
element: null
|
|
943
|
+
},
|
|
944
|
+
next: {
|
|
945
|
+
index: -1,
|
|
946
|
+
element: null
|
|
947
|
+
},
|
|
948
|
+
segment: {
|
|
949
|
+
fromIndex: -1,
|
|
950
|
+
fromElement: null,
|
|
951
|
+
toIndex: -1,
|
|
952
|
+
toElement: null,
|
|
953
|
+
progress: 0,
|
|
954
|
+
progressPercent: 0,
|
|
955
|
+
distancePx: 0,
|
|
956
|
+
spanPx: 0,
|
|
957
|
+
remainingPx: 0,
|
|
958
|
+
isBetween: false
|
|
959
|
+
},
|
|
960
|
+
slides: []
|
|
961
|
+
};
|
|
962
|
+
}
|
|
963
|
+
var anchors = this.getItemAnchorScrolls(items);
|
|
964
|
+
var nearestIndex = 0;
|
|
965
|
+
var nearestDistance = Infinity;
|
|
966
|
+
for (var i = 0; i < anchors.length; i++) {
|
|
967
|
+
var distance = current - anchors[i];
|
|
968
|
+
var absDistance = Math.abs(distance);
|
|
969
|
+
if (absDistance < nearestDistance) {
|
|
970
|
+
nearestDistance = absDistance;
|
|
971
|
+
nearestIndex = i;
|
|
972
|
+
}
|
|
973
|
+
}
|
|
974
|
+
var fromIndex = 0;
|
|
975
|
+
var toIndex = 0;
|
|
976
|
+
var segmentProgress = 0;
|
|
977
|
+
var segmentDistance = 0;
|
|
978
|
+
var segmentSpan = 0;
|
|
979
|
+
var segmentRemaining = 0;
|
|
980
|
+
var isBetween = false;
|
|
981
|
+
if (current <= anchors[0]) {
|
|
982
|
+
fromIndex = 0;
|
|
983
|
+
toIndex = 0;
|
|
984
|
+
segmentProgress = 0;
|
|
985
|
+
segmentDistance = 0;
|
|
986
|
+
segmentSpan = 0;
|
|
987
|
+
segmentRemaining = 0;
|
|
988
|
+
isBetween = false;
|
|
989
|
+
} else if (current >= anchors[anchors.length - 1]) {
|
|
990
|
+
fromIndex = anchors.length - 1;
|
|
991
|
+
toIndex = anchors.length - 1;
|
|
992
|
+
segmentProgress = 1;
|
|
993
|
+
segmentDistance = 0;
|
|
994
|
+
segmentSpan = 0;
|
|
995
|
+
segmentRemaining = 0;
|
|
996
|
+
isBetween = false;
|
|
997
|
+
} else {
|
|
998
|
+
for (var j = 0; j < anchors.length - 1; j++) {
|
|
999
|
+
var a = anchors[j];
|
|
1000
|
+
var b = anchors[j + 1];
|
|
1001
|
+
if (current >= a && current <= b) {
|
|
1002
|
+
fromIndex = j;
|
|
1003
|
+
toIndex = j + 1;
|
|
1004
|
+
segmentSpan = Math.max(0, b - a);
|
|
1005
|
+
segmentDistance = Math.max(0, current - a);
|
|
1006
|
+
segmentProgress = segmentSpan > 0 ? clamp(segmentDistance / segmentSpan) : 0;
|
|
1007
|
+
segmentRemaining = Math.max(0, segmentSpan - segmentDistance);
|
|
1008
|
+
isBetween = current > a && current < b;
|
|
1009
|
+
break;
|
|
1010
|
+
}
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
var slides = [];
|
|
1014
|
+
for (var k = 0; k < items.length; k++) {
|
|
1015
|
+
var anchor = anchors[k];
|
|
1016
|
+
var anchorProgress = max > 0 ? clamp(anchor / max) : 0;
|
|
1017
|
+
slides.push({
|
|
1018
|
+
index: k,
|
|
1019
|
+
element: items[k],
|
|
1020
|
+
anchorScrollLeft: anchor,
|
|
1021
|
+
anchorProgress,
|
|
1022
|
+
anchorProgressPercent: anchorProgress * 100,
|
|
1023
|
+
distanceFromCurrentPx: current - anchor,
|
|
1024
|
+
isActive: k === nearestIndex,
|
|
1025
|
+
isPrevious: k === nearestIndex - 1,
|
|
1026
|
+
isNext: k === nearestIndex + 1,
|
|
1027
|
+
isFrom: k === fromIndex,
|
|
1028
|
+
isTo: k === toIndex,
|
|
1029
|
+
isBeforeActive: k < nearestIndex,
|
|
1030
|
+
isAfterActive: k > nearestIndex
|
|
1031
|
+
});
|
|
1032
|
+
}
|
|
1033
|
+
return {
|
|
1034
|
+
sliderId: this.sliderId,
|
|
1035
|
+
itemCount: items.length,
|
|
1036
|
+
scroll: {
|
|
1037
|
+
current,
|
|
1038
|
+
max,
|
|
1039
|
+
progress: metrics.progress,
|
|
1040
|
+
progressPercent: metrics.progressPercent,
|
|
1041
|
+
direction: scrollDirection,
|
|
1042
|
+
isAtStart: metrics.isAtStart,
|
|
1043
|
+
isAtEnd: metrics.isAtEnd
|
|
1044
|
+
},
|
|
1045
|
+
active: {
|
|
1046
|
+
index: nearestIndex,
|
|
1047
|
+
element: items[nearestIndex] || null,
|
|
1048
|
+
anchorScrollLeft: anchors[nearestIndex] || 0,
|
|
1049
|
+
distancePx: current - (anchors[nearestIndex] || 0)
|
|
1050
|
+
},
|
|
1051
|
+
previous: {
|
|
1052
|
+
index: nearestIndex > 0 ? nearestIndex - 1 : -1,
|
|
1053
|
+
element: nearestIndex > 0 ? items[nearestIndex - 1] : null
|
|
1054
|
+
},
|
|
1055
|
+
next: {
|
|
1056
|
+
index: nearestIndex < items.length - 1 ? nearestIndex + 1 : -1,
|
|
1057
|
+
element: nearestIndex < items.length - 1 ? items[nearestIndex + 1] : null
|
|
1058
|
+
},
|
|
1059
|
+
segment: {
|
|
1060
|
+
fromIndex,
|
|
1061
|
+
fromElement: items[fromIndex] || null,
|
|
1062
|
+
toIndex,
|
|
1063
|
+
toElement: items[toIndex] || null,
|
|
1064
|
+
progress: segmentProgress,
|
|
1065
|
+
progressPercent: segmentProgress * 100,
|
|
1066
|
+
distancePx: segmentDistance,
|
|
1067
|
+
spanPx: segmentSpan,
|
|
1068
|
+
remainingPx: segmentRemaining,
|
|
1069
|
+
isBetween
|
|
1070
|
+
},
|
|
1071
|
+
slides
|
|
1072
|
+
};
|
|
1073
|
+
};
|
|
1074
|
+
Slider.prototype.updateSlideState = function(force) {
|
|
1075
|
+
var state2 = this.buildSlideState();
|
|
1076
|
+
var prevActiveIndex = this._lastSlideStateActiveIndex;
|
|
1077
|
+
var sig = state2.active.index + "|" + state2.segment.fromIndex + "|" + state2.segment.toIndex + "|" + round(state2.segment.progress, 4) + "|" + round(state2.scroll.progress, 4) + "|" + state2.scroll.direction;
|
|
1078
|
+
var progressSig = round(state2.scroll.progress, 6) + "|" + round(state2.scroll.current, 4) + "|" + round(state2.scroll.max, 4) + "|" + state2.scroll.direction + "|" + (state2.scroll.isAtStart ? "1" : "0") + "|" + (state2.scroll.isAtEnd ? "1" : "0");
|
|
1079
|
+
this.slideState = state2;
|
|
1080
|
+
this.applySlideStateAttributes(state2);
|
|
1081
|
+
this._lastSlideStateScrollLeft = state2.scroll.current;
|
|
1082
|
+
if (force || progressSig !== this._progressSig) {
|
|
1083
|
+
this._progressSig = progressSig;
|
|
1084
|
+
this.dispatchProgressEvent("rtSlider:progress", state2.scroll);
|
|
1085
|
+
}
|
|
1086
|
+
if (force || sig !== this._slideStateSig) {
|
|
1087
|
+
this._slideStateSig = sig;
|
|
1088
|
+
this.dispatchSliderEvent("rtSlider:slide", state2);
|
|
1089
|
+
}
|
|
1090
|
+
if (force || state2.active.index !== prevActiveIndex) {
|
|
1091
|
+
this._lastSlideStateActiveIndex = state2.active.index;
|
|
1092
|
+
this.dispatchSliderEvent("rtSlider:active", state2);
|
|
1093
|
+
}
|
|
1094
|
+
};
|
|
1095
|
+
Slider.prototype.getSlideState = function() {
|
|
1096
|
+
if (!this.slideState) this.updateSlideState(true);
|
|
1097
|
+
return this.cloneSlideState(this.slideState);
|
|
1098
|
+
};
|
|
1099
|
+
Slider.prototype.getScrollState = function() {
|
|
1100
|
+
var state2 = this.getSlideState();
|
|
1101
|
+
return state2 ? this.cloneScrollState(state2.scroll) : null;
|
|
1102
|
+
};
|
|
1103
|
+
Slider.prototype.getProgress = function() {
|
|
1104
|
+
var scroll = this.getScrollState();
|
|
1105
|
+
return scroll ? scroll.progress : 0;
|
|
1106
|
+
};
|
|
1107
|
+
Slider.prototype.getActiveIndex = function() {
|
|
1108
|
+
var state2 = this.getSlideState();
|
|
1109
|
+
return state2 && state2.active ? state2.active.index : -1;
|
|
1110
|
+
};
|
|
1111
|
+
Slider.prototype.getActiveElement = function() {
|
|
1112
|
+
var state2 = this.getSlideState();
|
|
1113
|
+
return state2 && state2.active ? state2.active.element : null;
|
|
1114
|
+
};
|
|
647
1115
|
Slider.prototype.scrollAlignToItem = function(el) {
|
|
648
1116
|
if (!el) return;
|
|
649
1117
|
var total = this.scroller.scrollWidth;
|
|
@@ -972,6 +1440,7 @@
|
|
|
972
1440
|
this.updateScrollbar();
|
|
973
1441
|
this.updateButtons();
|
|
974
1442
|
this.updateOverlays();
|
|
1443
|
+
this.updateSlideState(false);
|
|
975
1444
|
this.barPointerId = null;
|
|
976
1445
|
};
|
|
977
1446
|
Slider.prototype.detectLinksInItems = function() {
|
|
@@ -1077,6 +1546,7 @@
|
|
|
1077
1546
|
this.setupCursorMode();
|
|
1078
1547
|
this.applyIOSScrollIndicatorMask();
|
|
1079
1548
|
this.applyListStyles();
|
|
1549
|
+
this.updateSlideState(true);
|
|
1080
1550
|
};
|
|
1081
1551
|
Slider.prototype.onClickCapture = function(e) {
|
|
1082
1552
|
if (!this.didDragTs) return;
|
|
@@ -1213,6 +1683,7 @@
|
|
|
1213
1683
|
self.applyListStyles();
|
|
1214
1684
|
self.setupCursorMode();
|
|
1215
1685
|
self.rafUpdate();
|
|
1686
|
+
self.updateSlideState(true);
|
|
1216
1687
|
};
|
|
1217
1688
|
if (this.mq.addEventListener)
|
|
1218
1689
|
this.mq.addEventListener("change", this._onMQ);
|
|
@@ -1225,6 +1696,7 @@
|
|
|
1225
1696
|
self.setupCursorMode();
|
|
1226
1697
|
self.applyIOSScrollIndicatorMask();
|
|
1227
1698
|
self.applyListStyles();
|
|
1699
|
+
self.updateSlideState(true);
|
|
1228
1700
|
};
|
|
1229
1701
|
img.addEventListener("load", update, { once: true });
|
|
1230
1702
|
img.addEventListener("error", update, { once: true });
|
|
@@ -1248,7 +1720,7 @@
|
|
|
1248
1720
|
if (this.mq.matches) {
|
|
1249
1721
|
loadLenis().then(function() {
|
|
1250
1722
|
self.setupLenisInstance();
|
|
1251
|
-
}).catch(function(
|
|
1723
|
+
}).catch(function() {
|
|
1252
1724
|
});
|
|
1253
1725
|
}
|
|
1254
1726
|
this.rafUpdate();
|
|
@@ -1256,10 +1728,12 @@
|
|
|
1256
1728
|
self.rafUpdate();
|
|
1257
1729
|
self.applyIOSScrollIndicatorMask();
|
|
1258
1730
|
self.applyListStyles();
|
|
1731
|
+
self.updateSlideState(true);
|
|
1259
1732
|
};
|
|
1260
1733
|
window.addEventListener("load", this._onWL);
|
|
1261
1734
|
this.setupCursorMode();
|
|
1262
1735
|
this.bindEvents();
|
|
1736
|
+
this.updateSlideState(true);
|
|
1263
1737
|
};
|
|
1264
1738
|
Slider.prototype.destroy = function() {
|
|
1265
1739
|
this.stopInertia();
|
|
@@ -1360,6 +1834,18 @@
|
|
|
1360
1834
|
get: function(id) {
|
|
1361
1835
|
return state.instances[id] || null;
|
|
1362
1836
|
},
|
|
1837
|
+
getSlideState: function(id) {
|
|
1838
|
+
var inst = state.instances[id];
|
|
1839
|
+
return inst ? inst.getSlideState() : null;
|
|
1840
|
+
},
|
|
1841
|
+
getScrollState: function(id) {
|
|
1842
|
+
var inst = state.instances[id];
|
|
1843
|
+
return inst ? inst.getScrollState() : null;
|
|
1844
|
+
},
|
|
1845
|
+
getProgress: function(id) {
|
|
1846
|
+
var inst = state.instances[id];
|
|
1847
|
+
return inst ? inst.getProgress() : 0;
|
|
1848
|
+
},
|
|
1363
1849
|
refresh: function() {
|
|
1364
1850
|
var keys = state.order;
|
|
1365
1851
|
for (var i = 0; i < keys.length; i++) {
|