@transferwise/components 0.0.0-experimental-be73f56 → 0.0.0-experimental-2fa5e3f

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 (58) hide show
  1. package/build/card/Card.js +20 -13
  2. package/build/card/Card.js.map +1 -1
  3. package/build/card/Card.mjs +21 -14
  4. package/build/card/Card.mjs.map +1 -1
  5. package/build/common/Option/Option.js.map +1 -1
  6. package/build/common/Option/Option.mjs.map +1 -1
  7. package/build/i18n/en.json +0 -1
  8. package/build/i18n/en.json.js +0 -1
  9. package/build/i18n/en.json.js.map +1 -1
  10. package/build/i18n/en.json.mjs +0 -1
  11. package/build/i18n/en.json.mjs.map +1 -1
  12. package/build/main.css +0 -6
  13. package/build/styles/main.css +0 -6
  14. package/build/styles/upload/Upload.css +0 -6
  15. package/build/types/card/Card.d.ts.map +1 -1
  16. package/build/types/common/Option/Option.d.ts +2 -0
  17. package/build/types/common/Option/Option.d.ts.map +1 -1
  18. package/build/types/upload/Upload.d.ts +0 -1
  19. package/build/types/upload/Upload.d.ts.map +1 -1
  20. package/build/types/upload/Upload.messages.d.ts +0 -4
  21. package/build/types/upload/Upload.messages.d.ts.map +1 -1
  22. package/build/types/upload/steps/completeStep/completeStep.d.ts +3 -1
  23. package/build/types/upload/steps/completeStep/completeStep.d.ts.map +1 -1
  24. package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts +0 -1
  25. package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts.map +1 -1
  26. package/build/upload/Upload.js +12 -26
  27. package/build/upload/Upload.js.map +1 -1
  28. package/build/upload/Upload.messages.js +0 -3
  29. package/build/upload/Upload.messages.js.map +1 -1
  30. package/build/upload/Upload.messages.mjs +0 -3
  31. package/build/upload/Upload.messages.mjs.map +1 -1
  32. package/build/upload/Upload.mjs +12 -26
  33. package/build/upload/Upload.mjs.map +1 -1
  34. package/build/upload/steps/completeStep/completeStep.js +30 -15
  35. package/build/upload/steps/completeStep/completeStep.js.map +1 -1
  36. package/build/upload/steps/completeStep/completeStep.mjs +31 -16
  37. package/build/upload/steps/completeStep/completeStep.mjs.map +1 -1
  38. package/build/upload/steps/uploadImageStep/uploadImageStep.js +32 -56
  39. package/build/upload/steps/uploadImageStep/uploadImageStep.js.map +1 -1
  40. package/build/upload/steps/uploadImageStep/uploadImageStep.mjs +32 -56
  41. package/build/upload/steps/uploadImageStep/uploadImageStep.mjs.map +1 -1
  42. package/package.json +3 -3
  43. package/src/card/Card.spec.tsx +35 -3
  44. package/src/card/Card.story.tsx +56 -40
  45. package/src/card/Card.tsx +32 -14
  46. package/src/common/Option/Option.tsx +2 -0
  47. package/src/i18n/en.json +0 -1
  48. package/src/main.css +0 -6
  49. package/src/upload/Upload.css +0 -6
  50. package/src/upload/Upload.less +0 -5
  51. package/src/upload/Upload.messages.ts +0 -4
  52. package/src/upload/Upload.spec.js +7 -8
  53. package/src/upload/Upload.story.tsx +0 -18
  54. package/src/upload/Upload.tsx +20 -39
  55. package/src/upload/steps/completeStep/completeStep.spec.js +9 -0
  56. package/src/upload/steps/completeStep/completeStep.tsx +29 -14
  57. package/src/upload/steps/uploadImageStep/uploadImageStep.spec.js +0 -12
  58. package/src/upload/steps/uploadImageStep/uploadImageStep.tsx +24 -43
@@ -2,11 +2,7 @@
2
2
 
3
3
  var icons = require('@transferwise/icons');
4
4
  var React = require('react');
5
- var StatusIcon = require('../../../statusIcon/StatusIcon.js');
6
- var InlineAlert = require('../../../inlineAlert/InlineAlert.js');
7
5
  var jsxRuntime = require('react/jsx-runtime');
8
- var sentiment = require('../../../common/propsValues/sentiment.js');
9
- var size = require('../../../common/propsValues/size.js');
10
6
 
11
7
  class UploadImageStep extends React.PureComponent {
12
8
  uploadInputRef = /*#__PURE__*/React.createRef();
@@ -24,18 +20,6 @@ class UploadImageStep extends React.PureComponent {
24
20
  usHelpImage,
25
21
  usLabel
26
22
  } = this.props;
27
- const {
28
- errorMessage
29
- } = this.props;
30
- if (errorMessage) {
31
- return /*#__PURE__*/jsxRuntime.jsx("div", {
32
- className: "d-flex flex-column align-items-center",
33
- children: /*#__PURE__*/jsxRuntime.jsx(StatusIcon, {
34
- size: size.Size.LARGE,
35
- sentiment: sentiment.Sentiment.NEGATIVE
36
- })
37
- });
38
- }
39
23
  if (!usHelpImage) {
40
24
  return /*#__PURE__*/jsxRuntime.jsx("div", {
41
25
  className: "circle circle-sm circle-inverse p-t-1",
@@ -60,49 +44,41 @@ class UploadImageStep extends React.PureComponent {
60
44
  usButtonText,
61
45
  usDisabled,
62
46
  usLabel,
63
- usPlaceholder,
64
- errorMessage
47
+ usPlaceholder
65
48
  } = this.props;
66
49
  return /*#__PURE__*/jsxRuntime.jsx("div", {
67
- className: "droppable-default-card",
68
- "aria-hidden": isComplete,
69
- children: /*#__PURE__*/jsxRuntime.jsxs("div", {
70
- className: "droppable-card-content",
71
- children: [/*#__PURE__*/jsxRuntime.jsx("div", {
72
- className: "m-b-3",
73
- children: this.getImage()
74
- }), usLabel && /*#__PURE__*/jsxRuntime.jsx("h4", {
75
- className: "np-text-title-body m-b-1",
76
- children: usLabel
77
- }), usPlaceholder && /*#__PURE__*/jsxRuntime.jsx("p", {
78
- className: "np-text-body-large m-b-3",
79
- children: String(usPlaceholder)
80
- }), /*#__PURE__*/jsxRuntime.jsxs("label", {
81
- className: `btn btn-primary btn-md ${usDisabled ? 'disabled' : ''}`,
82
- children: [usButtonText ? /*#__PURE__*/jsxRuntime.jsx("span", {
83
- children: usButtonText
84
- }) : /*#__PURE__*/jsxRuntime.jsx(icons.Upload, {
85
- size: 24,
86
- className: "m-r-0"
87
- }), /*#__PURE__*/jsxRuntime.jsx("input", {
88
- ref: this.uploadInputRef,
89
- type: "file",
90
- accept: usAccept === '*' ? undefined : usAccept,
91
- className: "tw-droppable-input hidden",
92
- disabled: usDisabled,
93
- name: "file-upload",
94
- onChange: () => this.onManualUpload()
50
+ children: /*#__PURE__*/jsxRuntime.jsx("div", {
51
+ className: "droppable-default-card",
52
+ "aria-hidden": isComplete,
53
+ children: /*#__PURE__*/jsxRuntime.jsxs("div", {
54
+ className: "droppable-card-content",
55
+ children: [/*#__PURE__*/jsxRuntime.jsx("div", {
56
+ className: "m-b-3",
57
+ children: this.getImage()
58
+ }), usLabel && /*#__PURE__*/jsxRuntime.jsx("h4", {
59
+ className: "np-text-title-body m-b-1",
60
+ children: usLabel
61
+ }), usPlaceholder && /*#__PURE__*/jsxRuntime.jsx("p", {
62
+ className: "np-text-body-large m-b-3",
63
+ children: String(usPlaceholder)
64
+ }), /*#__PURE__*/jsxRuntime.jsxs("label", {
65
+ className: `btn btn-primary btn-md ${usDisabled ? 'disabled' : ''}`,
66
+ children: [usButtonText ? /*#__PURE__*/jsxRuntime.jsx("span", {
67
+ children: usButtonText
68
+ }) : /*#__PURE__*/jsxRuntime.jsx(icons.Upload, {
69
+ size: 24,
70
+ className: "m-r-0"
71
+ }), /*#__PURE__*/jsxRuntime.jsx("input", {
72
+ ref: this.uploadInputRef,
73
+ type: "file",
74
+ accept: usAccept === '*' ? undefined : usAccept,
75
+ className: "tw-droppable-input hidden",
76
+ disabled: usDisabled,
77
+ name: "file-upload",
78
+ onChange: () => this.onManualUpload()
79
+ })]
95
80
  })]
96
- }), errorMessage && /*#__PURE__*/jsxRuntime.jsx("div", {
97
- className: "upload-error-message",
98
- children: /*#__PURE__*/jsxRuntime.jsx("div", {
99
- className: "m-t-3 has-error",
100
- children: /*#__PURE__*/jsxRuntime.jsx(InlineAlert, {
101
- type: sentiment.Sentiment.NEGATIVE,
102
- children: errorMessage
103
- })
104
- })
105
- })]
81
+ })
106
82
  })
107
83
  });
108
84
  }
@@ -1 +1 @@
1
- {"version":3,"file":"uploadImageStep.js","sources":["../../../../src/upload/steps/uploadImageStep/uploadImageStep.tsx"],"sourcesContent":["import { Upload as UploadIcon } from '@transferwise/icons';\nimport { createRef, PureComponent } from 'react';\nimport StatusIcon from '../../../statusIcon';\nimport { Sentiment, Size } from '../../../common';\nimport InlineAlert from '../../../inlineAlert';\n\nexport interface UploadImageStepProps {\n fileDropped: (file: File) => void;\n isComplete: boolean;\n usAccept: string;\n usButtonText: string;\n usDisabled: boolean;\n usHelpImage: React.ReactNode;\n usLabel: string;\n usPlaceholder: string;\n errorMessage?: string | string[];\n}\n\nexport default class UploadImageStep extends PureComponent<UploadImageStepProps> {\n uploadInputRef = createRef<HTMLInputElement>();\n\n onManualUpload = () => {\n const { fileDropped } = this.props;\n const file = this.uploadInputRef.current?.files?.[0];\n if (file != null) {\n fileDropped(file);\n }\n };\n\n getImage = () => {\n const { usHelpImage, usLabel } = this.props;\n const { errorMessage } = this.props;\n\n if (errorMessage) {\n return (\n <div className=\"d-flex flex-column align-items-center\">\n <StatusIcon size={Size.LARGE} sentiment={Sentiment.NEGATIVE} />\n </div>\n );\n }\n\n if (!usHelpImage) {\n return (\n <div className=\"circle circle-sm circle-inverse p-t-1\">\n <UploadIcon size={24} />\n </div>\n );\n }\n\n if (typeof usHelpImage === 'string') {\n return <img src={usHelpImage} alt={usLabel} className=\"thumbnail text-xs-center\" />;\n }\n\n return usHelpImage;\n };\n\n render() {\n const { isComplete, usAccept, usButtonText, usDisabled, usLabel, usPlaceholder, errorMessage } =\n this.props;\n\n return (\n <div className=\"droppable-default-card\" aria-hidden={isComplete}>\n <div className=\"droppable-card-content\">\n <div className=\"m-b-3\">{this.getImage()}</div>\n {usLabel && <h4 className=\"np-text-title-body m-b-1\">{usLabel}</h4>}\n {usPlaceholder && <p className=\"np-text-body-large m-b-3\">{String(usPlaceholder)}</p>}\n <label className={`btn btn-primary btn-md ${usDisabled ? 'disabled' : ''}`}>\n {usButtonText ? (\n <span>{usButtonText}</span>\n ) : (\n <UploadIcon size={24} className=\"m-r-0\" />\n )}\n <input\n ref={this.uploadInputRef}\n type=\"file\"\n accept={usAccept === '*' ? undefined : usAccept}\n className=\"tw-droppable-input hidden\"\n disabled={usDisabled}\n name=\"file-upload\"\n onChange={() => this.onManualUpload()}\n />\n </label>\n {errorMessage && (\n <div className=\"upload-error-message\">\n <div className=\"m-t-3 has-error\">\n <InlineAlert type={Sentiment.NEGATIVE}>{errorMessage}</InlineAlert>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n }\n}\n"],"names":["UploadImageStep","PureComponent","uploadInputRef","createRef","onManualUpload","fileDropped","props","file","current","files","getImage","usHelpImage","usLabel","errorMessage","_jsx","className","children","StatusIcon","size","Size","LARGE","sentiment","Sentiment","NEGATIVE","UploadIcon","src","alt","render","isComplete","usAccept","usButtonText","usDisabled","usPlaceholder","_jsxs","String","ref","type","accept","undefined","disabled","name","onChange","InlineAlert"],"mappings":"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"}
1
+ {"version":3,"file":"uploadImageStep.js","sources":["../../../../src/upload/steps/uploadImageStep/uploadImageStep.tsx"],"sourcesContent":["import { Upload as UploadIcon } from '@transferwise/icons';\nimport { createRef, PureComponent } from 'react';\n\nexport interface UploadImageStepProps {\n fileDropped: (file: File) => void;\n isComplete: boolean;\n usAccept: string;\n usButtonText: string;\n usDisabled: boolean;\n usHelpImage: React.ReactNode;\n usLabel: string;\n usPlaceholder: string;\n}\n\nexport default class UploadImageStep extends PureComponent<UploadImageStepProps> {\n uploadInputRef = createRef<HTMLInputElement>();\n\n onManualUpload = () => {\n const { fileDropped } = this.props;\n const file = this.uploadInputRef.current?.files?.[0];\n if (file != null) {\n fileDropped(file);\n }\n };\n\n getImage = () => {\n const { usHelpImage, usLabel } = this.props;\n\n if (!usHelpImage) {\n return (\n <div className=\"circle circle-sm circle-inverse p-t-1\">\n <UploadIcon size={24} />\n </div>\n );\n }\n\n if (typeof usHelpImage === 'string') {\n return <img src={usHelpImage} alt={usLabel} className=\"thumbnail text-xs-center\" />;\n }\n\n return usHelpImage;\n };\n\n render() {\n const { isComplete, usAccept, usButtonText, usDisabled, usLabel, usPlaceholder } = this.props;\n\n return (\n <div>\n <div className=\"droppable-default-card\" aria-hidden={isComplete}>\n <div className=\"droppable-card-content\">\n <div className=\"m-b-3\">{this.getImage()}</div>\n {usLabel && <h4 className=\"np-text-title-body m-b-1\">{usLabel}</h4>}\n {usPlaceholder && <p className=\"np-text-body-large m-b-3\">{String(usPlaceholder)}</p>}\n <label className={`btn btn-primary btn-md ${usDisabled ? 'disabled' : ''}`}>\n {usButtonText ? (\n <span>{usButtonText}</span>\n ) : (\n <UploadIcon size={24} className=\"m-r-0\" />\n )}\n <input\n ref={this.uploadInputRef}\n type=\"file\"\n accept={usAccept === '*' ? undefined : usAccept}\n className=\"tw-droppable-input hidden\"\n disabled={usDisabled}\n name=\"file-upload\"\n onChange={() => this.onManualUpload()}\n />\n </label>\n </div>\n </div>\n </div>\n );\n }\n}\n"],"names":["UploadImageStep","PureComponent","uploadInputRef","createRef","onManualUpload","fileDropped","props","file","current","files","getImage","usHelpImage","usLabel","_jsx","className","children","UploadIcon","size","src","alt","render","isComplete","usAccept","usButtonText","usDisabled","usPlaceholder","_jsxs","String","ref","type","accept","undefined","disabled","name","onChange"],"mappings":"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"}
@@ -1,10 +1,6 @@
1
1
  import { Upload } from '@transferwise/icons';
2
2
  import { PureComponent, createRef } from 'react';
3
- import StatusIcon from '../../../statusIcon/StatusIcon.mjs';
4
- import InlineAlert from '../../../inlineAlert/InlineAlert.mjs';
5
3
  import { jsx, jsxs } from 'react/jsx-runtime';
6
- import { Sentiment } from '../../../common/propsValues/sentiment.mjs';
7
- import { Size } from '../../../common/propsValues/size.mjs';
8
4
 
9
5
  class UploadImageStep extends PureComponent {
10
6
  uploadInputRef = /*#__PURE__*/createRef();
@@ -22,18 +18,6 @@ class UploadImageStep extends PureComponent {
22
18
  usHelpImage,
23
19
  usLabel
24
20
  } = this.props;
25
- const {
26
- errorMessage
27
- } = this.props;
28
- if (errorMessage) {
29
- return /*#__PURE__*/jsx("div", {
30
- className: "d-flex flex-column align-items-center",
31
- children: /*#__PURE__*/jsx(StatusIcon, {
32
- size: Size.LARGE,
33
- sentiment: Sentiment.NEGATIVE
34
- })
35
- });
36
- }
37
21
  if (!usHelpImage) {
38
22
  return /*#__PURE__*/jsx("div", {
39
23
  className: "circle circle-sm circle-inverse p-t-1",
@@ -58,49 +42,41 @@ class UploadImageStep extends PureComponent {
58
42
  usButtonText,
59
43
  usDisabled,
60
44
  usLabel,
61
- usPlaceholder,
62
- errorMessage
45
+ usPlaceholder
63
46
  } = this.props;
64
47
  return /*#__PURE__*/jsx("div", {
65
- className: "droppable-default-card",
66
- "aria-hidden": isComplete,
67
- children: /*#__PURE__*/jsxs("div", {
68
- className: "droppable-card-content",
69
- children: [/*#__PURE__*/jsx("div", {
70
- className: "m-b-3",
71
- children: this.getImage()
72
- }), usLabel && /*#__PURE__*/jsx("h4", {
73
- className: "np-text-title-body m-b-1",
74
- children: usLabel
75
- }), usPlaceholder && /*#__PURE__*/jsx("p", {
76
- className: "np-text-body-large m-b-3",
77
- children: String(usPlaceholder)
78
- }), /*#__PURE__*/jsxs("label", {
79
- className: `btn btn-primary btn-md ${usDisabled ? 'disabled' : ''}`,
80
- children: [usButtonText ? /*#__PURE__*/jsx("span", {
81
- children: usButtonText
82
- }) : /*#__PURE__*/jsx(Upload, {
83
- size: 24,
84
- className: "m-r-0"
85
- }), /*#__PURE__*/jsx("input", {
86
- ref: this.uploadInputRef,
87
- type: "file",
88
- accept: usAccept === '*' ? undefined : usAccept,
89
- className: "tw-droppable-input hidden",
90
- disabled: usDisabled,
91
- name: "file-upload",
92
- onChange: () => this.onManualUpload()
48
+ children: /*#__PURE__*/jsx("div", {
49
+ className: "droppable-default-card",
50
+ "aria-hidden": isComplete,
51
+ children: /*#__PURE__*/jsxs("div", {
52
+ className: "droppable-card-content",
53
+ children: [/*#__PURE__*/jsx("div", {
54
+ className: "m-b-3",
55
+ children: this.getImage()
56
+ }), usLabel && /*#__PURE__*/jsx("h4", {
57
+ className: "np-text-title-body m-b-1",
58
+ children: usLabel
59
+ }), usPlaceholder && /*#__PURE__*/jsx("p", {
60
+ className: "np-text-body-large m-b-3",
61
+ children: String(usPlaceholder)
62
+ }), /*#__PURE__*/jsxs("label", {
63
+ className: `btn btn-primary btn-md ${usDisabled ? 'disabled' : ''}`,
64
+ children: [usButtonText ? /*#__PURE__*/jsx("span", {
65
+ children: usButtonText
66
+ }) : /*#__PURE__*/jsx(Upload, {
67
+ size: 24,
68
+ className: "m-r-0"
69
+ }), /*#__PURE__*/jsx("input", {
70
+ ref: this.uploadInputRef,
71
+ type: "file",
72
+ accept: usAccept === '*' ? undefined : usAccept,
73
+ className: "tw-droppable-input hidden",
74
+ disabled: usDisabled,
75
+ name: "file-upload",
76
+ onChange: () => this.onManualUpload()
77
+ })]
93
78
  })]
94
- }), errorMessage && /*#__PURE__*/jsx("div", {
95
- className: "upload-error-message",
96
- children: /*#__PURE__*/jsx("div", {
97
- className: "m-t-3 has-error",
98
- children: /*#__PURE__*/jsx(InlineAlert, {
99
- type: Sentiment.NEGATIVE,
100
- children: errorMessage
101
- })
102
- })
103
- })]
79
+ })
104
80
  })
105
81
  });
106
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"uploadImageStep.mjs","sources":["../../../../src/upload/steps/uploadImageStep/uploadImageStep.tsx"],"sourcesContent":["import { Upload as UploadIcon } from '@transferwise/icons';\nimport { createRef, PureComponent } from 'react';\nimport StatusIcon from '../../../statusIcon';\nimport { Sentiment, Size } from '../../../common';\nimport InlineAlert from '../../../inlineAlert';\n\nexport interface UploadImageStepProps {\n fileDropped: (file: File) => void;\n isComplete: boolean;\n usAccept: string;\n usButtonText: string;\n usDisabled: boolean;\n usHelpImage: React.ReactNode;\n usLabel: string;\n usPlaceholder: string;\n errorMessage?: string | string[];\n}\n\nexport default class UploadImageStep extends PureComponent<UploadImageStepProps> {\n uploadInputRef = createRef<HTMLInputElement>();\n\n onManualUpload = () => {\n const { fileDropped } = this.props;\n const file = this.uploadInputRef.current?.files?.[0];\n if (file != null) {\n fileDropped(file);\n }\n };\n\n getImage = () => {\n const { usHelpImage, usLabel } = this.props;\n const { errorMessage } = this.props;\n\n if (errorMessage) {\n return (\n <div className=\"d-flex flex-column align-items-center\">\n <StatusIcon size={Size.LARGE} sentiment={Sentiment.NEGATIVE} />\n </div>\n );\n }\n\n if (!usHelpImage) {\n return (\n <div className=\"circle circle-sm circle-inverse p-t-1\">\n <UploadIcon size={24} />\n </div>\n );\n }\n\n if (typeof usHelpImage === 'string') {\n return <img src={usHelpImage} alt={usLabel} className=\"thumbnail text-xs-center\" />;\n }\n\n return usHelpImage;\n };\n\n render() {\n const { isComplete, usAccept, usButtonText, usDisabled, usLabel, usPlaceholder, errorMessage } =\n this.props;\n\n return (\n <div className=\"droppable-default-card\" aria-hidden={isComplete}>\n <div className=\"droppable-card-content\">\n <div className=\"m-b-3\">{this.getImage()}</div>\n {usLabel && <h4 className=\"np-text-title-body m-b-1\">{usLabel}</h4>}\n {usPlaceholder && <p className=\"np-text-body-large m-b-3\">{String(usPlaceholder)}</p>}\n <label className={`btn btn-primary btn-md ${usDisabled ? 'disabled' : ''}`}>\n {usButtonText ? (\n <span>{usButtonText}</span>\n ) : (\n <UploadIcon size={24} className=\"m-r-0\" />\n )}\n <input\n ref={this.uploadInputRef}\n type=\"file\"\n accept={usAccept === '*' ? undefined : usAccept}\n className=\"tw-droppable-input hidden\"\n disabled={usDisabled}\n name=\"file-upload\"\n onChange={() => this.onManualUpload()}\n />\n </label>\n {errorMessage && (\n <div className=\"upload-error-message\">\n <div className=\"m-t-3 has-error\">\n <InlineAlert type={Sentiment.NEGATIVE}>{errorMessage}</InlineAlert>\n </div>\n </div>\n )}\n </div>\n </div>\n );\n }\n}\n"],"names":["UploadImageStep","PureComponent","uploadInputRef","createRef","onManualUpload","fileDropped","props","file","current","files","getImage","usHelpImage","usLabel","errorMessage","_jsx","className","children","StatusIcon","size","Size","LARGE","sentiment","Sentiment","NEGATIVE","UploadIcon","src","alt","render","isComplete","usAccept","usButtonText","usDisabled","usPlaceholder","_jsxs","String","ref","type","accept","undefined","disabled","name","onChange","InlineAlert"],"mappings":"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"}
1
+ {"version":3,"file":"uploadImageStep.mjs","sources":["../../../../src/upload/steps/uploadImageStep/uploadImageStep.tsx"],"sourcesContent":["import { Upload as UploadIcon } from '@transferwise/icons';\nimport { createRef, PureComponent } from 'react';\n\nexport interface UploadImageStepProps {\n fileDropped: (file: File) => void;\n isComplete: boolean;\n usAccept: string;\n usButtonText: string;\n usDisabled: boolean;\n usHelpImage: React.ReactNode;\n usLabel: string;\n usPlaceholder: string;\n}\n\nexport default class UploadImageStep extends PureComponent<UploadImageStepProps> {\n uploadInputRef = createRef<HTMLInputElement>();\n\n onManualUpload = () => {\n const { fileDropped } = this.props;\n const file = this.uploadInputRef.current?.files?.[0];\n if (file != null) {\n fileDropped(file);\n }\n };\n\n getImage = () => {\n const { usHelpImage, usLabel } = this.props;\n\n if (!usHelpImage) {\n return (\n <div className=\"circle circle-sm circle-inverse p-t-1\">\n <UploadIcon size={24} />\n </div>\n );\n }\n\n if (typeof usHelpImage === 'string') {\n return <img src={usHelpImage} alt={usLabel} className=\"thumbnail text-xs-center\" />;\n }\n\n return usHelpImage;\n };\n\n render() {\n const { isComplete, usAccept, usButtonText, usDisabled, usLabel, usPlaceholder } = this.props;\n\n return (\n <div>\n <div className=\"droppable-default-card\" aria-hidden={isComplete}>\n <div className=\"droppable-card-content\">\n <div className=\"m-b-3\">{this.getImage()}</div>\n {usLabel && <h4 className=\"np-text-title-body m-b-1\">{usLabel}</h4>}\n {usPlaceholder && <p className=\"np-text-body-large m-b-3\">{String(usPlaceholder)}</p>}\n <label className={`btn btn-primary btn-md ${usDisabled ? 'disabled' : ''}`}>\n {usButtonText ? (\n <span>{usButtonText}</span>\n ) : (\n <UploadIcon size={24} className=\"m-r-0\" />\n )}\n <input\n ref={this.uploadInputRef}\n type=\"file\"\n accept={usAccept === '*' ? undefined : usAccept}\n className=\"tw-droppable-input hidden\"\n disabled={usDisabled}\n name=\"file-upload\"\n onChange={() => this.onManualUpload()}\n />\n </label>\n </div>\n </div>\n </div>\n );\n }\n}\n"],"names":["UploadImageStep","PureComponent","uploadInputRef","createRef","onManualUpload","fileDropped","props","file","current","files","getImage","usHelpImage","usLabel","_jsx","className","children","UploadIcon","size","src","alt","render","isComplete","usAccept","usButtonText","usDisabled","usPlaceholder","_jsxs","String","ref","type","accept","undefined","disabled","name","onChange"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-be73f56",
3
+ "version": "0.0.0-experimental-2fa5e3f",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -93,12 +93,12 @@
93
93
  "rollup-preserve-directives": "^1.1.1",
94
94
  "storybook": "^8.2.2",
95
95
  "@transferwise/less-config": "3.1.0",
96
- "@transferwise/neptune-css": "0.0.0-experimental-be73f56",
96
+ "@transferwise/neptune-css": "14.12.1",
97
97
  "@wise/components-theming": "1.5.0"
98
98
  },
99
99
  "peerDependencies": {
100
100
  "@transferwise/icons": "^3.7.0",
101
- "@transferwise/neptune-css": "0.0.0-experimental-be73f56",
101
+ "@transferwise/neptune-css": "^14.9.6",
102
102
  "@wise/art": "^2.7.0",
103
103
  "@wise/components-theming": "^1.0.0",
104
104
  "react": ">=18",
@@ -104,17 +104,49 @@ describe('Card', () => {
104
104
  expect(screen.getByTestId('chevron-up-icon')).toHaveClass(Position.BOTTOM);
105
105
  });
106
106
 
107
+
108
+ describe('when collapsed', () => {
109
+ const CONTENT = 'mock children';
110
+
111
+ it('should not render children', async () => {
112
+ renderCard({ children: CONTENT });
113
+ expect(screen.queryByText(CONTENT)).not.toBeInTheDocument();
114
+ });
115
+
116
+ it('should render appropriate aria attributes', async () => {
117
+ renderCard({ children: CONTENT });
118
+ const button = screen.getByRole('button');
119
+ expect(button).toHaveAttribute('aria-expanded', 'false')
120
+ expect(button).not.toHaveAttribute('aria-controls')
121
+ });
122
+ });
123
+
107
124
  describe('when expanded', () => {
125
+ const defaultProps = {
126
+ children: 'mock children',
127
+ isExpanded: true,
128
+ };
129
+
108
130
  it('flips chevron', () => {
109
- renderCard({ children: 'mock children', isExpanded: true });
131
+ renderCard(defaultProps);
110
132
 
111
133
  expect(screen.getByTestId('chevron-up-icon')).toHaveClass(Position.TOP);
112
134
  });
113
135
 
114
136
  it('renders children', () => {
115
- renderCard({ children: 'mock children', isExpanded: true });
137
+ renderCard(defaultProps);
138
+
139
+ expect(screen.getByText(defaultProps.children)).toBeInTheDocument();
140
+ });
141
+
142
+ it('should render appropriate aria attributes', async () => {
143
+ const {container} = renderCard(defaultProps);
144
+ const button = screen.getByRole('button');
145
+ const controlledId = button.getAttribute('aria-controls');
146
+ expect(button).toHaveAttribute('aria-expanded', 'true')
116
147
 
117
- expect(screen.getByText('mock children')).toBeInTheDocument();
148
+ const contentId = screen.getByText(defaultProps.children).getAttribute('id');
149
+ expect(contentId).toBe(controlledId);
118
150
  });
119
151
  });
120
152
  });
@@ -1,54 +1,70 @@
1
- import { select, text } from '@storybook/addon-knobs';
1
+ import { Meta, StoryObj } from '@storybook/react';
2
2
  import { FastFlag as FastFlagIcon } from '@transferwise/icons';
3
3
  import { useState } from 'react';
4
+ import { fn } from '@storybook/test';
4
5
 
5
6
  import Card from '.';
6
- import { CardProps } from './Card';
7
+
8
+ type Story = StoryObj<typeof Card>;
7
9
 
8
10
  export default {
9
11
  component: Card,
10
12
  title: 'Layouts/Card',
11
- };
13
+ args: {
14
+ title: 'A card',
15
+ details: 'Some details about this card',
16
+ children: 'Lorem ipsum dolor sit amet.',
17
+ onClick: fn(),
18
+ as: 'div',
19
+ },
20
+ tags: ['autodocs'],
21
+ } satisfies Meta<typeof Card>;
12
22
 
13
- const Template = (props: Pick<CardProps, 'isExpanded' | 'icon' | 'onClick'>) => {
14
- const elementType = select('elementType', ['div', 'li'], 'div');
15
- const title = text('title', 'A card');
16
- const details = text('details', 'Some details about this card');
17
- const content = text('content', 'Lorem ipsum dolor sit amet.');
18
-
19
- return (
20
- <Card as={elementType} title={title} details={details} {...props}>
21
- {content}
22
- </Card>
23
- );
24
- };
25
23
 
26
- export const Basic = () => {
27
- const [isExpanded, setIsExpanded] = useState(false);
24
+ export const Basic: Story = {
25
+ render: function Render(args) {
26
+ const [isExpanded, setIsExpanded] = useState(false);
27
+
28
+ const handleClick = (isCurrentExpanded: boolean) => {
29
+ setIsExpanded(isCurrentExpanded)
30
+ args?.onClick?.(!isExpanded);
31
+ }
28
32
 
29
- return <Template isExpanded={isExpanded} onClick={setIsExpanded} />;
33
+ return <Card {...args} isExpanded={isExpanded} onClick={handleClick} />;
34
+ }
30
35
  };
31
36
 
32
- export const Multiple = () => {
33
- const [expandedCardIndex, setExpandedCardIndex] = useState<number | null>(0);
34
-
35
- const handleOnCardClick = (index: number) => {
36
- setExpandedCardIndex(index !== expandedCardIndex ? index : null);
37
- };
38
-
39
- return (
40
- <>
41
- <Template
42
- icon={<FastFlagIcon />}
43
- isExpanded={expandedCardIndex === 0}
44
- onClick={() => handleOnCardClick(0)}
45
- />
46
- <Template
47
- icon={<FastFlagIcon />}
48
- isExpanded={expandedCardIndex === 1}
49
- onClick={() => handleOnCardClick(1)}
50
- />
51
- <Template isExpanded={expandedCardIndex === 2} onClick={() => handleOnCardClick(2)} />
52
- </>
53
- );
37
+
38
+ export const Multiple: Story = {
39
+ render: function Render(args) {
40
+ const [expandedCardIndex, setExpandedCardIndex] = useState<number | null>(0);
41
+
42
+ const handleOnCardClick = (index: number) => {
43
+ args?.onClick?.(index !== expandedCardIndex);
44
+ setExpandedCardIndex(index !== expandedCardIndex ? index : null);
45
+ };
46
+
47
+ return (
48
+ <>
49
+ <Card
50
+ {...args}
51
+ icon={<FastFlagIcon />}
52
+ isExpanded={expandedCardIndex === 0}
53
+ onClick={() => handleOnCardClick(0)}
54
+ />
55
+ <Card
56
+ {...args}
57
+ icon={<FastFlagIcon />}
58
+ isExpanded={expandedCardIndex === 1}
59
+ onClick={() => handleOnCardClick(1)}
60
+ />
61
+ <Card
62
+ {...args}
63
+ icon={<FastFlagIcon />}
64
+ isExpanded={expandedCardIndex === 2}
65
+ onClick={() => handleOnCardClick(2)}
66
+ />
67
+ </>
68
+ );
69
+ }
54
70
  };
package/src/card/Card.tsx CHANGED
@@ -1,5 +1,5 @@
1
1
  import { clsx } from 'clsx';
2
- import { forwardRef } from 'react';
2
+ import { forwardRef, useId } from 'react';
3
3
 
4
4
  import Body from '../body';
5
5
  import Chevron from '../chevron';
@@ -40,13 +40,16 @@ const Card = forwardRef(function Card(
40
40
  }: CardProps,
41
41
  reference,
42
42
  ) {
43
- const isOpen = !!(isExpanded && children);
43
+ const labelId = useId();
44
+ const contentId = useId();
45
+ const isExpandable = Boolean(children);
46
+
44
47
 
45
48
  return (
46
49
  <Element
47
50
  ref={reference}
48
51
  className={clsx('np-card', className, {
49
- 'np-card--expanded': isOpen,
52
+ 'np-card--expanded': isExpandable && isExpanded,
50
53
  'np-card--inactive': !children,
51
54
  'np-card--has-icon': !!icon,
52
55
  })}
@@ -54,23 +57,38 @@ const Card = forwardRef(function Card(
54
57
  data-testid={dataTestId}
55
58
  >
56
59
  <Option
60
+ aria-expanded={isExpandable ? isExpanded : undefined}
61
+ aria-controls={isExpanded ? contentId : undefined}
62
+ id={labelId}
57
63
  aria-label={ariaLabel}
58
- as={children ? 'button' : 'div'}
59
- className={clsx('np-card__button')}
64
+ as={isExpandable ? 'button' : 'div'}
65
+ className="np-card__button"
60
66
  media={icon}
61
67
  title={title}
62
68
  content={details}
63
69
  showMediaAtAllSizes
64
- button={children && <Chevron orientation={isOpen ? Position.TOP : Position.BOTTOM} />}
65
- onClick={children ? () => onClick?.(!isExpanded) : undefined}
66
- />
67
- <div
68
- className={clsx('np-card__divider', {
69
- 'np-card__divider--expanded': isOpen,
70
- })}
70
+ button={
71
+ isExpandable ? <Chevron orientation={isExpanded ? Position.TOP : Position.BOTTOM} /> : null
72
+ }
73
+ onClick={isExpandable ? () => onClick?.(!isExpanded) : undefined}
71
74
  />
72
- {isOpen && (
73
- <Body as="span" type={Typography.BODY_LARGE} className="np-card__content d-block">
75
+
76
+ {isExpandable && (
77
+ <div
78
+ className={clsx('np-card__divider', {
79
+ 'np-card__divider--expanded': isExpanded,
80
+ })}
81
+ />
82
+ )}
83
+
84
+ {isExpandable && isExpanded && (
85
+ <Body
86
+ as="div"
87
+ type={Typography.BODY_LARGE}
88
+ className={clsx('np-card__content', isExpanded ? 'd-block' : 'hide')}
89
+ id={contentId}
90
+ aria-labelledby={labelId}
91
+ >
74
92
  {children}
75
93
  </Body>
76
94
  )}
@@ -6,6 +6,8 @@ import { LinkProps } from '../commonProps';
6
6
 
7
7
  export interface BaseOptionProps extends Omit<HTMLAttributes<HTMLElement>, 'title' | 'content'> {
8
8
  'aria-label'?: string;
9
+ 'aria-expanded'?: boolean;
10
+ 'aria-controls'?: string;
9
11
  media?: ReactNode;
10
12
  name?: string;
11
13
  htmlFor?: string;
package/src/i18n/en.json CHANGED
@@ -35,7 +35,6 @@
35
35
  "neptune.Upload.csWrongTypeMessage": "File type not supported. Please try again with a different file",
36
36
  "neptune.Upload.psButtonText": "Cancel",
37
37
  "neptune.Upload.psProcessingText": "Uploading...",
38
- "neptune.Upload.retry": "Retry",
39
38
  "neptune.Upload.usButtonText": "Or select a file",
40
39
  "neptune.Upload.usDropMessage": "Drop file to start upload",
41
40
  "neptune.Upload.usPlaceholder": "Drag and drop a file less than {maxSize}MB",
package/src/main.css CHANGED
@@ -5444,12 +5444,6 @@ html:not([dir="rtl"]) .np-navigation-option {
5444
5444
  .tw-droppable-sm {
5445
5445
  min-height: 245px;
5446
5446
  }
5447
- .upload-error-message {
5448
- margin-top: 24px;
5449
- margin-top: var(--padding-medium);
5450
- border-top: 1px solid rgba(0,0,0,0.10196);
5451
- border-top: 1px solid var(--color-border-neutral);
5452
- }
5453
5447
  .np-upload-button-container {
5454
5448
  border-style: solid;
5455
5449
  }
@@ -13,9 +13,3 @@
13
13
  .tw-droppable-sm {
14
14
  min-height: 245px;
15
15
  }
16
- .upload-error-message {
17
- margin-top: 24px;
18
- margin-top: var(--padding-medium);
19
- border-top: 1px solid rgba(0,0,0,0.10196);
20
- border-top: 1px solid var(--color-border-neutral);
21
- }
@@ -19,8 +19,3 @@
19
19
  .tw-droppable-sm {
20
20
  min-height: 245px;
21
21
  }
22
-
23
- .upload-error-message {
24
- margin-top: var(--padding-medium);
25
- border-top: 1px solid var(--color-border-neutral);
26
- }
@@ -41,8 +41,4 @@ export default defineMessages({
41
41
  id: 'neptune.Upload.usPlaceholder',
42
42
  defaultMessage: 'Drag and drop a file less than {maxSize}MB',
43
43
  },
44
- retry: {
45
- id: 'neptune.Upload.retry',
46
- defaultMessage: 'Retry',
47
- },
48
44
  });