@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.
- package/build/card/Card.js +20 -13
- package/build/card/Card.js.map +1 -1
- package/build/card/Card.mjs +21 -14
- package/build/card/Card.mjs.map +1 -1
- package/build/common/Option/Option.js.map +1 -1
- package/build/common/Option/Option.mjs.map +1 -1
- package/build/i18n/en.json +0 -1
- package/build/i18n/en.json.js +0 -1
- package/build/i18n/en.json.js.map +1 -1
- package/build/i18n/en.json.mjs +0 -1
- package/build/i18n/en.json.mjs.map +1 -1
- package/build/main.css +0 -6
- package/build/styles/main.css +0 -6
- package/build/styles/upload/Upload.css +0 -6
- package/build/types/card/Card.d.ts.map +1 -1
- package/build/types/common/Option/Option.d.ts +2 -0
- package/build/types/common/Option/Option.d.ts.map +1 -1
- package/build/types/upload/Upload.d.ts +0 -1
- package/build/types/upload/Upload.d.ts.map +1 -1
- package/build/types/upload/Upload.messages.d.ts +0 -4
- package/build/types/upload/Upload.messages.d.ts.map +1 -1
- package/build/types/upload/steps/completeStep/completeStep.d.ts +3 -1
- package/build/types/upload/steps/completeStep/completeStep.d.ts.map +1 -1
- package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts +0 -1
- package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts.map +1 -1
- package/build/upload/Upload.js +12 -26
- package/build/upload/Upload.js.map +1 -1
- package/build/upload/Upload.messages.js +0 -3
- package/build/upload/Upload.messages.js.map +1 -1
- package/build/upload/Upload.messages.mjs +0 -3
- package/build/upload/Upload.messages.mjs.map +1 -1
- package/build/upload/Upload.mjs +12 -26
- package/build/upload/Upload.mjs.map +1 -1
- package/build/upload/steps/completeStep/completeStep.js +30 -15
- package/build/upload/steps/completeStep/completeStep.js.map +1 -1
- package/build/upload/steps/completeStep/completeStep.mjs +31 -16
- package/build/upload/steps/completeStep/completeStep.mjs.map +1 -1
- package/build/upload/steps/uploadImageStep/uploadImageStep.js +32 -56
- package/build/upload/steps/uploadImageStep/uploadImageStep.js.map +1 -1
- package/build/upload/steps/uploadImageStep/uploadImageStep.mjs +32 -56
- package/build/upload/steps/uploadImageStep/uploadImageStep.mjs.map +1 -1
- package/package.json +3 -3
- package/src/card/Card.spec.tsx +35 -3
- package/src/card/Card.story.tsx +56 -40
- package/src/card/Card.tsx +32 -14
- package/src/common/Option/Option.tsx +2 -0
- package/src/i18n/en.json +0 -1
- package/src/main.css +0 -6
- package/src/upload/Upload.css +0 -6
- package/src/upload/Upload.less +0 -5
- package/src/upload/Upload.messages.ts +0 -4
- package/src/upload/Upload.spec.js +7 -8
- package/src/upload/Upload.story.tsx +0 -18
- package/src/upload/Upload.tsx +20 -39
- package/src/upload/steps/completeStep/completeStep.spec.js +9 -0
- package/src/upload/steps/completeStep/completeStep.tsx +29 -14
- package/src/upload/steps/uploadImageStep/uploadImageStep.spec.js +0 -12
- 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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
children: usButtonText
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
-
})
|
|
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';\
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
children: usButtonText
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
})
|
|
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';\
|
|
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-
|
|
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": "
|
|
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": "
|
|
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",
|
package/src/card/Card.spec.tsx
CHANGED
|
@@ -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(
|
|
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(
|
|
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
|
-
|
|
148
|
+
const contentId = screen.getByText(defaultProps.children).getAttribute('id');
|
|
149
|
+
expect(contentId).toBe(controlledId);
|
|
118
150
|
});
|
|
119
151
|
});
|
|
120
152
|
});
|
package/src/card/Card.story.tsx
CHANGED
|
@@ -1,54 +1,70 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
33
|
+
return <Card {...args} isExpanded={isExpanded} onClick={handleClick} />;
|
|
34
|
+
}
|
|
30
35
|
};
|
|
31
36
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
|
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':
|
|
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={
|
|
59
|
-
className=
|
|
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={
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
73
|
-
|
|
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
|
}
|
package/src/upload/Upload.css
CHANGED
package/src/upload/Upload.less
CHANGED