@transferwise/components 46.42.1 → 46.44.0

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.
package/build/main.css CHANGED
@@ -657,8 +657,6 @@ div.critical-comms .critical-comms-body {
657
657
  gap: var(--size-16);
658
658
  padding: 8px;
659
659
  padding: var(--size-8);
660
- margin: 8px;
661
- margin: var(--size-8);
662
660
  }
663
661
  @media (max-width: 767px) {
664
662
  .carousel {
@@ -705,6 +703,15 @@ div.critical-comms .critical-comms-body {
705
703
  height: 280px;
706
704
  }
707
705
  }
706
+ @media (min-width: 768px) {
707
+ .carousel-wrapper {
708
+ overflow: visible;
709
+ }
710
+ .carousel {
711
+ margin: 0 calc(-1 * 8px);
712
+ margin: 0 calc(-1 * var(--size-8));
713
+ }
714
+ }
708
715
  @media (max-width: 1199px) {
709
716
  .carousel__card {
710
717
  min-width: 242px;
@@ -12,8 +12,6 @@
12
12
  gap: var(--size-16);
13
13
  padding: 8px;
14
14
  padding: var(--size-8);
15
- margin: 8px;
16
- margin: var(--size-8);
17
15
  }
18
16
  @media (max-width: 767px) {
19
17
  .carousel {
@@ -60,6 +58,15 @@
60
58
  height: 280px;
61
59
  }
62
60
  }
61
+ @media (min-width: 768px) {
62
+ .carousel-wrapper {
63
+ overflow: visible;
64
+ }
65
+ .carousel {
66
+ margin: 0 calc(-1 * 8px);
67
+ margin: 0 calc(-1 * var(--size-8));
68
+ }
69
+ }
63
70
  @media (max-width: 1199px) {
64
71
  .carousel__card {
65
72
  min-width: 242px;
@@ -657,8 +657,6 @@ div.critical-comms .critical-comms-body {
657
657
  gap: var(--size-16);
658
658
  padding: 8px;
659
659
  padding: var(--size-8);
660
- margin: 8px;
661
- margin: var(--size-8);
662
660
  }
663
661
  @media (max-width: 767px) {
664
662
  .carousel {
@@ -705,6 +703,15 @@ div.critical-comms .critical-comms-body {
705
703
  height: 280px;
706
704
  }
707
705
  }
706
+ @media (min-width: 768px) {
707
+ .carousel-wrapper {
708
+ overflow: visible;
709
+ }
710
+ .carousel {
711
+ margin: 0 calc(-1 * 8px);
712
+ margin: 0 calc(-1 * var(--size-8));
713
+ }
714
+ }
708
715
  @media (max-width: 1199px) {
709
716
  .carousel__card {
710
717
  min-width: 242px;
@@ -3,6 +3,7 @@ import type { PromoCardLinkProps } from '../promoCard/PromoCard';
3
3
  export type CarouselCardCommon = {
4
4
  id: string;
5
5
  href?: string;
6
+ hrefTarget?: HTMLAnchorElement['target'];
6
7
  onClick?: () => void;
7
8
  className?: string;
8
9
  styles?: CSSProperties;
@@ -1 +1 @@
1
- {"version":3,"file":"Carousel.d.ts","sourceRoot":"","sources":["../../../src/carousel/Carousel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAIxF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,GAAG;IACrD,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,kBAAkB,GAAG;IACnD,IAAI,EAAE,OAAO,CAAC;CACf,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAErC,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AACnE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAUD,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAkSrC,CAAC;AAYF,eAAe,QAAQ,CAAC"}
1
+ {"version":3,"file":"Carousel.d.ts","sourceRoot":"","sources":["../../../src/carousel/Carousel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAA+B,MAAM,OAAO,CAAC;AAIxF,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGjE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACzC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,kBAAkB,GAAG;IACrD,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC1B,OAAO,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,kBAAkB,GAAG;IACnD,IAAI,EAAE,OAAO,CAAC;CACf,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,CAAC,CAAC;AAErC,MAAM,MAAM,YAAY,GAAG,mBAAmB,GAAG,iBAAiB,CAAC;AACnE,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACpC;AAUD,QAAA,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAmSrC,CAAC;AAYF,eAAe,QAAQ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"CheckboxButton.d.ts","sourceRoot":"","sources":["../../../src/checkboxButton/CheckboxButton.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAc,MAAM,OAAO,CAAC;AAExD,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;AAExE,QAAA,MAAM,cAAc,kHAgBnB,CAAC;AAEF,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"CheckboxButton.d.ts","sourceRoot":"","sources":["../../../src/checkboxButton/CheckboxButton.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAc,MAAM,OAAO,CAAC;AAIxD,MAAM,MAAM,mBAAmB,GAAG,mBAAmB,CAAC,gBAAgB,CAAC,CAAC;AAExE,QAAA,MAAM,cAAc,kHAsBlB,CAAC;AAEH,eAAe,cAAc,CAAC"}
@@ -2,7 +2,8 @@ import { Sentiment } from '../common';
2
2
  export type FieldProps = {
3
3
  /** `null` disables auto-generating the `id` attribute, falling back to nesting-based label association over setting `htmlFor` explicitly. */
4
4
  id?: string | null;
5
- label: React.ReactNode;
5
+ /** Should be specified unless the wrapped control has its own labeling mechanism, e.g. `Checkbox`. */
6
+ label?: React.ReactNode;
6
7
  /** @deprecated use `message` and `type={Sentiment.NEUTRAL}` prop instead */
7
8
  hint?: React.ReactNode;
8
9
  message?: React.ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/field/Field.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAUtC,MAAM,MAAM,UAAU,GAAG;IACvB,6IAA6I;IAC7I,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;IACjG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,KAAK,4FAQf,UAAU,gCA4CZ,CAAC"}
1
+ {"version":3,"file":"Field.d.ts","sourceRoot":"","sources":["../../../src/field/Field.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAUtC,MAAM,MAAM,UAAU,GAAG;IACvB,6IAA6I;IAC7I,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,sGAAsG;IACtG,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB,OAAO,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,SAAS,CAAC,EAAE,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;IACjG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,KAAK,4FAQf,UAAU,gCAiDZ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"InputGroup.d.ts","sourceRoot":"","sources":["../../../src/inputs/InputGroup.tsx"],"names":[],"mappings":"AAeA,wBAAgB,gBAAgB;;;EAQ/B;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAiBD,wBAAgB,UAAU,CAAC,EACzB,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,EAAE,eAAe,+BAmBjB"}
1
+ {"version":3,"file":"InputGroup.d.ts","sourceRoot":"","sources":["../../../src/inputs/InputGroup.tsx"],"names":[],"mappings":"AAsBA,wBAAgB,gBAAgB;;;EAQ/B;AAED,UAAU,eAAe;IACvB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CAC5B;AAiBD,wBAAgB,UAAU,CAAC,EACzB,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,QAAQ,GACT,EAAE,eAAe,+BAkCjB"}
@@ -1,4 +1,5 @@
1
1
  import { Merge } from '../utils';
2
+ import { WithInputAttributesProps } from './contexts';
2
3
  export interface SelectInputOptionItem<T = string> {
3
4
  type: 'option';
4
5
  value: T;
@@ -41,6 +42,7 @@ export interface SelectInputProps<T = string, M extends boolean = false> {
41
42
  disabled?: boolean;
42
43
  size?: 'sm' | 'md' | 'lg';
43
44
  className?: string;
45
+ UNSAFE_triggerButtonProps?: WithInputAttributesProps['inputAttributes'];
44
46
  onFilterChange?: (args: {
45
47
  query: string;
46
48
  queryNormalized: string | null;
@@ -49,7 +51,7 @@ export interface SelectInputProps<T = string, M extends boolean = false> {
49
51
  onClose?: () => void;
50
52
  onClear?: () => void;
51
53
  }
52
- export declare function SelectInput<T = string, M extends boolean = false>({ id: idProp, name, multiple, placeholder, items, defaultValue, value: controlledValue, compareValues, renderValue, renderFooter, renderTrigger, filterable, filterPlaceholder, disabled, size, className, onFilterChange, onChange, onClose, onClear, }: SelectInputProps<T, M>): import("react").JSX.Element;
54
+ export declare function SelectInput<T = string, M extends boolean = false>({ id: idProp, name, multiple, placeholder, items, defaultValue, value: controlledValue, compareValues, renderValue, renderFooter, renderTrigger, filterable, filterPlaceholder, disabled, size, className, UNSAFE_triggerButtonProps, onFilterChange, onChange, onClose, onClear, }: SelectInputProps<T, M>): import("react").JSX.Element;
53
55
  type SelectInputTriggerButtonElementType = 'button' | React.ComponentType;
54
56
  export type SelectInputTriggerButtonProps<T extends SelectInputTriggerButtonElementType = 'button'> = Merge<React.ComponentPropsWithoutRef<T>, {
55
57
  as?: T;
@@ -1 +1 @@
1
- {"version":3,"file":"SelectInput.d.ts","sourceRoot":"","sources":["../../../src/inputs/SelectInput.tsx"],"names":[],"mappings":"AAqBA,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAqCjC,MAAM,WAAW,qBAAqB,CAAC,CAAC,GAAG,MAAM;IAC/C,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,CAAC,CAAC;IACT,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,MAAM;IAC9C,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,SAAS,qBAAqB,CAAC,CAAC,CAAC,EAAE,CAAC;CAC9C;AAED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,WAAW,CAAC;CACnB;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,MAAM,IAClC,qBAAqB,CAAC,CAAC,CAAC,GACxB,oBAAoB,CAAC,CAAC,CAAC,GACvB,wBAAwB,CAAC;AAyD7B,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,SAAS,OAAO,GAAG,KAAK;IACrE,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,CAAC,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,SAAS,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAClD,YAAY,CAAC,EAAE,CAAC,SAAS,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;IACjD,KAAK,CAAC,EAAE,CAAC,SAAS,IAAI,GAAG,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;IAC1C,aAAa,CAAC,EACV,CAAC,MAAM,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,GAC/B,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,CAAC,GAAG,SAAS,KAAK,OAAO,CAAC,CAAC;IACtD,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,KAAK,KAAK,CAAC,SAAS,CAAC;IACjF,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE;QACpB,YAAY,EAAE,OAAO,CAAC;QACtB,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;KAC5C,KAAK,KAAK,CAAC,SAAS,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE;QACrB,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC;QACzB,gBAAgB,EAAE,OAAO,CAAC;QAC1B,KAAK,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;QAChC,QAAQ,EAAE,OAAO,CAAC;QAClB,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;QACzB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;KAC/B,KAAK,KAAK,CAAC,SAAS,CAAC;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,KAAK,IAAI,CAAC;IACnF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,SAAS,IAAI,GAAG,CAAC,EAAE,GAAG,CAAC,KAAK,IAAI,CAAC;IACrD,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AA+DD,wBAAgB,WAAW,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,SAAS,OAAO,GAAG,KAAK,EAAE,EACjE,EAAE,EAAE,MAAM,EACV,IAAI,EACJ,QAAQ,EACR,WAAW,EACX,KAAK,EACL,YAAY,EACZ,KAAK,EAAE,eAAe,EACtB,aAAa,EACb,WAAoB,EACpB,YAAY,EACZ,aAAoC,EACpC,UAAU,EACV,iBAAiB,EACjB,QAAQ,EACR,IAAW,EACX,SAAS,EACT,cAAqB,EACrB,QAAQ,EACR,OAAO,EACP,OAAO,GACR,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,+BAmJxB;AAED,KAAK,mCAAmC,GAAG,QAAQ,GAAG,KAAK,CAAC,aAAa,CAAC;AAE1E,MAAM,MAAM,6BAA6B,CACvC,CAAC,SAAS,mCAAmC,GAAG,QAAQ,IACtD,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,EAAE;IAAE,EAAE,CAAC,EAAE,CAAC,CAAA;CAAE,CAAC,CAAC;AAEzD,wBAAgB,wBAAwB,CAAC,CAAC,SAAS,mCAAmC,GAAG,QAAQ,EAAE,EACjG,EAAkB,EAClB,GAAG,SAAS,EACb,EAAE,6BAA6B,CAAC,CAAC,CAAC,+BAalC;AAyTD,MAAM,WAAW,6BAA6B;IAC5C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;CACxB;AAED,wBAAgB,wBAAwB,CAAC,EACvC,KAAK,EACL,IAAI,EACJ,WAAW,EACX,IAAI,GACL,EAAE,6BAA6B,+BAiD/B"}
1
+ {"version":3,"file":"SelectInput.d.ts","sourceRoot":"","sources":["../../../src/inputs/SelectInput.tsx"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "46.42.1",
3
+ "version": "46.44.0",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -12,8 +12,6 @@
12
12
  gap: var(--size-16);
13
13
  padding: 8px;
14
14
  padding: var(--size-8);
15
- margin: 8px;
16
- margin: var(--size-8);
17
15
  }
18
16
  @media (max-width: 767px) {
19
17
  .carousel {
@@ -60,6 +58,15 @@
60
58
  height: 280px;
61
59
  }
62
60
  }
61
+ @media (min-width: 768px) {
62
+ .carousel-wrapper {
63
+ overflow: visible;
64
+ }
65
+ .carousel {
66
+ margin: 0 calc(-1 * 8px);
67
+ margin: 0 calc(-1 * var(--size-8));
68
+ }
69
+ }
63
70
  @media (max-width: 1199px) {
64
71
  .carousel__card {
65
72
  min-width: 242px;
@@ -11,7 +11,6 @@
11
11
  scroll-behavior: smooth;
12
12
  gap: var(--size-16);
13
13
  padding: var(--size-8);
14
- margin: var(--size-8);
15
14
  }
16
15
 
17
16
  @media (--screen-sm-max) {
@@ -60,6 +59,16 @@
60
59
  }
61
60
  }
62
61
 
62
+ @media (--screen-md) {
63
+ .carousel-wrapper {
64
+ overflow: visible;
65
+ }
66
+
67
+ .carousel {
68
+ margin: 0 calc(-1 * var(--size-8));
69
+ }
70
+ }
71
+
63
72
 
64
73
  @media (--screen-lg-max) {
65
74
  .carousel__card {
@@ -43,6 +43,7 @@ const carouselCards: CarouselCard[] = [
43
43
  id: 'SHOP_OR_STALL',
44
44
  type: 'anchor',
45
45
  href: 'https://wise.com',
46
+ hrefTarget: '_blank',
46
47
  onClick: () => {},
47
48
  styles: {
48
49
  backgroundImage:
@@ -10,6 +10,7 @@ import PromoCard from '../promoCard/PromoCard';
10
10
  export type CarouselCardCommon = {
11
11
  id: string;
12
12
  href?: string;
13
+ hrefTarget?: HTMLAnchorElement['target'];
13
14
  onClick?: () => void;
14
15
  className?: string;
15
16
  styles?: CSSProperties;
@@ -300,6 +301,7 @@ const Carousel: React.FC<CarouselProps> = ({ header, className, cards, onClick }
300
301
  }
301
302
  }}
302
303
  href={card.href}
304
+ target={card.hrefTarget}
303
305
  rel="noreferrer"
304
306
  onKeyDown={(event) => handleOnKeyDown(event, index)}
305
307
  >
@@ -1,6 +1,7 @@
1
1
  import { render, fireEvent, screen } from '@testing-library/react';
2
2
 
3
3
  import Checkbox, { CheckboxProps } from '.';
4
+ import { Field } from '../field/Field';
4
5
 
5
6
  describe('Checkbox', () => {
6
7
  let props: CheckboxProps;
@@ -115,6 +116,18 @@ describe('Checkbox', () => {
115
116
  expect(getCheckboxContainer(container)).toHaveClass('checkbox-lg');
116
117
  });
117
118
 
119
+ it('supports `Field` for error messages', () => {
120
+ render(
121
+ <Field message="Something went wrong" sentiment="negative">
122
+ <Checkbox {...props} checked />
123
+ </Field>,
124
+ );
125
+
126
+ const checkbox = screen.getByRole('checkbox');
127
+ expect(checkbox).toBeInvalid();
128
+ expect(checkbox).toHaveAccessibleDescription('Something went wrong');
129
+ });
130
+
118
131
  const getCheckboxContainer = (container: HTMLElement) => container.querySelector('.np-checkbox');
119
132
  const getLabel = () => screen.getByText('hello').parentElement!;
120
133
  const getCheckbox = () => screen.getByRole('checkbox');
@@ -1,5 +1,7 @@
1
1
  import { Meta, StoryObj } from '@storybook/react';
2
+ import { fn } from '@storybook/test';
2
3
 
4
+ import { Field } from '../field/Field';
3
5
  import { lorem10, storyConfig } from '../test-utils';
4
6
 
5
7
  import Checkbox from './Checkbox';
@@ -9,6 +11,7 @@ export default {
9
11
  title: 'Forms/Checkbox',
10
12
  args: {
11
13
  label: 'This is the label',
14
+ onChange: fn(),
12
15
  },
13
16
  tags: ['autodocs'],
14
17
  } satisfies Meta<typeof Checkbox>;
@@ -37,3 +40,13 @@ export const Multiple: Story = storyConfig(
37
40
  export const MultipleMobile: Story = storyConfig(Multiple, {
38
41
  variants: ['default', 'dark', 'rtl', 'mobile'],
39
42
  });
43
+
44
+ export const WithinField = {
45
+ decorators: [
46
+ (Story) => (
47
+ <Field message="Something went wrong" sentiment="negative">
48
+ <Story />
49
+ </Field>
50
+ ),
51
+ ],
52
+ } satisfies Story;
@@ -1,12 +1,20 @@
1
1
  import classNames from 'classnames';
2
2
  import { InputHTMLAttributes, forwardRef } from 'react';
3
3
 
4
+ import { useInputAttributes } from '../inputs/contexts';
5
+
4
6
  export type CheckboxButtonProps = InputHTMLAttributes<HTMLInputElement>;
5
7
 
6
- const CheckboxButton = forwardRef<HTMLInputElement, CheckboxButtonProps>(
7
- ({ checked, className, disabled, onChange, ...rest }, reference) => (
8
+ const CheckboxButton = forwardRef<HTMLInputElement, CheckboxButtonProps>(function CheckboxButton(
9
+ { checked, className, disabled, onChange, ...rest },
10
+ reference,
11
+ ) {
12
+ const inputAttributes = useInputAttributes();
13
+
14
+ return (
8
15
  <span className={classNames('np-checkbox-button', className, disabled && 'disabled')}>
9
16
  <input
17
+ {...inputAttributes}
10
18
  {...rest}
11
19
  ref={reference}
12
20
  type="checkbox"
@@ -18,7 +26,7 @@ const CheckboxButton = forwardRef<HTMLInputElement, CheckboxButtonProps>(
18
26
  <span className="tw-checkbox-check" />
19
27
  </span>
20
28
  </span>
21
- ),
22
- );
29
+ );
30
+ });
23
31
 
24
32
  export default CheckboxButton;
@@ -14,7 +14,8 @@ import { Label } from '../label/Label';
14
14
  export type FieldProps = {
15
15
  /** `null` disables auto-generating the `id` attribute, falling back to nesting-based label association over setting `htmlFor` explicitly. */
16
16
  id?: string | null;
17
- label: React.ReactNode;
17
+ /** Should be specified unless the wrapped control has its own labeling mechanism, e.g. `Checkbox`. */
18
+ label?: React.ReactNode;
18
19
  /** @deprecated use `message` and `type={Sentiment.NEUTRAL}` prop instead */
19
20
  hint?: React.ReactNode;
20
21
  message?: React.ReactNode;
@@ -62,10 +63,15 @@ export const Field = ({
62
63
  className,
63
64
  )}
64
65
  >
65
- <Label id={labelId} htmlFor={inputId}>
66
- {label}
67
- {children}
68
- </Label>
66
+ {label != null ? (
67
+ <Label id={labelId} htmlFor={inputId}>
68
+ {label}
69
+ {children}
70
+ </Label>
71
+ ) : (
72
+ children
73
+ )}
74
+
69
75
  {message && (
70
76
  <InlineAlert type={sentiment} id={descriptionId}>
71
77
  {message}
@@ -0,0 +1,26 @@
1
+ import { Search } from '@transferwise/icons';
2
+
3
+ import { Field } from '../field/Field';
4
+ import { mockResizeObserver, render, screen } from '../test-utils';
5
+ import { Input } from './Input';
6
+ import { InputGroup } from './InputGroup';
7
+
8
+ mockResizeObserver();
9
+
10
+ describe('InputGroup', () => {
11
+ it('supports `Field` for labeling', () => {
12
+ render(
13
+ <Field label="Search…">
14
+ <InputGroup
15
+ addonStart={{
16
+ content: <Search size={24} />,
17
+ initialContentWidth: 24,
18
+ }}
19
+ >
20
+ <Input />
21
+ </InputGroup>
22
+ </Field>,
23
+ );
24
+ expect(screen.getAllByRole('group')[0]).toHaveAccessibleName(/^Search…/);
25
+ });
26
+ });
@@ -3,6 +3,13 @@ import { createContext, useContext, useMemo, useRef, useState } from 'react';
3
3
 
4
4
  import { useResizeObserver } from '../common/hooks/useResizeObserver';
5
5
  import { cssValueWithUnit } from '../utilities/cssValueWithUnit';
6
+ import {
7
+ FieldLabelIdContextProvider,
8
+ InputDescribedByProvider,
9
+ InputIdContextProvider,
10
+ InputInvalidProvider,
11
+ useInputAttributes,
12
+ } from './contexts';
6
13
 
7
14
  type InputPaddingContextType = [
8
15
  number | string | undefined,
@@ -60,23 +67,38 @@ export function InputGroup({
60
67
  className,
61
68
  children,
62
69
  }: InputGroupProps) {
70
+ const inputAttributes = useInputAttributes({ nonLabelable: true });
71
+
63
72
  const [paddingStart, setPaddingStart] = useState(inputPaddingInitialState(addonStart));
64
73
  const [paddingEnd, setPaddingEnd] = useState(inputPaddingInitialState(addonEnd));
65
74
 
66
75
  return (
67
- <InputPaddingStartContext.Provider
68
- value={useMemo(() => [paddingStart, setPaddingStart], [paddingStart])}
69
- >
70
- <InputPaddingEndContext.Provider
71
- value={useMemo(() => [paddingEnd, setPaddingEnd], [paddingEnd])}
72
- >
73
- <fieldset disabled={disabled} className={classNames(className, 'np-input-group')}>
74
- {addonStart != null ? <InputAddon placement="start" {...addonStart} /> : null}
75
- {children}
76
- {addonEnd != null ? <InputAddon placement="end" {...addonEnd} /> : null}
77
- </fieldset>
78
- </InputPaddingEndContext.Provider>
79
- </InputPaddingStartContext.Provider>
76
+ /* Prevent nested controls from being labeled redundantly */
77
+ <FieldLabelIdContextProvider value={undefined}>
78
+ <InputIdContextProvider value={undefined}>
79
+ <InputDescribedByProvider value={undefined}>
80
+ <InputInvalidProvider value={undefined}>
81
+ <InputPaddingStartContext.Provider
82
+ value={useMemo(() => [paddingStart, setPaddingStart], [paddingStart])}
83
+ >
84
+ <InputPaddingEndContext.Provider
85
+ value={useMemo(() => [paddingEnd, setPaddingEnd], [paddingEnd])}
86
+ >
87
+ <fieldset
88
+ {...inputAttributes}
89
+ disabled={disabled}
90
+ className={classNames(className, 'np-input-group')}
91
+ >
92
+ {addonStart != null ? <InputAddon placement="start" {...addonStart} /> : null}
93
+ {children}
94
+ {addonEnd != null ? <InputAddon placement="end" {...addonEnd} /> : null}
95
+ </fieldset>
96
+ </InputPaddingEndContext.Provider>
97
+ </InputPaddingStartContext.Provider>
98
+ </InputInvalidProvider>
99
+ </InputDescribedByProvider>
100
+ </InputIdContextProvider>
101
+ </FieldLabelIdContextProvider>
80
102
  );
81
103
  }
82
104
 
@@ -0,0 +1,16 @@
1
+ import { Field } from '../field/Field';
2
+ import { mockResizeObserver, render, screen } from '../test-utils';
3
+ import { SearchInput } from './SearchInput';
4
+
5
+ mockResizeObserver();
6
+
7
+ describe('SearchInput', () => {
8
+ it('supports `Field` for labeling', () => {
9
+ render(
10
+ <Field label="Search…">
11
+ <SearchInput />
12
+ </Field>,
13
+ );
14
+ expect(screen.getAllByRole('group')[0]).toHaveAccessibleName(/^Search…/);
15
+ });
16
+ });
@@ -214,6 +214,6 @@ describe('SelectInput', () => {
214
214
  <SelectInput items={[{ type: 'option', value: 'USD' }]} value="USD" />
215
215
  </Field>,
216
216
  );
217
- expect(screen.getByLabelText('Currency')).toHaveAttribute('aria-haspopup');
217
+ expect(screen.getAllByRole('group')[0]).toHaveAccessibleName(/^Currency/);
218
218
  });
219
219
  });
@@ -24,7 +24,7 @@ import { Merge } from '../utils';
24
24
  import { BottomSheet } from './_BottomSheet';
25
25
  import { ButtonInput } from './_ButtonInput';
26
26
  import { Popover } from './_Popover';
27
- import { useInputAttributes } from './contexts';
27
+ import { useInputAttributes, WithInputAttributesProps } from './contexts';
28
28
  import { InputGroup } from './InputGroup';
29
29
  import { SearchInput } from './SearchInput';
30
30
  import messages from './SelectInput.messages';
@@ -162,6 +162,7 @@ export interface SelectInputProps<T = string, M extends boolean = false> {
162
162
  disabled?: boolean;
163
163
  size?: 'sm' | 'md' | 'lg';
164
164
  className?: string;
165
+ UNSAFE_triggerButtonProps?: WithInputAttributesProps['inputAttributes'];
165
166
  onFilterChange?: (args: { query: string; queryNormalized: string | null }) => void;
166
167
  onChange?: (value: M extends true ? T[] : T) => void;
167
168
  onClose?: () => void;
@@ -246,6 +247,7 @@ export function SelectInput<T = string, M extends boolean = false>({
246
247
  disabled,
247
248
  size = 'md',
248
249
  className,
250
+ UNSAFE_triggerButtonProps,
249
251
  onFilterChange = noop,
250
252
  onChange,
251
253
  onClose,
@@ -321,6 +323,7 @@ export function SelectInput<T = string, M extends boolean = false>({
321
323
  triggerRef.current = node;
322
324
  },
323
325
  ...inputAttributes,
326
+ ...UNSAFE_triggerButtonProps,
324
327
  id,
325
328
  ...mergeProps(
326
329
  {
package/src/main.css CHANGED
@@ -657,8 +657,6 @@ div.critical-comms .critical-comms-body {
657
657
  gap: var(--size-16);
658
658
  padding: 8px;
659
659
  padding: var(--size-8);
660
- margin: 8px;
661
- margin: var(--size-8);
662
660
  }
663
661
  @media (max-width: 767px) {
664
662
  .carousel {
@@ -705,6 +703,15 @@ div.critical-comms .critical-comms-body {
705
703
  height: 280px;
706
704
  }
707
705
  }
706
+ @media (min-width: 768px) {
707
+ .carousel-wrapper {
708
+ overflow: visible;
709
+ }
710
+ .carousel {
711
+ margin: 0 calc(-1 * 8px);
712
+ margin: 0 calc(-1 * var(--size-8));
713
+ }
714
+ }
708
715
  @media (max-width: 1199px) {
709
716
  .carousel__card {
710
717
  min-width: 242px;