@faststore/components 2.0.123-alpha.0 → 2.0.132-alpha.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 (60) hide show
  1. package/dist/atoms/Button/Button.js +7 -6
  2. package/dist/atoms/Button/Button.js.map +1 -1
  3. package/dist/hooks/index.d.ts +3 -0
  4. package/dist/hooks/index.js +2 -0
  5. package/dist/hooks/index.js.map +1 -1
  6. package/dist/hooks/useSlideVisibility.d.ts +9 -0
  7. package/dist/hooks/useSlideVisibility.js +29 -0
  8. package/dist/hooks/useSlideVisibility.js.map +1 -0
  9. package/dist/hooks/useSlider.d.ts +64 -0
  10. package/dist/hooks/useSlider.js +103 -0
  11. package/dist/hooks/useSlider.js.map +1 -0
  12. package/dist/index.d.ts +2 -0
  13. package/dist/index.js +1 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/molecules/Alert/Alert.js +2 -4
  16. package/dist/molecules/Alert/Alert.js.map +1 -1
  17. package/dist/molecules/Carousel/Carousel.d.ts +54 -0
  18. package/dist/molecules/Carousel/Carousel.js +184 -0
  19. package/dist/molecules/Carousel/Carousel.js.map +1 -0
  20. package/dist/molecules/Carousel/CarouselBullets.d.ts +39 -0
  21. package/dist/molecules/Carousel/CarouselBullets.js +12 -0
  22. package/dist/molecules/Carousel/CarouselBullets.js.map +1 -0
  23. package/dist/molecules/Carousel/CarouselItem.d.ts +11 -0
  24. package/dist/molecules/Carousel/CarouselItem.js +18 -0
  25. package/dist/molecules/Carousel/CarouselItem.js.map +1 -0
  26. package/dist/molecules/Carousel/index.d.ts +6 -0
  27. package/dist/molecules/Carousel/index.js +4 -0
  28. package/dist/molecules/Carousel/index.js.map +1 -0
  29. package/dist/molecules/IconButton/IconButton.js +2 -2
  30. package/dist/molecules/IconButton/IconButton.js.map +1 -1
  31. package/dist/molecules/InputField/InputField.js +1 -1
  32. package/dist/molecules/InputField/InputField.js.map +1 -1
  33. package/dist/molecules/LinkButton/LinkButton.js +4 -3
  34. package/dist/molecules/LinkButton/LinkButton.js.map +1 -1
  35. package/dist/molecules/QuantitySelector/QuantitySelector.js +2 -2
  36. package/dist/molecules/QuantitySelector/QuantitySelector.js.map +1 -1
  37. package/dist/molecules/RegionBar/RegionBar.js +2 -3
  38. package/dist/molecules/RegionBar/RegionBar.js.map +1 -1
  39. package/dist/molecules/SearchInputField/SearchInputField.js +1 -1
  40. package/dist/molecules/SearchInputField/SearchInputField.js.map +1 -1
  41. package/dist/organisms/ImageGallery/ImageGallerySelector.js +2 -2
  42. package/dist/organisms/ImageGallery/ImageGallerySelector.js.map +1 -1
  43. package/package.json +2 -2
  44. package/src/atoms/Button/Button.tsx +13 -11
  45. package/src/hooks/index.ts +10 -0
  46. package/src/hooks/useSlideVisibility.ts +59 -0
  47. package/src/hooks/useSlider.ts +209 -0
  48. package/src/index.ts +12 -0
  49. package/src/molecules/Alert/Alert.tsx +2 -6
  50. package/src/molecules/Carousel/Carousel.tsx +398 -0
  51. package/src/molecules/Carousel/CarouselBullets.tsx +95 -0
  52. package/src/molecules/Carousel/CarouselItem.tsx +53 -0
  53. package/src/molecules/Carousel/index.ts +8 -0
  54. package/src/molecules/IconButton/IconButton.tsx +2 -0
  55. package/src/molecules/InputField/InputField.tsx +1 -1
  56. package/src/molecules/LinkButton/LinkButton.tsx +5 -3
  57. package/src/molecules/QuantitySelector/QuantitySelector.tsx +2 -0
  58. package/src/molecules/RegionBar/RegionBar.tsx +1 -2
  59. package/src/molecules/SearchInputField/SearchInputField.tsx +1 -1
  60. package/src/organisms/ImageGallery/ImageGallerySelector.tsx +1 -3
@@ -0,0 +1,12 @@
1
+ import React, { forwardRef, useMemo } from 'react';
2
+ import { Button } from '../..';
3
+ const defaultAriaLabel = (id, idx, isActive) => isActive ? `Current page from ${id}` : `Go to page ${idx + 1} from ${id}`;
4
+ const CarouselBullets = forwardRef(function Bullets({ id, totalQuantity, activeBullet, onClick, testId = 'fs-carousel-bullets', ariaLabelGenerator = defaultAriaLabel, ariaControlsGenerator, ...otherProps }, ref) {
5
+ const bulletIndexes = useMemo(() => Array(totalQuantity).fill(0), [totalQuantity]);
6
+ return (React.createElement("div", { ref: ref, "data-fs-carousel-bullets": true, "data-testid": testId, role: "tablist", ...otherProps }, bulletIndexes.map((_, idx) => {
7
+ const isActive = activeBullet === idx;
8
+ return (React.createElement(Button, { key: `${id}-${idx}`, role: "tab", tabIndex: -1, "data-fs-carousel-bullet": true, testId: `${testId}-bullet`, onClick: (e) => onClick(e, idx), "aria-label": ariaLabelGenerator(id, idx, isActive), "aria-controls": ariaControlsGenerator?.(idx), "aria-selected": isActive }));
9
+ })));
10
+ });
11
+ export default CarouselBullets;
12
+ //# sourceMappingURL=CarouselBullets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CarouselBullets.js","sourceRoot":"","sources":["../../../src/molecules/Carousel/CarouselBullets.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,OAAO,CAAA;AAElD,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAuC9B,MAAM,gBAAgB,GAAG,CAAC,EAAU,EAAE,GAAW,EAAE,QAAiB,EAAE,EAAE,CACtE,QAAQ,CAAC,CAAC,CAAC,qBAAqB,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,GAAG,GAAG,CAAC,SAAS,EAAE,EAAE,CAAA;AAE3E,MAAM,eAAe,GAAG,UAAU,CAChC,SAAS,OAAO,CACd,EACE,EAAE,EACF,aAAa,EACb,YAAY,EACZ,OAAO,EACP,MAAM,GAAG,qBAAqB,EAC9B,kBAAkB,GAAG,gBAAgB,EACrC,qBAAqB,EACrB,GAAG,UAAU,EACd,EACD,GAAG;IAEH,MAAM,aAAa,GAAG,OAAO,CAC3B,GAAG,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAClC,CAAC,aAAa,CAAC,CAChB,CAAA;IAED,OAAO,CACL,6BACE,GAAG,EAAE,GAAG,mDAEK,MAAM,EACnB,IAAI,EAAC,SAAS,KACV,UAAU,IAEb,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAC5B,MAAM,QAAQ,GAAG,YAAY,KAAK,GAAG,CAAA;QAErC,OAAO,CACL,oBAAC,MAAM,IACL,GAAG,EAAE,GAAG,EAAE,IAAI,GAAG,EAAE,EACnB,IAAI,EAAC,KAAK,EACV,QAAQ,EAAE,CAAC,CAAC,mCAEZ,MAAM,EAAE,GAAG,MAAM,SAAS,EAC1B,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,GAAG,CAAC,gBACnB,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,QAAQ,CAAC,mBAClC,qBAAqB,EAAE,CAAC,GAAG,CAAC,mBAC5B,QAAQ,GACvB,CACH,CAAA;IACH,CAAC,CAAC,CACE,CACP,CAAA;AACH,CAAC,CACF,CAAA;AAED,eAAe,eAAe,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { HTMLAttributes, PropsWithChildren } from 'react';
2
+ import { SliderState } from '../../hooks';
3
+ export interface CarouselItemProps extends HTMLAttributes<HTMLLIElement> {
4
+ index: number;
5
+ totalItems: number;
6
+ state: SliderState;
7
+ infiniteMode: boolean;
8
+ isScrollCarousel: boolean;
9
+ }
10
+ declare function CarouselItem({ id, index, state, children, totalItems, infiniteMode, isScrollCarousel, }: PropsWithChildren<CarouselItemProps>): JSX.Element;
11
+ export default CarouselItem;
@@ -0,0 +1,18 @@
1
+ import React from 'react';
2
+ import { useSlideVisibility } from '../../hooks';
3
+ function CarouselItem({ id, index, state, children, totalItems, infiniteMode, isScrollCarousel, }) {
4
+ const { isItemVisible, shouldRenderItem } = useSlideVisibility({
5
+ totalItems,
6
+ currentSlide: state.currentItem,
7
+ itemsPerPage: state.itemsPerPage,
8
+ });
9
+ const style = (!isScrollCarousel && { width: '100%' }) ||
10
+ (isScrollCarousel && {
11
+ maxWidth: '60%',
12
+ display: 'inline-block',
13
+ });
14
+ const shouldDisplayItem = isScrollCarousel || shouldRenderItem(index - Number(infiniteMode));
15
+ return (React.createElement("li", { style: style, "data-fs-carousel-item": true, "aria-roledescription": "slide", id: `${id}-carousel-item-${index}`, "data-fs-carousel-item-visible": isItemVisible(index - Number(infiniteMode)) || undefined }, shouldDisplayItem ? children : null));
16
+ }
17
+ export default CarouselItem;
18
+ //# sourceMappingURL=CarouselItem.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CarouselItem.js","sourceRoot":"","sources":["../../../src/molecules/Carousel/CarouselItem.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAe,kBAAkB,EAAE,MAAM,aAAa,CAAA;AAU7D,SAAS,YAAY,CAAC,EACpB,EAAE,EACF,KAAK,EACL,KAAK,EACL,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,gBAAgB,GACqB;IACrC,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,GAAG,kBAAkB,CAAC;QAC7D,UAAU;QACV,YAAY,EAAE,KAAK,CAAC,WAAW;QAC/B,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC,CAAA;IAEF,MAAM,KAAK,GACR,CAAC,CAAC,gBAAgB,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAmB;QAC1D,CAAC,gBAAgB,IAAI;YACpB,QAAQ,EAAE,KAAK;YACf,OAAO,EAAE,cAAc;SACxB,CAAmB,CAAA;IAEtB,MAAM,iBAAiB,GACrB,gBAAgB,IAAI,gBAAgB,CAAC,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,CAAA;IAEpE,OAAO,CACL,4BACE,KAAK,EAAE,KAAK,yDAES,OAAO,EAC5B,EAAE,EAAE,GAAG,EAAE,kBAAkB,KAAK,EAAE,mCAEhC,aAAa,CAAC,KAAK,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,SAAS,IAGzD,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CACjC,CACN,CAAA;AACH,CAAC;AAED,eAAe,YAAY,CAAA"}
@@ -0,0 +1,6 @@
1
+ export { default } from './Carousel';
2
+ export type { CarouselProps } from './Carousel';
3
+ export { default as CarouselItem } from './CarouselItem';
4
+ export type { CarouselItemProps } from './CarouselItem';
5
+ export { default as CarouselBullets } from './CarouselBullets';
6
+ export type { CarouselBulletsProps } from './CarouselBullets';
@@ -0,0 +1,4 @@
1
+ export { default } from './Carousel';
2
+ export { default as CarouselItem } from './CarouselItem';
3
+ export { default as CarouselBullets } from './CarouselBullets';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/molecules/Carousel/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAGpC,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAGxD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,mBAAmB,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import React, { forwardRef } from 'react';
2
2
  import { Button } from '../../';
3
- const IconButton = forwardRef(function IconButton({ icon, children, testId = 'fs-icon-button', 'aria-label': ariaLabel, variant, ...otherProps }, ref) {
4
- return (React.createElement(Button, { ref: ref, "data-fs-button": true, "data-fs-icon-button": true, variant: variant ?? 'tertiary', icon: icon, "aria-label": ariaLabel, testId: testId, ...otherProps }, children));
3
+ const IconButton = forwardRef(function IconButton({ icon, children, testId = 'fs-icon-button', 'aria-label': ariaLabel, size = 'regular', variant, ...otherProps }, ref) {
4
+ return (React.createElement(Button, { ref: ref, "data-fs-button": true, "data-fs-icon-button": true, variant: variant ?? 'tertiary', icon: icon, "aria-label": ariaLabel, testId: testId, size: size, ...otherProps }, children));
5
5
  });
6
6
  export default IconButton;
7
7
  //# sourceMappingURL=IconButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"IconButton.js","sourceRoot":"","sources":["../../../src/molecules/IconButton/IconButton.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAkB/B,MAAM,UAAU,GAAG,UAAU,CAC3B,SAAS,UAAU,CACjB,EACE,IAAI,EACJ,QAAQ,EACR,MAAM,GAAG,gBAAgB,EACzB,YAAY,EAAE,SAAS,EACvB,OAAO,EACP,GAAG,UAAU,EACd,EACD,GAAG;IAEH,OAAO,CACL,oBAAC,MAAM,IACL,GAAG,EAAE,GAAG,uDAGR,OAAO,EAAE,OAAO,IAAI,UAAU,EAC9B,IAAI,EAAE,IAAI,gBACE,SAAS,EACrB,MAAM,EAAE,MAAM,KACV,UAAU,IAEb,QAAQ,CACF,CACV,CAAA;AACH,CAAC,CACF,CAAA;AAED,eAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"IconButton.js","sourceRoot":"","sources":["../../../src/molecules/IconButton/IconButton.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAkB/B,MAAM,UAAU,GAAG,UAAU,CAC3B,SAAS,UAAU,CACjB,EACE,IAAI,EACJ,QAAQ,EACR,MAAM,GAAG,gBAAgB,EACzB,YAAY,EAAE,SAAS,EACvB,IAAI,GAAG,SAAS,EAChB,OAAO,EACP,GAAG,UAAU,EACd,EACD,GAAG;IAEH,OAAO,CACL,oBAAC,MAAM,IACL,GAAG,EAAE,GAAG,uDAGR,OAAO,EAAE,OAAO,IAAI,UAAU,EAC9B,IAAI,EAAE,IAAI,gBACE,SAAS,EACrB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,IAAI,KACN,UAAU,IAEb,QAAQ,CACF,CACV,CAAA;AACH,CAAC,CACF,CAAA;AAED,eAAe,UAAU,CAAA"}
@@ -8,7 +8,7 @@ inputRef, disabled, value, testId = 'fs-input-field', ...otherProps }) => {
8
8
  React.createElement(Input, { id: id, type: type, value: value, ref: inputRef, disabled: disabled, placeholder: placeholder, ...otherProps }),
9
9
  React.createElement(Label, { htmlFor: id }, label),
10
10
  shouldDisplayButton &&
11
- (displayClearButton || error ? (React.createElement(IconButton, { "data-fs-button-size": "small", "aria-label": "Clear Field", icon: React.createElement(Icon, { name: "XCircle" }), onClick: () => {
11
+ (displayClearButton || error ? (React.createElement(IconButton, { size: "small", "aria-label": "Clear Field", icon: React.createElement(Icon, { name: "XCircle" }), onClick: () => {
12
12
  onClear?.();
13
13
  inputRef?.current?.focus();
14
14
  } })) : (React.createElement(Button, { variant: "tertiary", size: "small", onClick: onSubmit }, buttonActionText))),
@@ -1 +1 @@
1
- {"version":3,"file":"InputField.js","sourceRoot":"","sources":["../../../src/molecules/InputField/InputField.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAgE/D,MAAM,UAAU,GAAG,CAAC,EAClB,EAAE,EACF,KAAK,EACL,IAAI,GAAG,MAAM,EACb,KAAK,EACL,kBAAkB,EAClB,UAAU,EACV,gBAAgB,GAAG,OAAO,EAC1B,QAAQ,EACR,OAAO,EACP,WAAW,GAAG,GAAG,EAAE,iFAAiF;AACpG,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,MAAM,GAAG,gBAAgB,EACzB,GAAG,UAAU,EACG,EAAE,EAAE;IACpB,MAAM,kBAAkB,GAAG,CAAC,QAAQ,IAAI,KAAK,IAAI,KAAK,KAAK,EAAE,CAAA;IAC7D,MAAM,mBAAmB,GAAG,UAAU,IAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAA;IAEnE,OAAO,CACL,4FAEkC,UAAU,+BACf,KAAK,IAAI,KAAK,KAAK,EAAE,iBACnC,MAAM;QAEnB,oBAAC,KAAK,IACJ,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,KACpB,UAAU,GACd;QACF,oBAAC,KAAK,IAAC,OAAO,EAAE,EAAE,IAAG,KAAK,CAAS;QAElC,mBAAmB;YAClB,CAAC,kBAAkB,IAAI,KAAK,CAAC,CAAC,CAAC,CAC7B,oBAAC,UAAU,2BACW,OAAO,gBAChB,aAAa,EACxB,IAAI,EAAE,oBAAC,IAAI,IAAC,IAAI,EAAC,SAAS,GAAG,EAC7B,OAAO,EAAE,GAAG,EAAE;oBACZ,OAAO,EAAE,EAAE,CAAA;oBACX,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;gBAC5B,CAAC,GACD,CACH,CAAC,CAAC,CAAC,CACF,oBAAC,MAAM,IAAC,OAAO,EAAC,UAAU,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,QAAQ,IACtD,gBAAgB,CACV,CACV,CAAC;QACH,kBAAkB,IAAI,CACrB,2EAAyC,KAAK,CAAQ,CACvD,CACG,CACP,CAAA;AACH,CAAC,CAAA;AAED,eAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"InputField.js","sourceRoot":"","sources":["../../../src/molecules/InputField/InputField.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AAgE/D,MAAM,UAAU,GAAG,CAAC,EAClB,EAAE,EACF,KAAK,EACL,IAAI,GAAG,MAAM,EACb,KAAK,EACL,kBAAkB,EAClB,UAAU,EACV,gBAAgB,GAAG,OAAO,EAC1B,QAAQ,EACR,OAAO,EACP,WAAW,GAAG,GAAG,EAAE,iFAAiF;AACpG,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,MAAM,GAAG,gBAAgB,EACzB,GAAG,UAAU,EACG,EAAE,EAAE;IACpB,MAAM,kBAAkB,GAAG,CAAC,QAAQ,IAAI,KAAK,IAAI,KAAK,KAAK,EAAE,CAAA;IAC7D,MAAM,mBAAmB,GAAG,UAAU,IAAI,CAAC,QAAQ,IAAI,KAAK,KAAK,EAAE,CAAA;IAEnE,OAAO,CACL,4FAEkC,UAAU,+BACf,KAAK,IAAI,KAAK,KAAK,EAAE,iBACnC,MAAM;QAEnB,oBAAC,KAAK,IACJ,EAAE,EAAE,EAAE,EACN,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,GAAG,EAAE,QAAQ,EACb,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,KACpB,UAAU,GACd;QACF,oBAAC,KAAK,IAAC,OAAO,EAAE,EAAE,IAAG,KAAK,CAAS;QAElC,mBAAmB;YAClB,CAAC,kBAAkB,IAAI,KAAK,CAAC,CAAC,CAAC,CAC7B,oBAAC,UAAU,IACT,IAAI,EAAC,OAAO,gBACD,aAAa,EACxB,IAAI,EAAE,oBAAC,IAAI,IAAC,IAAI,EAAC,SAAS,GAAG,EAC7B,OAAO,EAAE,GAAG,EAAE;oBACZ,OAAO,EAAE,EAAE,CAAA;oBACX,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAA;gBAC5B,CAAC,GACD,CACH,CAAC,CAAC,CAAC,CACF,oBAAC,MAAM,IAAC,OAAO,EAAC,UAAU,EAAC,IAAI,EAAC,OAAO,EAAC,OAAO,EAAE,QAAQ,IACtD,gBAAgB,CACV,CACV,CAAC;QACH,kBAAkB,IAAI,CACrB,2EAAyC,KAAK,CAAQ,CACvD,CACG,CACP,CAAA;AACH,CAAC,CAAA;AAED,eAAe,UAAU,CAAA"}
@@ -8,9 +8,10 @@ function LinkButton({ icon, inverse, children, disabled, iconPosition, size = 'r
8
8
  }
9
9
  }
10
10
  return (React.createElement("a", { ref: linkRef, "data-fs-button": true, "data-fs-link-button": true, "data-fs-button-size": size, "data-fs-button-variant": variant, "data-fs-button-inverse": inverse, "data-fs-button-disabled": disabled, onFocus: onFocus, "data-testid": testId, ...otherProps },
11
- React.isValidElement(icon) && iconPosition === 'left' && icon,
12
- children,
13
- React.isValidElement(icon) && iconPosition === 'right' && icon));
11
+ React.createElement("div", { "data-fs-button-wrapper": true },
12
+ React.isValidElement(icon) && iconPosition === 'left' && React.createElement("span", { "data-fs-button-icon": true }, icon),
13
+ children && React.createElement("span", null, children),
14
+ React.isValidElement(icon) && iconPosition === 'right' && React.createElement("span", { "data-fs-button-icon": true }, icon))));
14
15
  }
15
16
  export default LinkButton;
16
17
  //# sourceMappingURL=LinkButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LinkButton.js","sourceRoot":"","sources":["../../../src/molecules/LinkButton/LinkButton.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAOrC,SAAS,UAAU,CAAC,EAClB,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,IAAI,GAAG,SAAS,EAChB,OAAO,GAAG,SAAS,EACnB,MAAM,GAAG,gBAAgB,EACzB,GAAG,UAAU,EACG;IAChB,MAAM,OAAO,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAA;IAEtD,SAAS,OAAO,CAAC,CAAa;QAC5B,CAAC,CAAC,cAAc,EAAE,CAAA;QAElB,IAAI,QAAQ,EAAE;YACZ,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAA;SACxB;IACH,CAAC;IAED,OAAO,CACL,2BACE,GAAG,EAAE,OAAO,8EAGS,IAAI,4BACD,OAAO,4BACP,OAAO,6BACN,QAAQ,EACjC,OAAO,EAAE,OAAO,iBACH,MAAM,KACf,UAAU;QAEb,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,YAAY,KAAK,MAAM,IAAI,IAAI;QAC7D,QAAQ;QACR,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,YAAY,KAAK,OAAO,IAAI,IAAI,CAC7D,CACL,CAAA;AACH,CAAC;AAED,eAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"LinkButton.js","sourceRoot":"","sources":["../../../src/molecules/LinkButton/LinkButton.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAOrC,SAAS,UAAU,CAAC,EAClB,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,IAAI,GAAG,SAAS,EAChB,OAAO,GAAG,SAAS,EACnB,MAAM,GAAG,gBAAgB,EACzB,GAAG,UAAU,EACG;IAChB,MAAM,OAAO,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAA;IAEtD,SAAS,OAAO,CAAC,CAAa;QAC5B,CAAC,CAAC,cAAc,EAAE,CAAA;QAElB,IAAI,QAAQ,EAAE;YACZ,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,CAAA;SACxB;IACH,CAAC;IAED,OAAO,CACL,2BACE,GAAG,EAAE,OAAO,8EAGS,IAAI,4BACD,OAAO,4BACP,OAAO,6BACN,QAAQ,EACjC,OAAO,EAAE,OAAO,iBACH,MAAM,KACf,UAAU;QAEd;YACG,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,YAAY,KAAK,MAAM,IAAI,6DAA2B,IAAI,CAAQ;YAChG,QAAQ,IAAI,kCAAO,QAAQ,CAAQ;YACnC,KAAK,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,YAAY,KAAK,OAAO,IAAI,6DAA2B,IAAI,CAAQ,CAC9F,CACJ,CACL,CAAA;AACH,CAAC;AAED,eAAe,UAAU,CAAA"}
@@ -29,9 +29,9 @@ const QuantitySelector = ({ max, min = 1, initial, disabled = false, onChange, t
29
29
  initial && setQuantity(initial);
30
30
  }, [initial]);
31
31
  return (React.createElement("div", { "data-fs-quantity-selector": disabled ? 'disabled' : 'true', "data-testid": testId, ...otherProps },
32
- React.createElement(IconButton, { "data-quantity-selector-button": "left", icon: React.createElement(Icon, { name: "Minus", width: 16, height: 16, weight: "bold" }), "aria-label": "Decrement Quantity", "aria-controls": "quantity-selector-input", disabled: isLeftDisabled || disabled, onClick: decrease, testId: `${testId}-left-button` }),
32
+ React.createElement(IconButton, { "data-quantity-selector-button": "left", icon: React.createElement(Icon, { name: "Minus", width: 16, height: 16, weight: "bold" }), "aria-label": "Decrement Quantity", "aria-controls": "quantity-selector-input", disabled: isLeftDisabled || disabled, onClick: decrease, testId: `${testId}-left-button`, size: "small" }),
33
33
  React.createElement(Input, { "data-quantity-selector-input": true, id: "quantity-selector-input", "aria-label": "Quantity", value: quantity, onChange: validateInput, disabled: disabled }),
34
- React.createElement(IconButton, { "data-quantity-selector-button": "right", "aria-controls": "quantity-selector-input", "aria-label": "Increment Quantity", disabled: isRightDisabled || disabled, icon: React.createElement(Icon, { name: "Plus", width: 16, height: 16, weight: "bold" }), onClick: increase, testId: `${testId}-right-button` })));
34
+ React.createElement(IconButton, { "data-quantity-selector-button": "right", "aria-controls": "quantity-selector-input", "aria-label": "Increment Quantity", disabled: isRightDisabled || disabled, icon: React.createElement(Icon, { name: "Plus", width: 16, height: 16, weight: "bold" }), onClick: increase, testId: `${testId}-right-button`, size: "small" })));
35
35
  };
36
36
  export default QuantitySelector;
37
37
  //# sourceMappingURL=QuantitySelector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"QuantitySelector.js","sourceRoot":"","sources":["../../../src/molecules/QuantitySelector/QuantitySelector.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"QuantitySelector.js","sourceRoot":"","sources":["../../../src/molecules/QuantitySelector/QuantitySelector.tsx"],"names":[],"mappings":"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"}
@@ -2,12 +2,11 @@ import React, { forwardRef } from 'react';
2
2
  import { Button, Icon } from '../../';
3
3
  const RegionBar = forwardRef(function RegionBar({ postalCode, onButtonClick, ...otherProps }, ref) {
4
4
  return (React.createElement("div", { ref: ref, "data-fs-region-bar": true, ...otherProps },
5
- React.createElement(Button, { onClick: onButtonClick },
5
+ React.createElement(Button, { onClick: onButtonClick, iconPosition: "right", icon: React.createElement(Icon, { name: "CaretRight" }) },
6
6
  React.createElement(Icon, { name: "MapPin" }),
7
7
  postalCode ? (React.createElement(React.Fragment, null,
8
8
  React.createElement("span", { "data-fs-region-bar-postal-code": true }, postalCode),
9
- React.createElement("span", { "data-fs-region-bar-cta": true }, "Edit"))) : (React.createElement("span", { "data-fs-region-bar-message": true }, "Set your location")),
10
- React.createElement(Icon, { name: "CaretRight" }))));
9
+ React.createElement("span", { "data-fs-region-bar-cta": true }, "Edit"))) : (React.createElement("span", { "data-fs-region-bar-message": true }, "Set your location")))));
11
10
  });
12
11
  export default RegionBar;
13
12
  //# sourceMappingURL=RegionBar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"RegionBar.js","sourceRoot":"","sources":["../../../src/molecules/RegionBar/RegionBar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAarC,MAAM,SAAS,GAAG,UAAU,CAAiC,SAAS,SAAS,CAC7E,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,UAAU,EAAE,EAC5C,GAAG;IAEH,OAAO,CACL,6BAAK,GAAG,EAAE,GAAG,iCAAyB,UAAU;QAC9C,oBAAC,MAAM,IAAC,OAAO,EAAE,aAAa;YAC5B,oBAAC,IAAI,IAAC,IAAI,EAAC,QAAQ,GAAG;YACrB,UAAU,CAAC,CAAC,CAAC,CACZ;gBACE,wEAAsC,UAAU,CAAQ;gBACxD,uEAAwC,CACvC,CACJ,CAAC,CAAC,CAAC,CACF,wFAAyD,CAC1D;YACD,oBAAC,IAAI,IAAC,IAAI,EAAC,YAAY,GAAG,CACnB,CACL,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,SAAS,CAAA"}
1
+ {"version":3,"file":"RegionBar.js","sourceRoot":"","sources":["../../../src/molecules/RegionBar/RegionBar.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAEzC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAarC,MAAM,SAAS,GAAG,UAAU,CAAiC,SAAS,SAAS,CAC7E,EAAE,UAAU,EAAE,aAAa,EAAE,GAAG,UAAU,EAAE,EAC5C,GAAG;IAEH,OAAO,CACL,6BAAK,GAAG,EAAE,GAAG,iCAAyB,UAAU;QAC9C,oBAAC,MAAM,IAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAC,OAAO,EAAC,IAAI,EAAE,oBAAC,IAAI,IAAC,IAAI,EAAC,YAAY,GAAG;YACnF,oBAAC,IAAI,IAAC,IAAI,EAAC,QAAQ,GAAG;YACrB,UAAU,CAAC,CAAC,CAAC,CACZ;gBACE,wEAAsC,UAAU,CAAQ;gBACxD,uEAAwC,CACvC,CACJ,CAAC,CAAC,CAAC,CACF,wFAAyD,CAC1D,CACM,CACL,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,SAAS,CAAA"}
@@ -15,7 +15,7 @@ const SearchInputField = forwardRef(function SearchInputField({ onSubmit, button
15
15
  }));
16
16
  return (React.createElement("form", { ref: formRef, "data-fs-search-input-field": true, "data-testid": testId, onSubmit: handleSubmit, role: "search" },
17
17
  React.createElement(Input, { ref: inputRef, "aria-label": ariaLabel, "data-fs-search-input-field-input": true, ...otherProps }),
18
- React.createElement(IconButton, { "data-fs-icon-button": "null", type: "submit", "aria-label": "Submit Search", icon: buttonIcon ?? React.createElement(Icon, { name: "MagnifyingGlass" }), ...buttonProps })));
18
+ React.createElement(IconButton, { type: "submit", "aria-label": "Submit Search", icon: buttonIcon ?? React.createElement(Icon, { name: "MagnifyingGlass" }), size: "small", ...buttonProps })));
19
19
  });
20
20
  export default SearchInputField;
21
21
  //# sourceMappingURL=SearchInputField.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SearchInputField.js","sourceRoot":"","sources":["../../../src/molecules/SearchInputField/SearchInputField.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEtE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAqC/C,MAAM,gBAAgB,GAAG,UAAU,CAGjC,SAAS,gBAAgB,CACzB,EACE,QAAQ,EACR,UAAU,EACV,YAAY,EAAE,SAAS,GAAG,QAAQ,EAClC,MAAM,GAAG,iBAAiB,EAC1B,WAAW,EACX,GAAG,UAAU,EACd,EACD,GAAG;IAEH,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAA;IAE7C,MAAM,YAAY,GAAG,CAAC,KAAgB,EAAE,EAAE;QACxC,KAAK,CAAC,cAAc,EAAE,CAAA;QAEtB,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,KAAK,EAAE,EAAE;YAClC,QAAQ,CAAC,QAAQ,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAA;SAClC;IACH,CAAC,CAAA;IAED,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9B,QAAQ,EAAE,QAAQ,CAAC,OAAO;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC,CAAA;IAEH,OAAO,CACL,8BACE,GAAG,EAAE,OAAO,qDAEC,MAAM,EACnB,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAC,QAAQ;QAEb,oBAAC,KAAK,IACJ,GAAG,EAAE,QAAQ,gBACD,SAAS,+CAEjB,UAAU,GACd;QACF,oBAAC,UAAU,2BACW,MAAM,EAC1B,IAAI,EAAC,QAAQ,gBACF,eAAe,EAC1B,IAAI,EAAE,UAAU,IAAI,oBAAC,IAAI,IAAC,IAAI,EAAC,iBAAiB,GAAG,KAC/C,WAAW,GACf,CACG,CACR,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,gBAAgB,CAAA"}
1
+ {"version":3,"file":"SearchInputField.js","sourceRoot":"","sources":["../../../src/molecules/SearchInputField/SearchInputField.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAEtE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAqC/C,MAAM,gBAAgB,GAAG,UAAU,CAGjC,SAAS,gBAAgB,CACzB,EACE,QAAQ,EACR,UAAU,EACV,YAAY,EAAE,SAAS,GAAG,QAAQ,EAClC,MAAM,GAAG,iBAAiB,EAC1B,WAAW,EACX,GAAG,UAAU,EACd,EACD,GAAG;IAEH,MAAM,QAAQ,GAAG,MAAM,CAAmB,IAAI,CAAC,CAAA;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAkB,IAAI,CAAC,CAAA;IAE7C,MAAM,YAAY,GAAG,CAAC,KAAgB,EAAE,EAAE;QACxC,KAAK,CAAC,cAAc,EAAE,CAAA;QAEtB,IAAI,QAAQ,CAAC,OAAO,EAAE,KAAK,KAAK,EAAE,EAAE;YAClC,QAAQ,CAAC,QAAQ,CAAC,OAAQ,CAAC,KAAK,CAAC,CAAA;SAClC;IACH,CAAC,CAAA;IAED,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC9B,QAAQ,EAAE,QAAQ,CAAC,OAAO;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAC,CAAA;IAEH,OAAO,CACL,8BACE,GAAG,EAAE,OAAO,qDAEC,MAAM,EACnB,QAAQ,EAAE,YAAY,EACtB,IAAI,EAAC,QAAQ;QAEb,oBAAC,KAAK,IACJ,GAAG,EAAE,QAAQ,gBACD,SAAS,+CAEjB,UAAU,GACd;QACF,oBAAC,UAAU,IACT,IAAI,EAAC,QAAQ,gBACF,eAAe,EAC1B,IAAI,EAAE,UAAU,IAAI,oBAAC,IAAI,IAAC,IAAI,EAAC,iBAAiB,GAAG,EACnD,IAAI,EAAC,OAAO,KACR,WAAW,GACf,CACG,CACR,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,gBAAgB,CAAA"}
@@ -33,14 +33,14 @@ function ImageGallerySelector({ images, onSelect, ImageComponent, currentImageId
33
33
  }, [images.length]);
34
34
  return (React.createElement("section", { "data-fs-image-gallery-selector": true, "data-testid": testId, "aria-label": ariaLabel, "aria-roledescription": "carousel" },
35
35
  elementHasScroll && !firstImageInView && (React.createElement("div", { "data-fs-image-gallery-selector-control": true },
36
- React.createElement(IconButton, { "data-fs-image-gallery-selector-control-button": true, "aria-label": navigationButtonLeftAriaLabel, icon: React.createElement(Icon, { name: "ArrowLeft" }), size: "small", onClick: () => moveScroll(elementsRef.current, -SCROLL_MARGIN_VALUE) }))),
36
+ React.createElement(IconButton, { "data-fs-image-gallery-selector-control-button": true, "aria-label": navigationButtonLeftAriaLabel, icon: React.createElement(Icon, { name: "ArrowLeft" }), onClick: () => moveScroll(elementsRef.current, -SCROLL_MARGIN_VALUE) }))),
37
37
  React.createElement("div", { "data-fs-image-gallery-selector-elements": true, ref: elementsRef }, images.map((image, idx) => {
38
38
  return (React.createElement(InView, { key: idx, onChange: (inView) => inViewChange(idx, inView) },
39
39
  React.createElement(Button, { key: idx, "aria-label": `${image.alternateName} - Image ${idx + 1} of ${images.length}`, onClick: () => onSelect(idx), "data-fs-image-gallery-selector-thumbnail": idx === currentImageIdx ? 'selected' : 'true' },
40
40
  React.createElement(ImageComponent, { url: image.url ?? '', loading: idx === 0 ? 'eager' : 'lazy', alternateName: image.alternateName ?? '' }))));
41
41
  })),
42
42
  elementHasScroll && !lastImageInView && (React.createElement("div", { "data-fs-image-gallery-selector-control": true },
43
- React.createElement(IconButton, { "data-fs-image-gallery-selector-control-button": true, "aria-label": navigationButtonRightAriaLabel, icon: React.createElement(Icon, { name: "ArrowLeft" }), size: "small", onClick: () => moveScroll(elementsRef.current, +SCROLL_MARGIN_VALUE) })))));
43
+ React.createElement(IconButton, { "data-fs-image-gallery-selector-control-button": true, "aria-label": navigationButtonRightAriaLabel, icon: React.createElement(Icon, { name: "ArrowLeft" }), onClick: () => moveScroll(elementsRef.current, +SCROLL_MARGIN_VALUE) })))));
44
44
  }
45
45
  export default ImageGallerySelector;
46
46
  //# sourceMappingURL=ImageGallerySelector.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ImageGallerySelector.js","sourceRoot":"","sources":["../../../src/organisms/ImageGallery/ImageGallerySelector.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ImageGallerySelector.js","sourceRoot":"","sources":["../../../src/organisms/ImageGallery/ImageGallerySelector.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/components",
3
- "version": "2.0.123-alpha.0",
3
+ "version": "2.0.132-alpha.0",
4
4
  "module": "dist/index.js",
5
5
  "typings": "dist/index.d.ts",
6
6
  "author": "Emerson Laurentino @emersonlaurentino",
@@ -30,5 +30,5 @@
30
30
  "node": "16.18.0",
31
31
  "yarn": "1.19.1"
32
32
  },
33
- "gitHead": "1fa54ca9614dde12ba99a2870273e1797986ee16"
33
+ "gitHead": "e6d7561f0783b20ba4966d9e7c971146300ff129"
34
34
  }
@@ -73,17 +73,19 @@ const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(
73
73
  data-testid={testId}
74
74
  {...otherProps}
75
75
  >
76
- {loading && (
77
- <p data-fs-button-loading-label>
78
- {loadingLabel}
79
- <Loader
80
- variant={variant === 'primary' && !inverse ? 'light' : 'dark'}
81
- />
82
- </p>
83
- )}
84
- {React.isValidElement(icon) && iconPosition === 'left' && <span data-fs-button-icon>{icon}</span>}
85
- {children && <span>{children}</span>}
86
- {React.isValidElement(icon) && iconPosition === 'right' && <span data-fs-button-icon>{icon}</span>}
76
+ <div data-fs-button-wrapper>
77
+ {loading && (
78
+ <p data-fs-button-loading-label>
79
+ {loadingLabel}
80
+ <Loader
81
+ variant={variant === 'primary' && !inverse ? 'light' : 'dark'}
82
+ />
83
+ </p>
84
+ )}
85
+ {React.isValidElement(icon) && iconPosition === 'left' && <span data-fs-button-icon>{icon}</span>}
86
+ {children && <span>{children}</span>}
87
+ {React.isValidElement(icon) && iconPosition === 'right' && <span data-fs-button-icon>{icon}</span>}
88
+ </div>
87
89
  </button>
88
90
  )
89
91
  })
@@ -3,3 +3,13 @@ export { useFadeEffect } from './useFadeEffect'
3
3
  export { useTrapFocus } from './useTrapFocus'
4
4
  export { useSearch } from './useSearch'
5
5
  export { useScrollDirection } from './useScrollDirection'
6
+ export { useSlider } from './useSlider'
7
+ export type {
8
+ UseSliderArgs,
9
+ SliderState,
10
+ SliderDispatch,
11
+ SlideDirection,
12
+ } from './useSlider'
13
+ export { useSlideVisibility } from './useSlideVisibility'
14
+
15
+
@@ -0,0 +1,59 @@
1
+ import { useRef, useEffect } from 'react'
2
+
3
+ export interface UseSlideVisibilityArgs {
4
+ currentSlide: number
5
+ itemsPerPage: number
6
+ totalItems: number
7
+ }
8
+
9
+ interface IsSlideVisibleArgs {
10
+ itemsPerPage: number
11
+ currentSlide: number
12
+ slideIdx: number
13
+ totalItems: number
14
+ }
15
+
16
+ function isSlideVisible({
17
+ itemsPerPage,
18
+ currentSlide,
19
+ slideIdx,
20
+ totalItems,
21
+ }: IsSlideVisibleArgs) {
22
+ const isClonedSlide = currentSlide < 0 || currentSlide >= totalItems
23
+ const isVisible =
24
+ slideIdx >= currentSlide && slideIdx < currentSlide + itemsPerPage
25
+
26
+ return isClonedSlide || isVisible
27
+ }
28
+
29
+ export const useSlideVisibility = ({
30
+ currentSlide,
31
+ itemsPerPage,
32
+ totalItems,
33
+ }: UseSlideVisibilityArgs) => {
34
+ /** Keeps track of slides that have been visualized before.
35
+ * We want to keep rendering them because the issue is mostly rendering
36
+ * slides that might never be viewed; On the other hand, hiding slides
37
+ * that were visible causes visual glitches */
38
+ const visitedSlides = useRef<Set<number>>(new Set())
39
+
40
+ useEffect(() => {
41
+ for (let i = 0; i < itemsPerPage; i++) {
42
+ visitedSlides.current.add(currentSlide + i)
43
+ }
44
+ }, [currentSlide, itemsPerPage])
45
+
46
+ const isItemVisible = (index: number) =>
47
+ isSlideVisible({
48
+ slideIdx: index,
49
+ currentSlide,
50
+ itemsPerPage,
51
+ totalItems,
52
+ })
53
+
54
+ const shouldRenderItem = (index: number) => {
55
+ return visitedSlides.current.has(index) || isItemVisible(index)
56
+ }
57
+
58
+ return { shouldRenderItem, isItemVisible }
59
+ }
@@ -0,0 +1,209 @@
1
+ import type { Dispatch } from 'react'
2
+ import { useReducer } from 'react'
3
+ import type { SwipeableProps } from 'react-swipeable'
4
+ import { useSwipeable } from 'react-swipeable'
5
+
6
+ export type SlideDirection = 'next' | 'previous'
7
+
8
+ interface NextPageAction {
9
+ type: 'NEXT_PAGE'
10
+ }
11
+
12
+ interface PreviousPageAction {
13
+ type: 'PREVIOUS_PAGE'
14
+ }
15
+
16
+ interface GoToPageAction {
17
+ type: 'GO_TO_PAGE'
18
+ payload: {
19
+ pageIndex: number
20
+ shouldSlide: boolean
21
+ }
22
+ }
23
+
24
+ interface StopSlideAction {
25
+ type: 'STOP_SLIDE'
26
+ }
27
+
28
+ export type Action =
29
+ | NextPageAction
30
+ | PreviousPageAction
31
+ | StopSlideAction
32
+ | GoToPageAction
33
+
34
+ export type SliderDispatch = Dispatch<Action>
35
+
36
+ export interface SliderState {
37
+ /**
38
+ * The `currentItem` in a Slider with multiple items in a single page is
39
+ * always **the one with the lowest index** in the current page.
40
+ */
41
+ currentItem: number
42
+ /** Currently active page */
43
+ currentPage: number
44
+ /**
45
+ * Whether or not the Slider is currently sliding. This is useful to
46
+ * manipulate the `transition` property in a component.
47
+ */
48
+ sliding: boolean
49
+ /** The direction in which the Slider is sliding. */
50
+ slideDirection: SlideDirection
51
+ /** The total number of unique items in the slider. */
52
+ totalItems: number
53
+ /** The number of items in a single page. */
54
+ itemsPerPage: number
55
+ /** The total number of pages in the slider. */
56
+ totalPages: number
57
+ /** Whether or not the slider is infinite. */
58
+ infinite: boolean
59
+ }
60
+
61
+ export const nextPage = (current: number, total: number) =>
62
+ (current + 1) % total
63
+
64
+ export const previousPage = (current: number, total: number) =>
65
+ (total - ((total - current + 1) % total)) % total
66
+
67
+ function reducer(state: SliderState, action: Action): SliderState {
68
+ switch (action.type) {
69
+ case 'NEXT_PAGE': {
70
+ // If `state.infinite` is true, we need to take into account an extra
71
+ // page in the calculation. This extra page is a clone of the first page.
72
+ const adjustedTotalPages = state.infinite
73
+ ? state.totalPages + 1
74
+ : state.totalPages
75
+
76
+ const nextPageIndex = nextPage(state.currentPage, adjustedTotalPages)
77
+
78
+ const nextItemIndex =
79
+ (nextPageIndex % adjustedTotalPages) * state.itemsPerPage
80
+
81
+ return {
82
+ ...state,
83
+ sliding: true,
84
+ slideDirection: 'next',
85
+ currentItem: nextItemIndex,
86
+ currentPage: nextPageIndex,
87
+ }
88
+ }
89
+
90
+ case 'PREVIOUS_PAGE': {
91
+ // If `state.infinite` is true, we need to take into account an extra
92
+ // page in the calculation. This extra page is a clone of the first page.
93
+ const adjustedTotalPages = state.infinite
94
+ ? state.totalPages + 1
95
+ : state.totalPages
96
+
97
+ // If `state.infinite` is true and we're currently on page 0, we need to
98
+ // let the slider go to page -1. This -1 page is a clone of the last page.
99
+ const shouldGoToClone = state.infinite && state.currentPage === 0
100
+ const previousPageIndex = shouldGoToClone
101
+ ? -1
102
+ : previousPage(state.currentPage, state.totalPages)
103
+
104
+ return {
105
+ ...state,
106
+ sliding: true,
107
+ slideDirection: 'previous',
108
+ currentItem:
109
+ (previousPageIndex % adjustedTotalPages) * state.itemsPerPage,
110
+ currentPage: previousPageIndex,
111
+ }
112
+ }
113
+
114
+ case 'GO_TO_PAGE': {
115
+ if (action.payload.pageIndex === state.currentPage) {
116
+ return state
117
+ }
118
+
119
+ return {
120
+ ...state,
121
+ sliding: action.payload.shouldSlide,
122
+ slideDirection:
123
+ action.payload.pageIndex > state.currentPage ? 'next' : 'previous',
124
+ currentItem:
125
+ (action.payload.pageIndex % state.totalPages) * state.itemsPerPage,
126
+ currentPage: action.payload.pageIndex,
127
+ }
128
+ }
129
+
130
+ case 'STOP_SLIDE':
131
+ return { ...state, sliding: false }
132
+
133
+ default:
134
+ return state
135
+ }
136
+ }
137
+
138
+ const defaultSliderState = (
139
+ totalItems: number,
140
+ itemsPerPage: number,
141
+ infinite: boolean
142
+ ): SliderState => ({
143
+ currentItem: 0,
144
+ currentPage: 0,
145
+ sliding: false,
146
+ slideDirection: 'next',
147
+ totalItems,
148
+ itemsPerPage,
149
+ totalPages: Math.ceil(totalItems / itemsPerPage),
150
+ infinite,
151
+ })
152
+
153
+ const slide = (page: SlideDirection | number, dispatch: Dispatch<Action>) => {
154
+ if (page === 'next') {
155
+ dispatch({ type: 'NEXT_PAGE' })
156
+ }
157
+
158
+ if (page === 'previous') {
159
+ dispatch({ type: 'PREVIOUS_PAGE' })
160
+ }
161
+
162
+ if (typeof page === 'number') {
163
+ dispatch({
164
+ type: 'GO_TO_PAGE',
165
+ payload: {
166
+ pageIndex: page,
167
+ shouldSlide: true,
168
+ },
169
+ })
170
+ }
171
+ }
172
+
173
+ export interface UseSliderArgs extends SwipeableProps {
174
+ /** The total number of unique items in the slider. */
175
+ totalItems: number
176
+ /** The number of items in a single slider page. */
177
+ itemsPerPage?: number
178
+ /** Whether or not the slider is infinite. */
179
+ infiniteMode?: boolean
180
+ /** Whether or not slide after swiping left/right. */
181
+ shouldSlideOnSwipe?: boolean
182
+ }
183
+
184
+ export const useSlider = ({
185
+ totalItems,
186
+ itemsPerPage = 1,
187
+ infiniteMode = false,
188
+ shouldSlideOnSwipe = true,
189
+ ...swipeableConfigOverrides
190
+ }: UseSliderArgs) => {
191
+ const [sliderState, sliderDispatch] = useReducer(reducer, undefined, () =>
192
+ defaultSliderState(totalItems, itemsPerPage, infiniteMode)
193
+ )
194
+
195
+ const handlers = useSwipeable({
196
+ onSwipedRight: () =>
197
+ shouldSlideOnSwipe && slide('previous', sliderDispatch),
198
+ onSwipedLeft: () => shouldSlideOnSwipe && slide('next', sliderDispatch),
199
+ trackMouse: true,
200
+ ...swipeableConfigOverrides,
201
+ })
202
+
203
+ return {
204
+ handlers,
205
+ slide,
206
+ sliderState,
207
+ sliderDispatch,
208
+ }
209
+ }
package/src/index.ts CHANGED
@@ -55,6 +55,18 @@ export type {
55
55
  BreadcrumbProps,
56
56
  } from './molecules/Breadcrumb'
57
57
  export { default as BuyButton } from './molecules/BuyButton'
58
+
59
+ export {
60
+ default as Carousel,
61
+ CarouselItem,
62
+ CarouselBullets,
63
+ } from './molecules/Carousel'
64
+ export type {
65
+ CarouselProps,
66
+ CarouselItemProps,
67
+ CarouselBulletsProps,
68
+ } from './molecules/Carousel'
69
+
58
70
  export {
59
71
  default as CartItem,
60
72
  CartItemImage,
@@ -1,7 +1,7 @@
1
1
  import type { HTMLAttributes } from 'react'
2
2
  import React, { forwardRef, useCallback } from 'react'
3
3
 
4
- import { Button, Icon, Link, LinkProps } from '../../'
4
+ import { IconButton, Icon, Link, LinkProps } from '../../'
5
5
 
6
6
  import type { MouseEvent, ReactNode } from 'react'
7
7
 
@@ -68,11 +68,7 @@ const Alert = forwardRef<HTMLDivElement, AlertProps>(function Alert(
68
68
  {link && <Link data-fs-alert-link variant="inline" {...link} />}
69
69
 
70
70
  {dismissible && (
71
- <Button data-fs-alert-button aria-label="Close" onClick={handleClose}>
72
- <span>
73
- <Icon name="X" />
74
- </span>
75
- </Button>
71
+ <IconButton data-fs-alert-button size="small" aria-label="Close" icon={<Icon name="X" />} onClick={handleClose} />
76
72
  )}
77
73
  </div>
78
74
  )