@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/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! @rethink-js/rt-slider v1.1.0 | MIT */
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 m = this.maxScroll();
446
- var current = this.scroller.scrollLeft;
447
- var tolerance = 10;
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 m = this.maxScroll();
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 (atStart) this.btnPrev.classList.add("inactive");
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 (atEnd) this.btnNext.classList.add("inactive");
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 maxS = Math.max(1, total - visible);
532
+ var metrics = this.getLiveScrollMetrics();
533
+ var maxS = Math.max(1, metrics.max);
496
534
  var maxX = Math.max(0, trackWidth - barWidth);
497
- var progress = Math.min(1, Math.max(0, this.scroller.scrollLeft / maxS));
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 eps = 1;
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(e) {
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++) {