glide-react 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -340,6 +340,8 @@ interface ArrowProps {
340
340
  infinite: boolean;
341
341
  /** Center mode enabled */
342
342
  centerMode: boolean;
343
+ /** Vertical mode enabled */
344
+ vertical: boolean;
343
345
  /** Click handler */
344
346
  onClick: () => void;
345
347
  /** Custom arrow element */
package/dist/index.d.ts CHANGED
@@ -340,6 +340,8 @@ interface ArrowProps {
340
340
  infinite: boolean;
341
341
  /** Center mode enabled */
342
342
  centerMode: boolean;
343
+ /** Vertical mode enabled */
344
+ vertical: boolean;
343
345
  /** Click handler */
344
346
  onClick: () => void;
345
347
  /** Custom arrow element */
package/dist/index.js CHANGED
@@ -552,10 +552,12 @@ var calculateSlideWidth = (listWidth, slidesToShow, centerMode, centerPadding, v
552
552
  let centerPaddingAdj = 0;
553
553
  if (centerMode) {
554
554
  const paddingValue = parseInt(centerPadding, 10) || 0;
555
- centerPaddingAdj = paddingValue * 2;
556
555
  if (centerPadding.endsWith("%")) {
557
- centerPaddingAdj = listWidth * paddingValue * 2 / 100;
556
+ centerPaddingAdj = listWidth * paddingValue / 100;
557
+ } else {
558
+ centerPaddingAdj = paddingValue;
558
559
  }
560
+ centerPaddingAdj = centerPaddingAdj * 2;
559
561
  }
560
562
  return Math.ceil((listWidth - centerPaddingAdj) / slidesToShow);
561
563
  };
@@ -640,6 +642,9 @@ var getSlideStyle = (spec) => {
640
642
  if (!spec.variableWidth) {
641
643
  style.width = spec.slideWidth;
642
644
  }
645
+ if (spec.vertical && spec.slideHeight) {
646
+ style.height = spec.slideHeight;
647
+ }
643
648
  if (spec.fade) {
644
649
  style.position = "relative";
645
650
  if (spec.vertical) {
@@ -648,7 +653,7 @@ var getSlideStyle = (spec) => {
648
653
  style.left = -spec.index * spec.slideWidth;
649
654
  }
650
655
  style.opacity = spec.currentSlide === spec.index ? 1 : 0;
651
- style.zIndex = spec.currentSlide === spec.index ? 999 : 998;
656
+ style.zIndex = spec.currentSlide === spec.index ? 1 : 0;
652
657
  if (spec.useCSS) {
653
658
  style.transition = `opacity ${spec.speed}ms ${spec.cssEase}, visibility ${spec.speed}ms ${spec.cssEase}`;
654
659
  }
@@ -904,7 +909,7 @@ var Track = (0, import_react.forwardRef)(function Track2({
904
909
  const baseTrackStyle = {
905
910
  position: "relative",
906
911
  display: fade ? "block" : "flex",
907
- flexDirection: vertical ? "column" : "row",
912
+ ...fade ? {} : { flexDirection: vertical ? "column" : "row" },
908
913
  ...trackStyle
909
914
  };
910
915
  return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(
@@ -924,7 +929,7 @@ var Track = (0, import_react.forwardRef)(function Track2({
924
929
  // src/components/Arrows.tsx
925
930
  var import_react2 = require("react");
926
931
  var import_jsx_runtime2 = require("react/jsx-runtime");
927
- var PrevArrowSVG = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
932
+ var PrevArrowSVG = ({ className, vertical }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
928
933
  "svg",
929
934
  {
930
935
  className,
@@ -939,7 +944,7 @@ var PrevArrowSVG = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime2.js
939
944
  children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)("polyline", { points: "15 18 9 12 15 6" })
940
945
  }
941
946
  );
942
- var NextArrowSVG = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
947
+ var NextArrowSVG = ({ className, vertical }) => /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
943
948
  "svg",
944
949
  {
945
950
  className,
@@ -956,9 +961,7 @@ var NextArrowSVG = ({ className }) => /* @__PURE__ */ (0, import_jsx_runtime2.js
956
961
  );
957
962
  var baseArrowStyle = {
958
963
  position: "absolute",
959
- top: "50%",
960
- transform: "translateY(-50%)",
961
- zIndex: 10,
964
+ zIndex: 100,
962
965
  display: "flex",
963
966
  alignItems: "center",
964
967
  justifyContent: "center",
@@ -983,6 +986,7 @@ var PrevArrow = ({
983
986
  slidesToShow,
984
987
  infinite,
985
988
  centerMode,
989
+ vertical,
986
990
  onClick,
987
991
  customArrow
988
992
  }) => {
@@ -1014,13 +1018,15 @@ var PrevArrow = ({
1014
1018
  className: `glide-arrow glide-prev ${!canGo ? "glide-disabled" : ""}`,
1015
1019
  style: {
1016
1020
  ...canGo ? baseArrowStyle : disabledArrowStyle,
1017
- left: 10
1021
+ left: 10,
1022
+ top: "50%",
1023
+ transform: "translateY(-50%)"
1018
1024
  },
1019
1025
  onClick: handleClick,
1020
1026
  "aria-label": "Previous slide",
1021
1027
  "aria-disabled": !canGo,
1022
1028
  disabled: !canGo,
1023
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(PrevArrowSVG, {})
1029
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(PrevArrowSVG, { vertical })
1024
1030
  }
1025
1031
  );
1026
1032
  };
@@ -1030,6 +1036,7 @@ var NextArrow = ({
1030
1036
  slidesToShow,
1031
1037
  infinite,
1032
1038
  centerMode,
1039
+ vertical,
1033
1040
  onClick,
1034
1041
  customArrow
1035
1042
  }) => {
@@ -1064,13 +1071,15 @@ var NextArrow = ({
1064
1071
  className: `glide-arrow glide-next ${!canGo ? "glide-disabled" : ""}`,
1065
1072
  style: {
1066
1073
  ...canGo ? baseArrowStyle : disabledArrowStyle,
1067
- right: 10
1074
+ right: 10,
1075
+ top: "50%",
1076
+ transform: "translateY(-50%)"
1068
1077
  },
1069
1078
  onClick: handleClick,
1070
1079
  "aria-label": "Next slide",
1071
1080
  "aria-disabled": !canGo,
1072
1081
  disabled: !canGo,
1073
- children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(NextArrowSVG, {})
1082
+ children: /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(NextArrowSVG, { vertical })
1074
1083
  }
1075
1084
  );
1076
1085
  };
@@ -1493,6 +1502,95 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1493
1502
  scrolling
1494
1503
  } = state;
1495
1504
  const slideCount = import_react5.Children.count(children);
1505
+ const [breakpoint, setBreakpoint] = import_react5.default.useState(null);
1506
+ (0, import_react5.useEffect)(() => {
1507
+ if (!canUseDOM() || !settings.responsive) return;
1508
+ const responsiveSettings2 = settings.responsive;
1509
+ const breakpoints = responsiveSettings2.map((bp) => bp.breakpoint).sort((a, b) => a - b);
1510
+ const mediaQueryListeners = [];
1511
+ breakpoints.forEach((bp, index) => {
1512
+ let query;
1513
+ if (index === 0) {
1514
+ query = `(max-width: ${bp}px)`;
1515
+ } else {
1516
+ query = `(min-width: ${breakpoints[index - 1] + 1}px) and (max-width: ${bp}px)`;
1517
+ }
1518
+ const mql = window.matchMedia(query);
1519
+ const listener = (e) => {
1520
+ if (e.matches) {
1521
+ setBreakpoint(bp);
1522
+ }
1523
+ };
1524
+ mql.addEventListener("change", listener);
1525
+ mediaQueryListeners.push({ mql, listener });
1526
+ if (mql.matches) {
1527
+ setBreakpoint(bp);
1528
+ }
1529
+ });
1530
+ const maxBreakpoint = breakpoints[breakpoints.length - 1];
1531
+ const fullScreenQuery = `(min-width: ${maxBreakpoint + 1}px)`;
1532
+ const fullScreenMql = window.matchMedia(fullScreenQuery);
1533
+ const fullScreenListener = (e) => {
1534
+ if (e.matches) {
1535
+ setBreakpoint(null);
1536
+ }
1537
+ };
1538
+ fullScreenMql.addEventListener("change", fullScreenListener);
1539
+ mediaQueryListeners.push({ mql: fullScreenMql, listener: fullScreenListener });
1540
+ if (fullScreenMql.matches) {
1541
+ setBreakpoint(null);
1542
+ }
1543
+ return () => {
1544
+ mediaQueryListeners.forEach(({ mql, listener }) => {
1545
+ mql.removeEventListener("change", listener);
1546
+ });
1547
+ };
1548
+ }, [settings.responsive]);
1549
+ const responsiveSettings = (0, import_react5.useMemo)(() => {
1550
+ let merged;
1551
+ if (!breakpoint || !settings.responsive) {
1552
+ merged = settings;
1553
+ } else {
1554
+ const matchedBreakpoint = settings.responsive.find((bp) => bp.breakpoint === breakpoint);
1555
+ if (!matchedBreakpoint) {
1556
+ merged = settings;
1557
+ } else if (matchedBreakpoint.settings === "disabled") {
1558
+ merged = { ...settings, slidesToShow: 1, slidesToScroll: 1 };
1559
+ } else {
1560
+ merged = { ...settings, ...matchedBreakpoint.settings };
1561
+ }
1562
+ }
1563
+ if (merged.centerMode && merged.slidesToScroll > 1) {
1564
+ if (process.env.NODE_ENV !== "production") {
1565
+ console.warn(
1566
+ `slidesToScroll should be equal to 1 in centerMode, you are using ${merged.slidesToScroll}`
1567
+ );
1568
+ }
1569
+ merged = { ...merged, slidesToScroll: 1 };
1570
+ }
1571
+ if (merged.fade) {
1572
+ if (merged.slidesToShow > 1 && process.env.NODE_ENV !== "production") {
1573
+ console.warn(
1574
+ `slidesToShow should be equal to 1 when fade is true, you're using ${merged.slidesToShow}`
1575
+ );
1576
+ }
1577
+ if (merged.slidesToScroll > 1 && process.env.NODE_ENV !== "production") {
1578
+ console.warn(
1579
+ `slidesToScroll should be equal to 1 when fade is true, you're using ${merged.slidesToScroll}`
1580
+ );
1581
+ }
1582
+ merged = { ...merged, slidesToShow: 1, slidesToScroll: 1 };
1583
+ }
1584
+ return merged;
1585
+ }, [breakpoint, settings]);
1586
+ const {
1587
+ slidesToShow: responsiveSlidesToShow,
1588
+ slidesToScroll: responsiveSlidesToScroll,
1589
+ infinite: responsiveInfinite,
1590
+ centerMode: responsiveCenterMode,
1591
+ dots: responsiveDots,
1592
+ arrows: responsiveArrows
1593
+ } = responsiveSettings;
1496
1594
  const {
1497
1595
  slideWidth: calculatedSlideWidth,
1498
1596
  trackStyle,
@@ -1504,10 +1602,10 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1504
1602
  } = useTrack({
1505
1603
  currentSlide,
1506
1604
  slideCount,
1507
- slidesToShow,
1508
- slidesToScroll,
1509
- infinite,
1510
- centerMode,
1605
+ slidesToShow: responsiveSlidesToShow,
1606
+ slidesToScroll: responsiveSlidesToScroll,
1607
+ infinite: responsiveInfinite,
1608
+ centerMode: responsiveCenterMode,
1511
1609
  centerPadding,
1512
1610
  listWidth: listWidth || 0,
1513
1611
  listHeight: listHeight || 0,
@@ -1525,47 +1623,53 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1525
1623
  swipeLeft
1526
1624
  });
1527
1625
  (0, import_react5.useEffect)(() => {
1528
- if (!canUseDOM() || !listRef.current) return;
1529
- const updateDimensions = () => {
1626
+ if (!canUseDOM()) return;
1627
+ const timeoutId = setTimeout(() => {
1530
1628
  if (!listRef.current) return;
1531
- const newListWidth = getWidth(listRef.current);
1532
- const newListHeight = getHeight(listRef.current);
1533
- const firstSlide = listRef.current.querySelector('[data-index="0"]');
1534
- const newSlideHeight = firstSlide ? getHeight(firstSlide) : null;
1535
- dispatch({
1536
- type: "INIT",
1537
- payload: {
1538
- listWidth: newListWidth,
1539
- listHeight: newListHeight,
1540
- slideHeight: newSlideHeight,
1541
- slideCount
1542
- }
1543
- });
1544
- };
1545
- updateDimensions();
1546
- resizeObserverRef.current = new ResizeObserver(updateDimensions);
1547
- resizeObserverRef.current.observe(listRef.current);
1548
- onInit?.();
1629
+ const updateDimensions = () => {
1630
+ if (!listRef.current) return;
1631
+ const newListWidth = getWidth(listRef.current);
1632
+ const firstSlide = listRef.current.querySelector('[data-index="0"]');
1633
+ const newSlideHeight = firstSlide ? getHeight(firstSlide) : null;
1634
+ const newListHeight = newSlideHeight ? newSlideHeight * responsiveSlidesToShow : null;
1635
+ dispatch({
1636
+ type: "INIT",
1637
+ payload: {
1638
+ listWidth: newListWidth,
1639
+ listHeight: newListHeight,
1640
+ slideHeight: newSlideHeight,
1641
+ slideCount
1642
+ }
1643
+ });
1644
+ };
1645
+ updateDimensions();
1646
+ if (!resizeObserverRef.current && listRef.current) {
1647
+ resizeObserverRef.current = new ResizeObserver(updateDimensions);
1648
+ resizeObserverRef.current.observe(listRef.current);
1649
+ }
1650
+ if (!initialized) {
1651
+ onInit?.();
1652
+ }
1653
+ }, 0);
1549
1654
  return () => {
1655
+ clearTimeout(timeoutId);
1550
1656
  resizeObserverRef.current?.disconnect();
1657
+ resizeObserverRef.current = null;
1551
1658
  };
1552
- }, [slideCount, onInit]);
1553
- const autoplayIterator = (0, import_react5.useCallback)(() => {
1554
- if (autoplaying !== "playing") return;
1555
- const nextSlideIndex = currentSlide + slidesToScroll;
1556
- goToSlide(nextSlideIndex);
1557
- }, [autoplaying, currentSlide, slidesToScroll]);
1659
+ }, [slideCount, initialized, onInit, responsiveSlidesToShow]);
1558
1660
  (0, import_react5.useEffect)(() => {
1559
- if (!autoplay || !initialized) return;
1560
- if (autoplaying === "playing") {
1561
- autoplayTimerRef.current = setTimeout(autoplayIterator, autoplaySpeed);
1562
- }
1563
- return () => {
1564
- if (autoplayTimerRef.current) {
1565
- clearTimeout(autoplayTimerRef.current);
1661
+ if (!initialized || !canUseDOM()) return;
1662
+ if (currentSlide >= slideCount) {
1663
+ const newSlide = Math.max(0, slideCount - responsiveSlidesToShow);
1664
+ if (newSlide !== currentSlide) {
1665
+ dispatch({
1666
+ type: "GO_TO_SLIDE",
1667
+ payload: { slide: newSlide, animated: false }
1668
+ });
1566
1669
  }
1567
- };
1568
- }, [autoplay, autoplaying, initialized, autoplayIterator, autoplaySpeed]);
1670
+ }
1671
+ onReInit?.();
1672
+ }, [responsiveSlidesToShow, responsiveSlidesToScroll, responsiveInfinite, responsiveCenterMode, initialized, slideCount, currentSlide, onReInit]);
1569
1673
  (0, import_react5.useEffect)(() => {
1570
1674
  if (animating) {
1571
1675
  animationEndTimeoutRef.current = setTimeout(() => {
@@ -1583,21 +1687,21 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1583
1687
  (slideIndex, dontAnimate = false) => {
1584
1688
  if (waitForAnimate && animating) return;
1585
1689
  let targetIndex = slideIndex;
1586
- if (infinite) {
1690
+ if (responsiveInfinite) {
1587
1691
  if (targetIndex < 0) {
1588
1692
  targetIndex = slideCount + targetIndex;
1589
1693
  } else if (targetIndex >= slideCount) {
1590
1694
  targetIndex = targetIndex - slideCount;
1591
1695
  }
1592
1696
  } else {
1593
- targetIndex = clamp(targetIndex, 0, slideCount - slidesToShow);
1697
+ targetIndex = clamp(targetIndex, 0, slideCount - responsiveSlidesToShow);
1594
1698
  }
1595
1699
  beforeChange?.(currentSlide, targetIndex);
1596
1700
  if (lazyLoad) {
1597
1701
  const slidesToLoad = getOnDemandLazySlides({
1598
1702
  currentSlide: targetIndex,
1599
- centerMode,
1600
- slidesToShow,
1703
+ centerMode: responsiveCenterMode,
1704
+ slidesToShow: responsiveSlidesToShow,
1601
1705
  centerPadding,
1602
1706
  lazyLoadedList
1603
1707
  });
@@ -1616,23 +1720,23 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1616
1720
  [
1617
1721
  waitForAnimate,
1618
1722
  animating,
1619
- infinite,
1723
+ responsiveInfinite,
1620
1724
  slideCount,
1621
- slidesToShow,
1725
+ responsiveSlidesToShow,
1622
1726
  beforeChange,
1623
1727
  currentSlide,
1624
1728
  lazyLoad,
1625
- centerMode,
1729
+ responsiveCenterMode,
1626
1730
  centerPadding,
1627
1731
  lazyLoadedList
1628
1732
  ]
1629
1733
  );
1630
1734
  const next = (0, import_react5.useCallback)(() => {
1631
- goToSlide(currentSlide + slidesToScroll);
1632
- }, [currentSlide, slidesToScroll, goToSlide]);
1735
+ goToSlide(currentSlide + responsiveSlidesToScroll);
1736
+ }, [currentSlide, responsiveSlidesToScroll, goToSlide]);
1633
1737
  const prev = (0, import_react5.useCallback)(() => {
1634
- goToSlide(currentSlide - slidesToScroll);
1635
- }, [currentSlide, slidesToScroll, goToSlide]);
1738
+ goToSlide(currentSlide - responsiveSlidesToScroll);
1739
+ }, [currentSlide, responsiveSlidesToScroll, goToSlide]);
1636
1740
  const goTo = (0, import_react5.useCallback)(
1637
1741
  (index, dontAnimate = false) => {
1638
1742
  goToSlide(index, dontAnimate);
@@ -1645,6 +1749,29 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1645
1749
  const play = (0, import_react5.useCallback)(() => {
1646
1750
  dispatch({ type: "SET_AUTOPLAY", payload: "playing" });
1647
1751
  }, []);
1752
+ const autoplayTick = (0, import_react5.useCallback)(() => {
1753
+ const nextSlideIndex = currentSlide + responsiveSlidesToScroll;
1754
+ goToSlide(nextSlideIndex);
1755
+ }, [currentSlide, responsiveSlidesToScroll, goToSlide]);
1756
+ (0, import_react5.useEffect)(() => {
1757
+ if (!autoplay || !initialized) return;
1758
+ if (autoplaying === "playing") {
1759
+ if (autoplayTimerRef.current) {
1760
+ clearInterval(autoplayTimerRef.current);
1761
+ }
1762
+ autoplayTimerRef.current = setInterval(autoplayTick, autoplaySpeed + 50);
1763
+ } else {
1764
+ if (autoplayTimerRef.current) {
1765
+ clearInterval(autoplayTimerRef.current);
1766
+ autoplayTimerRef.current = null;
1767
+ }
1768
+ }
1769
+ return () => {
1770
+ if (autoplayTimerRef.current) {
1771
+ clearInterval(autoplayTimerRef.current);
1772
+ }
1773
+ };
1774
+ }, [autoplay, autoplaying, initialized, autoplayTick, autoplaySpeed]);
1648
1775
  (0, import_react5.useImperativeHandle)(
1649
1776
  ref,
1650
1777
  () => ({
@@ -1694,16 +1821,16 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1694
1821
  swiped,
1695
1822
  swiping,
1696
1823
  slideCount,
1697
- slidesToScroll,
1698
- infinite,
1824
+ slidesToScroll: responsiveSlidesToScroll,
1825
+ infinite: responsiveInfinite,
1699
1826
  touchObject,
1700
1827
  swipeEvent,
1701
1828
  listHeight: listHeight || 0,
1702
1829
  listWidth: listWidth || 0,
1703
1830
  slideWidth: calculatedSlideWidth,
1704
1831
  slideHeight: slideHeight || 0,
1705
- centerMode,
1706
- slidesToShow,
1832
+ centerMode: responsiveCenterMode,
1833
+ slidesToShow: responsiveSlidesToShow,
1707
1834
  fade,
1708
1835
  disabled,
1709
1836
  variableWidth,
@@ -1730,16 +1857,16 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1730
1857
  swiped,
1731
1858
  swiping,
1732
1859
  slideCount,
1733
- slidesToScroll,
1734
- infinite,
1860
+ responsiveSlidesToScroll,
1861
+ responsiveInfinite,
1735
1862
  touchObject,
1736
1863
  swipeEvent,
1737
1864
  listHeight,
1738
1865
  listWidth,
1739
1866
  calculatedSlideWidth,
1740
1867
  slideHeight,
1741
- centerMode,
1742
- slidesToShow,
1868
+ responsiveCenterMode,
1869
+ responsiveSlidesToShow,
1743
1870
  fade,
1744
1871
  disabled,
1745
1872
  variableWidth,
@@ -1761,13 +1888,13 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1761
1888
  onSwipe,
1762
1889
  targetSlide,
1763
1890
  currentSlide,
1764
- infinite,
1891
+ infinite: responsiveInfinite,
1765
1892
  slideCount,
1766
- slidesToScroll,
1767
- slidesToShow,
1893
+ slidesToScroll: responsiveSlidesToScroll,
1894
+ slidesToShow: responsiveSlidesToShow,
1768
1895
  slideWidth: calculatedSlideWidth,
1769
1896
  slideHeight: slideHeight || 0,
1770
- centerMode,
1897
+ centerMode: responsiveCenterMode,
1771
1898
  fade,
1772
1899
  disabled,
1773
1900
  variableWidth,
@@ -1808,13 +1935,13 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1808
1935
  onSwipe,
1809
1936
  targetSlide,
1810
1937
  currentSlide,
1811
- infinite,
1938
+ responsiveInfinite,
1812
1939
  slideCount,
1813
- slidesToScroll,
1814
- slidesToShow,
1940
+ responsiveSlidesToScroll,
1941
+ responsiveSlidesToShow,
1815
1942
  calculatedSlideWidth,
1816
1943
  slideHeight,
1817
- centerMode,
1944
+ responsiveCenterMode,
1818
1945
  fade,
1819
1946
  disabled,
1820
1947
  variableWidth,
@@ -1881,23 +2008,33 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1881
2008
  }),
1882
2009
  [vertical]
1883
2010
  );
1884
- const listStyle = (0, import_react5.useMemo)(
1885
- () => ({
2011
+ const listStyle = (0, import_react5.useMemo)(() => {
2012
+ const style = {
1886
2013
  position: "relative",
1887
2014
  display: "block",
1888
2015
  overflow: "hidden",
1889
2016
  margin: 0,
1890
2017
  padding: 0
1891
- }),
1892
- []
1893
- );
2018
+ };
2019
+ if (vertical && listHeight) {
2020
+ style.height = listHeight;
2021
+ }
2022
+ if (responsiveCenterMode) {
2023
+ if (vertical) {
2024
+ style.padding = `${centerPadding} 0px`;
2025
+ } else {
2026
+ style.padding = `0px ${centerPadding}`;
2027
+ }
2028
+ }
2029
+ return style;
2030
+ }, [responsiveCenterMode, vertical, centerPadding, listHeight]);
1894
2031
  if (!initialized || !canUseDOM()) {
1895
- return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: `glide-slider ${className}`.trim(), style: sliderStyle, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "glide-list", style: listStyle, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "glide-track", style: { display: "flex" }, children: import_react5.default.Children.map(children, (child, idx) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2032
+ return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: `glide-slider ${className}`.trim(), style: sliderStyle, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { ref: listRef, className: "glide-list", style: listStyle, children: /* @__PURE__ */ (0, import_jsx_runtime4.jsx)("div", { className: "glide-track", style: { display: "flex" }, children: import_react5.default.Children.map(children, (child, idx) => /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1896
2033
  "div",
1897
2034
  {
1898
2035
  className: "glide-slide",
1899
2036
  style: {
1900
- width: `${100 / slidesToShow}%`,
2037
+ width: `${100 / responsiveSlidesToShow}%`,
1901
2038
  flexShrink: 0
1902
2039
  },
1903
2040
  children: child
@@ -1915,14 +2052,15 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1915
2052
  onFocus: handleFocus,
1916
2053
  onBlur: handleBlur,
1917
2054
  children: [
1918
- arrows && !disabled && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2055
+ responsiveArrows && !disabled && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1919
2056
  PrevArrow,
1920
2057
  {
1921
2058
  currentSlide,
1922
2059
  slideCount,
1923
- slidesToShow,
1924
- infinite,
1925
- centerMode,
2060
+ slidesToShow: responsiveSlidesToShow,
2061
+ infinite: responsiveInfinite,
2062
+ centerMode: responsiveCenterMode,
2063
+ vertical,
1926
2064
  onClick: prev,
1927
2065
  customArrow: prevArrow
1928
2066
  }
@@ -1952,10 +2090,10 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1952
2090
  slideCount,
1953
2091
  currentSlide,
1954
2092
  targetSlide,
1955
- slidesToShow,
1956
- slidesToScroll,
1957
- infinite,
1958
- centerMode,
2093
+ slidesToShow: responsiveSlidesToShow,
2094
+ slidesToScroll: responsiveSlidesToScroll,
2095
+ infinite: responsiveInfinite,
2096
+ centerMode: responsiveCenterMode,
1959
2097
  centerPadding,
1960
2098
  fade,
1961
2099
  vertical,
@@ -1974,26 +2112,27 @@ var Glide = (0, import_react5.forwardRef)(function Glide2(props, ref) {
1974
2112
  )
1975
2113
  }
1976
2114
  ),
1977
- arrows && !disabled && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2115
+ responsiveArrows && !disabled && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1978
2116
  NextArrow,
1979
2117
  {
1980
2118
  currentSlide,
1981
2119
  slideCount,
1982
- slidesToShow,
1983
- infinite,
1984
- centerMode,
2120
+ slidesToShow: responsiveSlidesToShow,
2121
+ infinite: responsiveInfinite,
2122
+ centerMode: responsiveCenterMode,
2123
+ vertical,
1985
2124
  onClick: next,
1986
2125
  customArrow: nextArrow
1987
2126
  }
1988
2127
  ),
1989
- dots && !disabled && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
2128
+ responsiveDots && !disabled && /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
1990
2129
  Dots,
1991
2130
  {
1992
2131
  slideCount,
1993
- slidesToScroll,
1994
- slidesToShow,
2132
+ slidesToScroll: responsiveSlidesToScroll,
2133
+ slidesToShow: responsiveSlidesToShow,
1995
2134
  currentSlide,
1996
- infinite,
2135
+ infinite: responsiveInfinite,
1997
2136
  onDotClick: handleDotClick,
1998
2137
  customPaging,
1999
2138
  appendDots,
package/dist/index.mjs CHANGED
@@ -503,10 +503,12 @@ var calculateSlideWidth = (listWidth, slidesToShow, centerMode, centerPadding, v
503
503
  let centerPaddingAdj = 0;
504
504
  if (centerMode) {
505
505
  const paddingValue = parseInt(centerPadding, 10) || 0;
506
- centerPaddingAdj = paddingValue * 2;
507
506
  if (centerPadding.endsWith("%")) {
508
- centerPaddingAdj = listWidth * paddingValue * 2 / 100;
507
+ centerPaddingAdj = listWidth * paddingValue / 100;
508
+ } else {
509
+ centerPaddingAdj = paddingValue;
509
510
  }
511
+ centerPaddingAdj = centerPaddingAdj * 2;
510
512
  }
511
513
  return Math.ceil((listWidth - centerPaddingAdj) / slidesToShow);
512
514
  };
@@ -591,6 +593,9 @@ var getSlideStyle = (spec) => {
591
593
  if (!spec.variableWidth) {
592
594
  style.width = spec.slideWidth;
593
595
  }
596
+ if (spec.vertical && spec.slideHeight) {
597
+ style.height = spec.slideHeight;
598
+ }
594
599
  if (spec.fade) {
595
600
  style.position = "relative";
596
601
  if (spec.vertical) {
@@ -599,7 +604,7 @@ var getSlideStyle = (spec) => {
599
604
  style.left = -spec.index * spec.slideWidth;
600
605
  }
601
606
  style.opacity = spec.currentSlide === spec.index ? 1 : 0;
602
- style.zIndex = spec.currentSlide === spec.index ? 999 : 998;
607
+ style.zIndex = spec.currentSlide === spec.index ? 1 : 0;
603
608
  if (spec.useCSS) {
604
609
  style.transition = `opacity ${spec.speed}ms ${spec.cssEase}, visibility ${spec.speed}ms ${spec.cssEase}`;
605
610
  }
@@ -855,7 +860,7 @@ var Track = forwardRef(function Track2({
855
860
  const baseTrackStyle = {
856
861
  position: "relative",
857
862
  display: fade ? "block" : "flex",
858
- flexDirection: vertical ? "column" : "row",
863
+ ...fade ? {} : { flexDirection: vertical ? "column" : "row" },
859
864
  ...trackStyle
860
865
  };
861
866
  return /* @__PURE__ */ jsx(
@@ -875,7 +880,7 @@ var Track = forwardRef(function Track2({
875
880
  // src/components/Arrows.tsx
876
881
  import { cloneElement as cloneElement2, isValidElement as isValidElement2 } from "react";
877
882
  import { jsx as jsx2 } from "react/jsx-runtime";
878
- var PrevArrowSVG = ({ className }) => /* @__PURE__ */ jsx2(
883
+ var PrevArrowSVG = ({ className, vertical }) => /* @__PURE__ */ jsx2(
879
884
  "svg",
880
885
  {
881
886
  className,
@@ -890,7 +895,7 @@ var PrevArrowSVG = ({ className }) => /* @__PURE__ */ jsx2(
890
895
  children: /* @__PURE__ */ jsx2("polyline", { points: "15 18 9 12 15 6" })
891
896
  }
892
897
  );
893
- var NextArrowSVG = ({ className }) => /* @__PURE__ */ jsx2(
898
+ var NextArrowSVG = ({ className, vertical }) => /* @__PURE__ */ jsx2(
894
899
  "svg",
895
900
  {
896
901
  className,
@@ -907,9 +912,7 @@ var NextArrowSVG = ({ className }) => /* @__PURE__ */ jsx2(
907
912
  );
908
913
  var baseArrowStyle = {
909
914
  position: "absolute",
910
- top: "50%",
911
- transform: "translateY(-50%)",
912
- zIndex: 10,
915
+ zIndex: 100,
913
916
  display: "flex",
914
917
  alignItems: "center",
915
918
  justifyContent: "center",
@@ -934,6 +937,7 @@ var PrevArrow = ({
934
937
  slidesToShow,
935
938
  infinite,
936
939
  centerMode,
940
+ vertical,
937
941
  onClick,
938
942
  customArrow
939
943
  }) => {
@@ -965,13 +969,15 @@ var PrevArrow = ({
965
969
  className: `glide-arrow glide-prev ${!canGo ? "glide-disabled" : ""}`,
966
970
  style: {
967
971
  ...canGo ? baseArrowStyle : disabledArrowStyle,
968
- left: 10
972
+ left: 10,
973
+ top: "50%",
974
+ transform: "translateY(-50%)"
969
975
  },
970
976
  onClick: handleClick,
971
977
  "aria-label": "Previous slide",
972
978
  "aria-disabled": !canGo,
973
979
  disabled: !canGo,
974
- children: /* @__PURE__ */ jsx2(PrevArrowSVG, {})
980
+ children: /* @__PURE__ */ jsx2(PrevArrowSVG, { vertical })
975
981
  }
976
982
  );
977
983
  };
@@ -981,6 +987,7 @@ var NextArrow = ({
981
987
  slidesToShow,
982
988
  infinite,
983
989
  centerMode,
990
+ vertical,
984
991
  onClick,
985
992
  customArrow
986
993
  }) => {
@@ -1015,13 +1022,15 @@ var NextArrow = ({
1015
1022
  className: `glide-arrow glide-next ${!canGo ? "glide-disabled" : ""}`,
1016
1023
  style: {
1017
1024
  ...canGo ? baseArrowStyle : disabledArrowStyle,
1018
- right: 10
1025
+ right: 10,
1026
+ top: "50%",
1027
+ transform: "translateY(-50%)"
1019
1028
  },
1020
1029
  onClick: handleClick,
1021
1030
  "aria-label": "Next slide",
1022
1031
  "aria-disabled": !canGo,
1023
1032
  disabled: !canGo,
1024
- children: /* @__PURE__ */ jsx2(NextArrowSVG, {})
1033
+ children: /* @__PURE__ */ jsx2(NextArrowSVG, { vertical })
1025
1034
  }
1026
1035
  );
1027
1036
  };
@@ -1444,6 +1453,95 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1444
1453
  scrolling
1445
1454
  } = state;
1446
1455
  const slideCount = Children2.count(children);
1456
+ const [breakpoint, setBreakpoint] = React4.useState(null);
1457
+ useEffect(() => {
1458
+ if (!canUseDOM() || !settings.responsive) return;
1459
+ const responsiveSettings2 = settings.responsive;
1460
+ const breakpoints = responsiveSettings2.map((bp) => bp.breakpoint).sort((a, b) => a - b);
1461
+ const mediaQueryListeners = [];
1462
+ breakpoints.forEach((bp, index) => {
1463
+ let query;
1464
+ if (index === 0) {
1465
+ query = `(max-width: ${bp}px)`;
1466
+ } else {
1467
+ query = `(min-width: ${breakpoints[index - 1] + 1}px) and (max-width: ${bp}px)`;
1468
+ }
1469
+ const mql = window.matchMedia(query);
1470
+ const listener = (e) => {
1471
+ if (e.matches) {
1472
+ setBreakpoint(bp);
1473
+ }
1474
+ };
1475
+ mql.addEventListener("change", listener);
1476
+ mediaQueryListeners.push({ mql, listener });
1477
+ if (mql.matches) {
1478
+ setBreakpoint(bp);
1479
+ }
1480
+ });
1481
+ const maxBreakpoint = breakpoints[breakpoints.length - 1];
1482
+ const fullScreenQuery = `(min-width: ${maxBreakpoint + 1}px)`;
1483
+ const fullScreenMql = window.matchMedia(fullScreenQuery);
1484
+ const fullScreenListener = (e) => {
1485
+ if (e.matches) {
1486
+ setBreakpoint(null);
1487
+ }
1488
+ };
1489
+ fullScreenMql.addEventListener("change", fullScreenListener);
1490
+ mediaQueryListeners.push({ mql: fullScreenMql, listener: fullScreenListener });
1491
+ if (fullScreenMql.matches) {
1492
+ setBreakpoint(null);
1493
+ }
1494
+ return () => {
1495
+ mediaQueryListeners.forEach(({ mql, listener }) => {
1496
+ mql.removeEventListener("change", listener);
1497
+ });
1498
+ };
1499
+ }, [settings.responsive]);
1500
+ const responsiveSettings = useMemo4(() => {
1501
+ let merged;
1502
+ if (!breakpoint || !settings.responsive) {
1503
+ merged = settings;
1504
+ } else {
1505
+ const matchedBreakpoint = settings.responsive.find((bp) => bp.breakpoint === breakpoint);
1506
+ if (!matchedBreakpoint) {
1507
+ merged = settings;
1508
+ } else if (matchedBreakpoint.settings === "disabled") {
1509
+ merged = { ...settings, slidesToShow: 1, slidesToScroll: 1 };
1510
+ } else {
1511
+ merged = { ...settings, ...matchedBreakpoint.settings };
1512
+ }
1513
+ }
1514
+ if (merged.centerMode && merged.slidesToScroll > 1) {
1515
+ if (process.env.NODE_ENV !== "production") {
1516
+ console.warn(
1517
+ `slidesToScroll should be equal to 1 in centerMode, you are using ${merged.slidesToScroll}`
1518
+ );
1519
+ }
1520
+ merged = { ...merged, slidesToScroll: 1 };
1521
+ }
1522
+ if (merged.fade) {
1523
+ if (merged.slidesToShow > 1 && process.env.NODE_ENV !== "production") {
1524
+ console.warn(
1525
+ `slidesToShow should be equal to 1 when fade is true, you're using ${merged.slidesToShow}`
1526
+ );
1527
+ }
1528
+ if (merged.slidesToScroll > 1 && process.env.NODE_ENV !== "production") {
1529
+ console.warn(
1530
+ `slidesToScroll should be equal to 1 when fade is true, you're using ${merged.slidesToScroll}`
1531
+ );
1532
+ }
1533
+ merged = { ...merged, slidesToShow: 1, slidesToScroll: 1 };
1534
+ }
1535
+ return merged;
1536
+ }, [breakpoint, settings]);
1537
+ const {
1538
+ slidesToShow: responsiveSlidesToShow,
1539
+ slidesToScroll: responsiveSlidesToScroll,
1540
+ infinite: responsiveInfinite,
1541
+ centerMode: responsiveCenterMode,
1542
+ dots: responsiveDots,
1543
+ arrows: responsiveArrows
1544
+ } = responsiveSettings;
1447
1545
  const {
1448
1546
  slideWidth: calculatedSlideWidth,
1449
1547
  trackStyle,
@@ -1455,10 +1553,10 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1455
1553
  } = useTrack({
1456
1554
  currentSlide,
1457
1555
  slideCount,
1458
- slidesToShow,
1459
- slidesToScroll,
1460
- infinite,
1461
- centerMode,
1556
+ slidesToShow: responsiveSlidesToShow,
1557
+ slidesToScroll: responsiveSlidesToScroll,
1558
+ infinite: responsiveInfinite,
1559
+ centerMode: responsiveCenterMode,
1462
1560
  centerPadding,
1463
1561
  listWidth: listWidth || 0,
1464
1562
  listHeight: listHeight || 0,
@@ -1476,47 +1574,53 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1476
1574
  swipeLeft
1477
1575
  });
1478
1576
  useEffect(() => {
1479
- if (!canUseDOM() || !listRef.current) return;
1480
- const updateDimensions = () => {
1577
+ if (!canUseDOM()) return;
1578
+ const timeoutId = setTimeout(() => {
1481
1579
  if (!listRef.current) return;
1482
- const newListWidth = getWidth(listRef.current);
1483
- const newListHeight = getHeight(listRef.current);
1484
- const firstSlide = listRef.current.querySelector('[data-index="0"]');
1485
- const newSlideHeight = firstSlide ? getHeight(firstSlide) : null;
1486
- dispatch({
1487
- type: "INIT",
1488
- payload: {
1489
- listWidth: newListWidth,
1490
- listHeight: newListHeight,
1491
- slideHeight: newSlideHeight,
1492
- slideCount
1493
- }
1494
- });
1495
- };
1496
- updateDimensions();
1497
- resizeObserverRef.current = new ResizeObserver(updateDimensions);
1498
- resizeObserverRef.current.observe(listRef.current);
1499
- onInit?.();
1580
+ const updateDimensions = () => {
1581
+ if (!listRef.current) return;
1582
+ const newListWidth = getWidth(listRef.current);
1583
+ const firstSlide = listRef.current.querySelector('[data-index="0"]');
1584
+ const newSlideHeight = firstSlide ? getHeight(firstSlide) : null;
1585
+ const newListHeight = newSlideHeight ? newSlideHeight * responsiveSlidesToShow : null;
1586
+ dispatch({
1587
+ type: "INIT",
1588
+ payload: {
1589
+ listWidth: newListWidth,
1590
+ listHeight: newListHeight,
1591
+ slideHeight: newSlideHeight,
1592
+ slideCount
1593
+ }
1594
+ });
1595
+ };
1596
+ updateDimensions();
1597
+ if (!resizeObserverRef.current && listRef.current) {
1598
+ resizeObserverRef.current = new ResizeObserver(updateDimensions);
1599
+ resizeObserverRef.current.observe(listRef.current);
1600
+ }
1601
+ if (!initialized) {
1602
+ onInit?.();
1603
+ }
1604
+ }, 0);
1500
1605
  return () => {
1606
+ clearTimeout(timeoutId);
1501
1607
  resizeObserverRef.current?.disconnect();
1608
+ resizeObserverRef.current = null;
1502
1609
  };
1503
- }, [slideCount, onInit]);
1504
- const autoplayIterator = useCallback3(() => {
1505
- if (autoplaying !== "playing") return;
1506
- const nextSlideIndex = currentSlide + slidesToScroll;
1507
- goToSlide(nextSlideIndex);
1508
- }, [autoplaying, currentSlide, slidesToScroll]);
1610
+ }, [slideCount, initialized, onInit, responsiveSlidesToShow]);
1509
1611
  useEffect(() => {
1510
- if (!autoplay || !initialized) return;
1511
- if (autoplaying === "playing") {
1512
- autoplayTimerRef.current = setTimeout(autoplayIterator, autoplaySpeed);
1513
- }
1514
- return () => {
1515
- if (autoplayTimerRef.current) {
1516
- clearTimeout(autoplayTimerRef.current);
1612
+ if (!initialized || !canUseDOM()) return;
1613
+ if (currentSlide >= slideCount) {
1614
+ const newSlide = Math.max(0, slideCount - responsiveSlidesToShow);
1615
+ if (newSlide !== currentSlide) {
1616
+ dispatch({
1617
+ type: "GO_TO_SLIDE",
1618
+ payload: { slide: newSlide, animated: false }
1619
+ });
1517
1620
  }
1518
- };
1519
- }, [autoplay, autoplaying, initialized, autoplayIterator, autoplaySpeed]);
1621
+ }
1622
+ onReInit?.();
1623
+ }, [responsiveSlidesToShow, responsiveSlidesToScroll, responsiveInfinite, responsiveCenterMode, initialized, slideCount, currentSlide, onReInit]);
1520
1624
  useEffect(() => {
1521
1625
  if (animating) {
1522
1626
  animationEndTimeoutRef.current = setTimeout(() => {
@@ -1534,21 +1638,21 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1534
1638
  (slideIndex, dontAnimate = false) => {
1535
1639
  if (waitForAnimate && animating) return;
1536
1640
  let targetIndex = slideIndex;
1537
- if (infinite) {
1641
+ if (responsiveInfinite) {
1538
1642
  if (targetIndex < 0) {
1539
1643
  targetIndex = slideCount + targetIndex;
1540
1644
  } else if (targetIndex >= slideCount) {
1541
1645
  targetIndex = targetIndex - slideCount;
1542
1646
  }
1543
1647
  } else {
1544
- targetIndex = clamp(targetIndex, 0, slideCount - slidesToShow);
1648
+ targetIndex = clamp(targetIndex, 0, slideCount - responsiveSlidesToShow);
1545
1649
  }
1546
1650
  beforeChange?.(currentSlide, targetIndex);
1547
1651
  if (lazyLoad) {
1548
1652
  const slidesToLoad = getOnDemandLazySlides({
1549
1653
  currentSlide: targetIndex,
1550
- centerMode,
1551
- slidesToShow,
1654
+ centerMode: responsiveCenterMode,
1655
+ slidesToShow: responsiveSlidesToShow,
1552
1656
  centerPadding,
1553
1657
  lazyLoadedList
1554
1658
  });
@@ -1567,23 +1671,23 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1567
1671
  [
1568
1672
  waitForAnimate,
1569
1673
  animating,
1570
- infinite,
1674
+ responsiveInfinite,
1571
1675
  slideCount,
1572
- slidesToShow,
1676
+ responsiveSlidesToShow,
1573
1677
  beforeChange,
1574
1678
  currentSlide,
1575
1679
  lazyLoad,
1576
- centerMode,
1680
+ responsiveCenterMode,
1577
1681
  centerPadding,
1578
1682
  lazyLoadedList
1579
1683
  ]
1580
1684
  );
1581
1685
  const next = useCallback3(() => {
1582
- goToSlide(currentSlide + slidesToScroll);
1583
- }, [currentSlide, slidesToScroll, goToSlide]);
1686
+ goToSlide(currentSlide + responsiveSlidesToScroll);
1687
+ }, [currentSlide, responsiveSlidesToScroll, goToSlide]);
1584
1688
  const prev = useCallback3(() => {
1585
- goToSlide(currentSlide - slidesToScroll);
1586
- }, [currentSlide, slidesToScroll, goToSlide]);
1689
+ goToSlide(currentSlide - responsiveSlidesToScroll);
1690
+ }, [currentSlide, responsiveSlidesToScroll, goToSlide]);
1587
1691
  const goTo = useCallback3(
1588
1692
  (index, dontAnimate = false) => {
1589
1693
  goToSlide(index, dontAnimate);
@@ -1596,6 +1700,29 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1596
1700
  const play = useCallback3(() => {
1597
1701
  dispatch({ type: "SET_AUTOPLAY", payload: "playing" });
1598
1702
  }, []);
1703
+ const autoplayTick = useCallback3(() => {
1704
+ const nextSlideIndex = currentSlide + responsiveSlidesToScroll;
1705
+ goToSlide(nextSlideIndex);
1706
+ }, [currentSlide, responsiveSlidesToScroll, goToSlide]);
1707
+ useEffect(() => {
1708
+ if (!autoplay || !initialized) return;
1709
+ if (autoplaying === "playing") {
1710
+ if (autoplayTimerRef.current) {
1711
+ clearInterval(autoplayTimerRef.current);
1712
+ }
1713
+ autoplayTimerRef.current = setInterval(autoplayTick, autoplaySpeed + 50);
1714
+ } else {
1715
+ if (autoplayTimerRef.current) {
1716
+ clearInterval(autoplayTimerRef.current);
1717
+ autoplayTimerRef.current = null;
1718
+ }
1719
+ }
1720
+ return () => {
1721
+ if (autoplayTimerRef.current) {
1722
+ clearInterval(autoplayTimerRef.current);
1723
+ }
1724
+ };
1725
+ }, [autoplay, autoplaying, initialized, autoplayTick, autoplaySpeed]);
1599
1726
  useImperativeHandle(
1600
1727
  ref,
1601
1728
  () => ({
@@ -1645,16 +1772,16 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1645
1772
  swiped,
1646
1773
  swiping,
1647
1774
  slideCount,
1648
- slidesToScroll,
1649
- infinite,
1775
+ slidesToScroll: responsiveSlidesToScroll,
1776
+ infinite: responsiveInfinite,
1650
1777
  touchObject,
1651
1778
  swipeEvent,
1652
1779
  listHeight: listHeight || 0,
1653
1780
  listWidth: listWidth || 0,
1654
1781
  slideWidth: calculatedSlideWidth,
1655
1782
  slideHeight: slideHeight || 0,
1656
- centerMode,
1657
- slidesToShow,
1783
+ centerMode: responsiveCenterMode,
1784
+ slidesToShow: responsiveSlidesToShow,
1658
1785
  fade,
1659
1786
  disabled,
1660
1787
  variableWidth,
@@ -1681,16 +1808,16 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1681
1808
  swiped,
1682
1809
  swiping,
1683
1810
  slideCount,
1684
- slidesToScroll,
1685
- infinite,
1811
+ responsiveSlidesToScroll,
1812
+ responsiveInfinite,
1686
1813
  touchObject,
1687
1814
  swipeEvent,
1688
1815
  listHeight,
1689
1816
  listWidth,
1690
1817
  calculatedSlideWidth,
1691
1818
  slideHeight,
1692
- centerMode,
1693
- slidesToShow,
1819
+ responsiveCenterMode,
1820
+ responsiveSlidesToShow,
1694
1821
  fade,
1695
1822
  disabled,
1696
1823
  variableWidth,
@@ -1712,13 +1839,13 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1712
1839
  onSwipe,
1713
1840
  targetSlide,
1714
1841
  currentSlide,
1715
- infinite,
1842
+ infinite: responsiveInfinite,
1716
1843
  slideCount,
1717
- slidesToScroll,
1718
- slidesToShow,
1844
+ slidesToScroll: responsiveSlidesToScroll,
1845
+ slidesToShow: responsiveSlidesToShow,
1719
1846
  slideWidth: calculatedSlideWidth,
1720
1847
  slideHeight: slideHeight || 0,
1721
- centerMode,
1848
+ centerMode: responsiveCenterMode,
1722
1849
  fade,
1723
1850
  disabled,
1724
1851
  variableWidth,
@@ -1759,13 +1886,13 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1759
1886
  onSwipe,
1760
1887
  targetSlide,
1761
1888
  currentSlide,
1762
- infinite,
1889
+ responsiveInfinite,
1763
1890
  slideCount,
1764
- slidesToScroll,
1765
- slidesToShow,
1891
+ responsiveSlidesToScroll,
1892
+ responsiveSlidesToShow,
1766
1893
  calculatedSlideWidth,
1767
1894
  slideHeight,
1768
- centerMode,
1895
+ responsiveCenterMode,
1769
1896
  fade,
1770
1897
  disabled,
1771
1898
  variableWidth,
@@ -1832,23 +1959,33 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1832
1959
  }),
1833
1960
  [vertical]
1834
1961
  );
1835
- const listStyle = useMemo4(
1836
- () => ({
1962
+ const listStyle = useMemo4(() => {
1963
+ const style = {
1837
1964
  position: "relative",
1838
1965
  display: "block",
1839
1966
  overflow: "hidden",
1840
1967
  margin: 0,
1841
1968
  padding: 0
1842
- }),
1843
- []
1844
- );
1969
+ };
1970
+ if (vertical && listHeight) {
1971
+ style.height = listHeight;
1972
+ }
1973
+ if (responsiveCenterMode) {
1974
+ if (vertical) {
1975
+ style.padding = `${centerPadding} 0px`;
1976
+ } else {
1977
+ style.padding = `0px ${centerPadding}`;
1978
+ }
1979
+ }
1980
+ return style;
1981
+ }, [responsiveCenterMode, vertical, centerPadding, listHeight]);
1845
1982
  if (!initialized || !canUseDOM()) {
1846
- return /* @__PURE__ */ jsx4("div", { className: `glide-slider ${className}`.trim(), style: sliderStyle, children: /* @__PURE__ */ jsx4("div", { className: "glide-list", style: listStyle, children: /* @__PURE__ */ jsx4("div", { className: "glide-track", style: { display: "flex" }, children: React4.Children.map(children, (child, idx) => /* @__PURE__ */ jsx4(
1983
+ return /* @__PURE__ */ jsx4("div", { className: `glide-slider ${className}`.trim(), style: sliderStyle, children: /* @__PURE__ */ jsx4("div", { ref: listRef, className: "glide-list", style: listStyle, children: /* @__PURE__ */ jsx4("div", { className: "glide-track", style: { display: "flex" }, children: React4.Children.map(children, (child, idx) => /* @__PURE__ */ jsx4(
1847
1984
  "div",
1848
1985
  {
1849
1986
  className: "glide-slide",
1850
1987
  style: {
1851
- width: `${100 / slidesToShow}%`,
1988
+ width: `${100 / responsiveSlidesToShow}%`,
1852
1989
  flexShrink: 0
1853
1990
  },
1854
1991
  children: child
@@ -1866,14 +2003,15 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1866
2003
  onFocus: handleFocus,
1867
2004
  onBlur: handleBlur,
1868
2005
  children: [
1869
- arrows && !disabled && /* @__PURE__ */ jsx4(
2006
+ responsiveArrows && !disabled && /* @__PURE__ */ jsx4(
1870
2007
  PrevArrow,
1871
2008
  {
1872
2009
  currentSlide,
1873
2010
  slideCount,
1874
- slidesToShow,
1875
- infinite,
1876
- centerMode,
2011
+ slidesToShow: responsiveSlidesToShow,
2012
+ infinite: responsiveInfinite,
2013
+ centerMode: responsiveCenterMode,
2014
+ vertical,
1877
2015
  onClick: prev,
1878
2016
  customArrow: prevArrow
1879
2017
  }
@@ -1903,10 +2041,10 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1903
2041
  slideCount,
1904
2042
  currentSlide,
1905
2043
  targetSlide,
1906
- slidesToShow,
1907
- slidesToScroll,
1908
- infinite,
1909
- centerMode,
2044
+ slidesToShow: responsiveSlidesToShow,
2045
+ slidesToScroll: responsiveSlidesToScroll,
2046
+ infinite: responsiveInfinite,
2047
+ centerMode: responsiveCenterMode,
1910
2048
  centerPadding,
1911
2049
  fade,
1912
2050
  vertical,
@@ -1925,26 +2063,27 @@ var Glide = forwardRef2(function Glide2(props, ref) {
1925
2063
  )
1926
2064
  }
1927
2065
  ),
1928
- arrows && !disabled && /* @__PURE__ */ jsx4(
2066
+ responsiveArrows && !disabled && /* @__PURE__ */ jsx4(
1929
2067
  NextArrow,
1930
2068
  {
1931
2069
  currentSlide,
1932
2070
  slideCount,
1933
- slidesToShow,
1934
- infinite,
1935
- centerMode,
2071
+ slidesToShow: responsiveSlidesToShow,
2072
+ infinite: responsiveInfinite,
2073
+ centerMode: responsiveCenterMode,
2074
+ vertical,
1936
2075
  onClick: next,
1937
2076
  customArrow: nextArrow
1938
2077
  }
1939
2078
  ),
1940
- dots && !disabled && /* @__PURE__ */ jsx4(
2079
+ responsiveDots && !disabled && /* @__PURE__ */ jsx4(
1941
2080
  Dots,
1942
2081
  {
1943
2082
  slideCount,
1944
- slidesToScroll,
1945
- slidesToShow,
2083
+ slidesToScroll: responsiveSlidesToScroll,
2084
+ slidesToShow: responsiveSlidesToShow,
1946
2085
  currentSlide,
1947
- infinite,
2086
+ infinite: responsiveInfinite,
1948
2087
  onDotClick: handleDotClick,
1949
2088
  customPaging,
1950
2089
  appendDots,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "glide-react",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "A modern, minimalistic, lightweight React carousel component built with TypeScript",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -24,7 +24,9 @@
24
24
  "typecheck": "tsc --noEmit",
25
25
  "test": "jest",
26
26
  "test:watch": "jest --watch",
27
- "prepublishOnly": "npm run build"
27
+ "prepublishOnly": "npm run build",
28
+ "docs:dev": "webpack serve --config webpack.config.docs.js --mode development",
29
+ "docs:build": "webpack --config webpack.config.docs.js --mode production"
28
30
  },
29
31
  "repository": {
30
32
  "type": "git",
@@ -54,6 +56,10 @@
54
56
  "react-dom": ">=16.8.0"
55
57
  },
56
58
  "devDependencies": {
59
+ "@babel/core": "^7.23.0",
60
+ "@babel/preset-env": "^7.23.0",
61
+ "@babel/preset-react": "^7.23.0",
62
+ "@babel/preset-typescript": "^7.23.0",
57
63
  "@testing-library/jest-dom": "^6.4.0",
58
64
  "@testing-library/react": "^14.2.0",
59
65
  "@types/jest": "^29.5.12",
@@ -61,15 +67,23 @@
61
67
  "@types/react-dom": "^18.2.18",
62
68
  "@typescript-eslint/eslint-plugin": "^6.21.0",
63
69
  "@typescript-eslint/parser": "^6.21.0",
70
+ "babel-loader": "^9.1.3",
71
+ "css-loader": "^6.10.0",
64
72
  "eslint": "^8.56.0",
65
73
  "eslint-plugin-react": "^7.33.2",
66
74
  "eslint-plugin-react-hooks": "^4.6.0",
75
+ "html-webpack-plugin": "^5.6.0",
67
76
  "jest": "^29.7.0",
68
77
  "jest-environment-jsdom": "^29.7.0",
69
78
  "react": "^18.2.0",
70
79
  "react-dom": "^18.2.0",
80
+ "react-syntax-highlighter": "^15.5.0",
81
+ "style-loader": "^3.3.4",
71
82
  "ts-jest": "^29.1.2",
72
83
  "tsup": "^8.0.1",
73
- "typescript": "^5.3.3"
84
+ "typescript": "^5.3.3",
85
+ "webpack": "^5.90.0",
86
+ "webpack-cli": "^5.1.4",
87
+ "webpack-dev-server": "^4.15.1"
74
88
  }
75
89
  }