@transferwise/components 0.0.0-experimental-22586c3 → 0.0.0-experimental-bd6f8cc

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 (159) hide show
  1. package/build/avatarLayout/AvatarLayout.js +4 -10
  2. package/build/avatarLayout/AvatarLayout.js.map +1 -1
  3. package/build/avatarLayout/AvatarLayout.mjs +4 -10
  4. package/build/avatarLayout/AvatarLayout.mjs.map +1 -1
  5. package/build/button/Button.js +79 -86
  6. package/build/button/Button.js.map +1 -1
  7. package/build/button/Button.mjs +80 -87
  8. package/build/button/Button.mjs.map +1 -1
  9. package/build/criticalBanner/CriticalCommsBanner.js +2 -2
  10. package/build/criticalBanner/CriticalCommsBanner.js.map +1 -1
  11. package/build/criticalBanner/CriticalCommsBanner.mjs +1 -1
  12. package/build/header/Header.js +2 -2
  13. package/build/header/Header.js.map +1 -1
  14. package/build/header/Header.mjs +1 -1
  15. package/build/index.js +4 -2
  16. package/build/index.js.map +1 -1
  17. package/build/index.mjs +2 -1
  18. package/build/index.mjs.map +1 -1
  19. package/build/link/Link.js +3 -8
  20. package/build/link/Link.js.map +1 -1
  21. package/build/link/Link.mjs +3 -8
  22. package/build/link/Link.mjs.map +1 -1
  23. package/build/main.css +13 -227
  24. package/build/nudge/Nudge.js.map +1 -1
  25. package/build/nudge/Nudge.mjs.map +1 -1
  26. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js +4 -2
  27. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js.map +1 -1
  28. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs +4 -2
  29. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs.map +1 -1
  30. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js +5 -3
  31. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js.map +1 -1
  32. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs +5 -3
  33. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs.map +1 -1
  34. package/build/select/Select.js +2 -2
  35. package/build/select/Select.js.map +1 -1
  36. package/build/select/Select.mjs +1 -1
  37. package/build/styles/avatarLayout/AvatarLayout.css +2 -12
  38. package/build/styles/button/Button.css +15 -207
  39. package/build/styles/main.css +13 -227
  40. package/build/styles/nudge/Nudge.css +11 -0
  41. package/build/table/Table.js +166 -0
  42. package/build/table/Table.js.map +1 -0
  43. package/build/table/Table.messages.js +24 -0
  44. package/build/table/Table.messages.js.map +1 -0
  45. package/build/table/Table.messages.mjs +22 -0
  46. package/build/table/Table.messages.mjs.map +1 -0
  47. package/build/table/Table.mjs +164 -0
  48. package/build/table/Table.mjs.map +1 -0
  49. package/build/table/TableCell.js +86 -0
  50. package/build/table/TableCell.js.map +1 -0
  51. package/build/table/TableCell.mjs +84 -0
  52. package/build/table/TableCell.mjs.map +1 -0
  53. package/build/table/TableHeader.js +57 -0
  54. package/build/table/TableHeader.js.map +1 -0
  55. package/build/table/TableHeader.mjs +55 -0
  56. package/build/table/TableHeader.mjs.map +1 -0
  57. package/build/table/TableRow.js +85 -0
  58. package/build/table/TableRow.js.map +1 -0
  59. package/build/table/TableRow.mjs +83 -0
  60. package/build/table/TableRow.mjs.map +1 -0
  61. package/build/table/TableStatusText.js +54 -0
  62. package/build/table/TableStatusText.js.map +1 -0
  63. package/build/table/TableStatusText.mjs +52 -0
  64. package/build/table/TableStatusText.mjs.map +1 -0
  65. package/build/types/avatarLayout/AvatarLayout.d.ts.map +1 -1
  66. package/build/types/button/Button.d.ts +23 -2
  67. package/build/types/button/Button.d.ts.map +1 -1
  68. package/build/types/button/index.d.ts +2 -2
  69. package/build/types/button/index.d.ts.map +1 -1
  70. package/build/types/index.d.ts +2 -0
  71. package/build/types/index.d.ts.map +1 -1
  72. package/build/types/link/Link.d.ts +2 -2
  73. package/build/types/link/Link.d.ts.map +1 -1
  74. package/build/types/nudge/Nudge.d.ts +1 -1
  75. package/build/types/nudge/Nudge.d.ts.map +1 -1
  76. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.d.ts.map +1 -1
  77. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts +2 -6
  78. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts.map +1 -1
  79. package/build/types/primitives/PrimitiveButton/src/PrimitiveButton.d.ts.map +1 -1
  80. package/build/types/test-utils/story-config.d.ts +1 -1
  81. package/build/types/test-utils/story-config.d.ts.map +1 -1
  82. package/build/types/uploadInput/uploadButton/getAllowedFileTypes.d.ts.map +1 -1
  83. package/build/upload/steps/completeStep/completeStep.js +2 -2
  84. package/build/upload/steps/completeStep/completeStep.js.map +1 -1
  85. package/build/upload/steps/completeStep/completeStep.mjs +1 -1
  86. package/build/upload/steps/processingStep/processingStep.js +2 -2
  87. package/build/upload/steps/processingStep/processingStep.js.map +1 -1
  88. package/build/upload/steps/processingStep/processingStep.mjs +1 -1
  89. package/build/uploadInput/UploadInput.js +3 -3
  90. package/build/uploadInput/UploadInput.js.map +1 -1
  91. package/build/uploadInput/UploadInput.mjs +1 -1
  92. package/build/uploadInput/uploadButton/getAllowedFileTypes.js +23 -3
  93. package/build/uploadInput/uploadButton/getAllowedFileTypes.js.map +1 -1
  94. package/build/uploadInput/uploadButton/getAllowedFileTypes.mjs +23 -3
  95. package/build/uploadInput/uploadButton/getAllowedFileTypes.mjs.map +1 -1
  96. package/package.json +3 -3
  97. package/src/alert/Alert.tests.story.tsx +1 -1
  98. package/src/avatarLayout/AvatarLayout.css +2 -12
  99. package/src/avatarLayout/AvatarLayout.less +2 -19
  100. package/src/avatarLayout/AvatarLayout.tsx +3 -10
  101. package/src/button/Button.css +15 -207
  102. package/src/button/Button.less +14 -214
  103. package/src/button/Button.spec.tsx +224 -188
  104. package/src/button/Button.story.tsx +135 -701
  105. package/src/button/Button.tsx +131 -99
  106. package/src/button/__snapshots__/Button.spec.tsx.snap +309 -0
  107. package/src/button/index.ts +3 -2
  108. package/src/drawer/Drawer.spec.tsx +93 -0
  109. package/src/field/Field.story.tsx +1 -1
  110. package/src/flowNavigation/__snapshots__/FlowNavigation.spec.js.snap +2 -1
  111. package/src/index.ts +12 -0
  112. package/src/inputs/SelectInput.story.tsx +1 -1
  113. package/src/label/Label.story.tsx +1 -1
  114. package/src/link/Link.tsx +6 -15
  115. package/src/main.css +13 -227
  116. package/src/main.less +0 -1
  117. package/src/nudge/Nudge.css +11 -0
  118. package/src/nudge/Nudge.less +3 -0
  119. package/src/nudge/Nudge.story.tsx +10 -0
  120. package/src/nudge/Nudge.tsx +2 -1
  121. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.tsx +8 -2
  122. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.ts +2 -7
  123. package/src/primitives/PrimitiveAnchor/test/PrimitiveAnchor.spec.tsx +3 -1
  124. package/src/primitives/PrimitiveButton/src/PrimitiveButton.tsx +12 -4
  125. package/src/primitives/PrimitiveButton/test/PrimitiveButton.spec.tsx +13 -16
  126. package/src/test-utils/Parameters.d.ts +1 -9
  127. package/src/test-utils/story-config.ts +1 -10
  128. package/src/uploadInput/UploadInput.tests.story.tsx +5 -5
  129. package/src/uploadInput/uploadButton/getAllowedFileTypes.spec.ts +12 -0
  130. package/src/uploadInput/uploadButton/getAllowedFileTypes.ts +33 -7
  131. package/build/button/Button.resolver.js +0 -74
  132. package/build/button/Button.resolver.js.map +0 -1
  133. package/build/button/Button.resolver.mjs +0 -72
  134. package/build/button/Button.resolver.mjs.map +0 -1
  135. package/build/button/LegacyButton.js +0 -114
  136. package/build/button/LegacyButton.js.map +0 -1
  137. package/build/button/LegacyButton.mjs +0 -112
  138. package/build/button/LegacyButton.mjs.map +0 -1
  139. package/build/styles/button/Button.vars.css +0 -46
  140. package/build/styles/button/LegacyButton.css +0 -23
  141. package/build/types/button/Button.resolver.d.ts +0 -33
  142. package/build/types/button/Button.resolver.d.ts.map +0 -1
  143. package/build/types/button/Button.types.d.ts +0 -67
  144. package/build/types/button/Button.types.d.ts.map +0 -1
  145. package/build/types/button/LegacyButton.d.ts +0 -30
  146. package/build/types/button/LegacyButton.d.ts.map +0 -1
  147. package/src/button/Button.resolver.tsx +0 -73
  148. package/src/button/Button.tests.story.tsx +0 -27
  149. package/src/button/Button.types.ts +0 -94
  150. package/src/button/Button.vars.css +0 -46
  151. package/src/button/Button.vars.less +0 -60
  152. package/src/button/LegacyButton.css +0 -23
  153. package/src/button/LegacyButton.less +0 -24
  154. package/src/button/LegacyButton.spec.tsx +0 -147
  155. package/src/button/LegacyButton.story.tsx +0 -220
  156. package/src/button/LegacyButton.tsx +0 -160
  157. package/src/drawer/Drawer.rtl.spec.tsx +0 -59
  158. package/src/drawer/Drawer.spec.js +0 -101
  159. package/src/drawer/__snapshots__/Drawer.rtl.spec.tsx.snap +0 -55
package/src/index.ts CHANGED
@@ -96,6 +96,17 @@ export type { UploadProps } from './upload';
96
96
  export type { UploadError, UploadResponse, UploadedFile } from './uploadInput/types';
97
97
  export type { WithIdProps } from './withId';
98
98
  export type { IconButtonProps } from './iconButton';
99
+ export type {
100
+ TableProps,
101
+ TableRowType,
102
+ TableRowClickableType,
103
+ TableHeaderType,
104
+ TableCellLeading,
105
+ TableCellText,
106
+ TableCellCurrency,
107
+ TableCellStatus,
108
+ TableCellType,
109
+ } from './table';
99
110
 
100
111
  /**
101
112
  * Components
@@ -196,6 +207,7 @@ export { default as Tooltip } from './tooltip';
196
207
  export { default as Typeahead } from './typeahead';
197
208
  export { default as Upload } from './upload';
198
209
  export { default as UploadInput } from './uploadInput';
210
+ export { default as Table } from './table';
199
211
 
200
212
  /**
201
213
  * Hooks
@@ -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';
8
+ import Button from '../button/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: 'Forms/Label',
6
+ title: 'Label',
7
7
  tags: ['autodocs'],
8
8
  };
9
9
 
package/src/link/Link.tsx CHANGED
@@ -1,14 +1,13 @@
1
1
  import { NavigateAway as NavigateAwayIcon } from '@transferwise/icons';
2
2
  import { clsx } from 'clsx';
3
+ import { AnchorHTMLAttributes } from 'react';
3
4
  import { useIntl } from 'react-intl';
4
- import { PrimitiveAnchor } from '../primitives';
5
- import type { PrimitiveAnchorProps } from '../primitives';
6
5
 
7
6
  import { LinkLarge, LinkDefault } from '../common';
8
7
 
9
8
  import messages from './Link.messages';
10
9
 
11
- export type Props = PrimitiveAnchorProps & { type?: LinkLarge | LinkDefault };
10
+ export type Props = AnchorHTMLAttributes<HTMLAnchorElement> & { type?: LinkLarge | LinkDefault };
12
11
 
13
12
  /**
14
13
  * Standard Link component with navigate away icon
@@ -25,30 +24,22 @@ const Link = ({
25
24
  onClick,
26
25
  ...props
27
26
  }: Props) => {
28
- const { formatMessage } = useIntl();
29
27
  const isBlank = target === '_blank';
30
28
 
31
- const classNames = clsx(
32
- 'np-link',
33
- 'd-inline-flex',
34
- {
35
- [`np-text-${type}`]: type,
36
- },
37
- className,
38
- );
29
+ const { formatMessage } = useIntl();
39
30
 
40
31
  return (
41
- <PrimitiveAnchor
32
+ <a
42
33
  href={href}
43
34
  target={target}
44
- className={classNames}
35
+ className={clsx('np-link', type ? `np-text-${type}` : undefined, 'd-inline-flex', className)}
45
36
  aria-label={ariaLabel}
46
37
  rel={isBlank ? 'noreferrer' : undefined}
47
38
  onClick={onClick}
48
39
  {...props}
49
40
  >
50
41
  {children} {isBlank && <NavigateAwayIcon title={formatMessage(messages.opensInNewTab)} />}
51
- </PrimitiveAnchor>
42
+ </a>
52
43
  );
53
44
  };
54
45
 
package/src/main.css CHANGED
@@ -518,20 +518,13 @@ 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
- }
525
521
  .np-avatar-layout-diagonal-child {
526
522
  margin-left: calc(var(--np-avatar-layout-size) - var(--np-avatar-size) * 2);
527
523
  margin-top: calc(var(--np-avatar-layout-size) - var(--np-avatar-size));
528
524
  }
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
- }
533
525
  .np-avatar-layout-horizontal {
534
- width: calc(var(--np-avatar-size) * 2 - var(--np-avatar-offset));
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)));
535
528
  height: var(--np-avatar-layout-size);
536
529
  }
537
530
  .np-avatar-layout-horizontal-mask {
@@ -543,9 +536,6 @@ div.critical-comms .critical-comms-body {
543
536
  .np-avatar-layout-horizontal-child {
544
537
  margin-left: calc(var(--np-avatar-offset) * -1);
545
538
  }
546
- [dir="rtl"] .np-avatar-layout-horizontal-child {
547
- margin-right: calc(var(--np-avatar-offset) * -1);
548
- }
549
539
  .np-icon-button {
550
540
  border: none;
551
541
  }
@@ -716,221 +706,6 @@ div.critical-comms .critical-comms-body {
716
706
  .np-btn.disabled[class] {
717
707
  pointer-events: auto;
718
708
  }
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
- }
934
709
  .np-card {
935
710
  overflow: hidden;
936
711
  transition-property: transform, box-shadow;
@@ -3914,6 +3689,17 @@ html:not([dir="rtl"]) .np-navigation-option {
3914
3689
  margin-left: 0;
3915
3690
  margin-right: 1px;
3916
3691
  }
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
+ }
3917
3703
  .wds-nudge-container {
3918
3704
  align-items: stretch;
3919
3705
  display: flex;
package/src/main.less CHANGED
@@ -7,7 +7,6 @@
7
7
  @import "./avatarLayout/AvatarLayout.less";
8
8
  @import "./iconButton/IconButton.less";
9
9
  @import "./badge/Badge.less";
10
- @import "./button/LegacyButton.less";
11
10
  @import "./button/Button.less";
12
11
  @import "./card/Card.less";
13
12
  @import "./carousel/Carousel.less";
@@ -136,6 +136,17 @@
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
+ }
139
150
  .wds-nudge-container {
140
151
  align-items: stretch;
141
152
  display: flex;
@@ -65,6 +65,9 @@
65
65
  &-shopping-bag {
66
66
  .media-position(116px, 1px, 14px);
67
67
  }
68
+ &-flower {
69
+ .media-position(156px, -24px, 11px);
70
+ }
68
71
  }
69
72
 
70
73
  &-container {
@@ -104,6 +104,16 @@ 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
+ />
107
117
  </div>
108
118
  );
109
119
  };
@@ -38,7 +38,8 @@ type MediaNameType =
38
38
  | `${Assets.BUSINESS_CARD}`
39
39
  | `${Assets.HEART}`
40
40
  | `${Assets.MULTI_CURRENCY}`
41
- | `${Assets.SHOPPING_BAG}`;
41
+ | `${Assets.SHOPPING_BAG}`
42
+ | `${Assets.FLOWER}`;
42
43
 
43
44
  type BaseProps = {
44
45
  /** @deprecated use `mediaName` property instead */
@@ -30,7 +30,13 @@ const PrimitiveAnchor = forwardRef<HTMLAnchorElement, PrimitiveAnchorProps>(
30
30
  },
31
31
  ref,
32
32
  ) => {
33
- const anchorClasses = clsx(className);
33
+ const anchorClasses = clsx(
34
+ 'wds-Anchor',
35
+ {
36
+ 'wds-Anchor--disabled': disabled,
37
+ },
38
+ className,
39
+ );
34
40
 
35
41
  const handleClick = useCallback(
36
42
  (event: React.MouseEvent<HTMLAnchorElement>) => {
@@ -90,7 +96,7 @@ const PrimitiveAnchor = forwardRef<HTMLAnchorElement, PrimitiveAnchorProps>(
90
96
  * https://www.scottohara.me/blog/2021/05/28/disabled-links.html
91
97
  */
92
98
  const anchorProps = {
93
- 'aria-disabled': disabled || undefined,
99
+ 'aria-disabled': disabled,
94
100
  className: anchorClasses,
95
101
  'data-testid': testId,
96
102
  href: disabled ? undefined : href,
@@ -13,21 +13,16 @@ export type PrimitiveAnchorElementRef = React.Ref<HTMLAnchorElement>;
13
13
  export interface PrimitiveAnchorProps
14
14
  extends BasePrimitiveProps,
15
15
  StyleProp,
16
- Omit<PrimitiveAnchorAttributes, 'role' | 'type'> {
16
+ Omit<PrimitiveAnchorAttributes, 'role'> {
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 | undefined;
21
+ href: string;
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'];
33
28
  }
@@ -1,5 +1,5 @@
1
1
  import { render, screen } from '@testing-library/react';
2
- import PrimitiveAnchor from '../src';
2
+ import PrimitiveAnchor from '..';
3
3
 
4
4
  describe('PrimitiveAnchor', () => {
5
5
  const defaultProps = {
@@ -27,6 +27,7 @@ describe('PrimitiveAnchor', () => {
27
27
  renderAnchor(props);
28
28
 
29
29
  const link = screen.getByRole('link');
30
+ expect(link).toHaveClass('wds-Anchor');
30
31
  expect(link).toHaveClass('custom-class');
31
32
  });
32
33
 
@@ -40,6 +41,7 @@ describe('PrimitiveAnchor', () => {
40
41
 
41
42
  const link = screen.getByRole('link');
42
43
  expect(link).toHaveAttribute('aria-disabled', 'true');
44
+ expect(link).toHaveClass('wds-Anchor--disabled');
43
45
  expect(link).not.toHaveAttribute('href', 'https://example.com');
44
46
  });
45
47
 
@@ -35,7 +35,14 @@ const PrimitiveButton = forwardRef<HTMLButtonElement, PrimitiveButtonProps>(
35
35
  ref,
36
36
  ) => {
37
37
  const intl = useIntl();
38
- const classNames = clsx(className);
38
+ const classNames = clsx(
39
+ 'wds-Button',
40
+ {
41
+ 'wds-Button--disabled': disabled,
42
+ 'wds-Button--loading': loading,
43
+ },
44
+ className,
45
+ );
39
46
 
40
47
  const handleClick = useCallback(
41
48
  (event: React.MouseEvent<HTMLButtonElement>) => {
@@ -95,9 +102,10 @@ const PrimitiveButton = forwardRef<HTMLButtonElement, PrimitiveButtonProps>(
95
102
  * by assistive technologies, set to 'polite' during loading.
96
103
  */
97
104
  const buttonProps = {
98
- 'aria-disabled': loading || undefined,
99
- 'aria-busy': loading || undefined,
100
- 'aria-label': loading ? intl.formatMessage(messages.loadingAriaLabel) : props['aria-label'],
105
+ 'aria-disabled': disabled || loading,
106
+ 'aria-label': loading
107
+ ? intl.formatMessage(messages.loadingAriaLabel as MessageDescriptor)
108
+ : props['aria-label'],
101
109
  'aria-live': (loading ? 'polite' : 'off') as 'polite' | 'off' | 'assertive' | undefined,
102
110
  className: classNames,
103
111
  'data-testid': testId,
@@ -1,7 +1,8 @@
1
- import { screen } from '@testing-library/react';
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';
2
5
  import { render } from '../../../test-utils';
3
- import PrimitiveButton from '../src';
4
- import allMessages from '../../../i18n';
5
6
 
6
7
  describe('Button', () => {
7
8
  const defaultProps = {
@@ -11,7 +12,7 @@ describe('Button', () => {
11
12
  const renderButton = (
12
13
  props?: Partial<typeof defaultProps>,
13
14
  locale = 'en',
14
- localeMessages = allMessages.en,
15
+ localeMessages = messages,
15
16
  ) => {
16
17
  return render(
17
18
  <PrimitiveButton {...defaultProps} {...props} />,
@@ -35,6 +36,7 @@ describe('Button', () => {
35
36
  renderButton(props);
36
37
 
37
38
  const button = screen.getByRole('button');
39
+ expect(button).toHaveClass('wds-Button');
38
40
  expect(button).toHaveClass('custom-class');
39
41
  });
40
42
 
@@ -47,20 +49,10 @@ describe('Button', () => {
47
49
  renderButton(props);
48
50
 
49
51
  const button = screen.getByRole('button');
52
+ expect(button).toHaveClass('wds-Button--disabled');
50
53
  expect(button).toBeDisabled();
51
54
  });
52
55
 
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
-
64
56
  it('sets data-testid attribute', () => {
65
57
  const props = {
66
58
  ...defaultProps,
@@ -109,7 +101,12 @@ describe('Button', () => {
109
101
  loading: true,
110
102
  };
111
103
 
112
- renderButton(props, 'es', allMessages.es);
104
+ const spanishMessages = {
105
+ ...messages,
106
+ 'neptune.Button.loadingAriaLabel': 'cargando',
107
+ };
108
+
109
+ renderButton(props, 'es', spanishMessages);
113
110
 
114
111
  const button = screen.getByRole('button');
115
112
  expect(button).toHaveAttribute('aria-label', 'cargando');
@@ -1,15 +1,7 @@
1
1
  declare module '@storybook/react' {
2
2
  interface Parameters {
3
3
  /** Prefer using `storyConfig` for configuring variants */
4
- variants?: (
5
- | 'default'
6
- | 'light'
7
- | 'dark'
8
- | 'bright-green'
9
- | 'forest-green'
10
- | 'rtl'
11
- | (string & Record<string, unknown>)
12
- )[];
4
+ variants?: ('default' | 'light' | 'dark' | 'rtl' | (string & Record<string, unknown>))[];
13
5
  /** Used by Chromatic */
14
6
  chromatic?: ChromaticParameters;
15
7
  viewport?: {
@@ -30,16 +30,7 @@ interface StoryConfig {
30
30
  *
31
31
  * @default undefined
32
32
  */
33
- variants?: (
34
- | 'default'
35
- | 'light'
36
- | 'dark'
37
- | 'bright-green'
38
- | 'forest-green'
39
- | 'rtl'
40
- | 'mobile'
41
- | '400%'
42
- )[];
33
+ variants?: ('default' | 'light' | 'dark' | 'rtl' | 'mobile' | '400%')[];
43
34
  }
44
35
 
45
36
  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, within } from '@storybook/test';
7
+ import { userEvent } 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 (formData: FormData) => createDelayedPromise(),
69
- onDeleteFile: async (id: string | number) => createDelayedPromise(),
68
+ onUploadFile: async () => createDelayedPromise(),
69
+ onDeleteFile: async () => 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 ({ canvasElement }) => {
271
+ play: async () => {
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 ({ canvasElement }) => {
285
+ play: async () => {
286
286
  await userEvent.tab();
287
287
  await userEvent.tab();
288
288
  await userEvent.tab();