@transferwise/components 0.0.0-experimental-e9257a6 → 0.0.0-experimental-3be0416

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 (114) 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 +86 -79
  6. package/build/button/Button.js.map +1 -1
  7. package/build/button/Button.mjs +87 -80
  8. package/build/button/Button.mjs.map +1 -1
  9. package/build/button/Button.resolver.js +74 -0
  10. package/build/button/Button.resolver.js.map +1 -0
  11. package/build/button/Button.resolver.mjs +72 -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/circularButton/CircularButton.js.map +1 -1
  18. package/build/circularButton/CircularButton.mjs.map +1 -1
  19. package/build/criticalBanner/CriticalCommsBanner.js +2 -2
  20. package/build/criticalBanner/CriticalCommsBanner.js.map +1 -1
  21. package/build/criticalBanner/CriticalCommsBanner.mjs +1 -1
  22. package/build/header/Header.js +2 -2
  23. package/build/header/Header.js.map +1 -1
  24. package/build/header/Header.mjs +1 -1
  25. package/build/index.js +2 -2
  26. package/build/index.mjs +1 -1
  27. package/build/link/Link.js +8 -3
  28. package/build/link/Link.js.map +1 -1
  29. package/build/link/Link.mjs +8 -3
  30. package/build/link/Link.mjs.map +1 -1
  31. package/build/main.css +246 -0
  32. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js +2 -4
  33. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js.map +1 -1
  34. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs +2 -4
  35. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs.map +1 -1
  36. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js +3 -5
  37. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js.map +1 -1
  38. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs +3 -5
  39. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs.map +1 -1
  40. package/build/select/Select.js +2 -2
  41. package/build/select/Select.js.map +1 -1
  42. package/build/select/Select.mjs +1 -1
  43. package/build/styles/avatarLayout/AvatarLayout.css +11 -0
  44. package/build/styles/button/Button.css +227 -15
  45. package/build/styles/button/Button.vars.css +46 -0
  46. package/build/styles/button/LegacyButton.css +23 -0
  47. package/build/styles/main.css +246 -0
  48. package/build/types/avatarLayout/AvatarLayout.d.ts.map +1 -1
  49. package/build/types/button/Button.d.ts +2 -23
  50. package/build/types/button/Button.d.ts.map +1 -1
  51. package/build/types/button/Button.resolver.d.ts +35 -0
  52. package/build/types/button/Button.resolver.d.ts.map +1 -0
  53. package/build/types/button/Button.types.d.ts +70 -0
  54. package/build/types/button/Button.types.d.ts.map +1 -0
  55. package/build/types/button/LegacyButton.d.ts +44 -0
  56. package/build/types/button/LegacyButton.d.ts.map +1 -0
  57. package/build/types/button/index.d.ts +2 -2
  58. package/build/types/button/index.d.ts.map +1 -1
  59. package/build/types/circularButton/CircularButton.d.ts.map +1 -1
  60. package/build/types/link/Link.d.ts +2 -2
  61. package/build/types/link/Link.d.ts.map +1 -1
  62. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.d.ts.map +1 -1
  63. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts +6 -2
  64. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts.map +1 -1
  65. package/build/types/primitives/PrimitiveButton/src/PrimitiveButton.d.ts.map +1 -1
  66. package/build/types/test-utils/story-config.d.ts +1 -1
  67. package/build/types/test-utils/story-config.d.ts.map +1 -1
  68. package/build/upload/steps/completeStep/completeStep.js +2 -2
  69. package/build/upload/steps/completeStep/completeStep.js.map +1 -1
  70. package/build/upload/steps/completeStep/completeStep.mjs +1 -1
  71. package/build/upload/steps/processingStep/processingStep.js +2 -2
  72. package/build/upload/steps/processingStep/processingStep.js.map +1 -1
  73. package/build/upload/steps/processingStep/processingStep.mjs +1 -1
  74. package/build/uploadInput/UploadInput.js +3 -3
  75. package/build/uploadInput/UploadInput.js.map +1 -1
  76. package/build/uploadInput/UploadInput.mjs +1 -1
  77. package/package.json +4 -4
  78. package/src/alert/Alert.tests.story.tsx +1 -1
  79. package/src/avatarLayout/AvatarLayout.css +11 -0
  80. package/src/avatarLayout/AvatarLayout.less +18 -1
  81. package/src/avatarLayout/AvatarLayout.tsx +10 -2
  82. package/src/button/Button.accessibility.docs.mdx +103 -0
  83. package/src/button/Button.css +227 -15
  84. package/src/button/Button.less +239 -14
  85. package/src/button/Button.resolver.tsx +73 -0
  86. package/src/button/Button.spec.tsx +215 -226
  87. package/src/button/Button.story.tsx +761 -134
  88. package/src/button/Button.tests.story.tsx +27 -0
  89. package/src/button/Button.tsx +103 -132
  90. package/src/button/Button.types.ts +92 -0
  91. package/src/button/Button.vars.css +46 -0
  92. package/src/button/Button.vars.less +59 -0
  93. package/src/button/LegacyButton.css +23 -0
  94. package/src/button/LegacyButton.less +24 -0
  95. package/src/button/LegacyButton.spec.tsx +147 -0
  96. package/src/button/LegacyButton.story.tsx +228 -0
  97. package/src/button/LegacyButton.tsx +177 -0
  98. package/src/button/index.ts +2 -3
  99. package/src/circularButton/CircularButton.tsx +1 -0
  100. package/src/field/Field.story.tsx +1 -1
  101. package/src/flowNavigation/__snapshots__/FlowNavigation.spec.js.snap +1 -2
  102. package/src/inputs/SelectInput.story.tsx +1 -1
  103. package/src/label/Label.story.tsx +1 -1
  104. package/src/link/Link.tsx +15 -6
  105. package/src/main.css +246 -0
  106. package/src/main.less +1 -0
  107. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.tsx +2 -8
  108. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.ts +7 -2
  109. package/src/primitives/PrimitiveAnchor/test/PrimitiveAnchor.spec.tsx +1 -3
  110. package/src/primitives/PrimitiveButton/src/PrimitiveButton.tsx +4 -12
  111. package/src/primitives/PrimitiveButton/test/PrimitiveButton.spec.tsx +16 -13
  112. package/src/test-utils/Parameters.d.ts +9 -1
  113. package/src/test-utils/story-config.ts +10 -1
  114. package/src/button/__snapshots__/Button.spec.tsx.snap +0 -309
@@ -1,23 +1,235 @@
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-border-radius: var(--radius-full);
7
+ --Button-label-gap: var(--size-4);
8
+ --Button-large-padding: var(--size-12) var(--size-16);
9
+ --Button-medium-padding: var(--size-8) var(--size-12);
10
+ --Button-small-padding: var(--size-5) var(--size-12);
11
+ --Button-avatar-border-color: var(--color-border-neutral);
12
+ --Button-transition-duration: 150ms;
13
+ --Button-transition-easing: ease-in-out;
14
+ --Button-secondary-background: var(--color-interactive-neutral);
15
+ --Button-secondary-background-hover: var(--color-interactive-neutral-hover);
16
+ --Button-secondary-background-active: var(--color-interactive-neutral-active);
17
+ --Button-secondary-color: var(--color-interactive-primary);
18
+ --Button-tertiary-background: var(--color-background-neutral);
19
+ --Button-tertiary-background-hover: var(--color-background-neutral-hover);
20
+ --Button-tertiary-background-active: var(--color-background-neutral-active);
21
+ --Button-tertiary-color: var(--color-content-primary);
22
+ --Button-minimal-background: transparent;
23
+ --Button-minimal-background-hover: var(--color-background-screen-hover);
24
+ --Button-minimal-background-active: var(--color-background-screen-active);
25
+ --Button-minimal-color: var(--color-interactive-primary);
26
+ --Button-primary-negative-background: var(--color-sentiment-negative-primary);
27
+ --Button-primary-negative-background-hover: var(--color-sentiment-negative-primary-hover);
28
+ --Button-primary-negative-background-active: var(--color-sentiment-negative-primary-active);
29
+ --Button-primary-negative-color: var(--color-contrast-overlay);
30
+ --Button-secondary-negative-background: var(--color-sentiment-negative-secondary);
31
+ --Button-secondary-negative-background-hover: var(--color-sentiment-negative-secondary-hover);
32
+ --Button-secondary-negative-background-active: var(--color-sentiment-negative-secondary-active);
33
+ --Button-secondary-negative-color: var(--color-sentiment-negative-primary);
34
+ }
35
+ .np-theme-personal--bright-green .wds-Button {
36
+ --Button-primary-negative-color: var(--color-white);
37
+ --Button-secondary-color: var(--color-interactive-control);
38
+ --Button-secondary-negative-color: var(--color-white);
39
+ }
40
+ .np-theme-personal--forest-green .wds-Button {
41
+ --Button-secondary-background: var(--color-interactive-neutral);
42
+ --Button-secondary-negative-background: var(--color-sentiment-negative-primary);
43
+ --Button-secondary-negative-background-hover: var(--color-sentiment-negative-primary-hover);
44
+ --Button-secondary-negative-background-active: var(--color-sentiment-negative-primary-active);
45
+ --Button-secondary-negative-color: var(--color-contrast-overlay);
46
+ }
47
+ /* Button Styles */
48
+ .wds-Button {
49
+ display: inline-flex;
50
+ flex: none;
51
+ width: auto;
52
+ align-items: center;
53
+ justify-content: center;
54
+ vertical-align: middle;
55
+ text-align: center;
56
+ white-space: nowrap;
57
+ word-wrap: break-word;
58
+ -webkit-appearance: none;
59
+ -moz-appearance: none;
60
+ appearance: none;
61
+ background-color: var(--Button-background);
62
+ border: none;
63
+ border-radius: var(--Button-border-radius);
64
+ color: var(--Button-color);
65
+ cursor: pointer;
66
+ transition: color, background-color var(--Button-transition-duration) var(--Button-transition-easing);
67
+ }
68
+ .wds-Button,
69
+ .wds-Button:hover,
70
+ .wds-Button:active,
71
+ .wds-Button:focus {
72
+ -webkit-text-decoration: none;
73
+ text-decoration: none;
74
+ }
75
+ .wds-Button:hover {
76
+ background-color: var(--Button-background-hover);
77
+ }
78
+ .wds-Button:active {
79
+ background-color: var(--Button-background-active);
80
+ }
81
+ .wds-Button.wds-Button--disabled,
82
+ .wds-Button:disabled {
83
+ filter: none;
84
+ mix-blend-mode: luminosity;
85
+ opacity: 0.45;
86
+ cursor: not-allowed;
87
+ }
88
+ .wds-Button.wds-Button--disabled,
89
+ .wds-Button:disabled,
90
+ .wds-Button.wds-Button--disabled:hover,
91
+ .wds-Button:disabled:hover,
92
+ .wds-Button.wds-Button--disabled:active,
93
+ .wds-Button:disabled:active {
94
+ background-color: var(--Button-background);
95
+ }
96
+ .wds-Button--secondary {
97
+ --Button-background: var(--Button-secondary-background);
98
+ --Button-background-hover: var(--Button-secondary-background-hover);
99
+ --Button-background-active: var(--Button-secondary-background-active);
100
+ --Button-color: var(--Button-secondary-color);
101
+ }
102
+ .wds-Button--tertiary {
103
+ --Button-background: var(--Button-tertiary-background);
104
+ --Button-background-hover: var(--Button-tertiary-background-hover);
105
+ --Button-background-active: var(--Button-tertiary-background-active);
106
+ --Button-color: var(--Button-tertiary-color);
107
+ }
108
+ .wds-Button--tertiary .wds-Button-icon--end {
109
+ color: var(--color-interactive-primary);
110
+ }
111
+ .wds-Button--minimal {
112
+ --Button-background: var(--Button-minimal-background);
113
+ --Button-background-hover: var(--Button-minimal-background-hover);
114
+ --Button-background-active: var(--Button-minimal-background-active);
115
+ --Button-color: var(--Button-minimal-color);
116
+ }
117
+ .wds-Button--minimal,
118
+ .wds-Button--minimal:hover,
119
+ .wds-Button--minimal:active,
120
+ .wds-Button--minimal:focus {
121
+ -webkit-text-decoration: underline;
122
+ text-decoration: underline;
123
+ text-underline-offset: 3px;
124
+ text-decoration-thickness: 1px;
125
+ }
126
+ .wds-Button--negative.wds-Button--primary {
127
+ --Button-background: var(--Button-primary-negative-background);
128
+ --Button-background-hover: var(--Button-primary-negative-background-hover);
129
+ --Button-background-active: var(--Button-primary-negative-background-active);
130
+ --Button-color: var(--Button-primary-negative-color);
131
+ }
132
+ .wds-Button--negative.wds-Button--secondary {
133
+ --Button-background: var(--Button-secondary-negative-background);
134
+ --Button-background-hover: var(--Button-secondary-negative-background-hover);
135
+ --Button-background-active: var(--Button-secondary-negative-background-active);
136
+ --Button-color: var(--Button-secondary-negative-color);
137
+ }
138
+ .wds-Button--large {
139
+ padding: var(--Button-large-padding);
140
+ }
141
+ .wds-Button--medium {
142
+ padding: var(--Button-medium-padding);
143
+ }
144
+ .wds-Button--medium:has(.wds-Button-avatars) {
145
+ padding-inline-start: 8px;
146
+ padding-inline-start: var(--size-8);
147
+ }
148
+ .wds-Button--medium:has(.wds-Button-icon--end) {
149
+ padding-inline-end: 8px;
150
+ padding-inline-end: var(--size-8);
151
+ }
152
+ .wds-Button--medium .wds-Button-icon--start {
153
+ margin-inline-end: var(--Button-label-gap);
154
+ }
155
+ .wds-Button--small {
156
+ padding: var(--Button-small-padding);
157
+ }
158
+ .wds-Button--small:has(.wds-Button-icon--start) {
159
+ padding-inline-start: 8px;
160
+ padding-inline-start: var(--size-8);
161
+ }
162
+ .wds-Button--small:has(.wds-Button-icon--end) {
163
+ padding-inline-end: 8px;
164
+ padding-inline-end: var(--size-8);
165
+ }
166
+ .wds-Button--block {
167
+ width: 100%;
168
+ }
169
+ .wds-Button-avatars {
170
+ display: inline-flex;
171
+ }
172
+ .wds-Button-avatars .np-avatar-view .np-avatar-view-content {
173
+ color: var(--Button-color);
174
+ }
175
+ .wds-Button-icon {
176
+ display: inline-block;
177
+ }
178
+ .wds-Button-icon--md {
179
+ --Button-iconSize: calc(var(--size-10) + var(--size-8));
180
+ }
181
+ .wds-Button-icon--sm {
182
+ --Button-iconSize: var(--size-16);
183
+ }
184
+ .wds-Button-icon svg {
185
+ width: var(--Button-iconSize);
186
+ height: var(--Button-iconSize);
187
+ }
188
+ .wds-Button-content {
2
189
  position: relative;
3
190
  }
4
- .np-btn.np-btn-block > span.btn-loader {
191
+ .wds-Button-content--loading .wds-Button-label,
192
+ .wds-Button-content--loading .wds-Button-media,
193
+ .wds-Button-content--loading .wds-Button-icon {
194
+ visibility: hidden;
195
+ opacity: 0;
196
+ }
197
+ .wds-Button-label {
198
+ display: flex;
199
+ justify-content: center;
200
+ align-items: center;
201
+ gap: var(--Button-label-gap);
202
+ position: relative;
203
+ }
204
+ .wds-Button-loader {
5
205
  position: absolute;
6
- left: 24px;
7
- left: var(--size-24);
206
+ width: 100%;
207
+ height: 100%;
208
+ }
209
+ .wds-Button-loader .process-circle {
210
+ stroke: var(--Button-color);
211
+ }
212
+ /* Avatar border transparency */
213
+ /* dark buttons get 20% transparency, light buttons get 12% */
214
+ .wds-Button-avatars .np-circle {
215
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 20%, transparent);
8
216
  }
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;
217
+ .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,
218
+ .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,
219
+ .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,
220
+ .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 {
221
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
14
222
  }
15
- .np-btn.np-btn-xs > span.btn-loader {
16
- background-size: 16px 16px;
223
+ .np-theme-personal--dark .wds-Button--primary .wds-Button-avatars .np-circle,
224
+ .np-theme-personal--dark .wds-Button--primary.wds-Button--negative .wds-Button-avatars .np-circle,
225
+ .np-theme-personal--forest-green .wds-Button--primary .wds-Button-avatars .np-circle,
226
+ .np-theme-personal--forest-green .wds-Button--primary.wds-Button--negative .wds-Button-avatars .np-circle {
227
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
17
228
  }
18
- .np-btn.np-btn-xs.btn-block > span.btn-loader {
19
- top: 0;
229
+ .np-theme-personal--bright-green .wds-Button--tertiary .wds-Button-avatars .np-circle,
230
+ .np-theme-personal--bright-green .wds-Button--minimal .wds-Button-avatars .np-circle {
231
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
20
232
  }
21
- .np-btn.disabled[class] {
22
- pointer-events: auto;
233
+ [dir="rtl"] .wds-Button .tw-icon-chevron-right,[dir="rtl"] .wds-Button .tw-icon-arrow-right,[dir="rtl"] .wds-Button .tw-icon-chevron-left,[dir="rtl"] .wds-Button .tw-icon-arrow-left,[dir="rtl"] .wds-Button .tw-icon-arrow-diagonal-down,[dir="rtl"] .wds-Button .tw-icon-arrow-diagonal-up,[dir="rtl"] .wds-Button .tw-icon-list,[dir="rtl"] .wds-Button .tw-icon-activity {
234
+ scale: -1 1;
23
235
  }
@@ -1,24 +1,249 @@
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
+ white-space: nowrap;
13
+ word-wrap: break-word;
14
+ appearance: none;
15
+ background-color: var(--Button-background);
16
+ border: none;
17
+ border-radius: var(--Button-border-radius);
18
+ color: var(--Button-color);
19
+ cursor: pointer;
20
+ transition: color, background-color var(--Button-transition-duration) var(--Button-transition-easing);
5
21
 
6
- &.np-btn-block > span.btn-loader {
7
- position: absolute;
8
- .left(var(--size-24));
22
+ &,
23
+ &:hover,
24
+ &:active,
25
+ &:focus {
26
+ text-decoration: none;
27
+ }
28
+
29
+ &:hover {
30
+ background-color: var(--Button-background-hover);
31
+ }
32
+
33
+ &:active {
34
+ background-color: var(--Button-background-active);
35
+ }
36
+
37
+ &.wds-Button--disabled,
38
+ &:disabled {
39
+ // The declarations below are necessary as design specs for
40
+ // the button's disabled state have changed. This is to be
41
+ // further investigated at a later stage.
42
+ // @see https://transferwise.atlassian.net/browse/DS-7386
43
+ filter: none;
44
+ mix-blend-mode: luminosity;
45
+ opacity: 0.45;
46
+ cursor: not-allowed;
47
+
48
+ &,
49
+ &:hover,
50
+ &:active {
51
+ background-color: var(--Button-background);
52
+ }
9
53
  }
10
54
 
11
- &.np-btn-xs > span.btn-loader {
12
- background-size: 16px 16px;
55
+ // Priority modifiers
56
+ &--secondary {
57
+ --Button-background: var(--Button-secondary-background);
58
+ --Button-background-hover: var(--Button-secondary-background-hover);
59
+ --Button-background-active: var(--Button-secondary-background-active);
60
+ --Button-color: var(--Button-secondary-color);
13
61
  }
14
62
 
15
- &.np-btn-xs.btn-block > span.btn-loader {
16
- top: 0;
63
+ &--tertiary {
64
+ --Button-background: var(--Button-tertiary-background);
65
+ --Button-background-hover: var(--Button-tertiary-background-hover);
66
+ --Button-background-active: var(--Button-tertiary-background-active);
67
+ --Button-color: var(--Button-tertiary-color);
68
+
69
+ .wds-Button-icon--end {
70
+ color: var(--color-interactive-primary);
71
+ }
17
72
  }
18
73
 
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;
74
+ &--minimal {
75
+ --Button-background: var(--Button-minimal-background);
76
+ --Button-background-hover: var(--Button-minimal-background-hover);
77
+ --Button-background-active: var(--Button-minimal-background-active);
78
+ --Button-color: var(--Button-minimal-color);
79
+
80
+ &,
81
+ &:hover,
82
+ &:active,
83
+ &:focus {
84
+ text-decoration: underline;
85
+ text-underline-offset: 3px;
86
+ text-decoration-thickness: 1px;
87
+ }
88
+ }
89
+
90
+ // Negative styles
91
+ &--negative {
92
+ &.wds-Button--primary {
93
+ --Button-background: var(--Button-primary-negative-background);
94
+ --Button-background-hover: var(--Button-primary-negative-background-hover);
95
+ --Button-background-active: var(--Button-primary-negative-background-active);
96
+ --Button-color: var(--Button-primary-negative-color);
97
+ }
98
+
99
+ &.wds-Button--secondary {
100
+ --Button-background: var(--Button-secondary-negative-background);
101
+ --Button-background-hover: var(--Button-secondary-negative-background-hover);
102
+ --Button-background-active: var(--Button-secondary-negative-background-active);
103
+ --Button-color: var(--Button-secondary-negative-color);
104
+ }
105
+ }
106
+
107
+ // Size modifiers
108
+ &--large {
109
+ padding: var(--Button-large-padding);
110
+ }
111
+
112
+ &--medium {
113
+ padding: var(--Button-medium-padding);
114
+
115
+ &:has(.wds-Button-avatars){
116
+ padding-inline-start: var(--size-8);
117
+ }
118
+
119
+ &:has(.wds-Button-icon--end){
120
+ padding-inline-end: var(--size-8);
121
+ }
122
+
123
+ .wds-Button-icon--start{
124
+ margin-inline-end: var(--Button-label-gap);
125
+ }
126
+ }
127
+
128
+ &--small {
129
+ padding: var(--Button-small-padding);
130
+
131
+ &:has(.wds-Button-icon--start){
132
+ padding-inline-start: var(--size-8);
133
+ }
134
+
135
+ &:has(.wds-Button-icon--end){
136
+ padding-inline-end: var(--size-8);
137
+ }
138
+ }
139
+
140
+
141
+
142
+ // Width modifiers
143
+ &--block {
144
+ width: 100%;
145
+ }
146
+
147
+ &-avatars {
148
+ display: inline-flex;
149
+
150
+ .np-avatar-view .np-avatar-view-content {
151
+ color: var(--Button-color);
152
+ }
153
+ }
154
+
155
+ // Icon styles
156
+ &-icon {
157
+ display: inline-block;
158
+
159
+ &--md{
160
+ --Button-iconSize: calc(var(--size-10) + var(--size-8));
161
+ }
162
+
163
+ &--sm{
164
+ --Button-iconSize: var(--size-16);
165
+ }
166
+
167
+ svg {
168
+ width: var(--Button-iconSize);
169
+ height: var(--Button-iconSize);
170
+ }
171
+ }
172
+
173
+ &-content {
174
+ position: relative;
175
+
176
+ &--loading {
177
+ .wds-Button-label,
178
+ .wds-Button-media,
179
+ .wds-Button-icon {
180
+ visibility: hidden;
181
+ opacity: 0;
182
+ }
183
+ }
184
+ }
185
+
186
+ &-label {
187
+ display: flex;
188
+ justify-content: center;
189
+ align-items: center;
190
+ gap: var(--Button-label-gap);
191
+ position: relative;
192
+ }
193
+
194
+ &-loader {
195
+ position: absolute;
196
+ width: 100%;
197
+ height: 100%;
198
+
199
+ .process-circle {
200
+ stroke: var(--Button-color);
201
+ }
202
+ }
203
+ }
204
+
205
+ /* Avatar border transparency */
206
+ /* dark buttons get 20% transparency, light buttons get 12% */
207
+ .wds-Button-avatars {
208
+ .np-circle {
209
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 20%, transparent);
210
+
211
+ .wds-Button--secondary.wds-Button--negative &,
212
+ .wds-Button--secondary &,
213
+ .wds-Button--tertiary &,
214
+ .wds-Button--minimal & {
215
+ .np-theme-personal:not(.np-theme-personal--dark, .np-theme-personal--forest-green, .np-theme-personal--bright-green) & {
216
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
217
+ }
218
+ }
219
+ .wds-Button--primary &,
220
+ .wds-Button--primary.wds-Button--negative & {
221
+ .np-theme-personal--dark &,
222
+ .np-theme-personal--forest-green & {
223
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
224
+ }
225
+ }
226
+ .wds-Button--tertiary &,
227
+ .wds-Button--minimal & {
228
+ .np-theme-personal--bright-green & {
229
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
230
+ }
231
+ }
232
+ }
233
+ }
234
+
235
+
236
+ :dir(rtl) {
237
+ .wds-Button {
238
+ .tw-icon-chevron-right,
239
+ .tw-icon-arrow-right,
240
+ .tw-icon-chevron-left,
241
+ .tw-icon-arrow-left,
242
+ .tw-icon-arrow-diagonal-down,
243
+ .tw-icon-arrow-diagonal-up,
244
+ .tw-icon-list,
245
+ .tw-icon-activity {
246
+ scale: -1 1;
247
+ }
23
248
  }
24
249
  }
@@ -0,0 +1,73 @@
1
+ import { forwardRef } from 'react';
2
+ import LegacyButton, { LegacyButtonProps } from './LegacyButton';
3
+ import { ButtonReferenceType, ButtonProps as NewButtonProps } from './Button.types';
4
+ import NewButton from './Button';
5
+
6
+ export type ButtonProps = LegacyButtonProps | NewButtonProps;
7
+
8
+ const mapProps = (props: LegacyButtonProps): NewButtonProps => {
9
+ const { priority, size, type, ...newProps } = props;
10
+
11
+ const priorityMapping: Record<string, Record<string, NewButtonProps['priority']>> = {
12
+ accent: {
13
+ primary: 'primary',
14
+ secondary: 'tertiary',
15
+ tertiary: 'minimal',
16
+ },
17
+ positive: {
18
+ primary: 'primary',
19
+ secondary: 'tertiary',
20
+ tertiary: 'tertiary',
21
+ },
22
+ negative: {
23
+ primary: 'primary',
24
+ secondary: 'secondary',
25
+ tertiary: 'secondary',
26
+ },
27
+ };
28
+
29
+ const mappedPriority =
30
+ type && priority ? priorityMapping[type]?.[priority] || priority : priority || undefined;
31
+ const mappedSentiment = type === 'negative' ? 'negative' : undefined;
32
+
33
+ const legacyButtonTypes: LegacyButtonProps['type'][] = [
34
+ 'accent',
35
+ 'negative',
36
+ 'positive',
37
+ 'primary',
38
+ 'pay',
39
+ 'secondary',
40
+ 'danger',
41
+ 'link',
42
+ ];
43
+
44
+ const resolveSize = () => {
45
+ if (size) {
46
+ return { xs: 'sm', sm: 'sm', md: 'md', lg: 'lg' }[size] || size;
47
+ }
48
+
49
+ return size;
50
+ };
51
+
52
+ return {
53
+ ...newProps,
54
+ size: resolveSize(),
55
+ priority: mappedPriority,
56
+ sentiment: mappedSentiment || ('sentiment' in props ? props.sentiment : null),
57
+ type: type && !legacyButtonTypes.includes(type) ? type : props.htmlType || null,
58
+ v2: true,
59
+ } as NewButtonProps;
60
+ };
61
+
62
+ const Button = forwardRef<ButtonReferenceType, ButtonProps>(({ v2 = false, ...props }, ref) => {
63
+ if (v2) {
64
+ const mappedProps = mapProps(props as LegacyButtonProps);
65
+ return <NewButton {...mappedProps} ref={ref} />;
66
+ }
67
+
68
+ return <LegacyButton {...(props as LegacyButtonProps)} ref={ref} />;
69
+ });
70
+
71
+ Button.displayName = 'Button';
72
+
73
+ export default Button;