@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,32 +1,49 @@
1
- import { select } from '@storybook/addon-knobs';
2
- import { useState } from 'react';
3
-
1
+ import React from 'react';
4
2
  import Button from '../button';
5
-
6
- import SlidingPanel from './SlidingPanel';
3
+ import SlidingPanel, { type SlidingPanelProps } from './SlidingPanel';
7
4
 
8
5
  export default {
9
6
  component: SlidingPanel,
10
7
  title: 'Dialogs/SlidingPanel',
8
+ argTypes: {
9
+ position: {
10
+ control: 'select',
11
+ options: ['left', 'right', 'top', 'bottom'],
12
+ },
13
+ },
14
+ parameters: {
15
+ docs: {
16
+ source: { type: 'code' },
17
+ },
18
+ },
19
+ decorators: [
20
+ (Story: any) => (
21
+ <div style={{ paddingTop: '80px' }}>
22
+ <Story />
23
+ </div>
24
+ ),
25
+ ],
11
26
  };
12
27
 
13
- export const Basic = () => {
14
- const [open, setOpen] = useState(false);
15
-
16
- const position = select('position', ['top', 'right', 'bottom', 'left'], 'top');
28
+ export const Basic = function Render(args: SlidingPanelProps) {
29
+ const [open, setOpen] = React.useState(false);
17
30
 
18
31
  return (
19
- <>
20
- <Button v2 style={{ marginTop: 80 }} onClick={() => setOpen(!open)}>
32
+ <div>
33
+ <Button v2 block onClick={() => setOpen(!open)}>
21
34
  Open Sliding Panel
22
35
  </Button>
23
- <SlidingPanel open={open} position={position}>
36
+
37
+ <SlidingPanel {...args} open={open}>
24
38
  <div className="p-y-4 p-x-4 ">
25
39
  Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has
26
40
  been the industry standard dummy text ever since the 1500s, when an unknown printer took a
27
41
  galley of type and scrambled it to
28
42
  </div>
29
43
  </SlidingPanel>
30
- </>
44
+ </div>
31
45
  );
32
46
  };
47
+ Basic.args = {
48
+ position: 'top',
49
+ };
@@ -1,47 +1,61 @@
1
- import { action } from '@storybook/addon-actions';
2
- import { number } from '@storybook/addon-knobs';
3
- import type { StoryContext } from '@storybook/react';
4
- import { userEvent, within } from '@storybook/test';
1
+ import type { Meta, StoryObj } from '@storybook/react-webpack5';
2
+ import { fn, userEvent, within } from 'storybook/test';
5
3
  import { wait } from '../test-utils/wait';
6
-
7
4
  import Button from '../button';
8
-
9
5
  import { Snackbar } from './Snackbar';
10
6
  import { SnackbarConsumer } from './SnackbarContext';
11
7
  import SnackbarProvider from './SnackbarProvider';
12
8
 
13
- export default {
9
+ const meta: Meta = {
14
10
  component: Snackbar,
15
11
  title: 'Dialogs/Snackbar',
16
12
  };
13
+ export default meta;
17
14
 
18
- export const Basic = () => {
19
- return (
20
- <SnackbarProvider>
21
- <SnackbarConsumer>
22
- {({ createSnackbar }) => (
23
- <Button
24
- block
25
- onClick={() => {
26
- createSnackbar({
27
- action: {
28
- label: 'View',
29
- onClick: () => action('View button clicked.'),
30
- },
31
- text: <span>Some text</span>,
32
- });
33
- }}
34
- >
35
- Show Snackbar
36
- </Button>
37
- )}
38
- </SnackbarConsumer>
39
- </SnackbarProvider>
40
- );
41
- };
42
-
43
- Basic.play = async ({ canvasElement }: StoryContext) => {
44
- await wait(0);
45
- const canvas = within(canvasElement);
46
- await userEvent.click(canvas.getByRole('button'));
15
+ export const Basic: StoryObj = {
16
+ parameters: {
17
+ docs: {
18
+ source: {
19
+ type: 'code',
20
+ transform: async (src = '') => {
21
+ const match = /(function Render\(\).*?)(,\s+play:\s+async)/s.exec(src);
22
+ return match?.[1] || src;
23
+ },
24
+ },
25
+ },
26
+ source: {
27
+ type: 'code',
28
+ },
29
+ },
30
+ render: function Render() {
31
+ return (
32
+ <SnackbarProvider>
33
+ <SnackbarConsumer>
34
+ {({ createSnackbar }) => {
35
+ return (
36
+ <Button
37
+ block
38
+ onClick={() => {
39
+ createSnackbar({
40
+ action: {
41
+ label: 'View',
42
+ onClick: fn(),
43
+ },
44
+ text: <span>Some text</span>,
45
+ });
46
+ }}
47
+ >
48
+ Show Snackbar
49
+ </Button>
50
+ );
51
+ }}
52
+ </SnackbarConsumer>
53
+ </SnackbarProvider>
54
+ );
55
+ },
56
+ play: async ({ canvasElement }) => {
57
+ await wait(0);
58
+ const canvas = within(canvasElement);
59
+ await userEvent.click(canvas.getByRole('button'));
60
+ },
47
61
  };
@@ -1,5 +1,5 @@
1
- import { userEvent, within } from '@storybook/test';
2
- import { action } from '@storybook/addon-actions';
1
+ import { userEvent, within } from 'storybook/test';
2
+ import { action } from 'storybook/actions';
3
3
  import { Mobile as MobileIcon, Theme, Switch, Bulb, Info, Coins, Team } from '@transferwise/icons';
4
4
  import { Snackbar, type SnackbarProps } from './Snackbar';
5
5
  import { SnackbarConsumer } from './SnackbarContext';
@@ -13,6 +13,7 @@ export default {
13
13
  title: 'Dialogs/Snackbar/Tests',
14
14
  component: Snackbar,
15
15
  argTypes: {},
16
+ tags: ['!autodocs'],
16
17
  };
17
18
 
18
19
  const launchSnackbar = async (canvasElement: HTMLElement) => {
@@ -1,4 +1,4 @@
1
- import { Meta, Source } from '@storybook/blocks';
1
+ import { Meta, Source } from '@storybook/addon-docs/blocks';
2
2
 
3
3
  <Meta title="Other/StatusIcon/Accessibility" />
4
4
 
@@ -35,7 +35,7 @@ describe('StatusIcon', () => {
35
35
  [Sentiment.WARNING, Sentiment.WARNING],
36
36
  ])(
37
37
  "if prop 'sentiment' equals '%s' is passed, renders the status icon with class '%s'",
38
- (sentiment, expectedClass) => {
38
+ (sentiment: Sentiment | Status, expectedClass: Sentiment | Status) => {
39
39
  renderStatusIcon({ sentiment: sentiment as StatusIconSentiment });
40
40
 
41
41
  expect(screen.getByTestId('status-icon')).toHaveClass(expectedClass);
@@ -79,11 +79,14 @@ describe('StatusIcon', () => {
79
79
  ['Error', Sentiment.ERROR],
80
80
  ['Information', Sentiment.INFO],
81
81
  ['Success', Sentiment.SUCCESS],
82
- ])("should set '%s' as an accessible name for the '%s' sentiment", (label, sentiment) => {
83
- renderStatusIcon({ sentiment: sentiment as StatusIconSentiment });
82
+ ])(
83
+ "should set '%s' as an accessible name for the '%s' sentiment",
84
+ (label: string, sentiment: Sentiment | Status) => {
85
+ renderStatusIcon({ sentiment: sentiment as StatusIconSentiment });
84
86
 
85
- expect(screen.getByLabelText(`${label}:`)).toBeInTheDocument();
86
- });
87
+ expect(screen.getByLabelText(`${label}:`)).toBeInTheDocument();
88
+ },
89
+ );
87
90
 
88
91
  it('should allow for `iconLabel` overrides', () => {
89
92
  const iconLabel = 'Custom label';
@@ -1,4 +1,4 @@
1
- import { Meta, StoryObj } from '@storybook/react';
1
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
2
2
 
3
3
  import { Sentiment, Size, Status } from '../common';
4
4
 
@@ -1,5 +1,5 @@
1
- import { Meta, StoryObj } from '@storybook/react';
2
- import { fn } from '@storybook/test';
1
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
2
+ import { fn } from 'storybook/test';
3
3
  import Stepper from './Stepper';
4
4
 
5
5
  const STEPS = [
@@ -1,5 +1,5 @@
1
- import { Meta, StoryObj } from '@storybook/react';
2
- import { fn, within, expect, screen } from '@storybook/test';
1
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
2
+ import { fn, within, expect, screen } from 'storybook/test';
3
3
  import Stepper from './Stepper';
4
4
 
5
5
  const STEPS = [
@@ -1,4 +1,4 @@
1
- import type { Meta, StoryObj } from '@storybook/react';
1
+ import type { Meta, StoryObj } from '@storybook/react-webpack5';
2
2
  import React from 'react';
3
3
  import Sticky from './Sticky';
4
4
  import { allModes } from '../../.storybook/modes';
@@ -1,25 +1,26 @@
1
- import { text } from '@storybook/addon-knobs';
1
+ import React from 'react';
2
+ import { action } from 'storybook/actions';
2
3
  import { Home as HomeIcon } from '@transferwise/icons';
3
-
4
4
  import { Status } from '../common';
5
5
  import { InfoPresentation } from '../info';
6
-
7
- import Summary from './Summary';
6
+ import Summary, { type Props as SummaryProps } from './Summary';
8
7
 
9
8
  export default {
10
9
  component: Summary,
11
10
  title: 'Content/Summary',
11
+ argTypes: {
12
+ title: { control: 'text' },
13
+ },
12
14
  };
13
15
 
14
- export const Basic = () => {
15
- const actionText = text('ActionText', 'Change address');
16
-
17
- const title = text('Title', 'Verify your address');
18
- const description = text('Description', '10 Downing Street, Westminster, London SW1A 2AA.');
16
+ export const Basic = (args: SummaryProps) => {
17
+ const actionText = 'Change address';
18
+ const description = '10 Downing Street, Westminster, London SW1A 2AA.';
19
19
 
20
20
  return (
21
21
  <ul>
22
22
  <Summary
23
+ {...args}
23
24
  action={{
24
25
  text: actionText,
25
26
  href: '#change-address',
@@ -28,9 +29,10 @@ export const Basic = () => {
28
29
  as="li"
29
30
  description={description}
30
31
  icon={<HomeIcon size={24} />}
31
- title={title}
32
+ title="Verify your address"
32
33
  status={Status.NOT_DONE}
33
34
  />
35
+
34
36
  <Summary
35
37
  action={{
36
38
  text: 'Change address',
@@ -43,14 +45,13 @@ export const Basic = () => {
43
45
  title: 'You entered your address',
44
46
  content: 'Your address has been verified, no more actions are required.',
45
47
  'aria-label': 'Please click here to know more about your address update status',
46
- onClick: () => {
47
- console.log('Summary Info clicked');
48
- },
48
+ onClick: action('Summary Info clicked'),
49
49
  }}
50
50
  icon={<HomeIcon size={24} />}
51
51
  title="You verified your address"
52
52
  status={Status.DONE}
53
53
  />
54
+
54
55
  <Summary
55
56
  action={{
56
57
  text: 'Change address',
@@ -65,14 +66,13 @@ export const Basic = () => {
65
66
  'Your address change is currently being processed. Please allow 48 hours for verification.',
66
67
  presentation: InfoPresentation.MODAL,
67
68
  'aria-label': 'Please click here to know more about your address update status',
68
- onClick: () => {
69
- console.log('Summary Info clicked');
70
- },
69
+ onClick: action('Summary Info clicked'),
71
70
  }}
72
71
  icon={<HomeIcon size={24} />}
73
72
  title="We’re verifying your address"
74
73
  status={Status.PENDING}
75
74
  />
75
+
76
76
  <Summary
77
77
  action={{
78
78
  text: 'Open in new tab',
@@ -85,6 +85,7 @@ export const Basic = () => {
85
85
  title="We’re verifying your address"
86
86
  status={Status.PENDING}
87
87
  />
88
+
88
89
  <Summary
89
90
  action={{
90
91
  text: actionText,
@@ -93,7 +94,7 @@ export const Basic = () => {
93
94
  }}
94
95
  as="li"
95
96
  description={description}
96
- title={title}
97
+ title="Verify your address"
97
98
  />
98
99
  </ul>
99
100
  );
@@ -1,6 +1,4 @@
1
- @media (min-width: 768px) {
2
- }@media (min-width: 768px) {
3
- }.np-switch {
1
+ .np-switch {
4
2
  all: unset;
5
3
  box-sizing: border-box;
6
4
  display: inline-flex;
@@ -12,37 +10,50 @@
12
10
  -moz-user-select: none;
13
11
  user-select: none;
14
12
  cursor: pointer;
15
- }.np-switch:focus {
13
+ }
14
+ .np-switch:focus {
16
15
  outline: none;
17
- }.np-switch:focus-visible {
16
+ }
17
+ .np-switch:focus-visible {
18
18
  outline: var(--ring-outline-color) solid var(--ring-outline-width);
19
19
  outline-offset: var(--ring-outline-offset);
20
- }.np-switch--thumb {
20
+ }
21
+ .np-switch--thumb {
21
22
  display: flex;
22
23
  transition: transform cubic-bezier(0, 0.94, 0.62, 1) 350ms;
23
- }.np-switch--thumb .tw-icon {
24
+ }
25
+ .np-switch--thumb .tw-icon {
24
26
  color: #fff;
25
- }.np-switch--unchecked {
27
+ }
28
+ .np-switch--unchecked {
26
29
  background: #c9cbce;
27
30
  background: var(--color-interactive-secondary);
28
- }.np-switch--unchecked .switch--thumb {
31
+ }
32
+ .np-switch--unchecked .switch--thumb {
29
33
  transform: translateX(0);
30
- }.np-switch--checked {
34
+ }
35
+ .np-switch--checked {
31
36
  background: #00a2dd;
32
37
  background: var(--color-interactive-accent);
33
- }.np-switch--checked .np-switch--thumb {
38
+ }
39
+ .np-switch--checked .np-switch--thumb {
34
40
  transform: translateX(20px) ;
35
- }[dir="rtl"] .np-switch--checked .np-switch--thumb {
41
+ }
42
+ [dir="rtl"] .np-switch--checked .np-switch--thumb {
36
43
  transform: translateX(-20px) ;
37
- }.np-switch.disabled {
44
+ }
45
+ .np-switch.disabled {
38
46
  filter: grayscale(1);
39
47
  opacity: 0.45;
40
48
  cursor: not-allowed !important;
41
- }.np-theme-personal .np-switch {
49
+ }
50
+ .np-theme-personal .np-switch {
42
51
  padding: 1px 2px;
43
- }.np-theme-personal .np-switch--checked {
52
+ }
53
+ .np-theme-personal .np-switch--checked {
44
54
  background: var(--color-interactive-primary);
45
- }.np-theme-personal .np-switch--thumb {
55
+ }
56
+ .np-theme-personal .np-switch--thumb {
46
57
  width: 20px;
47
58
  height: 20px;
48
59
  margin: 3px;
@@ -1,9 +1,9 @@
1
1
  import { useState } from 'react';
2
- import { fn } from '@storybook/test';
2
+ import { fn } from 'storybook/test';
3
3
 
4
4
  import Switch, { SwitchProps } from './Switch';
5
5
  import { Field } from '../field/Field';
6
- import { Meta, StoryObj } from '@storybook/react';
6
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
7
7
  import { Label } from '../label';
8
8
 
9
9
  const meta: Meta<typeof Switch> = {
@@ -1,4 +1,4 @@
1
- import { action } from '@storybook/addon-actions';
1
+ import { action } from 'storybook/actions';
2
2
  import { FastFlag as FastFlagIcon } from '@transferwise/icons';
3
3
  import { useState } from 'react';
4
4
 
@@ -1,4 +1,4 @@
1
- import { Meta, StoryObj } from '@storybook/react';
1
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
2
2
  import Table from './Table';
3
3
  import { TableHeaderType } from './TableHeader';
4
4
  import { TableRowType, TableRowClickableType } from './TableRow';
@@ -1,5 +1,5 @@
1
- import { MINIMAL_VIEWPORTS } from '@storybook/addon-viewport';
2
- import { StoryObj } from '@storybook/react';
1
+ import { MINIMAL_VIEWPORTS } from 'storybook/viewport';
2
+ import { StoryObj } from '@storybook/react-webpack5';
3
3
 
4
4
  export const viewports = {
5
5
  ...MINIMAL_VIEWPORTS,
@@ -16,7 +16,7 @@ export const viewports = {
16
16
  },
17
17
  };
18
18
 
19
- interface StoryConfig {
19
+ export interface StoryConfig {
20
20
  /**
21
21
  * Creates variations of the component for the current story. Some
22
22
  * padding is applied to the variants for spacing.
@@ -74,14 +74,17 @@ export const storyConfig = <Args>(
74
74
  parameters: {
75
75
  ...storyObject.parameters,
76
76
  variants,
77
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
77
78
  chromatic: {
78
79
  ...storyObject.parameters?.chromatic,
79
80
  viewports: (isMobile && [mobileViewportWidth]) || (is400Zoom && [zoom400perViewportWidth]),
80
81
  },
82
+ },
83
+ globals: {
84
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
81
85
  viewport: {
82
- ...storyObject.parameters?.viewport,
83
- /** Set defaultViewport if 'mobile' variant is used */
84
- defaultViewport: (isMobile && mobileViewportKey) || (is400Zoom && zoom400perViewportKey),
86
+ ...storyObject.globals?.viewport,
87
+ value: (isMobile && mobileViewportKey) || (is400Zoom && zoom400perViewportKey),
85
88
  },
86
89
  },
87
90
  };
@@ -1,5 +1,5 @@
1
- import { StoryObj } from '@storybook/react';
2
- import { userEvent, within } from '@storybook/test';
1
+ import { StoryObj } from '@storybook/react-webpack5';
2
+ import { userEvent, within } from 'storybook/test';
3
3
 
4
4
  import TextareaWithDisplayFormat from './TextareaWithDisplayFormat';
5
5
  import { Field } from '../field/Field';
package/src/tile/Tile.css CHANGED
@@ -1,49 +1,62 @@
1
- @media (min-width: 768px) {
2
- }@media (min-width: 768px) {
3
- }.np-tile {
1
+ .np-tile {
4
2
  min-width: 120px;
5
3
  border-radius: 10px;
6
4
  border-radius: var(--radius-small);
7
5
  width: 100%;
8
- }.np-theme-personal .np-tile {
6
+ }
7
+ .np-theme-personal .np-tile {
9
8
  background-color: rgba(134,167,189,0.10196);
10
9
  background-color: var(--color-background-neutral);
11
- }.np-theme-personal .np-tile .tw-avatar .tw-avatar__content {
10
+ }
11
+ .np-theme-personal .np-tile .tw-avatar .tw-avatar__content {
12
12
  background-color: var(--color-contrast);
13
- }.np-tile.decision {
13
+ }
14
+ .np-tile.decision {
14
15
  margin-top: 0;
15
16
  border: 1px solid rgba(0,0,0,0.10196);
16
17
  border: 1px solid var(--color-border-neutral);
17
- }.np-theme-personal .np-tile.decision {
18
+ }
19
+ .np-theme-personal .np-tile.decision {
18
20
  border: none;
19
- }.np-theme-personal .np-tile.decision:hover {
21
+ }
22
+ .np-theme-personal .np-tile.decision:hover {
20
23
  background-color: var(--color-background-neutral-hover);
21
- }.np-theme-personal .np-tile.decision:active {
24
+ }
25
+ .np-theme-personal .np-tile.decision:active {
22
26
  background-color: var(--color-background-neutral-active);
23
- }.np-theme-personal .np-tile.decision .np-text-body-default {
27
+ }
28
+ .np-theme-personal .np-tile.decision .np-text-body-default {
24
29
  color: #5d7079;
25
30
  color: var(--color-content-secondary);
26
- }.np-tile.np-decision__tile--fixed-width {
31
+ }
32
+ .np-tile.np-decision__tile--fixed-width {
27
33
  width: 300px;
28
- }.np-tile__media {
34
+ }
35
+ .np-tile__media {
29
36
  width: 100%;
30
- }.np-tile__description {
37
+ }
38
+ .np-tile__description {
31
39
  color: #5d7079;
32
40
  color: var(--color-content-secondary);
33
41
  margin-top: 12px;
34
42
  margin-top: var(--size-12);
35
43
  display: inline-block;
36
- }.np-tile--small.np-decision__tile--fixed-width {
44
+ }
45
+ .np-tile--small.np-decision__tile--fixed-width {
37
46
  width: 260px;
38
- }.np-tile--small .np-tile__description {
47
+ }
48
+ .np-tile--small .np-tile__description {
39
49
  margin-top: 4px;
40
50
  margin-top: var(--size-4);
41
- }.np-tile:hover .tw-avatar {
51
+ }
52
+ .np-tile:hover .tw-avatar {
42
53
  pointer-events: none;
43
- }.np-tile:hover .tw-avatar .tw-avatar__content {
54
+ }
55
+ .np-tile:hover .tw-avatar .tw-avatar__content {
44
56
  background-color: #ffffff;
45
57
  background-color: var(--color-background-screen);
46
- }.np-tile__description {
58
+ }
59
+ .np-tile__description {
47
60
  color: #5d7079;
48
61
  color: var(--color-content-secondary);
49
62
  font-weight: 400;
@@ -1,52 +1,52 @@
1
- import { action } from '@storybook/addon-actions';
2
- import { text, boolean } from '@storybook/addon-knobs';
3
-
1
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
2
+ import { action } from 'storybook/actions';
4
3
  import { Size } from '../common';
5
-
6
- import Tile from '.';
7
4
  import AvatarView from '../avatarView';
5
+ import Tile from '.';
6
+ import { Illustration, type IllustrationProps } from '@wise/art';
7
+ import Image from '../image';
8
+
9
+ const LabelledIllustration = (props: IllustrationProps) => <Illustration {...props} />;
10
+ LabelledIllustration.displayName = 'Illustration';
8
11
 
9
- export default {
12
+ const meta: Meta<typeof Tile> = {
10
13
  component: Tile,
11
14
  title: 'Internal/Tile',
15
+ argTypes: {
16
+ title: { control: 'text' },
17
+ description: { control: 'text' },
18
+ disabled: { control: 'boolean' },
19
+ size: {
20
+ control: 'radio',
21
+ options: [Size.MEDIUM, Size.SMALL],
22
+ },
23
+ media: { control: false },
24
+ href: { control: 'text' },
25
+ onClick: { action: 'onClick' },
26
+ },
27
+ args: {
28
+ media: (
29
+ <Image
30
+ alt="illustration"
31
+ src="https://wise.com/public-resources/assets/bank-details/bank-details-flow/finish.svg"
32
+ />
33
+ ),
34
+ title: 'Hank Miller',
35
+ description: 'Click here to send money to Mr. Miller',
36
+ disabled: false,
37
+ href: '#href1',
38
+ size: Size.MEDIUM,
39
+ onClick: action('onClick'),
40
+ },
12
41
  };
42
+ export default meta;
43
+
44
+ type Story = StoryObj<typeof Tile>;
13
45
 
14
- export const Basic = () => {
15
- const description = text('Description', 'Click here to send money to Mr. Miller');
16
- const disabled = boolean('Disabled', false);
17
- const medium = boolean('Medium', true);
18
- const title = text('Title', 'Hank Miller');
46
+ export const WithImage: Story = {};
19
47
 
20
- return (
21
- <div className="d-flex">
22
- <div className="m-a-2">
23
- <Tile
24
- description={description}
25
- disabled={disabled}
26
- href="#href1"
27
- media={
28
- <img
29
- src="https://wise.com/public-resources/assets/bank-details/bank-details-flow/finish.svg"
30
- alt="illustration"
31
- style={{ width: '100%' }}
32
- />
33
- }
34
- size={medium ? Size.MEDIUM : Size.SMALL}
35
- title={title}
36
- onClick={action('onClick')}
37
- />
38
- </div>
39
- <div className="m-a-2">
40
- <Tile
41
- description={description}
42
- disabled={disabled}
43
- href="#href1"
44
- media={<AvatarView profileName="Henry Morris" />}
45
- size={medium ? Size.MEDIUM : Size.SMALL}
46
- title={title}
47
- onClick={action('onClick')}
48
- />
49
- </div>
50
- </div>
51
- );
48
+ export const WithAvatar: Story = {
49
+ args: {
50
+ media: <AvatarView profileName="Henry Morris" />,
51
+ },
52
52
  };