@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-bundle.min.mjs
CHANGED
package/swiper-bundle.mjs
CHANGED
package/swiper-effect-utils.mjs
CHANGED
package/swiper-element-bundle.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Swiper Custom Element 0.0.
|
|
2
|
+
* Swiper Custom Element 0.0.8
|
|
3
3
|
* Gem SDK - Swiper, Customized of swiper
|
|
4
4
|
* https://swiperjs.com
|
|
5
5
|
*
|
|
@@ -2038,56 +2038,63 @@
|
|
|
2038
2038
|
if (typeof speed === 'undefined') {
|
|
2039
2039
|
speed = swiper.params.speed;
|
|
2040
2040
|
}
|
|
2041
|
-
const gridEnabled = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;
|
|
2042
2041
|
let newIndex = index;
|
|
2043
2042
|
if (swiper.params.loop) {
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2043
|
+
swiper.slides;
|
|
2044
|
+
const totalSlides = swiper.slides.length;
|
|
2045
|
+
let targetSlideIndex;
|
|
2046
|
+
targetSlideIndex = swiper.getSlideIndexByData(newIndex);
|
|
2047
|
+
const cols = swiper.slides.length;
|
|
2048
|
+
const {
|
|
2049
|
+
centeredSlides
|
|
2050
|
+
} = swiper.params;
|
|
2051
|
+
let slidesPerView = swiper.params.slidesPerView;
|
|
2052
|
+
if (slidesPerView === 'auto') {
|
|
2053
|
+
slidesPerView = swiper.slidesPerViewDynamic();
|
|
2047
2054
|
} else {
|
|
2048
|
-
|
|
2049
|
-
if (
|
|
2050
|
-
|
|
2051
|
-
targetSlideIndex = swiper.slides.find(slideEl => slideEl.getAttribute('data-swiper-slide-index') * 1 === slideIndex).column;
|
|
2052
|
-
} else {
|
|
2053
|
-
targetSlideIndex = swiper.getSlideIndexByData(newIndex);
|
|
2054
|
-
}
|
|
2055
|
-
const cols = gridEnabled ? Math.ceil(swiper.slides.length / swiper.params.grid.rows) : swiper.slides.length;
|
|
2056
|
-
const {
|
|
2057
|
-
centeredSlides
|
|
2058
|
-
} = swiper.params;
|
|
2059
|
-
let slidesPerView = swiper.params.slidesPerView;
|
|
2060
|
-
if (slidesPerView === 'auto') {
|
|
2061
|
-
slidesPerView = swiper.slidesPerViewDynamic();
|
|
2062
|
-
} else {
|
|
2063
|
-
slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
|
|
2064
|
-
if (centeredSlides && slidesPerView % 2 === 0) {
|
|
2065
|
-
slidesPerView = slidesPerView + 1;
|
|
2066
|
-
}
|
|
2067
|
-
}
|
|
2068
|
-
let needLoopFix = cols - targetSlideIndex < slidesPerView;
|
|
2069
|
-
if (centeredSlides) {
|
|
2070
|
-
needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2);
|
|
2071
|
-
}
|
|
2072
|
-
if (internal && centeredSlides && swiper.params.slidesPerView !== 'auto' && !gridEnabled) {
|
|
2073
|
-
needLoopFix = false;
|
|
2074
|
-
}
|
|
2075
|
-
if (needLoopFix) {
|
|
2076
|
-
const direction = centeredSlides ? targetSlideIndex < swiper.activeIndex ? 'prev' : 'next' : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? 'next' : 'prev';
|
|
2077
|
-
swiper.loopFix({
|
|
2078
|
-
direction,
|
|
2079
|
-
slideTo: true,
|
|
2080
|
-
activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
|
|
2081
|
-
slideRealIndex: direction === 'next' ? swiper.realIndex : undefined
|
|
2082
|
-
});
|
|
2055
|
+
slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
|
|
2056
|
+
if (centeredSlides && slidesPerView % 2 === 0) {
|
|
2057
|
+
slidesPerView = slidesPerView + 1;
|
|
2083
2058
|
}
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2059
|
+
}
|
|
2060
|
+
let needLoopFix = cols - targetSlideIndex < slidesPerView;
|
|
2061
|
+
if (centeredSlides) {
|
|
2062
|
+
needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2);
|
|
2063
|
+
}
|
|
2064
|
+
if (internal && centeredSlides && swiper.params.slidesPerView !== 'auto') {
|
|
2065
|
+
needLoopFix = false;
|
|
2066
|
+
}
|
|
2067
|
+
if (centeredSlides && needLoopFix) {
|
|
2068
|
+
const direction = centeredSlides ? targetSlideIndex < swiper.activeIndex ? 'prev' : 'next' : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? 'next' : 'prev';
|
|
2069
|
+
swiper.loopFix({
|
|
2070
|
+
direction,
|
|
2071
|
+
slideTo: true,
|
|
2072
|
+
activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
|
|
2073
|
+
slideRealIndex: direction === 'next' ? swiper.realIndex : undefined
|
|
2074
|
+
});
|
|
2075
|
+
}
|
|
2076
|
+
if (!centeredSlides && needLoopFix) {
|
|
2077
|
+
let direction;
|
|
2078
|
+
let nextSteps;
|
|
2079
|
+
let prevSteps;
|
|
2080
|
+
if (swiper.activeIndex < targetSlideIndex) {
|
|
2081
|
+
nextSteps = targetSlideIndex - swiper.activeIndex;
|
|
2082
|
+
prevSteps = swiper.activeIndex - (targetSlideIndex - totalSlides);
|
|
2087
2083
|
} else {
|
|
2088
|
-
|
|
2089
|
-
|
|
2084
|
+
prevSteps = swiper.activeIndex - targetSlideIndex;
|
|
2085
|
+
nextSteps = targetSlideIndex + totalSlides - swiper.activeIndex;
|
|
2086
|
+
}
|
|
2087
|
+
direction = nextSteps > prevSteps ? 'prev' : 'next';
|
|
2088
|
+
swiper.loopFixDot({
|
|
2089
|
+
direction,
|
|
2090
|
+
slideTo: true,
|
|
2091
|
+
activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
|
|
2092
|
+
slideRealIndex: direction === 'next' ? swiper.realIndex : undefined,
|
|
2093
|
+
targetSlideIndex,
|
|
2094
|
+
newIndex: swiper.getSlideIndexByData(newIndex)
|
|
2095
|
+
});
|
|
2090
2096
|
}
|
|
2097
|
+
newIndex = swiper.getSlideIndexByData(newIndex);
|
|
2091
2098
|
}
|
|
2092
2099
|
requestAnimationFrame(() => {
|
|
2093
2100
|
swiper.slideTo(newIndex, speed, runCallbacks, internal);
|
|
@@ -2095,6 +2102,87 @@
|
|
|
2095
2102
|
return swiper;
|
|
2096
2103
|
}
|
|
2097
2104
|
|
|
2105
|
+
function slideToLoopCenterSneakPeek(index, speed, runCallbacks, internal) {
|
|
2106
|
+
if (index === void 0) {
|
|
2107
|
+
index = 0;
|
|
2108
|
+
}
|
|
2109
|
+
if (runCallbacks === void 0) {
|
|
2110
|
+
runCallbacks = true;
|
|
2111
|
+
}
|
|
2112
|
+
if (typeof index === 'string') {
|
|
2113
|
+
const indexAsNumber = parseInt(index, 10);
|
|
2114
|
+
index = indexAsNumber;
|
|
2115
|
+
}
|
|
2116
|
+
const swiper = this;
|
|
2117
|
+
if (swiper.destroyed) return;
|
|
2118
|
+
if (typeof speed === 'undefined') {
|
|
2119
|
+
speed = swiper.params.speed;
|
|
2120
|
+
}
|
|
2121
|
+
let newIndex = index;
|
|
2122
|
+
if (swiper.params.loop) {
|
|
2123
|
+
swiper.slides;
|
|
2124
|
+
const totalSlides = swiper.slides.length;
|
|
2125
|
+
let targetSlideIndex;
|
|
2126
|
+
targetSlideIndex = swiper.getSlideIndexByData(newIndex);
|
|
2127
|
+
const cols = swiper.slides.length;
|
|
2128
|
+
const {
|
|
2129
|
+
centeredSlides
|
|
2130
|
+
} = swiper.params;
|
|
2131
|
+
let slidesPerView = swiper.params.slidesPerView;
|
|
2132
|
+
if (slidesPerView === 'auto') {
|
|
2133
|
+
slidesPerView = swiper.slidesPerViewDynamic();
|
|
2134
|
+
} else {
|
|
2135
|
+
slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
|
|
2136
|
+
if (centeredSlides && slidesPerView % 2 === 0) {
|
|
2137
|
+
slidesPerView = slidesPerView + 1;
|
|
2138
|
+
}
|
|
2139
|
+
}
|
|
2140
|
+
if (internal && centeredSlides && swiper.params.slidesPerView !== 'auto') ;
|
|
2141
|
+
const isSneakPeekCenter = swiper.params?.isSneakPeekCenter;
|
|
2142
|
+
if (isSneakPeekCenter) {
|
|
2143
|
+
let direction;
|
|
2144
|
+
let nextSteps;
|
|
2145
|
+
let prevSteps;
|
|
2146
|
+
if (swiper.activeIndex < targetSlideIndex) {
|
|
2147
|
+
nextSteps = targetSlideIndex - swiper.activeIndex;
|
|
2148
|
+
prevSteps = swiper.activeIndex - (targetSlideIndex - totalSlides);
|
|
2149
|
+
} else {
|
|
2150
|
+
prevSteps = swiper.activeIndex - targetSlideIndex;
|
|
2151
|
+
nextSteps = targetSlideIndex + totalSlides - swiper.activeIndex;
|
|
2152
|
+
}
|
|
2153
|
+
direction = nextSteps > prevSteps ? 'prev' : 'next';
|
|
2154
|
+
swiper.loopFixDot({
|
|
2155
|
+
direction,
|
|
2156
|
+
slideTo: true,
|
|
2157
|
+
activeSlideIndex: direction === 'next' ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
|
|
2158
|
+
slideRealIndex: direction === 'next' ? swiper.realIndex : undefined,
|
|
2159
|
+
targetSlideIndex,
|
|
2160
|
+
newIndex: swiper.getSlideIndexByData(newIndex)
|
|
2161
|
+
});
|
|
2162
|
+
}
|
|
2163
|
+
newIndex = swiper.getSlideIndexByData(newIndex);
|
|
2164
|
+
}
|
|
2165
|
+
swiper.slideTo(newIndex, speed, runCallbacks, internal);
|
|
2166
|
+
const slides = swiper.slides;
|
|
2167
|
+
if (swiper.params?.isSneakPeekCenter && slides.length > 1 && swiper.activeIndex === 0) {
|
|
2168
|
+
const gap = Math.abs(swiper.snapGrid[1] - swiper.snapGrid[0]);
|
|
2169
|
+
const swiperTranslate = JSON.parse(JSON.stringify(swiper.snapGrid[1]));
|
|
2170
|
+
|
|
2171
|
+
// Move last item to first position only if active slide is the first slide
|
|
2172
|
+
const lastSlide = slides[slides.length - 1];
|
|
2173
|
+
lastSlide.swiperLoopMoveDOM = true;
|
|
2174
|
+
swiper.slidesEl.prepend(lastSlide);
|
|
2175
|
+
lastSlide.swiperLoopMoveDOM = false;
|
|
2176
|
+
swiper.setTransition(0);
|
|
2177
|
+
swiper.setTranslate(-(swiperTranslate + gap));
|
|
2178
|
+
swiper.recalcSlides();
|
|
2179
|
+
swiper.updateSlides();
|
|
2180
|
+
swiper.setTransition(swiper.params.speed);
|
|
2181
|
+
swiper.setTranslate(-swiperTranslate);
|
|
2182
|
+
}
|
|
2183
|
+
return;
|
|
2184
|
+
}
|
|
2185
|
+
|
|
2098
2186
|
/* eslint no-unused-vars: "off" */
|
|
2099
2187
|
function slideNext(speed, runCallbacks, internal) {
|
|
2100
2188
|
if (runCallbacks === void 0) {
|
|
@@ -2119,7 +2207,7 @@
|
|
|
2119
2207
|
if (params.loop) {
|
|
2120
2208
|
if (animating && !isVirtual && params.loopPreventsSliding) return false;
|
|
2121
2209
|
|
|
2122
|
-
//
|
|
2210
|
+
// Kiểm tra xem loop có bị disable không
|
|
2123
2211
|
const currentSlidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10));
|
|
2124
2212
|
if (swiper.slides.length >= currentSlidesPerView) {
|
|
2125
2213
|
swiper.loopFix({
|
|
@@ -2159,11 +2247,9 @@
|
|
|
2159
2247
|
if (typeof speed === 'undefined') {
|
|
2160
2248
|
speed = swiper.params.speed;
|
|
2161
2249
|
}
|
|
2162
|
-
|
|
2250
|
+
swiper.virtual && params.virtual.enabled;
|
|
2163
2251
|
if (params.loop) {
|
|
2164
|
-
|
|
2165
|
-
|
|
2166
|
-
// Check if loop is disabled
|
|
2252
|
+
// Kiểm tra xem loop có bị disable không
|
|
2167
2253
|
const currentSlidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10));
|
|
2168
2254
|
if (swiper.slides.length >= currentSlidesPerView) {
|
|
2169
2255
|
swiper.loopFix({
|
|
@@ -2212,7 +2298,27 @@
|
|
|
2212
2298
|
});
|
|
2213
2299
|
return true;
|
|
2214
2300
|
}
|
|
2215
|
-
|
|
2301
|
+
requestAnimationFrame(() => {
|
|
2302
|
+
swiper.slideTo(prevIndex, speed, runCallbacks, internal);
|
|
2303
|
+
const slides = swiper.slides;
|
|
2304
|
+
if (swiper.params?.isSneakPeekCenter && slides.length > 1 && swiper.activeIndex === 0) {
|
|
2305
|
+
const gap = Math.abs(swiper.snapGrid[1] - swiper.snapGrid[0]);
|
|
2306
|
+
const swiperTranslate = JSON.parse(JSON.stringify(swiper.snapGrid[1]));
|
|
2307
|
+
|
|
2308
|
+
// Move last item to first position only if active slide is the first slide
|
|
2309
|
+
const lastSlide = slides[slides.length - 1];
|
|
2310
|
+
lastSlide.swiperLoopMoveDOM = true;
|
|
2311
|
+
swiper.slidesEl.prepend(lastSlide);
|
|
2312
|
+
lastSlide.swiperLoopMoveDOM = false;
|
|
2313
|
+
swiper.setTransition(0);
|
|
2314
|
+
swiper.setTranslate(-(swiperTranslate + gap));
|
|
2315
|
+
swiper.recalcSlides();
|
|
2316
|
+
swiper.updateSlides();
|
|
2317
|
+
swiper.setTransition(swiper.params.speed);
|
|
2318
|
+
swiper.setTranslate(-swiperTranslate);
|
|
2319
|
+
}
|
|
2320
|
+
});
|
|
2321
|
+
return;
|
|
2216
2322
|
}
|
|
2217
2323
|
|
|
2218
2324
|
/* eslint no-unused-vars: "off" */
|
|
@@ -2301,6 +2407,7 @@
|
|
|
2301
2407
|
var slide = {
|
|
2302
2408
|
slideTo,
|
|
2303
2409
|
slideToLoop,
|
|
2410
|
+
slideToLoopCenterSneakPeek,
|
|
2304
2411
|
slideNext,
|
|
2305
2412
|
slidePrev,
|
|
2306
2413
|
slideReset,
|
|
@@ -2388,7 +2495,7 @@
|
|
|
2388
2495
|
const swiper = this;
|
|
2389
2496
|
if (!swiper.params.loop) return;
|
|
2390
2497
|
|
|
2391
|
-
// Disable loop mode
|
|
2498
|
+
// Disable loop mode nếu số slides ít hơn slidesPerView
|
|
2392
2499
|
const currentSlidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
|
|
2393
2500
|
if (swiper.slides.length < currentSlidesPerView) {
|
|
2394
2501
|
console.warn('Swiper: Loop mode disabled - slides.length < slidesPerView');
|
|
@@ -2600,6 +2707,206 @@
|
|
|
2600
2707
|
swiper.emit('loopFix');
|
|
2601
2708
|
}
|
|
2602
2709
|
|
|
2710
|
+
function loopFixDot(_temp) {
|
|
2711
|
+
let {
|
|
2712
|
+
slideRealIndex,
|
|
2713
|
+
slideTo = true,
|
|
2714
|
+
direction,
|
|
2715
|
+
activeSlideIndex,
|
|
2716
|
+
initial,
|
|
2717
|
+
targetSlideIndex,
|
|
2718
|
+
newIndex
|
|
2719
|
+
} = _temp === void 0 ? {} : _temp;
|
|
2720
|
+
const swiper = this;
|
|
2721
|
+
if (!swiper.params.loop) return;
|
|
2722
|
+
|
|
2723
|
+
// Disable loop mode nếu số slides ít hơn slidesPerView
|
|
2724
|
+
const currentSlidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
|
|
2725
|
+
if (swiper.slides.length < currentSlidesPerView) {
|
|
2726
|
+
console.warn('Swiper: Loop mode disabled - slides.length < slidesPerView');
|
|
2727
|
+
return;
|
|
2728
|
+
}
|
|
2729
|
+
swiper.emit('beforeLoopFix');
|
|
2730
|
+
const {
|
|
2731
|
+
slides,
|
|
2732
|
+
allowSlidePrev,
|
|
2733
|
+
allowSlideNext,
|
|
2734
|
+
slidesEl,
|
|
2735
|
+
params
|
|
2736
|
+
} = swiper;
|
|
2737
|
+
const targetData = slidesEl.children[targetSlideIndex].getAttribute('data-swiper-slide-index');
|
|
2738
|
+
const oldActiveData = Array.from(slidesEl.children).find(el => el.classList.contains(params.slideActiveClass)).getAttribute('data-swiper-slide-index');
|
|
2739
|
+
const {
|
|
2740
|
+
centeredSlides,
|
|
2741
|
+
initialSlide
|
|
2742
|
+
} = params;
|
|
2743
|
+
const swiperDataOldActiveIndex = slidesEl.children[swiper.activeIndex].getAttribute('data-swiper-slide-index');
|
|
2744
|
+
swiper.allowSlidePrev = true;
|
|
2745
|
+
swiper.allowSlideNext = true;
|
|
2746
|
+
let slidesPerView = params.slidesPerView;
|
|
2747
|
+
if (slidesPerView === 'auto') {
|
|
2748
|
+
slidesPerView = swiper.slidesPerViewDynamic();
|
|
2749
|
+
} else {
|
|
2750
|
+
slidesPerView = Math.ceil(parseFloat(params.slidesPerView, 10));
|
|
2751
|
+
if (centeredSlides && slidesPerView % 2 === 0) {
|
|
2752
|
+
slidesPerView = slidesPerView + 1;
|
|
2753
|
+
}
|
|
2754
|
+
}
|
|
2755
|
+
const slidesPerGroup = params.slidesPerGroupAuto ? slidesPerView : params.slidesPerGroup;
|
|
2756
|
+
let loopedSlides = centeredSlides ? Math.max(slidesPerGroup, Math.ceil(slidesPerView / 2)) : slidesPerGroup;
|
|
2757
|
+
if (loopedSlides % slidesPerGroup !== 0) {
|
|
2758
|
+
loopedSlides += slidesPerGroup - loopedSlides % slidesPerGroup;
|
|
2759
|
+
}
|
|
2760
|
+
loopedSlides += params.loopAdditionalSlides;
|
|
2761
|
+
swiper.loopedSlides = loopedSlides;
|
|
2762
|
+
if (slides.length < slidesPerView + loopedSlides || swiper.params.effect === 'cards' && slides.length < slidesPerView + loopedSlides * 2) {
|
|
2763
|
+
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');
|
|
2764
|
+
}
|
|
2765
|
+
const isNext = direction === 'next' || !direction;
|
|
2766
|
+
const isPrev = direction === 'prev' || !direction;
|
|
2767
|
+
let numberOfSlidesNeedClone = [];
|
|
2768
|
+
let slidesIndex = [];
|
|
2769
|
+
for (let i = 0; i < slidesEl.children.length; i++) {
|
|
2770
|
+
slidesIndex.push(slidesEl.children[i].getAttribute('data-swiper-slide-index'));
|
|
2771
|
+
}
|
|
2772
|
+
if (isPrev) {
|
|
2773
|
+
for (let i = targetSlideIndex; i < slidesEl.children.length; i++) {
|
|
2774
|
+
numberOfSlidesNeedClone.push(i);
|
|
2775
|
+
}
|
|
2776
|
+
} else if (isNext) {
|
|
2777
|
+
for (let i = 0; i < slidesPerView - (slidesEl.children.length - targetSlideIndex); i++) {
|
|
2778
|
+
numberOfSlidesNeedClone.push(i);
|
|
2779
|
+
}
|
|
2780
|
+
}
|
|
2781
|
+
const cols = slides.length;
|
|
2782
|
+
const isInitialOverflow = initial && cols - initialSlide < slidesPerView && !centeredSlides;
|
|
2783
|
+
isInitialOverflow ? initialSlide : swiper.activeIndex;
|
|
2784
|
+
if (typeof activeSlideIndex === 'undefined') {
|
|
2785
|
+
activeSlideIndex = swiper.getSlideIndex(slides.find(el => el.classList.contains(params.slideActiveClass)));
|
|
2786
|
+
}
|
|
2787
|
+
|
|
2788
|
+
// Tạo DocumentFragment để chứa các slide clone
|
|
2789
|
+
const cloneFragment = document.createDocumentFragment();
|
|
2790
|
+
|
|
2791
|
+
// Clone các slide theo numberOfSlidesNeedClone (đã đảo ngược) và thêm vào fragment
|
|
2792
|
+
(isNext ? numberOfSlidesNeedClone : numberOfSlidesNeedClone.reverse()).forEach(index => {
|
|
2793
|
+
if (slides[index]) {
|
|
2794
|
+
const originalSlide = slides[index];
|
|
2795
|
+
const clonedSlide = originalSlide.cloneNode(true);
|
|
2796
|
+
|
|
2797
|
+
// Đánh dấu slide clone
|
|
2798
|
+
clonedSlide.setAttribute('data-swiper-clone', 'true');
|
|
2799
|
+
clonedSlide.classList.add('swiper-slide-clone');
|
|
2800
|
+
|
|
2801
|
+
// Thêm clone vào fragment
|
|
2802
|
+
cloneFragment.appendChild(clonedSlide);
|
|
2803
|
+
}
|
|
2804
|
+
});
|
|
2805
|
+
if (isPrev) {
|
|
2806
|
+
numberOfSlidesNeedClone.forEach(index => {
|
|
2807
|
+
const originalSlide = slides[index];
|
|
2808
|
+
originalSlide.swiperLoopMoveDOM = true;
|
|
2809
|
+
slidesEl.prepend(originalSlide);
|
|
2810
|
+
originalSlide.swiperLoopMoveDOM = false;
|
|
2811
|
+
});
|
|
2812
|
+
}
|
|
2813
|
+
if (isNext) {
|
|
2814
|
+
numberOfSlidesNeedClone.forEach(index => {
|
|
2815
|
+
const originalSlide = slides[index];
|
|
2816
|
+
originalSlide.swiperLoopMoveDOM = true;
|
|
2817
|
+
slidesEl.append(originalSlide);
|
|
2818
|
+
originalSlide.swiperLoopMoveDOM = false;
|
|
2819
|
+
});
|
|
2820
|
+
}
|
|
2821
|
+
|
|
2822
|
+
// Sắp xếp cloneFragment theo data-swiper-slide-index tăng dần
|
|
2823
|
+
const clonedSlides = Array.from(cloneFragment.children);
|
|
2824
|
+
clonedSlides.sort((a, b) => {
|
|
2825
|
+
const indexA = parseInt(a.getAttribute('data-swiper-slide-index')) || 0;
|
|
2826
|
+
const indexB = parseInt(b.getAttribute('data-swiper-slide-index')) || 0;
|
|
2827
|
+
return indexA - indexB;
|
|
2828
|
+
});
|
|
2829
|
+
|
|
2830
|
+
// Xóa tất cả children cũ và thêm lại theo thứ tự đã sắp xếp
|
|
2831
|
+
cloneFragment.innerHTML = '';
|
|
2832
|
+
clonedSlides.forEach(slide => {
|
|
2833
|
+
cloneFragment.appendChild(slide);
|
|
2834
|
+
});
|
|
2835
|
+
|
|
2836
|
+
// Thêm fragment vào vị trí phù hợp
|
|
2837
|
+
if (isPrev) {
|
|
2838
|
+
// Nếu là prev, thêm fragment vào cuối slidesEl
|
|
2839
|
+
slidesEl.appendChild(cloneFragment);
|
|
2840
|
+
} else if (isNext) {
|
|
2841
|
+
// Nếu là next, thêm fragment vào đầu slidesEl
|
|
2842
|
+
slidesEl.insertBefore(cloneFragment, slidesEl.firstChild);
|
|
2843
|
+
}
|
|
2844
|
+
swiper.recalcSlides();
|
|
2845
|
+
swiper.updateSlides();
|
|
2846
|
+
|
|
2847
|
+
// Tìm slide có data-swiper-slide-index tương ứng
|
|
2848
|
+
let oldActiveIndex = null;
|
|
2849
|
+
for (let i = 0; i < slidesEl.children.length; i++) {
|
|
2850
|
+
const child = slidesEl.children[i];
|
|
2851
|
+
if (child.getAttribute('data-swiper-slide-index') === swiperDataOldActiveIndex) {
|
|
2852
|
+
oldActiveIndex = i;
|
|
2853
|
+
break;
|
|
2854
|
+
}
|
|
2855
|
+
}
|
|
2856
|
+
if (slideTo && oldActiveIndex !== swiper.activeIndex) {
|
|
2857
|
+
swiper.slideTo(oldActiveIndex, 0);
|
|
2858
|
+
}
|
|
2859
|
+
|
|
2860
|
+
// Tìm vị trí slide cũ sau khi remove clone để set lại translate tạo hiệu ứng animate
|
|
2861
|
+
const skip = Math.min(swiper.params.slidesPerGroupSkip, newIndex);
|
|
2862
|
+
let snapIndex = skip + Math.floor((newIndex - skip) / swiper.params.slidesPerGroup);
|
|
2863
|
+
if (snapIndex >= swiper.snapGrid.length) snapIndex = swiper.snapGrid.length - 1;
|
|
2864
|
+
const translate = -swiper.snapGrid[snapIndex];
|
|
2865
|
+
if (translate === swiper.translate) {
|
|
2866
|
+
let oldActiveIndexAfterRemoveClone;
|
|
2867
|
+
for (let i = 0; i < slidesEl.children.length; i++) {
|
|
2868
|
+
const child = slidesEl.children[i];
|
|
2869
|
+
if (child.getAttribute('data-swiper-slide-index') === swiperDataOldActiveIndex) {
|
|
2870
|
+
oldActiveIndexAfterRemoveClone = i;
|
|
2871
|
+
break;
|
|
2872
|
+
}
|
|
2873
|
+
}
|
|
2874
|
+
const skip = Math.min(swiper.params.slidesPerGroupSkip, oldActiveIndexAfterRemoveClone);
|
|
2875
|
+
let snapIndex = skip + Math.floor((oldActiveIndexAfterRemoveClone - skip) / swiper.params.slidesPerGroup);
|
|
2876
|
+
if (snapIndex >= swiper.snapGrid.length) snapIndex = swiper.snapGrid.length - 1;
|
|
2877
|
+
const oldTranslate = -swiper.snapGrid[snapIndex];
|
|
2878
|
+
let updateTranslate;
|
|
2879
|
+
if (oldTranslate === swiper.translate) {
|
|
2880
|
+
updateTranslate = swiper.snapGrid[snapIndex > 0 ? snapIndex - 1 : swiper.snapGrid.length - 1];
|
|
2881
|
+
} else {
|
|
2882
|
+
updateTranslate = oldTranslate;
|
|
2883
|
+
}
|
|
2884
|
+
swiper.setTranslate(updateTranslate);
|
|
2885
|
+
}
|
|
2886
|
+
// Remove slide clone ra khỏi slidesEl sau khi slideTo hoàn thành
|
|
2887
|
+
const cloneSlides = slidesEl.querySelectorAll('[data-swiper-clone="true"]');
|
|
2888
|
+
cloneSlides.forEach(cloneSlide => {
|
|
2889
|
+
if (cloneSlide.parentNode) {
|
|
2890
|
+
cloneSlide.parentNode.removeChild(cloneSlide);
|
|
2891
|
+
}
|
|
2892
|
+
});
|
|
2893
|
+
swiper.recalcSlides();
|
|
2894
|
+
swiper.updateSlides();
|
|
2895
|
+
const targetDataIndex = Array.from(slidesEl.children).findIndex(el => el.getAttribute('data-swiper-slide-index') * 1 === targetData * 1);
|
|
2896
|
+
const oldDataIndex = Array.from(slidesEl.children).findIndex(el => el.getAttribute('data-swiper-slide-index') * 1 === oldActiveData * 1);
|
|
2897
|
+
const snapIndexNew = skip + Math.floor((targetDataIndex - skip) / swiper.params.slidesPerGroup);
|
|
2898
|
+
const snapIndexOld = skip + Math.floor((oldDataIndex - skip) / swiper.params.slidesPerGroup);
|
|
2899
|
+
if (slideTo && snapIndexNew === targetDataIndex) {
|
|
2900
|
+
const translateOld = -swiper.snapGrid[snapIndexOld > swiper.snapGrid.length - 1 ? snapIndexNew - 1 > swiper.snapGrid.length - 1 ? 0 : snapIndexNew - 1 : snapIndexOld];
|
|
2901
|
+
swiper.setTranslate(translateOld);
|
|
2902
|
+
}
|
|
2903
|
+
swiper.recalcSlides();
|
|
2904
|
+
swiper.updateSlides();
|
|
2905
|
+
swiper.allowSlidePrev = allowSlidePrev;
|
|
2906
|
+
swiper.allowSlideNext = allowSlideNext;
|
|
2907
|
+
swiper.emit('loopFixDot');
|
|
2908
|
+
}
|
|
2909
|
+
|
|
2603
2910
|
function loopDestroy() {
|
|
2604
2911
|
const swiper = this;
|
|
2605
2912
|
const {
|
|
@@ -2626,6 +2933,7 @@
|
|
|
2626
2933
|
var loop = {
|
|
2627
2934
|
loopCreate,
|
|
2628
2935
|
loopFix,
|
|
2936
|
+
loopFixDot,
|
|
2629
2937
|
loopDestroy
|
|
2630
2938
|
};
|
|
2631
2939
|
|
|
@@ -3761,6 +4069,7 @@
|
|
|
3761
4069
|
loopAddBlankSlides: true,
|
|
3762
4070
|
loopAdditionalSlides: 0,
|
|
3763
4071
|
loopPreventsSliding: true,
|
|
4072
|
+
isSneakPeekCenter: false,
|
|
3764
4073
|
// rewind
|
|
3765
4074
|
rewind: false,
|
|
3766
4075
|
// Swiping/no swiping
|
|
@@ -5597,16 +5906,6 @@
|
|
|
5597
5906
|
}
|
|
5598
5907
|
}
|
|
5599
5908
|
}
|
|
5600
|
-
function getMoveDirection(prevIndex, nextIndex, length) {
|
|
5601
|
-
prevIndex = prevIndex % length;
|
|
5602
|
-
nextIndex = nextIndex % length;
|
|
5603
|
-
if (nextIndex === prevIndex + 1) {
|
|
5604
|
-
return 'next';
|
|
5605
|
-
} else if (nextIndex === prevIndex - 1) {
|
|
5606
|
-
return 'previous';
|
|
5607
|
-
}
|
|
5608
|
-
return;
|
|
5609
|
-
}
|
|
5610
5909
|
function onBulletClick(e) {
|
|
5611
5910
|
const bulletEl = e.target.closest(classesToSelector(swiper.params.pagination.bulletClass));
|
|
5612
5911
|
if (!bulletEl) {
|
|
@@ -5615,26 +5914,40 @@
|
|
|
5615
5914
|
e.preventDefault();
|
|
5616
5915
|
const index = elementIndex(bulletEl) * swiper.params.slidesPerGroup;
|
|
5617
5916
|
if (swiper.params.loop) {
|
|
5618
|
-
//
|
|
5917
|
+
// Kiểm tra xem loop có bị disable không
|
|
5619
5918
|
const currentSlidesPerView = swiper.params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
|
|
5620
5919
|
if (swiper.slides.length < currentSlidesPerView) {
|
|
5621
|
-
// Loop
|
|
5920
|
+
// Loop bị disable, sử dụng slideTo trực tiếp
|
|
5622
5921
|
swiper.slideTo(index);
|
|
5623
5922
|
return;
|
|
5624
5923
|
}
|
|
5625
5924
|
if (swiper.realIndex === index) return;
|
|
5626
|
-
|
|
5627
|
-
if (moveDirection === 'next') {
|
|
5925
|
+
if (index === swiper.realIndex + 1 || index === 0 && swiper.realIndex === swiper.slides.length - 1) {
|
|
5628
5926
|
swiper.slideNext();
|
|
5629
|
-
} else if (
|
|
5927
|
+
} else if (index === swiper.realIndex - 1 || index === swiper.slides.length - 1 && swiper.realIndex === 0) {
|
|
5630
5928
|
swiper.slidePrev();
|
|
5929
|
+
}
|
|
5930
|
+
// const moveDirection = getMoveDirection(swiper.realIndex, index, swiper.slides.length);
|
|
5931
|
+
if (swiper.params.isSneakPeekCenter) {
|
|
5932
|
+
swiper.slideToLoopCenterSneakPeek(index);
|
|
5631
5933
|
} else {
|
|
5632
5934
|
swiper.slideToLoop(index);
|
|
5633
5935
|
}
|
|
5936
|
+
|
|
5937
|
+
// if (moveDirection === 'next') {
|
|
5938
|
+
// swiper.slideNext();
|
|
5939
|
+
// } else if (moveDirection === 'previous') {
|
|
5940
|
+
// swiper.slidePrev();
|
|
5941
|
+
// } else {
|
|
5942
|
+
// swiper.slideToLoop(index);
|
|
5943
|
+
// }
|
|
5634
5944
|
} else {
|
|
5635
5945
|
swiper.slideTo(index);
|
|
5636
5946
|
}
|
|
5637
5947
|
}
|
|
5948
|
+
|
|
5949
|
+
// Export function để sử dụng ở ngoài
|
|
5950
|
+
swiper.pagination.onBulletClick = onBulletClick;
|
|
5638
5951
|
function update() {
|
|
5639
5952
|
// Render || Update Pagination bullets/items
|
|
5640
5953
|
const rtl = swiper.rtl;
|
|
@@ -9849,7 +10162,7 @@
|
|
|
9849
10162
|
}
|
|
9850
10163
|
|
|
9851
10164
|
/**
|
|
9852
|
-
* Swiper 0.0.
|
|
10165
|
+
* Swiper 0.0.8
|
|
9853
10166
|
* Gem SDK - Swiper, Customized of swiper
|
|
9854
10167
|
* https://swiperjs.com
|
|
9855
10168
|
*
|
|
@@ -9866,7 +10179,7 @@
|
|
|
9866
10179
|
Swiper.use(modules);
|
|
9867
10180
|
|
|
9868
10181
|
/* underscore in name -> watch for changes */
|
|
9869
|
-
const paramsList = ['eventsPrefix', 'injectStyles', 'injectStylesUrls', 'modules', 'init', '_direction', 'oneWayMovement', 'swiperElementNodeName', 'touchEventsTarget', 'initialSlide', '_speed', 'cssMode', 'updateOnWindowResize', 'resizeObserver', 'nested', 'focusableElements', '_enabled', '_width', '_height', 'preventInteractionOnTransition', 'userAgent', 'url', '_edgeSwipeDetection', '_edgeSwipeThreshold', '_freeMode', '_autoHeight', 'setWrapperSize', 'virtualTranslate', '_effect', 'breakpoints', 'breakpointsBase', '_spaceBetween', '_slidesPerView', 'maxBackfaceHiddenSlides', '_grid', '_slidesPerGroup', '_slidesPerGroupSkip', '_slidesPerGroupAuto', '_centeredSlides', '_centeredSlidesBounds', '_slidesOffsetBefore', '_slidesOffsetAfter', 'normalizeSlideIndex', '_centerInsufficientSlides', '_watchOverflow', 'roundLengths', 'touchRatio', 'touchAngle', 'simulateTouch', '_shortSwipes', '_longSwipes', 'longSwipesRatio', 'longSwipesMs', '_followFinger', 'allowTouchMove', '_threshold', 'touchMoveStopPropagation', 'touchStartPreventDefault', 'touchStartForcePreventDefault', 'touchReleaseOnEdges', 'uniqueNavElements', '_resistance', '_resistanceRatio', '_watchSlidesProgress', '_grabCursor', 'preventClicks', 'preventClicksPropagation', '_slideToClickedSlide', '_loop', 'loopAdditionalSlides', 'loopAddBlankSlides', 'loopPreventsSliding', '_rewind', '_allowSlidePrev', '_allowSlideNext', '_swipeHandler', '_noSwiping', 'noSwipingClass', 'noSwipingSelector', 'passiveListeners', 'containerModifierClass', 'slideClass', 'slideActiveClass', 'slideVisibleClass', 'slideFullyVisibleClass', 'slideNextClass', 'slidePrevClass', 'slideBlankClass', 'wrapperClass', 'lazyPreloaderClass', 'lazyPreloadPrevNext', 'runCallbacksOnInit', 'observer', 'observeParents', 'observeSlideChildren',
|
|
10182
|
+
const paramsList = ['eventsPrefix', 'injectStyles', 'injectStylesUrls', 'modules', 'init', '_direction', 'oneWayMovement', 'swiperElementNodeName', 'touchEventsTarget', 'initialSlide', '_speed', 'cssMode', 'updateOnWindowResize', 'resizeObserver', 'nested', 'focusableElements', '_enabled', '_width', '_height', 'preventInteractionOnTransition', 'userAgent', 'url', '_edgeSwipeDetection', '_edgeSwipeThreshold', '_freeMode', '_autoHeight', 'setWrapperSize', 'virtualTranslate', '_effect', 'breakpoints', 'breakpointsBase', '_spaceBetween', '_isSneakPeekCenter', '_slidesPerView', 'maxBackfaceHiddenSlides', '_grid', '_slidesPerGroup', '_slidesPerGroupSkip', '_slidesPerGroupAuto', '_centeredSlides', '_centeredSlidesBounds', '_slidesOffsetBefore', '_slidesOffsetAfter', 'normalizeSlideIndex', '_centerInsufficientSlides', '_watchOverflow', 'roundLengths', 'touchRatio', 'touchAngle', 'simulateTouch', '_shortSwipes', '_longSwipes', 'longSwipesRatio', 'longSwipesMs', '_followFinger', 'allowTouchMove', '_threshold', 'touchMoveStopPropagation', 'touchStartPreventDefault', 'touchStartForcePreventDefault', 'touchReleaseOnEdges', 'uniqueNavElements', '_resistance', '_resistanceRatio', '_watchSlidesProgress', '_grabCursor', 'preventClicks', 'preventClicksPropagation', '_slideToClickedSlide', '_loop', 'loopAdditionalSlides', 'loopAddBlankSlides', 'loopPreventsSliding', '_rewind', '_allowSlidePrev', '_allowSlideNext', '_swipeHandler', '_noSwiping', 'noSwipingClass', 'noSwipingSelector', 'passiveListeners', 'containerModifierClass', 'slideClass', 'slideActiveClass', 'slideVisibleClass', 'slideFullyVisibleClass', 'slideNextClass', 'slidePrevClass', 'slideBlankClass', 'wrapperClass', 'lazyPreloaderClass', 'lazyPreloadPrevNext', 'runCallbacksOnInit', 'observer', 'observeParents', 'observeSlideChildren',
|
|
9870
10183
|
// modules
|
|
9871
10184
|
'a11y', '_autoplay', '_controller', 'coverflowEffect', 'cubeEffect', 'fadeEffect', 'flipEffect', 'creativeEffect', 'cardsEffect', 'hashNavigation', 'history', 'keyboard', 'mousewheel', '_navigation', '_pagination', 'parallax', '_scrollbar', '_thumbs', 'virtual', 'zoom', 'control'];
|
|
9872
10185
|
|
|
@@ -10191,7 +10504,7 @@
|
|
|
10191
10504
|
}
|
|
10192
10505
|
|
|
10193
10506
|
/**
|
|
10194
|
-
* Swiper Custom Element 0.0.
|
|
10507
|
+
* Swiper Custom Element 0.0.8
|
|
10195
10508
|
* Gem SDK - Swiper, Customized of swiper
|
|
10196
10509
|
* https://swiperjs.com
|
|
10197
10510
|
*
|