@transferwise/components 45.10.0 → 45.11.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 (64) hide show
  1. package/build/es/no-polyfill/common/card/Card.js +21 -0
  2. package/build/es/no-polyfill/common/card/Card.spec.js +6 -0
  3. package/build/es/no-polyfill/common/card/Card.story.js +1 -0
  4. package/build/es/no-polyfill/common/card/index.js +1 -0
  5. package/build/es/no-polyfill/common/closeButton/CloseButton.js +1 -1
  6. package/build/es/no-polyfill/display/Display.js +1 -1
  7. package/build/es/no-polyfill/image/Image.js +1 -1
  8. package/build/es/no-polyfill/index.js +1 -1
  9. package/build/es/no-polyfill/loader/Loader.js +1 -1
  10. package/build/es/no-polyfill/promoCard/PromoCard.js +51 -0
  11. package/build/es/no-polyfill/promoCard/PromoCard.spec.js +13 -0
  12. package/build/es/no-polyfill/promoCard/PromoCard.story.js +1 -0
  13. package/build/es/no-polyfill/promoCard/PromoCardContext.js +19 -0
  14. package/build/es/no-polyfill/promoCard/PromoCardContext.spec.js +4 -0
  15. package/build/es/no-polyfill/promoCard/PromoCardGroup.js +20 -0
  16. package/build/es/no-polyfill/promoCard/PromoCardGroup.spec.js +5 -0
  17. package/build/es/no-polyfill/promoCard/PromoCardGroup.story.js +1 -0
  18. package/build/es/no-polyfill/promoCard/PromoCardIndicator.js +16 -0
  19. package/build/es/no-polyfill/promoCard/index.js +1 -0
  20. package/build/es/polyfill/common/card/Card.js +21 -0
  21. package/build/es/polyfill/common/card/Card.spec.js +6 -0
  22. package/build/es/polyfill/common/card/Card.story.js +1 -0
  23. package/build/es/polyfill/common/card/index.js +1 -0
  24. package/build/es/polyfill/common/closeButton/CloseButton.js +1 -1
  25. package/build/es/polyfill/display/Display.js +1 -1
  26. package/build/es/polyfill/image/Image.js +1 -1
  27. package/build/es/polyfill/index.js +1 -1
  28. package/build/es/polyfill/loader/Loader.js +1 -1
  29. package/build/es/polyfill/promoCard/PromoCard.js +51 -0
  30. package/build/es/polyfill/promoCard/PromoCard.spec.js +13 -0
  31. package/build/es/polyfill/promoCard/PromoCard.story.js +1 -0
  32. package/build/es/polyfill/promoCard/PromoCardContext.js +19 -0
  33. package/build/es/polyfill/promoCard/PromoCardContext.spec.js +4 -0
  34. package/build/es/polyfill/promoCard/PromoCardGroup.js +20 -0
  35. package/build/es/polyfill/promoCard/PromoCardGroup.spec.js +5 -0
  36. package/build/es/polyfill/promoCard/PromoCardGroup.story.js +1 -0
  37. package/build/es/polyfill/promoCard/PromoCardIndicator.js +16 -0
  38. package/build/es/polyfill/promoCard/index.js +1 -0
  39. package/build/main.css +1 -1
  40. package/build/styles/common/card/Card.css +1 -0
  41. package/build/styles/main.css +1 -1
  42. package/build/styles/promoCard/PromoCard.css +1 -0
  43. package/build/types/avatar/index.d.ts +1 -0
  44. package/build/types/common/card/Card.d.ts +40 -0
  45. package/build/types/common/card/Card.spec.d.ts +1 -0
  46. package/build/types/common/card/Card.story.d.ts +6 -0
  47. package/build/types/common/card/index.d.ts +1 -0
  48. package/build/types/common/closeButton/CloseButton.d.ts +4 -0
  49. package/build/types/display/Display.d.ts +1 -1
  50. package/build/types/image/Image.d.ts +1 -0
  51. package/build/types/index.d.ts +3 -0
  52. package/build/types/promoCard/PromoCard.d.ts +83 -0
  53. package/build/types/promoCard/PromoCard.spec.d.ts +1 -0
  54. package/build/types/promoCard/PromoCard.story.d.ts +11 -0
  55. package/build/types/promoCard/PromoCardContext.d.ts +45 -0
  56. package/build/types/promoCard/PromoCardContext.spec.d.ts +1 -0
  57. package/build/types/promoCard/PromoCardGroup.d.ts +38 -0
  58. package/build/types/promoCard/PromoCardGroup.spec.d.ts +1 -0
  59. package/build/types/promoCard/PromoCardGroup.story.d.ts +8 -0
  60. package/build/types/promoCard/PromoCardIndicator.d.ts +31 -0
  61. package/build/types/promoCard/index.d.ts +2 -0
  62. package/build/umd/no-polyfill/main.js +1 -1
  63. package/build/umd/polyfill/main.js +1 -1
  64. package/package.json +3 -3
@@ -0,0 +1,21 @@
1
+ import _defineProperty from"@babel/runtime/helpers/defineProperty";import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";var _excluded=["className","children","id","isDisabled","isSmall","onDismiss","testId"];function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}import classNames from"classnames";import{useRef}from"react";import{CloseButton}from"../closeButton";import{jsx as _jsx}from"react/jsx-runtime";import{jsxs as _jsxs}from"react/jsx-runtime";/**
2
+ * Card component.
3
+ *
4
+ * A card is a container for content that is used to group related information.
5
+ * It can be used to display information in a structured way, and can be
6
+ * customized with various props to suit different use cases.
7
+ *
8
+ * @param {Object} props - The component props.
9
+ * @param {ReactNode} children - The content to display inside the card.
10
+ * @param {string} className - Optional class name(s) to add to the card container.
11
+ * @param {string} id - Optional ID to add to the card container.
12
+ * @param {boolean} isDisabled - Whether the card is disabled or not.
13
+ * @param {boolean} isSmall - Whether the card is small or not.
14
+ * @param {(event_: MouseEvent<HTMLButtonElement>) => void} onDismiss - Optional function to call when the card is dismissed.
15
+ * @param {string} testId - Optional ID to add to the card container for testing purposes.
16
+ * @returns {JSX.Element} - The card component.
17
+ * @example
18
+ * <Card>
19
+ * <p>Hello World!</p>
20
+ * </Card>
21
+ */var Card=function(a){var b=a.className,c=a.children,d=a.id,e=a.isDisabled,f=void 0!==e&&e,g=a.isSmall,h=void 0!==g&&g,i=a.onDismiss,j=a.testId,k=_objectWithoutProperties(a,_excluded),l=useRef(null);return/*#__PURE__*/_jsxs("div",_objectSpread(_objectSpread({className:classNames("np-Card",{"np-Card--small":!!h,"is-disabled":!!f},b),id:d,"data-testid":j},k),{},{children:[i&&/*#__PURE__*/_jsx(CloseButton,{ref:l,className:"np-Card-closeButton",size:h?"sm":"md",isDisabled:f,testId:"close-button",onClick:i}),c]}))};export default Card;
@@ -0,0 +1,6 @@
1
+ import _defineProperty from"@babel/runtime/helpers/defineProperty";function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}import{render,fireEvent,screen}from"@testing-library/react";import React from"react";import{IntlProvider}from"react-intl";import Card from"./Card";import{jsx as _jsx}from"react/jsx-runtime";describe("Card",function(){var a={children:"Test Content",testId:"test-card"};it("matches snapshot",function(){var b=render(/*#__PURE__*/_jsx(Card,_objectSpread({},a))),c=b.container;expect(c.firstChild).toMatchSnapshot()}),it("renders",function(){var b=_objectSpread(_objectSpread({},a),{},{children:"Test text"}),c=render(/*#__PURE__*/_jsx(Card,_objectSpread(_objectSpread({},a),{},{children:"Test Content"}))),d=c.rerender;// Change props
2
+ expect(screen.getByTestId("test-card")).toBeInTheDocument(),expect(screen.getByTestId("test-card")).toHaveClass("np-Card"),d(/*#__PURE__*/_jsx(Card,_objectSpread({},b))),expect(screen.getByText("Test text")).toBeInTheDocument()}),it("is set with class by the `className` prop",function(){var b=_objectSpread(_objectSpread({},a),{},{className:"test-custom"}),c=render(/*#__PURE__*/_jsx(Card,_objectSpread({},a))),d=c.rerender;// Change props
3
+ expect(screen.getByTestId("test-card")).not.toHaveClass("test-custom"),d(/*#__PURE__*/_jsx(Card,_objectSpread({},b))),expect(screen.getByTestId("test-card")).toHaveClass("test-custom")}),it("applies `is-disabled` class when isDisabled is true",function(){var b=_objectSpread(_objectSpread({},a),{},{isDisabled:!0}),c=render(/*#__PURE__*/_jsx(Card,_objectSpread({},a))),d=c.rerender;// Change props
4
+ expect(screen.getByTestId("test-card")).not.toHaveClass("is-disabled"),d(/*#__PURE__*/_jsx(Card,_objectSpread({},b))),expect(screen.getByTestId("test-card")).toHaveClass("is-disabled")}),it("applies `np-Card--small` class when isSmall is true",function(){var b=_objectSpread(_objectSpread({},a),{},{isSmall:!0}),c=render(/*#__PURE__*/_jsx(Card,_objectSpread({},a))),d=c.rerender;// Change props
5
+ expect(screen.getByTestId("test-card")).not.toHaveClass("np-Card--small"),d(/*#__PURE__*/_jsx(Card,_objectSpread({},b))),expect(screen.getByTestId("test-card")).toHaveClass("np-Card--small")}),it("renders CloseButton and handles onDismiss",function(){var b=jest.fn(),c=_objectSpread(_objectSpread({},a),{},{onDismiss:b});// onClick function has been called.
6
+ render(/*#__PURE__*/_jsx(IntlProvider,{locale:"en",children:/*#__PURE__*/_jsx(Card,_objectSpread({},c))})),fireEvent.click(screen.getByTestId("close-button")),expect(b).toHaveBeenCalledTimes(1)})});
@@ -0,0 +1 @@
1
+ import{lorem10}from"../../test-utils";import Title from"../../title";import{Typography}from"../propsValues/typography";import Card from".";import{jsx as _jsx}from"react/jsx-runtime";import{Fragment as _Fragment}from"react/jsx-runtime";import{jsxs as _jsxs}from"react/jsx-runtime";var meta={component:Card,title:"Internal/Card",tags:["autodocs"]};export default meta;export var Default={args:{children:/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(Title,{type:Typography.TITLE_SECTION,children:"Money without borders"}),lorem10]})}};
@@ -0,0 +1 @@
1
+ export{default}from"./Card";
@@ -1 +1 @@
1
- import{Cross,CrossCircleFill}from"@transferwise/icons";import classNames from"classnames";import{forwardRef}from"react";import{useIntl}from"react-intl";import{Size}from"../propsValues/size";import messages from"./CloseButton.messages";import{jsx as _jsx}from"react/jsx-runtime";export var CloseButton=/*#__PURE__*/forwardRef(function(a,b){var c,d=a["aria-label"],e=a.size,f=void 0===e?Size.MEDIUM:e,g=a.filled,h=a.className,i=a.onClick,j=useIntl();null!==(c=d)&&void 0!==c?c:d=j.formatMessage(messages.ariaLabel);var k=void 0!==g&&g?CrossCircleFill:Cross;return/*#__PURE__*/_jsx("button",{ref:b,type:"button",className:classNames("np-close-button","close btn-link","text-no-decoration",{"np-close-button--large":f===Size.MEDIUM,"np-close-button--x-large":f===Size.LARGE},h),"aria-label":d,onClick:i,children:/*#__PURE__*/_jsx(k,{size:f===Size.SMALL?16:24})})});
1
+ import{Cross,CrossCircleFill}from"@transferwise/icons";import classNames from"classnames";import{forwardRef}from"react";import{useIntl}from"react-intl";import{Size}from"../propsValues/size";import messages from"./CloseButton.messages";import{jsx as _jsx}from"react/jsx-runtime";export var CloseButton=/*#__PURE__*/forwardRef(function(a,b){var c,d=a["aria-label"],e=a.size,f=void 0===e?Size.MEDIUM:e,g=a.filled,h=a.className,i=a.onClick,j=a.isDisabled,k=a.testId,l=useIntl();null!==(c=d)&&void 0!==c?c:d=l.formatMessage(messages.ariaLabel);var m=void 0!==g&&g?CrossCircleFill:Cross;return/*#__PURE__*/_jsx("button",{ref:b,type:"button",className:classNames("np-close-button","close btn-link","text-no-decoration",{"np-close-button--large":f===Size.MEDIUM,"np-close-button--x-large":f===Size.LARGE},h),"aria-label":d,"aria-disabled":j,disabled:j,"data-testid":k,onClick:i,children:/*#__PURE__*/_jsx(m,{size:f===Size.SMALL?16:24})})});
@@ -1 +1 @@
1
- import classNames from"classnames";import{Typography}from"../common";import{jsx as _jsx}from"react/jsx-runtime";function Display(a){var b=a.as,c=void 0===b?"h1":b,d=a.type,e=void 0===d?Typography.DISPLAY_LARGE:d,f=a.children,g=a.className;return/*#__PURE__*/_jsx(c,{className:classNames("np-text-".concat(e),"text-primary",g),children:f})}export default Display;
1
+ import classNames from"classnames";import{Typography}from"../common";import{jsx as _jsx}from"react/jsx-runtime";function Display(a){var b=a.as,c=void 0===b?"h1":b,d=a.type,e=void 0===d?Typography.DISPLAY_LARGE:d,f=a.children,g=a.className,h=a.id;return/*#__PURE__*/_jsx(c,{id:h,className:classNames("np-text-".concat(e),"text-primary",g),children:f})}export default Display;
@@ -9,4 +9,4 @@ import _slicedToArray from"@babel/runtime/helpers/slicedToArray";import classnam
9
9
  * @param {Function} [onError=()=>{}] - function that contains error callback. Doesn't fire on SSR https://github.com/facebook/react/issues/15446
10
10
  * @param {boolean} [loading="lazy"] - This attribute follows the loading API attribute. If set to eager image will load immediately just like a normal image tag otherwise it will lazy load.
11
11
  * @usage `<Image alt="alt" src="src" id="id1" onLoad={()=>{}} onError={())=>{}} loading="lazy" />`
12
- */import{jsx as _jsx}from"react/jsx-runtime";export var EmptyTransparentImage="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";var Image=function(a){var b=a.id,c=a.src,d=a.alt,e=a.onLoad,f=a.onError,g=a.className,h=a.loading,i=a.stretch,j=a.shrink,k=useRef(),l=useHasIntersected({elRef:k,loading:h}),m=_slicedToArray(l,1),n=m[0],o=c,p=e;return"lazy"!==h||n||(o=EmptyTransparentImage,p=null),/*#__PURE__*/_jsx("img",{ref:k,id:b,alt:d,src:o,className:classnames(["tw-image",{"tw-image__stretch":i,"tw-image__shrink":j},g]),onLoad:p,onError:f})};Image.propTypes={id:PropTypes.string,src:PropTypes.string.isRequired,alt:PropTypes.string.isRequired,onLoad:PropTypes.func,onError:PropTypes.func,className:PropTypes.string,loading:PropTypes.oneOf(["lazy","eager"]),stretch:PropTypes.bool,shrink:PropTypes.bool},Image.defaultProps={id:null,className:"",onLoad:function onLoad(){},onError:function onError(){},loading:"eager",stretch:!0,shrink:!0};export default Image;
12
+ */import{jsx as _jsx}from"react/jsx-runtime";export var EmptyTransparentImage="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";var Image=function(a){var b=a.id,c=a.src,d=a.alt,e=a.onLoad,f=a.onError,g=a.className,h=a.loading,i=a.stretch,j=a.role,k=a.shrink,l=useRef(),m=useHasIntersected({elRef:l,loading:h}),n=_slicedToArray(m,1),o=n[0],p=c,q=e;return"lazy"!==h||o||(p=EmptyTransparentImage,q=null),/*#__PURE__*/_jsx("img",{ref:l,id:b,alt:d,src:p,className:classnames(["tw-image",{"tw-image__stretch":i,"tw-image__shrink":k},g]),role:j,onLoad:q,onError:f})};Image.propTypes={id:PropTypes.string,src:PropTypes.string.isRequired,alt:PropTypes.string.isRequired,onLoad:PropTypes.func,onError:PropTypes.func,className:PropTypes.string,loading:PropTypes.oneOf(["lazy","eager"]),stretch:PropTypes.bool,shrink:PropTypes.bool,role:PropTypes.string},Image.defaultProps={id:null,className:"",onLoad:function onLoad(){},onError:function onError(){},loading:"eager",stretch:!0,shrink:!0};export default Image;
@@ -2,7 +2,7 @@
2
2
  * Types
3
3
  */ /**
4
4
  * Components
5
- */export{default as Title}from"./title";export{default as Body}from"./body";export{default as Accordion}from"./accordion";export{default as ActionButton}from"./actionButton";export{default as ActionOption}from"./actionOption";export{default as Alert}from"./alert";export{default as Avatar}from"./avatar";export{default as AvatarWrapper}from"./avatarWrapper";export{default as Badge}from"./badge";export{default as BottomSheet}from"./common/bottomSheet";export{default as Button}from"./button";export{default as Card}from"./card";export{default as Checkbox}from"./checkbox";export{default as CheckboxButton}from"./checkboxButton";export{default as CheckboxOption}from"./checkboxOption";export{default as Chevron}from"./chevron";export{default as Chips,Chip}from"./chips";export{default as CircularButton}from"./circularButton";export{default as DateInput}from"./dateInput";export{default as DateLookup}from"./dateLookup";export{default as Decision}from"./decision";export{default as DefinitionList}from"./definitionList";export{default as Dimmer}from"./dimmer";export{default as Display}from"./display";export{default as Drawer}from"./drawer";export{default as DropFade}from"./dropFade";export{default as DynamicFieldDefinitionList}from"./dynamicFieldDefinitionList";export{default as Emphasis}from"./emphasis";export{default as FlowNavigation}from"./flowNavigation/FlowNavigation";export{default as Header}from"./header";export{default as Image}from"./image";export{default as Info}from"./info";export{default as InlineAlert}from"./inlineAlert";export{Input}from"./inputs/Input";export{TextArea}from"./inputs/TextArea";export{default as InputWithDisplayFormat}from"./inputWithDisplayFormat";export{default as InstructionsList}from"./instructionsList";export{default as Link}from"./link";export{default as Loader}from"./loader";export{default as Logo}from"./logo";export{default as Markdown}from"./markdown";export{default as Modal}from"./modal";export{default as Money}from"./money";export{default as MoneyInput}from"./moneyInput";export{default as NavigationOption}from"./navigationOption";export{default as NavigationOptionsList}from"./navigationOptionsList";export{default as Nudge}from"./nudge";export{default as Option}from"./common/Option";export{default as OverlayHeader}from"./overlayHeader";export{default as PhoneNumberInput}from"./phoneNumberInput";export{default as Popover}from"./popover";export{default as ProcessIndicator}from"./processIndicator";export{default as ProgressBar}from"./progressBar";export{default as Progress}from"./progress";export{default as Provider,DirectionProvider,LanguageProvider}from"./provider";export{default as Radio}from"./radio";export{default as RadioGroup}from"./radioGroup";export{default as RadioOption}from"./radioOption";export{default as Section}from"./section";export{default as Select}from"./select";export{default as SlidingPanel}from"./slidingPanel";export{default as SnackbarPortal}from"./snackbar/Snackbar";export{default as SnackbarProvider}from"./snackbar/SnackbarProvider";export{default as StatusIcon}from"./statusIcon/StatusIcon";export{default as Stepper}from"./stepper/Stepper";export{default as Sticky}from"./sticky";export{default as Summary}from"./summary";export{default as Switch}from"./switch";export{default as SwitchOption}from"./switchOption";export{default as Tabs}from"./tabs";export{default as TextareaWithDisplayFormat}from"./textareaWithDisplayFormat";export{default as Tooltip}from"./tooltip";export{default as Typeahead}from"./typeahead";export{default as Upload}from"./upload";export{default as UploadInput}from"./uploadInput";export{SnackbarConsumer,SnackbarContext}from"./snackbar/SnackbarContext";export{default as CriticalCommsBanner}from"./criticalBanner";export{default as ListItem}from"./listItem";/**
5
+ */export{default as Title}from"./title";export{default as Body}from"./body";export{default as Accordion}from"./accordion";export{default as ActionButton}from"./actionButton";export{default as ActionOption}from"./actionOption";export{default as Alert}from"./alert";export{default as Avatar}from"./avatar";export{default as AvatarWrapper}from"./avatarWrapper";export{default as Badge}from"./badge";export{default as BottomSheet}from"./common/bottomSheet";export{default as Button}from"./button";export{default as Card}from"./card";export{default as BaseCard}from"./common/card";export{default as Checkbox}from"./checkbox";export{default as CheckboxButton}from"./checkboxButton";export{default as CheckboxOption}from"./checkboxOption";export{default as Chevron}from"./chevron";export{default as Chips,Chip}from"./chips";export{default as CircularButton}from"./circularButton";export{default as DateInput}from"./dateInput";export{default as DateLookup}from"./dateLookup";export{default as Decision}from"./decision";export{default as DefinitionList}from"./definitionList";export{default as Dimmer}from"./dimmer";export{default as Display}from"./display";export{default as Drawer}from"./drawer";export{default as DropFade}from"./dropFade";export{default as DynamicFieldDefinitionList}from"./dynamicFieldDefinitionList";export{default as Emphasis}from"./emphasis";export{default as FlowNavigation}from"./flowNavigation/FlowNavigation";export{default as Header}from"./header";export{default as Image}from"./image";export{default as Info}from"./info";export{default as InlineAlert}from"./inlineAlert";export{Input}from"./inputs/Input";export{TextArea}from"./inputs/TextArea";export{default as InputWithDisplayFormat}from"./inputWithDisplayFormat";export{default as InstructionsList}from"./instructionsList";export{default as Link}from"./link";export{default as Loader}from"./loader";export{default as Logo}from"./logo";export{default as Markdown}from"./markdown";export{default as Modal}from"./modal";export{default as Money}from"./money";export{default as MoneyInput}from"./moneyInput";export{default as NavigationOption}from"./navigationOption";export{default as NavigationOptionsList}from"./navigationOptionsList";export{default as Nudge}from"./nudge";export{default as Option}from"./common/Option";export{default as OverlayHeader}from"./overlayHeader";export{default as PhoneNumberInput}from"./phoneNumberInput";export{default as Popover}from"./popover";export{default as ProcessIndicator}from"./processIndicator";export{default as ProgressBar}from"./progressBar";export{default as Progress}from"./progress";export{default as PromoCard}from"./promoCard";export{default as PromoCardGroup}from"./promoCard";export{default as Provider,DirectionProvider,LanguageProvider}from"./provider";export{default as Radio}from"./radio";export{default as RadioGroup}from"./radioGroup";export{default as RadioOption}from"./radioOption";export{default as Section}from"./section";export{default as Select}from"./select";export{default as SlidingPanel}from"./slidingPanel";export{default as SnackbarPortal}from"./snackbar/Snackbar";export{default as SnackbarProvider}from"./snackbar/SnackbarProvider";export{default as StatusIcon}from"./statusIcon/StatusIcon";export{default as Stepper}from"./stepper/Stepper";export{default as Sticky}from"./sticky";export{default as Summary}from"./summary";export{default as Switch}from"./switch";export{default as SwitchOption}from"./switchOption";export{default as Tabs}from"./tabs";export{default as TextareaWithDisplayFormat}from"./textareaWithDisplayFormat";export{default as Tooltip}from"./tooltip";export{default as Typeahead}from"./typeahead";export{default as Upload}from"./upload";export{default as UploadInput}from"./uploadInput";export{SnackbarConsumer,SnackbarContext}from"./snackbar/SnackbarContext";export{default as CriticalCommsBanner}from"./criticalBanner";export{default as ListItem}from"./listItem";/**
6
6
  * Hooks
7
7
  */export{default as useSnackbar}from"./snackbar/useSnackbar";export{useDirection,useLayout}from"./common/hooks";/**
8
8
  * Enums
@@ -8,4 +8,4 @@ import{Fragment as _Fragment}from"react/jsx-runtime";import{jsx as _jsx}from"rea
8
8
  * @param root0.small
9
9
  * @param root0.size
10
10
  * @param root0.classNames
11
- */var Loader=function(a){var b=a.small,c=a.size,d=void 0===c?Size.MEDIUM:c,e=a.displayInstantly,f=void 0!==e&&e,g=a.classNames,h=void 0===g?{}:g,i=_objectWithoutProperties(a,_excluded),j=useTheme(),k=j.isForestGreenTheme,l=useState(f),m=_slicedToArray(l,2),n=m[0],o=m[1];useEffect(function(){var a,b;return f||(b=setTimeout(function(){a||o(!0)},1e3)),function(){a=!0,clearTimeout(b)}},[]);var p=function(a){return h[a]||a},q=void 0!==b&&b?Size.SMALL:d,r=getSupportedSize(q);return k?(console.warn("Loader is forbidden to use with Forest Green theme. Check the https://wise.design/components/screen-loader for more info."),/*#__PURE__*/_jsx(_Fragment,{})):/*#__PURE__*/_jsx("div",{className:classnames(p("tw-loader"),p("tw-loader--".concat(r)),{"tw-loader--visible":n}),"data-testid":i["data-testid"]})},getSupportedSize=function(a){switch(a){case Size.SMALL:case Size.EXTRA_SMALL:return Size.SMALL;case Size.EXTRA_LARGE:case Size.LARGE:case Size.MEDIUM:default:return Size.MEDIUM;}};export default Loader;
11
+ */var Loader=function(a){var b=a.small,c=a.size,d=void 0===c?Size.MEDIUM:c,e=a.displayInstantly,f=void 0!==e&&e,g=a.classNames,h=void 0===g?{}:g,i=_objectWithoutProperties(a,_excluded),j=useTheme(),k=j.theme,l=useState(f),m=_slicedToArray(l,2),n=m[0],o=m[1];useEffect(function(){var a,b;return f||(b=setTimeout(function(){a||o(!0)},1e3)),function(){a=!0,clearTimeout(b)}},[]);var p=function(a){return h[a]||a},q=void 0!==b&&b?Size.SMALL:d,r=getSupportedSize(q);return"forest-green"===k?(console.warn("Loader is forbidden to use with Forest Green theme. Check the https://wise.design/components/screen-loader for more info."),/*#__PURE__*/_jsx(_Fragment,{})):/*#__PURE__*/_jsx("div",{className:classnames(p("tw-loader"),p("tw-loader--".concat(r)),{"tw-loader--visible":n}),"data-testid":i["data-testid"]})},getSupportedSize=function(a){switch(a){case Size.SMALL:case Size.EXTRA_SMALL:return Size.SMALL;case Size.EXTRA_LARGE:case Size.LARGE:case Size.MEDIUM:default:return Size.MEDIUM;}};export default Loader;
@@ -0,0 +1,51 @@
1
+ import _defineProperty from"@babel/runtime/helpers/defineProperty";import _slicedToArray from"@babel/runtime/helpers/slicedToArray";import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";var _excluded=["className","description","defaultChecked","download","href","hrefLang","id","headingLevel","imageAlt","imageClass","imageSource","indicatorLabel","isChecked","isDisabled","onClick","rel","tabIndex","target","testId","title","type","value"];function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}import{Check}from"@transferwise/icons";import classNames from"classnames";import React,{forwardRef,useState,useEffect}from"react";import Body from"../body";import{Typography}from"../common";import Card from"../common/card";import Display from"../display";import Image from"../image/Image";import{usePromoCardContext}from"./PromoCardContext";import PromoCardIndicator from"./PromoCardIndicator";import{jsx as _jsx}from"react/jsx-runtime";import{jsxs as _jsxs}from"react/jsx-runtime";/**
2
+ * generateRandomId() function
3
+ *
4
+ * This function generates a random string of characters that can be used as
5
+ * an ID.
6
+ *
7
+ * @returns {string} A random string of characters.
8
+ * @example
9
+ * const id = generateRandomId();
10
+ * // id will be a random string of characters, such as "id-4711".
11
+ */var generateRandomId=function(){return"id-".concat(Math.random().toString(36).slice(7))},PromoCard=/*#__PURE__*/forwardRef(function(a,b){var c,d=a.className,e=a.description,f=a.defaultChecked,g=a.download,h=a.href,i=a.hrefLang,j=a.id,k=a.headingLevel,l=void 0===k?"h3":k,m=a.imageAlt,n=a.imageClass,o=a.imageSource,p=a.indicatorLabel,q=a.isChecked,r=a.isDisabled,s=a.onClick,t=a.rel,u=a.tabIndex,v=a.target,w=a.testId,x=a.title,y=a.type,z=a.value,A=_objectWithoutProperties(a,_excluded),B=usePromoCardContext(),C=B.state,D=B.onChange,E=B.isDisabled,F=useState("checkbox"===y&&null!==(c=null!==f&&void 0!==f?f:q)&&void 0!==c&&c),G=_slicedToArray(F,2),H=G[0],I=G[1],J=function(){"radio"===y?D(z||""):"checkbox"===y&&I(!H)},K="".concat(j||generateRandomId()),L=h&&g?"download":h?"arrow":void 0,M=classNames(_defineProperty({"np-Card--promoCard":!0,"np-Card--checked":!h&&y,"np-Card--link":h&&!y,"is-checked":"radio"===y?z===C:"checkbox"===y?H:void 0},"".concat(d||""),d)),N={className:M,id:K,isDisabled:r||E,onClick:s,ref:b,"data-testid":w},O=h&&!r?{download:g,href:h||void 0,hrefLang:i,rel:t,target:v}:{},P="checkbox"!==y&&"radio"!==y||h?{}:_objectSpread(_objectSpread({},N),{},{"aria-checked":"radio"===y?z===C:"checkbox"===y?H:void 0,"aria-describedby":"".concat(K,"-title")||void 0,"aria-disabled":r,"data-value":null!==z&&void 0!==z?z:void 0,role:"checkbox"===y||"radio"===y?y:void 0,onClick:J,onKeyDown:function onKeyDown(a){("Enter"===a.key||" "===a.key)&&J()},ref:b,tabIndex:0});return useEffect(function(){var a;I(null!==(a=null!==f&&void 0!==f?f:q)&&void 0!==a&&a)},[f,q]),/*#__PURE__*/_jsxs(Card,_objectSpread(_objectSpread(_objectSpread(_objectSpread({},N),P),A),{},{children:[(z===C||H)&&/*#__PURE__*/_jsx("span",{className:"np-Card-check",children:/*#__PURE__*/_jsx(Check,{size:24,"aria-hidden":"true"})}),/*#__PURE__*/_jsx(Display,{id:"".concat(K,"-title"),as:l,className:"np-Card-title",type:Typography.DISPLAY_SMALL,children:h&&!y?/*#__PURE__*/_jsx("a",_objectSpread(_objectSpread({className:"np-Card-titleLink"},O),{},{children:x})):x}),/*#__PURE__*/_jsx(Body,{className:"np-Card-description",children:e}),o&&/*#__PURE__*/_jsx("div",{className:classNames("np-Card-image",{imageClass:n}),children:/*#__PURE__*/_jsx(Image,{src:o,alt:m,role:m?null:"presentation",loading:"lazy"})}),/*#__PURE__*/_jsx(PromoCardIndicator,{label:p,icon:L})]}))});/**
12
+ * PromoCard component.
13
+ *
14
+ * PromoCard is a marketing style component that is used to group marketing
15
+ * product related information (such as choosing Card types). It can be used to
16
+ * display information in a structured way, and can be customized with various
17
+ * props to suit different use cases.
18
+ *
19
+ * @component
20
+ * @param {string} className - Additional class name for the PromoCard.
21
+ * @param {string} description - Description text for the PromoCard.
22
+ * @param {boolean} defaultChecked - Initial checked state for checkboxes and radios.
23
+ * @param {string} download - Download file name for links.
24
+ * @param {string} href - URL for links.
25
+ * @param {string} hrefLang - Language code for linked URL.
26
+ * @param {string} id - ID of the PromoCard.
27
+ * @param {string} imageAlt - Alt text for the image.
28
+ * @param {string} imageSource - Source URL of the image.
29
+ * @param {string} indicatorLabel - Label for the indicator icon.
30
+ * @param {boolean} isChecked - Checked state for checkboxes and radios.
31
+ * @param {boolean} isDisabled - Whether the PromoCard is disabled.
32
+ * @param {Function} onClick - Click event handler for the PromoCard.
33
+ * @param {string} rel - Relationship between the URL and the current page.
34
+ * @param {number} tabIndex - Tab index for keyboard navigation.
35
+ * @param {string} target - Target window for links.
36
+ * @param {string} testId - ID used for testing.
37
+ * @param {string} title - Title text of the PromoCard.
38
+ * @param {('checkbox'|'radio')} type - Type of the PromoCard (checkbox, radio).
39
+ * @param {string} value - Value for checkboxes and radios.
40
+ * @returns {JSX.Element} The rendered PromoCard component.
41
+ * @example
42
+ * <PromoCard
43
+ * title="Example PromoCard"
44
+ * description="This is an example PromoCard with a link variation."
45
+ * href="https://example.com"
46
+ * target="_blank"
47
+ * imageSource="https://example.com/image.png"
48
+ * imageAlt="Example Image"
49
+ * indicatorLabel="Learn More"
50
+ * />
51
+ */export default/*#__PURE__*/React.memo(PromoCard);
@@ -0,0 +1,13 @@
1
+ import _defineProperty from"@babel/runtime/helpers/defineProperty";function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}import{render,fireEvent,screen}from"@testing-library/react";import React from"react";import PromoCard from"./PromoCard";import{jsx as _jsx}from"react/jsx-runtime";describe("PromoCard",function(){var a,b={title:"Test Title",imageSource:"test.jpg",imageAlt:"Test Image",description:"Test Description",indicatorLabel:"Test Indicator Label",testId:"test-promo-card"};beforeEach(function(){var c=render(/*#__PURE__*/_jsx(PromoCard,_objectSpread({},b))),d=c.rerender;a=function(a){d(/*#__PURE__*/_jsx(PromoCard,_objectSpread(_objectSpread({},b),a)))}}),it("matches snapshot",function(){var a=render(/*#__PURE__*/_jsx(PromoCard,_objectSpread(_objectSpread({},b),{},{id:"test-promo-card"}))),c=a.container;expect(c.firstChild).toMatchSnapshot()}),it("renders",function(){var c=_objectSpread(_objectSpread({},b),{},{title:"Test text"});// Change props
2
+ expect(screen.getByTestId("test-promo-card")).toBeInTheDocument(),expect(screen.getByTestId("test-promo-card")).toHaveClass("np-Card--promoCard"),a(c),expect(screen.getByText("Test text")).toBeInTheDocument()}),it("renders title as an `h3`",function(){var c=_objectSpread(_objectSpread({},b),{},{headingLevel:"h4"});// Change props
3
+ expect(screen.getByRole("heading",{level:3})).toBeInTheDocument(),expect(screen.queryByRole("heading",{level:4})).not.toBeInTheDocument(),a(c),expect(screen.getByRole("heading",{level:4})).toBeInTheDocument(),expect(screen.queryByRole("heading",{level:3})).not.toBeInTheDocument()}),it("renders as an link element",function(){var c=_objectSpread(_objectSpread({},b),{},{href:"https://wise.com/"});// Change props
4
+ expect(screen.getByTestId("test-promo-card")).not.toHaveClass("np-Card--link"),expect(screen.getByText("Test Title")).not.toHaveAttribute("href"),a(c),expect(screen.getByTestId("test-promo-card")).toHaveClass("np-Card--link"),expect(screen.getByText("Test Title")).toHaveAttribute("href")}),it("renders the component with checkbox props",function(){var c=_objectSpread(_objectSpread({},b),{},{type:"checkbox"// or 'radio'
5
+ });// Change props
6
+ expect(screen.getByTestId("test-promo-card")).not.toHaveClass("np-Card--checked"),expect(screen.queryByRole("checkbox")).not.toBeInTheDocument(),a(c),expect(screen.getByTestId("test-promo-card")).toHaveClass("np-Card--checked"),expect(screen.getByRole("checkbox")).toBeInTheDocument()}),it("renders the component with radio props",function(){var c=_objectSpread(_objectSpread({},b),{},{type:"radio"// or 'checkbox'
7
+ });// Change props
8
+ expect(screen.getByTestId("test-promo-card")).not.toHaveClass("np-Card--checked"),expect(screen.queryByRole("radio")).not.toBeInTheDocument(),a(c),expect(screen.getByTestId("test-promo-card")).toHaveClass("np-Card--checked"),expect(screen.getByRole("radio")).toBeInTheDocument()}),it("doesnt render as a link or checked card when `herf` or `type` has been set",function(){var c=_objectSpread(_objectSpread({},b),{},{type:"radio",// or 'checkbox'
9
+ href:"https://wise.com/"});// Change props
10
+ a(c),expect(screen.getByTestId("test-promo-card")).not.toHaveClass("np-Card--checked"),expect(screen.getByTestId("test-promo-card")).not.toHaveClass("np-Card--link"),expect(screen.queryByRole("radio")).not.toBeInTheDocument(),expect(screen.getByText("Test Title")).not.toHaveAttribute("href")}),it("is set with class by the `className` prop",function(){var c=_objectSpread(_objectSpread({},b),{},{className:"test-custom"});// Change props
11
+ expect(screen.getByTestId("test-promo-card")).not.toHaveClass("test-custom"),a(c),expect(screen.getByTestId("test-promo-card")).toHaveClass("test-custom")}),it("applies `is-disabled` class when isDisabled is true",function(){var c=_objectSpread(_objectSpread({},b),{},{isDisabled:!0});// Change props
12
+ expect(screen.getByTestId("test-promo-card")).not.toHaveClass("is-disabled"),a(c),expect(screen.getByTestId("test-promo-card")).toHaveClass("is-disabled")}),it("calls the onClick function when the checkbox is clicked",function(){var c=_objectSpread(_objectSpread({},b),{},{type:"checkbox",isChecked:!1});// Change props
13
+ a(c),expect(screen.getByTestId("test-promo-card")).not.toHaveClass("is-checked"),fireEvent.click(screen.getByRole("checkbox")),expect(screen.getByTestId("test-promo-card")).toHaveClass("is-checked")})});
@@ -0,0 +1 @@
1
+ import PromoCard from"./PromoCard";import{jsx as _jsx}from"react/jsx-runtime";import{jsxs as _jsxs}from"react/jsx-runtime";var meta={component:PromoCard,title:"Layouts/PromoCard",tags:["autodocs"]};export default meta;export var Default={args:{description:"A card that lives online and works anywhere. Easy, secure, and always on hand.",title:"Digital",indicatorLabel:"Free",imageSource:"https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp"}};export var Link={args:{description:"A card that lives online and works anywhere. Easy, secure, and always on hand.",title:"Digital",href:"https://wise.com",indicatorLabel:"Free",imageSource:"https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp"}};export var Check={args:{description:"A card that lives online and works anywhere. Easy, secure, and always on hand.",title:"Digital",type:"checkbox",indicatorLabel:"Free",imageSource:"https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp"}};export var DefaultChecked={args:{description:"A card that lives online and works anywhere. Easy, secure, and always on hand.",title:"Digital",type:"checkbox",indicatorLabel:"Free",defaultChecked:!0,imageSource:"https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp"}};export var Disabled={args:{description:"A card that lives online and works anywhere. Easy, secure, and always on hand.",title:"Digital",type:"checkbox",isDisabled:!0,indicatorLabel:"Free",imageSource:"https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp"}};export var CustomClass={args:{description:"A card that lives online and works anywhere. Easy, secure, and always on hand.",title:"Digital",href:"https://wise.com",className:"np-CustomPromoCard",indicatorLabel:"Free",imageSource:"https://wise.com/web-art/assets/illustrations/digital-card-medium@2x.webp"},decorators:[function(a){return/*#__PURE__*/_jsxs("div",{children:[/*#__PURE__*/_jsx("style",{children:"\n .np-CustomPromoCard {\n --Card-background-color: var(--color-bright-yellow);\n --Card-indicator-icon-background-color: var(--color-dark-gold);\n --Card-indicator-icon-color: var(--color-contrast);\n }\n "}),/*#__PURE__*/_jsx(a,{})]})}]};
@@ -0,0 +1,19 @@
1
+ import{useContext,createContext}from"react";/**
2
+ * The type of the PromoCard context object.
3
+ *
4
+ * The context object contains the current state of the PromoCard group, whether
5
+ * the group is disabled or not, and a function to call when the group value
6
+ * changes. This value is used to provide context to child PromoCard components,
7
+ * allowing them to interact with the group and update its state.
8
+ */var defaultPromoCardContext={state:"",isDisabled:!1,// eslint-disable-next-line @typescript-eslint/no-empty-function
9
+ onChange:function onChange(){}};/**
10
+ * The PromoCard context object.
11
+ */export var PromoCardContext=/*#__PURE__*/createContext(defaultPromoCardContext);/**
12
+ * A custom hook for accessing the PromoCard context object.
13
+ *
14
+ * The `usePromoCardContext` hook is used to access the PromoCard context object
15
+ * from within a child PromoCard component. It throws an error if the context
16
+ * object is not available, which can help with debugging and development.
17
+ *
18
+ * @returns {PromoCardContextType} - The PromoCard context object.
19
+ */export var usePromoCardContext=function(){return useContext(PromoCardContext)};export default PromoCardContext;
@@ -0,0 +1,4 @@
1
+ import{render,screen}from"@testing-library/react";import React from"react";import{PromoCardContext,usePromoCardContext}from"./PromoCardContext";// A simple component that consumes the context
2
+ import{jsx as _jsx}from"react/jsx-runtime";import{jsxs as _jsxs}from"react/jsx-runtime";var TestComponent=function(){var a=usePromoCardContext();return/*#__PURE__*/_jsxs("div",{children:[/*#__PURE__*/_jsx("p",{children:"Value: ".concat(a.state)}),/*#__PURE__*/_jsx("p",{children:"Disabled: ".concat(a.isDisabled.toString())})]})};describe("PromoCardContext",function(){it("default values are accessible",function(){var a={state:"",isDisabled:!1,onChange:jest.fn()// You can mock this function for testing
3
+ };render(/*#__PURE__*/_jsx(PromoCardContext.Provider,{value:a,children:/*#__PURE__*/_jsx(TestComponent,{})})),expect(screen.getByText("Value:")).toBeInTheDocument(),expect(screen.getByText("Disabled: false")).toBeInTheDocument()}),it("context value changes are reflected",function(){var a={state:"new value",isDisabled:!0,onChange:jest.fn()// You can mock this function for testing
4
+ };render(/*#__PURE__*/_jsx(PromoCardContext.Provider,{value:a,children:/*#__PURE__*/_jsx(TestComponent,{})})),expect(screen.getByText("Value: new value")).toBeInTheDocument(),expect(screen.getByText("Disabled: true")).toBeInTheDocument()})});
@@ -0,0 +1,20 @@
1
+ import _defineProperty from"@babel/runtime/helpers/defineProperty";import _slicedToArray from"@babel/runtime/helpers/slicedToArray";function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}import classNames from"classnames";import React,{useState,useEffect,useMemo}from"react";import PromoCardContext from"./PromoCardContext";import{jsx as _jsx}from"react/jsx-runtime";/**
2
+ * PromoCardGroup component.
3
+ *
4
+ * A PromoCardGroup is a container for PromoCard components that allows the user to select one or more
5
+ * cards from a group. It can be used to display a set of related options, and can be customized with
6
+ * various props to suit different use cases.
7
+ *
8
+ * @param {ReactNode} children - The PromoCard components to display inside the group.
9
+ * @param {string} className - Optional class name(s) to add to the group container.
10
+ * @param {string} defaultChecked - The default value for the group.
11
+ * @param {string} id - Optional ID to add to the group container.
12
+ * @param {boolean} isDisabled=false - Whether the group is disabled or not.
13
+ * @param {string} label - Optional label to display above the group.
14
+ * @param {Function} onChange - Optional function to call when the group value changes.
15
+ * @param {string} testId - Optional ID to add to the group container for testing purposes.
16
+ * @returns {JSX.Element} - The PromoCardGroup component.
17
+ */var PromoCardGroup=function(a){var b=a.children,c=a.className,d=a.defaultChecked,e=void 0===d?"":d,f=a.id,g=a.isDisabled,h=void 0!==g&&g,i=a.onChange,j=void 0===i?function(){}:i,k=a.testId,l=useState(e),m=_slicedToArray(l,2),n=m[0],o=m[1],p=useState(null),q=_slicedToArray(p,2),r=q[0],s=q[1],t=useMemo(function(){return{state:n,isDisabled:h,onChange:function handleOnChange(a){o(a),j(a)}}},[n,h,j]),u=classNames(_defineProperty({"np-CardGroup":!0,"is-disabled":h},"".concat(c||""),c));return useEffect(function(){var a,c;o(e);// Collect an array of types from the children PromoCard components
18
+ var d=null!==(a=null===(c=React.Children.map(b,function(a){return/*#__PURE__*/React.isValidElement(a)&&a.props.type?a.props.type:null}))||void 0===c?void 0:c.filter(function(a){return null!==a&&void 0!==a}))&&void 0!==a?a:[],f=d.every(function(a){return a===d[0]});// Check if all types are the same
19
+ s(f&&"radio"===d[0]?"radiogroup":null)},[e,b]),/*#__PURE__*/_jsx(PromoCardContext.Provider,{value:t,children:/*#__PURE__*/_jsx("div",_objectSpread(_objectSpread({},{className:u,id:f,"data-testid":k,role:r// Add the role attribute here
20
+ }),{},{children:b}))})};export default/*#__PURE__*/React.memo(PromoCardGroup);
@@ -0,0 +1,5 @@
1
+ import _defineProperty from"@babel/runtime/helpers/defineProperty";function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}import{render,screen}from"@testing-library/react";import PromoCard from"./PromoCard";import PromoCardGroup from"./PromoCardGroup";import{jsx as _jsx}from"react/jsx-runtime";describe("PromoCardGroup",function(){var a,b={title:"Test Card",description:"Test Description",imageSource:"https://via.placeholder.com/150",type:"radio"},c={testId:"test-promo-card-group",children:[/*#__PURE__*/_jsx(PromoCard,_objectSpread(_objectSpread({},b),{},{testId:"test-1",value:"radio-1",id:"radio-1"}),"radio-1"),/*#__PURE__*/_jsx(PromoCard,_objectSpread(_objectSpread({},b),{},{testId:"test-2",value:"radio-2",id:"radio-2"}),"radio-2")]};beforeEach(function(){var b=render(/*#__PURE__*/_jsx(PromoCardGroup,_objectSpread({},c))),d=b.rerender;a=function(a){d(/*#__PURE__*/_jsx(PromoCardGroup,_objectSpread(_objectSpread({},c),a)))}}),it("matches snapshot",function(){var a=render(/*#__PURE__*/_jsx(PromoCardGroup,_objectSpread({},c))),b=a.container;expect(b.firstChild).toMatchSnapshot()}),it("renders",function(){var d=_objectSpread(_objectSpread({},c),{},{children:[/*#__PURE__*/_jsx(PromoCard,_objectSpread(_objectSpread({},b),{},{type:"checkbox",testId:"test-3",value:"radio-3"}),"radio-3"),/*#__PURE__*/_jsx(PromoCard,_objectSpread(_objectSpread({},b),{},{type:"checkbox",testId:"test-4",value:"radio-4"}),"radio-4")]});// Change children
2
+ expect(screen.getByTestId("test-promo-card-group")).toBeInTheDocument(),expect(screen.getByTestId("test-promo-card-group")).toHaveClass("np-CardGroup"),expect(screen.getByRole("radiogroup")).toBeInTheDocument(),a(d),expect(screen.getByTestId("test-4")).toBeInTheDocument()}),it("sets the `defaultValue` for the group",function(){var b=_objectSpread(_objectSpread({},c),{},{defaultChecked:"radio-1"});// Change children
3
+ expect(screen.getByTestId("test-1")).not.toHaveClass("is-checked"),a(b),expect(screen.getByTestId("test-1")).toHaveClass("is-checked")}),it("not to render as a `radiogroup` if we have a mix of PromoCard types",function(){var d=_objectSpread(_objectSpread({},c),{},{children:[/*#__PURE__*/_jsx(PromoCard,_objectSpread(_objectSpread({},b),{},{type:"checkbox",testId:"test-3",value:"radio-3"}),"radio-3"),/*#__PURE__*/_jsx(PromoCard,_objectSpread(_objectSpread({},b),{},{type:"checkbox",testId:"test-4 ",value:"radio-4"}),"radio-4")]});// Change children
4
+ expect(screen.getByRole("radiogroup")).toBeInTheDocument(),a(d),expect(screen.queryByRole("radiogroup")).not.toBeInTheDocument(),expect(screen.getByTestId("test-4")).toBeInTheDocument()}),it("applies `is-disabled` class to all children when isDisabled is true",function(){var b=_objectSpread(_objectSpread({},c),{},{isDisabled:!0});// Change children
5
+ expect(screen.getByTestId("test-1")).not.toHaveClass("is-disabled"),expect(screen.getByTestId("test-2")).not.toHaveClass("is-disabled"),a(b),expect(screen.getByTestId("test-1")).toHaveClass("is-disabled"),expect(screen.getByTestId("test-2")).toHaveClass("is-disabled")})});
@@ -0,0 +1 @@
1
+ import PromoCard from"./PromoCard";import PromoCardGroup from"./PromoCardGroup";import{jsx as _jsx}from"react/jsx-runtime";import{Fragment as _Fragment}from"react/jsx-runtime";import{jsxs as _jsxs}from"react/jsx-runtime";var PromoCards=function(){return/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(PromoCard,{title:"Digital",description:"A card that lives online and works anywhere. Easy, secure, and always on hand.",type:"radio",value:"digital",id:"digital",imageAlt:"",indicatorLabel:"Free",imageSource:"https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp"}),/*#__PURE__*/_jsx(PromoCard,{title:"Standard",description:"Spend and withdraw money around the world. In your wallet and on your side.",type:"radio",value:"standard",id:"standard",imageAlt:"",indicatorLabel:"7 GBP",imageSource:"https://wise.com/web-art/assets/illustrations/personal-card-medium@2x.webp"}),/*#__PURE__*/_jsx(PromoCard,{title:"Eco",description:"A debit card made to biodegrade \u2014 no toxic gases, no toxic fees.",type:"radio",value:"eco",id:"eco",imageAlt:"",indicatorLabel:"9 GBP",imageSource:"https://wise.com/web-art/assets/illustrations/eco-card-medium@2x.webp"})]})},meta={component:PromoCardGroup,title:"Layouts/PromoCardGroup",tags:["autodocs"]};export default meta;export var Default={args:{children:/*#__PURE__*/_jsx(_Fragment,{children:/*#__PURE__*/_jsx(PromoCards,{})})}};export var DefaultChecked={args:{children:/*#__PURE__*/_jsx(_Fragment,{children:/*#__PURE__*/_jsx(PromoCards,{})}),defaultChecked:"standard"}};export var Disabled={args:{children:/*#__PURE__*/_jsx(_Fragment,{children:/*#__PURE__*/_jsx(PromoCards,{})}),isDisabled:!0}};
@@ -0,0 +1,16 @@
1
+ import _defineProperty from"@babel/runtime/helpers/defineProperty";import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";var _excluded=["className","children","label","icon","testid"];function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}import{ArrowRight,Check,Download}from"@transferwise/icons";import classNames from"classnames";import Body from"../body";import{Typography}from"../common";import{jsx as _jsx}from"react/jsx-runtime";import{jsxs as _jsxs}from"react/jsx-runtime";/**
2
+ * PromoCardIndicator component.
3
+ *
4
+ * A PromoCardIndicator is a small component that can be used to display
5
+ * additional information or actions related to a PromoCard. It can be
6
+ * customized with various props to suit different use cases.
7
+ *
8
+ * @param {string} className - Optional class name(s) to add to the indicator container.
9
+ * @param {string} label - Optional label to display next to the indicator.
10
+ * @param {string} icon - Optional icon to display in the indicator.
11
+ * @param {string} testid - Optional ID to add to the indicator container for testing purposes.
12
+ * @param {ReactNode} children - Optional children to display inside the indicator.
13
+ * @returns {JSX.Element} - The PromoCardIndicator component.
14
+ * @example
15
+ * <PromoCardIndicator label="Download" icon="download" />
16
+ */var PromoCardIndicator=function(a){var b=a.className,c=a.children,d=a.label,e=a.icon,f=a.testid,g=_objectWithoutProperties(a,_excluded),h=e&&{check:Check,arrow:ArrowRight,download:Download}[e];return/*#__PURE__*/_jsxs("div",_objectSpread(_objectSpread({className:classNames("np-Card-indicator",b),"data-testid":f},g),{},{children:[d&&/*#__PURE__*/_jsx(Body,{as:"span",type:Typography.BODY_LARGE_BOLD,className:"np-Card-indicatorText",children:d}),h&&/*#__PURE__*/_jsx("span",{className:"np-Card-indicatorIcon",children:/*#__PURE__*/_jsx(h,{size:24,"aria-hidden":"true"})}),c]}))};export default PromoCardIndicator;
@@ -0,0 +1 @@
1
+ export{default}from"./PromoCard";export{default as PromoCardGroup}from"./PromoCardGroup";
@@ -0,0 +1,21 @@
1
+ import _defineProperty from"@babel/runtime/helpers/defineProperty";import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";var _excluded=["className","children","id","isDisabled","isSmall","onDismiss","testId"];import"core-js/modules/es.object.keys.js";import"core-js/modules/es.symbol.js";import"core-js/modules/es.array.filter.js";import"core-js/modules/es.object.to-string.js";import"core-js/modules/es.object.get-own-property-descriptor.js";import"core-js/modules/web.dom-collections.for-each.js";import"core-js/modules/es.object.get-own-property-descriptors.js";function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}import classNames from"classnames";import{useRef}from"react";import{CloseButton}from"../closeButton";import{jsx as _jsx}from"react/jsx-runtime";import{jsxs as _jsxs}from"react/jsx-runtime";/**
2
+ * Card component.
3
+ *
4
+ * A card is a container for content that is used to group related information.
5
+ * It can be used to display information in a structured way, and can be
6
+ * customized with various props to suit different use cases.
7
+ *
8
+ * @param {Object} props - The component props.
9
+ * @param {ReactNode} children - The content to display inside the card.
10
+ * @param {string} className - Optional class name(s) to add to the card container.
11
+ * @param {string} id - Optional ID to add to the card container.
12
+ * @param {boolean} isDisabled - Whether the card is disabled or not.
13
+ * @param {boolean} isSmall - Whether the card is small or not.
14
+ * @param {(event_: MouseEvent<HTMLButtonElement>) => void} onDismiss - Optional function to call when the card is dismissed.
15
+ * @param {string} testId - Optional ID to add to the card container for testing purposes.
16
+ * @returns {JSX.Element} - The card component.
17
+ * @example
18
+ * <Card>
19
+ * <p>Hello World!</p>
20
+ * </Card>
21
+ */var Card=function(a){var b=a.className,c=a.children,d=a.id,e=a.isDisabled,f=void 0!==e&&e,g=a.isSmall,h=void 0!==g&&g,i=a.onDismiss,j=a.testId,k=_objectWithoutProperties(a,_excluded),l=useRef(null);return/*#__PURE__*/_jsxs("div",_objectSpread(_objectSpread({className:classNames("np-Card",{"np-Card--small":!!h,"is-disabled":!!f},b),id:d,"data-testid":j},k),{},{children:[i&&/*#__PURE__*/_jsx(CloseButton,{ref:l,className:"np-Card-closeButton",size:h?"sm":"md",isDisabled:f,testId:"close-button",onClick:i}),c]}))};export default Card;
@@ -0,0 +1,6 @@
1
+ import _defineProperty from"@babel/runtime/helpers/defineProperty";import"core-js/modules/es.object.keys.js";import"core-js/modules/es.symbol.js";import"core-js/modules/es.array.filter.js";import"core-js/modules/es.object.to-string.js";import"core-js/modules/es.object.get-own-property-descriptor.js";import"core-js/modules/web.dom-collections.for-each.js";import"core-js/modules/es.object.get-own-property-descriptors.js";function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}import{render,fireEvent,screen}from"@testing-library/react";import React from"react";import{IntlProvider}from"react-intl";import Card from"./Card";import{jsx as _jsx}from"react/jsx-runtime";describe("Card",function(){var a={children:"Test Content",testId:"test-card"};it("matches snapshot",function(){var b=render(/*#__PURE__*/_jsx(Card,_objectSpread({},a))),c=b.container;expect(c.firstChild).toMatchSnapshot()}),it("renders",function(){var b=_objectSpread(_objectSpread({},a),{},{children:"Test text"}),c=render(/*#__PURE__*/_jsx(Card,_objectSpread(_objectSpread({},a),{},{children:"Test Content"}))),d=c.rerender;// Change props
2
+ expect(screen.getByTestId("test-card")).toBeInTheDocument(),expect(screen.getByTestId("test-card")).toHaveClass("np-Card"),d(/*#__PURE__*/_jsx(Card,_objectSpread({},b))),expect(screen.getByText("Test text")).toBeInTheDocument()}),it("is set with class by the `className` prop",function(){var b=_objectSpread(_objectSpread({},a),{},{className:"test-custom"}),c=render(/*#__PURE__*/_jsx(Card,_objectSpread({},a))),d=c.rerender;// Change props
3
+ expect(screen.getByTestId("test-card")).not.toHaveClass("test-custom"),d(/*#__PURE__*/_jsx(Card,_objectSpread({},b))),expect(screen.getByTestId("test-card")).toHaveClass("test-custom")}),it("applies `is-disabled` class when isDisabled is true",function(){var b=_objectSpread(_objectSpread({},a),{},{isDisabled:!0}),c=render(/*#__PURE__*/_jsx(Card,_objectSpread({},a))),d=c.rerender;// Change props
4
+ expect(screen.getByTestId("test-card")).not.toHaveClass("is-disabled"),d(/*#__PURE__*/_jsx(Card,_objectSpread({},b))),expect(screen.getByTestId("test-card")).toHaveClass("is-disabled")}),it("applies `np-Card--small` class when isSmall is true",function(){var b=_objectSpread(_objectSpread({},a),{},{isSmall:!0}),c=render(/*#__PURE__*/_jsx(Card,_objectSpread({},a))),d=c.rerender;// Change props
5
+ expect(screen.getByTestId("test-card")).not.toHaveClass("np-Card--small"),d(/*#__PURE__*/_jsx(Card,_objectSpread({},b))),expect(screen.getByTestId("test-card")).toHaveClass("np-Card--small")}),it("renders CloseButton and handles onDismiss",function(){var b=jest.fn(),c=_objectSpread(_objectSpread({},a),{},{onDismiss:b});// onClick function has been called.
6
+ render(/*#__PURE__*/_jsx(IntlProvider,{locale:"en",children:/*#__PURE__*/_jsx(Card,_objectSpread({},c))})),fireEvent.click(screen.getByTestId("close-button")),expect(b).toHaveBeenCalledTimes(1)})});
@@ -0,0 +1 @@
1
+ import{lorem10}from"../../test-utils";import Title from"../../title";import{Typography}from"../propsValues/typography";import Card from".";import{jsx as _jsx}from"react/jsx-runtime";import{Fragment as _Fragment}from"react/jsx-runtime";import{jsxs as _jsxs}from"react/jsx-runtime";var meta={component:Card,title:"Internal/Card",tags:["autodocs"]};export default meta;export var Default={args:{children:/*#__PURE__*/_jsxs(_Fragment,{children:[/*#__PURE__*/_jsx(Title,{type:Typography.TITLE_SECTION,children:"Money without borders"}),lorem10]})}};
@@ -0,0 +1 @@
1
+ export{default}from"./Card";
@@ -1 +1 @@
1
- import{Cross,CrossCircleFill}from"@transferwise/icons";import classNames from"classnames";import{forwardRef}from"react";import{useIntl}from"react-intl";import{Size}from"../propsValues/size";import messages from"./CloseButton.messages";import{jsx as _jsx}from"react/jsx-runtime";export var CloseButton=/*#__PURE__*/forwardRef(function(a,b){var c,d=a["aria-label"],e=a.size,f=void 0===e?Size.MEDIUM:e,g=a.filled,h=a.className,i=a.onClick,j=useIntl();null!==(c=d)&&void 0!==c?c:d=j.formatMessage(messages.ariaLabel);var k=void 0!==g&&g?CrossCircleFill:Cross;return/*#__PURE__*/_jsx("button",{ref:b,type:"button",className:classNames("np-close-button","close btn-link","text-no-decoration",{"np-close-button--large":f===Size.MEDIUM,"np-close-button--x-large":f===Size.LARGE},h),"aria-label":d,onClick:i,children:/*#__PURE__*/_jsx(k,{size:f===Size.SMALL?16:24})})});
1
+ import{Cross,CrossCircleFill}from"@transferwise/icons";import classNames from"classnames";import{forwardRef}from"react";import{useIntl}from"react-intl";import{Size}from"../propsValues/size";import messages from"./CloseButton.messages";import{jsx as _jsx}from"react/jsx-runtime";export var CloseButton=/*#__PURE__*/forwardRef(function(a,b){var c,d=a["aria-label"],e=a.size,f=void 0===e?Size.MEDIUM:e,g=a.filled,h=a.className,i=a.onClick,j=a.isDisabled,k=a.testId,l=useIntl();null!==(c=d)&&void 0!==c?c:d=l.formatMessage(messages.ariaLabel);var m=void 0!==g&&g?CrossCircleFill:Cross;return/*#__PURE__*/_jsx("button",{ref:b,type:"button",className:classNames("np-close-button","close btn-link","text-no-decoration",{"np-close-button--large":f===Size.MEDIUM,"np-close-button--x-large":f===Size.LARGE},h),"aria-label":d,"aria-disabled":j,disabled:j,"data-testid":k,onClick:i,children:/*#__PURE__*/_jsx(m,{size:f===Size.SMALL?16:24})})});
@@ -1 +1 @@
1
- import classNames from"classnames";import{Typography}from"../common";import{jsx as _jsx}from"react/jsx-runtime";function Display(a){var b=a.as,c=void 0===b?"h1":b,d=a.type,e=void 0===d?Typography.DISPLAY_LARGE:d,f=a.children,g=a.className;return/*#__PURE__*/_jsx(c,{className:classNames("np-text-".concat(e),"text-primary",g),children:f})}export default Display;
1
+ import classNames from"classnames";import{Typography}from"../common";import{jsx as _jsx}from"react/jsx-runtime";function Display(a){var b=a.as,c=void 0===b?"h1":b,d=a.type,e=void 0===d?Typography.DISPLAY_LARGE:d,f=a.children,g=a.className,h=a.id;return/*#__PURE__*/_jsx(c,{id:h,className:classNames("np-text-".concat(e),"text-primary",g),children:f})}export default Display;
@@ -9,4 +9,4 @@ import _slicedToArray from"@babel/runtime/helpers/slicedToArray";import classnam
9
9
  * @param {Function} [onError=()=>{}] - function that contains error callback. Doesn't fire on SSR https://github.com/facebook/react/issues/15446
10
10
  * @param {boolean} [loading="lazy"] - This attribute follows the loading API attribute. If set to eager image will load immediately just like a normal image tag otherwise it will lazy load.
11
11
  * @usage `<Image alt="alt" src="src" id="id1" onLoad={()=>{}} onError={())=>{}} loading="lazy" />`
12
- */import{jsx as _jsx}from"react/jsx-runtime";export var EmptyTransparentImage="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";var Image=function(a){var b=a.id,c=a.src,d=a.alt,e=a.onLoad,f=a.onError,g=a.className,h=a.loading,i=a.stretch,j=a.shrink,k=useRef(),l=useHasIntersected({elRef:k,loading:h}),m=_slicedToArray(l,1),n=m[0],o=c,p=e;return"lazy"!==h||n||(o=EmptyTransparentImage,p=null),/*#__PURE__*/_jsx("img",{ref:k,id:b,alt:d,src:o,className:classnames(["tw-image",{"tw-image__stretch":i,"tw-image__shrink":j},g]),onLoad:p,onError:f})};Image.propTypes={id:PropTypes.string,src:PropTypes.string.isRequired,alt:PropTypes.string.isRequired,onLoad:PropTypes.func,onError:PropTypes.func,className:PropTypes.string,loading:PropTypes.oneOf(["lazy","eager"]),stretch:PropTypes.bool,shrink:PropTypes.bool},Image.defaultProps={id:null,className:"",onLoad:function onLoad(){},onError:function onError(){},loading:"eager",stretch:!0,shrink:!0};export default Image;
12
+ */import{jsx as _jsx}from"react/jsx-runtime";export var EmptyTransparentImage="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";var Image=function(a){var b=a.id,c=a.src,d=a.alt,e=a.onLoad,f=a.onError,g=a.className,h=a.loading,i=a.stretch,j=a.role,k=a.shrink,l=useRef(),m=useHasIntersected({elRef:l,loading:h}),n=_slicedToArray(m,1),o=n[0],p=c,q=e;return"lazy"!==h||o||(p=EmptyTransparentImage,q=null),/*#__PURE__*/_jsx("img",{ref:l,id:b,alt:d,src:p,className:classnames(["tw-image",{"tw-image__stretch":i,"tw-image__shrink":k},g]),role:j,onLoad:q,onError:f})};Image.propTypes={id:PropTypes.string,src:PropTypes.string.isRequired,alt:PropTypes.string.isRequired,onLoad:PropTypes.func,onError:PropTypes.func,className:PropTypes.string,loading:PropTypes.oneOf(["lazy","eager"]),stretch:PropTypes.bool,shrink:PropTypes.bool,role:PropTypes.string},Image.defaultProps={id:null,className:"",onLoad:function onLoad(){},onError:function onError(){},loading:"eager",stretch:!0,shrink:!0};export default Image;
@@ -2,7 +2,7 @@
2
2
  * Types
3
3
  */ /**
4
4
  * Components
5
- */export{default as Title}from"./title";export{default as Body}from"./body";export{default as Accordion}from"./accordion";export{default as ActionButton}from"./actionButton";export{default as ActionOption}from"./actionOption";export{default as Alert}from"./alert";export{default as Avatar}from"./avatar";export{default as AvatarWrapper}from"./avatarWrapper";export{default as Badge}from"./badge";export{default as BottomSheet}from"./common/bottomSheet";export{default as Button}from"./button";export{default as Card}from"./card";export{default as Checkbox}from"./checkbox";export{default as CheckboxButton}from"./checkboxButton";export{default as CheckboxOption}from"./checkboxOption";export{default as Chevron}from"./chevron";export{default as Chips,Chip}from"./chips";export{default as CircularButton}from"./circularButton";export{default as DateInput}from"./dateInput";export{default as DateLookup}from"./dateLookup";export{default as Decision}from"./decision";export{default as DefinitionList}from"./definitionList";export{default as Dimmer}from"./dimmer";export{default as Display}from"./display";export{default as Drawer}from"./drawer";export{default as DropFade}from"./dropFade";export{default as DynamicFieldDefinitionList}from"./dynamicFieldDefinitionList";export{default as Emphasis}from"./emphasis";export{default as FlowNavigation}from"./flowNavigation/FlowNavigation";export{default as Header}from"./header";export{default as Image}from"./image";export{default as Info}from"./info";export{default as InlineAlert}from"./inlineAlert";export{Input}from"./inputs/Input";export{TextArea}from"./inputs/TextArea";export{default as InputWithDisplayFormat}from"./inputWithDisplayFormat";export{default as InstructionsList}from"./instructionsList";export{default as Link}from"./link";export{default as Loader}from"./loader";export{default as Logo}from"./logo";export{default as Markdown}from"./markdown";export{default as Modal}from"./modal";export{default as Money}from"./money";export{default as MoneyInput}from"./moneyInput";export{default as NavigationOption}from"./navigationOption";export{default as NavigationOptionsList}from"./navigationOptionsList";export{default as Nudge}from"./nudge";export{default as Option}from"./common/Option";export{default as OverlayHeader}from"./overlayHeader";export{default as PhoneNumberInput}from"./phoneNumberInput";export{default as Popover}from"./popover";export{default as ProcessIndicator}from"./processIndicator";export{default as ProgressBar}from"./progressBar";export{default as Progress}from"./progress";export{default as Provider,DirectionProvider,LanguageProvider}from"./provider";export{default as Radio}from"./radio";export{default as RadioGroup}from"./radioGroup";export{default as RadioOption}from"./radioOption";export{default as Section}from"./section";export{default as Select}from"./select";export{default as SlidingPanel}from"./slidingPanel";export{default as SnackbarPortal}from"./snackbar/Snackbar";export{default as SnackbarProvider}from"./snackbar/SnackbarProvider";export{default as StatusIcon}from"./statusIcon/StatusIcon";export{default as Stepper}from"./stepper/Stepper";export{default as Sticky}from"./sticky";export{default as Summary}from"./summary";export{default as Switch}from"./switch";export{default as SwitchOption}from"./switchOption";export{default as Tabs}from"./tabs";export{default as TextareaWithDisplayFormat}from"./textareaWithDisplayFormat";export{default as Tooltip}from"./tooltip";export{default as Typeahead}from"./typeahead";export{default as Upload}from"./upload";export{default as UploadInput}from"./uploadInput";export{SnackbarConsumer,SnackbarContext}from"./snackbar/SnackbarContext";export{default as CriticalCommsBanner}from"./criticalBanner";export{default as ListItem}from"./listItem";/**
5
+ */export{default as Title}from"./title";export{default as Body}from"./body";export{default as Accordion}from"./accordion";export{default as ActionButton}from"./actionButton";export{default as ActionOption}from"./actionOption";export{default as Alert}from"./alert";export{default as Avatar}from"./avatar";export{default as AvatarWrapper}from"./avatarWrapper";export{default as Badge}from"./badge";export{default as BottomSheet}from"./common/bottomSheet";export{default as Button}from"./button";export{default as Card}from"./card";export{default as BaseCard}from"./common/card";export{default as Checkbox}from"./checkbox";export{default as CheckboxButton}from"./checkboxButton";export{default as CheckboxOption}from"./checkboxOption";export{default as Chevron}from"./chevron";export{default as Chips,Chip}from"./chips";export{default as CircularButton}from"./circularButton";export{default as DateInput}from"./dateInput";export{default as DateLookup}from"./dateLookup";export{default as Decision}from"./decision";export{default as DefinitionList}from"./definitionList";export{default as Dimmer}from"./dimmer";export{default as Display}from"./display";export{default as Drawer}from"./drawer";export{default as DropFade}from"./dropFade";export{default as DynamicFieldDefinitionList}from"./dynamicFieldDefinitionList";export{default as Emphasis}from"./emphasis";export{default as FlowNavigation}from"./flowNavigation/FlowNavigation";export{default as Header}from"./header";export{default as Image}from"./image";export{default as Info}from"./info";export{default as InlineAlert}from"./inlineAlert";export{Input}from"./inputs/Input";export{TextArea}from"./inputs/TextArea";export{default as InputWithDisplayFormat}from"./inputWithDisplayFormat";export{default as InstructionsList}from"./instructionsList";export{default as Link}from"./link";export{default as Loader}from"./loader";export{default as Logo}from"./logo";export{default as Markdown}from"./markdown";export{default as Modal}from"./modal";export{default as Money}from"./money";export{default as MoneyInput}from"./moneyInput";export{default as NavigationOption}from"./navigationOption";export{default as NavigationOptionsList}from"./navigationOptionsList";export{default as Nudge}from"./nudge";export{default as Option}from"./common/Option";export{default as OverlayHeader}from"./overlayHeader";export{default as PhoneNumberInput}from"./phoneNumberInput";export{default as Popover}from"./popover";export{default as ProcessIndicator}from"./processIndicator";export{default as ProgressBar}from"./progressBar";export{default as Progress}from"./progress";export{default as PromoCard}from"./promoCard";export{default as PromoCardGroup}from"./promoCard";export{default as Provider,DirectionProvider,LanguageProvider}from"./provider";export{default as Radio}from"./radio";export{default as RadioGroup}from"./radioGroup";export{default as RadioOption}from"./radioOption";export{default as Section}from"./section";export{default as Select}from"./select";export{default as SlidingPanel}from"./slidingPanel";export{default as SnackbarPortal}from"./snackbar/Snackbar";export{default as SnackbarProvider}from"./snackbar/SnackbarProvider";export{default as StatusIcon}from"./statusIcon/StatusIcon";export{default as Stepper}from"./stepper/Stepper";export{default as Sticky}from"./sticky";export{default as Summary}from"./summary";export{default as Switch}from"./switch";export{default as SwitchOption}from"./switchOption";export{default as Tabs}from"./tabs";export{default as TextareaWithDisplayFormat}from"./textareaWithDisplayFormat";export{default as Tooltip}from"./tooltip";export{default as Typeahead}from"./typeahead";export{default as Upload}from"./upload";export{default as UploadInput}from"./uploadInput";export{SnackbarConsumer,SnackbarContext}from"./snackbar/SnackbarContext";export{default as CriticalCommsBanner}from"./criticalBanner";export{default as ListItem}from"./listItem";/**
6
6
  * Hooks
7
7
  */export{default as useSnackbar}from"./snackbar/useSnackbar";export{useDirection,useLayout}from"./common/hooks";/**
8
8
  * Enums
@@ -8,4 +8,4 @@ import{Fragment as _Fragment}from"react/jsx-runtime";import{jsx as _jsx}from"rea
8
8
  * @param root0.small
9
9
  * @param root0.size
10
10
  * @param root0.classNames
11
- */var Loader=function(a){var b=a.small,c=a.size,d=void 0===c?Size.MEDIUM:c,e=a.displayInstantly,f=void 0!==e&&e,g=a.classNames,h=void 0===g?{}:g,i=_objectWithoutProperties(a,_excluded),j=useTheme(),k=j.isForestGreenTheme,l=useState(f),m=_slicedToArray(l,2),n=m[0],o=m[1];useEffect(function(){var a,b;return f||(b=setTimeout(function(){a||o(!0)},1e3)),function(){a=!0,clearTimeout(b)}},[]);var p=function(a){return h[a]||a},q=void 0!==b&&b?Size.SMALL:d,r=getSupportedSize(q);return k?(console.warn("Loader is forbidden to use with Forest Green theme. Check the https://wise.design/components/screen-loader for more info."),/*#__PURE__*/_jsx(_Fragment,{})):/*#__PURE__*/_jsx("div",{className:classnames(p("tw-loader"),p("tw-loader--".concat(r)),{"tw-loader--visible":n}),"data-testid":i["data-testid"]})},getSupportedSize=function(a){switch(a){case Size.SMALL:case Size.EXTRA_SMALL:return Size.SMALL;case Size.EXTRA_LARGE:case Size.LARGE:case Size.MEDIUM:default:return Size.MEDIUM;}};export default Loader;
11
+ */var Loader=function(a){var b=a.small,c=a.size,d=void 0===c?Size.MEDIUM:c,e=a.displayInstantly,f=void 0!==e&&e,g=a.classNames,h=void 0===g?{}:g,i=_objectWithoutProperties(a,_excluded),j=useTheme(),k=j.theme,l=useState(f),m=_slicedToArray(l,2),n=m[0],o=m[1];useEffect(function(){var a,b;return f||(b=setTimeout(function(){a||o(!0)},1e3)),function(){a=!0,clearTimeout(b)}},[]);var p=function(a){return h[a]||a},q=void 0!==b&&b?Size.SMALL:d,r=getSupportedSize(q);return"forest-green"===k?(console.warn("Loader is forbidden to use with Forest Green theme. Check the https://wise.design/components/screen-loader for more info."),/*#__PURE__*/_jsx(_Fragment,{})):/*#__PURE__*/_jsx("div",{className:classnames(p("tw-loader"),p("tw-loader--".concat(r)),{"tw-loader--visible":n}),"data-testid":i["data-testid"]})},getSupportedSize=function(a){switch(a){case Size.SMALL:case Size.EXTRA_SMALL:return Size.SMALL;case Size.EXTRA_LARGE:case Size.LARGE:case Size.MEDIUM:default:return Size.MEDIUM;}};export default Loader;
@@ -0,0 +1,51 @@
1
+ import _defineProperty from"@babel/runtime/helpers/defineProperty";import _slicedToArray from"@babel/runtime/helpers/slicedToArray";import _objectWithoutProperties from"@babel/runtime/helpers/objectWithoutProperties";var _excluded=["className","description","defaultChecked","download","href","hrefLang","id","headingLevel","imageAlt","imageClass","imageSource","indicatorLabel","isChecked","isDisabled","onClick","rel","tabIndex","target","testId","title","type","value"];function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}import"core-js/modules/es.array.slice.js";import"core-js/modules/es.object.to-string.js";import"core-js/modules/es.regexp.to-string.js";import"core-js/modules/es.symbol.js";import"core-js/modules/es.symbol.description.js";import"core-js/modules/es.object.keys.js";import"core-js/modules/es.array.filter.js";import"core-js/modules/es.object.get-own-property-descriptor.js";import"core-js/modules/web.dom-collections.for-each.js";import"core-js/modules/es.object.get-own-property-descriptors.js";import{Check}from"@transferwise/icons";import classNames from"classnames";import React,{forwardRef,useState,useEffect}from"react";import Body from"../body";import{Typography}from"../common";import Card from"../common/card";import Display from"../display";import Image from"../image/Image";import{usePromoCardContext}from"./PromoCardContext";import PromoCardIndicator from"./PromoCardIndicator";import{jsx as _jsx}from"react/jsx-runtime";import{jsxs as _jsxs}from"react/jsx-runtime";/**
2
+ * generateRandomId() function
3
+ *
4
+ * This function generates a random string of characters that can be used as
5
+ * an ID.
6
+ *
7
+ * @returns {string} A random string of characters.
8
+ * @example
9
+ * const id = generateRandomId();
10
+ * // id will be a random string of characters, such as "id-4711".
11
+ */var generateRandomId=function(){return"id-".concat(Math.random().toString(36).slice(7))},PromoCard=/*#__PURE__*/forwardRef(function(a,b){var c,d=a.className,e=a.description,f=a.defaultChecked,g=a.download,h=a.href,i=a.hrefLang,j=a.id,k=a.headingLevel,l=void 0===k?"h3":k,m=a.imageAlt,n=a.imageClass,o=a.imageSource,p=a.indicatorLabel,q=a.isChecked,r=a.isDisabled,s=a.onClick,t=a.rel,u=a.tabIndex,v=a.target,w=a.testId,x=a.title,y=a.type,z=a.value,A=_objectWithoutProperties(a,_excluded),B=usePromoCardContext(),C=B.state,D=B.onChange,E=B.isDisabled,F=useState("checkbox"===y&&null!==(c=null!==f&&void 0!==f?f:q)&&void 0!==c&&c),G=_slicedToArray(F,2),H=G[0],I=G[1],J=function(){"radio"===y?D(z||""):"checkbox"===y&&I(!H)},K="".concat(j||generateRandomId()),L=h&&g?"download":h?"arrow":void 0,M=classNames(_defineProperty({"np-Card--promoCard":!0,"np-Card--checked":!h&&y,"np-Card--link":h&&!y,"is-checked":"radio"===y?z===C:"checkbox"===y?H:void 0},"".concat(d||""),d)),N={className:M,id:K,isDisabled:r||E,onClick:s,ref:b,"data-testid":w},O=h&&!r?{download:g,href:h||void 0,hrefLang:i,rel:t,target:v}:{},P="checkbox"!==y&&"radio"!==y||h?{}:_objectSpread(_objectSpread({},N),{},{"aria-checked":"radio"===y?z===C:"checkbox"===y?H:void 0,"aria-describedby":"".concat(K,"-title")||void 0,"aria-disabled":r,"data-value":null!==z&&void 0!==z?z:void 0,role:"checkbox"===y||"radio"===y?y:void 0,onClick:J,onKeyDown:function onKeyDown(a){("Enter"===a.key||" "===a.key)&&J()},ref:b,tabIndex:0});return useEffect(function(){var a;I(null!==(a=null!==f&&void 0!==f?f:q)&&void 0!==a&&a)},[f,q]),/*#__PURE__*/_jsxs(Card,_objectSpread(_objectSpread(_objectSpread(_objectSpread({},N),P),A),{},{children:[(z===C||H)&&/*#__PURE__*/_jsx("span",{className:"np-Card-check",children:/*#__PURE__*/_jsx(Check,{size:24,"aria-hidden":"true"})}),/*#__PURE__*/_jsx(Display,{id:"".concat(K,"-title"),as:l,className:"np-Card-title",type:Typography.DISPLAY_SMALL,children:h&&!y?/*#__PURE__*/_jsx("a",_objectSpread(_objectSpread({className:"np-Card-titleLink"},O),{},{children:x})):x}),/*#__PURE__*/_jsx(Body,{className:"np-Card-description",children:e}),o&&/*#__PURE__*/_jsx("div",{className:classNames("np-Card-image",{imageClass:n}),children:/*#__PURE__*/_jsx(Image,{src:o,alt:m,role:m?null:"presentation",loading:"lazy"})}),/*#__PURE__*/_jsx(PromoCardIndicator,{label:p,icon:L})]}))});/**
12
+ * PromoCard component.
13
+ *
14
+ * PromoCard is a marketing style component that is used to group marketing
15
+ * product related information (such as choosing Card types). It can be used to
16
+ * display information in a structured way, and can be customized with various
17
+ * props to suit different use cases.
18
+ *
19
+ * @component
20
+ * @param {string} className - Additional class name for the PromoCard.
21
+ * @param {string} description - Description text for the PromoCard.
22
+ * @param {boolean} defaultChecked - Initial checked state for checkboxes and radios.
23
+ * @param {string} download - Download file name for links.
24
+ * @param {string} href - URL for links.
25
+ * @param {string} hrefLang - Language code for linked URL.
26
+ * @param {string} id - ID of the PromoCard.
27
+ * @param {string} imageAlt - Alt text for the image.
28
+ * @param {string} imageSource - Source URL of the image.
29
+ * @param {string} indicatorLabel - Label for the indicator icon.
30
+ * @param {boolean} isChecked - Checked state for checkboxes and radios.
31
+ * @param {boolean} isDisabled - Whether the PromoCard is disabled.
32
+ * @param {Function} onClick - Click event handler for the PromoCard.
33
+ * @param {string} rel - Relationship between the URL and the current page.
34
+ * @param {number} tabIndex - Tab index for keyboard navigation.
35
+ * @param {string} target - Target window for links.
36
+ * @param {string} testId - ID used for testing.
37
+ * @param {string} title - Title text of the PromoCard.
38
+ * @param {('checkbox'|'radio')} type - Type of the PromoCard (checkbox, radio).
39
+ * @param {string} value - Value for checkboxes and radios.
40
+ * @returns {JSX.Element} The rendered PromoCard component.
41
+ * @example
42
+ * <PromoCard
43
+ * title="Example PromoCard"
44
+ * description="This is an example PromoCard with a link variation."
45
+ * href="https://example.com"
46
+ * target="_blank"
47
+ * imageSource="https://example.com/image.png"
48
+ * imageAlt="Example Image"
49
+ * indicatorLabel="Learn More"
50
+ * />
51
+ */export default/*#__PURE__*/React.memo(PromoCard);
@@ -0,0 +1,13 @@
1
+ import _defineProperty from"@babel/runtime/helpers/defineProperty";import"core-js/modules/es.object.keys.js";import"core-js/modules/es.symbol.js";import"core-js/modules/es.array.filter.js";import"core-js/modules/es.object.to-string.js";import"core-js/modules/es.object.get-own-property-descriptor.js";import"core-js/modules/web.dom-collections.for-each.js";import"core-js/modules/es.object.get-own-property-descriptors.js";function ownKeys(a,b){var c=Object.keys(a);if(Object.getOwnPropertySymbols){var d=Object.getOwnPropertySymbols(a);b&&(d=d.filter(function(b){return Object.getOwnPropertyDescriptor(a,b).enumerable})),c.push.apply(c,d)}return c}function _objectSpread(a){for(var b,c=1;c<arguments.length;c++)b=null==arguments[c]?{}:arguments[c],c%2?ownKeys(Object(b),!0).forEach(function(c){_defineProperty(a,c,b[c])}):Object.getOwnPropertyDescriptors?Object.defineProperties(a,Object.getOwnPropertyDescriptors(b)):ownKeys(Object(b)).forEach(function(c){Object.defineProperty(a,c,Object.getOwnPropertyDescriptor(b,c))});return a}import{render,fireEvent,screen}from"@testing-library/react";import React from"react";import PromoCard from"./PromoCard";import{jsx as _jsx}from"react/jsx-runtime";describe("PromoCard",function(){var a,b={title:"Test Title",imageSource:"test.jpg",imageAlt:"Test Image",description:"Test Description",indicatorLabel:"Test Indicator Label",testId:"test-promo-card"};beforeEach(function(){var c=render(/*#__PURE__*/_jsx(PromoCard,_objectSpread({},b))),d=c.rerender;a=function(a){d(/*#__PURE__*/_jsx(PromoCard,_objectSpread(_objectSpread({},b),a)))}}),it("matches snapshot",function(){var a=render(/*#__PURE__*/_jsx(PromoCard,_objectSpread(_objectSpread({},b),{},{id:"test-promo-card"}))),c=a.container;expect(c.firstChild).toMatchSnapshot()}),it("renders",function(){var c=_objectSpread(_objectSpread({},b),{},{title:"Test text"});// Change props
2
+ expect(screen.getByTestId("test-promo-card")).toBeInTheDocument(),expect(screen.getByTestId("test-promo-card")).toHaveClass("np-Card--promoCard"),a(c),expect(screen.getByText("Test text")).toBeInTheDocument()}),it("renders title as an `h3`",function(){var c=_objectSpread(_objectSpread({},b),{},{headingLevel:"h4"});// Change props
3
+ expect(screen.getByRole("heading",{level:3})).toBeInTheDocument(),expect(screen.queryByRole("heading",{level:4})).not.toBeInTheDocument(),a(c),expect(screen.getByRole("heading",{level:4})).toBeInTheDocument(),expect(screen.queryByRole("heading",{level:3})).not.toBeInTheDocument()}),it("renders as an link element",function(){var c=_objectSpread(_objectSpread({},b),{},{href:"https://wise.com/"});// Change props
4
+ expect(screen.getByTestId("test-promo-card")).not.toHaveClass("np-Card--link"),expect(screen.getByText("Test Title")).not.toHaveAttribute("href"),a(c),expect(screen.getByTestId("test-promo-card")).toHaveClass("np-Card--link"),expect(screen.getByText("Test Title")).toHaveAttribute("href")}),it("renders the component with checkbox props",function(){var c=_objectSpread(_objectSpread({},b),{},{type:"checkbox"// or 'radio'
5
+ });// Change props
6
+ expect(screen.getByTestId("test-promo-card")).not.toHaveClass("np-Card--checked"),expect(screen.queryByRole("checkbox")).not.toBeInTheDocument(),a(c),expect(screen.getByTestId("test-promo-card")).toHaveClass("np-Card--checked"),expect(screen.getByRole("checkbox")).toBeInTheDocument()}),it("renders the component with radio props",function(){var c=_objectSpread(_objectSpread({},b),{},{type:"radio"// or 'checkbox'
7
+ });// Change props
8
+ expect(screen.getByTestId("test-promo-card")).not.toHaveClass("np-Card--checked"),expect(screen.queryByRole("radio")).not.toBeInTheDocument(),a(c),expect(screen.getByTestId("test-promo-card")).toHaveClass("np-Card--checked"),expect(screen.getByRole("radio")).toBeInTheDocument()}),it("doesnt render as a link or checked card when `herf` or `type` has been set",function(){var c=_objectSpread(_objectSpread({},b),{},{type:"radio",// or 'checkbox'
9
+ href:"https://wise.com/"});// Change props
10
+ a(c),expect(screen.getByTestId("test-promo-card")).not.toHaveClass("np-Card--checked"),expect(screen.getByTestId("test-promo-card")).not.toHaveClass("np-Card--link"),expect(screen.queryByRole("radio")).not.toBeInTheDocument(),expect(screen.getByText("Test Title")).not.toHaveAttribute("href")}),it("is set with class by the `className` prop",function(){var c=_objectSpread(_objectSpread({},b),{},{className:"test-custom"});// Change props
11
+ expect(screen.getByTestId("test-promo-card")).not.toHaveClass("test-custom"),a(c),expect(screen.getByTestId("test-promo-card")).toHaveClass("test-custom")}),it("applies `is-disabled` class when isDisabled is true",function(){var c=_objectSpread(_objectSpread({},b),{},{isDisabled:!0});// Change props
12
+ expect(screen.getByTestId("test-promo-card")).not.toHaveClass("is-disabled"),a(c),expect(screen.getByTestId("test-promo-card")).toHaveClass("is-disabled")}),it("calls the onClick function when the checkbox is clicked",function(){var c=_objectSpread(_objectSpread({},b),{},{type:"checkbox",isChecked:!1});// Change props
13
+ a(c),expect(screen.getByTestId("test-promo-card")).not.toHaveClass("is-checked"),fireEvent.click(screen.getByRole("checkbox")),expect(screen.getByTestId("test-promo-card")).toHaveClass("is-checked")})});
@@ -0,0 +1 @@
1
+ import PromoCard from"./PromoCard";import{jsx as _jsx}from"react/jsx-runtime";import{jsxs as _jsxs}from"react/jsx-runtime";var meta={component:PromoCard,title:"Layouts/PromoCard",tags:["autodocs"]};export default meta;export var Default={args:{description:"A card that lives online and works anywhere. Easy, secure, and always on hand.",title:"Digital",indicatorLabel:"Free",imageSource:"https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp"}};export var Link={args:{description:"A card that lives online and works anywhere. Easy, secure, and always on hand.",title:"Digital",href:"https://wise.com",indicatorLabel:"Free",imageSource:"https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp"}};export var Check={args:{description:"A card that lives online and works anywhere. Easy, secure, and always on hand.",title:"Digital",type:"checkbox",indicatorLabel:"Free",imageSource:"https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp"}};export var DefaultChecked={args:{description:"A card that lives online and works anywhere. Easy, secure, and always on hand.",title:"Digital",type:"checkbox",indicatorLabel:"Free",defaultChecked:!0,imageSource:"https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp"}};export var Disabled={args:{description:"A card that lives online and works anywhere. Easy, secure, and always on hand.",title:"Digital",type:"checkbox",isDisabled:!0,indicatorLabel:"Free",imageSource:"https://wise.com/web-art/assets/illustrations/digital-card-2-medium@2x.webp"}};export var CustomClass={args:{description:"A card that lives online and works anywhere. Easy, secure, and always on hand.",title:"Digital",href:"https://wise.com",className:"np-CustomPromoCard",indicatorLabel:"Free",imageSource:"https://wise.com/web-art/assets/illustrations/digital-card-medium@2x.webp"},decorators:[function(a){return/*#__PURE__*/_jsxs("div",{children:[/*#__PURE__*/_jsx("style",{children:"\n .np-CustomPromoCard {\n --Card-background-color: var(--color-bright-yellow);\n --Card-indicator-icon-background-color: var(--color-dark-gold);\n --Card-indicator-icon-color: var(--color-contrast);\n }\n "}),/*#__PURE__*/_jsx(a,{})]})}]};
@@ -0,0 +1,19 @@
1
+ import{useContext,createContext}from"react";/**
2
+ * The type of the PromoCard context object.
3
+ *
4
+ * The context object contains the current state of the PromoCard group, whether
5
+ * the group is disabled or not, and a function to call when the group value
6
+ * changes. This value is used to provide context to child PromoCard components,
7
+ * allowing them to interact with the group and update its state.
8
+ */var defaultPromoCardContext={state:"",isDisabled:!1,// eslint-disable-next-line @typescript-eslint/no-empty-function
9
+ onChange:function onChange(){}};/**
10
+ * The PromoCard context object.
11
+ */export var PromoCardContext=/*#__PURE__*/createContext(defaultPromoCardContext);/**
12
+ * A custom hook for accessing the PromoCard context object.
13
+ *
14
+ * The `usePromoCardContext` hook is used to access the PromoCard context object
15
+ * from within a child PromoCard component. It throws an error if the context
16
+ * object is not available, which can help with debugging and development.
17
+ *
18
+ * @returns {PromoCardContextType} - The PromoCard context object.
19
+ */export var usePromoCardContext=function(){return useContext(PromoCardContext)};export default PromoCardContext;
@@ -0,0 +1,4 @@
1
+ import"core-js/modules/es.object.to-string.js";import"core-js/modules/es.regexp.to-string.js";import{render,screen}from"@testing-library/react";import React from"react";import{PromoCardContext,usePromoCardContext}from"./PromoCardContext";// A simple component that consumes the context
2
+ import{jsx as _jsx}from"react/jsx-runtime";import{jsxs as _jsxs}from"react/jsx-runtime";var TestComponent=function(){var a=usePromoCardContext();return/*#__PURE__*/_jsxs("div",{children:[/*#__PURE__*/_jsx("p",{children:"Value: ".concat(a.state)}),/*#__PURE__*/_jsx("p",{children:"Disabled: ".concat(a.isDisabled.toString())})]})};describe("PromoCardContext",function(){it("default values are accessible",function(){var a={state:"",isDisabled:!1,onChange:jest.fn()// You can mock this function for testing
3
+ };render(/*#__PURE__*/_jsx(PromoCardContext.Provider,{value:a,children:/*#__PURE__*/_jsx(TestComponent,{})})),expect(screen.getByText("Value:")).toBeInTheDocument(),expect(screen.getByText("Disabled: false")).toBeInTheDocument()}),it("context value changes are reflected",function(){var a={state:"new value",isDisabled:!0,onChange:jest.fn()// You can mock this function for testing
4
+ };render(/*#__PURE__*/_jsx(PromoCardContext.Provider,{value:a,children:/*#__PURE__*/_jsx(TestComponent,{})})),expect(screen.getByText("Value: new value")).toBeInTheDocument(),expect(screen.getByText("Disabled: true")).toBeInTheDocument()})});