@gem-sdk/swiper 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/modules/a11y.min.mjs +1 -1
  2. package/modules/a11y.mjs +1 -1
  3. package/modules/pagination.min.mjs +1 -1
  4. package/modules/pagination.min.mjs.map +1 -1
  5. package/modules/pagination.mjs +20 -16
  6. package/package.json +3 -3
  7. package/shared/swiper-core.min.mjs +1 -1
  8. package/shared/swiper-core.min.mjs.map +1 -1
  9. package/shared/swiper-core.mjs +360 -51
  10. package/shared/update-swiper.min.mjs +1 -1
  11. package/shared/update-swiper.min.mjs.map +1 -1
  12. package/shared/update-swiper.mjs +1 -1
  13. package/shared/utils.min.mjs +1 -1
  14. package/shared/utils.min.mjs.map +1 -1
  15. package/shared/utils.mjs +1 -1
  16. package/swiper-bundle.css +1 -1
  17. package/swiper-bundle.js +381 -68
  18. package/swiper-bundle.min.css +1 -1
  19. package/swiper-bundle.min.js +2 -2
  20. package/swiper-bundle.min.js.map +1 -1
  21. package/swiper-bundle.min.mjs +1 -1
  22. package/swiper-bundle.mjs +1 -1
  23. package/swiper-effect-utils.min.mjs +1 -1
  24. package/swiper-effect-utils.mjs +1 -1
  25. package/swiper-element-bundle.js +383 -70
  26. package/swiper-element-bundle.min.js +2 -2
  27. package/swiper-element-bundle.min.js.map +1 -1
  28. package/swiper-element-bundle.min.mjs +1 -1
  29. package/swiper-element-bundle.mjs +1 -1
  30. package/swiper-element.d.ts +5 -0
  31. package/swiper-element.js +362 -53
  32. package/swiper-element.min.js +2 -2
  33. package/swiper-element.min.js.map +1 -1
  34. package/swiper-element.min.mjs +1 -1
  35. package/swiper-element.mjs +1 -1
  36. package/swiper-react.d.ts +5 -0
  37. package/swiper-react.mjs +1 -1
  38. package/swiper-vue.d.ts +9 -0
  39. package/swiper-vue.mjs +6 -2
  40. package/swiper.css +1 -1
  41. package/swiper.js +360 -51
  42. package/swiper.less +1 -1
  43. package/swiper.min.css +1 -1
  44. package/swiper.min.js +2 -2
  45. package/swiper.min.js.map +1 -1
  46. package/swiper.min.mjs +1 -1
  47. package/swiper.mjs +1 -1
  48. package/swiper.scss +1 -1
  49. package/types/swiper-class.d.ts +10 -0
  50. package/types/swiper-events.d.ts +5 -0
  51. package/types/swiper-options.d.ts +7 -0
package/swiper-react.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Swiper React 0.0.7
2
+ * Swiper React 0.0.8
3
3
  * Gem SDK - Swiper, Customized of swiper
4
4
  * https://swiperjs.com
5
5
  *
package/swiper-vue.d.ts CHANGED
@@ -118,6 +118,10 @@ declare const Swiper: DefineComponent<
118
118
  type: PropType<SwiperOptions['spaceBetween']>;
119
119
  default: undefined;
120
120
  };
121
+ isSneakPeekCenter: {
122
+ type: PropType<SwiperOptions['isSneakPeekCenter']>;
123
+ default: undefined;
124
+ };
121
125
  slidesPerView: {
122
126
  type: PropType<SwiperOptions['slidesPerView']>;
123
127
  default: undefined;
@@ -711,6 +715,11 @@ declare const Swiper: DefineComponent<
711
715
  */
712
716
  loopFix: (swiper: SwiperClass) => void;
713
717
 
718
+ /**
719
+ * Event will be fired after "loop fix dot"
720
+ */
721
+ loopFixDot: (swiper: SwiperClass) => void;
722
+
714
723
  /**
715
724
  * Event will be fired on breakpoint change
716
725
  */
package/swiper-vue.mjs CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Swiper Vue 0.0.7
2
+ * Swiper Vue 0.0.8
3
3
  * Gem SDK - Swiper, Customized of swiper
4
4
  * https://swiperjs.com
5
5
  *
@@ -220,6 +220,10 @@ const Swiper = {
220
220
  type: [Number, String],
221
221
  default: undefined
222
222
  },
223
+ isSneakPeekCenter: {
224
+ type: Boolean,
225
+ default: false
226
+ },
223
227
  slidesPerView: {
224
228
  type: [Number, String],
225
229
  default: undefined
@@ -565,7 +569,7 @@ const Swiper = {
565
569
  default: undefined
566
570
  }
567
571
  },
568
- emits: ['_beforeBreakpoint', '_containerClasses', '_slideClass', '_slideClasses', '_swiper', '_freeModeNoMomentumRelease', '_virtualUpdated', 'activeIndexChange', 'afterInit', 'autoplay', 'autoplayStart', 'autoplayStop', 'autoplayPause', 'autoplayResume', 'autoplayTimeLeft', 'beforeDestroy', 'beforeInit', 'beforeLoopFix', 'beforeResize', 'beforeSlideChangeStart', 'beforeTransitionStart', 'breakpoint', 'changeDirection', 'click', 'disable', 'doubleTap', 'doubleClick', 'destroy', 'enable', 'fromEdge', 'hashChange', 'hashSet', 'init', 'keyPress', 'lock', 'loopFix', 'momentumBounce', 'navigationHide', 'navigationShow', 'navigationPrev', 'navigationNext', 'observerUpdate', 'orientationchange', 'paginationHide', 'paginationRender', 'paginationShow', 'paginationUpdate', 'progress', 'reachBeginning', 'reachEnd', 'realIndexChange', 'resize', 'scroll', 'scrollbarDragEnd', 'scrollbarDragMove', 'scrollbarDragStart', 'setTransition', 'setTranslate', 'slidesUpdated', 'slideChange', 'slideChangeTransitionEnd', 'slideChangeTransitionStart', 'slideNextTransitionEnd', 'slideNextTransitionStart', 'slidePrevTransitionEnd', 'slidePrevTransitionStart', 'slideResetTransitionStart', 'slideResetTransitionEnd', 'sliderMove', 'sliderFirstMove', 'slidesLengthChange', 'slidesGridLengthChange', 'snapGridLengthChange', 'snapIndexChange', 'swiper', 'tap', 'toEdge', 'touchEnd', 'touchMove', 'touchMoveOpposite', 'touchStart', 'transitionEnd', 'transitionStart', 'unlock', 'update', 'virtualUpdate', 'zoomChange'],
572
+ emits: ['_beforeBreakpoint', '_containerClasses', '_slideClass', '_slideClasses', '_swiper', '_freeModeNoMomentumRelease', '_virtualUpdated', 'activeIndexChange', 'afterInit', 'autoplay', 'autoplayStart', 'autoplayStop', 'autoplayPause', 'autoplayResume', 'autoplayTimeLeft', 'beforeDestroy', 'beforeInit', 'beforeLoopFix', 'beforeResize', 'beforeSlideChangeStart', 'beforeTransitionStart', 'breakpoint', 'changeDirection', 'click', 'disable', 'doubleTap', 'doubleClick', 'destroy', 'enable', 'fromEdge', 'hashChange', 'hashSet', 'init', 'keyPress', 'lock', 'loopFix', 'loopFixDot', 'loopFixDotSneakPeek', 'momentumBounce', 'navigationHide', 'navigationShow', 'navigationPrev', 'navigationNext', 'observerUpdate', 'orientationchange', 'paginationHide', 'paginationRender', 'paginationShow', 'paginationUpdate', 'progress', 'reachBeginning', 'reachEnd', 'realIndexChange', 'resize', 'scroll', 'scrollbarDragEnd', 'scrollbarDragMove', 'scrollbarDragStart', 'setTransition', 'setTranslate', 'slidesUpdated', 'slideChange', 'slideChangeTransitionEnd', 'slideChangeTransitionStart', 'slideNextTransitionEnd', 'slideNextTransitionStart', 'slidePrevTransitionEnd', 'slidePrevTransitionStart', 'slideResetTransitionStart', 'slideResetTransitionEnd', 'sliderMove', 'sliderFirstMove', 'slidesLengthChange', 'slidesGridLengthChange', 'snapGridLengthChange', 'snapIndexChange', 'swiper', 'tap', 'toEdge', 'touchEnd', 'touchMove', 'touchMoveOpposite', 'touchStart', 'transitionEnd', 'transitionStart', 'unlock', 'update', 'virtualUpdate', 'zoomChange'],
569
573
  setup(props, _ref) {
570
574
  let {
571
575
  slots: originalSlots,
package/swiper.css CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Swiper 0.0.7
2
+ * Swiper 0.0.8
3
3
  * Gem SDK - Swiper, Customized of swiper
4
4
  * https://swiperjs.com
5
5
  *
package/swiper.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Swiper 0.0.7
2
+ * Swiper 0.0.8
3
3
  * Gem SDK - Swiper, Customized of swiper
4
4
  * https://swiperjs.com
5
5
  *
@@ -1988,56 +1988,63 @@ var Swiper = (function () {
1988
1988
  if (typeof speed === 'undefined') {
1989
1989
  speed = swiper.params.speed;
1990
1990
  }
1991
- const gridEnabled = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;
1992
1991
  let newIndex = index;
1993
1992
  if (swiper.params.loop) {
1994
- if (swiper.virtual && swiper.params.virtual.enabled) {
1995
- // eslint-disable-next-line
1996
- newIndex = newIndex + swiper.virtual.slidesBefore;
1993
+ swiper.slides;
1994
+ const totalSlides = swiper.slides.length;
1995
+ let targetSlideIndex;
1996
+ targetSlideIndex = swiper.getSlideIndexByData(newIndex);
1997
+ const cols = swiper.slides.length;
1998
+ const {
1999
+ centeredSlides
2000
+ } = swiper.params;
2001
+ let slidesPerView = swiper.params.slidesPerView;
2002
+ if (slidesPerView === 'auto') {
2003
+ slidesPerView = swiper.slidesPerViewDynamic();
1997
2004
  } else {
1998
- let targetSlideIndex;
1999
- if (gridEnabled) {
2000
- const slideIndex = newIndex * swiper.params.grid.rows;
2001
- targetSlideIndex = swiper.slides.find(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex).column;
2002
- } else {
2003
- targetSlideIndex = swiper.getSlideIndexByData(newIndex);
2004
- }
2005
- const cols = gridEnabled ? Math.ceil(swiper.slides.length / swiper.params.grid.rows) : swiper.slides.length;
2006
- const {
2007
- centeredSlides
2008
- } = swiper.params;
2009
- let slidesPerView = swiper.params.slidesPerView;
2010
- if (slidesPerView === 'auto') {
2011
- slidesPerView = swiper.slidesPerViewDynamic();
2012
- } else {
2013
- slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
2014
- if (centeredSlides && slidesPerView % 2 === 0) {
2015
- slidesPerView = slidesPerView + 1;
2016
- }
2017
- }
2018
- let needLoopFix = cols - targetSlideIndex < slidesPerView;
2019
- if (centeredSlides) {
2020
- needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2);
2021
- }
2022
- if (internal && centeredSlides && swiper.params.slidesPerView !== 'auto' && !gridEnabled) {
2023
- needLoopFix = false;
2005
+ slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
2006
+ if (centeredSlides && slidesPerView % 2 === 0) {
2007
+ slidesPerView = slidesPerView + 1;
2024
2008
  }
2025
- if (needLoopFix) {
2026
- const direction = centeredSlides ? targetSlideIndex < swiper.activeIndex ? 'prev' : 'next' : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? 'next' : 'prev';
2027
- swiper.loopFix({
2028
- direction,
2029
- slideTo: true,
2030
- activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
2031
- slideRealIndex: direction === 'next' ? swiper.realIndex : undefined
2032
- });
2033
- }
2034
- if (gridEnabled) {
2035
- const slideIndex = newIndex * swiper.params.grid.rows;
2036
- newIndex = swiper.slides.find(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex).column;
2009
+ }
2010
+ let needLoopFix = cols - targetSlideIndex < slidesPerView;
2011
+ if (centeredSlides) {
2012
+ needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2);
2013
+ }
2014
+ if (internal && centeredSlides && swiper.params.slidesPerView !== 'auto') {
2015
+ needLoopFix = false;
2016
+ }
2017
+ if (centeredSlides && needLoopFix) {
2018
+ const direction = centeredSlides ? targetSlideIndex < swiper.activeIndex ? 'prev' : 'next' : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? 'next' : 'prev';
2019
+ swiper.loopFix({
2020
+ direction,
2021
+ slideTo: true,
2022
+ activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
2023
+ slideRealIndex: direction === 'next' ? swiper.realIndex : undefined
2024
+ });
2025
+ }
2026
+ if (!centeredSlides && needLoopFix) {
2027
+ let direction;
2028
+ let nextSteps;
2029
+ let prevSteps;
2030
+ if (swiper.activeIndex < targetSlideIndex) {
2031
+ nextSteps = targetSlideIndex - swiper.activeIndex;
2032
+ prevSteps = swiper.activeIndex - (targetSlideIndex - totalSlides);
2037
2033
  } else {
2038
- newIndex = swiper.getSlideIndexByData(newIndex);
2034
+ prevSteps = swiper.activeIndex - targetSlideIndex;
2035
+ nextSteps = targetSlideIndex + totalSlides - swiper.activeIndex;
2039
2036
  }
2037
+ direction = nextSteps > prevSteps ? 'prev' : 'next';
2038
+ swiper.loopFixDot({
2039
+ direction,
2040
+ slideTo: true,
2041
+ activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
2042
+ slideRealIndex: direction === 'next' ? swiper.realIndex : undefined,
2043
+ targetSlideIndex,
2044
+ newIndex: swiper.getSlideIndexByData(newIndex)
2045
+ });
2040
2046
  }
2047
+ newIndex = swiper.getSlideIndexByData(newIndex);
2041
2048
  }
2042
2049
  requestAnimationFrame(() => {
2043
2050
  swiper.slideTo(newIndex, speed, runCallbacks, internal);
@@ -2045,6 +2052,87 @@ var Swiper = (function () {
2045
2052
  return swiper;
2046
2053
  }
2047
2054
 
2055
+ function slideToLoopCenterSneakPeek(index, speed, runCallbacks, internal) {
2056
+ if (index === void 0) {
2057
+ index = 0;
2058
+ }
2059
+ if (runCallbacks === void 0) {
2060
+ runCallbacks = true;
2061
+ }
2062
+ if (typeof index === 'string') {
2063
+ const indexAsNumber = parseInt(index, 10);
2064
+ index = indexAsNumber;
2065
+ }
2066
+ const swiper = this;
2067
+ if (swiper.destroyed) return;
2068
+ if (typeof speed === 'undefined') {
2069
+ speed = swiper.params.speed;
2070
+ }
2071
+ let newIndex = index;
2072
+ if (swiper.params.loop) {
2073
+ swiper.slides;
2074
+ const totalSlides = swiper.slides.length;
2075
+ let targetSlideIndex;
2076
+ targetSlideIndex = swiper.getSlideIndexByData(newIndex);
2077
+ const cols = swiper.slides.length;
2078
+ const {
2079
+ centeredSlides
2080
+ } = swiper.params;
2081
+ let slidesPerView = swiper.params.slidesPerView;
2082
+ if (slidesPerView === 'auto') {
2083
+ slidesPerView = swiper.slidesPerViewDynamic();
2084
+ } else {
2085
+ slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
2086
+ if (centeredSlides && slidesPerView % 2 === 0) {
2087
+ slidesPerView = slidesPerView + 1;
2088
+ }
2089
+ }
2090
+ if (internal && centeredSlides && swiper.params.slidesPerView !== 'auto') ;
2091
+ const isSneakPeekCenter = swiper.params?.isSneakPeekCenter;
2092
+ if (isSneakPeekCenter) {
2093
+ let direction;
2094
+ let nextSteps;
2095
+ let prevSteps;
2096
+ if (swiper.activeIndex < targetSlideIndex) {
2097
+ nextSteps = targetSlideIndex - swiper.activeIndex;
2098
+ prevSteps = swiper.activeIndex - (targetSlideIndex - totalSlides);
2099
+ } else {
2100
+ prevSteps = swiper.activeIndex - targetSlideIndex;
2101
+ nextSteps = targetSlideIndex + totalSlides - swiper.activeIndex;
2102
+ }
2103
+ direction = nextSteps > prevSteps ? 'prev' : 'next';
2104
+ swiper.loopFixDot({
2105
+ direction,
2106
+ slideTo: true,
2107
+ activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
2108
+ slideRealIndex: direction === 'next' ? swiper.realIndex : undefined,
2109
+ targetSlideIndex,
2110
+ newIndex: swiper.getSlideIndexByData(newIndex)
2111
+ });
2112
+ }
2113
+ newIndex = swiper.getSlideIndexByData(newIndex);
2114
+ }
2115
+ swiper.slideTo(newIndex, speed, runCallbacks, internal);
2116
+ const slides = swiper.slides;
2117
+ if (swiper.params?.isSneakPeekCenter && slides.length > 1 && swiper.activeIndex === 0) {
2118
+ const gap = Math.abs(swiper.snapGrid[1] - swiper.snapGrid[0]);
2119
+ const swiperTranslate = JSON.parse(JSON.stringify(swiper.snapGrid[1]));
2120
+
2121
+ // Move last item to first position only if active slide is the first slide
2122
+ const lastSlide = slides[slides.length - 1];
2123
+ lastSlide.swiperLoopMoveDOM = true;
2124
+ swiper.slidesEl.prepend(lastSlide);
2125
+ lastSlide.swiperLoopMoveDOM = false;
2126
+ swiper.setTransition(0);
2127
+ swiper.setTranslate(-(swiperTranslate + gap));
2128
+ swiper.recalcSlides();
2129
+ swiper.updateSlides();
2130
+ swiper.setTransition(swiper.params.speed);
2131
+ swiper.setTranslate(-swiperTranslate);
2132
+ }
2133
+ return;
2134
+ }
2135
+
2048
2136
  /* eslint no-unused-vars: "off" */
2049
2137
  function slideNext(speed, runCallbacks, internal) {
2050
2138
  if (runCallbacks === void 0) {
@@ -2069,7 +2157,7 @@ var Swiper = (function () {
2069
2157
  if (params.loop) {
2070
2158
  if (animating && !isVirtual && params.loopPreventsSliding) return false;
2071
2159
 
2072
- // Check if loop is disabled
2160
+ // Kiểm tra xem loop bị disable không
2073
2161
  const currentSlidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10));
2074
2162
  if (swiper.slides.length >= currentSlidesPerView) {
2075
2163
  swiper.loopFix({
@@ -2109,11 +2197,9 @@ var Swiper = (function () {
2109
2197
  if (typeof speed === 'undefined') {
2110
2198
  speed = swiper.params.speed;
2111
2199
  }
2112
- const isVirtual = swiper.virtual && params.virtual.enabled;
2200
+ swiper.virtual && params.virtual.enabled;
2113
2201
  if (params.loop) {
2114
- if (animating && !isVirtual && params.loopPreventsSliding) return false;
2115
-
2116
- // Check if loop is disabled
2202
+ // Kiểm tra xem loop bị disable không
2117
2203
  const currentSlidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10));
2118
2204
  if (swiper.slides.length >= currentSlidesPerView) {
2119
2205
  swiper.loopFix({
@@ -2162,7 +2248,27 @@ var Swiper = (function () {
2162
2248
  });
2163
2249
  return true;
2164
2250
  }
2165
- return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
2251
+ requestAnimationFrame(() => {
2252
+ swiper.slideTo(prevIndex, speed, runCallbacks, internal);
2253
+ const slides = swiper.slides;
2254
+ if (swiper.params?.isSneakPeekCenter && slides.length > 1 && swiper.activeIndex === 0) {
2255
+ const gap = Math.abs(swiper.snapGrid[1] - swiper.snapGrid[0]);
2256
+ const swiperTranslate = JSON.parse(JSON.stringify(swiper.snapGrid[1]));
2257
+
2258
+ // Move last item to first position only if active slide is the first slide
2259
+ const lastSlide = slides[slides.length - 1];
2260
+ lastSlide.swiperLoopMoveDOM = true;
2261
+ swiper.slidesEl.prepend(lastSlide);
2262
+ lastSlide.swiperLoopMoveDOM = false;
2263
+ swiper.setTransition(0);
2264
+ swiper.setTranslate(-(swiperTranslate + gap));
2265
+ swiper.recalcSlides();
2266
+ swiper.updateSlides();
2267
+ swiper.setTransition(swiper.params.speed);
2268
+ swiper.setTranslate(-swiperTranslate);
2269
+ }
2270
+ });
2271
+ return;
2166
2272
  }
2167
2273
 
2168
2274
  /* eslint no-unused-vars: "off" */
@@ -2251,6 +2357,7 @@ var Swiper = (function () {
2251
2357
  var slide = {
2252
2358
  slideTo,
2253
2359
  slideToLoop,
2360
+ slideToLoopCenterSneakPeek,
2254
2361
  slideNext,
2255
2362
  slidePrev,
2256
2363
  slideReset,
@@ -2338,7 +2445,7 @@ var Swiper = (function () {
2338
2445
  const swiper = this;
2339
2446
  if (!swiper.params.loop) return;
2340
2447
 
2341
- // Disable loop mode if the number of slides is less than slidesPerView
2448
+ // Disable loop mode nếu số slides ít hơn slidesPerView
2342
2449
  const currentSlidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
2343
2450
  if (swiper.slides.length < currentSlidesPerView) {
2344
2451
  console.warn('Swiper: Loop mode disabled - slides.length < slidesPerView');
@@ -2550,6 +2657,206 @@ var Swiper = (function () {
2550
2657
  swiper.emit('loopFix');
2551
2658
  }
2552
2659
 
2660
+ function loopFixDot(_temp) {
2661
+ let {
2662
+ slideRealIndex,
2663
+ slideTo = true,
2664
+ direction,
2665
+ activeSlideIndex,
2666
+ initial,
2667
+ targetSlideIndex,
2668
+ newIndex
2669
+ } = _temp === void 0 ? {} : _temp;
2670
+ const swiper = this;
2671
+ if (!swiper.params.loop) return;
2672
+
2673
+ // Disable loop mode nếu số slides ít hơn slidesPerView
2674
+ const currentSlidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
2675
+ if (swiper.slides.length < currentSlidesPerView) {
2676
+ console.warn('Swiper: Loop mode disabled - slides.length < slidesPerView');
2677
+ return;
2678
+ }
2679
+ swiper.emit('beforeLoopFix');
2680
+ const {
2681
+ slides,
2682
+ allowSlidePrev,
2683
+ allowSlideNext,
2684
+ slidesEl,
2685
+ params
2686
+ } = swiper;
2687
+ const targetData = slidesEl.children[targetSlideIndex].getAttribute('data-swiper-slide-index');
2688
+ const oldActiveData = Array.from(slidesEl.children).find(el => el.classList.contains(params.slideActiveClass)).getAttribute('data-swiper-slide-index');
2689
+ const {
2690
+ centeredSlides,
2691
+ initialSlide
2692
+ } = params;
2693
+ const swiperDataOldActiveIndex = slidesEl.children[swiper.activeIndex].getAttribute('data-swiper-slide-index');
2694
+ swiper.allowSlidePrev = true;
2695
+ swiper.allowSlideNext = true;
2696
+ let slidesPerView = params.slidesPerView;
2697
+ if (slidesPerView === 'auto') {
2698
+ slidesPerView = swiper.slidesPerViewDynamic();
2699
+ } else {
2700
+ slidesPerView = Math.ceil(parseFloat(params.slidesPerView, 10));
2701
+ if (centeredSlides && slidesPerView % 2 === 0) {
2702
+ slidesPerView = slidesPerView + 1;
2703
+ }
2704
+ }
2705
+ const slidesPerGroup = params.slidesPerGroupAuto ? slidesPerView : params.slidesPerGroup;
2706
+ let loopedSlides = centeredSlides ? Math.max(slidesPerGroup, Math.ceil(slidesPerView / 2)) : slidesPerGroup;
2707
+ if (loopedSlides % slidesPerGroup !== 0) {
2708
+ loopedSlides += slidesPerGroup - loopedSlides % slidesPerGroup;
2709
+ }
2710
+ loopedSlides += params.loopAdditionalSlides;
2711
+ swiper.loopedSlides = loopedSlides;
2712
+ if (slides.length < slidesPerView + loopedSlides || swiper.params.effect === 'cards' && slides.length < slidesPerView + loopedSlides * 2) {
2713
+ showWarning('Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled or not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters');
2714
+ }
2715
+ const isNext = direction === 'next' || !direction;
2716
+ const isPrev = direction === 'prev' || !direction;
2717
+ let numberOfSlidesNeedClone = [];
2718
+ let slidesIndex = [];
2719
+ for (let i = 0; i < slidesEl.children.length; i++) {
2720
+ slidesIndex.push(slidesEl.children[i].getAttribute('data-swiper-slide-index'));
2721
+ }
2722
+ if (isPrev) {
2723
+ for (let i = targetSlideIndex; i < slidesEl.children.length; i++) {
2724
+ numberOfSlidesNeedClone.push(i);
2725
+ }
2726
+ } else if (isNext) {
2727
+ for (let i = 0; i < slidesPerView - (slidesEl.children.length - targetSlideIndex); i++) {
2728
+ numberOfSlidesNeedClone.push(i);
2729
+ }
2730
+ }
2731
+ const cols = slides.length;
2732
+ const isInitialOverflow = initial && cols - initialSlide < slidesPerView && !centeredSlides;
2733
+ isInitialOverflow ? initialSlide : swiper.activeIndex;
2734
+ if (typeof activeSlideIndex === 'undefined') {
2735
+ activeSlideIndex = swiper.getSlideIndex(slides.find(el => el.classList.contains(params.slideActiveClass)));
2736
+ }
2737
+
2738
+ // Tạo DocumentFragment để chứa các slide clone
2739
+ const cloneFragment = document.createDocumentFragment();
2740
+
2741
+ // Clone các slide theo numberOfSlidesNeedClone (đã đảo ngược) và thêm vào fragment
2742
+ (isNext ? numberOfSlidesNeedClone : numberOfSlidesNeedClone.reverse()).forEach(index => {
2743
+ if (slides[index]) {
2744
+ const originalSlide = slides[index];
2745
+ const clonedSlide = originalSlide.cloneNode(true);
2746
+
2747
+ // Đánh dấu slide clone
2748
+ clonedSlide.setAttribute('data-swiper-clone', 'true');
2749
+ clonedSlide.classList.add('swiper-slide-clone');
2750
+
2751
+ // Thêm clone vào fragment
2752
+ cloneFragment.appendChild(clonedSlide);
2753
+ }
2754
+ });
2755
+ if (isPrev) {
2756
+ numberOfSlidesNeedClone.forEach(index => {
2757
+ const originalSlide = slides[index];
2758
+ originalSlide.swiperLoopMoveDOM = true;
2759
+ slidesEl.prepend(originalSlide);
2760
+ originalSlide.swiperLoopMoveDOM = false;
2761
+ });
2762
+ }
2763
+ if (isNext) {
2764
+ numberOfSlidesNeedClone.forEach(index => {
2765
+ const originalSlide = slides[index];
2766
+ originalSlide.swiperLoopMoveDOM = true;
2767
+ slidesEl.append(originalSlide);
2768
+ originalSlide.swiperLoopMoveDOM = false;
2769
+ });
2770
+ }
2771
+
2772
+ // Sắp xếp cloneFragment theo data-swiper-slide-index tăng dần
2773
+ const clonedSlides = Array.from(cloneFragment.children);
2774
+ clonedSlides.sort((a, b) => {
2775
+ const indexA = parseInt(a.getAttribute('data-swiper-slide-index')) || 0;
2776
+ const indexB = parseInt(b.getAttribute('data-swiper-slide-index')) || 0;
2777
+ return indexA - indexB;
2778
+ });
2779
+
2780
+ // Xóa tất cả children cũ và thêm lại theo thứ tự đã sắp xếp
2781
+ cloneFragment.innerHTML = '';
2782
+ clonedSlides.forEach(slide => {
2783
+ cloneFragment.appendChild(slide);
2784
+ });
2785
+
2786
+ // Thêm fragment vào vị trí phù hợp
2787
+ if (isPrev) {
2788
+ // Nếu là prev, thêm fragment vào cuối slidesEl
2789
+ slidesEl.appendChild(cloneFragment);
2790
+ } else if (isNext) {
2791
+ // Nếu là next, thêm fragment vào đầu slidesEl
2792
+ slidesEl.insertBefore(cloneFragment, slidesEl.firstChild);
2793
+ }
2794
+ swiper.recalcSlides();
2795
+ swiper.updateSlides();
2796
+
2797
+ // Tìm slide có data-swiper-slide-index tương ứng
2798
+ let oldActiveIndex = null;
2799
+ for (let i = 0; i < slidesEl.children.length; i++) {
2800
+ const child = slidesEl.children[i];
2801
+ if (child.getAttribute('data-swiper-slide-index') === swiperDataOldActiveIndex) {
2802
+ oldActiveIndex = i;
2803
+ break;
2804
+ }
2805
+ }
2806
+ if (slideTo && oldActiveIndex !== swiper.activeIndex) {
2807
+ swiper.slideTo(oldActiveIndex, 0);
2808
+ }
2809
+
2810
+ // Tìm vị trí slide cũ sau khi remove clone để set lại translate tạo hiệu ứng animate
2811
+ const skip = Math.min(swiper.params.slidesPerGroupSkip, newIndex);
2812
+ let snapIndex = skip + Math.floor((newIndex - skip) / swiper.params.slidesPerGroup);
2813
+ if (snapIndex >= swiper.snapGrid.length) snapIndex = swiper.snapGrid.length - 1;
2814
+ const translate = -swiper.snapGrid[snapIndex];
2815
+ if (translate === swiper.translate) {
2816
+ let oldActiveIndexAfterRemoveClone;
2817
+ for (let i = 0; i < slidesEl.children.length; i++) {
2818
+ const child = slidesEl.children[i];
2819
+ if (child.getAttribute('data-swiper-slide-index') === swiperDataOldActiveIndex) {
2820
+ oldActiveIndexAfterRemoveClone = i;
2821
+ break;
2822
+ }
2823
+ }
2824
+ const skip = Math.min(swiper.params.slidesPerGroupSkip, oldActiveIndexAfterRemoveClone);
2825
+ let snapIndex = skip + Math.floor((oldActiveIndexAfterRemoveClone - skip) / swiper.params.slidesPerGroup);
2826
+ if (snapIndex >= swiper.snapGrid.length) snapIndex = swiper.snapGrid.length - 1;
2827
+ const oldTranslate = -swiper.snapGrid[snapIndex];
2828
+ let updateTranslate;
2829
+ if (oldTranslate === swiper.translate) {
2830
+ updateTranslate = swiper.snapGrid[snapIndex > 0 ? snapIndex - 1 : swiper.snapGrid.length - 1];
2831
+ } else {
2832
+ updateTranslate = oldTranslate;
2833
+ }
2834
+ swiper.setTranslate(updateTranslate);
2835
+ }
2836
+ // Remove slide clone ra khỏi slidesEl sau khi slideTo hoàn thành
2837
+ const cloneSlides = slidesEl.querySelectorAll('[data-swiper-clone="true"]');
2838
+ cloneSlides.forEach(cloneSlide => {
2839
+ if (cloneSlide.parentNode) {
2840
+ cloneSlide.parentNode.removeChild(cloneSlide);
2841
+ }
2842
+ });
2843
+ swiper.recalcSlides();
2844
+ swiper.updateSlides();
2845
+ const targetDataIndex = Array.from(slidesEl.children).findIndex(el => el.getAttribute('data-swiper-slide-index') * 1 === targetData * 1);
2846
+ const oldDataIndex = Array.from(slidesEl.children).findIndex(el => el.getAttribute('data-swiper-slide-index') * 1 === oldActiveData * 1);
2847
+ const snapIndexNew = skip + Math.floor((targetDataIndex - skip) / swiper.params.slidesPerGroup);
2848
+ const snapIndexOld = skip + Math.floor((oldDataIndex - skip) / swiper.params.slidesPerGroup);
2849
+ if (slideTo && snapIndexNew === targetDataIndex) {
2850
+ const translateOld = -swiper.snapGrid[snapIndexOld > swiper.snapGrid.length - 1 ? snapIndexNew - 1 > swiper.snapGrid.length - 1 ? 0 : snapIndexNew - 1 : snapIndexOld];
2851
+ swiper.setTranslate(translateOld);
2852
+ }
2853
+ swiper.recalcSlides();
2854
+ swiper.updateSlides();
2855
+ swiper.allowSlidePrev = allowSlidePrev;
2856
+ swiper.allowSlideNext = allowSlideNext;
2857
+ swiper.emit('loopFixDot');
2858
+ }
2859
+
2553
2860
  function loopDestroy() {
2554
2861
  const swiper = this;
2555
2862
  const {
@@ -2576,6 +2883,7 @@ var Swiper = (function () {
2576
2883
  var loop = {
2577
2884
  loopCreate,
2578
2885
  loopFix,
2886
+ loopFixDot,
2579
2887
  loopDestroy
2580
2888
  };
2581
2889
 
@@ -3711,6 +4019,7 @@ var Swiper = (function () {
3711
4019
  loopAddBlankSlides: true,
3712
4020
  loopAdditionalSlides: 0,
3713
4021
  loopPreventsSliding: true,
4022
+ isSneakPeekCenter: false,
3714
4023
  // rewind
3715
4024
  rewind: false,
3716
4025
  // Swiping/no swiping
package/swiper.less CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Swiper 0.0.7
2
+ * Swiper 0.0.8
3
3
  * Gem SDK - Swiper, Customized of swiper
4
4
  * https://swiperjs.com
5
5
  *
package/swiper.min.css CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Swiper 0.0.7
2
+ * Swiper 0.0.8
3
3
  * Gem SDK - Swiper, Customized of swiper
4
4
  * https://swiperjs.com
5
5
  *