@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.
Files changed (63) hide show
  1. package/README.md +73 -8
  2. package/dist/core/details.esm.js +5 -5
  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 +113 -44
  7. package/dist/core/slider.min.js +1 -1
  8. package/dist/core/utils.esm.js +15 -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 +20 -10
  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/drag-scrolling/drag-scrolling/index.esm.js +1 -1
  15. package/dist/plugins/drag-scrolling/drag-scrolling/index.min.js +1 -1
  16. package/dist/plugins/fade/fade/index.esm.js +7 -7
  17. package/dist/plugins/fade/fade/index.min.js +1 -1
  18. package/dist/plugins/full-width/full-width/index.esm.js +7 -2
  19. package/dist/plugins/full-width/full-width/index.min.js +1 -1
  20. package/dist/plugins/scroll-indicator/scroll-indicator/index.esm.js +22 -22
  21. package/dist/plugins/scroll-indicator/scroll-indicator/index.min.js +1 -1
  22. package/dist/plugins/thumbnails/thumbnails/index.esm.js +7 -4
  23. package/dist/plugins/thumbnails/thumbnails/index.min.js +1 -1
  24. package/docs/assets/demo.css +11 -1
  25. package/docs/assets/demo.js +38 -12
  26. package/docs/dist/core/details.esm.js +5 -5
  27. package/docs/dist/core/details.min.js +1 -1
  28. package/docs/dist/core/overflow-slider.esm.js +1 -0
  29. package/docs/dist/core/overflow-slider.min.js +1 -1
  30. package/docs/dist/core/slider.esm.js +113 -44
  31. package/docs/dist/core/slider.min.js +1 -1
  32. package/docs/dist/core/utils.esm.js +15 -1
  33. package/docs/dist/core/utils.min.js +1 -1
  34. package/docs/dist/overflow-slider.css +1 -1
  35. package/docs/dist/plugins/arrows/arrows/index.esm.js +20 -10
  36. package/docs/dist/plugins/arrows/arrows/index.min.js +1 -1
  37. package/docs/dist/plugins/dots/dots/index.esm.js +0 -4
  38. package/docs/dist/plugins/drag-scrolling/drag-scrolling/index.esm.js +1 -1
  39. package/docs/dist/plugins/drag-scrolling/drag-scrolling/index.min.js +1 -1
  40. package/docs/dist/plugins/fade/fade/index.esm.js +7 -7
  41. package/docs/dist/plugins/fade/fade/index.min.js +1 -1
  42. package/docs/dist/plugins/full-width/full-width/index.esm.js +7 -2
  43. package/docs/dist/plugins/full-width/full-width/index.min.js +1 -1
  44. package/docs/dist/plugins/scroll-indicator/scroll-indicator/index.esm.js +22 -22
  45. package/docs/dist/plugins/scroll-indicator/scroll-indicator/index.min.js +1 -1
  46. package/docs/dist/plugins/thumbnails/thumbnails/index.esm.js +7 -4
  47. package/docs/dist/plugins/thumbnails/thumbnails/index.min.js +1 -1
  48. package/docs/index-rtl.html +396 -0
  49. package/docs/index.html +1 -1
  50. package/package.json +1 -1
  51. package/src/core/details.ts +5 -5
  52. package/src/core/overflow-slider.ts +1 -0
  53. package/src/core/slider.ts +125 -47
  54. package/src/core/types.ts +5 -0
  55. package/src/core/utils.ts +19 -1
  56. package/src/plugins/arrows/index.ts +20 -10
  57. package/src/plugins/dots/index.ts +0 -4
  58. package/src/plugins/drag-scrolling/index.ts +1 -1
  59. package/src/plugins/fade/index.ts +7 -8
  60. package/src/plugins/fade/styles.scss +10 -0
  61. package/src/plugins/full-width/index.ts +8 -2
  62. package/src/plugins/scroll-indicator/index.ts +62 -64
  63. 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.container.scrollLeft;
221
+ const scrollLeft = slider.getScrollLeft();
219
222
  const slides = slider.slides;
220
223
  let activeSlideIdx = 0;
221
- for (let i = 0; i < slides.length; i++) {
222
- const slideRect = slides[i].getBoundingClientRect();
223
- const slideStart = slideRect.left - sliderRect.left + scrollLeft + getGapSize();
224
- if (slideStart > scrollLeft) {
225
- activeSlideIdx = i;
226
- break;
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
- if (direction === 'prev') {
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 (direction === 'next') {
268
- targetScrollPosition = Math.min(slider.container.scrollWidth, scrollLeft + slider.container.offsetWidth);
320
+ else if (realDirection === 'next') {
321
+ targetScrollPosition = Math.min(slider.getInclusiveScrollWidth(), scrollLeft + slider.container.offsetWidth);
269
322
  }
270
323
  if (scrollStrategy === 'fullSlide') {
271
- let fullSldeTargetScrollPosition = null;
324
+ let fullSlideTargetScrollPosition = null;
272
325
  // extend targetScrollPosition to include gap
273
- if (direction === 'prev') {
274
- fullSldeTargetScrollPosition = Math.max(0, targetScrollPosition - getGapSize());
326
+ if (realDirection === 'prev') {
327
+ fullSlideTargetScrollPosition = Math.max(0, targetScrollPosition - getGapSize());
275
328
  }
276
329
  else {
277
- fullSldeTargetScrollPosition = Math.min(slider.container.scrollWidth, targetScrollPosition + getGapSize());
330
+ fullSlideTargetScrollPosition = Math.min(slider.getInclusiveScrollWidth(), targetScrollPosition + getGapSize());
278
331
  }
279
- if (direction === 'next') {
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
- fullSldeTargetScrollPosition = slideStart;
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
- fullSldeTargetScrollPosition = Math.min(targetScrollPosition, slider.container.scrollWidth - slider.container.offsetWidth);
345
+ fullSlideTargetScrollPosition = Math.min(targetScrollPosition, slider.getInclusiveScrollWidth() - slider.container.offsetWidth);
293
346
  }
294
- if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition > scrollLeft) {
295
- targetScrollPosition = fullSldeTargetScrollPosition;
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
- fullSldeTargetScrollPosition = slideEnd - containerWidth;
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
- fullSldeTargetScrollPosition = Math.max(0, scrollLeft - containerWidth);
372
+ fullSlideTargetScrollPosition = Math.max(0, scrollLeft - containerWidth);
312
373
  }
313
- if (fullSldeTargetScrollPosition && fullSldeTargetScrollPosition < scrollLeft) {
314
- targetScrollPosition = fullSldeTargetScrollPosition;
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 = slider.container.scrollLeft;
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 (slider.container.scrollLeft <= item.trigger) {
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 (slider.container.scrollLeft >= item.trigger) {
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 o(o,i,l){let r,a={};function s(e=!1){const o=r.details,i=t(r);r.details=i,e||n(o,i)?e&&r.emit("detailsChanged"):r.emit("detailsChanged")}function c(){r.slides=Array.from(r.container.querySelectorAll(r.options.slidesSelector))}function d(){r.container.style.setProperty("--slider-container-width",`${r.details.containerWidth}px`),r.container.style.setProperty("--slider-scrollable-width",`${r.details.scrollableAreaWidth}px`),r.container.style.setProperty("--slider-slides-count",`${r.details.slideCount}`)}function f(){r.container.setAttribute("data-has-overflow",r.details.hasOverflow?"true":"false")}function u(t,e=null){const n=e||r.options.scrollBehavior,o=t.getBoundingClientRect(),i=r.container.getBoundingClientRect(),l=r.container.offsetWidth,a=r.container.scrollLeft,s=o.left-i.left+a,c=s+o.width;let d=null;d=s<a?s:c>a+l?c-l:0===s?0:s,null!==d&&setTimeout((t=>{r.emit("programmaticScrollStart"),r.container.scrollTo({left:t,behavior:n})}),50,d)}function m(){const t=r.container.getBoundingClientRect(),e=r.container.scrollLeft,n=r.slides;let o=0;for(let i=0;i<n.length;i++){if(n[i].getBoundingClientRect().left-t.left+e+h()>e){o=i;break}}const i=r.activeSlideIdx;r.activeSlideIdx=o,i!==o&&r.emit("activeSlideChanged")}function h(){let t=0;if(r.slides.length>1){const e=r.slides[0].getBoundingClientRect();t=r.slides[1].getBoundingClientRect().left-e.right}return t}function g(){let t=0;const e=r.container.getAttribute("data-full-width-offset");return e&&(t=parseInt(e)),t}return r={emit:function(t){var e;a&&a[t]&&a[t].forEach((t=>{t(r)}));const n=null===(e=null==r?void 0:r.options)||void 0===e?void 0:e[t];"function"==typeof n&&n(r)},moveToDirection:function(t="prev"){const e=r.options.scrollStrategy,n=r.container.scrollLeft,o=r.container.getBoundingClientRect(),i=r.container.offsetWidth;let l=n;if("prev"===t?l=Math.max(0,n-r.container.offsetWidth):"next"===t&&(l=Math.min(r.container.scrollWidth,n+r.container.offsetWidth)),"fullSlide"===e){let e=null;if(e="prev"===t?Math.max(0,l-h()):Math.min(r.container.scrollWidth,l+h()),"next"===t){let t=!1;for(let i of r.slides){const r=i.getBoundingClientRect(),a=r.left-o.left+n,s=a+r.width;if(a<l&&s>l){e=a,t=!0;break}}t||(e=Math.min(l,r.container.scrollWidth-r.container.offsetWidth)),e&&e>n&&(l=e)}else{let t=!1;for(let l of r.slides){const r=l.getBoundingClientRect(),a=r.left-o.left+n,s=a+r.width;if(a<n&&s>n){e=s-i,t=!0;break}}t||(e=Math.max(0,n-i)),e&&e<n&&(l=e)}}const a=l-g();a>=0&&(l=a),r.emit("programmaticScrollStart"),r.container.style.scrollBehavior=r.options.scrollBehavior,r.container.scrollLeft=l,setTimeout((()=>r.container.style.scrollBehavior=""),50)},moveToSlide:function(t){const e=r.slides[t];e&&u(e)},snapToClosestSlide:function(t="prev"){const e="next"===t,n=[];for(let t=0;t<r.slides.length;t++){const e=r.slides[t],o=e.offsetWidth,i=e.offsetLeft,l=i+o,a=i+o/2,s=Math.min(a,i+r.options.emulateScrollSnapMaxThreshold);n.push({start:i,middle:a,end:l,width:o,trigger:s,slide:e})}let o=null;const i=r.container.scrollLeft;if(e)for(let t=0;t<n.length;t++){const e=n[t];if(0===t&&i<=e.trigger){o=0;break}if(r.container.scrollLeft<=e.trigger){o=e.start;break}}else for(let t=n.length-1;t>=0;t--){const e=n[t];if(t===n.length-1&&i>=e.trigger){o=e.start;break}if(r.container.scrollLeft>=e.trigger){o=e.start;break}}if(null!==o){const t=o-g();t>=0&&(o=t);const e=r.options.scrollBehavior||"smooth";r.container.scrollTo({left:o,behavior:e})}},on:function(t,e){a[t]||(a[t]=[]),a[t].push(e)},options:i},function(){r.container=o;let t=o.getAttribute("id");null===t&&(t=e("overflow-slider"),o.setAttribute("id",t)),c(),s(!0),m(),r.on("contentsChanged",(()=>{c(),s(),m()})),r.on("containerSizeChanged",(()=>s()));let n=0;if(r.on("scroll",(()=>{n&&window.cancelAnimationFrame(n),n=window.requestAnimationFrame((()=>{s(),m()}))})),function(){new MutationObserver((()=>r.emit("contentsChanged"))).observe(r.container,{childList:!0});let t,e,n;new ResizeObserver((()=>r.emit("containerSizeChanged"))).observe(r.container);let o=r.container.scrollLeft,i=r.container.scrollLeft,l=r.container.scrollLeft,a=!1,s=!1,c=!1;r.container.addEventListener("scroll",(()=>{const e=r.container.scrollLeft;o!==e&&(a||(a=!0,r.emit("scrollStart")),o=e,clearTimeout(t),t=setTimeout((()=>{a=!1,r.emit("scrollEnd")}),50),r.emit("scroll")),s&&d()}));const d=()=>{const t=r.container.scrollLeft;i===t||c||(s||(r.emit("nativeScrollStart"),s=!0),r.emit("nativeScroll"),i=t,clearTimeout(e),e=setTimeout((()=>{s=!1,r.emit("nativeScrollEnd"),l=i}),50))};r.container.addEventListener("touchmove",d),r.container.addEventListener("mousewheel",d),r.container.addEventListener("wheel",d),r.on("programmaticScrollStart",(()=>{c=!0})),r.container.addEventListener("scroll",(()=>{const t=r.container.scrollLeft;l!==t&&!s&&c&&(l=t,clearTimeout(n),n=setTimeout((()=>{c=!1,r.emit("programmaticScrollEnd"),i=l}),50),r.emit("programmaticScroll"))})),r.on("programmaticScrollStart",(()=>{r.container.style.scrollSnapType="none"})),r.on("nativeScrollStart",(()=>{r.container.style.scrollSnapType=""}));let f=!1;r.container.addEventListener("mousedown",(()=>{f=!0})),r.container.addEventListener("touchstart",(()=>{f=!0}),{passive:!0}),r.container.addEventListener("focusin",(t=>{if(!f){let e=t.target;for(;e.parentElement!==r.container&&e.parentElement;)e=e.parentElement;u(e,"auto")}f=!1}))}(),f(),d(),l)for(const t of l)t(r);r.on("detailsChanged",(()=>{f(),d()})),r.emit("created"),r.container.setAttribute("data-ready","true")}(),r}export{o as default};
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(e,n=1){const r=`${e}-${n}`;return document.getElementById(r)?t(e,n+1):r}function e(t,e){const n=Object.keys(t),r=Object.keys(e);if(n.length!==r.length)return!1;for(let r of n)if(!1===e.hasOwnProperty(r)||t[r]!==e[r])return!1;return!0}export{t as generateId,e as objectsAreEqual};
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', () => slider.moveToDirection('prev'));
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', () => slider.moveToDirection('next'));
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.container.scrollLeft;
48
- const scrollWidth = slider.container.scrollWidth;
49
- const clientWidth = slider.container.clientWidth;
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
- if (scrollLeft + clientWidth >= scrollWidth - buffer) {
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('scroll', update);
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 i=>{var r,s,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!==(r=null==o?void 0:o.container)&&void 0!==r?r:null,containerPrev:null!==(s=null==o?void 0:o.containerPrev)&&void 0!==s?s: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=i.container.getAttribute("id"))&&void 0!==l?l:""),b.setAttribute("data-type","prev"),b.innerHTML=d.icons.prev,b.addEventListener("click",(()=>i.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=i.container.getAttribute("id"))&&void 0!==c?c:""),p.setAttribute("data-type","next"),p.innerHTML=d.icons.next,p.addEventListener("click",(()=>i.moveToDirection("next"))),v.appendChild(b),v.appendChild(p);const x=()=>{const t=i.container.scrollLeft,e=i.container.scrollWidth,n=i.container.clientWidth;0===t?b.setAttribute("data-has-content","false"):b.setAttribute("data-has-content","true"),t+n>=e-1?p.setAttribute("data-has-content","false"):p.setAttribute("data-has-content","true")};d.containerNext&&d.containerPrev?(d.containerPrev.appendChild(b),d.containerNext.appendChild(p)):d.container?d.container.appendChild(v):null===(u=i.container.parentNode)||void 0===u||u.insertBefore(v,i.container.nextSibling),x(),i.on("scroll",x),i.on("contentsChanged",x),i.on("containerSizeChanged",x)}}export{o as default};
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,s=!1,i=!1;e.container.setAttribute("data-has-drag-scrolling","true");if(window.addEventListener("mousedown",(o=>{s=!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",(l=>{if(!e.details.hasOverflow)return void(s=!1);if(!t)return void(s=!1);l.preventDefault(),s||(s=!0,e.emit("programmaticScrollStart"));const c=l.pageX-e.container.offsetLeft-n,d=r-c;i=!0,e.container.scrollLeft!==d&&(a=e.container.scrollLeft<d),e.container.scrollLeft=d;const u=Math.abs(c),f=e.container.querySelectorAll(e.options.slidesSelector),v=u>o?"none":"";f.forEach((e=>{e.style.pointerEvents=v}))})),window.addEventListener("mouseup",(()=>{e.details.hasOverflow?(t=!1,e.container.style.cursor="",setTimeout((()=>{s=!1,e.container.style.scrollBehavior="";e.container.querySelectorAll(e.options.slidesSelector).forEach((e=>{e.style.pointerEvents=""}))}),50)):s=!1})),e.options.emulateScrollSnap){const o=()=>{i&&!t&&(i=!1,e.snapToClosestSlide(a?"next":"prev"))};e.on("programmaticScrollEnd",o),window.addEventListener("mouseup",o)}}}export{e as default};
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.container.scrollLeft > fadeItemStart.offsetWidth;
35
+ return slider.getScrollLeft() > fadeItemStart.offsetWidth;
36
36
  };
37
37
  const fadeAtStartOpacity = () => {
38
- const position = slider.container.scrollLeft;
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.container.scrollLeft < (slider.container.scrollWidth - slider.container.clientWidth - fadeItemEnd.offsetWidth);
45
+ return Math.floor(slider.getScrollLeft()) < Math.floor(slider.getInclusiveScrollWidth() - slider.getInclusiveClientWidth() - fadeItemEnd.offsetWidth);
46
46
  };
47
47
  const fadeAtEndOpacity = () => {
48
- const position = slider.container.scrollLeft;
49
- const maxPosition = slider.container.scrollWidth - slider.container.clientWidth;
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,i;const o={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!==(i=null==t?void 0:t.containerEnd)&&void 0!==i?i:null},r=document.createElement("div");r.classList.add(o.classNames.fadeItem,o.classNames.fadeItemStart),r.setAttribute("aria-hidden","true"),r.setAttribute("tabindex","-1");const d=document.createElement("div");d.classList.add(o.classNames.fadeItem,o.classNames.fadeItemEnd),d.setAttribute("aria-hidden","true"),d.setAttribute("tabindex","-1"),o.containerStart?o.containerStart.appendChild(r):o.container&&o.container.appendChild(r),o.containerEnd?o.containerEnd.appendChild(d):o.container&&o.container.appendChild(d);const l=()=>{r.setAttribute("data-has-fade",(e.container.scrollLeft>r.offsetWidth).toString()),r.style.opacity=(()=>{const t=e.container.scrollLeft;return t<=r.offsetWidth?t/Math.max(r.offsetWidth,1):1})().toString(),d.setAttribute("data-has-fade",(e.container.scrollLeft<e.container.scrollWidth-e.container.clientWidth-d.offsetWidth).toString()),d.style.opacity=(()=>{const t=e.container.scrollLeft,n=e.container.scrollWidth-e.container.clientWidth-d.offsetWidth;return t>=n?(n-t)/Math.max(d.offsetWidth,1)+1:1})().toString()};l(),e.on("created",l),e.on("contentsChanged",l),e.on("containerSizeChanged",l),e.on("scrollEnd",l),e.on("scrollStart",l);let s=0;e.on("scroll",(()=>{s&&window.cancelAnimationFrame(s),s=window.requestAnimationFrame((()=>{l()}))}))}}export{t as default};
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.marginLeft = `${marginAmount}px`;
19
+ firstSlide.style.marginInlineStart = `${marginAmount}px`;
20
20
  }
21
21
  if (options.addMarginAfter) {
22
- lastSlide.style.marginRight = `${marginAmount}px`;
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,o;const d={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===(o=null==n?void 0:n.addMarginAfter)||void 0===o||o},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-d.targetWidth(e))/2);d.addMarginBefore&&(n.style.marginLeft=`${r}px`),d.addMarginAfter&&(i.style.marginRight=`${r}px`),e.container.setAttribute("data-full-width-offset",r.toString())};a(),e.on("contentsChanged",a),e.on("containerSizeChanged",a)}}export{n as default};
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};