@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.
- package/dist/atoms/Button/Button.js +7 -6
- package/dist/atoms/Button/Button.js.map +1 -1
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/useSlideVisibility.d.ts +9 -0
- package/dist/hooks/useSlideVisibility.js +29 -0
- package/dist/hooks/useSlideVisibility.js.map +1 -0
- package/dist/hooks/useSlider.d.ts +64 -0
- package/dist/hooks/useSlider.js +103 -0
- package/dist/hooks/useSlider.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/molecules/Alert/Alert.js +2 -4
- package/dist/molecules/Alert/Alert.js.map +1 -1
- package/dist/molecules/Carousel/Carousel.d.ts +54 -0
- package/dist/molecules/Carousel/Carousel.js +184 -0
- package/dist/molecules/Carousel/Carousel.js.map +1 -0
- package/dist/molecules/Carousel/CarouselBullets.d.ts +39 -0
- package/dist/molecules/Carousel/CarouselBullets.js +12 -0
- package/dist/molecules/Carousel/CarouselBullets.js.map +1 -0
- package/dist/molecules/Carousel/CarouselItem.d.ts +11 -0
- package/dist/molecules/Carousel/CarouselItem.js +18 -0
- package/dist/molecules/Carousel/CarouselItem.js.map +1 -0
- package/dist/molecules/Carousel/index.d.ts +6 -0
- package/dist/molecules/Carousel/index.js +4 -0
- package/dist/molecules/Carousel/index.js.map +1 -0
- package/dist/molecules/IconButton/IconButton.js +2 -2
- package/dist/molecules/IconButton/IconButton.js.map +1 -1
- package/dist/molecules/InputField/InputField.js +1 -1
- package/dist/molecules/InputField/InputField.js.map +1 -1
- package/dist/molecules/LinkButton/LinkButton.js +4 -3
- package/dist/molecules/LinkButton/LinkButton.js.map +1 -1
- package/dist/molecules/QuantitySelector/QuantitySelector.js +2 -2
- package/dist/molecules/QuantitySelector/QuantitySelector.js.map +1 -1
- package/dist/molecules/RegionBar/RegionBar.js +2 -3
- package/dist/molecules/RegionBar/RegionBar.js.map +1 -1
- package/dist/molecules/SearchInputField/SearchInputField.js +1 -1
- package/dist/molecules/SearchInputField/SearchInputField.js.map +1 -1
- package/dist/organisms/ImageGallery/ImageGallerySelector.js +2 -2
- package/dist/organisms/ImageGallery/ImageGallerySelector.js.map +1 -1
- package/package.json +2 -2
- package/src/atoms/Button/Button.tsx +13 -11
- package/src/hooks/index.ts +10 -0
- package/src/hooks/useSlideVisibility.ts +59 -0
- package/src/hooks/useSlider.ts +209 -0
- package/src/index.ts +12 -0
- package/src/molecules/Alert/Alert.tsx +2 -6
- package/src/molecules/Carousel/Carousel.tsx +398 -0
- package/src/molecules/Carousel/CarouselBullets.tsx +95 -0
- package/src/molecules/Carousel/CarouselItem.tsx +53 -0
- package/src/molecules/Carousel/index.ts +8 -0
- package/src/molecules/IconButton/IconButton.tsx +2 -0
- package/src/molecules/InputField/InputField.tsx +1 -1
- package/src/molecules/LinkButton/LinkButton.tsx +5 -3
- package/src/molecules/QuantitySelector/QuantitySelector.tsx +2 -0
- package/src/molecules/RegionBar/RegionBar.tsx +1 -2
- package/src/molecules/SearchInputField/SearchInputField.tsx +1 -1
- 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 @@
|
|
|
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,
|
|
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, {
|
|
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,
|
|
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.
|
|
12
|
-
|
|
13
|
-
|
|
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;
|
|
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":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAElD,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAA;AA+BhD,MAAM,gBAAgB,GAAG,CAAC,EACxB,GAAG,EACH,GAAG,GAAG,CAAC,EACP,OAAO,EACP,QAAQ,GAAG,KAAK,EAChB,QAAQ,EACR,MAAM,GAAG,sBAAsB,EAC/B,GAAG,UAAU,EACS,EAAE,EAAE;IAC1B,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAS,OAAO,IAAI,GAAG,CAAC,CAAA;IAEhE,MAAM,cAAc,GAAG,QAAQ,KAAK,GAAG,CAAA;IACvC,MAAM,eAAe,GAAG,QAAQ,KAAK,GAAG,CAAA;IAExC,MAAM,cAAc,GAAG,CAAC,aAAqB,EAAE,EAAE;QAC/C,MAAM,aAAa,GAAG,sBAAsB,CAAC,QAAQ,GAAG,aAAa,CAAC,CAAA;QAEtE,QAAQ,EAAE,CAAC,aAAa,CAAC,CAAA;QACzB,WAAW,CAAC,aAAa,CAAC,CAAA;IAC5B,CAAC,CAAA;IAED,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAA;IAExC,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;IAEzC,SAAS,sBAAsB,CAAC,CAAS;QACvC,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;QAE3C,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAA;IACjD,CAAC;IAED,SAAS,aAAa,CAAC,CAAoC;QACzD,MAAM,GAAG,GAAG,CAAC,CAAC,aAAa,CAAC,KAAK,CAAA;QAEjC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE;YAC9B,WAAW,CAAC,GAAG,EAAE;gBACf,MAAM,aAAa,GAAG,sBAAsB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAA;gBAEzD,QAAQ,EAAE,CAAC,aAAa,CAAC,CAAA;gBAEzB,OAAO,aAAa,CAAA;YACtB,CAAC,CAAC,CAAA;SACH;IACH,CAAC;IAED,SAAS,CAAC,GAAG,EAAE;QACb,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAA;IAEb,OAAO,CACL,0DAC6B,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,iBAC5C,MAAM,KACf,UAAU;QAEd,oBAAC,UAAU,qCACqB,MAAM,EACpC,IAAI,EAAE,oBAAC,IAAI,IAAC,IAAI,EAAC,OAAO,EAAC,KAAK,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAC,MAAM,GAAG,gBACrD,oBAAoB,mBACjB,yBAAyB,EACvC,QAAQ,EAAE,cAAc,IAAI,QAAQ,EACpC,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,GAAG,MAAM,cAAc,
|
|
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;
|
|
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, {
|
|
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,
|
|
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" }),
|
|
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" }),
|
|
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":"AAAA,OAAO,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAE5D,OAAO,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAA;AACpD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAiChD,MAAM,mBAAmB,GAAG,GAAG,CAAA;AAE/B,MAAM,UAAU,GAAG,CAAC,SAAgC,EAAE,KAAa,EAAE,EAAE;IACrE,IAAI,SAAS,EAAE;QACb,IAAI,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,EAAE;YACnD,gIAAgI;YAChI,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,MAAM,CAAA;YACjC,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAChC,SAAS,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CACvD,CAAA;YACD,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;SAC9D;aAAM;YACL,SAAS,CAAC,UAAU,IAAI,KAAK,CAAA;SAC9B;KACF;AACH,CAAC,CAAA;AAED,MAAM,SAAS,GAAG,CAAC,SAAgC,EAAW,EAAE;IAC9D,IAAI,SAAS,EAAE;QACb,OAAO,CACL,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY;YAC/C,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC,WAAW,CAC9C,CAAA;KACF;IAED,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,SAAS,oBAAoB,CAAC,EAC5B,MAAM,EACN,QAAQ,EACR,cAAc,EACd,eAAe,EACf,MAAM,GAAG,2BAA2B,EACpC,YAAY,EAAE,SAAS,GAAG,gBAAgB,EAC1C,6BAA6B,GAAG,+BAA+B,EAC/D,8BAA8B,GAAG,8BAA8B,GACrC;IAC1B,MAAM,WAAW,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAA;IAChD,MAAM,gBAAgB,GAAG,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAA;IACvD,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC9D,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAE5D,MAAM,YAAY,GAAE,WAAW,CAAC,CAAC,GAAW,EAAE,MAAe,EAAE,EAAE;QAC/D,GAAG,KAAK,CAAC,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAA;QACxC,GAAG,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,kBAAkB,CAAC,MAAM,CAAC,CAAA;IACzD,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAA;IAEnB,OAAO,CACL,wFAEe,MAAM,gBACP,SAAS,0BACA,UAAU;QAE9B,gBAAgB,IAAI,CAAC,gBAAgB,IAAI,CACxC;YACE,oBAAC,UAAU,yEAEG,6BAA6B,EACzC,IAAI,EAAE,oBAAC,IAAI,IAAC,IAAI,EAAC,WAAW,GAAG,EAC/B,
|
|
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.
|
|
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": "
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
})
|
package/src/hooks/index.ts
CHANGED
|
@@ -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 {
|
|
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
|
-
<
|
|
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
|
)
|