@transferwise/components 0.0.0-experimental-696128b → 0.0.0-experimental-328f2cc

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 -81
  6. package/build/button/Button.js.map +1 -1
  7. package/build/button/Button.mjs +80 -82
  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 -224
  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 +3 -1
  27. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js.map +1 -1
  28. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs +3 -1
  29. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs.map +1 -1
  30. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js +4 -1
  31. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js.map +1 -1
  32. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs +4 -1
  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 -204
  39. package/build/styles/main.css +13 -224
  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 -204
  102. package/src/button/Button.less +14 -211
  103. package/src/button/Button.spec.tsx +227 -75
  104. package/src/button/Button.story.tsx +135 -728
  105. package/src/button/Button.tsx +131 -94
  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 +1 -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 -224
  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 +7 -1
  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 +8 -1
  125. package/src/primitives/PrimitiveButton/test/PrimitiveButton.spec.tsx +5 -2
  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 -39
  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 -58
  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 -74
  150. package/src/button/Button.vars.css +0 -39
  151. package/src/button/Button.vars.less +0 -50
  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 -225
  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,218 +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);
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
- --color-contrast: #FFFFFF;
755
- --Button-secondary-color: var(--color-interactive-control);
756
- --Button-secondary-negative-color: var(--color-contrast);
757
- }
758
- /* Button Styles */
759
- .wds-Button {
760
- display: inline-flex;
761
- flex: none;
762
- width: auto;
763
- align-items: center;
764
- justify-content: center;
765
- vertical-align: middle;
766
- text-align: center;
767
- -webkit-text-decoration: none;
768
- text-decoration: none;
769
- white-space: nowrap;
770
- word-wrap: break-word;
771
- -webkit-appearance: none;
772
- -moz-appearance: none;
773
- appearance: none;
774
- background-color: var(--Button-background);
775
- border: none;
776
- border-radius: var(--Button-border-radius);
777
- color: var(--Button-color);
778
- cursor: pointer;
779
- transition: color, background-color var(--Button-transition-duration) var(--Button-transition-easing);
780
- }
781
- .wds-Button:hover {
782
- background-color: var(--Button-background-hover);
783
- }
784
- .wds-Button:active {
785
- background-color: var(--Button-background-active);
786
- }
787
- .wds-Button.wds-Button--disabled,
788
- .wds-Button:disabled {
789
- mix-blend-mode: luminosity;
790
- opacity: 0.45;
791
- cursor: not-allowed;
792
- }
793
- .wds-Button.wds-Button--disabled:hover,
794
- .wds-Button:disabled:hover,
795
- .wds-Button.wds-Button--disabled:active,
796
- .wds-Button:disabled:active {
797
- background-color: var(--Button-background);
798
- }
799
- .wds-Button--secondary {
800
- --Button-background: var(--Button-secondary-background);
801
- --Button-background-hover: var(--Button-secondary-background-hover);
802
- --Button-background-active: var(--Button-secondary-background-active);
803
- --Button-color: var(--Button-secondary-color);
804
- }
805
- .wds-Button--tertiary {
806
- --Button-background: var(--Button-tertiary-background);
807
- --Button-background-hover: var(--Button-tertiary-background-hover);
808
- --Button-background-active: var(--Button-tertiary-background-active);
809
- --Button-color: var(--Button-tertiary-color);
810
- }
811
- .wds-Button--tertiary .wds-Button-icon--end {
812
- color: var(--color-interactive-primary);
813
- }
814
- .wds-Button--minimal {
815
- --Button-background: var(--Button-minimal-background);
816
- --Button-background-hover: var(--Button-minimal-background-hover);
817
- --Button-background-active: var(--Button-minimal-background-active);
818
- --Button-color: var(--Button-minimal-color);
819
- -webkit-text-decoration: underline;
820
- text-decoration: underline;
821
- text-underline-offset: 3px;
822
- text-decoration-thickness: 1px;
823
- }
824
- .wds-Button--negative.wds-Button--primary {
825
- --Button-background: var(--Button-primary-negative-background);
826
- --Button-background-hover: var(--Button-primary-negative-background-hover);
827
- --Button-background-active: var(--Button-primary-negative-background-active);
828
- --Button-color: var(--Button-primary-negative-color);
829
- }
830
- .wds-Button--negative.wds-Button--secondary {
831
- --Button-background: var(--Button-secondary-negative-background);
832
- --Button-background-hover: var(--Button-secondary-negative-background-hover);
833
- --Button-background-active: var(--Button-secondary-negative-background-active);
834
- --Button-color: var(--Button-secondary-negative-color);
835
- }
836
- .wds-Button--large {
837
- padding: var(--Button-large-padding);
838
- }
839
- .wds-Button--medium {
840
- padding: var(--Button-medium-padding);
841
- }
842
- .wds-Button--medium:has(.wds-Button-avatars) {
843
- padding-inline-start: 8px;
844
- padding-inline-start: var(--size-8);
845
- }
846
- .wds-Button--medium:has(.wds-Button-icon--end) {
847
- padding-inline-end: 8px;
848
- padding-inline-end: var(--size-8);
849
- }
850
- .wds-Button--medium .wds-Button-icon--start {
851
- margin-inline-end: var(--Button-label-gap);
852
- }
853
- .wds-Button--small {
854
- padding: var(--Button-small-padding);
855
- }
856
- .wds-Button--small:has(.wds-Button-icon--start) {
857
- padding-inline-start: 8px;
858
- padding-inline-start: var(--size-8);
859
- }
860
- .wds-Button--small:has(.wds-Button-icon--end) {
861
- padding-inline-end: 8px;
862
- padding-inline-end: var(--size-8);
863
- }
864
- .wds-Button--block {
865
- width: 100%;
866
- }
867
- .wds-Button-avatars {
868
- display: inline-flex;
869
- }
870
- .wds-Button-avatars .np-avatar-view .np-avatar-view-content {
871
- color: var(--Button-color);
872
- }
873
- .wds-Button-icon {
874
- display: inline-block;
875
- }
876
- .wds-Button-content {
877
- position: relative;
878
- }
879
- .wds-Button-content--loading .wds-Button-label,
880
- .wds-Button-content--loading .wds-Button-media,
881
- .wds-Button-content--loading .wds-Button-icon {
882
- visibility: hidden;
883
- opacity: 0;
884
- }
885
- .wds-Button-label {
886
- display: flex;
887
- justify-content: center;
888
- align-items: center;
889
- gap: var(--Button-label-gap);
890
- position: relative;
891
- }
892
- .wds-Button-loader {
893
- position: absolute;
894
- display: flex;
895
- justify-content: center;
896
- align-items: center;
897
- width: 100%;
898
- height: 100%;
899
- }
900
- .wds-Button-loader .process-circle {
901
- stroke: var(--Button-color);
902
- }
903
- /* RTL Styles */
904
- [dir="rtl"] .wds-Button .tw-icon-chevron-right,[dir="rtl"] .wds-Button .tw-icon-arrow-right {
905
- transform: rotate(180deg);
906
- }
907
- [dir="rtl"] .wds-Button .tw-icon-chevron-left,[dir="rtl"] .wds-Button .tw-icon-arrow-left {
908
- transform: rotate(180deg);
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
709
  .np-card {
932
710
  overflow: hidden;
933
711
  transition-property: transform, box-shadow;
@@ -3911,6 +3689,17 @@ html:not([dir="rtl"]) .np-navigation-option {
3911
3689
  margin-left: 0;
3912
3690
  margin-right: 1px;
3913
3691
  }
3692
+ .wds-nudge-media-flower {
3693
+ margin-left: -8px;
3694
+ margin-top: 8px;
3695
+ position: absolute;
3696
+ width: 123px;
3697
+ }
3698
+ [dir="rtl"] .wds-nudge-media-flower {
3699
+ transform: scaleX(-1);
3700
+ margin-left: 0;
3701
+ margin-right: -8px;
3702
+ }
3914
3703
  .wds-nudge-container {
3915
3704
  align-items: stretch;
3916
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: -8px;
141
+ margin-top: 8px;
142
+ position: absolute;
143
+ width: 123px;
144
+ }
145
+ [dir="rtl"] .wds-nudge-media-flower {
146
+ transform: scaleX(-1);
147
+ margin-left: 0;
148
+ margin-right: -8px;
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(123px, -8px, 8px);
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>) => {
@@ -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>) => {
@@ -1,5 +1,6 @@
1
- import { screen } from '@testing-library/react';
2
- import PrimitiveButton from '../src';
1
+ import { fireEvent, screen } from '@testing-library/react';
2
+ import { userEvent } from '@testing-library/user-event';
3
+ import PrimitiveButton from '..';
3
4
  import messages from '../../../i18n/commonMessages/Button.messages';
4
5
  import { render } from '../../../test-utils';
5
6
 
@@ -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,6 +49,7 @@ 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
 
@@ -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();
@@ -38,4 +38,16 @@ 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
+ });
41
53
  });