@transferwise/components 0.0.0-experimental-bc13343 → 0.0.0-experimental-739bfcf

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 (132) hide show
  1. package/build/avatarLayout/AvatarLayout.js +9 -2
  2. package/build/avatarLayout/AvatarLayout.js.map +1 -1
  3. package/build/avatarLayout/AvatarLayout.mjs +9 -2
  4. package/build/avatarLayout/AvatarLayout.mjs.map +1 -1
  5. package/build/button/Button.js +78 -79
  6. package/build/button/Button.js.map +1 -1
  7. package/build/button/Button.mjs +79 -80
  8. package/build/button/Button.mjs.map +1 -1
  9. package/build/button/Button.resolver.js +78 -0
  10. package/build/button/Button.resolver.js.map +1 -0
  11. package/build/button/Button.resolver.mjs +76 -0
  12. package/build/button/Button.resolver.mjs.map +1 -0
  13. package/build/button/LegacyButton.js +114 -0
  14. package/build/button/LegacyButton.js.map +1 -0
  15. package/build/button/LegacyButton.mjs +112 -0
  16. package/build/button/LegacyButton.mjs.map +1 -0
  17. package/build/criticalBanner/CriticalCommsBanner.js +2 -2
  18. package/build/criticalBanner/CriticalCommsBanner.js.map +1 -1
  19. package/build/criticalBanner/CriticalCommsBanner.mjs +1 -1
  20. package/build/header/Header.js +2 -2
  21. package/build/header/Header.js.map +1 -1
  22. package/build/header/Header.mjs +1 -1
  23. package/build/i18n/ja.json +0 -1
  24. package/build/i18n/ja.json.js +0 -1
  25. package/build/i18n/ja.json.js.map +1 -1
  26. package/build/i18n/ja.json.mjs +0 -1
  27. package/build/i18n/ja.json.mjs.map +1 -1
  28. package/build/i18n/pt.json +0 -1
  29. package/build/i18n/pt.json.js +0 -1
  30. package/build/i18n/pt.json.js.map +1 -1
  31. package/build/i18n/pt.json.mjs +0 -1
  32. package/build/i18n/pt.json.mjs.map +1 -1
  33. package/build/i18n/ru.json +0 -1
  34. package/build/i18n/ru.json.js +0 -1
  35. package/build/i18n/ru.json.js.map +1 -1
  36. package/build/i18n/ru.json.mjs +0 -1
  37. package/build/i18n/ru.json.mjs.map +1 -1
  38. package/build/i18n/zh-HK.json +0 -1
  39. package/build/i18n/zh-HK.json.js +0 -1
  40. package/build/i18n/zh-HK.json.js.map +1 -1
  41. package/build/i18n/zh-HK.json.mjs +0 -1
  42. package/build/i18n/zh-HK.json.mjs.map +1 -1
  43. package/build/index.js +2 -2
  44. package/build/index.mjs +1 -1
  45. package/build/link/Link.js +8 -3
  46. package/build/link/Link.js.map +1 -1
  47. package/build/link/Link.mjs +8 -3
  48. package/build/link/Link.mjs.map +1 -1
  49. package/build/main.css +250 -0
  50. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js +1 -3
  51. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js.map +1 -1
  52. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs +1 -3
  53. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs.map +1 -1
  54. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js +1 -4
  55. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js.map +1 -1
  56. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs +1 -4
  57. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs.map +1 -1
  58. package/build/select/Select.js +5 -3
  59. package/build/select/Select.js.map +1 -1
  60. package/build/select/Select.mjs +4 -2
  61. package/build/select/Select.mjs.map +1 -1
  62. package/build/styles/avatarLayout/AvatarLayout.css +11 -0
  63. package/build/styles/button/Button.css +231 -15
  64. package/build/styles/button/Button.vars.css +38 -0
  65. package/build/styles/button/LegacyButton.css +23 -0
  66. package/build/styles/main.css +250 -0
  67. package/build/types/avatarLayout/AvatarLayout.d.ts +1 -2
  68. package/build/types/avatarLayout/AvatarLayout.d.ts.map +1 -1
  69. package/build/types/avatarLayout/index.d.ts +1 -0
  70. package/build/types/avatarLayout/index.d.ts.map +1 -1
  71. package/build/types/button/Button.d.ts +1 -23
  72. package/build/types/button/Button.d.ts.map +1 -1
  73. package/build/types/button/Button.resolver.d.ts +31 -0
  74. package/build/types/button/Button.resolver.d.ts.map +1 -0
  75. package/build/types/button/Button.types.d.ts +65 -0
  76. package/build/types/button/Button.types.d.ts.map +1 -0
  77. package/build/types/button/LegacyButton.d.ts +30 -0
  78. package/build/types/button/LegacyButton.d.ts.map +1 -0
  79. package/build/types/button/index.d.ts +2 -2
  80. package/build/types/button/index.d.ts.map +1 -1
  81. package/build/types/link/Link.d.ts +2 -2
  82. package/build/types/link/Link.d.ts.map +1 -1
  83. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.d.ts.map +1 -1
  84. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts +5 -1
  85. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts.map +1 -1
  86. package/build/types/primitives/PrimitiveButton/src/PrimitiveButton.d.ts.map +1 -1
  87. package/build/types/select/Select.d.ts.map +1 -1
  88. package/build/upload/steps/completeStep/completeStep.js +2 -2
  89. package/build/upload/steps/completeStep/completeStep.js.map +1 -1
  90. package/build/upload/steps/completeStep/completeStep.mjs +1 -1
  91. package/build/upload/steps/processingStep/processingStep.js +2 -2
  92. package/build/upload/steps/processingStep/processingStep.js.map +1 -1
  93. package/build/upload/steps/processingStep/processingStep.mjs +1 -1
  94. package/build/uploadInput/UploadInput.js +3 -3
  95. package/build/uploadInput/UploadInput.js.map +1 -1
  96. package/build/uploadInput/UploadInput.mjs +1 -1
  97. package/package.json +3 -3
  98. package/src/avatarLayout/AvatarLayout.css +11 -0
  99. package/src/avatarLayout/AvatarLayout.less +18 -1
  100. package/src/avatarLayout/AvatarLayout.tsx +11 -3
  101. package/src/avatarLayout/index.ts +1 -0
  102. package/src/button/Button.css +231 -15
  103. package/src/button/Button.less +232 -14
  104. package/src/button/Button.resolver.tsx +120 -0
  105. package/src/button/Button.spec.tsx +54 -231
  106. package/src/button/Button.story.tsx +612 -137
  107. package/src/button/Button.tsx +88 -132
  108. package/src/button/Button.types.ts +86 -0
  109. package/src/button/Button.vars.css +38 -0
  110. package/src/button/Button.vars.less +46 -0
  111. package/src/button/LegacyButton.css +23 -0
  112. package/src/button/LegacyButton.less +24 -0
  113. package/src/button/LegacyButton.spec.tsx +146 -0
  114. package/src/button/LegacyButton.story.tsx +224 -0
  115. package/src/button/LegacyButton.tsx +161 -0
  116. package/src/button/index.ts +2 -3
  117. package/src/flowNavigation/__snapshots__/FlowNavigation.spec.js.snap +1 -1
  118. package/src/i18n/ja.json +0 -1
  119. package/src/i18n/pt.json +0 -1
  120. package/src/i18n/ru.json +0 -1
  121. package/src/i18n/zh-HK.json +0 -1
  122. package/src/inputs/SelectInput.story.tsx +1 -1
  123. package/src/link/Link.tsx +15 -6
  124. package/src/main.css +250 -0
  125. package/src/main.less +1 -0
  126. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.tsx +1 -7
  127. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.ts +6 -1
  128. package/src/primitives/PrimitiveAnchor/test/PrimitiveAnchor.spec.tsx +1 -3
  129. package/src/primitives/PrimitiveButton/src/PrimitiveButton.tsx +1 -8
  130. package/src/primitives/PrimitiveButton/test/PrimitiveButton.spec.tsx +2 -5
  131. package/src/select/Select.tsx +1 -0
  132. package/src/button/__snapshots__/Button.spec.tsx.snap +0 -309
@@ -1,7 +1,8 @@
1
1
  import { clsx } from 'clsx';
2
2
  import AvatarView, { AvatarViewProps } from '../avatarView';
3
+ import { useDirection } from '../common/hooks';
3
4
 
4
- type SingleAvatarType = { asset?: AvatarViewProps['children'] } & Omit<
5
+ export type SingleAvatarType = { asset?: AvatarViewProps['children'] } & Omit<
5
6
  AvatarViewProps,
6
7
  'notification' | 'selected' | 'size' | 'badge' | 'children' | 'interactive'
7
8
  >;
@@ -24,6 +25,7 @@ export default function AvatarLayout({
24
25
  }: Props) {
25
26
  const orientation =
26
27
  size === 16 && orientationProp === 'diagonal' ? 'horizontal' : orientationProp;
28
+ const { isRTL } = useDirection();
27
29
  const isDiagonal = orientation === 'diagonal';
28
30
  const avatarSize = isDiagonal ? DIAGONAL_LAYOUT_STYLE_CONFIG[size]?.avatarSize : size;
29
31
  return avatars.length < 1 ? null : avatars.length === 1 ? (
@@ -46,8 +48,14 @@ export default function AvatarLayout({
46
48
  // eslint-disable-next-line react/no-array-index-key
47
49
  key={index}
48
50
  className={clsx(
49
- { [`np-avatar-layout-${orientation}-child`]: index !== 0 },
50
- { [`np-avatar-layout-${orientation}-mask`]: index !== avatars.length - 1 },
51
+ {
52
+ [`np-avatar-layout-${orientation}-child`]:
53
+ !isDiagonal && isRTL ? index !== avatars.length - 1 : index !== 0,
54
+ },
55
+ {
56
+ [`np-avatar-layout-${orientation}-mask`]:
57
+ !isDiagonal && isRTL ? index !== 0 : index !== avatars.length - 1,
58
+ },
51
59
  )}
52
60
  >
53
61
  <AvatarView
@@ -1,2 +1,3 @@
1
1
  export type { Props as AvatarLayoutProps } from './AvatarLayout';
2
+ export type { SingleAvatarType } from './AvatarLayout';
2
3
  export { default } from './AvatarLayout';
@@ -1,23 +1,239 @@
1
- .np-btn {
1
+ .wds-Button {
2
+ --Button-background: var(--color-interactive-accent);
3
+ --Button-background-hover: var(--color-interactive-accent-hover);
4
+ --Button-background-active: var(--color-interactive-accent-active);
5
+ --Button-color: var(--color-interactive-control);
6
+ --Button-padding: var(--size-8) var(--size-12);
7
+ --Button-border-radius: var(--radius-full);
8
+ --Button-size-small-padding: 5px var(--size-12);
9
+ --Button-size-medium-padding: var(--size-8) var(--size-12);
10
+ --Button-size-large-padding: var(--size-12) var(--size-16);
11
+ --Button-transition-duration: 150ms;
12
+ --Button-transition-easing: ease-in-out;
13
+ --Button-secondary-background: var(--color-interactive-neutral);
14
+ --Button-secondary-background-hover: var(--color-interactive-neutral-hover);
15
+ --Button-secondary-background-active: var(--color-interactive-neutral-active);
16
+ --Button-secondary-color: var(--color-interactive-primary);
17
+ --Button-tertiary-background: var(--color-background-neutral);
18
+ --Button-tertiary-background-hover: var(--color-background-neutral-hover);
19
+ --Button-tertiary-background-active: var(--color-background-neutral-active);
20
+ --Button-tertiary-color: var(--color-content-primary);
21
+ --Button-minimal-background: transparent;
22
+ --Button-minimal-background-hover: var(--color-background-screen-hover);
23
+ --Button-minimal-background-active: var(--color-background-screen-active);
24
+ --Button-minimal-color: var(--color-interactive-primary);
25
+ --Button-primary-negative-background: var(--color-sentiment-negative-primary);
26
+ --Button-primary-negative-background-hover: var(--color-sentiment-negative-primary-hover);
27
+ --Button-primary-negative-background-active: var(--color-sentiment-negative-primary-active);
28
+ --Button-primary-negative-color: var(--color-contrast);
29
+ --Button-secondary-negative-background: var(--color-sentiment-negative-secondary);
30
+ --Button-secondary-negative-background-hover: var(--color-sentiment-negative-secondary-hover);
31
+ --Button-secondary-negative-background-active: var(--color-sentiment-negative-secondary-active);
32
+ --Button-secondary-negative-color: var(--color-sentiment-negative-primary);
33
+ }
34
+ .np-theme-personal--bright-green .wds-Button {
35
+ --color-contrast: #FFFFFF;
36
+ --Button-secondary-color: var(--color-interactive-control);
37
+ --Button-secondary-negative-color: var(--color-contrast);
38
+ }
39
+ /* Button Styles */
40
+ .wds-Button {
41
+ display: inline-flex;
42
+ flex: none;
43
+ width: auto;
44
+ align-items: center;
45
+ justify-content: center;
46
+ vertical-align: middle;
47
+ text-align: center;
48
+ -webkit-text-decoration: none;
49
+ text-decoration: none;
50
+ white-space: nowrap;
51
+ word-wrap: break-word;
52
+ -webkit-appearance: none;
53
+ -moz-appearance: none;
54
+ appearance: none;
55
+ background-color: var(--Button-background);
56
+ border: none;
57
+ border-radius: var(--Button-border-radius);
58
+ color: var(--Button-color);
59
+ cursor: pointer;
60
+ padding: var(--Button-padding);
61
+ transition: color, background-color var(--Button-transition-duration) var(--Button-transition-easing);
62
+ }
63
+ .wds-Button:focus {
64
+ -webkit-text-decoration: none;
65
+ text-decoration: none;
66
+ }
67
+ .wds-Button:hover {
68
+ background-color: var(--Button-background-hover);
69
+ -webkit-text-decoration: none;
70
+ text-decoration: none;
71
+ }
72
+ .wds-Button:active {
73
+ background-color: var(--Button-background-active);
74
+ -webkit-text-decoration: none;
75
+ text-decoration: none;
76
+ }
77
+ .wds-Button.wds-Button--disabled,
78
+ .wds-Button:disabled {
79
+ mix-blend-mode: luminosity;
80
+ opacity: 0.45;
81
+ cursor: not-allowed;
82
+ }
83
+ .wds-Button.wds-Button--disabled:hover,
84
+ .wds-Button:disabled:hover,
85
+ .wds-Button.wds-Button--disabled:active,
86
+ .wds-Button:disabled:active {
87
+ background-color: var(--Button-background);
88
+ }
89
+ .wds-Button--secondary {
90
+ --Button-background: var(--Button-secondary-background);
91
+ --Button-background-hover: var(--Button-secondary-background-hover);
92
+ --Button-background-active: var(--Button-secondary-background-active);
93
+ --Button-color: var(--Button-secondary-color);
94
+ }
95
+ .wds-Button--tertiary {
96
+ --Button-background: var(--Button-tertiary-background);
97
+ --Button-background-hover: var(--Button-tertiary-background-hover);
98
+ --Button-background-active: var(--Button-tertiary-background-active);
99
+ --Button-color: var(--Button-tertiary-color);
100
+ }
101
+ .wds-Button--tertiary .wds-Button-icon--end {
102
+ color: var(--color-interactive-primary);
103
+ }
104
+ .wds-Button--minimal {
105
+ --Button-background: var(--Button-minimal-background);
106
+ --Button-background-hover: var(--Button-minimal-background-hover);
107
+ --Button-background-active: var(--Button-minimal-background-active);
108
+ --Button-color: var(--Button-minimal-color);
109
+ -webkit-text-decoration: underline;
110
+ text-decoration: underline;
111
+ text-underline-offset: 3px;
112
+ text-decoration-thickness: 1px;
113
+ }
114
+ .wds-Button--minimal:hover,
115
+ .wds-Button--minimal:hover:active {
116
+ -webkit-text-decoration: underline;
117
+ text-decoration: underline;
118
+ }
119
+ .wds-Button--negative.wds-Button--primary {
120
+ --Button-background: var(--Button-primary-negative-background);
121
+ --Button-background-hover: var(--Button-primary-negative-background-hover);
122
+ --Button-background-active: var(--Button-primary-negative-background-active);
123
+ --Button-color: var(--Button-primary-negative-color);
124
+ }
125
+ .wds-Button--negative.wds-Button--secondary {
126
+ --Button-background: var(--Button-secondary-negative-background);
127
+ --Button-background-hover: var(--Button-secondary-negative-background-hover);
128
+ --Button-background-active: var(--Button-secondary-negative-background-active);
129
+ --Button-color: var(--Button-secondary-negative-color);
130
+ }
131
+ .wds-Button--small {
132
+ --Button-padding: var(--Button-size-small-padding);
133
+ }
134
+ .wds-Button--small .wds-Button-icon--start {
135
+ margin-right: 4px;
136
+ margin-right: var(--size-4);
137
+ }
138
+ [dir="rtl"] .wds-Button--small .wds-Button-icon--start {
139
+ margin-right: 0;
140
+ margin-left: 4px;
141
+ margin-left: var(--size-4);
142
+ }
143
+ .wds-Button--medium {
144
+ --Button-padding: var(--Button-size-medium-padding);
145
+ }
146
+ .wds-Button--large {
147
+ --Button-padding: var(--Button-size-large-padding);
148
+ }
149
+ .wds-Button--block {
150
+ width: 100%;
151
+ }
152
+ .wds-Button-avatars {
153
+ display: inline-flex;
154
+ margin-right: 5px;
155
+ margin-left: calc(4px * -1);
156
+ margin-left: calc(var(--size-4) * -1);
157
+ }
158
+ [dir="rtl"] .wds-Button-avatars {
159
+ margin-right: 0;
160
+ margin-left: 5px;
161
+ }
162
+ .wds-Button-avatars .np-avatar-view .np-avatar-view-content {
163
+ color: var(--Button-color);
164
+ }
165
+ .wds-Button-icon {
166
+ display: inline-block;
167
+ }
168
+ .wds-Button-icon--start {
169
+ margin-right: 8px;
170
+ margin-right: var(--size-8);
171
+ }
172
+ [dir="rtl"] .wds-Button-icon--start {
173
+ margin-right: 0;
174
+ margin-left: 8px;
175
+ margin-left: var(--size-8);
176
+ }
177
+ .wds-Button-icon--end {
178
+ margin-left: 4px;
179
+ margin-left: var(--size-4);
180
+ }
181
+ [dir="rtl"] .wds-Button-icon--end {
182
+ margin-left: 0;
183
+ margin-right: 4px;
184
+ margin-right: var(--size-4);
185
+ }
186
+ .wds-Button-content {
187
+ position: relative;
188
+ }
189
+ .wds-Button-content--loading .wds-Button-label,
190
+ .wds-Button-content--loading .wds-Button-media,
191
+ .wds-Button-content--loading .wds-Button-icon {
192
+ visibility: hidden;
193
+ opacity: 0;
194
+ }
195
+ .wds-Button-label {
196
+ display: flex;
197
+ justify-content: center;
198
+ align-items: center;
2
199
  position: relative;
3
200
  }
4
- .np-btn.np-btn-block > span.btn-loader {
201
+ .wds-Button-loader {
5
202
  position: absolute;
6
- left: 24px;
7
- left: var(--size-24);
203
+ display: flex;
204
+ justify-content: center;
205
+ align-items: center;
206
+ width: 100%;
207
+ height: 100%;
208
+ }
209
+ .wds-Button-loader .process-circle {
210
+ stroke: var(--Button-color);
211
+ }
212
+ /* RTL Styles */
213
+ [dir="rtl"] .wds-Button .tw-icon-chevron-right,[dir="rtl"] .wds-Button .tw-icon-arrow-right {
214
+ transform: rotate(180deg);
215
+ }
216
+ [dir="rtl"] .wds-Button .tw-icon-chevron-left,[dir="rtl"] .wds-Button .tw-icon-arrow-left {
217
+ transform: rotate(180deg);
8
218
  }
9
- [dir="rtl"] .np-btn.np-btn-block > span.btn-loader {
10
- right: 24px;
11
- right: var(--size-24);
12
- left: auto;
13
- left: initial;
219
+ /* Avatar border transparency */
220
+ /* dark buttons get 20% transparency, light buttons get 12% */
221
+ .wds-Button-avatars .np-circle {
222
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 20%, transparent);
14
223
  }
15
- .np-btn.np-btn-xs > span.btn-loader {
16
- background-size: 16px 16px;
224
+ .np-theme-personal:not(.np-theme-personal--dark):not(.np-theme-personal--forest-green):not(.np-theme-personal--bright-green) .wds-Button--secondary.wds-Button--negative .wds-Button-avatars .np-circle,
225
+ .np-theme-personal:not(.np-theme-personal--dark):not(.np-theme-personal--forest-green):not(.np-theme-personal--bright-green) .wds-Button--secondary .wds-Button-avatars .np-circle,
226
+ .np-theme-personal:not(.np-theme-personal--dark):not(.np-theme-personal--forest-green):not(.np-theme-personal--bright-green) .wds-Button--tertiary .wds-Button-avatars .np-circle,
227
+ .np-theme-personal:not(.np-theme-personal--dark):not(.np-theme-personal--forest-green):not(.np-theme-personal--bright-green) .wds-Button--minimal .wds-Button-avatars .np-circle {
228
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
17
229
  }
18
- .np-btn.np-btn-xs.btn-block > span.btn-loader {
19
- top: 0;
230
+ .np-theme-personal--dark .wds-Button--primary .wds-Button-avatars .np-circle,
231
+ .np-theme-personal--dark .wds-Button--primary.wds-Button--negative .wds-Button-avatars .np-circle,
232
+ .np-theme-personal--forest-green .wds-Button--primary .wds-Button-avatars .np-circle,
233
+ .np-theme-personal--forest-green .wds-Button--primary.wds-Button--negative .wds-Button-avatars .np-circle {
234
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
20
235
  }
21
- .np-btn.disabled[class] {
22
- pointer-events: auto;
236
+ .np-theme-personal--bright-green .wds-Button--tertiary .wds-Button-avatars .np-circle,
237
+ .np-theme-personal--bright-green .wds-Button--minimal .wds-Button-avatars .np-circle {
238
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
23
239
  }
@@ -1,24 +1,242 @@
1
- @import (reference) "../../node_modules/@transferwise/neptune-css/src/less/mixins/_logical-properties.less";
1
+ @import './Button.vars.less';
2
2
 
3
- .np-btn {
4
- position: relative;
3
+ /* Button Styles */
4
+ .wds-Button {
5
+ display: inline-flex;
6
+ flex: none;
7
+ width: auto;
8
+ align-items: center;
9
+ justify-content: center;
10
+ vertical-align: middle;
11
+ text-align: center;
12
+ text-decoration: none;
13
+ white-space: nowrap;
14
+ word-wrap: break-word;
15
+ appearance: none;
16
+ background-color: var(--Button-background);
17
+ border: none;
18
+ border-radius: var(--Button-border-radius);
19
+ color: var(--Button-color);
20
+ cursor: pointer;
21
+ padding: var(--Button-padding);
22
+ transition: color, background-color var(--Button-transition-duration) var(--Button-transition-easing);
5
23
 
6
- &.np-btn-block > span.btn-loader {
7
- position: absolute;
8
- .left(var(--size-24));
24
+ &:focus {
25
+ text-decoration: none;
26
+ }
27
+
28
+ &:hover {
29
+ background-color: var(--Button-background-hover);
30
+ text-decoration: none;
31
+ }
32
+
33
+ &:active {
34
+ background-color: var(--Button-background-active);
35
+ text-decoration: none;
36
+ }
37
+
38
+ &.wds-Button--disabled,
39
+ &:disabled {
40
+ mix-blend-mode: luminosity;
41
+ opacity: 0.45;
42
+ cursor: not-allowed;
43
+
44
+ &:hover,
45
+ &:active {
46
+ background-color: var(--Button-background);
47
+ }
48
+ }
49
+
50
+ // Priority modifiers
51
+ &--secondary {
52
+ --Button-background: var(--Button-secondary-background);
53
+ --Button-background-hover: var(--Button-secondary-background-hover);
54
+ --Button-background-active: var(--Button-secondary-background-active);
55
+ --Button-color: var(--Button-secondary-color);
56
+ }
57
+
58
+ &--tertiary {
59
+ --Button-background: var(--Button-tertiary-background);
60
+ --Button-background-hover: var(--Button-tertiary-background-hover);
61
+ --Button-background-active: var(--Button-tertiary-background-active);
62
+ --Button-color: var(--Button-tertiary-color);
63
+
64
+ .wds-Button-icon--end {
65
+ color: var(--color-interactive-primary);
66
+ }
67
+ }
68
+
69
+ &--minimal {
70
+ --Button-background: var(--Button-minimal-background);
71
+ --Button-background-hover: var(--Button-minimal-background-hover);
72
+ --Button-background-active: var(--Button-minimal-background-active);
73
+ --Button-color: var(--Button-minimal-color);
74
+
75
+ text-decoration: underline;
76
+ text-underline-offset: 3px;
77
+ text-decoration-thickness: 1px;
78
+
79
+ &:hover,
80
+ &:hover:active {
81
+ text-decoration: underline;
82
+ }
83
+ }
84
+
85
+ // Negative styles
86
+ &--negative {
87
+
88
+ &.wds-Button--primary {
89
+ --Button-background: var(--Button-primary-negative-background);
90
+ --Button-background-hover: var(--Button-primary-negative-background-hover);
91
+ --Button-background-active: var(--Button-primary-negative-background-active);
92
+ --Button-color: var(--Button-primary-negative-color);
93
+ }
94
+
95
+ &.wds-Button--secondary {
96
+ --Button-background: var(--Button-secondary-negative-background);
97
+ --Button-background-hover: var(--Button-secondary-negative-background-hover);
98
+ --Button-background-active: var(--Button-secondary-negative-background-active);
99
+ --Button-color: var(--Button-secondary-negative-color);
100
+ }
101
+ }
102
+
103
+ // Size modifiers
104
+ &--small {
105
+ --Button-padding: var(--Button-size-small-padding);
106
+
107
+ .wds-Button-icon--start {
108
+ margin-right: var(--size-4);
109
+ :dir(rtl) & {
110
+ margin-right: 0;
111
+ margin-left: var(--size-4);
112
+ }
113
+ }
9
114
  }
10
115
 
11
- &.np-btn-xs > span.btn-loader {
12
- background-size: 16px 16px;
116
+ &--medium {
117
+ --Button-padding: var(--Button-size-medium-padding);
13
118
  }
14
119
 
15
- &.np-btn-xs.btn-block > span.btn-loader {
16
- top: 0;
120
+ &--large {
121
+ --Button-padding: var(--Button-size-large-padding);
17
122
  }
18
123
 
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;
124
+ // Width mofidiers
125
+ &--block {
126
+ width: 100%;
127
+ }
128
+
129
+ &-avatars {
130
+ display: inline-flex;
131
+ margin-right: 5px;
132
+ margin-left: calc(var(--size-4) * -1);
133
+
134
+ :dir(rtl) & {
135
+ margin-right: 0;
136
+ margin-left: 5px;
137
+ }
138
+
139
+ .np-avatar-view .np-avatar-view-content {
140
+ color: var(--Button-color);
141
+ }
142
+ }
143
+
144
+ // Icon styles
145
+ &-icon {
146
+ display: inline-block;
147
+
148
+ &--start {
149
+ margin-right: var(--size-8);
150
+ :dir(rtl) & {
151
+ margin-right: 0;
152
+ margin-left: var(--size-8);
153
+ }
154
+ }
155
+
156
+ &--end {
157
+ margin-left: var(--size-4);
158
+ :dir(rtl) & {
159
+ margin-left: 0;
160
+ margin-right: var(--size-4);
161
+ }
162
+ }
163
+ }
164
+
165
+ &-content {
166
+ position: relative;
167
+
168
+ &--loading {
169
+ .wds-Button-label,
170
+ .wds-Button-media,
171
+ .wds-Button-icon {
172
+ visibility: hidden;
173
+ opacity: 0;
174
+ }
175
+ }
176
+ }
177
+
178
+ &-label {
179
+ display: flex;
180
+ justify-content: center;
181
+ align-items: center;
182
+ position: relative;
183
+ }
184
+
185
+ &-loader {
186
+ position: absolute;
187
+ display: flex;
188
+ justify-content: center;
189
+ align-items: center;
190
+ width: 100%;
191
+ height: 100%;
192
+
193
+ .process-circle {
194
+ stroke: var(--Button-color);
195
+ }
196
+ }
197
+ }
198
+
199
+ /* RTL Styles */
200
+ :dir(rtl) {
201
+ .wds-Button {
202
+ .tw-icon-chevron-right,
203
+ .tw-icon-arrow-right {
204
+ transform: rotate(180deg);
205
+ }
206
+
207
+ .tw-icon-chevron-left,
208
+ .tw-icon-arrow-left {
209
+ transform: rotate(180deg);
210
+ }
23
211
  }
24
212
  }
213
+
214
+ /* Avatar border transparency */
215
+ /* dark buttons get 20% transparency, light buttons get 12% */
216
+ .wds-Button-avatars {
217
+ .np-circle {
218
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 20%, transparent);
219
+
220
+ .wds-Button--secondary.wds-Button--negative &,
221
+ .wds-Button--secondary &,
222
+ .wds-Button--tertiary &,
223
+ .wds-Button--minimal & {
224
+ .np-theme-personal:not(.np-theme-personal--dark, .np-theme-personal--forest-green, .np-theme-personal--bright-green) & {
225
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
226
+ }
227
+ }
228
+ .wds-Button--primary &,
229
+ .wds-Button--primary.wds-Button--negative & {
230
+ .np-theme-personal--dark &,
231
+ .np-theme-personal--forest-green & {
232
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
233
+ }
234
+ }
235
+ .wds-Button--tertiary &,
236
+ .wds-Button--minimal & {
237
+ .np-theme-personal--bright-green & {
238
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
239
+ }
240
+ }
241
+ }
242
+ }
@@ -0,0 +1,120 @@
1
+ import { forwardRef } from 'react';
2
+ import LegacyButton, { LegacyButtonProps } from './LegacyButton';
3
+ import { ButtonProps as NewButtonProps } from './Button.types';
4
+ import NewButton from './Button';
5
+
6
+ type LegacyButtonType =
7
+ | 'accent'
8
+ | 'negative'
9
+ | 'positive'
10
+ | 'primary'
11
+ | 'pay'
12
+ | 'secondary'
13
+ | 'danger'
14
+ | 'link'
15
+ | null
16
+ | undefined;
17
+
18
+ type NewButtonType = 'button' | 'submit' | 'reset' | LegacyButtonType | undefined;
19
+
20
+ type CommonButtonProps = {
21
+ href?: string;
22
+ target?: string;
23
+ ref?: React.Ref<HTMLButtonElement | HTMLAnchorElement>;
24
+ };
25
+
26
+ export type ButtonProps =
27
+ | (Omit<LegacyButtonProps, 'ref'> &
28
+ CommonButtonProps & {
29
+ priority?: LegacyButtonProps['priority'];
30
+ type?: LegacyButtonType;
31
+ htmlType?: string;
32
+ v2?: false;
33
+ })
34
+ | (Omit<Omit<NewButtonProps, 'type'>, 'ref'> &
35
+ CommonButtonProps & {
36
+ priority?: NewButtonProps['priority'];
37
+ type?: NewButtonType;
38
+ v2: true;
39
+ });
40
+
41
+ const mapProps = (props: LegacyButtonProps): NewButtonProps => {
42
+ const { priority, size, type, as, ...newProps } = props;
43
+
44
+ const priorityMapping: Record<string, Record<string, NewButtonProps['priority']>> = {
45
+ accent: {
46
+ primary: 'primary',
47
+ secondary: 'tertiary',
48
+ tertiary: 'minimal',
49
+ },
50
+ positive: {
51
+ primary: 'primary',
52
+ secondary: 'tertiary',
53
+ tertiary: 'tertiary',
54
+ },
55
+ negative: {
56
+ primary: 'primary',
57
+ secondary: 'secondary',
58
+ tertiary: 'secondary',
59
+ },
60
+ };
61
+
62
+ const mappedPriority =
63
+ type && priority ? priorityMapping[type]?.[priority] || priority : priority || undefined;
64
+ const mappedSentiment = type === 'negative' ? 'negative' : undefined;
65
+
66
+ const legacyButtonTypes: LegacyButtonType[] = [
67
+ 'accent',
68
+ 'negative',
69
+ 'positive',
70
+ 'primary',
71
+ 'pay',
72
+ 'secondary',
73
+ 'danger',
74
+ 'link',
75
+ ];
76
+
77
+ const resolveSize = () => {
78
+ if (size) {
79
+ return { xs: 'sm', sm: 'sm', md: 'md', lg: 'lg' }[size] || size;
80
+ }
81
+
82
+ return size;
83
+ };
84
+
85
+ return {
86
+ ...newProps,
87
+ size: resolveSize(),
88
+ priority: mappedPriority,
89
+ sentiment: mappedSentiment || ('sentiment' in props ? props.sentiment : null),
90
+ type:
91
+ type && !legacyButtonTypes.includes(type as LegacyButtonType) ? type : props.htmlType || null,
92
+ href: as === 'a' ? props.href || '' : null,
93
+ } as NewButtonProps;
94
+ };
95
+
96
+ const Button = forwardRef<HTMLButtonElement | HTMLAnchorElement, ButtonProps>((props, ref) => {
97
+ const { v2 = false, as, ...rest } = props;
98
+
99
+ if (v2) {
100
+ const mappedProps = mapProps(props as LegacyButtonProps);
101
+ return (
102
+ <NewButton
103
+ {...mappedProps}
104
+ ref={ref as React.Ref<HTMLButtonElement | HTMLAnchorElement>}
105
+ as={as}
106
+ />
107
+ );
108
+ }
109
+
110
+ return (
111
+ <LegacyButton
112
+ {...(rest as LegacyButtonProps)}
113
+ ref={ref as React.Ref<HTMLButtonElement | HTMLAnchorElement>}
114
+ />
115
+ );
116
+ });
117
+
118
+ Button.displayName = 'Button';
119
+
120
+ export default Button;