@faststore/components 2.0.52-alpha.0 → 2.0.53-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.
@@ -21,13 +21,21 @@ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
21
21
  */
22
22
  inverse?: boolean;
23
23
  /**
24
- * Specifies that this button should be disabled
24
+ * Specifies that this button should be disabled.
25
25
  */
26
26
  disabled?: boolean;
27
27
  /**
28
28
  * A React component that will be rendered as an icon.
29
29
  */
30
30
  icon?: ReactNode;
31
+ /**
32
+ * Boolean that represents a loading state.
33
+ */
34
+ loading?: boolean;
35
+ /**
36
+ * Specifies a label for loading state.
37
+ */
38
+ loadingLabel?: string;
31
39
  /**
32
40
  * Specifies where the icon should be positioned
33
41
  */
@@ -1,9 +1,12 @@
1
1
  import React, { forwardRef } from 'react';
2
- import { Icon } from '../../index';
3
- const Button = forwardRef(function Button({ children, variant, inverse, size = 'regular', testId = 'fs-button', icon, iconPosition = 'left', disabled, ...otherProps }, ref) {
4
- return (React.createElement("button", { ref: ref, "data-fs-button": true, "data-fs-button-inverse": inverse, "data-fs-button-size": size, "data-fs-button-variant": variant, disabled: disabled, "data-testid": testId, ...otherProps },
2
+ import { Icon, Loader } from '../../index';
3
+ const Button = forwardRef(function Button({ children, variant, inverse, size = 'regular', testId = 'fs-button', loading, loadingLabel, icon, iconPosition = 'left', disabled, ...otherProps }, ref) {
4
+ return (React.createElement("button", { ref: ref, "data-fs-button": true, "data-fs-button-inverse": inverse, "data-fs-button-size": size, "data-fs-button-loading": loading, "data-fs-button-variant": variant, disabled: disabled, "data-testid": testId, ...otherProps },
5
+ loading && (React.createElement("p", { "data-fs-button-loading-label": true },
6
+ loadingLabel,
7
+ React.createElement(Loader, { variant: variant === 'primary' && !inverse ? 'light' : 'dark' }))),
5
8
  icon && iconPosition === 'left' && React.createElement(Icon, { component: icon }),
6
- children,
9
+ React.createElement("span", null, children),
7
10
  icon && iconPosition === 'right' && React.createElement(Icon, { component: icon })));
8
11
  });
9
12
  export default Button;
@@ -1 +1 @@
1
- {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../src/atoms/Button/Button.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAqClC,MAAM,MAAM,GAAG,UAAU,CAAiC,SAAS,MAAM,CACvE,EACE,QAAQ,EACR,OAAO,EACP,OAAO,EACP,IAAI,GAAG,SAAS,EAChB,MAAM,GAAG,WAAW,EACpB,IAAI,EACJ,YAAY,GAAG,MAAM,EACrB,QAAQ,EACR,GAAG,UAAU,EACd,EACD,GAAG;IAEH,OAAO,CACL,gCACE,GAAG,EAAE,GAAG,oDAEgB,OAAO,yBACV,IAAI,4BACD,OAAO,EAC/B,QAAQ,EAAE,QAAQ,iBACL,MAAM,KACf,UAAU;QAEb,IAAI,IAAI,YAAY,KAAK,MAAM,IAAI,oBAAC,IAAI,IAAC,SAAS,EAAE,IAAI,GAAI;QAC5D,QAAQ;QACR,IAAI,IAAI,YAAY,KAAK,OAAO,IAAI,oBAAC,IAAI,IAAC,SAAS,EAAE,IAAI,GAAI,CACvD,CACV,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,MAAM,CAAA"}
1
+ {"version":3,"file":"Button.js","sourceRoot":"","sources":["../../../src/atoms/Button/Button.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AA6C1C,MAAM,MAAM,GAAG,UAAU,CAAiC,SAAS,MAAM,CACvE,EACE,QAAQ,EACR,OAAO,EACP,OAAO,EACP,IAAI,GAAG,SAAS,EAChB,MAAM,GAAG,WAAW,EACpB,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,YAAY,GAAG,MAAM,EACrB,QAAQ,EACR,GAAG,UAAU,EACd,EACD,GAAG;IAGH,OAAO,CACL,gCACE,GAAG,EAAE,GAAG,oDAEgB,OAAO,yBACV,IAAI,4BACD,OAAO,4BACP,OAAO,EAC/B,QAAQ,EAAE,QAAQ,iBACL,MAAM,KACf,UAAU;QAEb,OAAO,IAAI,CACV;YACG,YAAY;YACb,oBAAC,MAAM,IAAC,OAAO,EAAE,OAAO,KAAK,SAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GAAI,CACvE,CACL;QACA,IAAI,IAAI,YAAY,KAAK,MAAM,IAAI,oBAAC,IAAI,IAAC,SAAS,EAAE,IAAI,GAAI;QAC7D,kCAAO,QAAQ,CAAQ;QACtB,IAAI,IAAI,YAAY,KAAK,OAAO,IAAI,oBAAC,IAAI,IAAC,SAAS,EAAE,IAAI,GAAI,CACvD,CACV,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,MAAM,CAAA"}
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ export type LoaderProps = {
3
+ /**
4
+ * Specifies the component color variant.
5
+ */
6
+ variant?: 'light' | 'dark';
7
+ /**
8
+ * ID to find this component in testing tools (e.g.: cypress, testing library, and jest).
9
+ */
10
+ testId?: string;
11
+ };
12
+ declare const Loader: React.ForwardRefExoticComponent<LoaderProps & React.RefAttributes<HTMLDivElement>>;
13
+ export default Loader;
@@ -0,0 +1,9 @@
1
+ import React, { forwardRef } from 'react';
2
+ const Loader = forwardRef(function Loader({ variant = 'dark', testId = 'fs-loader', ...otherProps }, ref) {
3
+ return (React.createElement("div", { ref: ref, "data-fs-loader": true, "data-fs-loader-variant": variant, "data-testid": testId, ...otherProps },
4
+ React.createElement("span", { "data-fs-loader-item": true }),
5
+ React.createElement("span", { "data-fs-loader-item": true }),
6
+ React.createElement("span", { "data-fs-loader-item": true })));
7
+ });
8
+ export default Loader;
9
+ //# sourceMappingURL=Loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Loader.js","sourceRoot":"","sources":["../../../src/atoms/Loader/Loader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,OAAO,CAAA;AAazC,MAAM,MAAM,GAAG,UAAU,CAA8B,SAAS,MAAM,CACpE,EAAE,OAAO,GAAG,MAAM,EAAE,MAAM,GAAG,WAAW,EAAE,GAAG,UAAU,EAAe,EACtE,GAAG;IAEH,OAAO,CACL,6BACE,GAAG,EAAE,GAAG,oDAEgB,OAAO,iBAClB,MAAM,KACf,UAAU;QAEd,4DAAiC;QACjC,4DAAiC;QACjC,4DAAiC,CAC7B,CACP,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,eAAe,MAAM,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { default } from './Loader';
2
+ export type { LoaderProps } from './Loader';
@@ -0,0 +1,2 @@
1
+ export { default } from './Loader';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/atoms/Loader/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA"}
package/dist/index.d.ts CHANGED
@@ -13,6 +13,8 @@ export { default as Label } from './atoms/Label';
13
13
  export type { LabelProps } from './atoms/Label';
14
14
  export { default as Link } from './atoms/Link';
15
15
  export type { LinkProps, LinkElementType } from './atoms/Link';
16
+ export { default as Loader } from './atoms/Loader';
17
+ export type { LoaderProps } from './atoms/Loader';
16
18
  export { default as List } from './atoms/List';
17
19
  export type { ListProps } from './atoms/List';
18
20
  export { default as Overlay } from './atoms/Overlay';
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ export { default as Icon } from './atoms/Icon';
8
8
  export { default as Input } from './atoms/Input';
9
9
  export { default as Label } from './atoms/Label';
10
10
  export { default as Link } from './atoms/Link';
11
+ export { default as Loader } from './atoms/Loader';
11
12
  export { default as List } from './atoms/List';
12
13
  export { default as Overlay } from './atoms/Overlay';
13
14
  export { default as Price } from './atoms/Price';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,cAAc,UAAU,CAAA;AAExB,QAAQ;AACR,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,cAAc,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,cAAc,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,cAAc,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEpD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAElD,YAAY;AACZ,OAAO,EACL,OAAO,IAAI,SAAS,EACpB,aAAa,EACb,eAAe,EACf,cAAc,GACf,MAAM,uBAAuB,CAAA;AAO9B,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEpD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEpE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAE9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEpE,OAAO,EACL,OAAO,IAAI,QAAQ,EACnB,cAAc,EACd,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAA;AAO7B,OAAO,EACL,OAAO,IAAI,IAAI,EACf,WAAW,EACX,SAAS,GACV,MAAM,kBAAkB,CAAA;AAMzB,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAE9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAE9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAE9D,OAAO,EACL,OAAO,IAAI,UAAU,EACrB,WAAW,GACZ,MAAM,wBAAwB,CAAA;AAK/B,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAEhE,OAAO,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,WAAW,EACX,SAAS,EACT,QAAQ,GACT,MAAM,mBAAmB,CAAA;AAS1B,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAEhE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAG1E,YAAY;AACZ,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,SAAS;AACT,cAAc,UAAU,CAAA;AAExB,QAAQ;AACR,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEtD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,cAAc,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,cAAc,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,cAAc,CAAA;AAE9C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAEpD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,eAAe,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAElD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAElD,YAAY;AACZ,OAAO,EACL,OAAO,IAAI,SAAS,EACpB,aAAa,EACb,eAAe,EACf,cAAc,GACf,MAAM,uBAAuB,CAAA;AAO9B,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAEpD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,uBAAuB,CAAA;AAC5D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEpE,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAE9D,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2BAA2B,CAAA;AAEpE,OAAO,EACL,OAAO,IAAI,QAAQ,EACnB,cAAc,EACd,YAAY,EACZ,YAAY,GACb,MAAM,sBAAsB,CAAA;AAO7B,OAAO,EACL,OAAO,IAAI,IAAI,EACf,WAAW,EACX,SAAS,GACV,MAAM,kBAAkB,CAAA;AAMzB,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAE9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAE9D,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAE9D,OAAO,EACL,OAAO,IAAI,UAAU,EACrB,WAAW,GACZ,MAAM,wBAAwB,CAAA;AAK/B,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAEhE,OAAO,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,WAAW,EACX,SAAS,EACT,QAAQ,GACT,MAAM,mBAAmB,CAAA;AAS1B,OAAO,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,iBAAiB,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAEtD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAEhE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AAG1E,YAAY;AACZ,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAA"}
@@ -1,10 +1,8 @@
1
1
  import React from 'react';
2
- import { Button, Icon } from '../../index';
2
+ import { Button } from '../../index';
3
3
  import { ShoppingCart } from '../../assets';
4
4
  function BuyButton({ testId = 'fs-buy-button', icon, children, ...otherProps }) {
5
- return (React.createElement(Button, { "data-fs-buy-button": true, "data-testid": testId, ...otherProps },
6
- React.createElement(Icon, { component: React.createElement(ShoppingCart, null) }),
7
- children));
5
+ return (React.createElement(Button, { "data-fs-buy-button": true, icon: React.createElement(ShoppingCart, null), iconPosition: "left", "data-testid": testId, ...otherProps }, children));
8
6
  }
9
7
  export default BuyButton;
10
8
  //# sourceMappingURL=BuyButton.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BuyButton.js","sourceRoot":"","sources":["../../../src/molecules/BuyButton/BuyButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAI3C,SAAS,SAAS,CAAC,EACjB,MAAM,GAAG,eAAe,EACxB,IAAI,EACJ,QAAQ,EACR,GAAG,UAAU,EACE;IACf,OAAO,CACL,oBAAC,MAAM,+CAAiC,MAAM,KAAM,UAAU;QAC5D,oBAAC,IAAI,IAAC,SAAS,EAAE,oBAAC,YAAY,OAAG,GAAI;QACpC,QAAQ,CACF,CACV,CAAA;AACH,CAAC;AAED,eAAe,SAAS,CAAA"}
1
+ {"version":3,"file":"BuyButton.js","sourceRoot":"","sources":["../../../src/molecules/BuyButton/BuyButton.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAI3C,SAAS,SAAS,CAAC,EACjB,MAAM,GAAG,eAAe,EACxB,IAAI,EACJ,QAAQ,EACR,GAAG,UAAU,EACE;IACf,OAAO,CACL,oBAAC,MAAM,gCAEL,IAAI,EAAE,oBAAC,YAAY,OAAG,EACtB,YAAY,EAAC,MAAM,iBACN,MAAM,KACf,UAAU,IAEb,QAAQ,CACF,CACV,CAAA;AACH,CAAC;AAED,eAAe,SAAS,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/components",
3
- "version": "2.0.52-alpha.0",
3
+ "version": "2.0.53-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": "fe474595d374d91b69063e0b2ed6e56eee0c36d0"
33
+ "gitHead": "a9a211450d2173e08fd8b8dcf4a6da4d78590a71"
34
34
  }
@@ -1,6 +1,6 @@
1
1
  import type { ReactNode, ButtonHTMLAttributes } from 'react'
2
2
  import React, { forwardRef } from 'react'
3
- import { Icon } from '../../index'
3
+ import { Icon, Loader } from '../../index'
4
4
 
5
5
  export type Variant = 'primary' | 'secondary' | 'tertiary'
6
6
  export type Size = 'small' | 'regular'
@@ -24,13 +24,21 @@ export interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {
24
24
  */
25
25
  inverse?: boolean
26
26
  /**
27
- * Specifies that this button should be disabled
27
+ * Specifies that this button should be disabled.
28
28
  */
29
29
  disabled?: boolean
30
30
  /**
31
31
  * A React component that will be rendered as an icon.
32
32
  */
33
33
  icon?: ReactNode
34
+ /**
35
+ * Boolean that represents a loading state.
36
+ */
37
+ loading?: boolean
38
+ /**
39
+ * Specifies a label for loading state.
40
+ */
41
+ loadingLabel?: string
34
42
  /**
35
43
  * Specifies where the icon should be positioned
36
44
  */
@@ -44,6 +52,8 @@ const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(
44
52
  inverse,
45
53
  size = 'regular',
46
54
  testId = 'fs-button',
55
+ loading,
56
+ loadingLabel,
47
57
  icon,
48
58
  iconPosition = 'left',
49
59
  disabled,
@@ -51,19 +61,27 @@ const Button = forwardRef<HTMLButtonElement, ButtonProps>(function Button(
51
61
  },
52
62
  ref
53
63
  ) {
64
+
54
65
  return (
55
66
  <button
56
67
  ref={ref}
57
68
  data-fs-button
58
69
  data-fs-button-inverse={inverse}
59
70
  data-fs-button-size={size}
71
+ data-fs-button-loading={loading}
60
72
  data-fs-button-variant={variant}
61
73
  disabled={disabled}
62
74
  data-testid={testId}
63
75
  {...otherProps}
64
76
  >
77
+ {loading && (
78
+ <p data-fs-button-loading-label>
79
+ {loadingLabel}
80
+ <Loader variant={variant === 'primary' && !inverse ? 'light' : 'dark'} />
81
+ </p>
82
+ )}
65
83
  {icon && iconPosition === 'left' && <Icon component={icon} />}
66
- {children}
84
+ <span>{children}</span>
67
85
  {icon && iconPosition === 'right' && <Icon component={icon} />}
68
86
  </button>
69
87
  )
@@ -0,0 +1,33 @@
1
+ import React, { forwardRef } from 'react'
2
+
3
+ export type LoaderProps = {
4
+ /**
5
+ * Specifies the component color variant.
6
+ */
7
+ variant?: 'light' | 'dark'
8
+ /**
9
+ * ID to find this component in testing tools (e.g.: cypress, testing library, and jest).
10
+ */
11
+ testId?: string
12
+ }
13
+
14
+ const Loader = forwardRef<HTMLDivElement, LoaderProps>(function Loader(
15
+ { variant = 'dark', testId = 'fs-loader', ...otherProps }: LoaderProps,
16
+ ref
17
+ ) {
18
+ return (
19
+ <div
20
+ ref={ref}
21
+ data-fs-loader
22
+ data-fs-loader-variant={variant}
23
+ data-testid={testId}
24
+ {...otherProps}
25
+ >
26
+ <span data-fs-loader-item></span>
27
+ <span data-fs-loader-item></span>
28
+ <span data-fs-loader-item></span>
29
+ </div>
30
+ )
31
+ })
32
+
33
+ export default Loader
@@ -0,0 +1,2 @@
1
+ export { default } from './Loader'
2
+ export type { LoaderProps } from './Loader'
package/src/index.ts CHANGED
@@ -16,6 +16,8 @@ export { default as Label } from './atoms/Label'
16
16
  export type { LabelProps } from './atoms/Label'
17
17
  export { default as Link } from './atoms/Link'
18
18
  export type { LinkProps, LinkElementType } from './atoms/Link'
19
+ export { default as Loader } from './atoms/Loader'
20
+ export type { LoaderProps } from './atoms/Loader'
19
21
  export { default as List } from './atoms/List'
20
22
  export type { ListProps } from './atoms/List'
21
23
  export { default as Overlay } from './atoms/Overlay'
@@ -1,6 +1,6 @@
1
1
  import React from 'react'
2
2
 
3
- import { Button, Icon } from '../../index'
3
+ import { Button } from '../../index'
4
4
  import type { ButtonProps } from '../../index'
5
5
  import { ShoppingCart } from '../../assets'
6
6
 
@@ -13,8 +13,13 @@ function BuyButton({
13
13
  ...otherProps
14
14
  }: BuyButtonProps) {
15
15
  return (
16
- <Button data-fs-buy-button data-testid={testId} {...otherProps}>
17
- <Icon component={<ShoppingCart />} />
16
+ <Button
17
+ data-fs-buy-button
18
+ icon={<ShoppingCart />}
19
+ iconPosition="left"
20
+ data-testid={testId}
21
+ {...otherProps}
22
+ >
18
23
  {children}
19
24
  </Button>
20
25
  )