@transferwise/components 46.100.1 → 46.100.2

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 (153) hide show
  1. package/build/avatarLayout/AvatarLayout.js +1 -1
  2. package/build/avatarLayout/AvatarLayout.js.map +1 -1
  3. package/build/avatarLayout/AvatarLayout.mjs +1 -1
  4. package/build/avatarLayout/AvatarLayout.mjs.map +1 -1
  5. package/build/dateLookup/DateLookup.js +3 -2
  6. package/build/dateLookup/DateLookup.js.map +1 -1
  7. package/build/dateLookup/DateLookup.mjs +3 -2
  8. package/build/dateLookup/DateLookup.mjs.map +1 -1
  9. package/build/main.css +4 -94
  10. package/build/styles/accordion/Accordion.css +27 -16
  11. package/build/styles/avatar/Avatar.css +95 -50
  12. package/build/styles/inputs/Input.css +37 -21
  13. package/build/styles/inputs/TextArea.css +35 -20
  14. package/build/styles/loader/Loader.css +4 -90
  15. package/build/styles/main.css +4 -94
  16. package/build/styles/popover/Popover.css +19 -12
  17. package/build/styles/select/Select.css +131 -68
  18. package/build/styles/switch/Switch.css +27 -16
  19. package/build/styles/tile/Tile.css +31 -18
  20. package/build/types/dateLookup/DateLookup.d.ts +2 -2
  21. package/build/types/dateLookup/DateLookup.d.ts.map +1 -1
  22. package/build/types/test-utils/story-config.d.ts +2 -3
  23. package/build/types/test-utils/story-config.d.ts.map +1 -1
  24. package/package.json +20 -28
  25. package/src/accordion/Accordion.css +27 -16
  26. package/src/accordion/Accordion.story.tsx +1 -1
  27. package/src/actionButton/ActionButton.story.tsx +3 -2
  28. package/src/actionOption/ActionOption.story.tsx +2 -2
  29. package/src/alert/Alert.story.tsx +2 -2
  30. package/src/alert/Alert.tests.story.tsx +2 -2
  31. package/src/avatar/Avatar.css +95 -50
  32. package/src/avatar/Avatar.spec.tsx +1 -1
  33. package/src/avatar/Avatar.story.tsx +3 -2
  34. package/src/avatarLayout/AvatarLayout.story.tsx +1 -1
  35. package/src/avatarLayout/AvatarLayout.tsx +1 -1
  36. package/src/avatarView/AvatarView.story.tsx +1 -1
  37. package/src/avatarWrapper/AvatarWrapper.story.tsx +3 -2
  38. package/src/badge/Badge.story.tsx +49 -28
  39. package/src/button/Button.accessibility.docs.mdx +1 -1
  40. package/src/button/Button.story.tsx +2 -2
  41. package/src/button/Button.tests.story.tsx +2 -2
  42. package/src/button/LegacyButton.story.tsx +3 -2
  43. package/src/card/Card.story.tsx +2 -2
  44. package/src/carousel/Carousel.story.tsx +1 -1
  45. package/src/checkbox/Checkbox.story.tsx +2 -2
  46. package/src/checkboxButton/CheckboxButton.story.tsx +2 -2
  47. package/src/checkboxOption/CheckboxOption.story.tsx +35 -29
  48. package/src/chevron/Chevron.story.tsx +1 -1
  49. package/src/chips/Chips.story.tsx +1 -1
  50. package/src/circularButton/CircularButton.story.tsx +1 -1
  51. package/src/circularButton/CircularButton.tests.story.tsx +1 -1
  52. package/src/common/bottomSheet/BottomSheet.story.tsx +2 -2
  53. package/src/common/card/Card.story.tsx +1 -1
  54. package/src/common/circle/Circle.story.tsx +2 -2
  55. package/src/common/locale/index.spec.ts +28 -16
  56. package/src/common/responsivePanel/ResponsivePanel.spec.js +8 -29
  57. package/src/criticalBanner/CriticalCommsBanner.story.tsx +1 -1
  58. package/src/dateInput/DateInput.story.tsx +2 -2
  59. package/src/dateInput/DateInput.tests.story.tsx +2 -2
  60. package/src/dateLookup/DateLookup.spec.tsx +5 -5
  61. package/src/dateLookup/DateLookup.story.tsx +43 -71
  62. package/src/dateLookup/DateLookup.tests.story.tsx +3 -3
  63. package/src/dateLookup/DateLookup.tsx +4 -1
  64. package/src/decision/Decision.story.tsx +24 -49
  65. package/src/definitionList/DefinitionList.story.tsx +1 -1
  66. package/src/dimmer/Dimmer.story.tsx +2 -2
  67. package/src/divider/Divider.accessibility.docs.mdx +1 -1
  68. package/src/divider/Divider.story.tsx +1 -1
  69. package/src/drawer/Drawer.story.tsx +13 -7
  70. package/src/dropFade/DropFade.story.tsx +1 -1
  71. package/src/emphasis/Emphasis.spec.tsx +8 -8
  72. package/src/emphasis/Emphasis.story.tsx +1 -1
  73. package/src/field/Field.story.tsx +3 -3
  74. package/src/flowNavigation/FlowNavigation.story.tsx +305 -260
  75. package/src/iconButton/IconButton.story.tsx +2 -2
  76. package/src/image/Image.story.tsx +27 -54
  77. package/src/info/Info.story.tsx +2 -2
  78. package/src/inlineAlert/InlineAlert.story.tsx +1 -1
  79. package/src/inputWithDisplayFormat/InputWithDisplayFormat.story.tsx +2 -2
  80. package/src/inputs/Input.css +37 -21
  81. package/src/inputs/InputGroup.story.tsx +1 -1
  82. package/src/inputs/SearchInput.story.tsx +1 -1
  83. package/src/inputs/SelectInput.docs.mdx +1 -1
  84. package/src/inputs/SelectInput.story.tsx +2 -2
  85. package/src/inputs/TextArea.css +35 -20
  86. package/src/instructionsList/InstructionsList.story.tsx +2 -2
  87. package/src/legacylistItem/LegacyListItem.story.tsx +1 -1
  88. package/src/loader/Loader.css +4 -90
  89. package/src/loader/Loader.story.tsx +1 -1
  90. package/src/logo/Logo.story.tsx +1 -1
  91. package/src/main.css +4 -94
  92. package/src/markdown/Markdown.story.tsx +1 -1
  93. package/src/modal/Modal.story.tsx +2 -2
  94. package/src/money/Money.story.tsx +1 -1
  95. package/src/moneyInput/MoneyInput.docs.mdx +1 -1
  96. package/src/moneyInput/MoneyInput.spec.tsx +8 -5
  97. package/src/moneyInput/MoneyInput.story.tsx +2 -2
  98. package/src/moneyInput/currencyFormatting.spec.ts +1 -1
  99. package/src/navigationOption/NavigationOption.story.tsx +265 -226
  100. package/src/nudge/Nudge.story.tsx +1 -1
  101. package/src/overlayHeader/OverlayHeader.story.tsx +32 -24
  102. package/src/phoneNumberInput/PhoneNumberInput.story.tsx +1 -1
  103. package/src/phoneNumberInput/utils/setDefaultPrefix/setDefaultPrefix.spec.ts +6 -3
  104. package/src/popover/Popover.css +19 -12
  105. package/src/popover/Popover.story.tsx +2 -2
  106. package/src/primitives/PrimitiveAnchor/stories/PrimitiveAnchor.story.tsx +2 -2
  107. package/src/primitives/PrimitiveAnchor/stories/PrimitiveAnchor.tests.story.tsx +2 -2
  108. package/src/primitives/PrimitiveButton/stories/PrimitiveButton.story.tsx +2 -2
  109. package/src/primitives/PrimitiveButton/stories/PrimitiveButton.tests.story.tsx +2 -2
  110. package/src/processIndicator/ProcessIndicator.story.tsx +1 -1
  111. package/src/progress/Progress.story.tsx +1 -1
  112. package/src/progressBar/ProgressBar.story.tsx +1 -1
  113. package/src/promoCard/PromoCard.story.tsx +1 -1
  114. package/src/promoCard/PromoCardGroup.story.tsx +1 -1
  115. package/src/provider/Provider.spec.tsx +2 -2
  116. package/src/provider/Provider.story.tsx +1 -1
  117. package/src/provider/direction/DirectionProvider.spec.tsx +1 -1
  118. package/src/provider/language/LanguageProvider.spec.tsx +1 -1
  119. package/src/provider/theme/ThemeProvider.story.tsx +1 -1
  120. package/src/radio/Radio.story.tsx +59 -42
  121. package/src/radioGroup/RadioGroup.story.tsx +2 -2
  122. package/src/radioOption/RadioOption.story.tsx +73 -38
  123. package/src/segmentedControl/SegmentedControl.story.tsx +1 -1
  124. package/src/select/Select.css +131 -68
  125. package/src/select/Select.story.tsx +385 -397
  126. package/src/slidingPanel/SlidingPanel.story.tsx +30 -13
  127. package/src/snackbar/Snackbar.story.tsx +50 -36
  128. package/src/snackbar/Snackbar.tests.story.tsx +3 -2
  129. package/src/statusIcon/StatusIcon.docs.mdx +1 -1
  130. package/src/statusIcon/StatusIcon.spec.tsx +8 -5
  131. package/src/statusIcon/StatusIcon.story.tsx +1 -1
  132. package/src/stepper/Stepper.story.tsx +2 -2
  133. package/src/stepper/Stepper.tests.story.tsx +2 -2
  134. package/src/sticky/Sticky.story.tsx +1 -1
  135. package/src/summary/Summary.story.tsx +18 -17
  136. package/src/switch/Switch.css +27 -16
  137. package/src/switch/Switch.story.tsx +2 -2
  138. package/src/switchOption/SwitchOption.story.tsx +1 -1
  139. package/src/table/Table.story.tsx +1 -1
  140. package/src/test-utils/story-config.ts +9 -6
  141. package/src/textareaWithDisplayFormat/TextareaWithDisplayFormat.story.tsx +2 -2
  142. package/src/tile/Tile.css +31 -18
  143. package/src/tile/Tile.story.tsx +43 -43
  144. package/src/tooltip/Tooltip.story.tsx +2 -2
  145. package/src/typeahead/Typeahead.story.tsx +2 -2
  146. package/src/upload/Upload.story.tsx +2 -2
  147. package/src/upload/Upload.tests.story.tsx +2 -2
  148. package/src/upload/utils/isTypeValid/isTypeValid.spec.ts +3 -1
  149. package/src/uploadInput/UploadInput.story.tsx +1 -1
  150. package/src/uploadInput/UploadInput.tests.story.tsx +3 -3
  151. package/src/withId/withId.docs.mdx +1 -1
  152. package/src/withId/withId.story.tsx +1 -1
  153. package/src/common/responsivePanel/__snapshots__/ResponsivePanel.spec.js.snap +0 -21
@@ -1,288 +1,333 @@
1
- import { boolean, select, text } from '@storybook/addon-knobs';
1
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
2
2
  import { useState } from 'react';
3
-
4
3
  import AvatarView from '../avatarView';
5
4
  import Body from '../body';
6
5
  import Button from '../button';
7
6
  import { ProfileType, Typography } from '../common';
8
7
  import Logo from '../logo';
9
8
  import OverlayHeader from '../overlayHeader';
10
-
11
- import FlowNavigation from './FlowNavigation';
12
9
  import { lorem10 } from '../test-utils';
13
10
  import Display from '../display';
14
11
  import Sticky from '../sticky';
15
12
 
16
- export default {
17
- component: FlowNavigation,
18
- title: 'Navigation/FlowNavigation',
19
- };
20
-
21
- export const Variants = () => {
22
- const [activeStep, setActiveStep] = useState(2);
23
- const [closed, setClosed] = useState(false);
24
- const profileType = select(
25
- 'avatar',
26
- [ProfileType.PERSONAL, ProfileType.BUSINESS],
27
- ProfileType.PERSONAL,
28
- );
29
- const showCloseButton = boolean('show closeButton', true);
30
- const showMobileBackButton = boolean('show mobile backButton', true);
31
- const done = boolean('done', false);
32
- const avatarURL = text('avatarURL', '../tapestry-01.png');
33
-
34
- return !closed ? (
35
- <>
36
- <FlowNavigation
37
- avatar={!profileType ? null : <AvatarView profileType={profileType} />}
38
- logo={<Logo />}
39
- activeStep={activeStep}
40
- done={done}
41
- steps={[
42
- {
43
- label: 'Amount',
44
- hoverLabel: <strong>100 GBP</strong>,
45
- onClick: () => setActiveStep(0),
46
- },
47
- {
48
- label: 'You',
49
- hoverLabel: <>Elena Durante - elenadurante@test.com</>,
50
- onClick: () => setActiveStep(1),
51
- },
52
- { label: 'Recipient', hoverLabel: 'Daniele Tomboro', onClick: () => setActiveStep(2) },
53
- { label: 'Review', hoverLabel: 'Antonio Dozortevo', onClick: () => setActiveStep(3) },
54
- {
55
- label: 'Pay',
56
- hoverLabel: 'Enrico Gusso II',
57
- onClick: () => setActiveStep(4),
58
- },
59
- ]}
60
- onClose={showCloseButton ? () => setClosed(true) : undefined}
61
- onGoBack={
62
- showMobileBackButton
63
- ? () => setActiveStep(activeStep > 0 ? activeStep - 1 : 0)
64
- : undefined
65
- }
66
- />
13
+ import FlowNavigation, { FlowNavigationProps } from './FlowNavigation';
67
14
 
68
- <FlowNavigation
69
- done={done}
70
- activeStep={activeStep}
71
- steps={[
72
- {
73
- label: 'Amount',
74
- hoverLabel: (
75
- <>
76
- <div>
77
- <strong>100 GBP</strong>
78
- </div>
79
- 0.2351 ETH
80
- </>
81
- ),
82
- onClick: () => setActiveStep(0),
83
- },
84
- {
85
- label: 'You',
86
- hoverLabel: (
87
- <>
88
- <div>
89
- <strong>Elena Durante</strong>
90
- </div>
91
- elenadurante@test.com
92
- </>
93
- ),
94
- onClick: () => setActiveStep(1),
95
- },
96
- { label: 'Recipient', hoverLabel: 'Daniele Tomboro', onClick: () => setActiveStep(2) },
97
- { label: 'Review', hoverLabel: 'Antonio Dozortevo', onClick: () => setActiveStep(3) },
98
- {
99
- label: 'Pay',
100
- hoverLabel: 'Enrico Gusso II',
101
- onClick: () => setActiveStep(4),
102
- },
103
- ]}
104
- onClose={showCloseButton ? () => setClosed(true) : undefined}
105
- onGoBack={
106
- showMobileBackButton
107
- ? () => setActiveStep(activeStep - 1 > 0 ? activeStep - 1 : 0)
108
- : undefined
109
- }
110
- />
15
+ interface CustomControls {
16
+ showCloseButton: boolean;
17
+ showMobileBackButton: boolean;
18
+ avatarURL?: string;
19
+ profileType?: ProfileType;
20
+ }
21
+ export type StoryArgs = FlowNavigationProps & CustomControls;
111
22
 
112
- <FlowNavigation
113
- done={done}
114
- avatar={<AvatarView imgSrc={avatarURL} profileType={profileType} />}
115
- activeStep={activeStep}
116
- steps={[
117
- {
118
- label: 'Amount',
119
- hoverLabel: (
120
- <>
121
- <div>
122
- <strong>100 GBP</strong>
123
- </div>
124
- 0.2351 ETH
125
- </>
126
- ),
127
- onClick: () => setActiveStep(0),
128
- },
129
- {
130
- label: 'You',
131
- hoverLabel: (
132
- <>
133
- <div>
134
- <strong>Elena Durante</strong>
135
- </div>
136
- elenadurante@test.com
137
- </>
138
- ),
139
- onClick: () => setActiveStep(1),
140
- },
141
- { label: 'Recipient', hoverLabel: 'Daniele Tomboro', onClick: () => setActiveStep(2) },
142
- { label: 'Review', hoverLabel: 'Antonio Dozortevo', onClick: () => setActiveStep(3) },
143
- {
144
- label: 'Pay',
145
- hoverLabel: 'Enrico Gusso II',
146
- onClick: () => setActiveStep(4),
147
- },
148
- ]}
149
- onClose={showCloseButton ? () => setClosed(true) : undefined}
150
- onGoBack={
151
- showMobileBackButton
152
- ? () => setActiveStep(activeStep - 1 > 0 ? activeStep - 1 : 0)
153
- : undefined
154
- }
155
- />
23
+ type Story = StoryObj<StoryArgs>;
156
24
 
157
- {/* Instance of always `done` FlowNav for visual testing */}
158
- <FlowNavigation
159
- done
160
- avatar={<AvatarView imgSrc={avatarURL} profileType={profileType} />}
161
- activeStep={activeStep}
162
- steps={[
163
- { label: 'Recipient', hoverLabel: 'Daniele Tomboro', onClick: () => setActiveStep(0) },
164
- { label: 'Review', hoverLabel: 'Antonio Dozortevo', onClick: () => setActiveStep(1) },
165
- { label: 'Pay', hoverLabel: 'Enrico Gusso', onClick: () => setActiveStep(2) },
166
- ]}
167
- onClose={showCloseButton ? () => setClosed(true) : undefined}
168
- onGoBack={
169
- showMobileBackButton
170
- ? () => setActiveStep(activeStep - 1 > 0 ? activeStep - 1 : 0)
171
- : undefined
172
- }
173
- />
174
-
175
- <Body className="text-xs-center m-a-3">Content to test that the flow nav is centred</Body>
176
-
177
- <Button
178
- className="m-t-2"
179
- disabled={activeStep === 4}
180
- onClick={() => setActiveStep(activeStep + 1)}
181
- >
182
- Next Step
183
- </Button>
184
- </>
185
- ) : null;
186
- };
187
-
188
- export const SendFlow = () => {
189
- const [activeStep, setActiveStep] = useState(2);
190
- const steps = [
191
- {
192
- label: 'Recipient',
193
- onClick: handleStepClick(0),
194
- },
195
- {
196
- label: 'Amount',
197
- hoverLabel: (
198
- <>
199
- You send 100 GBP <br />
200
- You get 99.39 GBP{' '}
201
- </>
202
- ),
203
- ...(activeStep > 1 && { onClick: handleStepClick(1) }),
204
- },
205
- {
206
- label: 'Review',
207
- ...(activeStep > 2 && { onClick: handleStepClick(2) }),
25
+ const meta: Meta<StoryArgs> = {
26
+ component: FlowNavigation,
27
+ title: 'Navigation/FlowNavigation',
28
+ argTypes: {
29
+ showCloseButton: { control: 'boolean', defaultValue: true },
30
+ showMobileBackButton: { control: 'boolean', defaultValue: true },
31
+ done: { control: 'boolean', defaultValue: false },
32
+ avatarURL: { control: 'text', defaultValue: '../tapestry-01.png' },
33
+ profileType: {
34
+ control: 'radio',
35
+ options: [ProfileType.PERSONAL, ProfileType.BUSINESS],
36
+ defaultValue: ProfileType.PERSONAL,
208
37
  },
209
- {
210
- label: 'Pay',
211
- ...(activeStep > 3 && { onClick: handleStepClick(3) }),
38
+ },
39
+ parameters: {
40
+ docs: {
41
+ source: { type: 'code' },
212
42
  },
213
- ];
214
- function handleStepClick(step: number) {
215
- return () => {
216
- setActiveStep(step);
217
- };
218
- }
219
- return (
220
- <>
221
- <FlowNavigation
222
- avatar={<AvatarView />}
223
- logo={<Logo />}
224
- activeStep={activeStep}
225
- steps={steps}
226
- onClose={() => alert('close & move away')}
227
- onGoBack={() => setActiveStep(activeStep > 0 ? activeStep - 1 : 0)}
228
- />
229
-
230
- <Body className="m-a-3">
231
- <Display type={Typography.DISPLAY_SMALL}>{steps[activeStep].label} Step</Display>
232
- <br />
233
- {lorem10}
234
- </Body>
235
-
236
- <Sticky>
237
- <div className="d-flex justify-content-center align-items-center p-a-3">
238
- <Button
239
- v2
240
- disabled={activeStep === 3}
241
- block
242
- onClick={() => setActiveStep(activeStep + 1)}
243
- >
244
- Continue
245
- </Button>
246
- </div>
247
- </Sticky>
248
- </>
249
- );
43
+ },
250
44
  };
45
+ export default meta;
251
46
 
252
- export const WithOverlayHeaderComparison = () => {
253
- const [activeStep, setActiveStep] = useState(4);
254
- const [closed, setClosed] = useState(false);
255
- const profileType = select(
256
- 'avatar',
257
- [ProfileType.PERSONAL, ProfileType.BUSINESS],
258
- ProfileType.PERSONAL,
259
- );
260
- const showCloseButton = boolean('show closeButton', true);
261
- const showMobileBackButton = boolean('show mobile backButton', true);
262
- const done = boolean('done', false);
47
+ type FlowNavArgs = {
48
+ showCloseButton: boolean;
49
+ showMobileBackButton: boolean;
50
+ done: boolean;
51
+ avatarURL?: string;
52
+ profileType?: ProfileType;
53
+ [key: string]: unknown;
54
+ };
263
55
 
264
- return !closed ? (
265
- <>
266
- <div style={{ border: '1px solid #e8e8e8' }}>
56
+ export const Variants: Story = {
57
+ args: {
58
+ profileType: ProfileType.PERSONAL,
59
+ showCloseButton: true,
60
+ showMobileBackButton: true,
61
+ done: false,
62
+ avatarURL: '../tapestry-01.png',
63
+ },
64
+ render: (args) => {
65
+ const [activeStep, setActiveStep] = useState(2);
66
+ const [closed, setClosed] = useState(false);
67
+ if (closed) return <></>;
68
+ return (
69
+ <>
267
70
  <FlowNavigation
268
- avatar={profileType ? <AvatarView profileType={profileType} /> : null}
71
+ avatar={args.profileType ? <AvatarView profileType={args.profileType} /> : null}
72
+ logo={<Logo />}
269
73
  activeStep={activeStep}
270
- done={done}
271
- steps={[]}
272
- onClose={showCloseButton ? () => setClosed(true) : undefined}
74
+ done={args.done}
75
+ steps={[
76
+ {
77
+ label: 'Amount',
78
+ hoverLabel: <strong>100 GBP</strong>,
79
+ onClick: () => setActiveStep(0),
80
+ },
81
+ {
82
+ label: 'You',
83
+ hoverLabel: <>Elena Durante - elenadurante@test.com</>,
84
+ onClick: () => setActiveStep(1),
85
+ },
86
+ { label: 'Recipient', hoverLabel: 'Daniele Tomboro', onClick: () => setActiveStep(2) },
87
+ { label: 'Review', hoverLabel: 'Antonio Dozortevo', onClick: () => setActiveStep(3) },
88
+ {
89
+ label: 'Pay',
90
+ hoverLabel: 'Enrico Gusso II',
91
+ onClick: () => setActiveStep(4),
92
+ },
93
+ ]}
94
+ onClose={args.showCloseButton ? () => setClosed(true) : undefined}
273
95
  onGoBack={
274
- showMobileBackButton
96
+ args.showMobileBackButton
275
97
  ? () => setActiveStep(activeStep > 0 ? activeStep - 1 : 0)
276
98
  : undefined
277
99
  }
278
100
  />
279
- </div>
280
- <div style={{ border: '1px solid #e8e8e8' }}>
281
- <OverlayHeader
282
- avatar={profileType ? <AvatarView profileType={profileType} /> : null}
283
- onClose={showCloseButton ? () => setClosed(true) : undefined}
101
+
102
+ <FlowNavigation
103
+ done={args.done}
104
+ activeStep={activeStep}
105
+ steps={[
106
+ {
107
+ label: 'Amount',
108
+ hoverLabel: (
109
+ <>
110
+ <div>
111
+ <strong>100 GBP</strong>
112
+ </div>
113
+ 0.2351 ETH
114
+ </>
115
+ ),
116
+ onClick: () => setActiveStep(0),
117
+ },
118
+ {
119
+ label: 'You',
120
+ hoverLabel: (
121
+ <>
122
+ <div>
123
+ <strong>Elena Durante</strong>
124
+ </div>
125
+ elenadurante@test.com
126
+ </>
127
+ ),
128
+ onClick: () => setActiveStep(1),
129
+ },
130
+ { label: 'Recipient', hoverLabel: 'Daniele Tomboro', onClick: () => setActiveStep(2) },
131
+ { label: 'Review', hoverLabel: 'Antonio Dozortevo', onClick: () => setActiveStep(3) },
132
+ {
133
+ label: 'Pay',
134
+ hoverLabel: 'Enrico Gusso II',
135
+ onClick: () => setActiveStep(4),
136
+ },
137
+ ]}
138
+ onClose={args.showCloseButton ? () => setClosed(true) : undefined}
139
+ onGoBack={
140
+ args.showMobileBackButton
141
+ ? () => setActiveStep(activeStep - 1 > 0 ? activeStep - 1 : 0)
142
+ : undefined
143
+ }
144
+ />
145
+
146
+ <FlowNavigation
147
+ done={args.done}
148
+ avatar={<AvatarView imgSrc={args.avatarURL} profileType={args.profileType} />}
149
+ activeStep={activeStep}
150
+ steps={[
151
+ {
152
+ label: 'Amount',
153
+ hoverLabel: (
154
+ <>
155
+ <div>
156
+ <strong>100 GBP</strong>
157
+ </div>
158
+ 0.2351 ETH
159
+ </>
160
+ ),
161
+ onClick: () => setActiveStep(0),
162
+ },
163
+ {
164
+ label: 'You',
165
+ hoverLabel: (
166
+ <>
167
+ <div>
168
+ <strong>Elena Durante</strong>
169
+ </div>
170
+ elenadurante@test.com
171
+ </>
172
+ ),
173
+ onClick: () => setActiveStep(1),
174
+ },
175
+ { label: 'Recipient', hoverLabel: 'Daniele Tomboro', onClick: () => setActiveStep(2) },
176
+ { label: 'Review', hoverLabel: 'Antonio Dozortevo', onClick: () => setActiveStep(3) },
177
+ {
178
+ label: 'Pay',
179
+ hoverLabel: 'Enrico Gusso II',
180
+ onClick: () => setActiveStep(4),
181
+ },
182
+ ]}
183
+ onClose={args.showCloseButton ? () => setClosed(true) : undefined}
184
+ onGoBack={
185
+ args.showMobileBackButton
186
+ ? () => setActiveStep(activeStep - 1 > 0 ? activeStep - 1 : 0)
187
+ : undefined
188
+ }
189
+ />
190
+
191
+ {/* Instance of always `done` FlowNav for visual testing */}
192
+ <FlowNavigation
193
+ done
194
+ avatar={<AvatarView imgSrc={args.avatarURL} profileType={args.profileType} />}
195
+ activeStep={activeStep}
196
+ steps={[
197
+ { label: 'Recipient', hoverLabel: 'Daniele Tomboro', onClick: () => setActiveStep(0) },
198
+ { label: 'Review', hoverLabel: 'Antonio Dozortevo', onClick: () => setActiveStep(1) },
199
+ { label: 'Pay', hoverLabel: 'Enrico Gusso', onClick: () => setActiveStep(2) },
200
+ ]}
201
+ onClose={args.showCloseButton ? () => setClosed(true) : undefined}
202
+ onGoBack={
203
+ args.showMobileBackButton
204
+ ? () => setActiveStep(activeStep - 1 > 0 ? activeStep - 1 : 0)
205
+ : undefined
206
+ }
284
207
  />
285
- </div>
286
- </>
287
- ) : null;
208
+
209
+ <Body className="text-xs-center m-a-3">Content to test that the flow nav is centred</Body>
210
+
211
+ <Button
212
+ className="m-t-2"
213
+ disabled={activeStep === 4}
214
+ onClick={() => setActiveStep(activeStep + 1)}
215
+ >
216
+ Next Step
217
+ </Button>
218
+ </>
219
+ );
220
+ },
221
+ };
222
+
223
+ export const SendFlow: Story = {
224
+ args: {
225
+ profileType: ProfileType.PERSONAL,
226
+ showCloseButton: true,
227
+ showMobileBackButton: true,
228
+ done: false,
229
+ avatarURL: '../tapestry-01.png',
230
+ },
231
+ render: (args) => {
232
+ const [activeStep, setActiveStep] = useState(2);
233
+ const steps = [
234
+ {
235
+ label: 'Recipient',
236
+ onClick: handleStepClick(0),
237
+ },
238
+ {
239
+ label: 'Amount',
240
+ hoverLabel: (
241
+ <>
242
+ You send 100 GBP <br />
243
+ You get 99.39 GBP{' '}
244
+ </>
245
+ ),
246
+ ...(activeStep > 1 && { onClick: handleStepClick(1) }),
247
+ },
248
+ {
249
+ label: 'Review',
250
+ ...(activeStep > 2 && { onClick: handleStepClick(2) }),
251
+ },
252
+ {
253
+ label: 'Pay',
254
+ ...(activeStep > 3 && { onClick: handleStepClick(3) }),
255
+ },
256
+ ];
257
+ function handleStepClick(step: number) {
258
+ return () => {
259
+ setActiveStep(step);
260
+ };
261
+ }
262
+ return (
263
+ <>
264
+ <FlowNavigation
265
+ avatar={<AvatarView />}
266
+ logo={<Logo />}
267
+ activeStep={activeStep}
268
+ steps={steps}
269
+ onClose={() => alert('close & move away')}
270
+ onGoBack={() => setActiveStep(activeStep > 0 ? activeStep - 1 : 0)}
271
+ />
272
+
273
+ <Body className="m-a-3">
274
+ <Display type={Typography.DISPLAY_SMALL}>{steps[activeStep].label} Step</Display>
275
+ <br />
276
+ {lorem10}
277
+ </Body>
278
+
279
+ <Sticky>
280
+ <div className="d-flex justify-content-center align-items-center p-a-3">
281
+ <Button
282
+ v2
283
+ disabled={activeStep === 3}
284
+ block
285
+ onClick={() => setActiveStep(activeStep + 1)}
286
+ >
287
+ Continue
288
+ </Button>
289
+ </div>
290
+ </Sticky>
291
+ </>
292
+ );
293
+ },
294
+ };
295
+
296
+ export const WithOverlayHeaderComparison: Story = {
297
+ args: {
298
+ profileType: ProfileType.PERSONAL,
299
+ showCloseButton: true,
300
+ showMobileBackButton: true,
301
+ done: false,
302
+ avatarURL: '../tapestry-01.png',
303
+ },
304
+ render: (args) => {
305
+ const [activeStep, setActiveStep] = useState(4);
306
+ const [closed, setClosed] = useState(false);
307
+ if (closed) return <></>;
308
+ return (
309
+ <>
310
+ <div style={{ border: '1px solid #e8e8e8' }}>
311
+ <FlowNavigation
312
+ avatar={args.profileType ? <AvatarView profileType={args.profileType} /> : null}
313
+ activeStep={activeStep}
314
+ done={args.done}
315
+ steps={[]}
316
+ onClose={args.showCloseButton ? () => setClosed(true) : undefined}
317
+ onGoBack={
318
+ args.showMobileBackButton
319
+ ? () => setActiveStep(activeStep > 0 ? activeStep - 1 : 0)
320
+ : undefined
321
+ }
322
+ />
323
+ </div>
324
+ <div style={{ border: '1px solid #e8e8e8' }}>
325
+ <OverlayHeader
326
+ avatar={args.profileType ? <AvatarView profileType={args.profileType} /> : null}
327
+ onClose={args.showCloseButton ? () => setClosed(true) : undefined}
328
+ />
329
+ </div>
330
+ </>
331
+ );
332
+ },
288
333
  };
@@ -1,8 +1,8 @@
1
1
  /* eslint-disable react/jsx-key */
2
- import { Meta, StoryObj } from '@storybook/react';
2
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
3
3
  import { ArrowLeft, Cross, Defrost, Edit, Menu, Plus } from '@transferwise/icons';
4
4
  import IconButton, { Props } from './IconButton';
5
- import { action } from '@storybook/addon-actions';
5
+ import { action } from 'storybook/actions';
6
6
  import Body from '../body';
7
7
 
8
8
  export default {
@@ -1,62 +1,35 @@
1
- import { action } from '@storybook/addon-actions';
2
- import { text, select, boolean } from '@storybook/addon-knobs';
1
+ import { action } from 'storybook/actions';
2
+ import Image, { type ImageProps } from './Image';
3
3
 
4
- import Image from './Image';
5
-
6
- export default {
4
+ const meta = {
7
5
  component: Image,
8
6
  title: 'Content/Image',
9
- };
10
-
11
- export const Basic = () => {
12
- const source = text('src', 'https://wise.com/web-art/assets/illustrations/bell-medium@2x.webp');
13
- const shrink = boolean('shrink', true);
14
- const stretch = boolean('stretch', true);
15
- const loading = select(
16
- 'loading',
17
-
18
- {
19
- lazy: 'lazy',
20
- eager: 'eager',
7
+ argTypes: {
8
+ src: { control: 'text' },
9
+ shrink: { control: 'boolean' },
10
+ stretch: { control: 'boolean' },
11
+ loading: {
12
+ control: 'select',
13
+ options: ['lazy', 'eager'],
21
14
  },
22
- 'lazy',
23
- );
15
+ },
16
+ };
17
+ export default meta;
24
18
 
25
- return (
19
+ export const Basic = {
20
+ render: (args: ImageProps) => (
26
21
  <>
27
- <Image
28
- alt="test"
29
- src={source}
30
- id="id1"
31
- loading={loading}
32
- className="m-t-5"
33
- shrink={shrink}
34
- stretch={stretch}
35
- onLoad={action('load 1')}
36
- onError={action('error')}
37
- />
38
- <Image
39
- alt="test"
40
- src={source}
41
- id="id2"
42
- loading={loading}
43
- className="m-t-5"
44
- shrink={shrink}
45
- stretch={stretch}
46
- onLoad={action('load 2')}
47
- onError={action('error')}
48
- />
49
- <Image
50
- alt="test"
51
- src={source}
52
- id="id3"
53
- loading={loading}
54
- className="m-t-5"
55
- shrink={shrink}
56
- stretch={stretch}
57
- onLoad={action('load 3')}
58
- onError={action('error')}
59
- />
22
+ <Image id="id1" onLoad={action('load 1')} onError={action('error')} {...args} />
23
+ <Image id="id2" onLoad={action('load 2')} onError={action('error')} {...args} />
24
+ <Image id="id3" onLoad={action('load 3')} onError={action('error')} {...args} />
60
25
  </>
61
- );
26
+ ),
27
+ args: {
28
+ alt: 'test',
29
+ src: 'https://wise.com/web-art/assets/illustrations/bell-medium@2x.webp',
30
+ shrink: true,
31
+ stretch: true,
32
+ loading: 'lazy',
33
+ className: 'm-t-5',
34
+ },
62
35
  };