@transferwise/components 0.0.0-experimental-3868cf1 → 0.0.0-experimental-69a95e1

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 (174) 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 +79 -79
  6. package/build/button/Button.js.map +1 -1
  7. package/build/button/Button.mjs +80 -80
  8. package/build/button/Button.mjs.map +1 -1
  9. package/build/button/Button.resolver.js +86 -0
  10. package/build/button/Button.resolver.js.map +1 -0
  11. package/build/button/Button.resolver.mjs +84 -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 -2
  52. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js +2 -4
  53. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.js.map +1 -1
  54. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs +2 -4
  55. package/build/primitives/PrimitiveAnchor/src/PrimitiveAnchor.mjs.map +1 -1
  56. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js +3 -5
  57. package/build/primitives/PrimitiveButton/src/PrimitiveButton.js.map +1 -1
  58. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs +3 -5
  59. package/build/primitives/PrimitiveButton/src/PrimitiveButton.mjs.map +1 -1
  60. package/build/select/Select.js +2 -2
  61. package/build/select/Select.js.map +1 -1
  62. package/build/select/Select.mjs +1 -1
  63. package/build/styles/avatarLayout/AvatarLayout.css +12 -2
  64. package/build/styles/button/Button.css +207 -15
  65. package/build/styles/button/Button.vars.css +39 -0
  66. package/build/styles/button/LegacyButton.css +23 -0
  67. package/build/styles/main.css +227 -2
  68. package/build/types/avatarLayout/AvatarLayout.d.ts +1 -2
  69. package/build/types/avatarLayout/AvatarLayout.d.ts.map +1 -1
  70. package/build/types/avatarLayout/index.d.ts +1 -0
  71. package/build/types/avatarLayout/index.d.ts.map +1 -1
  72. package/build/types/button/Button.d.ts +1 -23
  73. package/build/types/button/Button.d.ts.map +1 -1
  74. package/build/types/button/Button.resolver.d.ts +31 -0
  75. package/build/types/button/Button.resolver.d.ts.map +1 -0
  76. package/build/types/button/Button.types.d.ts +65 -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/primitives/PrimitiveAnchor/src/PrimitiveAnchor.d.ts.map +1 -1
  87. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts +5 -1
  88. package/build/types/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.d.ts.map +1 -1
  89. package/build/types/primitives/PrimitiveButton/src/PrimitiveButton.d.ts.map +1 -1
  90. package/build/types/test-utils/story-config.d.ts +1 -1
  91. package/build/types/test-utils/story-config.d.ts.map +1 -1
  92. package/build/types/uploadInput/uploadButton/getAllowedFileTypes.d.ts.map +1 -1
  93. package/build/upload/steps/completeStep/completeStep.js +2 -2
  94. package/build/upload/steps/completeStep/completeStep.js.map +1 -1
  95. package/build/upload/steps/completeStep/completeStep.mjs +1 -1
  96. package/build/upload/steps/processingStep/processingStep.js +2 -2
  97. package/build/upload/steps/processingStep/processingStep.js.map +1 -1
  98. package/build/upload/steps/processingStep/processingStep.mjs +1 -1
  99. package/build/uploadInput/UploadInput.js +3 -3
  100. package/build/uploadInput/UploadInput.js.map +1 -1
  101. package/build/uploadInput/UploadInput.mjs +1 -1
  102. package/build/uploadInput/uploadButton/getAllowedFileTypes.js +3 -23
  103. package/build/uploadInput/uploadButton/getAllowedFileTypes.js.map +1 -1
  104. package/build/uploadInput/uploadButton/getAllowedFileTypes.mjs +3 -23
  105. package/build/uploadInput/uploadButton/getAllowedFileTypes.mjs.map +1 -1
  106. package/package.json +5 -5
  107. package/src/alert/Alert.tests.story.tsx +1 -1
  108. package/src/avatarLayout/AvatarLayout.css +12 -2
  109. package/src/avatarLayout/AvatarLayout.less +19 -2
  110. package/src/avatarLayout/AvatarLayout.tsx +11 -4
  111. package/src/avatarLayout/index.ts +1 -0
  112. package/src/button/Button.css +207 -15
  113. package/src/button/Button.less +217 -14
  114. package/src/button/Button.resolver.tsx +134 -0
  115. package/src/button/Button.spec.tsx +176 -225
  116. package/src/button/Button.story.tsx +729 -135
  117. package/src/button/Button.tests.story.tsx +27 -0
  118. package/src/button/Button.tsx +89 -132
  119. package/src/button/Button.types.ts +86 -0
  120. package/src/button/Button.vars.css +39 -0
  121. package/src/button/Button.vars.less +49 -0
  122. package/src/button/LegacyButton.css +23 -0
  123. package/src/button/LegacyButton.less +24 -0
  124. package/src/button/LegacyButton.spec.tsx +146 -0
  125. package/src/button/LegacyButton.story.tsx +225 -0
  126. package/src/button/LegacyButton.tsx +161 -0
  127. package/src/button/index.ts +2 -3
  128. package/src/field/Field.story.tsx +1 -1
  129. package/src/flowNavigation/__snapshots__/FlowNavigation.spec.js.snap +1 -2
  130. package/src/i18n/ja.json +0 -1
  131. package/src/i18n/pt.json +0 -1
  132. package/src/i18n/ru.json +0 -1
  133. package/src/i18n/zh-HK.json +0 -1
  134. package/src/index.ts +0 -12
  135. package/src/inputs/SelectInput.story.tsx +1 -1
  136. package/src/label/Label.story.tsx +1 -1
  137. package/src/link/Link.tsx +15 -6
  138. package/src/main.css +227 -2
  139. package/src/main.less +1 -0
  140. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.tsx +2 -8
  141. package/src/primitives/PrimitiveAnchor/src/PrimitiveAnchor.types.ts +6 -1
  142. package/src/primitives/PrimitiveAnchor/test/PrimitiveAnchor.spec.tsx +1 -3
  143. package/src/primitives/PrimitiveButton/src/PrimitiveButton.tsx +4 -12
  144. package/src/primitives/PrimitiveButton/test/PrimitiveButton.spec.tsx +16 -13
  145. package/src/test-utils/Parameters.d.ts +9 -1
  146. package/src/test-utils/story-config.ts +10 -1
  147. package/src/uploadInput/UploadInput.tests.story.tsx +5 -5
  148. package/src/uploadInput/uploadButton/getAllowedFileTypes.spec.ts +0 -12
  149. package/src/uploadInput/uploadButton/getAllowedFileTypes.ts +7 -33
  150. package/build/table/Table.js +0 -166
  151. package/build/table/Table.js.map +0 -1
  152. package/build/table/Table.messages.js +0 -24
  153. package/build/table/Table.messages.js.map +0 -1
  154. package/build/table/Table.messages.mjs +0 -22
  155. package/build/table/Table.messages.mjs.map +0 -1
  156. package/build/table/Table.mjs +0 -164
  157. package/build/table/Table.mjs.map +0 -1
  158. package/build/table/TableCell.js +0 -86
  159. package/build/table/TableCell.js.map +0 -1
  160. package/build/table/TableCell.mjs +0 -84
  161. package/build/table/TableCell.mjs.map +0 -1
  162. package/build/table/TableHeader.js +0 -57
  163. package/build/table/TableHeader.js.map +0 -1
  164. package/build/table/TableHeader.mjs +0 -55
  165. package/build/table/TableHeader.mjs.map +0 -1
  166. package/build/table/TableRow.js +0 -85
  167. package/build/table/TableRow.js.map +0 -1
  168. package/build/table/TableRow.mjs +0 -83
  169. package/build/table/TableRow.mjs.map +0 -1
  170. package/build/table/TableStatusText.js +0 -54
  171. package/build/table/TableStatusText.js.map +0 -1
  172. package/build/table/TableStatusText.mjs +0 -52
  173. package/build/table/TableStatusText.mjs.map +0 -1
  174. package/src/button/__snapshots__/Button.spec.tsx.snap +0 -309
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);
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
+ filter: none;
790
+ mix-blend-mode: luminosity;
791
+ opacity: 0.45;
792
+ cursor: not-allowed;
793
+ }
794
+ .wds-Button.wds-Button--disabled,
795
+ .wds-Button:disabled,
796
+ .wds-Button.wds-Button--disabled:hover,
797
+ .wds-Button:disabled:hover,
798
+ .wds-Button.wds-Button--disabled:active,
799
+ .wds-Button:disabled:active {
800
+ background-color: var(--Button-background);
801
+ }
802
+ .wds-Button--secondary {
803
+ --Button-background: var(--Button-secondary-background);
804
+ --Button-background-hover: var(--Button-secondary-background-hover);
805
+ --Button-background-active: var(--Button-secondary-background-active);
806
+ --Button-color: var(--Button-secondary-color);
807
+ }
808
+ .wds-Button--tertiary {
809
+ --Button-background: var(--Button-tertiary-background);
810
+ --Button-background-hover: var(--Button-tertiary-background-hover);
811
+ --Button-background-active: var(--Button-tertiary-background-active);
812
+ --Button-color: var(--Button-tertiary-color);
813
+ }
814
+ .wds-Button--tertiary .wds-Button-icon--end {
815
+ color: var(--color-interactive-primary);
816
+ }
817
+ .wds-Button--minimal {
818
+ --Button-background: var(--Button-minimal-background);
819
+ --Button-background-hover: var(--Button-minimal-background-hover);
820
+ --Button-background-active: var(--Button-minimal-background-active);
821
+ --Button-color: var(--Button-minimal-color);
822
+ -webkit-text-decoration: underline;
823
+ text-decoration: underline;
824
+ text-underline-offset: 3px;
825
+ text-decoration-thickness: 1px;
826
+ }
827
+ .wds-Button--negative.wds-Button--primary {
828
+ --Button-background: var(--Button-primary-negative-background);
829
+ --Button-background-hover: var(--Button-primary-negative-background-hover);
830
+ --Button-background-active: var(--Button-primary-negative-background-active);
831
+ --Button-color: var(--Button-primary-negative-color);
832
+ }
833
+ .wds-Button--negative.wds-Button--secondary {
834
+ --Button-background: var(--Button-secondary-negative-background);
835
+ --Button-background-hover: var(--Button-secondary-negative-background-hover);
836
+ --Button-background-active: var(--Button-secondary-negative-background-active);
837
+ --Button-color: var(--Button-secondary-negative-color);
838
+ }
839
+ .wds-Button--large {
840
+ padding: var(--Button-large-padding);
841
+ }
842
+ .wds-Button--medium {
843
+ padding: var(--Button-medium-padding);
844
+ }
845
+ .wds-Button--medium:has(.wds-Button-avatars) {
846
+ padding-inline-start: 8px;
847
+ padding-inline-start: var(--size-8);
848
+ }
849
+ .wds-Button--medium:has(.wds-Button-icon--end) {
850
+ padding-inline-end: 8px;
851
+ padding-inline-end: var(--size-8);
852
+ }
853
+ .wds-Button--medium .wds-Button-icon--start {
854
+ margin-inline-end: var(--Button-label-gap);
855
+ }
856
+ .wds-Button--small {
857
+ padding: var(--Button-small-padding);
858
+ }
859
+ .wds-Button--small:has(.wds-Button-icon--start) {
860
+ padding-inline-start: 8px;
861
+ padding-inline-start: var(--size-8);
862
+ }
863
+ .wds-Button--small:has(.wds-Button-icon--end) {
864
+ padding-inline-end: 8px;
865
+ padding-inline-end: var(--size-8);
866
+ }
867
+ .wds-Button--block {
868
+ width: 100%;
869
+ }
870
+ .wds-Button-avatars {
871
+ display: inline-flex;
872
+ }
873
+ .wds-Button-avatars .np-avatar-view .np-avatar-view-content {
874
+ color: var(--Button-color);
875
+ }
876
+ .wds-Button-icon {
877
+ display: inline-block;
878
+ }
879
+ .wds-Button-content {
880
+ position: relative;
881
+ }
882
+ .wds-Button-content--loading .wds-Button-label,
883
+ .wds-Button-content--loading .wds-Button-media,
884
+ .wds-Button-content--loading .wds-Button-icon {
885
+ visibility: hidden;
886
+ opacity: 0;
887
+ }
888
+ .wds-Button-label {
889
+ display: flex;
890
+ justify-content: center;
891
+ align-items: center;
892
+ gap: var(--Button-label-gap);
893
+ position: relative;
894
+ }
895
+ .wds-Button-loader {
896
+ position: absolute;
897
+ display: flex;
898
+ justify-content: center;
899
+ align-items: center;
900
+ width: 100%;
901
+ height: 100%;
902
+ }
903
+ .wds-Button-loader .process-circle {
904
+ stroke: var(--Button-color);
905
+ }
906
+ /* RTL Styles */
907
+ [dir="rtl"] .wds-Button .tw-icon-chevron-right,[dir="rtl"] .wds-Button .tw-icon-arrow-right {
908
+ transform: rotate(180deg);
909
+ }
910
+ [dir="rtl"] .wds-Button .tw-icon-chevron-left,[dir="rtl"] .wds-Button .tw-icon-arrow-left {
911
+ transform: rotate(180deg);
912
+ }
913
+ /* Avatar border transparency */
914
+ /* dark buttons get 20% transparency, light buttons get 12% */
915
+ .wds-Button-avatars .np-circle {
916
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 20%, transparent);
917
+ }
918
+ .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,
919
+ .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,
920
+ .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,
921
+ .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 {
922
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
923
+ }
924
+ .np-theme-personal--dark .wds-Button--primary .wds-Button-avatars .np-circle,
925
+ .np-theme-personal--dark .wds-Button--primary.wds-Button--negative .wds-Button-avatars .np-circle,
926
+ .np-theme-personal--forest-green .wds-Button--primary .wds-Button-avatars .np-circle,
927
+ .np-theme-personal--forest-green .wds-Button--primary.wds-Button--negative .wds-Button-avatars .np-circle {
928
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
929
+ }
930
+ .np-theme-personal--bright-green .wds-Button--tertiary .wds-Button-avatars .np-circle,
931
+ .np-theme-personal--bright-green .wds-Button--minimal .wds-Button-avatars .np-circle {
932
+ --circle-border-color: color-mix(in srgb, var(--Button-color) 12%, transparent);
933
+ }
709
934
  .np-card {
710
935
  overflow: hidden;
711
936
  transition-property: transform, box-shadow;
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";
@@ -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,
@@ -18,11 +18,16 @@ export interface PrimitiveAnchorProps
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
  });
@@ -1,38 +1,12 @@
1
1
  import { FileType } from '../../common';
2
2
 
3
- const parseFileType = (fileType: string): string => {
4
- if (fileType?.includes('.')) {
5
- return fileType.replace('.', '').toUpperCase();
6
- }
7
-
8
- const mimeType = fileType?.split('/');
9
- if (mimeType?.length > 1) {
10
- let parsedType = mimeType[1];
11
-
12
- if (parsedType.toLocaleLowerCase() === 'jpeg') {
13
- parsedType = 'jpg, '.concat(parsedType).toUpperCase();
14
- }
15
-
16
- return parsedType.toUpperCase();
17
- }
18
-
19
- return fileType;
20
- };
21
-
22
3
  const getAllowedFileTypes = (fileTypes: readonly FileType[] | readonly string[]): string[] =>
23
- fileTypes.map((fileType: string) => {
24
- const splittedFileTypes = fileType?.split(',');
25
-
26
- if (splittedFileTypes?.length > 1) {
27
- // If `fileType` contains `format` and `mime` types, remove mime types, proceed only with format types
28
- return splittedFileTypes
29
- .filter((splittedFileType: string) => !splittedFileType?.includes('/'))
30
- .map((splittedFileType: string) => parseFileType(splittedFileType))
31
- .join(', ');
32
- }
33
-
34
- // If `fileType` contains only `format` or `mime` type, parse the type
35
- return parseFileType(fileType);
36
- });
4
+ fileTypes.map((fileTypeDefinition: string) =>
5
+ fileTypeDefinition
6
+ .split(',')
7
+ .filter((extension) => !extension.includes('/')) // Filter out mime types
8
+ .map((extension) => extension.replace('.', '').toUpperCase()) // Remove dot and convert extensions to uppercase to be displayed in the instructions
9
+ .join(', '),
10
+ );
37
11
 
38
12
  export default getAllowedFileTypes;