@transferwise/components 0.0.0-experimental-3d57e31 → 0.0.0-experimental-1f719c5

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 (134) hide show
  1. package/build/avatarLayout/AvatarLayout.js +4 -10
  2. package/build/avatarLayout/AvatarLayout.js.map +1 -1
  3. package/build/avatarLayout/AvatarLayout.mjs +4 -10
  4. package/build/avatarLayout/AvatarLayout.mjs.map +1 -1
  5. package/build/button/Button.js +79 -78
  6. package/build/button/Button.js.map +1 -1
  7. package/build/button/Button.mjs +80 -79
  8. package/build/button/Button.mjs.map +1 -1
  9. package/build/criticalBanner/CriticalCommsBanner.js +2 -2
  10. package/build/criticalBanner/CriticalCommsBanner.js.map +1 -1
  11. package/build/criticalBanner/CriticalCommsBanner.mjs +1 -1
  12. package/build/header/Header.js +2 -2
  13. package/build/header/Header.js.map +1 -1
  14. package/build/header/Header.mjs +1 -1
  15. package/build/index.js +4 -2
  16. package/build/index.js.map +1 -1
  17. package/build/index.mjs +2 -1
  18. package/build/index.mjs.map +1 -1
  19. package/build/link/Link.js +3 -8
  20. package/build/link/Link.js.map +1 -1
  21. package/build/link/Link.mjs +3 -8
  22. package/build/link/Link.mjs.map +1 -1
  23. package/build/main.css +2 -224
  24. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js +3 -1
  25. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js.map +1 -1
  26. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs +3 -1
  27. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs.map +1 -1
  28. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js +4 -1
  29. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js.map +1 -1
  30. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs +4 -1
  31. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs.map +1 -1
  32. package/build/select/Select.js +2 -2
  33. package/build/select/Select.js.map +1 -1
  34. package/build/select/Select.mjs +1 -1
  35. package/build/styles/avatarLayout/AvatarLayout.css +2 -12
  36. package/build/styles/button/Button.css +15 -204
  37. package/build/styles/main.css +2 -224
  38. package/build/table/Table.js +166 -0
  39. package/build/table/Table.js.map +1 -0
  40. package/build/table/Table.messages.js +24 -0
  41. package/build/table/Table.messages.js.map +1 -0
  42. package/build/table/Table.messages.mjs +22 -0
  43. package/build/table/Table.messages.mjs.map +1 -0
  44. package/build/table/Table.mjs +164 -0
  45. package/build/table/Table.mjs.map +1 -0
  46. package/build/table/TableCell.js +86 -0
  47. package/build/table/TableCell.js.map +1 -0
  48. package/build/table/TableCell.mjs +84 -0
  49. package/build/table/TableCell.mjs.map +1 -0
  50. package/build/table/TableHeader.js +57 -0
  51. package/build/table/TableHeader.js.map +1 -0
  52. package/build/table/TableHeader.mjs +55 -0
  53. package/build/table/TableHeader.mjs.map +1 -0
  54. package/build/table/TableRow.js +85 -0
  55. package/build/table/TableRow.js.map +1 -0
  56. package/build/table/TableRow.mjs +83 -0
  57. package/build/table/TableRow.mjs.map +1 -0
  58. package/build/table/TableStatusText.js +54 -0
  59. package/build/table/TableStatusText.js.map +1 -0
  60. package/build/table/TableStatusText.mjs +52 -0
  61. package/build/table/TableStatusText.mjs.map +1 -0
  62. package/build/types/avatarLayout/AvatarLayout.d.ts.map +1 -1
  63. package/build/types/button/Button.d.ts +23 -2
  64. package/build/types/button/Button.d.ts.map +1 -1
  65. package/build/types/button/index.d.ts +2 -2
  66. package/build/types/button/index.d.ts.map +1 -1
  67. package/build/types/index.d.ts +2 -0
  68. package/build/types/index.d.ts.map +1 -1
  69. package/build/types/link/Link.d.ts +2 -2
  70. package/build/types/link/Link.d.ts.map +1 -1
  71. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.d.ts.map +1 -1
  72. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts +2 -6
  73. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts.map +1 -1
  74. package/build/types/primitives/PrimitiveButton/src/PrimitiveButton.d.ts.map +1 -1
  75. package/build/types/primitives/PrimitiveButton/src/PrimitiveButton.types.d.ts +0 -1
  76. package/build/types/primitives/PrimitiveButton/src/PrimitiveButton.types.d.ts.map +1 -1
  77. package/build/upload/steps/completeStep/completeStep.js +2 -2
  78. package/build/upload/steps/completeStep/completeStep.js.map +1 -1
  79. package/build/upload/steps/completeStep/completeStep.mjs +1 -1
  80. package/build/upload/steps/processingStep/processingStep.js +2 -2
  81. package/build/upload/steps/processingStep/processingStep.js.map +1 -1
  82. package/build/upload/steps/processingStep/processingStep.mjs +1 -1
  83. package/build/uploadInput/UploadInput.js +3 -3
  84. package/build/uploadInput/UploadInput.js.map +1 -1
  85. package/build/uploadInput/UploadInput.mjs +1 -1
  86. package/package.json +5 -5
  87. package/src/avatarLayout/AvatarLayout.css +2 -12
  88. package/src/avatarLayout/AvatarLayout.less +2 -19
  89. package/src/avatarLayout/AvatarLayout.tsx +3 -10
  90. package/src/button/Button.css +15 -204
  91. package/src/button/Button.less +14 -211
  92. package/src/button/Button.spec.tsx +227 -75
  93. package/src/button/Button.story.tsx +138 -612
  94. package/src/button/Button.tsx +132 -88
  95. package/src/button/__snapshots__/Button.spec.tsx.snap +309 -0
  96. package/src/button/index.ts +3 -2
  97. package/src/flowNavigation/__snapshots__/FlowNavigation.spec.js.snap +1 -1
  98. package/src/index.ts +12 -0
  99. package/src/inputs/SelectInput.story.tsx +1 -1
  100. package/src/link/Link.tsx +6 -15
  101. package/src/main.css +2 -224
  102. package/src/main.less +0 -1
  103. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.tsx +7 -1
  104. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.ts +2 -7
  105. package/src/primitives/PrimitiveAnchor/test/PrimitiveAnchor.spec.tsx +3 -1
  106. package/src/primitives/PrimitiveButton/src/PrimitiveButton.tsx +8 -1
  107. package/src/primitives/PrimitiveButton/src/PrimitiveButton.types.ts +0 -2
  108. package/src/primitives/PrimitiveButton/test/PrimitiveButton.spec.tsx +5 -2
  109. package/build/button/Button.resolver.js +0 -75
  110. package/build/button/Button.resolver.js.map +0 -1
  111. package/build/button/Button.resolver.mjs +0 -73
  112. package/build/button/Button.resolver.mjs.map +0 -1
  113. package/build/button/LegacyButton.js +0 -114
  114. package/build/button/LegacyButton.js.map +0 -1
  115. package/build/button/LegacyButton.mjs +0 -112
  116. package/build/button/LegacyButton.mjs.map +0 -1
  117. package/build/styles/button/Button.vars.css +0 -39
  118. package/build/styles/button/LegacyButton.css +0 -23
  119. package/build/types/button/Button.resolver.d.ts +0 -33
  120. package/build/types/button/Button.resolver.d.ts.map +0 -1
  121. package/build/types/button/Button.types.d.ts +0 -54
  122. package/build/types/button/Button.types.d.ts.map +0 -1
  123. package/build/types/button/LegacyButton.d.ts +0 -30
  124. package/build/types/button/LegacyButton.d.ts.map +0 -1
  125. package/src/button/Button.resolver.tsx +0 -75
  126. package/src/button/Button.tests.story.tsx +0 -27
  127. package/src/button/Button.types.ts +0 -68
  128. package/src/button/Button.vars.css +0 -39
  129. package/src/button/Button.vars.less +0 -50
  130. package/src/button/LegacyButton.css +0 -23
  131. package/src/button/LegacyButton.less +0 -24
  132. package/src/button/LegacyButton.spec.tsx +0 -146
  133. package/src/button/LegacyButton.story.tsx +0 -225
  134. package/src/button/LegacyButton.tsx +0 -161
@@ -1,24 +0,0 @@
1
- @import (reference) "../../node_modules/@transferwise/neptune-css/src/less/mixins/_logical-properties.less";
2
-
3
- .np-btn {
4
- position: relative;
5
-
6
- &.np-btn-block > span.btn-loader {
7
- position: absolute;
8
- .left(var(--size-24));
9
- }
10
-
11
- &.np-btn-xs > span.btn-loader {
12
- background-size: 16px 16px;
13
- }
14
-
15
- &.np-btn-xs.btn-block > span.btn-loader {
16
- top: 0;
17
- }
18
-
19
- // we do not want pointer events disabled as that
20
- // prevents the custom cursor to be shown
21
- &.disabled[class] {
22
- pointer-events: auto;
23
- }
24
- }
@@ -1,146 +0,0 @@
1
- import { createRef } from 'react';
2
-
3
- import { render, screen, userEvent } from '../test-utils';
4
-
5
- import LegacyButton, { ButtonReferenceType } from './LegacyButton';
6
- import messages from '../i18n/commonMessages/Button.messages';
7
-
8
- describe('LegacyButton', () => {
9
- // eslint-disable-next-line no-console
10
- const originalWarn = console.warn;
11
- let mockedWarn: typeof originalWarn;
12
-
13
- const props = {
14
- onClick: jest.fn(),
15
- onFocus: jest.fn(),
16
- onBlur: jest.fn(),
17
- children: 'Send money',
18
- };
19
-
20
- beforeAll(() => {
21
- mockedWarn = jest.fn().mockImplementation((args) => {
22
- if (typeof args !== 'string' || !args.startsWith('Button has deprecated the')) {
23
- originalWarn(args);
24
- }
25
- });
26
- // eslint-disable-next-line no-console
27
- console.warn = mockedWarn;
28
- });
29
-
30
- beforeEach(jest.clearAllMocks);
31
-
32
- afterAll(() => {
33
- // eslint-disable-next-line no-console
34
- console.warn = originalWarn;
35
- });
36
-
37
- describe('by default', () => {
38
- it('renders the text', () => {
39
- render(<LegacyButton {...props} />);
40
- expect(screen.getByText(props.children)).toBeInTheDocument();
41
- });
42
-
43
- it('set `ref` to be true on Button', () => {
44
- const reference = createRef<ButtonReferenceType>();
45
-
46
- expect(reference.current).toBeFalsy();
47
- render(<LegacyButton ref={reference}>Click me!</LegacyButton>);
48
- expect(reference.current).toBeTruthy();
49
- });
50
-
51
- it('is not disabled', () => {
52
- render(<LegacyButton {...props} />);
53
- expect(screen.getByRole('button')).toBeEnabled();
54
- });
55
- });
56
-
57
- describe('button attributes', () => {
58
- it('sets the htmlType if set', () => {
59
- render(<LegacyButton {...props} htmlType="submit" />);
60
- expect(screen.getByRole('button')).toHaveAttribute('type', 'submit');
61
- });
62
-
63
- it('passes through custom classes if set', () => {
64
- render(<LegacyButton {...props} className="donkeysarethebest" />);
65
- expect(screen.getByRole('button')).toHaveClass('donkeysarethebest');
66
- });
67
-
68
- it('passes through aria-label if set', () => {
69
- render(<LegacyButton {...props} aria-label="unique label" />);
70
- const loadingButton = screen.getByLabelText('unique label');
71
- expect(loadingButton).toBeInTheDocument();
72
- });
73
- });
74
-
75
- describe('onClick', () => {
76
- it('calls onClick when clicked', async () => {
77
- render(<LegacyButton {...props} />);
78
- await userEvent.click(screen.getByRole('button'));
79
- expect(props.onClick).toHaveBeenCalledTimes(1);
80
- });
81
-
82
- it('does not call onClick when clicked if disabled', async () => {
83
- render(<LegacyButton {...props} disabled />);
84
- await userEvent.click(screen.getByRole('button'));
85
- expect(props.onClick).toHaveBeenCalledTimes(0);
86
- });
87
-
88
- it('does not call onClick when clicked if loading', async () => {
89
- render(<LegacyButton {...props} loading />);
90
- await userEvent.click(screen.getByRole('button'));
91
- expect(props.onClick).toHaveBeenCalledTimes(0);
92
- });
93
- });
94
-
95
- describe('onFocus and onBlur', () => {
96
- it('calls both handlers by default', async () => {
97
- render(<LegacyButton {...props} />);
98
- await userEvent.tab();
99
- expect(props.onFocus).toHaveBeenCalledTimes(1);
100
- await userEvent.tab();
101
- expect(props.onFocus).toHaveBeenCalledTimes(1);
102
- });
103
-
104
- it('does not call either handler if disabled', async () => {
105
- render(<LegacyButton {...props} disabled />);
106
- await userEvent.tab();
107
- expect(props.onFocus).not.toHaveBeenCalled();
108
- await userEvent.tab();
109
- expect(props.onFocus).not.toHaveBeenCalled();
110
- });
111
-
112
- it('calls both handlers if loading', async () => {
113
- render(<LegacyButton {...props} loading />);
114
- await userEvent.tab();
115
- expect(props.onFocus).toHaveBeenCalledTimes(1);
116
- await userEvent.tab();
117
- expect(props.onFocus).toHaveBeenCalledTimes(1);
118
- });
119
- });
120
-
121
- describe('other states', () => {
122
- it('renders as loading if `loading` is true', () => {
123
- render(<LegacyButton {...props} loading />);
124
- const button = screen.queryByRole('button', {
125
- name: messages.loadingAriaLabel.defaultMessage,
126
- });
127
- expect(button).toBeInTheDocument();
128
- expect(button).toBeEnabled();
129
- expect(button).toHaveClass('btn-loading');
130
- expect(button).toHaveAttribute('aria-disabled', 'true');
131
- expect(button).toHaveAttribute('aria-busy', 'true');
132
- expect(button).toHaveAttribute('aria-live', 'polite');
133
- expect(screen.getByTestId('ButtonProgressIndicator')).toBeInTheDocument();
134
- });
135
-
136
- it('disables the button', () => {
137
- render(<LegacyButton {...props} disabled />);
138
- const button = screen.queryByRole('button');
139
- expect(button).toBeDisabled();
140
- expect(button).toHaveClass('disabled');
141
- expect(button).toHaveAttribute('aria-disabled', 'false');
142
- expect(button).toHaveAttribute('aria-busy', 'false');
143
- expect(button).toHaveAttribute('aria-live', 'off');
144
- });
145
- });
146
- });
@@ -1,225 +0,0 @@
1
- import { Meta, StoryObj } from '@storybook/react';
2
- import { userEvent, within, fn, expect } from '@storybook/test';
3
- import { useState } from 'react';
4
-
5
- import Button from '.';
6
-
7
- const withContainer = (Story: any) => (
8
- <div
9
- style={{
10
- display: 'flex',
11
- flexDirection: 'initial',
12
- justifyContent: 'center',
13
- flexFlow: 'column',
14
- alignItems: 'center',
15
- }}
16
- >
17
- <Story />
18
- </div>
19
- );
20
-
21
- const meta: Meta<typeof Button> = {
22
- component: Button,
23
- title: 'Actions/Button/Legacy',
24
- args: {
25
- children: 'Button text',
26
- loading: false,
27
- type: undefined,
28
- onClick: fn(),
29
- onBlur: fn(),
30
- onFocus: fn(),
31
- href: 'https://example.com',
32
- as: undefined,
33
- },
34
- argTypes: {
35
- as: {
36
- control: {
37
- name: 'enum',
38
- options: ['button', 'a'],
39
- },
40
- },
41
- type: {
42
- type: {
43
- name: 'enum',
44
- value: ['accent', 'positive', 'negative'],
45
- },
46
- },
47
- size: {
48
- type: {
49
- name: 'enum',
50
- value: ['xs', 'sm', 'md', 'lg'],
51
- },
52
- },
53
- priority: {
54
- type: {
55
- name: 'enum',
56
- value: ['primary', 'secondary', 'tertiary'],
57
- },
58
- },
59
- sentiment: {
60
- table: {
61
- disable: true,
62
- },
63
- },
64
- iconStart: {
65
- table: {
66
- disable: true,
67
- },
68
- },
69
- iconEnd: {
70
- table: {
71
- disable: true,
72
- },
73
- },
74
- avatars: {
75
- table: {
76
- disable: true,
77
- },
78
- },
79
- 'data-testid': {
80
- table: {
81
- disable: true,
82
- },
83
- },
84
- },
85
- tags: ['autodocs'],
86
- decorators: [withContainer],
87
- };
88
-
89
- export default meta;
90
-
91
- type Story = StoryObj<typeof Button>;
92
-
93
- export const Basic: Story = {};
94
-
95
- export const Secondary: Story = {
96
- args: {
97
- type: 'accent',
98
- priority: 'secondary',
99
- },
100
- };
101
-
102
- export const Tertiary: Story = {
103
- args: {
104
- type: 'accent',
105
- priority: 'tertiary',
106
- },
107
- };
108
-
109
- export const Negative: Story = {
110
- args: {
111
- type: 'negative',
112
- priority: 'primary',
113
- },
114
- };
115
-
116
- export const Loading: Story = {
117
- args: {
118
- loading: true,
119
- },
120
- };
121
-
122
- export const Variants: Story = {
123
- render: () => {
124
- return (
125
- <div className="d-flex flex-column p-b-2 align-items-start">
126
- <div className="d-flex flex-row p-b-2" style={{ gap: 'var(--size-16)' }}>
127
- <Button type="accent" priority="primary">
128
- Primary Accent
129
- </Button>
130
- <Button type="accent" priority="secondary">
131
- Secondary Accent
132
- </Button>
133
- <Button type="accent" priority="tertiary">
134
- Tertiary Accent
135
- </Button>
136
- </div>
137
- <div className="d-flex flex-row p-b-2" style={{ gap: 'var(--size-16)' }}>
138
- <Button type="positive" priority="primary">
139
- Primary Positive
140
- </Button>
141
- <Button type="positive" priority="secondary">
142
- Secondary Accent
143
- </Button>
144
- </div>
145
- <div className="d-flex flex-row flex- p-b-2" style={{ gap: 'var(--size-16)' }}>
146
- <Button type="negative" priority="primary">
147
- Primary Negative
148
- </Button>
149
- <Button type="negative" priority="secondary">
150
- Secondary Negative
151
- </Button>
152
- </div>
153
- <div className="d-flex flex-row p-b-1" style={{ gap: 'var(--size-16)' }}>
154
- <Button type="accent" priority="primary" disabled>
155
- Button Disabled
156
- </Button>
157
- <Button type="accent" priority="secondary" disabled>
158
- Button Disabled
159
- </Button>
160
- <Button type="accent" priority="tertiary" disabled>
161
- Button Disabled
162
- </Button>
163
- </div>
164
- </div>
165
- );
166
- },
167
- };
168
-
169
- const wait = async (duration = 500) =>
170
- new Promise<void>((resolve) => {
171
- setTimeout(resolve, duration);
172
- });
173
-
174
- export const Focused: Story = {
175
- play: async ({ canvasElement }: { canvasElement: HTMLElement }) => {
176
- const canvas = within(canvasElement);
177
- const button = canvas.getByRole('button');
178
- await userEvent.tab();
179
- await expect(button).toHaveFocus();
180
- await expect(button).toHaveTextContent('Focused!');
181
- },
182
- render: function Render(args: React.ComponentProps<typeof Button>) {
183
- const [focused, setFocused] = useState(false);
184
-
185
- return (
186
- <Button {...args} onFocus={() => setFocused(true)}>
187
- {focused ? 'Focused!' : 'Button text'}
188
- </Button>
189
- );
190
- },
191
- };
192
-
193
- export const SocialMedia: Story = {
194
- render: () => {
195
- return (
196
- <>
197
- <div className="m-b-2">
198
- <button type="button" className="btn btn-google">
199
- Login with Google
200
- </button>
201
- </div>
202
- <div className="m-b-2">
203
- <button type="button" className="btn btn-facebook">
204
- Login with Facebook
205
- </button>
206
- </div>
207
- <div className="m-b-2">
208
- <button type="button" className="btn btn-lg btn-facebook">
209
- Large Button
210
- </button>
211
- </div>
212
- <div className="m-b-2">
213
- <button type="button" className="btn btn-block btn-facebook">
214
- Block Button
215
- </button>
216
- </div>
217
- <div className="m-b-2">
218
- <button type="button" className="btn btn-lg btn-block btn-facebook">
219
- Large Block Button
220
- </button>
221
- </div>
222
- </>
223
- );
224
- },
225
- };
@@ -1,161 +0,0 @@
1
- import { clsx } from 'clsx';
2
- import { ElementType, forwardRef, MouseEvent } from 'react';
3
- import { useIntl } from 'react-intl';
4
-
5
- import {
6
- Size,
7
- ControlType,
8
- Priority,
9
- ControlTypeAccent,
10
- ControlTypeNegative,
11
- ControlTypePositive,
12
- PriorityPrimary,
13
- PrioritySecondary,
14
- PriorityTertiary,
15
- SizeExtraSmall,
16
- SizeSmall,
17
- SizeMedium,
18
- SizeLarge,
19
- } from '../common';
20
- import ProcessIndicator from '../processIndicator';
21
-
22
- import messages from '../i18n/commonMessages/Button.messages';
23
- import { typeClassMap, priorityClassMap } from './classMap';
24
- import { establishNewPriority, establishNewType, logDeprecationNotices } from './legacyUtils';
25
-
26
- /** @deprecated */
27
- type DeprecatedTypes = 'primary' | 'pay' | 'secondary' | 'danger' | 'link';
28
-
29
- /** @deprecated */
30
- type DeprecatedSizes = SizeExtraSmall;
31
-
32
- type CommonProps = {
33
- v2?: false;
34
- block?: boolean;
35
- disabled?: boolean;
36
- loading?: boolean;
37
- type?: ControlTypeAccent | ControlTypeNegative | ControlTypePositive | DeprecatedTypes | null;
38
- priority?: PriorityPrimary | PrioritySecondary | PriorityTertiary | null;
39
- size?: SizeSmall | SizeMedium | SizeLarge | DeprecatedSizes;
40
- htmlType?: 'submit' | 'reset' | 'button';
41
- };
42
-
43
- type ButtonProps = CommonProps &
44
- Omit<React.ComponentPropsWithRef<'button'>, 'type'> & {
45
- as?: 'button';
46
- };
47
-
48
- type AnchorProps = CommonProps &
49
- Omit<React.ComponentPropsWithRef<'a'>, 'type'> & {
50
- as?: 'a';
51
- href?: string;
52
- };
53
-
54
- export type LegacyButtonProps = ButtonProps | AnchorProps;
55
-
56
- export type ButtonReferenceType = HTMLButtonElement | HTMLAnchorElement;
57
-
58
- /**
59
- * @deprecated make sure you use new Button component via `<Button v2 .. />` and new props
60
- */
61
- const LegacyButton = forwardRef<ButtonReferenceType, LegacyButtonProps>(
62
- (
63
- {
64
- as: component = 'button',
65
- block = false,
66
- children,
67
- className,
68
- disabled,
69
- loading = false,
70
- priority = Priority.PRIMARY,
71
- size = Size.MEDIUM,
72
- type = ControlType.ACCENT,
73
- onClick,
74
- ...rest
75
- }: LegacyButtonProps,
76
- ref,
77
- ) => {
78
- const intl = useIntl();
79
-
80
- logDeprecationNotices({ size, type });
81
-
82
- const newType = establishNewType(type);
83
- const newPriority = establishNewPriority(priority, type);
84
-
85
- const classes = clsx(
86
- `btn btn-${size}`,
87
- `np-btn np-btn-${size}`,
88
- {
89
- 'btn-loading': loading,
90
- 'btn-block np-btn-block': block,
91
- disabled,
92
- },
93
- // @ts-expect-error fix when refactor `typeClassMap` to TypeScript
94
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
95
- typeClassMap[newType],
96
- // @ts-expect-error fix when refactor `typeClassMap` to TypeScript
97
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
98
- priorityClassMap[newPriority],
99
- className,
100
- );
101
-
102
- function processIndicatorSize() {
103
- return ['sm', 'xs'].includes(size) ? 'xxs' : 'xs';
104
- }
105
-
106
- const Element = (component as ElementType) ?? 'button';
107
- let props;
108
-
109
- if (Element === 'button') {
110
- const { htmlType = 'button', ...restProps } = rest as ButtonProps;
111
- props = {
112
- ...restProps,
113
- disabled,
114
- 'aria-disabled': loading,
115
- type: htmlType,
116
- };
117
- } else {
118
- props = {
119
- ...rest,
120
- 'aria-disabled': loading,
121
- } as AnchorProps;
122
- }
123
-
124
- /**
125
- * Ensures that the button cannot be activated in loading or disabled mode,
126
- * when `aria-disabled` might be used over the `disabled` HTML attribute
127
- */
128
- const handleClick =
129
- (handler: LegacyButtonProps['onClick']) =>
130
- (event: MouseEvent<HTMLButtonElement> & MouseEvent<HTMLAnchorElement>) => {
131
- if (disabled || loading) {
132
- event.preventDefault();
133
- } else if (typeof handler === 'function') {
134
- handler(event);
135
- }
136
- };
137
-
138
- return (
139
- <Element
140
- ref={ref as React.Ref<ButtonReferenceType>}
141
- className={classes}
142
- onClick={handleClick(onClick)}
143
- {...props}
144
- aria-live={loading ? 'polite' : 'off'}
145
- aria-busy={loading}
146
- aria-label={loading ? intl.formatMessage(messages.loadingAriaLabel) : rest['aria-label']}
147
- >
148
- {children}
149
- {loading && (
150
- <ProcessIndicator
151
- size={processIndicatorSize()}
152
- className="btn-loader"
153
- data-testid="ButtonProgressIndicator"
154
- />
155
- )}
156
- </Element>
157
- );
158
- },
159
- );
160
-
161
- export default LegacyButton;