@transferwise/components 0.0.0-experimental-4c79cff → 0.0.0-experimental-28a3dd5

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 (183) hide show
  1. package/build/avatarLayout/AvatarLayout.js +10 -4
  2. package/build/avatarLayout/AvatarLayout.js.map +1 -1
  3. package/build/avatarLayout/AvatarLayout.mjs +10 -4
  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/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 -4
  44. package/build/index.js.map +1 -1
  45. package/build/index.mjs +1 -2
  46. package/build/index.mjs.map +1 -1
  47. package/build/link/Link.js +8 -3
  48. package/build/link/Link.js.map +1 -1
  49. package/build/link/Link.mjs +8 -3
  50. package/build/link/Link.mjs.map +1 -1
  51. package/build/main.css +227 -13
  52. package/build/nudge/Nudge.js.map +1 -1
  53. package/build/nudge/Nudge.mjs.map +1 -1
  54. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js +2 -4
  55. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js.map +1 -1
  56. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs +2 -4
  57. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs.map +1 -1
  58. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js +3 -5
  59. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js.map +1 -1
  60. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs +3 -5
  61. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs.map +1 -1
  62. package/build/select/Select.js +2 -2
  63. package/build/select/Select.js.map +1 -1
  64. package/build/select/Select.mjs +1 -1
  65. package/build/styles/avatarLayout/AvatarLayout.css +12 -2
  66. package/build/styles/button/Button.css +207 -15
  67. package/build/styles/button/Button.vars.css +46 -0
  68. package/build/styles/button/LegacyButton.css +23 -0
  69. package/build/styles/main.css +227 -13
  70. package/build/styles/nudge/Nudge.css +0 -11
  71. package/build/types/avatarLayout/AvatarLayout.d.ts.map +1 -1
  72. package/build/types/button/Button.d.ts +2 -23
  73. package/build/types/button/Button.d.ts.map +1 -1
  74. package/build/types/button/Button.resolver.d.ts +33 -0
  75. package/build/types/button/Button.resolver.d.ts.map +1 -0
  76. package/build/types/button/Button.types.d.ts +67 -0
  77. package/build/types/button/Button.types.d.ts.map +1 -0
  78. package/build/types/button/LegacyButton.d.ts +30 -0
  79. package/build/types/button/LegacyButton.d.ts.map +1 -0
  80. package/build/types/button/index.d.ts +2 -2
  81. package/build/types/button/index.d.ts.map +1 -1
  82. package/build/types/index.d.ts +0 -2
  83. package/build/types/index.d.ts.map +1 -1
  84. package/build/types/link/Link.d.ts +2 -2
  85. package/build/types/link/Link.d.ts.map +1 -1
  86. package/build/types/nudge/Nudge.d.ts +1 -1
  87. package/build/types/nudge/Nudge.d.ts.map +1 -1
  88. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.d.ts.map +1 -1
  89. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts +6 -2
  90. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts.map +1 -1
  91. package/build/types/primitives/PrimitiveButton/src/PrimitiveButton.d.ts.map +1 -1
  92. package/build/types/test-utils/story-config.d.ts +1 -1
  93. package/build/types/test-utils/story-config.d.ts.map +1 -1
  94. package/build/types/uploadInput/uploadButton/getAllowedFileTypes.d.ts.map +1 -1
  95. package/build/upload/steps/completeStep/completeStep.js +2 -2
  96. package/build/upload/steps/completeStep/completeStep.js.map +1 -1
  97. package/build/upload/steps/completeStep/completeStep.mjs +1 -1
  98. package/build/upload/steps/processingStep/processingStep.js +2 -2
  99. package/build/upload/steps/processingStep/processingStep.js.map +1 -1
  100. package/build/upload/steps/processingStep/processingStep.mjs +1 -1
  101. package/build/uploadInput/UploadInput.js +3 -3
  102. package/build/uploadInput/UploadInput.js.map +1 -1
  103. package/build/uploadInput/UploadInput.mjs +1 -1
  104. package/build/uploadInput/uploadButton/getAllowedFileTypes.js +3 -23
  105. package/build/uploadInput/uploadButton/getAllowedFileTypes.js.map +1 -1
  106. package/build/uploadInput/uploadButton/getAllowedFileTypes.mjs +3 -23
  107. package/build/uploadInput/uploadButton/getAllowedFileTypes.mjs.map +1 -1
  108. package/package.json +3 -3
  109. package/src/alert/Alert.tests.story.tsx +1 -1
  110. package/src/avatarLayout/AvatarLayout.css +12 -2
  111. package/src/avatarLayout/AvatarLayout.less +19 -2
  112. package/src/avatarLayout/AvatarLayout.tsx +10 -3
  113. package/src/button/Button.css +207 -15
  114. package/src/button/Button.less +214 -14
  115. package/src/button/Button.resolver.tsx +73 -0
  116. package/src/button/Button.spec.tsx +188 -224
  117. package/src/button/Button.story.tsx +701 -135
  118. package/src/button/Button.tests.story.tsx +27 -0
  119. package/src/button/Button.tsx +99 -131
  120. package/src/button/Button.types.ts +94 -0
  121. package/src/button/Button.vars.css +46 -0
  122. package/src/button/Button.vars.less +60 -0
  123. package/src/button/LegacyButton.css +23 -0
  124. package/src/button/LegacyButton.less +24 -0
  125. package/src/button/LegacyButton.spec.tsx +147 -0
  126. package/src/button/LegacyButton.story.tsx +220 -0
  127. package/src/button/LegacyButton.tsx +160 -0
  128. package/src/button/index.ts +2 -3
  129. package/src/drawer/Drawer.rtl.spec.tsx +59 -0
  130. package/src/drawer/Drawer.spec.js +101 -0
  131. package/src/drawer/__snapshots__/Drawer.rtl.spec.tsx.snap +55 -0
  132. package/src/field/Field.story.tsx +1 -1
  133. package/src/flowNavigation/__snapshots__/FlowNavigation.spec.js.snap +1 -2
  134. package/src/i18n/ja.json +0 -1
  135. package/src/i18n/pt.json +0 -1
  136. package/src/i18n/ru.json +0 -1
  137. package/src/i18n/zh-HK.json +0 -1
  138. package/src/index.ts +0 -12
  139. package/src/inputs/SelectInput.story.tsx +1 -1
  140. package/src/label/Label.story.tsx +1 -1
  141. package/src/link/Link.tsx +15 -6
  142. package/src/main.css +227 -13
  143. package/src/main.less +1 -0
  144. package/src/nudge/Nudge.css +0 -11
  145. package/src/nudge/Nudge.less +0 -3
  146. package/src/nudge/Nudge.story.tsx +0 -10
  147. package/src/nudge/Nudge.tsx +1 -2
  148. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.tsx +2 -8
  149. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.ts +7 -2
  150. package/src/primitives/PrimitiveAnchor/test/PrimitiveAnchor.spec.tsx +1 -3
  151. package/src/primitives/PrimitiveButton/src/PrimitiveButton.tsx +4 -12
  152. package/src/primitives/PrimitiveButton/test/PrimitiveButton.spec.tsx +16 -13
  153. package/src/test-utils/Parameters.d.ts +9 -1
  154. package/src/test-utils/story-config.ts +10 -1
  155. package/src/uploadInput/UploadInput.tests.story.tsx +5 -5
  156. package/src/uploadInput/uploadButton/getAllowedFileTypes.spec.ts +0 -12
  157. package/src/uploadInput/uploadButton/getAllowedFileTypes.ts +7 -33
  158. package/build/table/Table.js +0 -166
  159. package/build/table/Table.js.map +0 -1
  160. package/build/table/Table.messages.js +0 -24
  161. package/build/table/Table.messages.js.map +0 -1
  162. package/build/table/Table.messages.mjs +0 -22
  163. package/build/table/Table.messages.mjs.map +0 -1
  164. package/build/table/Table.mjs +0 -164
  165. package/build/table/Table.mjs.map +0 -1
  166. package/build/table/TableCell.js +0 -86
  167. package/build/table/TableCell.js.map +0 -1
  168. package/build/table/TableCell.mjs +0 -84
  169. package/build/table/TableCell.mjs.map +0 -1
  170. package/build/table/TableHeader.js +0 -57
  171. package/build/table/TableHeader.js.map +0 -1
  172. package/build/table/TableHeader.mjs +0 -55
  173. package/build/table/TableHeader.mjs.map +0 -1
  174. package/build/table/TableRow.js +0 -85
  175. package/build/table/TableRow.js.map +0 -1
  176. package/build/table/TableRow.mjs +0 -83
  177. package/build/table/TableRow.mjs.map +0 -1
  178. package/build/table/TableStatusText.js +0 -54
  179. package/build/table/TableStatusText.js.map +0 -1
  180. package/build/table/TableStatusText.mjs +0 -52
  181. package/build/table/TableStatusText.mjs.map +0 -1
  182. package/src/button/__snapshots__/Button.spec.tsx.snap +0 -309
  183. package/src/drawer/Drawer.spec.tsx +0 -93
@@ -5,7 +5,7 @@ import { Flag } from '@wise/art';
5
5
  import { clsx } from 'clsx';
6
6
  import { useState } from 'react';
7
7
 
8
- import Button from '../button/Button';
8
+ import Button from '../button';
9
9
  import { getMonthNames } from '../common/dateUtils';
10
10
  import Drawer from '../drawer';
11
11
  import { Field } from '../field/Field';
@@ -3,7 +3,7 @@ import { Label } from './Label';
3
3
 
4
4
  export default {
5
5
  component: Label,
6
- title: 'Label',
6
+ title: 'Forms/Label',
7
7
  tags: ['autodocs'],
8
8
  };
9
9
 
package/src/link/Link.tsx CHANGED
@@ -1,13 +1,14 @@
1
1
  import { NavigateAway as NavigateAwayIcon } from '@transferwise/icons';
2
2
  import { clsx } from 'clsx';
3
- import { AnchorHTMLAttributes } from 'react';
4
3
  import { useIntl } from 'react-intl';
4
+ import { PrimitiveAnchor } from '../primitives';
5
+ import type { PrimitiveAnchorProps } from '../primitives';
5
6
 
6
7
  import { LinkLarge, LinkDefault } from '../common';
7
8
 
8
9
  import messages from './Link.messages';
9
10
 
10
- export type Props = AnchorHTMLAttributes<HTMLAnchorElement> & { type?: LinkLarge | LinkDefault };
11
+ export type Props = PrimitiveAnchorProps & { type?: LinkLarge | LinkDefault };
11
12
 
12
13
  /**
13
14
  * Standard Link component with navigate away icon
@@ -24,22 +25,30 @@ const Link = ({
24
25
  onClick,
25
26
  ...props
26
27
  }: Props) => {
28
+ const { formatMessage } = useIntl();
27
29
  const isBlank = target === '_blank';
28
30
 
29
- const { formatMessage } = useIntl();
31
+ const classNames = clsx(
32
+ 'np-link',
33
+ 'd-inline-flex',
34
+ {
35
+ [`np-text-${type}`]: type,
36
+ },
37
+ className,
38
+ );
30
39
 
31
40
  return (
32
- <a
41
+ <PrimitiveAnchor
33
42
  href={href}
34
43
  target={target}
35
- className={clsx('np-link', type ? `np-text-${type}` : undefined, 'd-inline-flex', className)}
44
+ className={classNames}
36
45
  aria-label={ariaLabel}
37
46
  rel={isBlank ? 'noreferrer' : undefined}
38
47
  onClick={onClick}
39
48
  {...props}
40
49
  >
41
50
  {children} {isBlank && <NavigateAwayIcon title={formatMessage(messages.opensInNewTab)} />}
42
- </a>
51
+ </PrimitiveAnchor>
43
52
  );
44
53
  };
45
54
 
package/src/main.css CHANGED
@@ -518,13 +518,20 @@ div.critical-comms .critical-comms-body {
518
518
  -webkit-mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) right calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
519
519
  mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) right calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
520
520
  }
521
+ [dir="rtl"] .np-avatar-layout-diagonal-mask {
522
+ -webkit-mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) left calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
523
+ mask-image: radial-gradient(circle at bottom calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)) left calc(100% - var(--np-avatar-size) - var(--np-avatar-offset)), transparent 0, transparent calc(var(--np-avatar-size) / 2 + 2px), black 0);
524
+ }
521
525
  .np-avatar-layout-diagonal-child {
522
526
  margin-left: calc(var(--np-avatar-layout-size) - var(--np-avatar-size) * 2);
523
527
  margin-top: calc(var(--np-avatar-layout-size) - var(--np-avatar-size));
524
528
  }
529
+ [dir="rtl"] .np-avatar-layout-diagonal-child {
530
+ margin-left: 0;
531
+ margin-right: calc(var(--np-avatar-layout-size) - var(--np-avatar-size) * 2);
532
+ }
525
533
  .np-avatar-layout-horizontal {
526
- width: calc(var(--np-avatar-size) * var(--np-avatar-avatars-count) - (var(--np-avatar-offset) * (var(--np-avatar-avatars-count) - 1)));
527
- width: calc(var(--np-avatar-size) * var(--np-avatar-avatars-count) - calc(var(--np-avatar-offset) * calc(var(--np-avatar-avatars-count) - 1)));
534
+ width: calc(var(--np-avatar-size) * 2 - var(--np-avatar-offset));
528
535
  height: var(--np-avatar-layout-size);
529
536
  }
530
537
  .np-avatar-layout-horizontal-mask {
@@ -536,6 +543,9 @@ div.critical-comms .critical-comms-body {
536
543
  .np-avatar-layout-horizontal-child {
537
544
  margin-left: calc(var(--np-avatar-offset) * -1);
538
545
  }
546
+ [dir="rtl"] .np-avatar-layout-horizontal-child {
547
+ margin-right: calc(var(--np-avatar-offset) * -1);
548
+ }
539
549
  .np-icon-button {
540
550
  border: none;
541
551
  }
@@ -706,6 +716,221 @@ div.critical-comms .critical-comms-body {
706
716
  .np-btn.disabled[class] {
707
717
  pointer-events: auto;
708
718
  }
719
+ .wds-Button {
720
+ --Button-background: var(--color-interactive-accent);
721
+ --Button-background-hover: var(--color-interactive-accent-hover);
722
+ --Button-background-active: var(--color-interactive-accent-active);
723
+ --Button-color: var(--color-interactive-control);
724
+ --Button-border-radius: var(--radius-full);
725
+ --Button-label-gap: var(--size-4);
726
+ --Button-large-padding: var(--size-12) var(--size-16);
727
+ --Button-medium-padding: var(--size-8) var(--size-12);
728
+ --Button-small-padding: calc(var(--size-10) * 0.5) var(--size-12);
729
+ --Button-avatar-border-color: var(--color-border-neutral);
730
+ --Button-transition-duration: 150ms;
731
+ --Button-transition-easing: ease-in-out;
732
+ --Button-secondary-background: var(--color-interactive-neutral);
733
+ --Button-secondary-background-hover: var(--color-interactive-neutral-hover);
734
+ --Button-secondary-background-active: var(--color-interactive-neutral-active);
735
+ --Button-secondary-color: var(--color-interactive-primary);
736
+ --Button-tertiary-background: var(--color-background-neutral);
737
+ --Button-tertiary-background-hover: var(--color-background-neutral-hover);
738
+ --Button-tertiary-background-active: var(--color-background-neutral-active);
739
+ --Button-tertiary-color: var(--color-content-primary);
740
+ --Button-minimal-background: transparent;
741
+ --Button-minimal-background-hover: var(--color-background-screen-hover);
742
+ --Button-minimal-background-active: var(--color-background-screen-active);
743
+ --Button-minimal-color: var(--color-interactive-primary);
744
+ --Button-primary-negative-background: var(--color-sentiment-negative-primary);
745
+ --Button-primary-negative-background-hover: var(--color-sentiment-negative-primary-hover);
746
+ --Button-primary-negative-background-active: var(--color-sentiment-negative-primary-active);
747
+ --Button-primary-negative-color: var(--color-contrast-overlay);
748
+ --Button-secondary-negative-background: var(--color-sentiment-negative-secondary);
749
+ --Button-secondary-negative-background-hover: var(--color-sentiment-negative-secondary-hover);
750
+ --Button-secondary-negative-background-active: var(--color-sentiment-negative-secondary-active);
751
+ --Button-secondary-negative-color: var(--color-sentiment-negative-primary);
752
+ }
753
+ .np-theme-personal--bright-green .wds-Button {
754
+ --Button-primary-negative-color: var(--color-white);
755
+ --Button-secondary-color: var(--color-interactive-control);
756
+ --Button-secondary-negative-color: var(--color-white);
757
+ }
758
+ .np-theme-personal--forest-green .wds-Button {
759
+ --Button-secondary-background: var(--color-interactive-neutral);
760
+ --Button-secondary-negative-background: var(--color-sentiment-negative-primary);
761
+ --Button-secondary-negative-background-hover: var(--color-sentiment-negative-primary-hover);
762
+ --Button-secondary-negative-background-active: var(--color-sentiment-negative-primary-active);
763
+ --Button-secondary-negative-color: var(--color-contrast-overlay);
764
+ }
765
+ /* Button Styles */
766
+ .wds-Button {
767
+ display: inline-flex;
768
+ flex: none;
769
+ width: auto;
770
+ align-items: center;
771
+ justify-content: center;
772
+ vertical-align: middle;
773
+ text-align: center;
774
+ -webkit-text-decoration: none;
775
+ text-decoration: none;
776
+ white-space: nowrap;
777
+ word-wrap: break-word;
778
+ -webkit-appearance: none;
779
+ -moz-appearance: none;
780
+ appearance: none;
781
+ background-color: var(--Button-background);
782
+ border: none;
783
+ border-radius: var(--Button-border-radius);
784
+ color: var(--Button-color);
785
+ cursor: pointer;
786
+ transition: color, background-color var(--Button-transition-duration) var(--Button-transition-easing);
787
+ }
788
+ .wds-Button:hover {
789
+ background-color: var(--Button-background-hover);
790
+ }
791
+ .wds-Button:active {
792
+ background-color: var(--Button-background-active);
793
+ }
794
+ .wds-Button.wds-Button--disabled,
795
+ .wds-Button:disabled {
796
+ filter: none;
797
+ mix-blend-mode: luminosity;
798
+ opacity: 0.45;
799
+ cursor: not-allowed;
800
+ }
801
+ .wds-Button.wds-Button--disabled,
802
+ .wds-Button:disabled,
803
+ .wds-Button.wds-Button--disabled:hover,
804
+ .wds-Button:disabled:hover,
805
+ .wds-Button.wds-Button--disabled:active,
806
+ .wds-Button:disabled:active {
807
+ background-color: var(--Button-background);
808
+ }
809
+ .wds-Button--secondary {
810
+ --Button-background: var(--Button-secondary-background);
811
+ --Button-background-hover: var(--Button-secondary-background-hover);
812
+ --Button-background-active: var(--Button-secondary-background-active);
813
+ --Button-color: var(--Button-secondary-color);
814
+ }
815
+ .wds-Button--tertiary {
816
+ --Button-background: var(--Button-tertiary-background);
817
+ --Button-background-hover: var(--Button-tertiary-background-hover);
818
+ --Button-background-active: var(--Button-tertiary-background-active);
819
+ --Button-color: var(--Button-tertiary-color);
820
+ }
821
+ .wds-Button--tertiary .wds-Button-icon--end {
822
+ color: var(--color-interactive-primary);
823
+ }
824
+ .wds-Button--minimal {
825
+ --Button-background: var(--Button-minimal-background);
826
+ --Button-background-hover: var(--Button-minimal-background-hover);
827
+ --Button-background-active: var(--Button-minimal-background-active);
828
+ --Button-color: var(--Button-minimal-color);
829
+ -webkit-text-decoration: underline;
830
+ text-decoration: underline;
831
+ text-underline-offset: 3px;
832
+ text-decoration-thickness: 1px;
833
+ }
834
+ .wds-Button--negative.wds-Button--primary {
835
+ --Button-background: var(--Button-primary-negative-background);
836
+ --Button-background-hover: var(--Button-primary-negative-background-hover);
837
+ --Button-background-active: var(--Button-primary-negative-background-active);
838
+ --Button-color: var(--Button-primary-negative-color);
839
+ }
840
+ .wds-Button--negative.wds-Button--secondary {
841
+ --Button-background: var(--Button-secondary-negative-background);
842
+ --Button-background-hover: var(--Button-secondary-negative-background-hover);
843
+ --Button-background-active: var(--Button-secondary-negative-background-active);
844
+ --Button-color: var(--Button-secondary-negative-color);
845
+ }
846
+ .wds-Button--large {
847
+ padding: var(--Button-large-padding);
848
+ }
849
+ .wds-Button--medium {
850
+ padding: var(--Button-medium-padding);
851
+ }
852
+ .wds-Button--medium:has(.wds-Button-avatars) {
853
+ padding-inline-start: 8px;
854
+ padding-inline-start: var(--size-8);
855
+ }
856
+ .wds-Button--medium:has(.wds-Button-icon--end) {
857
+ padding-inline-end: 8px;
858
+ padding-inline-end: var(--size-8);
859
+ }
860
+ .wds-Button--medium .wds-Button-icon--start {
861
+ margin-inline-end: var(--Button-label-gap);
862
+ }
863
+ .wds-Button--small {
864
+ padding: var(--Button-small-padding);
865
+ }
866
+ .wds-Button--small:has(.wds-Button-icon--start) {
867
+ padding-inline-start: 8px;
868
+ padding-inline-start: var(--size-8);
869
+ }
870
+ .wds-Button--small:has(.wds-Button-icon--end) {
871
+ padding-inline-end: 8px;
872
+ padding-inline-end: var(--size-8);
873
+ }
874
+ .wds-Button--block {
875
+ width: 100%;
876
+ }
877
+ .wds-Button-avatars {
878
+ display: inline-flex;
879
+ }
880
+ .wds-Button-avatars .np-avatar-view .np-avatar-view-content {
881
+ color: var(--Button-color);
882
+ }
883
+ .wds-Button-icon {
884
+ display: inline-block;
885
+ }
886
+ .wds-Button-content {
887
+ position: relative;
888
+ }
889
+ .wds-Button-content--loading .wds-Button-label,
890
+ .wds-Button-content--loading .wds-Button-media,
891
+ .wds-Button-content--loading .wds-Button-icon {
892
+ visibility: hidden;
893
+ opacity: 0;
894
+ }
895
+ .wds-Button-label {
896
+ display: flex;
897
+ justify-content: center;
898
+ align-items: center;
899
+ gap: var(--Button-label-gap);
900
+ position: relative;
901
+ }
902
+ .wds-Button-loader {
903
+ position: absolute;
904
+ width: 100%;
905
+ height: 100%;
906
+ }
907
+ .wds-Button-loader .process-circle {
908
+ stroke: var(--Button-color);
909
+ }
910
+ /* Avatar border transparency */
911
+ /* dark buttons get 20% transparency, light buttons get 12% */
912
+ .wds-Button-avatars .np-circle {
913
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 20%, transparent);
914
+ }
915
+ .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,
916
+ .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,
917
+ .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,
918
+ .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 {
919
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
920
+ }
921
+ .np-theme-personal--dark .wds-Button--primary .wds-Button-avatars .np-circle,
922
+ .np-theme-personal--dark .wds-Button--primary.wds-Button--negative .wds-Button-avatars .np-circle,
923
+ .np-theme-personal--forest-green .wds-Button--primary .wds-Button-avatars .np-circle,
924
+ .np-theme-personal--forest-green .wds-Button--primary.wds-Button--negative .wds-Button-avatars .np-circle {
925
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
926
+ }
927
+ .np-theme-personal--bright-green .wds-Button--tertiary .wds-Button-avatars .np-circle,
928
+ .np-theme-personal--bright-green .wds-Button--minimal .wds-Button-avatars .np-circle {
929
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
930
+ }
931
+ [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 {
932
+ scale: -1 1;
933
+ }
709
934
  .np-card {
710
935
  overflow: hidden;
711
936
  transition-property: transform, box-shadow;
@@ -3689,17 +3914,6 @@ html:not([dir="rtl"]) .np-navigation-option {
3689
3914
  margin-left: 0;
3690
3915
  margin-right: 1px;
3691
3916
  }
3692
- .wds-nudge-media-flower {
3693
- margin-left: -24px;
3694
- margin-top: 11px;
3695
- position: absolute;
3696
- width: 156px;
3697
- }
3698
- [dir="rtl"] .wds-nudge-media-flower {
3699
- transform: scaleX(-1);
3700
- margin-left: 0;
3701
- margin-right: -24px;
3702
- }
3703
3917
  .wds-nudge-container {
3704
3918
  align-items: stretch;
3705
3919
  display: flex;
package/src/main.less CHANGED
@@ -7,6 +7,7 @@
7
7
  @import "./avatarLayout/AvatarLayout.less";
8
8
  @import "./iconButton/IconButton.less";
9
9
  @import "./badge/Badge.less";
10
+ @import "./button/LegacyButton.less";
10
11
  @import "./button/Button.less";
11
12
  @import "./card/Card.less";
12
13
  @import "./carousel/Carousel.less";
@@ -136,17 +136,6 @@
136
136
  margin-left: 0;
137
137
  margin-right: 1px;
138
138
  }
139
- .wds-nudge-media-flower {
140
- margin-left: -24px;
141
- margin-top: 11px;
142
- position: absolute;
143
- width: 156px;
144
- }
145
- [dir="rtl"] .wds-nudge-media-flower {
146
- transform: scaleX(-1);
147
- margin-left: 0;
148
- margin-right: -24px;
149
- }
150
139
  .wds-nudge-container {
151
140
  align-items: stretch;
152
141
  display: flex;
@@ -65,9 +65,6 @@
65
65
  &-shopping-bag {
66
66
  .media-position(116px, 1px, 14px);
67
67
  }
68
- &-flower {
69
- .media-position(156px, -24px, 11px);
70
- }
71
68
  }
72
69
 
73
70
  &-container {
@@ -104,16 +104,6 @@ export const Default = () => {
104
104
  onClick={action('action clicked')}
105
105
  onDismiss={action('dismissed')}
106
106
  />
107
-
108
- <Nudge
109
- mediaName={Assets.FLOWER}
110
- className="m-b-2"
111
- title="Text that is no longer than two lines."
112
- link="Link"
113
- href="#"
114
- onClick={action('action clicked')}
115
- onDismiss={action('dismissed')}
116
- />
117
107
  </div>
118
108
  );
119
109
  };
@@ -38,8 +38,7 @@ type MediaNameType =
38
38
  | `${Assets.BUSINESS_CARD}`
39
39
  | `${Assets.HEART}`
40
40
  | `${Assets.MULTI_CURRENCY}`
41
- | `${Assets.SHOPPING_BAG}`
42
- | `${Assets.FLOWER}`;
41
+ | `${Assets.SHOPPING_BAG}`;
43
42
 
44
43
  type BaseProps = {
45
44
  /** @deprecated use `mediaName` property instead */
@@ -30,13 +30,7 @@ const PrimitiveAnchor = forwardRef<HTMLAnchorElement, PrimitiveAnchorProps>(
30
30
  },
31
31
  ref,
32
32
  ) => {
33
- const anchorClasses = clsx(
34
- 'wds-Anchor',
35
- {
36
- 'wds-Anchor--disabled': disabled,
37
- },
38
- className,
39
- );
33
+ const anchorClasses = clsx(className);
40
34
 
41
35
  const handleClick = useCallback(
42
36
  (event: React.MouseEvent<HTMLAnchorElement>) => {
@@ -96,7 +90,7 @@ const PrimitiveAnchor = forwardRef<HTMLAnchorElement, PrimitiveAnchorProps>(
96
90
  * https://www.scottohara.me/blog/2021/05/28/disabled-links.html
97
91
  */
98
92
  const anchorProps = {
99
- 'aria-disabled': disabled,
93
+ 'aria-disabled': disabled || undefined,
100
94
  className: anchorClasses,
101
95
  'data-testid': testId,
102
96
  href: disabled ? undefined : href,
@@ -13,16 +13,21 @@ export type PrimitiveAnchorElementRef = React.Ref<HTMLAnchorElement>;
13
13
  export interface PrimitiveAnchorProps
14
14
  extends BasePrimitiveProps,
15
15
  StyleProp,
16
- Omit<PrimitiveAnchorAttributes, 'role'> {
16
+ Omit<PrimitiveAnchorAttributes, 'role' | 'type'> {
17
17
  /** Content of the anchor */
18
18
  children?: ReactNode;
19
19
 
20
20
  /** The URL to navigate to when the anchor is clicked */
21
- href: string;
21
+ href?: string | undefined;
22
22
 
23
23
  /** Disable the anchor */
24
24
  disabled?: boolean;
25
25
 
26
26
  /** Reference to the anchor element */
27
27
  ref?: PrimitiveAnchorElementRef;
28
+
29
+ /**
30
+ * HTML anchor `target` attribute. If set to `_blank`, `rel="noopener noreferrer"` is automatically added to the rendered node.
31
+ */
32
+ target?: HTMLAnchorElement['target'];
28
33
  }
@@ -1,5 +1,5 @@
1
1
  import { render, screen } from '@testing-library/react';
2
- import PrimitiveAnchor from '..';
2
+ import PrimitiveAnchor from '../src';
3
3
 
4
4
  describe('PrimitiveAnchor', () => {
5
5
  const defaultProps = {
@@ -27,7 +27,6 @@ describe('PrimitiveAnchor', () => {
27
27
  renderAnchor(props);
28
28
 
29
29
  const link = screen.getByRole('link');
30
- expect(link).toHaveClass('wds-Anchor');
31
30
  expect(link).toHaveClass('custom-class');
32
31
  });
33
32
 
@@ -41,7 +40,6 @@ describe('PrimitiveAnchor', () => {
41
40
 
42
41
  const link = screen.getByRole('link');
43
42
  expect(link).toHaveAttribute('aria-disabled', 'true');
44
- expect(link).toHaveClass('wds-Anchor--disabled');
45
43
  expect(link).not.toHaveAttribute('href', 'https://example.com');
46
44
  });
47
45
 
@@ -35,14 +35,7 @@ const PrimitiveButton = forwardRef<HTMLButtonElement, PrimitiveButtonProps>(
35
35
  ref,
36
36
  ) => {
37
37
  const intl = useIntl();
38
- const classNames = clsx(
39
- 'wds-Button',
40
- {
41
- 'wds-Button--disabled': disabled,
42
- 'wds-Button--loading': loading,
43
- },
44
- className,
45
- );
38
+ const classNames = clsx(className);
46
39
 
47
40
  const handleClick = useCallback(
48
41
  (event: React.MouseEvent<HTMLButtonElement>) => {
@@ -102,10 +95,9 @@ const PrimitiveButton = forwardRef<HTMLButtonElement, PrimitiveButtonProps>(
102
95
  * by assistive technologies, set to 'polite' during loading.
103
96
  */
104
97
  const buttonProps = {
105
- 'aria-disabled': disabled || loading,
106
- 'aria-label': loading
107
- ? intl.formatMessage(messages.loadingAriaLabel as MessageDescriptor)
108
- : props['aria-label'],
98
+ 'aria-disabled': loading || undefined,
99
+ 'aria-busy': loading || undefined,
100
+ 'aria-label': loading ? intl.formatMessage(messages.loadingAriaLabel) : props['aria-label'],
109
101
  'aria-live': (loading ? 'polite' : 'off') as 'polite' | 'off' | 'assertive' | undefined,
110
102
  className: classNames,
111
103
  'data-testid': testId,
@@ -1,8 +1,7 @@
1
- import { fireEvent, screen } from '@testing-library/react';
2
- import { userEvent } from '@testing-library/user-event';
3
- import PrimitiveButton from '..';
4
- import messages from '../../../i18n/commonMessages/Button.messages';
1
+ import { screen } from '@testing-library/react';
5
2
  import { render } from '../../../test-utils';
3
+ import PrimitiveButton from '../src';
4
+ import allMessages from '../../../i18n';
6
5
 
7
6
  describe('Button', () => {
8
7
  const defaultProps = {
@@ -12,7 +11,7 @@ describe('Button', () => {
12
11
  const renderButton = (
13
12
  props?: Partial<typeof defaultProps>,
14
13
  locale = 'en',
15
- localeMessages = messages,
14
+ localeMessages = allMessages.en,
16
15
  ) => {
17
16
  return render(
18
17
  <PrimitiveButton {...defaultProps} {...props} />,
@@ -36,7 +35,6 @@ describe('Button', () => {
36
35
  renderButton(props);
37
36
 
38
37
  const button = screen.getByRole('button');
39
- expect(button).toHaveClass('wds-Button');
40
38
  expect(button).toHaveClass('custom-class');
41
39
  });
42
40
 
@@ -49,10 +47,20 @@ describe('Button', () => {
49
47
  renderButton(props);
50
48
 
51
49
  const button = screen.getByRole('button');
52
- expect(button).toHaveClass('wds-Button--disabled');
53
50
  expect(button).toBeDisabled();
54
51
  });
55
52
 
53
+ it('disables and announces the button as busy in loading mode', () => {
54
+ const props = {
55
+ ...defaultProps,
56
+ loading: true,
57
+ };
58
+
59
+ renderButton(props);
60
+
61
+ expect(screen.getByRole('button', { busy: true })).toHaveAttribute('aria-disabled', 'true');
62
+ });
63
+
56
64
  it('sets data-testid attribute', () => {
57
65
  const props = {
58
66
  ...defaultProps,
@@ -101,12 +109,7 @@ describe('Button', () => {
101
109
  loading: true,
102
110
  };
103
111
 
104
- const spanishMessages = {
105
- ...messages,
106
- 'neptune.Button.loadingAriaLabel': 'cargando',
107
- };
108
-
109
- renderButton(props, 'es', spanishMessages);
112
+ renderButton(props, 'es', allMessages.es);
110
113
 
111
114
  const button = screen.getByRole('button');
112
115
  expect(button).toHaveAttribute('aria-label', 'cargando');
@@ -1,7 +1,15 @@
1
1
  declare module '@storybook/react' {
2
2
  interface Parameters {
3
3
  /** Prefer using `storyConfig` for configuring variants */
4
- variants?: ('default' | 'light' | 'dark' | 'rtl' | (string & Record<string, unknown>))[];
4
+ variants?: (
5
+ | 'default'
6
+ | 'light'
7
+ | 'dark'
8
+ | 'bright-green'
9
+ | 'forest-green'
10
+ | 'rtl'
11
+ | (string & Record<string, unknown>)
12
+ )[];
5
13
  /** Used by Chromatic */
6
14
  chromatic?: ChromaticParameters;
7
15
  viewport?: {
@@ -30,7 +30,16 @@ interface StoryConfig {
30
30
  *
31
31
  * @default undefined
32
32
  */
33
- variants?: ('default' | 'light' | 'dark' | 'rtl' | 'mobile' | '400%')[];
33
+ variants?: (
34
+ | 'default'
35
+ | 'light'
36
+ | 'dark'
37
+ | 'bright-green'
38
+ | 'forest-green'
39
+ | 'rtl'
40
+ | 'mobile'
41
+ | '400%'
42
+ )[];
34
43
  }
35
44
 
36
45
  const getViewportWidth = (viewport: (typeof viewports)[keyof typeof viewports]) => {
@@ -4,7 +4,7 @@ import { Meta, StoryObj } from '@storybook/react';
4
4
  import { Status } from '../common';
5
5
  import UploadInput, { UploadInputProps } from './UploadInput';
6
6
  import { UploadedFile, UploadResponse } from './types';
7
- import { userEvent } from '@storybook/test';
7
+ import { userEvent, within } from '@storybook/test';
8
8
 
9
9
  const meta: Meta<typeof UploadInput> = {
10
10
  title: 'Forms/UploadInput/Tests',
@@ -65,8 +65,8 @@ const createDelayedPromise = async ({
65
65
  });
66
66
 
67
67
  const props = {
68
- onUploadFile: async () => createDelayedPromise(),
69
- onDeleteFile: async () => createDelayedPromise(),
68
+ onUploadFile: async (formData: FormData) => createDelayedPromise(),
69
+ onDeleteFile: async (id: string | number) => createDelayedPromise(),
70
70
  };
71
71
 
72
72
  export const UploadInputWithDescriptionFromProps: Story = {
@@ -268,7 +268,7 @@ export const DeletingTop: Story = {
268
268
  files: [files[0], files[1], files[2]],
269
269
  multiple: true,
270
270
  },
271
- play: async () => {
271
+ play: async ({ canvasElement }) => {
272
272
  await userEvent.tab();
273
273
  await triggerModalAndConfirm();
274
274
  await triggerModalAndConfirm({ isLink: false });
@@ -282,7 +282,7 @@ export const DeletingBottom: Story = {
282
282
  files: [files[0], files[1], files[2]],
283
283
  multiple: true,
284
284
  },
285
- play: async () => {
285
+ play: async ({ canvasElement }) => {
286
286
  await userEvent.tab();
287
287
  await userEvent.tab();
288
288
  await userEvent.tab();
@@ -38,16 +38,4 @@ describe('getAllowedFileTypes', () => {
38
38
  expect(allowedFileTypes).toStrictEqual(['*']);
39
39
  });
40
40
  });
41
-
42
- describe('using only mime types', () => {
43
- const mimeTypes = ['application/json', 'image/jpeg'];
44
-
45
- beforeAll(() => {
46
- allowedFileTypes = getAllowedFileTypes(mimeTypes);
47
- });
48
-
49
- it('returns the original mime types', () => {
50
- expect(allowedFileTypes).toStrictEqual(['JSON', 'JPG, JPEG']);
51
- });
52
- });
53
41
  });