@salt-ds/embla-carousel 0.0.0-snapshot-20250627090641 → 0.1.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 (68) hide show
  1. package/CHANGELOG.md +14 -10
  2. package/css/salt-embla-carousel.css +14 -14
  3. package/dist-cjs/Carousel.css.js +1 -1
  4. package/dist-cjs/Carousel.js.map +1 -1
  5. package/dist-cjs/CarouselAnnouncementPlugin.js +9 -12
  6. package/dist-cjs/CarouselAnnouncementPlugin.js.map +1 -1
  7. package/dist-cjs/CarouselAutoplayIndicator.css.js +1 -1
  8. package/dist-cjs/CarouselAutoplayIndicator.js +64 -54
  9. package/dist-cjs/CarouselAutoplayIndicator.js.map +1 -1
  10. package/dist-cjs/CarouselAutoplayIndicatorSVG.js.map +1 -1
  11. package/dist-cjs/CarouselCard.css.js +1 -1
  12. package/dist-cjs/CarouselCard.js +1 -1
  13. package/dist-cjs/CarouselCard.js.map +1 -1
  14. package/dist-cjs/CarouselNextButton.js +4 -7
  15. package/dist-cjs/CarouselNextButton.js.map +1 -1
  16. package/dist-cjs/CarouselPreviousButton.js +4 -7
  17. package/dist-cjs/CarouselPreviousButton.js.map +1 -1
  18. package/dist-cjs/CarouselProgressLabel.css.js +1 -1
  19. package/dist-cjs/CarouselProgressLabel.js +24 -24
  20. package/dist-cjs/CarouselProgressLabel.js.map +1 -1
  21. package/dist-cjs/CarouselSlides.css.js +1 -1
  22. package/dist-cjs/CarouselSlides.js +33 -3
  23. package/dist-cjs/CarouselSlides.js.map +1 -1
  24. package/dist-cjs/CarouselTab.css.js +1 -1
  25. package/dist-cjs/CarouselTab.js +11 -15
  26. package/dist-cjs/CarouselTab.js.map +1 -1
  27. package/dist-cjs/CarouselTabList.js.map +1 -1
  28. package/dist-cjs/createCustomSettle.js +14 -0
  29. package/dist-cjs/createCustomSettle.js.map +1 -0
  30. package/dist-cjs/usePrevNextButtons.js +11 -13
  31. package/dist-cjs/usePrevNextButtons.js.map +1 -1
  32. package/dist-es/Carousel.css.js +1 -1
  33. package/dist-es/Carousel.js.map +1 -1
  34. package/dist-es/CarouselAnnouncementPlugin.js +9 -12
  35. package/dist-es/CarouselAnnouncementPlugin.js.map +1 -1
  36. package/dist-es/CarouselAutoplayIndicator.css.js +1 -1
  37. package/dist-es/CarouselAutoplayIndicator.js +64 -54
  38. package/dist-es/CarouselAutoplayIndicator.js.map +1 -1
  39. package/dist-es/CarouselAutoplayIndicatorSVG.js.map +1 -1
  40. package/dist-es/CarouselCard.css.js +1 -1
  41. package/dist-es/CarouselCard.js +1 -1
  42. package/dist-es/CarouselCard.js.map +1 -1
  43. package/dist-es/CarouselNextButton.js +5 -8
  44. package/dist-es/CarouselNextButton.js.map +1 -1
  45. package/dist-es/CarouselPreviousButton.js +5 -8
  46. package/dist-es/CarouselPreviousButton.js.map +1 -1
  47. package/dist-es/CarouselProgressLabel.css.js +1 -1
  48. package/dist-es/CarouselProgressLabel.js +25 -25
  49. package/dist-es/CarouselProgressLabel.js.map +1 -1
  50. package/dist-es/CarouselSlides.css.js +1 -1
  51. package/dist-es/CarouselSlides.js +34 -4
  52. package/dist-es/CarouselSlides.js.map +1 -1
  53. package/dist-es/CarouselTab.css.js +1 -1
  54. package/dist-es/CarouselTab.js +12 -16
  55. package/dist-es/CarouselTab.js.map +1 -1
  56. package/dist-es/CarouselTabList.js.map +1 -1
  57. package/dist-es/createCustomSettle.js +12 -0
  58. package/dist-es/createCustomSettle.js.map +1 -0
  59. package/dist-es/usePrevNextButtons.js +12 -14
  60. package/dist-es/usePrevNextButtons.js.map +1 -1
  61. package/dist-types/Carousel.d.ts +1 -1
  62. package/dist-types/CarouselAnnouncementPlugin.d.ts +8 -18
  63. package/dist-types/CarouselAutoplayIndicator.d.ts +4 -0
  64. package/dist-types/CarouselAutoplayIndicatorSVG.d.ts +2 -2
  65. package/dist-types/CarouselNextButton.d.ts +1 -1
  66. package/dist-types/CarouselPreviousButton.d.ts +1 -1
  67. package/dist-types/createCustomSettle.d.ts +4 -0
  68. package/package.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"CarouselTabList.js","sources":["../src/CarouselTabList.tsx"],"sourcesContent":["import { type RenderPropsType, makePrefixer, renderProps } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport { type HTMLAttributes, forwardRef, useRef } from \"react\";\nimport { useCarouselContext } from \"./CarouselContext\";\nimport {\n CarouselTab,\n type CarouselTabProps,\n useCarouselTab,\n} from \"./CarouselTab\";\nimport carouselControlsCss from \"./CarouselTabList.css\";\n\nconst withBaseName = makePrefixer(\"saltCarouselTabList\");\n\n/**\n * Props for the CarouselTabList component.\n */\nexport interface CarouselTabListProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Render prop to enable customisation of tab button.\n */\n render?: RenderPropsType[\"render\"];\n}\n\nconst CarouselTabRenderer = forwardRef<\n HTMLButtonElement,\n CarouselTabProps & { render?: CarouselTabListProps[\"render\"] }\n>((props, ref) => {\n return renderProps(CarouselTab, { ...props, ref });\n});\n\nexport const CarouselTabList = forwardRef<HTMLDivElement, CarouselTabListProps>(\n function CarouselTabList({ className, render, onKeyDown, ...rest }, ref) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-carousel-controls\",\n css: carouselControlsCss,\n window: targetWindow,\n });\n\n const { emblaApi } = useCarouselContext();\n const { selectedIndex, scrollSnaps, onClick } = useCarouselTab(emblaApi);\n\n const slideNodes = emblaApi?.slideNodes();\n const numberOfSlides = slideNodes?.length ?? 0;\n const slidesPerTransition = numberOfSlides\n ? Math.ceil(numberOfSlides / scrollSnaps.length)\n : 0;\n\n const buttonRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLDivElement> = (\n event,\n ) => {\n let newIndex = selectedIndex;\n\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n const direction = event.key === \"ArrowLeft\" ? -1 : 1;\n newIndex =\n (selectedIndex + direction + scrollSnaps.length) % scrollSnaps.length;\n } else if (event.key === \"Home\") {\n newIndex = 0;\n } else if (event.key === \"End\") {\n newIndex = scrollSnaps.length - 1;\n }\n\n if (newIndex !== selectedIndex) {\n onClick(newIndex);\n buttonRefs.current[newIndex]?.focus();\n event.preventDefault();\n event.stopPropagation();\n }\n onKeyDown?.(event);\n };\n\n return (\n <div\n role=\"tablist\"\n aria-label=\"Choose slide\"\n tabIndex={0}\n className={clsx(withBaseName(), className)}\n onKeyDown={handleKeyDown}\n ref={ref}\n {...rest}\n >\n {scrollSnaps.map((_, tabIndex) => {\n const startSlideNumber = tabIndex * slidesPerTransition + 1;\n const endSlideNumber = Math.min(\n startSlideNumber + slidesPerTransition - 1,\n numberOfSlides,\n );\n const label =\n startSlideNumber === endSlideNumber\n ? `Slide ${startSlideNumber}`\n : `Slides ${startSlideNumber}-${endSlideNumber} of ${numberOfSlides}`;\n\n const selected = selectedIndex === tabIndex;\n\n const ariaControls = slideNodes?.length\n ? slideNodes[startSlideNumber - 1].id\n : undefined;\n return (\n <CarouselTabRenderer\n key={`carouselTab-${tabIndex}}`}\n ref={(element: HTMLButtonElement) => {\n buttonRefs.current[tabIndex] = element;\n }}\n render={render}\n role={\"tab\"}\n onClick={() => onClick(tabIndex)}\n aria-selected={selected}\n selected={selected}\n tabIndex={selected ? 0 : -1}\n aria-label={label}\n aria-labelledby={ariaControls}\n aria-controls={ariaControls}\n />\n );\n })}\n </div>\n );\n },\n);\n"],"names":["CarouselTabList","carouselControlsCss"],"mappings":"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"}
1
+ {"version":3,"file":"CarouselTabList.js","sources":["../src/CarouselTabList.tsx"],"sourcesContent":["import { type RenderPropsType, makePrefixer, renderProps } from \"@salt-ds/core\";\nimport { useComponentCssInjection } from \"@salt-ds/styles\";\nimport { useWindow } from \"@salt-ds/window\";\nimport { clsx } from \"clsx\";\nimport {\n type HTMLAttributes,\n type KeyboardEventHandler,\n forwardRef,\n useRef,\n} from \"react\";\nimport { useCarouselContext } from \"./CarouselContext\";\nimport {\n CarouselTab,\n type CarouselTabProps,\n useCarouselTab,\n} from \"./CarouselTab\";\nimport carouselControlsCss from \"./CarouselTabList.css\";\n\nconst withBaseName = makePrefixer(\"saltCarouselTabList\");\n\n/**\n * Props for the CarouselTabList component.\n */\nexport interface CarouselTabListProps extends HTMLAttributes<HTMLDivElement> {\n /**\n * Render prop to enable customisation of tab button.\n */\n render?: RenderPropsType[\"render\"];\n}\n\nconst CarouselTabRenderer = forwardRef<\n HTMLButtonElement,\n CarouselTabProps & { render?: CarouselTabListProps[\"render\"] }\n>((props, ref) => {\n return renderProps(CarouselTab, { ...props, ref });\n});\n\nexport const CarouselTabList = forwardRef<HTMLDivElement, CarouselTabListProps>(\n function CarouselTabList({ className, render, onKeyDown, ...rest }, ref) {\n const targetWindow = useWindow();\n useComponentCssInjection({\n testId: \"salt-carousel-controls\",\n css: carouselControlsCss,\n window: targetWindow,\n });\n\n const { emblaApi } = useCarouselContext();\n const { selectedIndex, scrollSnaps, onClick } = useCarouselTab(emblaApi);\n\n const slideNodes = emblaApi?.slideNodes();\n const numberOfSlides = slideNodes?.length ?? 0;\n const slidesPerTransition = numberOfSlides\n ? Math.ceil(numberOfSlides / scrollSnaps.length)\n : 0;\n\n const buttonRefs = useRef<(HTMLButtonElement | null)[]>([]);\n\n const handleKeyDown: KeyboardEventHandler<HTMLDivElement> = (event) => {\n let newIndex = selectedIndex;\n\n if (event.key === \"ArrowLeft\" || event.key === \"ArrowRight\") {\n const direction = event.key === \"ArrowLeft\" ? -1 : 1;\n newIndex =\n (selectedIndex + direction + scrollSnaps.length) % scrollSnaps.length;\n } else if (event.key === \"Home\") {\n newIndex = 0;\n } else if (event.key === \"End\") {\n newIndex = scrollSnaps.length - 1;\n }\n\n if (newIndex !== selectedIndex) {\n onClick(newIndex);\n buttonRefs.current[newIndex]?.focus();\n event.preventDefault();\n event.stopPropagation();\n }\n onKeyDown?.(event);\n };\n\n return (\n <div\n role=\"tablist\"\n aria-label=\"Choose slide\"\n tabIndex={0}\n className={clsx(withBaseName(), className)}\n onKeyDown={handleKeyDown}\n ref={ref}\n {...rest}\n >\n {scrollSnaps.map((_, tabIndex) => {\n const startSlideNumber = tabIndex * slidesPerTransition + 1;\n const endSlideNumber = Math.min(\n startSlideNumber + slidesPerTransition - 1,\n numberOfSlides,\n );\n const label =\n startSlideNumber === endSlideNumber\n ? `Slide ${startSlideNumber}`\n : `Slides ${startSlideNumber}-${endSlideNumber} of ${numberOfSlides}`;\n\n const selected = selectedIndex === tabIndex;\n\n const ariaControls = slideNodes?.length\n ? slideNodes[startSlideNumber - 1].id\n : undefined;\n return (\n <CarouselTabRenderer\n key={`carouselTab-${tabIndex}}`}\n ref={(element: HTMLButtonElement) => {\n buttonRefs.current[tabIndex] = element;\n }}\n render={render}\n role={\"tab\"}\n onClick={() => onClick(tabIndex)}\n aria-selected={selected}\n selected={selected}\n tabIndex={selected ? 0 : -1}\n aria-label={label}\n aria-labelledby={ariaControls}\n aria-controls={ariaControls}\n />\n );\n })}\n </div>\n );\n },\n);\n"],"names":["CarouselTabList","carouselControlsCss"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ const settlePixelThreshold = 10;
2
+ const createCustomSettle = (callback) => function fireCustomSettle(emblaApi) {
3
+ const { dragHandler, location, target } = emblaApi.internalEngine();
4
+ if (dragHandler.pointerDown()) return;
5
+ const displacement = target.get() - location.get();
6
+ if (Math.abs(displacement) < settlePixelThreshold) {
7
+ callback(emblaApi);
8
+ }
9
+ };
10
+
11
+ export { createCustomSettle };
12
+ //# sourceMappingURL=createCustomSettle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createCustomSettle.js","sources":["../src/createCustomSettle.ts"],"sourcesContent":["import type { EmblaCarouselType } from \"embla-carousel\";\n\nconst settlePixelThreshold = 10;\n\nexport type SettleCallback = (emblaApi: EmblaCarouselType) => void;\nexport type CreateCustomSettle = (callback: SettleCallback) => SettleCallback;\n\nexport const createCustomSettle: CreateCustomSettle = (callback) =>\n function fireCustomSettle(emblaApi: EmblaCarouselType) {\n const { dragHandler, location, target } = emblaApi.internalEngine();\n if (dragHandler.pointerDown()) return;\n const displacement = target.get() - location.get();\n if (Math.abs(displacement) < settlePixelThreshold) {\n callback(emblaApi);\n }\n };\n"],"names":[],"mappings":"AAEA,MAAM,oBAAuB,GAAA,EAAA;AAKtB,MAAM,kBAAyC,GAAA,CAAC,QACrD,KAAA,SAAS,iBAAiB,QAA6B,EAAA;AACrD,EAAA,MAAM,EAAE,WAAa,EAAA,QAAA,EAAU,MAAO,EAAA,GAAI,SAAS,cAAe,EAAA;AAClE,EAAI,IAAA,WAAA,CAAY,aAAe,EAAA;AAC/B,EAAA,MAAM,YAAe,GAAA,MAAA,CAAO,GAAI,EAAA,GAAI,SAAS,GAAI,EAAA;AACjD,EAAA,IAAI,IAAK,CAAA,GAAA,CAAI,YAAY,CAAA,GAAI,oBAAsB,EAAA;AACjD,IAAA,QAAA,CAAS,QAAQ,CAAA;AAAA;AAErB;;;;"}
@@ -1,23 +1,21 @@
1
- import { useState, useCallback, useEffect } from 'react';
1
+ import { useState, useEffect } from 'react';
2
2
  import { useCarouselContext } from './CarouselContext.js';
3
3
 
4
4
  const usePrevNextButtons = () => {
5
5
  const [prevBtnDisabled, setPrevBtnDisabled] = useState(true);
6
6
  const [nextBtnDisabled, setNextBtnDisabled] = useState(true);
7
7
  const { emblaApi } = useCarouselContext();
8
- const handlePrevButtonClick = useCallback(() => {
9
- if (!emblaApi) return;
10
- emblaApi.scrollPrev();
11
- }, [emblaApi]);
12
- const handleNextButtonClick = useCallback(() => {
13
- if (!emblaApi) return;
14
- emblaApi.scrollNext();
15
- }, [emblaApi]);
16
- const handleSelect = useCallback((emblaApi2) => {
17
- setPrevBtnDisabled(!emblaApi2.canScrollPrev());
18
- setNextBtnDisabled(!emblaApi2.canScrollNext());
19
- }, []);
8
+ const handlePrevButtonClick = () => {
9
+ emblaApi == null ? void 0 : emblaApi.scrollPrev();
10
+ };
11
+ const handleNextButtonClick = () => {
12
+ emblaApi == null ? void 0 : emblaApi.scrollNext();
13
+ };
20
14
  useEffect(() => {
15
+ const handleSelect = (emblaApi2) => {
16
+ setPrevBtnDisabled(!emblaApi2.canScrollPrev());
17
+ setNextBtnDisabled(!emblaApi2.canScrollNext());
18
+ };
21
19
  if (!emblaApi) {
22
20
  return;
23
21
  }
@@ -26,7 +24,7 @@ const usePrevNextButtons = () => {
26
24
  return () => {
27
25
  emblaApi.off("init", handleSelect).off("reInit", handleSelect).off("select", handleSelect);
28
26
  };
29
- }, [emblaApi, handleSelect]);
27
+ }, [emblaApi]);
30
28
  return {
31
29
  prevBtnDisabled,
32
30
  nextBtnDisabled,
@@ -1 +1 @@
1
- {"version":3,"file":"usePrevNextButtons.js","sources":["../src/usePrevNextButtons.tsx"],"sourcesContent":["import type { EmblaCarouselType } from \"embla-carousel\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport { useCarouselContext } from \"./CarouselContext\";\n\ntype UsePrevNextButtonsType = {\n /**\n * Indicates whether the previous button is disabled.\n */\n prevBtnDisabled: boolean;\n /**\n * Indicates whether the next button is disabled.\n */\n nextBtnDisabled: boolean;\n /**\n * Handles the click event for the previous button.\n */\n onPrevButtonClick: () => void;\n /**\n * Handles the click event for the next button.\n */\n onNextButtonClick: () => void;\n};\n\nexport const usePrevNextButtons = (): UsePrevNextButtonsType => {\n const [prevBtnDisabled, setPrevBtnDisabled] = useState(true);\n const [nextBtnDisabled, setNextBtnDisabled] = useState(true);\n\n const { emblaApi } = useCarouselContext();\n\n const handlePrevButtonClick = useCallback(() => {\n if (!emblaApi) return;\n emblaApi.scrollPrev();\n }, [emblaApi]);\n\n const handleNextButtonClick = useCallback(() => {\n if (!emblaApi) return;\n emblaApi.scrollNext();\n }, [emblaApi]);\n\n const handleSelect = useCallback((emblaApi: EmblaCarouselType) => {\n setPrevBtnDisabled(!emblaApi.canScrollPrev());\n setNextBtnDisabled(!emblaApi.canScrollNext());\n }, []);\n\n useEffect(() => {\n if (!emblaApi) {\n return;\n }\n handleSelect(emblaApi);\n emblaApi\n .on(\"init\", handleSelect)\n .on(\"reInit\", handleSelect)\n .on(\"select\", handleSelect);\n // Cleanup listener on component unmount\n return () => {\n emblaApi\n .off(\"init\", handleSelect)\n .off(\"reInit\", handleSelect)\n .off(\"select\", handleSelect);\n };\n }, [emblaApi, handleSelect]);\n\n return {\n prevBtnDisabled,\n nextBtnDisabled,\n onPrevButtonClick: handlePrevButtonClick,\n onNextButtonClick: handleNextButtonClick,\n };\n};\n"],"names":["emblaApi"],"mappings":";;;AAuBO,MAAM,qBAAqB,MAA8B;AAC9D,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3D,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,IAAI,CAAA;AAE3D,EAAM,MAAA,EAAE,QAAS,EAAA,GAAI,kBAAmB,EAAA;AAExC,EAAM,MAAA,qBAAA,GAAwB,YAAY,MAAM;AAC9C,IAAA,IAAI,CAAC,QAAU,EAAA;AACf,IAAA,QAAA,CAAS,UAAW,EAAA;AAAA,GACtB,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAM,MAAA,qBAAA,GAAwB,YAAY,MAAM;AAC9C,IAAA,IAAI,CAAC,QAAU,EAAA;AACf,IAAA,QAAA,CAAS,UAAW,EAAA;AAAA,GACtB,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAM,MAAA,YAAA,GAAe,WAAY,CAAA,CAACA,SAAgC,KAAA;AAChE,IAAmB,kBAAA,CAAA,CAACA,SAAS,CAAA,aAAA,EAAe,CAAA;AAC5C,IAAmB,kBAAA,CAAA,CAACA,SAAS,CAAA,aAAA,EAAe,CAAA;AAAA,GAC9C,EAAG,EAAE,CAAA;AAEL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,QAAU,EAAA;AACb,MAAA;AAAA;AAEF,IAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,IACG,QAAA,CAAA,EAAA,CAAG,MAAQ,EAAA,YAAY,CACvB,CAAA,EAAA,CAAG,UAAU,YAAY,CAAA,CACzB,EAAG,CAAA,QAAA,EAAU,YAAY,CAAA;AAE5B,IAAA,OAAO,MAAM;AACX,MACG,QAAA,CAAA,GAAA,CAAI,MAAQ,EAAA,YAAY,CACxB,CAAA,GAAA,CAAI,UAAU,YAAY,CAAA,CAC1B,GAAI,CAAA,QAAA,EAAU,YAAY,CAAA;AAAA,KAC/B;AAAA,GACC,EAAA,CAAC,QAAU,EAAA,YAAY,CAAC,CAAA;AAE3B,EAAO,OAAA;AAAA,IACL,eAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAmB,EAAA,qBAAA;AAAA,IACnB,iBAAmB,EAAA;AAAA,GACrB;AACF;;;;"}
1
+ {"version":3,"file":"usePrevNextButtons.js","sources":["../src/usePrevNextButtons.tsx"],"sourcesContent":["import type { EmblaCarouselType } from \"embla-carousel\";\nimport { useEffect, useState } from \"react\";\nimport { useCarouselContext } from \"./CarouselContext\";\n\ntype UsePrevNextButtonsType = {\n /**\n * Indicates whether the previous button is disabled.\n */\n prevBtnDisabled: boolean;\n /**\n * Indicates whether the next button is disabled.\n */\n nextBtnDisabled: boolean;\n /**\n * Handles the click event for the previous button.\n */\n onPrevButtonClick: () => void;\n /**\n * Handles the click event for the next button.\n */\n onNextButtonClick: () => void;\n};\n\nexport const usePrevNextButtons = (): UsePrevNextButtonsType => {\n const [prevBtnDisabled, setPrevBtnDisabled] = useState(true);\n const [nextBtnDisabled, setNextBtnDisabled] = useState(true);\n\n const { emblaApi } = useCarouselContext();\n\n const handlePrevButtonClick = () => {\n emblaApi?.scrollPrev();\n };\n\n const handleNextButtonClick = () => {\n emblaApi?.scrollNext();\n };\n\n useEffect(() => {\n const handleSelect = (emblaApi: EmblaCarouselType) => {\n setPrevBtnDisabled(!emblaApi.canScrollPrev());\n setNextBtnDisabled(!emblaApi.canScrollNext());\n };\n\n if (!emblaApi) {\n return;\n }\n handleSelect(emblaApi);\n emblaApi\n .on(\"init\", handleSelect)\n .on(\"reInit\", handleSelect)\n .on(\"select\", handleSelect);\n // Cleanup listener on component unmount\n return () => {\n emblaApi\n .off(\"init\", handleSelect)\n .off(\"reInit\", handleSelect)\n .off(\"select\", handleSelect);\n };\n }, [emblaApi]);\n\n return {\n prevBtnDisabled,\n nextBtnDisabled,\n onPrevButtonClick: handlePrevButtonClick,\n onNextButtonClick: handleNextButtonClick,\n };\n};\n"],"names":["emblaApi"],"mappings":";;;AAuBO,MAAM,qBAAqB,MAA8B;AAC9D,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3D,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,IAAI,CAAA;AAE3D,EAAM,MAAA,EAAE,QAAS,EAAA,GAAI,kBAAmB,EAAA;AAExC,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAU,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAA,UAAA,EAAA;AAAA,GACZ;AAEA,EAAA,MAAM,wBAAwB,MAAM;AAClC,IAAU,QAAA,IAAA,IAAA,GAAA,MAAA,GAAA,QAAA,CAAA,UAAA,EAAA;AAAA,GACZ;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAM,MAAA,YAAA,GAAe,CAACA,SAAgC,KAAA;AACpD,MAAmB,kBAAA,CAAA,CAACA,SAAS,CAAA,aAAA,EAAe,CAAA;AAC5C,MAAmB,kBAAA,CAAA,CAACA,SAAS,CAAA,aAAA,EAAe,CAAA;AAAA,KAC9C;AAEA,IAAA,IAAI,CAAC,QAAU,EAAA;AACb,MAAA;AAAA;AAEF,IAAA,YAAA,CAAa,QAAQ,CAAA;AACrB,IACG,QAAA,CAAA,EAAA,CAAG,MAAQ,EAAA,YAAY,CACvB,CAAA,EAAA,CAAG,UAAU,YAAY,CAAA,CACzB,EAAG,CAAA,QAAA,EAAU,YAAY,CAAA;AAE5B,IAAA,OAAO,MAAM;AACX,MACG,QAAA,CAAA,GAAA,CAAI,MAAQ,EAAA,YAAY,CACxB,CAAA,GAAA,CAAI,UAAU,YAAY,CAAA,CAC1B,GAAI,CAAA,QAAA,EAAU,YAAY,CAAA;AAAA,KAC/B;AAAA,GACF,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAO,OAAA;AAAA,IACL,eAAA;AAAA,IACA,eAAA;AAAA,IACA,iBAAmB,EAAA,qBAAA;AAAA,IACnB,iBAAmB,EAAA;AAAA,GACrB;AACF;;;;"}
@@ -20,7 +20,7 @@ export interface CarouselProps extends ComponentPropsWithoutRef<"section"> {
20
20
  * These options are passed directly to the Embla Carousel instance.
21
21
  */
22
22
  emblaPlugins?: CarouselPlugin;
23
- /** Get embla API as ref, use this to manage the state of the Carousel */
23
+ /** Get embla API instance, use this to manage the state of the Carousel */
24
24
  getEmblaApi?: (embla: CarouselEmblaApiType) => void;
25
25
  }
26
26
  export declare const Carousel: import("react").ForwardRefExoticComponent<CarouselProps & import("react").RefAttributes<HTMLElement>>;
@@ -1,4 +1,4 @@
1
- import type { CreateOptionsType, CreatePluginType } from "embla-carousel";
1
+ import type { CreateOptionsType, CreatePluginType, EmblaCarouselType } from "embla-carousel";
2
2
  declare module "embla-carousel" {
3
3
  interface EmblaPluginsType {
4
4
  announcement: CarouselAnnouncementType;
@@ -6,24 +6,14 @@ declare module "embla-carousel" {
6
6
  }
7
7
  /**
8
8
  * Type definition for the parameters of the getSlideLabel function.
9
+ * @returns A string that describes the slide, including its index and total count.
9
10
  */
10
- export type GetSlideLabelProps = (
11
- /**
12
- * The HTML element representing the slide.
13
- */
14
- slideElement: HTMLElement,
15
- /**
16
- * The index of the slide within the carousel.
17
- */
18
- slideIndex: number,
19
- /**
20
- * The total number of slides in the carousel.
21
- */
22
- slideCount: number) => string;
23
- /**
24
- * Generates a label for a carousel slide based on ARIA attributes.
25
- *
26
- * @param props - The properties required to generate the slide description.
11
+ export type GetSlideLabelProps = (emblaApi: EmblaCarouselType) => string;
12
+ /** * Generates a label for a carousel slide based on ARIA attributes.
13
+ * This function retrieves the slide's ARIA label or text content and formats it into a descriptive string.
14
+ * @param slideElement
15
+ * @param slideIndex
16
+ * @param slideCount
27
17
  * @returns A string description of the slide, including its position and ARIA label or text content.
28
18
  */
29
19
  export declare const getSlideLabel: GetSlideLabelProps;
@@ -12,5 +12,9 @@ export interface CarouselAutoplayIndicatorProps extends ComponentPropsWithoutRef
12
12
  * If `true`, the indicator is animated to visualize the time until the next slide.
13
13
  */
14
14
  isPlaying: boolean;
15
+ /**
16
+ * If `true`, the animation is paused.
17
+ */
18
+ isPaused?: boolean;
15
19
  }
16
20
  export declare const CarouselAutoplayIndicator: import("react").ForwardRefExoticComponent<CarouselAutoplayIndicatorProps & import("react").RefAttributes<HTMLDivElement>>;
@@ -1,4 +1,4 @@
1
- import { type SVGAttributes } from "react";
1
+ import { type Ref, type SVGAttributes } from "react";
2
2
  export interface CarouselAutoplayIndicatorSVGProps extends SVGAttributes<SVGSVGElement> {
3
3
  /**
4
4
  * Class name to apply to the SVG element.
@@ -7,7 +7,7 @@ export interface CarouselAutoplayIndicatorSVGProps extends SVGAttributes<SVGSVGE
7
7
  /**
8
8
  * Ref to attach to progress indicator element
9
9
  */
10
- barRef: React.Ref<SVGCircleElement>;
10
+ barRef: Ref<SVGCircleElement>;
11
11
  /**
12
12
  * Size of the SVG in pixels.
13
13
  */
@@ -2,6 +2,6 @@ import { type ButtonProps } from "@salt-ds/core";
2
2
  /**
3
3
  * Props for the CarouselNextButton component.
4
4
  */
5
- export interface CarouselNextButtonProps extends ButtonProps {
5
+ export interface CarouselNextButtonProps extends Omit<ButtonProps, "variant" | "loading" | "loadingAnnouncement"> {
6
6
  }
7
7
  export declare const CarouselNextButton: import("react").ForwardRefExoticComponent<CarouselNextButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
@@ -2,6 +2,6 @@ import { type ButtonProps } from "@salt-ds/core";
2
2
  /**
3
3
  * Props for the CarouselPreviousButton component.
4
4
  */
5
- export interface CarouselPreviousButtonProps extends ButtonProps {
5
+ export interface CarouselPreviousButtonProps extends Omit<ButtonProps, "variant" | "loading" | "loadingAnnouncement"> {
6
6
  }
7
7
  export declare const CarouselPreviousButton: import("react").ForwardRefExoticComponent<CarouselPreviousButtonProps & import("react").RefAttributes<HTMLButtonElement>>;
@@ -0,0 +1,4 @@
1
+ import type { EmblaCarouselType } from "embla-carousel";
2
+ export type SettleCallback = (emblaApi: EmblaCarouselType) => void;
3
+ export type CreateCustomSettle = (callback: SettleCallback) => SettleCallback;
4
+ export declare const createCustomSettle: CreateCustomSettle;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salt-ds/embla-carousel",
3
- "version": "0.0.0-snapshot-20250627090641",
3
+ "version": "0.1.0",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",
@@ -20,7 +20,7 @@
20
20
  "*.css"
21
21
  ],
22
22
  "dependencies": {
23
- "@salt-ds/core": "^0.0.0-snapshot-20250627090641",
23
+ "@salt-ds/core": "^1.47.1",
24
24
  "clsx": "^2.0.0"
25
25
  },
26
26
  "devDependencies": {