@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.
Files changed (60) hide show
  1. package/README.md +339 -8
  2. package/dist/core/details.esm.js +3 -3
  3. package/dist/core/details.min.js +1 -1
  4. package/dist/core/overflow-slider.esm.js +1 -0
  5. package/dist/core/overflow-slider.min.js +1 -1
  6. package/dist/core/slider.esm.js +69 -22
  7. package/dist/core/slider.min.js +1 -1
  8. package/dist/core/utils.esm.js +2 -1
  9. package/dist/core/utils.min.js +1 -1
  10. package/dist/overflow-slider.css +1 -1
  11. package/dist/plugins/arrows/arrows/index.esm.js +7 -4
  12. package/dist/plugins/arrows/arrows/index.min.js +1 -1
  13. package/dist/plugins/dots/dots/index.esm.js +0 -4
  14. package/dist/plugins/fade/fade/index.esm.js +4 -4
  15. package/dist/plugins/fade/fade/index.min.js +1 -1
  16. package/dist/plugins/full-width/full-width/index.esm.js +7 -2
  17. package/dist/plugins/full-width/full-width/index.min.js +1 -1
  18. package/dist/plugins/scroll-indicator/scroll-indicator/index.esm.js +18 -18
  19. package/dist/plugins/scroll-indicator/scroll-indicator/index.min.js +1 -1
  20. package/dist/plugins/thumbnails/thumbnails/index.esm.js +8 -5
  21. package/dist/plugins/thumbnails/thumbnails/index.min.js +1 -1
  22. package/docs/assets/demo.css +11 -1
  23. package/docs/assets/demo.js +38 -12
  24. package/docs/dist/core/details.esm.js +3 -3
  25. package/docs/dist/core/details.min.js +1 -1
  26. package/docs/dist/core/overflow-slider.esm.js +1 -0
  27. package/docs/dist/core/overflow-slider.min.js +1 -1
  28. package/docs/dist/core/slider.esm.js +69 -22
  29. package/docs/dist/core/slider.min.js +1 -1
  30. package/docs/dist/core/utils.esm.js +2 -1
  31. package/docs/dist/core/utils.min.js +1 -1
  32. package/docs/dist/overflow-slider.css +1 -1
  33. package/docs/dist/plugins/arrows/arrows/index.esm.js +7 -4
  34. package/docs/dist/plugins/arrows/arrows/index.min.js +1 -1
  35. package/docs/dist/plugins/dots/dots/index.esm.js +0 -4
  36. package/docs/dist/plugins/fade/fade/index.esm.js +4 -4
  37. package/docs/dist/plugins/fade/fade/index.min.js +1 -1
  38. package/docs/dist/plugins/full-width/full-width/index.esm.js +7 -2
  39. package/docs/dist/plugins/full-width/full-width/index.min.js +1 -1
  40. package/docs/dist/plugins/scroll-indicator/scroll-indicator/index.esm.js +18 -18
  41. package/docs/dist/plugins/scroll-indicator/scroll-indicator/index.min.js +1 -1
  42. package/docs/dist/plugins/thumbnails/thumbnails/index.esm.js +8 -5
  43. package/docs/dist/plugins/thumbnails/thumbnails/index.min.js +1 -1
  44. package/docs/index-rtl.html +396 -0
  45. package/docs/index.html +1 -1
  46. package/package.json +1 -1
  47. package/src/core/details.ts +3 -3
  48. package/src/core/overflow-slider.ts +1 -0
  49. package/src/core/slider.ts +79 -27
  50. package/src/core/types.ts +10 -3
  51. package/src/core/utils.ts +9 -5
  52. package/src/plugins/arrows/index.ts +8 -6
  53. package/src/plugins/dots/index.ts +1 -5
  54. package/src/plugins/drag-scrolling/index.ts +1 -1
  55. package/src/plugins/fade/index.ts +5 -5
  56. package/src/plugins/fade/styles.scss +10 -0
  57. package/src/plugins/full-width/index.ts +9 -3
  58. package/src/plugins/scroll-indicator/index.ts +60 -62
  59. package/src/plugins/skip-links/index.ts +1 -1
  60. package/src/plugins/thumbnails/index.ts +9 -6
@@ -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]: any[] } = {};
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
- // any scroll
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.container.scrollLeft;
243
+ const scrollLeft = slider.getScrollLeft();
241
244
  const slides = slider.slides;
242
245
  let activeSlideIdx = 0;
243
246
  let scrolledPastLastSlide = false;
244
247
 
245
- for (let i = 0; i < slides.length; i++) {
246
- const slideRect = slides[i].getBoundingClientRect();
247
- const slideStart = slideRect.left - sliderRect.left + scrollLeft + getGapSize();
248
-
249
- if ( Math.floor( slideStart ) >= Math.floor( scrollLeft ) ) {
250
- activeSlideIdx = i;
251
- break;
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 ( i === slides.length - 1 ) {
254
- scrolledPastLastSlide = true;
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
- if (direction === 'prev') {
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 (direction === 'next') {
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 (direction === 'prev') {
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 (direction === 'next') {
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 = slider.container.scrollLeft;
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( slider.container.scrollLeft ) <= Math.floor( item.trigger ) ) {
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( slider.container.scrollLeft ) >= Math.floor( item.trigger ) ) {
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: any) {
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
- cb(slider);
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
- optionCallBack(slider);
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: (props: Slider<O, C, H>) => void
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
- [key: string]: any;
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
- // any type of scroll
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( obj1: any, obj2: any ) {
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
- return false;
15
+ return false;
15
16
  }
17
+
16
18
  for (let key of keys1) {
17
- if (obj2.hasOwnProperty(key) === false || obj1[key] !== obj2[key]) {
18
- return false;
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]: any } ) {
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.container.scrollLeft;
93
+ const scrollLeft = slider.getScrollLeft();
94
94
  const scrollWidth = slider.getInclusiveScrollWidth();
95
95
  const clientWidth = slider.getInclusiveClientWidth();
96
- const buffer = 0;
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
- if ( Math.floor( scrollLeft + clientWidth ) >= Math.floor( scrollWidth ) ) {
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]: any } ) {
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]: any } ) {
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]: any } ) {
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.container.scrollLeft > fadeItemStart.offsetWidth;
51
+ return slider.getScrollLeft() > fadeItemStart.offsetWidth;
52
52
  }
53
53
 
54
54
  const fadeAtStartOpacity = () => {
55
- const position = slider.container.scrollLeft;
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.container.scrollLeft ) < Math.floor( slider.getInclusiveScrollWidth() - slider.getInclusiveClientWidth() - fadeItemEnd.offsetWidth );
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.container.scrollLeft;
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]: any } ) {
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.marginLeft = `${marginAmount}px`;
32
+ firstSlide.style.marginInlineStart = `${marginAmount}px`;
33
33
  }
34
34
  if ( options.addMarginAfter ) {
35
- lastSlide.style.marginRight = `${marginAmount}px`;
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
  }