@evermade/overflow-slider 3.1.0 → 3.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +339 -8
- package/dist/core/details.esm.js +3 -3
- 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 +69 -22
- package/dist/core/slider.min.js +1 -1
- package/dist/core/utils.esm.js +2 -1
- package/dist/core/utils.min.js +1 -1
- package/dist/overflow-slider.css +1 -1
- package/dist/plugins/arrows/arrows/index.esm.js +7 -4
- package/dist/plugins/arrows/arrows/index.min.js +1 -1
- package/dist/plugins/dots/dots/index.esm.js +0 -4
- package/dist/plugins/fade/fade/index.esm.js +4 -4
- 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 +18 -18
- package/dist/plugins/scroll-indicator/scroll-indicator/index.min.js +1 -1
- package/dist/plugins/thumbnails/thumbnails/index.esm.js +8 -5
- 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 +3 -3
- 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 +69 -22
- package/docs/dist/core/slider.min.js +1 -1
- package/docs/dist/core/utils.esm.js +2 -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 +7 -4
- 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/fade/fade/index.esm.js +4 -4
- 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 +18 -18
- package/docs/dist/plugins/scroll-indicator/scroll-indicator/index.min.js +1 -1
- package/docs/dist/plugins/thumbnails/thumbnails/index.esm.js +8 -5
- 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 +3 -3
- package/src/core/overflow-slider.ts +1 -0
- package/src/core/slider.ts +79 -27
- package/src/core/types.ts +10 -3
- package/src/core/utils.ts +9 -5
- package/src/plugins/arrows/index.ts +8 -6
- package/src/plugins/dots/index.ts +1 -5
- package/src/plugins/drag-scrolling/index.ts +1 -1
- package/src/plugins/fade/index.ts +5 -5
- package/src/plugins/fade/styles.scss +10 -0
- package/src/plugins/full-width/index.ts +9 -3
- package/src/plugins/scroll-indicator/index.ts +60 -62
- package/src/plugins/skip-links/index.ts +1 -1
- package/src/plugins/thumbnails/index.ts +9 -6
package/src/core/slider.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { Slider, SliderOptions, SliderPlugin } from './types';
|
|
1
|
+
import { Slider, SliderOptions, SliderPlugin, SliderCallback } from './types';
|
|
2
2
|
import details from './details';
|
|
3
3
|
import { generateId, objectsAreEqual, getOutermostChildrenEdgeMarginSum } from './utils';
|
|
4
4
|
|
|
5
5
|
export default function Slider( container: HTMLElement, options : SliderOptions, plugins? : SliderPlugin[] ) {
|
|
6
6
|
let slider: Slider;
|
|
7
|
-
let subs: { [key: string]:
|
|
7
|
+
let subs: { [key: string]: SliderCallback[] } = {};
|
|
8
8
|
|
|
9
9
|
function init() {
|
|
10
10
|
slider.container = container;
|
|
@@ -91,7 +91,7 @@ export default function Slider( container: HTMLElement, options : SliderOptions,
|
|
|
91
91
|
let isUserScrolling = false;
|
|
92
92
|
let isProgrammaticScrolling = false;
|
|
93
93
|
|
|
94
|
-
//
|
|
94
|
+
// all types of scroll
|
|
95
95
|
slider.container.addEventListener('scroll', () => {
|
|
96
96
|
const newScrollLeft = slider.container.scrollLeft;
|
|
97
97
|
if ( Math.floor( scrollLeft ) !== Math.floor( newScrollLeft ) ) {
|
|
@@ -207,6 +207,9 @@ export default function Slider( container: HTMLElement, options : SliderOptions,
|
|
|
207
207
|
|
|
208
208
|
function setDataAttributes() {
|
|
209
209
|
slider.container.setAttribute('data-has-overflow', slider.details.hasOverflow ? 'true' : 'false');
|
|
210
|
+
if ( slider.options.rtl ) {
|
|
211
|
+
slider.container.setAttribute('dir', 'rtl');
|
|
212
|
+
}
|
|
210
213
|
}
|
|
211
214
|
|
|
212
215
|
function ensureSlideIsInView( slide: HTMLElement, scrollBehavior: null|ScrollBehavior = null) {
|
|
@@ -237,24 +240,51 @@ export default function Slider( container: HTMLElement, options : SliderOptions,
|
|
|
237
240
|
|
|
238
241
|
function setActiveSlideIdx() {
|
|
239
242
|
const sliderRect = slider.container.getBoundingClientRect();
|
|
240
|
-
const scrollLeft = slider.
|
|
243
|
+
const scrollLeft = slider.getScrollLeft();
|
|
241
244
|
const slides = slider.slides;
|
|
242
245
|
let activeSlideIdx = 0;
|
|
243
246
|
let scrolledPastLastSlide = false;
|
|
244
247
|
|
|
245
|
-
|
|
246
|
-
const
|
|
247
|
-
const
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
248
|
+
if (slider.options.rtl) {
|
|
249
|
+
const scrolledDistance = slider.getInclusiveScrollWidth() - scrollLeft - slider.getInclusiveClientWidth();
|
|
250
|
+
const slidePositions = [];
|
|
251
|
+
for (let i = slides.length - 1; i >= 0; i--) {
|
|
252
|
+
const slideRect = slides[i].getBoundingClientRect();
|
|
253
|
+
const slideEnd = Math.abs(slideRect.left) - Math.abs(sliderRect.left) + scrolledDistance;
|
|
254
|
+
slidePositions.push({
|
|
255
|
+
slide: slides[i],
|
|
256
|
+
slideEnd: slideEnd,
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
let closestSlide = null;
|
|
260
|
+
let closestDistance = null;
|
|
261
|
+
for (let i = 0; i < slidePositions.length; i++) {
|
|
262
|
+
const distance = Math.abs(slidePositions[i].slideEnd - scrolledDistance);
|
|
263
|
+
if (closestDistance === null || distance < closestDistance) {
|
|
264
|
+
closestDistance = distance;
|
|
265
|
+
closestSlide = slidePositions[i].slide;
|
|
266
|
+
}
|
|
252
267
|
}
|
|
253
|
-
if (
|
|
254
|
-
|
|
268
|
+
if (closestSlide) {
|
|
269
|
+
activeSlideIdx = slides.indexOf(closestSlide);
|
|
270
|
+
} else {
|
|
271
|
+
activeSlideIdx = slides.length - 1;
|
|
272
|
+
}
|
|
273
|
+
} else {
|
|
274
|
+
for (let i = 0; i < slides.length; i++) {
|
|
275
|
+
const slideRect = slides[i].getBoundingClientRect();
|
|
276
|
+
const slideStart = slideRect.left - sliderRect.left + scrollLeft + getGapSize();
|
|
277
|
+
if (Math.floor(slideStart) >= Math.floor(scrollLeft)) {
|
|
278
|
+
activeSlideIdx = i;
|
|
279
|
+
break;
|
|
280
|
+
}
|
|
281
|
+
if ( i === slides.length - 1 ) {
|
|
282
|
+
scrolledPastLastSlide = true;
|
|
283
|
+
}
|
|
255
284
|
}
|
|
256
285
|
}
|
|
257
286
|
|
|
287
|
+
|
|
258
288
|
if ( scrolledPastLastSlide ) {
|
|
259
289
|
activeSlideIdx = slides.length - 1;
|
|
260
290
|
}
|
|
@@ -262,6 +292,8 @@ export default function Slider( container: HTMLElement, options : SliderOptions,
|
|
|
262
292
|
const oldActiveSlideIdx = slider.activeSlideIdx;
|
|
263
293
|
slider.activeSlideIdx = activeSlideIdx;
|
|
264
294
|
|
|
295
|
+
// console.log('activeSlideIdx', activeSlideIdx);
|
|
296
|
+
|
|
265
297
|
if (oldActiveSlideIdx !== activeSlideIdx) {
|
|
266
298
|
slider.emit('activeSlideChanged');
|
|
267
299
|
}
|
|
@@ -283,12 +315,20 @@ export default function Slider( container: HTMLElement, options : SliderOptions,
|
|
|
283
315
|
return slider.container.clientWidth + getOutermostChildrenEdgeMarginSum(slider.container);
|
|
284
316
|
}
|
|
285
317
|
|
|
318
|
+
function getScrollLeft() : number {
|
|
319
|
+
return slider.options.rtl ? Math.abs(slider.container.scrollLeft) : slider.container.scrollLeft;
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
function setScrollLeft(value: number) : void {
|
|
323
|
+
slider.container.scrollLeft = slider.options.rtl ? -value : value;
|
|
324
|
+
};
|
|
325
|
+
|
|
286
326
|
function getGapSize() : number {
|
|
287
327
|
let gapSize = 0;
|
|
288
328
|
if (slider.slides.length > 1) {
|
|
289
329
|
const firstSlideRect = slider.slides[0].getBoundingClientRect();
|
|
290
330
|
const secondSlideRect = slider.slides[1].getBoundingClientRect();
|
|
291
|
-
gapSize = Math.floor( secondSlideRect.left - firstSlideRect.right );
|
|
331
|
+
gapSize = slider.options.rtl ? Math.abs( Math.floor( secondSlideRect.right - firstSlideRect.left ) ) : Math.floor( secondSlideRect.left - firstSlideRect.right );
|
|
292
332
|
}
|
|
293
333
|
return gapSize;
|
|
294
334
|
};
|
|
@@ -308,22 +348,25 @@ export default function Slider( container: HTMLElement, options : SliderOptions,
|
|
|
308
348
|
const sliderRect = slider.container.getBoundingClientRect();
|
|
309
349
|
const containerWidth = slider.container.offsetWidth;
|
|
310
350
|
let targetScrollPosition = scrollLeft;
|
|
311
|
-
|
|
351
|
+
|
|
352
|
+
const realDirection = slider.options.rtl ? (direction === 'prev' ? 'next' : 'prev') : direction;
|
|
353
|
+
|
|
354
|
+
if (realDirection === 'prev') {
|
|
312
355
|
targetScrollPosition = Math.max(0, scrollLeft - slider.container.offsetWidth);
|
|
313
|
-
} else if (
|
|
356
|
+
} else if (realDirection === 'next') {
|
|
314
357
|
targetScrollPosition = Math.min(slider.getInclusiveScrollWidth(), scrollLeft + slider.container.offsetWidth);
|
|
315
358
|
}
|
|
316
359
|
if (scrollStrategy === 'fullSlide') {
|
|
317
360
|
let fullSlideTargetScrollPosition = null;
|
|
318
361
|
|
|
319
362
|
// extend targetScrollPosition to include gap
|
|
320
|
-
if (
|
|
363
|
+
if (realDirection === 'prev') {
|
|
321
364
|
fullSlideTargetScrollPosition = Math.max(0, targetScrollPosition - getGapSize());
|
|
322
365
|
} else {
|
|
323
366
|
fullSlideTargetScrollPosition = Math.min(slider.getInclusiveScrollWidth(), targetScrollPosition + getGapSize());
|
|
324
367
|
}
|
|
325
368
|
|
|
326
|
-
if (
|
|
369
|
+
if (realDirection === 'next') {
|
|
327
370
|
let partialSlideFound = false;
|
|
328
371
|
for (let slide of slider.slides) {
|
|
329
372
|
const slideRect = slide.getBoundingClientRect();
|
|
@@ -383,12 +426,12 @@ export default function Slider( container: HTMLElement, options : SliderOptions,
|
|
|
383
426
|
};
|
|
384
427
|
|
|
385
428
|
function snapToClosestSlide(direction = "prev") {
|
|
386
|
-
const isMovingForward = direction === 'next';
|
|
429
|
+
const isMovingForward = slider.options.rtl ? direction === 'prev' : direction === 'next';
|
|
387
430
|
const slideReference = [];
|
|
388
431
|
for (let i = 0; i < slider.slides.length; i++) {
|
|
389
432
|
const slide = slider.slides[i];
|
|
390
433
|
const slideWidth = slide.offsetWidth;
|
|
391
|
-
const slideStart = slide.offsetLeft;
|
|
434
|
+
const slideStart = slider.options.rtl ? Math.abs( slide.offsetLeft + slideWidth - slider.details.containerWidth ) : slide.offsetLeft;
|
|
392
435
|
const slideEnd = slideStart + slideWidth;
|
|
393
436
|
const slideMiddle = slideStart + slideWidth / 2;
|
|
394
437
|
const trigger = Math.min(slideMiddle, slideStart + slider.options.emulateScrollSnapMaxThreshold);
|
|
@@ -399,10 +442,14 @@ export default function Slider( container: HTMLElement, options : SliderOptions,
|
|
|
399
442
|
width: slideWidth,
|
|
400
443
|
trigger: trigger,
|
|
401
444
|
slide: slide,
|
|
445
|
+
// debug
|
|
446
|
+
offSetleft: slide.offsetLeft,
|
|
447
|
+
rect: slide.getBoundingClientRect(),
|
|
402
448
|
});
|
|
403
449
|
}
|
|
450
|
+
console.log('slideReference', slideReference);
|
|
404
451
|
let snapTarget = null;
|
|
405
|
-
const scrollPosition =
|
|
452
|
+
const scrollPosition = getScrollLeft();
|
|
406
453
|
if (isMovingForward) {
|
|
407
454
|
for (let i = 0; i < slideReference.length; i++) {
|
|
408
455
|
const item = slideReference[i];
|
|
@@ -410,7 +457,7 @@ export default function Slider( container: HTMLElement, options : SliderOptions,
|
|
|
410
457
|
snapTarget = 0;
|
|
411
458
|
break;
|
|
412
459
|
}
|
|
413
|
-
if ( Math.floor(
|
|
460
|
+
if ( Math.floor( getScrollLeft() ) <= Math.floor( item.trigger ) ) {
|
|
414
461
|
snapTarget = item.start;
|
|
415
462
|
break;
|
|
416
463
|
}
|
|
@@ -422,7 +469,7 @@ export default function Slider( container: HTMLElement, options : SliderOptions,
|
|
|
422
469
|
snapTarget = item.start;
|
|
423
470
|
break;
|
|
424
471
|
}
|
|
425
|
-
if ( Math.floor(
|
|
472
|
+
if ( Math.floor( getScrollLeft() ) >= Math.floor( item.trigger ) ) {
|
|
426
473
|
snapTarget = item.start;
|
|
427
474
|
break;
|
|
428
475
|
}
|
|
@@ -435,14 +482,15 @@ export default function Slider( container: HTMLElement, options : SliderOptions,
|
|
|
435
482
|
}
|
|
436
483
|
|
|
437
484
|
const scrollBehavior = slider.options.scrollBehavior || 'smooth';
|
|
485
|
+
|
|
438
486
|
slider.container.scrollTo({
|
|
439
|
-
left: snapTarget,
|
|
487
|
+
left: slider.options.rtl ? -snapTarget : snapTarget,
|
|
440
488
|
behavior: scrollBehavior as ScrollBehavior
|
|
441
489
|
});
|
|
442
490
|
}
|
|
443
491
|
};
|
|
444
492
|
|
|
445
|
-
function on(name: string, cb:
|
|
493
|
+
function on(name: string, cb: SliderCallback) {
|
|
446
494
|
if (!subs[name]) {
|
|
447
495
|
subs[name] = [];
|
|
448
496
|
}
|
|
@@ -452,12 +500,14 @@ export default function Slider( container: HTMLElement, options : SliderOptions,
|
|
|
452
500
|
function emit(name: string) {
|
|
453
501
|
if (subs && subs[name]) {
|
|
454
502
|
subs[name].forEach(cb => {
|
|
455
|
-
|
|
503
|
+
cb(slider);
|
|
456
504
|
});
|
|
457
505
|
}
|
|
506
|
+
|
|
458
507
|
const optionCallBack = slider?.options?.[name];
|
|
508
|
+
// Type guard to check if the option callback is a function
|
|
459
509
|
if (typeof optionCallBack === 'function') {
|
|
460
|
-
|
|
510
|
+
(optionCallBack as SliderCallback)(slider); // Type assertion here
|
|
461
511
|
}
|
|
462
512
|
};
|
|
463
513
|
|
|
@@ -468,6 +518,8 @@ export default function Slider( container: HTMLElement, options : SliderOptions,
|
|
|
468
518
|
snapToClosestSlide,
|
|
469
519
|
getInclusiveScrollWidth,
|
|
470
520
|
getInclusiveClientWidth,
|
|
521
|
+
getScrollLeft,
|
|
522
|
+
setScrollLeft,
|
|
471
523
|
on,
|
|
472
524
|
options,
|
|
473
525
|
};
|
package/src/core/types.ts
CHANGED
|
@@ -13,22 +13,29 @@ export type Slider<O = {}, C = {}, H extends string = string> = {
|
|
|
13
13
|
) => void
|
|
14
14
|
getInclusiveScrollWidth: () => number
|
|
15
15
|
getInclusiveClientWidth: () => number
|
|
16
|
+
getScrollLeft: () => number
|
|
17
|
+
setScrollLeft: (value: number) => void
|
|
16
18
|
on: (
|
|
17
19
|
name: H | SliderHooks,
|
|
18
|
-
cb:
|
|
20
|
+
cb: SliderCallback
|
|
19
21
|
) => void
|
|
20
22
|
options: SliderOptions,
|
|
21
23
|
details: SliderDetails,
|
|
22
24
|
activeSlideIdx: number,
|
|
23
25
|
} & C;
|
|
24
26
|
|
|
27
|
+
export type SliderCallback<O = {}, C = {}, H extends string = string> = (
|
|
28
|
+
props: Slider<O, C, H>
|
|
29
|
+
) => void;
|
|
30
|
+
|
|
25
31
|
export type SliderOptions = {
|
|
26
32
|
scrollBehavior: string;
|
|
27
33
|
scrollStrategy: string;
|
|
28
34
|
slidesSelector: string;
|
|
29
35
|
emulateScrollSnap: boolean;
|
|
30
36
|
emulateScrollSnapMaxThreshold: number;
|
|
31
|
-
|
|
37
|
+
rtl: boolean;
|
|
38
|
+
[key: string]: unknown;
|
|
32
39
|
}
|
|
33
40
|
|
|
34
41
|
export type SliderDetails = {
|
|
@@ -62,7 +69,7 @@ export type HOOK_CONTENTS_CHANGED = 'contentsChanged';
|
|
|
62
69
|
export type HOOK_CONTAINER_SIZE_CHANGED = 'containerSizeChanged';
|
|
63
70
|
export type HOOK_ACTIVE_SLIDE_CHANGED = 'activeSlideChanged';
|
|
64
71
|
|
|
65
|
-
//
|
|
72
|
+
// all types of scroll
|
|
66
73
|
export type HOOK_SCROLL_START = 'scrollStart';
|
|
67
74
|
export type HOOK_SCROLL = 'scroll';
|
|
68
75
|
export type HOOK_SCROLL_END = 'scrollEnd';
|
package/src/core/utils.ts
CHANGED
|
@@ -7,17 +7,21 @@ function generateId( prefix : string, i = 1 ): string {
|
|
|
7
7
|
return id;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
-
function objectsAreEqual(
|
|
10
|
+
function objectsAreEqual(obj1: Record<string, unknown>, obj2: Record<string, unknown>): boolean {
|
|
11
11
|
const keys1 = Object.keys(obj1);
|
|
12
12
|
const keys2 = Object.keys(obj2);
|
|
13
|
+
|
|
13
14
|
if (keys1.length !== keys2.length) {
|
|
14
|
-
|
|
15
|
+
return false;
|
|
15
16
|
}
|
|
17
|
+
|
|
16
18
|
for (let key of keys1) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
19
|
+
// Use `Object.prototype.hasOwnProperty.call` for better safety
|
|
20
|
+
if (!Object.prototype.hasOwnProperty.call(obj2, key) || obj1[key] !== obj2[key]) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
20
23
|
}
|
|
24
|
+
|
|
21
25
|
return true;
|
|
22
26
|
}
|
|
23
27
|
|
|
@@ -35,7 +35,7 @@ export type ArrowsOptions = {
|
|
|
35
35
|
containerNext: HTMLElement | null,
|
|
36
36
|
};
|
|
37
37
|
|
|
38
|
-
export default function ArrowsPlugin( args: { [key: string]:
|
|
38
|
+
export default function ArrowsPlugin( args: { [key: string]: unknown } ) {
|
|
39
39
|
return ( slider: Slider ) => {
|
|
40
40
|
|
|
41
41
|
const options = <ArrowsOptions>{
|
|
@@ -65,7 +65,7 @@ export default function ArrowsPlugin( args: { [key: string]: any } ) {
|
|
|
65
65
|
prev.setAttribute( 'aria-label', options.texts.buttonPrevious );
|
|
66
66
|
prev.setAttribute( 'aria-controls', slider.container.getAttribute( 'id' ) ?? '');
|
|
67
67
|
prev.setAttribute( 'data-type', 'prev' );
|
|
68
|
-
prev.innerHTML = options.icons.prev;
|
|
68
|
+
prev.innerHTML = slider.options.rtl ? options.icons.next : options.icons.prev;
|
|
69
69
|
prev.addEventListener( 'click', () => {
|
|
70
70
|
if ( prev.getAttribute('data-has-content') === 'true' ) {
|
|
71
71
|
slider.moveToDirection( 'prev' );
|
|
@@ -78,7 +78,7 @@ export default function ArrowsPlugin( args: { [key: string]: any } ) {
|
|
|
78
78
|
next.setAttribute( 'aria-label', options.texts.buttonNext );
|
|
79
79
|
next.setAttribute( 'aria-controls', slider.container.getAttribute( 'id' ) ?? '');
|
|
80
80
|
next.setAttribute( 'data-type', 'next' );
|
|
81
|
-
next.innerHTML = options.icons.next;
|
|
81
|
+
next.innerHTML = slider.options.rtl ? options.icons.prev : options.icons.next;
|
|
82
82
|
next.addEventListener( 'click', () => {
|
|
83
83
|
if ( next.getAttribute('data-has-content') === 'true' ) {
|
|
84
84
|
slider.moveToDirection( 'next' );
|
|
@@ -90,20 +90,22 @@ export default function ArrowsPlugin( args: { [key: string]: any } ) {
|
|
|
90
90
|
nav.appendChild( next );
|
|
91
91
|
|
|
92
92
|
const update = () => {
|
|
93
|
-
const scrollLeft = slider.
|
|
93
|
+
const scrollLeft = slider.getScrollLeft();
|
|
94
94
|
const scrollWidth = slider.getInclusiveScrollWidth();
|
|
95
95
|
const clientWidth = slider.getInclusiveClientWidth();
|
|
96
|
-
const buffer =
|
|
96
|
+
const buffer = 1;
|
|
97
97
|
if ( Math.floor( scrollLeft ) === 0 ) {
|
|
98
98
|
prev.setAttribute( 'data-has-content', 'false' );
|
|
99
99
|
} else {
|
|
100
100
|
prev.setAttribute( 'data-has-content', 'true' );
|
|
101
101
|
}
|
|
102
|
-
|
|
102
|
+
const maxWidthDifference = Math.abs( Math.floor( scrollLeft + clientWidth ) - Math.floor( scrollWidth ) );
|
|
103
|
+
if ( maxWidthDifference <= buffer ) {
|
|
103
104
|
next.setAttribute( 'data-has-content', 'false' );
|
|
104
105
|
} else {
|
|
105
106
|
next.setAttribute( 'data-has-content', 'true' );
|
|
106
107
|
}
|
|
108
|
+
console.log( 'next', scrollLeft + clientWidth, scrollWidth );
|
|
107
109
|
};
|
|
108
110
|
|
|
109
111
|
if ( options.containerNext && options.containerPrev ) {
|
|
@@ -20,7 +20,7 @@ const DEFAULT_CLASS_NAMES = {
|
|
|
20
20
|
dotsItem: 'overflow-slider__dot-item',
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
-
export default function DotsPlugin( args: { [key: string]:
|
|
23
|
+
export default function DotsPlugin( args: { [key: string]: unknown } ) {
|
|
24
24
|
return ( slider: Slider ) => {
|
|
25
25
|
const options = <DotsOptions>{
|
|
26
26
|
texts: {
|
|
@@ -105,10 +105,6 @@ export default function DotsPlugin( args: { [key: string]: any } ) {
|
|
|
105
105
|
};
|
|
106
106
|
|
|
107
107
|
const activateDot = ( item: number ) => {
|
|
108
|
-
// const scrollTargetPosition = slider.details.containerWidth * ( page - 1 );
|
|
109
|
-
// slider.container.style.scrollBehavior = slider.options.scrollBehavior;
|
|
110
|
-
// slider.container.scrollLeft = scrollTargetPosition;
|
|
111
|
-
// slider.container.style.scrollBehavior = '';
|
|
112
108
|
slider.moveToSlide( item - 1 );
|
|
113
109
|
};
|
|
114
110
|
|
|
@@ -6,7 +6,7 @@ export type DragScrollingOptions = {
|
|
|
6
6
|
draggedDistanceThatPreventsClick: number,
|
|
7
7
|
};
|
|
8
8
|
|
|
9
|
-
export default function DragScrollingPlugin( args: { [key: string]:
|
|
9
|
+
export default function DragScrollingPlugin( args: { [key: string]: unknown } ) {
|
|
10
10
|
const options = <DragScrollingOptions>{
|
|
11
11
|
draggedDistanceThatPreventsClick: args?.draggedDistanceThatPreventsClick ?? DEFAULT_DRAGGED_DISTANCE_THAT_PREVENTS_CLICK,
|
|
12
12
|
};
|
|
@@ -11,7 +11,7 @@ export type FadeOptions = {
|
|
|
11
11
|
containerEnd: HTMLElement | null,
|
|
12
12
|
};
|
|
13
13
|
|
|
14
|
-
export default function FadePlugin( args: { [key: string]:
|
|
14
|
+
export default function FadePlugin( args: { [key: string]: unknown } ) {
|
|
15
15
|
return ( slider: Slider ) => {
|
|
16
16
|
|
|
17
17
|
const options = <FadeOptions>{
|
|
@@ -48,11 +48,11 @@ export default function FadePlugin( args: { [key: string]: any } ) {
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
const hasFadeAtStart = () => {
|
|
51
|
-
return slider.
|
|
51
|
+
return slider.getScrollLeft() > fadeItemStart.offsetWidth;
|
|
52
52
|
}
|
|
53
53
|
|
|
54
54
|
const fadeAtStartOpacity = () => {
|
|
55
|
-
const position = slider.
|
|
55
|
+
const position = slider.getScrollLeft();
|
|
56
56
|
if ( Math.floor( position ) <= Math.floor( fadeItemStart.offsetWidth ) ) {
|
|
57
57
|
return position / Math.max(fadeItemStart.offsetWidth, 1);
|
|
58
58
|
}
|
|
@@ -60,11 +60,11 @@ export default function FadePlugin( args: { [key: string]: any } ) {
|
|
|
60
60
|
}
|
|
61
61
|
|
|
62
62
|
const hasFadeAtEnd = () => {
|
|
63
|
-
return Math.floor( slider.
|
|
63
|
+
return Math.floor( slider.getScrollLeft() ) < Math.floor( slider.getInclusiveScrollWidth() - slider.getInclusiveClientWidth() - fadeItemEnd.offsetWidth );
|
|
64
64
|
}
|
|
65
65
|
|
|
66
66
|
const fadeAtEndOpacity = () => {
|
|
67
|
-
const position = slider.
|
|
67
|
+
const position = slider.getScrollLeft();
|
|
68
68
|
const maxPosition = slider.getInclusiveScrollWidth() - slider.getInclusiveClientWidth();
|
|
69
69
|
const maxFadePosition = maxPosition - fadeItemEnd.offsetWidth;
|
|
70
70
|
if ( Math.floor( position ) >= Math.floor( maxFadePosition ) ) {
|
|
@@ -19,9 +19,19 @@
|
|
|
19
19
|
.overflow-slider-fade--start {
|
|
20
20
|
left: 0;
|
|
21
21
|
background: linear-gradient(to right, var(--overflow-slider-fade-color) 0%, transparent 100%);
|
|
22
|
+
[dir="rtl"] & {
|
|
23
|
+
left: auto;
|
|
24
|
+
right: 0;
|
|
25
|
+
background: linear-gradient(to left, var(--overflow-slider-fade-color) 0%, transparent 100%);
|
|
26
|
+
}
|
|
22
27
|
}
|
|
23
28
|
|
|
24
29
|
.overflow-slider-fade--end {
|
|
25
30
|
right: 0;
|
|
26
31
|
background: linear-gradient(to left, var(--overflow-slider-fade-color) 0%, transparent 100%);
|
|
32
|
+
[dir="rtl"] & {
|
|
33
|
+
right: auto;
|
|
34
|
+
left: 0;
|
|
35
|
+
background: linear-gradient(to right, var(--overflow-slider-fade-color) 0%, transparent 100%);
|
|
36
|
+
}
|
|
27
37
|
}
|
|
@@ -8,7 +8,7 @@ export type FullWidthOptions = {
|
|
|
8
8
|
addMarginAfter: boolean,
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
export default function FullWidthPlugin( args: { [key: string]:
|
|
11
|
+
export default function FullWidthPlugin( args: { [key: string]: unknown } ) {
|
|
12
12
|
return ( slider: Slider ) => {
|
|
13
13
|
|
|
14
14
|
const options = <FullWidthOptions>{
|
|
@@ -29,16 +29,22 @@ export default function FullWidthPlugin( args: { [key: string]: any } ) {
|
|
|
29
29
|
|
|
30
30
|
const marginAmount = Math.floor((window.innerWidth - options.targetWidth(slider)) / 2);
|
|
31
31
|
if ( options.addMarginBefore ) {
|
|
32
|
-
firstSlide.style.
|
|
32
|
+
firstSlide.style.marginInlineStart = `${marginAmount}px`;
|
|
33
33
|
}
|
|
34
34
|
if ( options.addMarginAfter ) {
|
|
35
|
-
lastSlide.style.
|
|
35
|
+
lastSlide.style.marginInlineEnd = `${marginAmount}px`;
|
|
36
36
|
}
|
|
37
37
|
slider.container.setAttribute( 'data-full-width-offset', marginAmount.toString() );
|
|
38
|
+
setCSS();
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const setCSS = () => {
|
|
42
|
+
slider.container.style.setProperty('--slider-container-target-width', `${options.targetWidth(slider)}px`);
|
|
38
43
|
};
|
|
39
44
|
|
|
40
45
|
update();
|
|
41
46
|
slider.on( 'contentsChanged', update );
|
|
42
47
|
slider.on( 'containerSizeChanged', update );
|
|
48
|
+
window.addEventListener( 'resize', setCSS );
|
|
43
49
|
};
|
|
44
50
|
}
|