@evermade/overflow-slider 3.0.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -8
- package/dist/core/details.esm.js +5 -5
- package/dist/core/details.min.js +1 -1
- package/dist/core/overflow-slider.esm.js +1 -0
- package/dist/core/overflow-slider.min.js +1 -1
- package/dist/core/slider.esm.js +113 -44
- package/dist/core/slider.min.js +1 -1
- package/dist/core/utils.esm.js +15 -1
- package/dist/core/utils.min.js +1 -1
- package/dist/overflow-slider.css +1 -1
- package/dist/plugins/arrows/arrows/index.esm.js +20 -10
- package/dist/plugins/arrows/arrows/index.min.js +1 -1
- package/dist/plugins/dots/dots/index.esm.js +0 -4
- package/dist/plugins/drag-scrolling/drag-scrolling/index.esm.js +1 -1
- package/dist/plugins/drag-scrolling/drag-scrolling/index.min.js +1 -1
- package/dist/plugins/fade/fade/index.esm.js +7 -7
- package/dist/plugins/fade/fade/index.min.js +1 -1
- package/dist/plugins/full-width/full-width/index.esm.js +7 -2
- package/dist/plugins/full-width/full-width/index.min.js +1 -1
- package/dist/plugins/scroll-indicator/scroll-indicator/index.esm.js +22 -22
- package/dist/plugins/scroll-indicator/scroll-indicator/index.min.js +1 -1
- package/dist/plugins/thumbnails/thumbnails/index.esm.js +7 -4
- package/dist/plugins/thumbnails/thumbnails/index.min.js +1 -1
- package/docs/assets/demo.css +11 -1
- package/docs/assets/demo.js +38 -12
- package/docs/dist/core/details.esm.js +5 -5
- package/docs/dist/core/details.min.js +1 -1
- package/docs/dist/core/overflow-slider.esm.js +1 -0
- package/docs/dist/core/overflow-slider.min.js +1 -1
- package/docs/dist/core/slider.esm.js +113 -44
- package/docs/dist/core/slider.min.js +1 -1
- package/docs/dist/core/utils.esm.js +15 -1
- package/docs/dist/core/utils.min.js +1 -1
- package/docs/dist/overflow-slider.css +1 -1
- package/docs/dist/plugins/arrows/arrows/index.esm.js +20 -10
- package/docs/dist/plugins/arrows/arrows/index.min.js +1 -1
- package/docs/dist/plugins/dots/dots/index.esm.js +0 -4
- package/docs/dist/plugins/drag-scrolling/drag-scrolling/index.esm.js +1 -1
- package/docs/dist/plugins/drag-scrolling/drag-scrolling/index.min.js +1 -1
- package/docs/dist/plugins/fade/fade/index.esm.js +7 -7
- package/docs/dist/plugins/fade/fade/index.min.js +1 -1
- package/docs/dist/plugins/full-width/full-width/index.esm.js +7 -2
- package/docs/dist/plugins/full-width/full-width/index.min.js +1 -1
- package/docs/dist/plugins/scroll-indicator/scroll-indicator/index.esm.js +22 -22
- package/docs/dist/plugins/scroll-indicator/scroll-indicator/index.min.js +1 -1
- package/docs/dist/plugins/thumbnails/thumbnails/index.esm.js +7 -4
- package/docs/dist/plugins/thumbnails/thumbnails/index.min.js +1 -1
- package/docs/index-rtl.html +396 -0
- package/docs/index.html +1 -1
- package/package.json +1 -1
- package/src/core/details.ts +5 -5
- package/src/core/overflow-slider.ts +1 -0
- package/src/core/slider.ts +125 -47
- package/src/core/types.ts +5 -0
- package/src/core/utils.ts +19 -1
- package/src/plugins/arrows/index.ts +20 -10
- package/src/plugins/dots/index.ts +0 -4
- package/src/plugins/drag-scrolling/index.ts +1 -1
- package/src/plugins/fade/index.ts +7 -8
- package/src/plugins/fade/styles.scss +10 -0
- package/src/plugins/full-width/index.ts +8 -2
- package/src/plugins/scroll-indicator/index.ts +62 -64
- package/src/plugins/thumbnails/index.ts +7 -5
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import details from './details.esm.js';
|
|
2
|
-
import { generateId, objectsAreEqual } from './utils.esm.js';
|
|
2
|
+
import { generateId, objectsAreEqual, getOutermostChildrenEdgeMarginSum } from './utils.esm.js';
|
|
3
3
|
|
|
4
4
|
function Slider(container, options, plugins) {
|
|
5
5
|
let slider;
|
|
@@ -81,7 +81,7 @@ function Slider(container, options, plugins) {
|
|
|
81
81
|
// any scroll
|
|
82
82
|
slider.container.addEventListener('scroll', () => {
|
|
83
83
|
const newScrollLeft = slider.container.scrollLeft;
|
|
84
|
-
if (scrollLeft !== newScrollLeft) {
|
|
84
|
+
if (Math.floor(scrollLeft) !== Math.floor(newScrollLeft)) {
|
|
85
85
|
if (!isScrolling) {
|
|
86
86
|
isScrolling = true;
|
|
87
87
|
slider.emit('scrollStart');
|
|
@@ -102,7 +102,7 @@ function Slider(container, options, plugins) {
|
|
|
102
102
|
// user initted scroll (touchmove, mouse wheel, etc.)
|
|
103
103
|
const nativeScrollHandler = () => {
|
|
104
104
|
const newScrollLeft = slider.container.scrollLeft;
|
|
105
|
-
if (nativeScrollLeft !== newScrollLeft && !isProgrammaticScrolling) {
|
|
105
|
+
if (Math.floor(nativeScrollLeft) !== Math.floor(newScrollLeft) && !isProgrammaticScrolling) {
|
|
106
106
|
if (!isUserScrolling) {
|
|
107
107
|
slider.emit('nativeScrollStart');
|
|
108
108
|
isUserScrolling = true;
|
|
@@ -128,7 +128,7 @@ function Slider(container, options, plugins) {
|
|
|
128
128
|
});
|
|
129
129
|
slider.container.addEventListener('scroll', () => {
|
|
130
130
|
const newScrollLeft = slider.container.scrollLeft;
|
|
131
|
-
if (programmaticScrollLeft !== newScrollLeft && !isUserScrolling && isProgrammaticScrolling) {
|
|
131
|
+
if (Math.floor(programmaticScrollLeft) !== Math.floor(newScrollLeft) && !isUserScrolling && isProgrammaticScrolling) {
|
|
132
132
|
programmaticScrollLeft = newScrollLeft;
|
|
133
133
|
clearTimeout(programmaticScrollTimeout);
|
|
134
134
|
programmaticScrollTimeout = setTimeout(() => {
|
|
@@ -184,6 +184,9 @@ function Slider(container, options, plugins) {
|
|
|
184
184
|
}
|
|
185
185
|
function setDataAttributes() {
|
|
186
186
|
slider.container.setAttribute('data-has-overflow', slider.details.hasOverflow ? 'true' : 'false');
|
|
187
|
+
if (slider.options.rtl) {
|
|
188
|
+
slider.container.setAttribute('dir', 'rtl');
|
|
189
|
+
}
|
|
187
190
|
}
|
|
188
191
|
function ensureSlideIsInView(slide, scrollBehavior = null) {
|
|
189
192
|
const behavior = scrollBehavior || slider.options.scrollBehavior;
|
|
@@ -194,13 +197,13 @@ function Slider(container, options, plugins) {
|
|
|
194
197
|
const slideStart = slideRect.left - sliderRect.left + scrollLeft;
|
|
195
198
|
const slideEnd = slideStart + slideRect.width;
|
|
196
199
|
let scrollTarget = null;
|
|
197
|
-
if (slideStart < scrollLeft) {
|
|
200
|
+
if (Math.floor(slideStart) < Math.floor(scrollLeft)) {
|
|
198
201
|
scrollTarget = slideStart;
|
|
199
202
|
}
|
|
200
|
-
else if (slideEnd > scrollLeft + containerWidth) {
|
|
203
|
+
else if (Math.floor(slideEnd) > Math.floor(scrollLeft) + Math.floor(containerWidth)) {
|
|
201
204
|
scrollTarget = slideEnd - containerWidth;
|
|
202
205
|
}
|
|
203
|
-
else if (slideStart === 0) {
|
|
206
|
+
else if (Math.floor(slideStart) === 0) {
|
|
204
207
|
scrollTarget = 0;
|
|
205
208
|
}
|
|
206
209
|
else {
|
|
@@ -215,19 +218,56 @@ function Slider(container, options, plugins) {
|
|
|
215
218
|
}
|
|
216
219
|
function setActiveSlideIdx() {
|
|
217
220
|
const sliderRect = slider.container.getBoundingClientRect();
|
|
218
|
-
const scrollLeft = slider.
|
|
221
|
+
const scrollLeft = slider.getScrollLeft();
|
|
219
222
|
const slides = slider.slides;
|
|
220
223
|
let activeSlideIdx = 0;
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
const
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
224
|
+
let scrolledPastLastSlide = false;
|
|
225
|
+
if (slider.options.rtl) {
|
|
226
|
+
const scrolledDistance = slider.getInclusiveScrollWidth() - scrollLeft - slider.getInclusiveClientWidth();
|
|
227
|
+
const slidePositions = [];
|
|
228
|
+
for (let i = slides.length - 1; i >= 0; i--) {
|
|
229
|
+
const slideRect = slides[i].getBoundingClientRect();
|
|
230
|
+
const slideEnd = Math.abs(slideRect.left) - Math.abs(sliderRect.left) + scrolledDistance;
|
|
231
|
+
slidePositions.push({
|
|
232
|
+
slide: slides[i],
|
|
233
|
+
slideEnd: slideEnd,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
let closestSlide = null;
|
|
237
|
+
let closestDistance = null;
|
|
238
|
+
for (let i = 0; i < slidePositions.length; i++) {
|
|
239
|
+
const distance = Math.abs(slidePositions[i].slideEnd - scrolledDistance);
|
|
240
|
+
if (closestDistance === null || distance < closestDistance) {
|
|
241
|
+
closestDistance = distance;
|
|
242
|
+
closestSlide = slidePositions[i].slide;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
if (closestSlide) {
|
|
246
|
+
activeSlideIdx = slides.indexOf(closestSlide);
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
activeSlideIdx = slides.length - 1;
|
|
227
250
|
}
|
|
228
251
|
}
|
|
252
|
+
else {
|
|
253
|
+
for (let i = 0; i < slides.length; i++) {
|
|
254
|
+
const slideRect = slides[i].getBoundingClientRect();
|
|
255
|
+
const slideStart = slideRect.left - sliderRect.left + scrollLeft + getGapSize();
|
|
256
|
+
if (Math.floor(slideStart) >= Math.floor(scrollLeft)) {
|
|
257
|
+
activeSlideIdx = i;
|
|
258
|
+
break;
|
|
259
|
+
}
|
|
260
|
+
if (i === slides.length - 1) {
|
|
261
|
+
scrolledPastLastSlide = true;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (scrolledPastLastSlide) {
|
|
266
|
+
activeSlideIdx = slides.length - 1;
|
|
267
|
+
}
|
|
229
268
|
const oldActiveSlideIdx = slider.activeSlideIdx;
|
|
230
269
|
slider.activeSlideIdx = activeSlideIdx;
|
|
270
|
+
// console.log('activeSlideIdx', activeSlideIdx);
|
|
231
271
|
if (oldActiveSlideIdx !== activeSlideIdx) {
|
|
232
272
|
slider.emit('activeSlideChanged');
|
|
233
273
|
}
|
|
@@ -238,12 +278,24 @@ function Slider(container, options, plugins) {
|
|
|
238
278
|
ensureSlideIsInView(slide);
|
|
239
279
|
}
|
|
240
280
|
}
|
|
281
|
+
function getInclusiveScrollWidth() {
|
|
282
|
+
return slider.container.scrollWidth + getOutermostChildrenEdgeMarginSum(slider.container);
|
|
283
|
+
}
|
|
284
|
+
function getInclusiveClientWidth() {
|
|
285
|
+
return slider.container.clientWidth + getOutermostChildrenEdgeMarginSum(slider.container);
|
|
286
|
+
}
|
|
287
|
+
function getScrollLeft() {
|
|
288
|
+
return slider.options.rtl ? Math.abs(slider.container.scrollLeft) : slider.container.scrollLeft;
|
|
289
|
+
}
|
|
290
|
+
function setScrollLeft(value) {
|
|
291
|
+
slider.container.scrollLeft = slider.options.rtl ? -value : value;
|
|
292
|
+
}
|
|
241
293
|
function getGapSize() {
|
|
242
294
|
let gapSize = 0;
|
|
243
295
|
if (slider.slides.length > 1) {
|
|
244
296
|
const firstSlideRect = slider.slides[0].getBoundingClientRect();
|
|
245
297
|
const secondSlideRect = slider.slides[1].getBoundingClientRect();
|
|
246
|
-
gapSize = secondSlideRect.left - firstSlideRect.right;
|
|
298
|
+
gapSize = slider.options.rtl ? Math.abs(Math.floor(secondSlideRect.right - firstSlideRect.left)) : Math.floor(secondSlideRect.left - firstSlideRect.right);
|
|
247
299
|
}
|
|
248
300
|
return gapSize;
|
|
249
301
|
}
|
|
@@ -253,7 +305,7 @@ function Slider(container, options, plugins) {
|
|
|
253
305
|
if (fullWidthOffset) {
|
|
254
306
|
offset = parseInt(fullWidthOffset);
|
|
255
307
|
}
|
|
256
|
-
return offset;
|
|
308
|
+
return Math.floor(offset);
|
|
257
309
|
}
|
|
258
310
|
function moveToDirection(direction = "prev") {
|
|
259
311
|
const scrollStrategy = slider.options.scrollStrategy;
|
|
@@ -261,38 +313,47 @@ function Slider(container, options, plugins) {
|
|
|
261
313
|
const sliderRect = slider.container.getBoundingClientRect();
|
|
262
314
|
const containerWidth = slider.container.offsetWidth;
|
|
263
315
|
let targetScrollPosition = scrollLeft;
|
|
264
|
-
|
|
316
|
+
const realDirection = slider.options.rtl ? (direction === 'prev' ? 'next' : 'prev') : direction;
|
|
317
|
+
if (realDirection === 'prev') {
|
|
265
318
|
targetScrollPosition = Math.max(0, scrollLeft - slider.container.offsetWidth);
|
|
266
319
|
}
|
|
267
|
-
else if (
|
|
268
|
-
targetScrollPosition = Math.min(slider.
|
|
320
|
+
else if (realDirection === 'next') {
|
|
321
|
+
targetScrollPosition = Math.min(slider.getInclusiveScrollWidth(), scrollLeft + slider.container.offsetWidth);
|
|
269
322
|
}
|
|
270
323
|
if (scrollStrategy === 'fullSlide') {
|
|
271
|
-
let
|
|
324
|
+
let fullSlideTargetScrollPosition = null;
|
|
272
325
|
// extend targetScrollPosition to include gap
|
|
273
|
-
if (
|
|
274
|
-
|
|
326
|
+
if (realDirection === 'prev') {
|
|
327
|
+
fullSlideTargetScrollPosition = Math.max(0, targetScrollPosition - getGapSize());
|
|
275
328
|
}
|
|
276
329
|
else {
|
|
277
|
-
|
|
330
|
+
fullSlideTargetScrollPosition = Math.min(slider.getInclusiveScrollWidth(), targetScrollPosition + getGapSize());
|
|
278
331
|
}
|
|
279
|
-
if (
|
|
332
|
+
if (realDirection === 'next') {
|
|
280
333
|
let partialSlideFound = false;
|
|
281
334
|
for (let slide of slider.slides) {
|
|
282
335
|
const slideRect = slide.getBoundingClientRect();
|
|
283
336
|
const slideStart = slideRect.left - sliderRect.left + scrollLeft;
|
|
284
337
|
const slideEnd = slideStart + slideRect.width;
|
|
285
|
-
if (slideStart < targetScrollPosition && slideEnd > targetScrollPosition) {
|
|
286
|
-
|
|
338
|
+
if (Math.floor(slideStart) < Math.floor(targetScrollPosition) && Math.floor(slideEnd) > Math.floor(targetScrollPosition)) {
|
|
339
|
+
fullSlideTargetScrollPosition = slideStart;
|
|
287
340
|
partialSlideFound = true;
|
|
288
341
|
break;
|
|
289
342
|
}
|
|
290
343
|
}
|
|
291
344
|
if (!partialSlideFound) {
|
|
292
|
-
|
|
345
|
+
fullSlideTargetScrollPosition = Math.min(targetScrollPosition, slider.getInclusiveScrollWidth() - slider.container.offsetWidth);
|
|
293
346
|
}
|
|
294
|
-
if (
|
|
295
|
-
|
|
347
|
+
if (fullSlideTargetScrollPosition) {
|
|
348
|
+
if (Math.floor(fullSlideTargetScrollPosition) > Math.floor(scrollLeft)) {
|
|
349
|
+
// make sure fullSlideTargetScrollPosition is possible considering the container width
|
|
350
|
+
const maxScrollPosition = Math.floor(slider.getInclusiveScrollWidth()) - Math.floor(containerWidth);
|
|
351
|
+
targetScrollPosition = Math.min(fullSlideTargetScrollPosition, maxScrollPosition);
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
// cannot snap to slide, move one page worth of distance
|
|
355
|
+
targetScrollPosition = Math.min(slider.getInclusiveScrollWidth(), scrollLeft + containerWidth);
|
|
356
|
+
}
|
|
296
357
|
}
|
|
297
358
|
}
|
|
298
359
|
else {
|
|
@@ -301,23 +362,23 @@ function Slider(container, options, plugins) {
|
|
|
301
362
|
const slideRect = slide.getBoundingClientRect();
|
|
302
363
|
const slideStart = slideRect.left - sliderRect.left + scrollLeft;
|
|
303
364
|
const slideEnd = slideStart + slideRect.width;
|
|
304
|
-
if (slideStart < scrollLeft && slideEnd > scrollLeft) {
|
|
305
|
-
|
|
365
|
+
if (Math.floor(slideStart) < Math.floor(scrollLeft) && Math.floor(slideEnd) > Math.floor(scrollLeft)) {
|
|
366
|
+
fullSlideTargetScrollPosition = slideEnd - containerWidth;
|
|
306
367
|
partialSlideFound = true;
|
|
307
368
|
break;
|
|
308
369
|
}
|
|
309
370
|
}
|
|
310
371
|
if (!partialSlideFound) {
|
|
311
|
-
|
|
372
|
+
fullSlideTargetScrollPosition = Math.max(0, scrollLeft - containerWidth);
|
|
312
373
|
}
|
|
313
|
-
if (
|
|
314
|
-
targetScrollPosition =
|
|
374
|
+
if (fullSlideTargetScrollPosition && Math.floor(fullSlideTargetScrollPosition) < Math.floor(scrollLeft)) {
|
|
375
|
+
targetScrollPosition = fullSlideTargetScrollPosition;
|
|
315
376
|
}
|
|
316
377
|
}
|
|
317
378
|
}
|
|
318
379
|
// add left offset
|
|
319
380
|
const offsettedTargetScrollPosition = targetScrollPosition - getLeftOffset();
|
|
320
|
-
if (offsettedTargetScrollPosition >= 0) {
|
|
381
|
+
if (Math.floor(offsettedTargetScrollPosition) >= 0) {
|
|
321
382
|
targetScrollPosition = offsettedTargetScrollPosition;
|
|
322
383
|
}
|
|
323
384
|
slider.emit('programmaticScrollStart');
|
|
@@ -326,12 +387,12 @@ function Slider(container, options, plugins) {
|
|
|
326
387
|
setTimeout(() => slider.container.style.scrollBehavior = '', 50);
|
|
327
388
|
}
|
|
328
389
|
function snapToClosestSlide(direction = "prev") {
|
|
329
|
-
const isMovingForward = direction === 'next';
|
|
390
|
+
const isMovingForward = slider.options.rtl ? direction === 'prev' : direction === 'next';
|
|
330
391
|
const slideReference = [];
|
|
331
392
|
for (let i = 0; i < slider.slides.length; i++) {
|
|
332
393
|
const slide = slider.slides[i];
|
|
333
394
|
const slideWidth = slide.offsetWidth;
|
|
334
|
-
const slideStart = slide.offsetLeft;
|
|
395
|
+
const slideStart = slider.options.rtl ? Math.abs(slide.offsetLeft + slideWidth - slider.details.containerWidth) : slide.offsetLeft;
|
|
335
396
|
const slideEnd = slideStart + slideWidth;
|
|
336
397
|
const slideMiddle = slideStart + slideWidth / 2;
|
|
337
398
|
const trigger = Math.min(slideMiddle, slideStart + slider.options.emulateScrollSnapMaxThreshold);
|
|
@@ -342,18 +403,22 @@ function Slider(container, options, plugins) {
|
|
|
342
403
|
width: slideWidth,
|
|
343
404
|
trigger: trigger,
|
|
344
405
|
slide: slide,
|
|
406
|
+
// debug
|
|
407
|
+
offSetleft: slide.offsetLeft,
|
|
408
|
+
rect: slide.getBoundingClientRect(),
|
|
345
409
|
});
|
|
346
410
|
}
|
|
411
|
+
console.log('slideReference', slideReference);
|
|
347
412
|
let snapTarget = null;
|
|
348
|
-
const scrollPosition =
|
|
413
|
+
const scrollPosition = getScrollLeft();
|
|
349
414
|
if (isMovingForward) {
|
|
350
415
|
for (let i = 0; i < slideReference.length; i++) {
|
|
351
416
|
const item = slideReference[i];
|
|
352
|
-
if (i === 0 && scrollPosition <= item.trigger) {
|
|
417
|
+
if (i === 0 && Math.floor(scrollPosition) <= Math.floor(item.trigger)) {
|
|
353
418
|
snapTarget = 0;
|
|
354
419
|
break;
|
|
355
420
|
}
|
|
356
|
-
if (
|
|
421
|
+
if (Math.floor(getScrollLeft()) <= Math.floor(item.trigger)) {
|
|
357
422
|
snapTarget = item.start;
|
|
358
423
|
break;
|
|
359
424
|
}
|
|
@@ -362,11 +427,11 @@ function Slider(container, options, plugins) {
|
|
|
362
427
|
else {
|
|
363
428
|
for (let i = slideReference.length - 1; i >= 0; i--) {
|
|
364
429
|
const item = slideReference[i];
|
|
365
|
-
if (i === slideReference.length - 1 && scrollPosition >= item.trigger) {
|
|
430
|
+
if (i === slideReference.length - 1 && Math.floor(scrollPosition) >= Math.floor(item.trigger)) {
|
|
366
431
|
snapTarget = item.start;
|
|
367
432
|
break;
|
|
368
433
|
}
|
|
369
|
-
if (
|
|
434
|
+
if (Math.floor(getScrollLeft()) >= Math.floor(item.trigger)) {
|
|
370
435
|
snapTarget = item.start;
|
|
371
436
|
break;
|
|
372
437
|
}
|
|
@@ -374,12 +439,12 @@ function Slider(container, options, plugins) {
|
|
|
374
439
|
}
|
|
375
440
|
if (snapTarget !== null) {
|
|
376
441
|
const offsettedSnapTarget = snapTarget - getLeftOffset();
|
|
377
|
-
if (offsettedSnapTarget >= 0) {
|
|
442
|
+
if (Math.floor(offsettedSnapTarget) >= 0) {
|
|
378
443
|
snapTarget = offsettedSnapTarget;
|
|
379
444
|
}
|
|
380
445
|
const scrollBehavior = slider.options.scrollBehavior || 'smooth';
|
|
381
446
|
slider.container.scrollTo({
|
|
382
|
-
left: snapTarget,
|
|
447
|
+
left: slider.options.rtl ? -snapTarget : snapTarget,
|
|
383
448
|
behavior: scrollBehavior
|
|
384
449
|
});
|
|
385
450
|
}
|
|
@@ -407,6 +472,10 @@ function Slider(container, options, plugins) {
|
|
|
407
472
|
moveToDirection,
|
|
408
473
|
moveToSlide,
|
|
409
474
|
snapToClosestSlide,
|
|
475
|
+
getInclusiveScrollWidth,
|
|
476
|
+
getInclusiveClientWidth,
|
|
477
|
+
getScrollLeft,
|
|
478
|
+
setScrollLeft,
|
|
410
479
|
on,
|
|
411
480
|
options,
|
|
412
481
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import t from"./details.min.js";import{generateId as e,objectsAreEqual as n}from"./utils.min.js";function
|
|
1
|
+
import t from"./details.min.js";import{generateId as e,objectsAreEqual as o,getOutermostChildrenEdgeMarginSum as n}from"./utils.min.js";function l(l,i,r){let a,s={};function c(e=!1){const n=a.details,l=t(a);a.details=l,e||o(n,l)?e&&a.emit("detailsChanged"):a.emit("detailsChanged")}function f(){a.slides=Array.from(a.container.querySelectorAll(a.options.slidesSelector))}function d(){a.container.style.setProperty("--slider-container-width",`${a.details.containerWidth}px`),a.container.style.setProperty("--slider-scrollable-width",`${a.details.scrollableAreaWidth}px`),a.container.style.setProperty("--slider-slides-count",`${a.details.slideCount}`)}function h(){a.container.setAttribute("data-has-overflow",a.details.hasOverflow?"true":"false"),a.options.rtl&&a.container.setAttribute("dir","rtl")}function u(t,e=null){const o=e||a.options.scrollBehavior,n=t.getBoundingClientRect(),l=a.container.getBoundingClientRect(),i=a.container.offsetWidth,r=a.container.scrollLeft,s=n.left-l.left+r,c=s+n.width;let f=null;f=Math.floor(s)<Math.floor(r)?s:Math.floor(c)>Math.floor(r)+Math.floor(i)?c-i:0===Math.floor(s)?0:s,null!==f&&setTimeout((t=>{a.emit("programmaticScrollStart"),a.container.scrollTo({left:t,behavior:o})}),50,f)}function g(){const t=a.container.getBoundingClientRect(),e=a.getScrollLeft(),o=a.slides;let n=0,l=!1;if(a.options.rtl){const l=a.getInclusiveScrollWidth()-e-a.getInclusiveClientWidth(),i=[];for(let e=o.length-1;e>=0;e--){const n=o[e].getBoundingClientRect(),r=Math.abs(n.left)-Math.abs(t.left)+l;i.push({slide:o[e],slideEnd:r})}let r=null,s=null;for(let t=0;t<i.length;t++){const e=Math.abs(i[t].slideEnd-l);(null===s||e<s)&&(s=e,r=i[t].slide)}n=r?o.indexOf(r):o.length-1}else for(let i=0;i<o.length;i++){const r=o[i].getBoundingClientRect().left-t.left+e+M();if(Math.floor(r)>=Math.floor(e)){n=i;break}i===o.length-1&&(l=!0)}l&&(n=o.length-1);const i=a.activeSlideIdx;a.activeSlideIdx=n,i!==n&&a.emit("activeSlideChanged")}function m(){return a.options.rtl?Math.abs(a.container.scrollLeft):a.container.scrollLeft}function M(){let t=0;if(a.slides.length>1){const e=a.slides[0].getBoundingClientRect(),o=a.slides[1].getBoundingClientRect();t=a.options.rtl?Math.abs(Math.floor(o.right-e.left)):Math.floor(o.left-e.right)}return t}function p(){let t=0;const e=a.container.getAttribute("data-full-width-offset");return e&&(t=parseInt(e)),Math.floor(t)}return a={emit:function(t){var e;s&&s[t]&&s[t].forEach((t=>{t(a)}));const o=null===(e=null==a?void 0:a.options)||void 0===e?void 0:e[t];"function"==typeof o&&o(a)},moveToDirection:function(t="prev"){const e=a.options.scrollStrategy,o=a.container.scrollLeft,n=a.container.getBoundingClientRect(),l=a.container.offsetWidth;let i=o;const r=a.options.rtl?"prev"===t?"next":"prev":t;if("prev"===r?i=Math.max(0,o-a.container.offsetWidth):"next"===r&&(i=Math.min(a.getInclusiveScrollWidth(),o+a.container.offsetWidth)),"fullSlide"===e){let t=null;if(t="prev"===r?Math.max(0,i-M()):Math.min(a.getInclusiveScrollWidth(),i+M()),"next"===r){let e=!1;for(let l of a.slides){const r=l.getBoundingClientRect(),a=r.left-n.left+o,s=a+r.width;if(Math.floor(a)<Math.floor(i)&&Math.floor(s)>Math.floor(i)){t=a,e=!0;break}}if(e||(t=Math.min(i,a.getInclusiveScrollWidth()-a.container.offsetWidth)),t)if(Math.floor(t)>Math.floor(o)){const e=Math.floor(a.getInclusiveScrollWidth())-Math.floor(l);i=Math.min(t,e)}else i=Math.min(a.getInclusiveScrollWidth(),o+l)}else{let e=!1;for(let i of a.slides){const r=i.getBoundingClientRect(),a=r.left-n.left+o,s=a+r.width;if(Math.floor(a)<Math.floor(o)&&Math.floor(s)>Math.floor(o)){t=s-l,e=!0;break}}e||(t=Math.max(0,o-l)),t&&Math.floor(t)<Math.floor(o)&&(i=t)}}const s=i-p();Math.floor(s)>=0&&(i=s),a.emit("programmaticScrollStart"),a.container.style.scrollBehavior=a.options.scrollBehavior,a.container.scrollLeft=i,setTimeout((()=>a.container.style.scrollBehavior=""),50)},moveToSlide:function(t){const e=a.slides[t];e&&u(e)},snapToClosestSlide:function(t="prev"){const e=a.options.rtl?"prev"===t:"next"===t,o=[];for(let t=0;t<a.slides.length;t++){const e=a.slides[t],n=e.offsetWidth,l=a.options.rtl?Math.abs(e.offsetLeft+n-a.details.containerWidth):e.offsetLeft,i=l+n,r=l+n/2,s=Math.min(r,l+a.options.emulateScrollSnapMaxThreshold);o.push({start:l,middle:r,end:i,width:n,trigger:s,slide:e,offSetleft:e.offsetLeft,rect:e.getBoundingClientRect()})}console.log("slideReference",o);let n=null;const l=m();if(e)for(let t=0;t<o.length;t++){const e=o[t];if(0===t&&Math.floor(l)<=Math.floor(e.trigger)){n=0;break}if(Math.floor(m())<=Math.floor(e.trigger)){n=e.start;break}}else for(let t=o.length-1;t>=0;t--){const e=o[t];if(t===o.length-1&&Math.floor(l)>=Math.floor(e.trigger)){n=e.start;break}if(Math.floor(m())>=Math.floor(e.trigger)){n=e.start;break}}if(null!==n){const t=n-p();Math.floor(t)>=0&&(n=t);const e=a.options.scrollBehavior||"smooth";a.container.scrollTo({left:a.options.rtl?-n:n,behavior:e})}},getInclusiveScrollWidth:function(){return a.container.scrollWidth+n(a.container)},getInclusiveClientWidth:function(){return a.container.clientWidth+n(a.container)},getScrollLeft:m,setScrollLeft:function(t){a.container.scrollLeft=a.options.rtl?-t:t},on:function(t,e){s[t]||(s[t]=[]),s[t].push(e)},options:i},function(){a.container=l;let t=l.getAttribute("id");null===t&&(t=e("overflow-slider"),l.setAttribute("id",t)),f(),c(!0),g(),a.on("contentsChanged",(()=>{f(),c(),g()})),a.on("containerSizeChanged",(()=>c()));let o=0;if(a.on("scroll",(()=>{o&&window.cancelAnimationFrame(o),o=window.requestAnimationFrame((()=>{c(),g()}))})),function(){new MutationObserver((()=>a.emit("contentsChanged"))).observe(a.container,{childList:!0});let t,e,o;new ResizeObserver((()=>a.emit("containerSizeChanged"))).observe(a.container);let n=a.container.scrollLeft,l=a.container.scrollLeft,i=a.container.scrollLeft,r=!1,s=!1,c=!1;a.container.addEventListener("scroll",(()=>{const e=a.container.scrollLeft;Math.floor(n)!==Math.floor(e)&&(r||(r=!0,a.emit("scrollStart")),n=e,clearTimeout(t),t=setTimeout((()=>{r=!1,a.emit("scrollEnd")}),50),a.emit("scroll")),s&&f()}));const f=()=>{const t=a.container.scrollLeft;Math.floor(l)===Math.floor(t)||c||(s||(a.emit("nativeScrollStart"),s=!0),a.emit("nativeScroll"),l=t,clearTimeout(e),e=setTimeout((()=>{s=!1,a.emit("nativeScrollEnd"),i=l}),50))};a.container.addEventListener("touchmove",f),a.container.addEventListener("mousewheel",f),a.container.addEventListener("wheel",f),a.on("programmaticScrollStart",(()=>{c=!0})),a.container.addEventListener("scroll",(()=>{const t=a.container.scrollLeft;Math.floor(i)!==Math.floor(t)&&!s&&c&&(i=t,clearTimeout(o),o=setTimeout((()=>{c=!1,a.emit("programmaticScrollEnd"),l=i}),50),a.emit("programmaticScroll"))})),a.on("programmaticScrollStart",(()=>{a.container.style.scrollSnapType="none"})),a.on("nativeScrollStart",(()=>{a.container.style.scrollSnapType=""}));let d=!1;a.container.addEventListener("mousedown",(()=>{d=!0})),a.container.addEventListener("touchstart",(()=>{d=!0}),{passive:!0}),a.container.addEventListener("focusin",(t=>{if(!d){let e=t.target;for(;e.parentElement!==a.container&&e.parentElement;)e=e.parentElement;u(e,"auto")}d=!1}))}(),h(),d(),r)for(const t of r)t(a);a.on("detailsChanged",(()=>{h(),d()})),a.emit("created"),a.container.setAttribute("data-ready","true")}(),a}export{l as default};
|
|
@@ -18,5 +18,19 @@ function objectsAreEqual(obj1, obj2) {
|
|
|
18
18
|
}
|
|
19
19
|
return true;
|
|
20
20
|
}
|
|
21
|
+
function getOutermostChildrenEdgeMarginSum(el) {
|
|
22
|
+
if (el.children.length === 0) {
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
// get the first child and its left margin
|
|
26
|
+
const firstChild = el.children[0];
|
|
27
|
+
const firstChildStyle = getComputedStyle(firstChild);
|
|
28
|
+
const firstChildMarginLeft = parseFloat(firstChildStyle.marginLeft);
|
|
29
|
+
// Get the last child and its right margin
|
|
30
|
+
const lastChild = el.children[el.children.length - 1];
|
|
31
|
+
const lastChildStyle = getComputedStyle(lastChild);
|
|
32
|
+
const lastChildMarginRight = parseFloat(lastChildStyle.marginRight);
|
|
33
|
+
return firstChildMarginLeft + lastChildMarginRight;
|
|
34
|
+
}
|
|
21
35
|
|
|
22
|
-
export { generateId, objectsAreEqual };
|
|
36
|
+
export { generateId, getOutermostChildrenEdgeMarginSum, objectsAreEqual };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function t
|
|
1
|
+
function e(t,n=1){const r=`${t}-${n}`;return document.getElementById(r)?e(t,n+1):r}function t(e,t){const n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(let r of n)if(!1===t.hasOwnProperty(r)||e[r]!==t[r])return!1;return!0}function n(e){if(0===e.children.length)return 0;const t=e.children[0],n=getComputedStyle(t),r=parseFloat(n.marginLeft),o=e.children[e.children.length-1],l=getComputedStyle(o);return r+parseFloat(l.marginRight)}export{e as generateId,n as getOutermostChildrenEdgeMarginSum,t as objectsAreEqual};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.overflow-slider{-ms-overflow-style:none;display:grid;grid-auto-flow:column;grid-template-columns:max-content;max-width:-moz-max-content;max-width:max-content;overflow:auto;position:relative;scrollbar-width:none;width:100%}.overflow-slider::-webkit-scrollbar{display:none}.overflow-slider>*{outline-offset:-2px;scroll-snap-align:start}:root{--overflow-slider-arrows-size:1.5rem;--overflow-slider-arrows-gap:.5rem;--overflow-slider-arrows-inactive-opacity:0.5}.overflow-slider__arrows{display:flex;gap:var(--overflow-slider-arrows-gap)}.overflow-slider__arrows-button{align-items:center;cursor:pointer;display:flex;outline-offset:-2px}.overflow-slider__arrows-button svg{height:var(--overflow-slider-arrows-size);width:var(--overflow-slider-arrows-size)}.overflow-slider__arrows-button[data-has-content=false]{opacity:var(--overflow-slider-arrows-inactive-opacity)}:root{--overflow-slider-dots-gap:0.5rem;--overflow-slider-dot-size:0.75rem;--overflow-slider-dot-inactive-color:rgba(0,0,0,.1);--overflow-slider-dot-active-color:rgba(0,0,0,.8)}.overflow-slider__dots{align-items:center;display:flex;justify-content:center}.overflow-slider__dots ul{display:flex;flex-wrap:wrap;gap:var(--overflow-slider-dots-gap);list-style:none;margin:0;padding:0}.overflow-slider__dots li{line-height:0;margin:0;padding:0}.overflow-slider__dot-item{background:var(--overflow-slider-dot-inactive-color);border-radius:50%;cursor:pointer;height:var(--overflow-slider-dot-size);margin:0;outline-offset:2px;padding:0;position:relative;width:var(--overflow-slider-dot-size)}.overflow-slider__dot-item:after{bottom:calc(var(--overflow-slider-dots-gap)*-1);content:"";display:block;left:calc(var(--overflow-slider-dots-gap)*-1);position:absolute;right:calc(var(--overflow-slider-dots-gap)*-1);top:calc(var(--overflow-slider-dots-gap)*-1)}.overflow-slider__dot-item:focus,.overflow-slider__dot-item:hover,.overflow-slider__dot-item[aria-pressed=true]{background:var(--overflow-slider-dot-active-color)}:root{--overflow-slider-fade-color:#fff;--overflow-slider-fade-width:3rem}.overflow-slider-fade{height:100%;pointer-events:none;position:absolute;top:0;width:var(--overflow-slider-fade-width);z-index:1}.overflow-slider-fade--start{background:linear-gradient(to right,var(--overflow-slider-fade-color) 0,transparent 100%);left:0}.overflow-slider-fade--end{background:linear-gradient(to left,var(--overflow-slider-fade-color) 0,transparent 100%);right:0}[data-has-drag-scrolling][data-has-overflow=true]{cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none}:root{--overflow-slider-scroll-indicator-button-height:4px;--overflow-slider-scroll-indicator-padding:1rem;--overflow-slider-scroll-indicator-button-color:rgba(0,0,0,.75);--overflow-slider-scroll-indicator-bar-color:rgba(0,0,0,.25)}.overflow-slider__scroll-indicator{cursor:pointer;outline:0;padding-block:var(--overflow-slider-scroll-indicator-padding);position:relative;width:100%}.overflow-slider__scroll-indicator[data-has-overflow=false]{display:none}.overflow-slider__scroll-indicator:focus-visible .overflow-slider__scroll-indicator-button{outline:2px solid;outline-offset:2px}.overflow-slider__scroll-indicator-bar{background:var(--overflow-slider-scroll-indicator-bar-color);border-radius:3px;height:2px;left:0;position:absolute;top:50%;transform:translateY(-50%);width:100%}.overflow-slider__scroll-indicator-button{background:var(--overflow-slider-scroll-indicator-button-color);border-radius:3px;cursor:grab;height:var(--overflow-slider-scroll-indicator-button-height);left:0;position:absolute;top:calc(50% - var(--overflow-slider-scroll-indicator-button-height)/2)}.overflow-slider__scroll-indicator-button:hover,.overflow-slider__scroll-indicator-button[data-is-grabbed=true]{--overflow-slider-scroll-indicator-button-height:6px}.overflow-slider__scroll-indicator-button:after{bottom:calc(var(--overflow-slider-scroll-indicator-padding)*-1);content:"";display:block;position:absolute;top:calc(var(--overflow-slider-scroll-indicator-padding)*-1);width:100%}
|
|
1
|
+
.overflow-slider{-ms-overflow-style:none;display:grid;grid-auto-flow:column;grid-template-columns:max-content;max-width:-moz-max-content;max-width:max-content;overflow:auto;position:relative;scrollbar-width:none;width:100%}.overflow-slider::-webkit-scrollbar{display:none}.overflow-slider>*{outline-offset:-2px;scroll-snap-align:start}:root{--overflow-slider-arrows-size:1.5rem;--overflow-slider-arrows-gap:.5rem;--overflow-slider-arrows-inactive-opacity:0.5}.overflow-slider__arrows{display:flex;gap:var(--overflow-slider-arrows-gap)}.overflow-slider__arrows-button{align-items:center;cursor:pointer;display:flex;outline-offset:-2px}.overflow-slider__arrows-button svg{height:var(--overflow-slider-arrows-size);width:var(--overflow-slider-arrows-size)}.overflow-slider__arrows-button[data-has-content=false]{opacity:var(--overflow-slider-arrows-inactive-opacity)}:root{--overflow-slider-dots-gap:0.5rem;--overflow-slider-dot-size:0.75rem;--overflow-slider-dot-inactive-color:rgba(0,0,0,.1);--overflow-slider-dot-active-color:rgba(0,0,0,.8)}.overflow-slider__dots{align-items:center;display:flex;justify-content:center}.overflow-slider__dots ul{display:flex;flex-wrap:wrap;gap:var(--overflow-slider-dots-gap);list-style:none;margin:0;padding:0}.overflow-slider__dots li{line-height:0;margin:0;padding:0}.overflow-slider__dot-item{background:var(--overflow-slider-dot-inactive-color);border-radius:50%;cursor:pointer;height:var(--overflow-slider-dot-size);margin:0;outline-offset:2px;padding:0;position:relative;width:var(--overflow-slider-dot-size)}.overflow-slider__dot-item:after{bottom:calc(var(--overflow-slider-dots-gap)*-1);content:"";display:block;left:calc(var(--overflow-slider-dots-gap)*-1);position:absolute;right:calc(var(--overflow-slider-dots-gap)*-1);top:calc(var(--overflow-slider-dots-gap)*-1)}.overflow-slider__dot-item:focus,.overflow-slider__dot-item:hover,.overflow-slider__dot-item[aria-pressed=true]{background:var(--overflow-slider-dot-active-color)}:root{--overflow-slider-fade-color:#fff;--overflow-slider-fade-width:3rem}.overflow-slider-fade{height:100%;pointer-events:none;position:absolute;top:0;width:var(--overflow-slider-fade-width);z-index:1}.overflow-slider-fade--start{background:linear-gradient(to right,var(--overflow-slider-fade-color) 0,transparent 100%);left:0}[dir=rtl] .overflow-slider-fade--start{left:auto}.overflow-slider-fade--end,[dir=rtl] .overflow-slider-fade--start{background:linear-gradient(to left,var(--overflow-slider-fade-color) 0,transparent 100%);right:0}[dir=rtl] .overflow-slider-fade--end{background:linear-gradient(to right,var(--overflow-slider-fade-color) 0,transparent 100%);left:0;right:auto}[data-has-drag-scrolling][data-has-overflow=true]{cursor:grab;-webkit-user-select:none;-moz-user-select:none;user-select:none}:root{--overflow-slider-scroll-indicator-button-height:4px;--overflow-slider-scroll-indicator-padding:1rem;--overflow-slider-scroll-indicator-button-color:rgba(0,0,0,.75);--overflow-slider-scroll-indicator-bar-color:rgba(0,0,0,.25)}.overflow-slider__scroll-indicator{cursor:pointer;outline:0;padding-block:var(--overflow-slider-scroll-indicator-padding);position:relative;width:100%}.overflow-slider__scroll-indicator[data-has-overflow=false]{display:none}.overflow-slider__scroll-indicator:focus-visible .overflow-slider__scroll-indicator-button{outline:2px solid;outline-offset:2px}.overflow-slider__scroll-indicator-bar{background:var(--overflow-slider-scroll-indicator-bar-color);border-radius:3px;height:2px;left:0;position:absolute;top:50%;transform:translateY(-50%);width:100%}.overflow-slider__scroll-indicator-button{background:var(--overflow-slider-scroll-indicator-button-color);border-radius:3px;cursor:grab;height:var(--overflow-slider-scroll-indicator-button-height);left:0;position:absolute;top:calc(50% - var(--overflow-slider-scroll-indicator-button-height)/2)}.overflow-slider__scroll-indicator-button:hover,.overflow-slider__scroll-indicator-button[data-is-grabbed=true]{--overflow-slider-scroll-indicator-button-height:6px}.overflow-slider__scroll-indicator-button:after{bottom:calc(var(--overflow-slider-scroll-indicator-padding)*-1);content:"";display:block;position:absolute;top:calc(var(--overflow-slider-scroll-indicator-padding)*-1);width:100%}
|
|
@@ -30,36 +30,46 @@ function ArrowsPlugin(args) {
|
|
|
30
30
|
prev.setAttribute('aria-label', options.texts.buttonPrevious);
|
|
31
31
|
prev.setAttribute('aria-controls', (_d = slider.container.getAttribute('id')) !== null && _d !== void 0 ? _d : '');
|
|
32
32
|
prev.setAttribute('data-type', 'prev');
|
|
33
|
-
prev.innerHTML = options.icons.prev;
|
|
34
|
-
prev.addEventListener('click', () =>
|
|
33
|
+
prev.innerHTML = slider.options.rtl ? options.icons.next : options.icons.prev;
|
|
34
|
+
prev.addEventListener('click', () => {
|
|
35
|
+
if (prev.getAttribute('data-has-content') === 'true') {
|
|
36
|
+
slider.moveToDirection('prev');
|
|
37
|
+
}
|
|
38
|
+
});
|
|
35
39
|
const next = document.createElement('button');
|
|
36
40
|
next.setAttribute('class', options.classNames.nextButton);
|
|
37
41
|
next.setAttribute('type', 'button');
|
|
38
42
|
next.setAttribute('aria-label', options.texts.buttonNext);
|
|
39
43
|
next.setAttribute('aria-controls', (_e = slider.container.getAttribute('id')) !== null && _e !== void 0 ? _e : '');
|
|
40
44
|
next.setAttribute('data-type', 'next');
|
|
41
|
-
next.innerHTML = options.icons.next;
|
|
42
|
-
next.addEventListener('click', () =>
|
|
45
|
+
next.innerHTML = slider.options.rtl ? options.icons.prev : options.icons.next;
|
|
46
|
+
next.addEventListener('click', () => {
|
|
47
|
+
if (next.getAttribute('data-has-content') === 'true') {
|
|
48
|
+
slider.moveToDirection('next');
|
|
49
|
+
}
|
|
50
|
+
});
|
|
43
51
|
// insert buttons to the nav
|
|
44
52
|
nav.appendChild(prev);
|
|
45
53
|
nav.appendChild(next);
|
|
46
54
|
const update = () => {
|
|
47
|
-
const scrollLeft = slider.
|
|
48
|
-
const scrollWidth = slider.
|
|
49
|
-
const clientWidth = slider.
|
|
55
|
+
const scrollLeft = slider.getScrollLeft();
|
|
56
|
+
const scrollWidth = slider.getInclusiveScrollWidth();
|
|
57
|
+
const clientWidth = slider.getInclusiveClientWidth();
|
|
50
58
|
const buffer = 1;
|
|
51
|
-
if (scrollLeft === 0) {
|
|
59
|
+
if (Math.floor(scrollLeft) === 0) {
|
|
52
60
|
prev.setAttribute('data-has-content', 'false');
|
|
53
61
|
}
|
|
54
62
|
else {
|
|
55
63
|
prev.setAttribute('data-has-content', 'true');
|
|
56
64
|
}
|
|
57
|
-
|
|
65
|
+
const maxWidthDifference = Math.abs(Math.floor(scrollLeft + clientWidth) - Math.floor(scrollWidth));
|
|
66
|
+
if (maxWidthDifference <= buffer) {
|
|
58
67
|
next.setAttribute('data-has-content', 'false');
|
|
59
68
|
}
|
|
60
69
|
else {
|
|
61
70
|
next.setAttribute('data-has-content', 'true');
|
|
62
71
|
}
|
|
72
|
+
console.log('next', scrollLeft + clientWidth, scrollWidth);
|
|
63
73
|
};
|
|
64
74
|
if (options.containerNext && options.containerPrev) {
|
|
65
75
|
options.containerPrev.appendChild(prev);
|
|
@@ -74,7 +84,7 @@ function ArrowsPlugin(args) {
|
|
|
74
84
|
}
|
|
75
85
|
}
|
|
76
86
|
update();
|
|
77
|
-
slider.on('
|
|
87
|
+
slider.on('scrollEnd', update);
|
|
78
88
|
slider.on('contentsChanged', update);
|
|
79
89
|
slider.on('containerSizeChanged', update);
|
|
80
90
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const t={buttonPrevious:"Previous items",buttonNext:"Next items"},e={prev:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.6 3.4l-7.6 7.6 7.6 7.6 1.4-1.4-5-5h12.6v-2h-12.6l5-5z"/></svg>',next:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.4 3.4l-1.4 1.4 5 5h-12.6v2h12.6l-5 5 1.4 1.4 7.6-7.6z"/></svg>'},n={navContainer:"overflow-slider__arrows",prevButton:"overflow-slider__arrows-button overflow-slider__arrows-button--prev",nextButton:"overflow-slider__arrows-button overflow-slider__arrows-button--next"};function o(o){return
|
|
1
|
+
const t={buttonPrevious:"Previous items",buttonNext:"Next items"},e={prev:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M8.6 3.4l-7.6 7.6 7.6 7.6 1.4-1.4-5-5h12.6v-2h-12.6l5-5z"/></svg>',next:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.4 3.4l-1.4 1.4 5 5h-12.6v2h12.6l-5 5 1.4 1.4 7.6-7.6z"/></svg>'},n={navContainer:"overflow-slider__arrows",prevButton:"overflow-slider__arrows-button overflow-slider__arrows-button--prev",nextButton:"overflow-slider__arrows-button overflow-slider__arrows-button--next"};function o(o){return s=>{var i,r,a,l,c,u;const d={texts:Object.assign(Object.assign({},t),(null==o?void 0:o.texts)||[]),icons:Object.assign(Object.assign({},e),(null==o?void 0:o.icons)||[]),classNames:Object.assign(Object.assign({},n),(null==o?void 0:o.classNames)||[]),container:null!==(i=null==o?void 0:o.container)&&void 0!==i?i:null,containerPrev:null!==(r=null==o?void 0:o.containerPrev)&&void 0!==r?r:null,containerNext:null!==(a=null==o?void 0:o.containerNext)&&void 0!==a?a:null},v=document.createElement("div");v.classList.add(d.classNames.navContainer);const b=document.createElement("button");b.setAttribute("class",d.classNames.prevButton),b.setAttribute("type","button"),b.setAttribute("aria-label",d.texts.buttonPrevious),b.setAttribute("aria-controls",null!==(l=s.container.getAttribute("id"))&&void 0!==l?l:""),b.setAttribute("data-type","prev"),b.innerHTML=s.options.rtl?d.icons.next:d.icons.prev,b.addEventListener("click",(()=>{"true"===b.getAttribute("data-has-content")&&s.moveToDirection("prev")}));const p=document.createElement("button");p.setAttribute("class",d.classNames.nextButton),p.setAttribute("type","button"),p.setAttribute("aria-label",d.texts.buttonNext),p.setAttribute("aria-controls",null!==(c=s.container.getAttribute("id"))&&void 0!==c?c:""),p.setAttribute("data-type","next"),p.innerHTML=s.options.rtl?d.icons.prev:d.icons.next,p.addEventListener("click",(()=>{"true"===p.getAttribute("data-has-content")&&s.moveToDirection("next")})),v.appendChild(b),v.appendChild(p);const h=()=>{const t=s.getScrollLeft(),e=s.getInclusiveScrollWidth(),n=s.getInclusiveClientWidth();0===Math.floor(t)?b.setAttribute("data-has-content","false"):b.setAttribute("data-has-content","true");Math.abs(Math.floor(t+n)-Math.floor(e))<=1?p.setAttribute("data-has-content","false"):p.setAttribute("data-has-content","true"),console.log("next",t+n,e)};d.containerNext&&d.containerPrev?(d.containerPrev.appendChild(b),d.containerNext.appendChild(p)):d.container?d.container.appendChild(v):null===(u=s.container.parentNode)||void 0===u||u.insertBefore(v,s.container.nextSibling),h(),s.on("scrollEnd",h),s.on("contentsChanged",h),s.on("containerSizeChanged",h)}}export{o as default};
|
|
@@ -76,10 +76,6 @@ function DotsPlugin(args) {
|
|
|
76
76
|
}
|
|
77
77
|
};
|
|
78
78
|
const activateDot = (item) => {
|
|
79
|
-
// const scrollTargetPosition = slider.details.containerWidth * ( page - 1 );
|
|
80
|
-
// slider.container.style.scrollBehavior = slider.options.scrollBehavior;
|
|
81
|
-
// slider.container.scrollLeft = scrollTargetPosition;
|
|
82
|
-
// slider.container.style.scrollBehavior = '';
|
|
83
79
|
slider.moveToSlide(item - 1);
|
|
84
80
|
};
|
|
85
81
|
buildDots();
|
|
@@ -49,7 +49,7 @@ function DragScrollingPlugin(args) {
|
|
|
49
49
|
const walk = (x - startX);
|
|
50
50
|
const newScrollLeft = scrollLeft - walk;
|
|
51
51
|
mayNeedToSnap = true;
|
|
52
|
-
if (slider.container.scrollLeft !== newScrollLeft) {
|
|
52
|
+
if (Math.floor(slider.container.scrollLeft) !== Math.floor(newScrollLeft)) {
|
|
53
53
|
isMovingForward = slider.container.scrollLeft < newScrollLeft;
|
|
54
54
|
}
|
|
55
55
|
slider.container.scrollLeft = newScrollLeft;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function e(e){var t;const o=null!==(t=null==e?void 0:e.draggedDistanceThatPreventsClick)&&void 0!==t?t:20;return e=>{let t=!1,n=0,r=0,a=!1,
|
|
1
|
+
function e(e){var t;const o=null!==(t=null==e?void 0:e.draggedDistanceThatPreventsClick)&&void 0!==t?t:20;return e=>{let t=!1,n=0,r=0,a=!1,l=!1,s=!1;e.container.setAttribute("data-has-drag-scrolling","true");if(window.addEventListener("mousedown",(o=>{l=!1,e.details.hasOverflow&&e.container.contains(o.target)&&(t=!0,n=o.pageX-e.container.offsetLeft,r=e.container.scrollLeft,e.container.style.cursor="grabbing",e.container.style.scrollBehavior="auto",o.preventDefault(),o.stopPropagation())})),window.addEventListener("mousemove",(i=>{if(!e.details.hasOverflow)return void(l=!1);if(!t)return void(l=!1);i.preventDefault(),l||(l=!0,e.emit("programmaticScrollStart"));const c=i.pageX-e.container.offsetLeft-n,d=r-c;s=!0,Math.floor(e.container.scrollLeft)!==Math.floor(d)&&(a=e.container.scrollLeft<d),e.container.scrollLeft=d;const f=Math.abs(c),u=e.container.querySelectorAll(e.options.slidesSelector),v=f>o?"none":"";u.forEach((e=>{e.style.pointerEvents=v}))})),window.addEventListener("mouseup",(()=>{e.details.hasOverflow?(t=!1,e.container.style.cursor="",setTimeout((()=>{l=!1,e.container.style.scrollBehavior="";e.container.querySelectorAll(e.options.slidesSelector).forEach((e=>{e.style.pointerEvents=""}))}),50)):l=!1})),e.options.emulateScrollSnap){const o=()=>{s&&!t&&(s=!1,e.snapToClosestSlide(a?"next":"prev"))};e.on("programmaticScrollEnd",o),window.addEventListener("mouseup",o)}}}export{e as default};
|
|
@@ -32,23 +32,23 @@ function FadePlugin(args) {
|
|
|
32
32
|
options.container.appendChild(fadeItemEnd);
|
|
33
33
|
}
|
|
34
34
|
const hasFadeAtStart = () => {
|
|
35
|
-
return slider.
|
|
35
|
+
return slider.getScrollLeft() > fadeItemStart.offsetWidth;
|
|
36
36
|
};
|
|
37
37
|
const fadeAtStartOpacity = () => {
|
|
38
|
-
const position = slider.
|
|
39
|
-
if (position <= fadeItemStart.offsetWidth) {
|
|
38
|
+
const position = slider.getScrollLeft();
|
|
39
|
+
if (Math.floor(position) <= Math.floor(fadeItemStart.offsetWidth)) {
|
|
40
40
|
return position / Math.max(fadeItemStart.offsetWidth, 1);
|
|
41
41
|
}
|
|
42
42
|
return 1;
|
|
43
43
|
};
|
|
44
44
|
const hasFadeAtEnd = () => {
|
|
45
|
-
return slider.
|
|
45
|
+
return Math.floor(slider.getScrollLeft()) < Math.floor(slider.getInclusiveScrollWidth() - slider.getInclusiveClientWidth() - fadeItemEnd.offsetWidth);
|
|
46
46
|
};
|
|
47
47
|
const fadeAtEndOpacity = () => {
|
|
48
|
-
const position = slider.
|
|
49
|
-
const maxPosition = slider.
|
|
48
|
+
const position = slider.getScrollLeft();
|
|
49
|
+
const maxPosition = slider.getInclusiveScrollWidth() - slider.getInclusiveClientWidth();
|
|
50
50
|
const maxFadePosition = maxPosition - fadeItemEnd.offsetWidth;
|
|
51
|
-
if (position >= maxFadePosition) {
|
|
51
|
+
if (Math.floor(position) >= Math.floor(maxFadePosition)) {
|
|
52
52
|
return ((maxFadePosition - position) / Math.max(fadeItemEnd.offsetWidth, 1)) + 1;
|
|
53
53
|
}
|
|
54
54
|
return 1;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
function t(t){return e=>{var n,a,
|
|
1
|
+
function t(t){return e=>{var n,a,o;const i={classNames:{fadeItem:"overflow-slider-fade",fadeItemStart:"overflow-slider-fade--start",fadeItemEnd:"overflow-slider-fade--end"},container:null!==(n=null==t?void 0:t.container)&&void 0!==n?n:null,containerStart:null!==(a=null==t?void 0:t.containerStart)&&void 0!==a?a:null,containerEnd:null!==(o=null==t?void 0:t.containerEnd)&&void 0!==o?o:null},l=document.createElement("div");l.classList.add(i.classNames.fadeItem,i.classNames.fadeItemStart),l.setAttribute("aria-hidden","true"),l.setAttribute("tabindex","-1");const r=document.createElement("div");r.classList.add(i.classNames.fadeItem,i.classNames.fadeItemEnd),r.setAttribute("aria-hidden","true"),r.setAttribute("tabindex","-1"),i.containerStart?i.containerStart.appendChild(l):i.container&&i.container.appendChild(l),i.containerEnd?i.containerEnd.appendChild(r):i.container&&i.container.appendChild(r);const d=()=>{l.setAttribute("data-has-fade",(e.getScrollLeft()>l.offsetWidth).toString()),l.style.opacity=(()=>{const t=e.getScrollLeft();return Math.floor(t)<=Math.floor(l.offsetWidth)?t/Math.max(l.offsetWidth,1):1})().toString(),r.setAttribute("data-has-fade",(Math.floor(e.getScrollLeft())<Math.floor(e.getInclusiveScrollWidth()-e.getInclusiveClientWidth()-r.offsetWidth)).toString()),r.style.opacity=(()=>{const t=e.getScrollLeft(),n=e.getInclusiveScrollWidth()-e.getInclusiveClientWidth()-r.offsetWidth;return Math.floor(t)>=Math.floor(n)?(n-t)/Math.max(r.offsetWidth,1)+1:1})().toString()};d(),e.on("created",d),e.on("contentsChanged",d),e.on("containerSizeChanged",d),e.on("scrollEnd",d),e.on("scrollStart",d);let s=0;e.on("scroll",(()=>{s&&window.cancelAnimationFrame(s),s=window.requestAnimationFrame((()=>{d()}))}))}}export{t as default};
|
|
@@ -16,16 +16,21 @@ function FullWidthPlugin(args) {
|
|
|
16
16
|
const lastSlide = slides[slides.length - 1];
|
|
17
17
|
const marginAmount = Math.floor((window.innerWidth - options.targetWidth(slider)) / 2);
|
|
18
18
|
if (options.addMarginBefore) {
|
|
19
|
-
firstSlide.style.
|
|
19
|
+
firstSlide.style.marginInlineStart = `${marginAmount}px`;
|
|
20
20
|
}
|
|
21
21
|
if (options.addMarginAfter) {
|
|
22
|
-
lastSlide.style.
|
|
22
|
+
lastSlide.style.marginInlineEnd = `${marginAmount}px`;
|
|
23
23
|
}
|
|
24
24
|
slider.container.setAttribute('data-full-width-offset', marginAmount.toString());
|
|
25
|
+
setCSS();
|
|
26
|
+
};
|
|
27
|
+
const setCSS = () => {
|
|
28
|
+
slider.container.style.setProperty('--slider-container-target-width', `${options.targetWidth(slider)}px`);
|
|
25
29
|
};
|
|
26
30
|
update();
|
|
27
31
|
slider.on('contentsChanged', update);
|
|
28
32
|
slider.on('containerSizeChanged', update);
|
|
33
|
+
window.addEventListener('resize', setCSS);
|
|
29
34
|
};
|
|
30
35
|
}
|
|
31
36
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
const t=t=>{var n,e;return null!==(e=null===(n=t.container.parentElement)||void 0===n?void 0:n.offsetWidth)&&void 0!==e?e:window.innerWidth};function n(n){return e=>{var i,r,
|
|
1
|
+
const t=t=>{var n,e;return null!==(e=null===(n=t.container.parentElement)||void 0===n?void 0:n.offsetWidth)&&void 0!==e?e:window.innerWidth};function n(n){return e=>{var i,r,d;const o={targetWidth:null!==(i=null==n?void 0:n.targetWidth)&&void 0!==i?i:t,addMarginBefore:null===(r=null==n?void 0:n.addMarginBefore)||void 0===r||r,addMarginAfter:null===(d=null==n?void 0:n.addMarginAfter)||void 0===d||d},a=()=>{const t=e.container.querySelectorAll(e.options.slidesSelector);if(!t.length)return;const n=t[0],i=t[t.length-1],r=Math.floor((window.innerWidth-o.targetWidth(e))/2);o.addMarginBefore&&(n.style.marginInlineStart=`${r}px`),o.addMarginAfter&&(i.style.marginInlineEnd=`${r}px`),e.container.setAttribute("data-full-width-offset",r.toString()),l()},l=()=>{e.container.style.setProperty("--slider-container-target-width",`${o.targetWidth(e)}px`)};a(),e.on("contentsChanged",a),e.on("containerSizeChanged",a),window.addEventListener("resize",l)}}export{n as default};
|