@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.
- package/modules/a11y.min.mjs +1 -1
- package/modules/a11y.mjs +1 -1
- package/modules/pagination.min.mjs +1 -1
- package/modules/pagination.min.mjs.map +1 -1
- package/modules/pagination.mjs +20 -16
- package/package.json +3 -3
- package/shared/swiper-core.min.mjs +1 -1
- package/shared/swiper-core.min.mjs.map +1 -1
- package/shared/swiper-core.mjs +360 -51
- package/shared/update-swiper.min.mjs +1 -1
- package/shared/update-swiper.min.mjs.map +1 -1
- package/shared/update-swiper.mjs +1 -1
- package/shared/utils.min.mjs +1 -1
- package/shared/utils.min.mjs.map +1 -1
- package/shared/utils.mjs +1 -1
- package/swiper-bundle.css +1 -1
- package/swiper-bundle.js +381 -68
- package/swiper-bundle.min.css +1 -1
- package/swiper-bundle.min.js +2 -2
- package/swiper-bundle.min.js.map +1 -1
- package/swiper-bundle.min.mjs +1 -1
- package/swiper-bundle.mjs +1 -1
- package/swiper-effect-utils.min.mjs +1 -1
- package/swiper-effect-utils.mjs +1 -1
- package/swiper-element-bundle.js +383 -70
- package/swiper-element-bundle.min.js +2 -2
- package/swiper-element-bundle.min.js.map +1 -1
- package/swiper-element-bundle.min.mjs +1 -1
- package/swiper-element-bundle.mjs +1 -1
- package/swiper-element.d.ts +5 -0
- package/swiper-element.js +362 -53
- package/swiper-element.min.js +2 -2
- package/swiper-element.min.js.map +1 -1
- package/swiper-element.min.mjs +1 -1
- package/swiper-element.mjs +1 -1
- package/swiper-react.d.ts +5 -0
- package/swiper-react.mjs +1 -1
- package/swiper-vue.d.ts +9 -0
- package/swiper-vue.mjs +6 -2
- package/swiper.css +1 -1
- package/swiper.js +360 -51
- package/swiper.less +1 -1
- package/swiper.min.css +1 -1
- package/swiper.min.js +2 -2
- package/swiper.min.js.map +1 -1
- package/swiper.min.mjs +1 -1
- package/swiper.mjs +1 -1
- package/swiper.scss +1 -1
- package/types/swiper-class.d.ts +10 -0
- package/types/swiper-events.d.ts +5 -0
- package/types/swiper-options.d.ts +7 -0
package/swiper-react.mjs
CHANGED
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.
|
|
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
package/swiper.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Swiper 0.0.
|
|
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
|
-
|
|
1995
|
-
|
|
1996
|
-
|
|
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
|
-
|
|
1999
|
-
if (
|
|
2000
|
-
|
|
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
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
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
|
-
|
|
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
|
-
//
|
|
2160
|
+
// Kiểm tra xem loop có 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
|
-
|
|
2200
|
+
swiper.virtual && params.virtual.enabled;
|
|
2113
2201
|
if (params.loop) {
|
|
2114
|
-
|
|
2115
|
-
|
|
2116
|
-
// Check if loop is disabled
|
|
2202
|
+
// Kiểm tra xem loop có 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
|
-
|
|
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
|
|
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
package/swiper.min.css
CHANGED