@transferwise/components 0.0.0-experimental-d3453cf → 0.0.0-experimental-3f5dc0d

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 (104) hide show
  1. package/build/expressiveMoneyInput/AmountInput.js +281 -0
  2. package/build/expressiveMoneyInput/AmountInput.js.map +1 -0
  3. package/build/expressiveMoneyInput/AmountInput.mjs +279 -0
  4. package/build/expressiveMoneyInput/AmountInput.mjs.map +1 -0
  5. package/build/expressiveMoneyInput/AnimatedNumber.js +50 -0
  6. package/build/expressiveMoneyInput/AnimatedNumber.js.map +1 -0
  7. package/build/expressiveMoneyInput/AnimatedNumber.mjs +48 -0
  8. package/build/expressiveMoneyInput/AnimatedNumber.mjs.map +1 -0
  9. package/build/expressiveMoneyInput/Chevron.js +33 -0
  10. package/build/expressiveMoneyInput/Chevron.js.map +1 -0
  11. package/build/expressiveMoneyInput/Chevron.mjs +31 -0
  12. package/build/expressiveMoneyInput/Chevron.mjs.map +1 -0
  13. package/build/expressiveMoneyInput/CurrencySelector.js +160 -0
  14. package/build/expressiveMoneyInput/CurrencySelector.js.map +1 -0
  15. package/build/expressiveMoneyInput/CurrencySelector.mjs +157 -0
  16. package/build/expressiveMoneyInput/CurrencySelector.mjs.map +1 -0
  17. package/build/expressiveMoneyInput/ExpressiveMoneyInput.js +113 -0
  18. package/build/expressiveMoneyInput/ExpressiveMoneyInput.js.map +1 -0
  19. package/build/expressiveMoneyInput/ExpressiveMoneyInput.messages.js +17 -0
  20. package/build/expressiveMoneyInput/ExpressiveMoneyInput.messages.js.map +1 -0
  21. package/build/expressiveMoneyInput/ExpressiveMoneyInput.messages.mjs +13 -0
  22. package/build/expressiveMoneyInput/ExpressiveMoneyInput.messages.mjs.map +1 -0
  23. package/build/expressiveMoneyInput/ExpressiveMoneyInput.mjs +109 -0
  24. package/build/expressiveMoneyInput/ExpressiveMoneyInput.mjs.map +1 -0
  25. package/build/expressiveMoneyInput/useFocus.js +37 -0
  26. package/build/expressiveMoneyInput/useFocus.js.map +1 -0
  27. package/build/expressiveMoneyInput/useFocus.mjs +35 -0
  28. package/build/expressiveMoneyInput/useFocus.mjs.map +1 -0
  29. package/build/expressiveMoneyInput/useInputStyle.js +71 -0
  30. package/build/expressiveMoneyInput/useInputStyle.js.map +1 -0
  31. package/build/expressiveMoneyInput/useInputStyle.mjs +69 -0
  32. package/build/expressiveMoneyInput/useInputStyle.mjs.map +1 -0
  33. package/build/expressiveMoneyInput/utils.js +87 -0
  34. package/build/expressiveMoneyInput/utils.js.map +1 -0
  35. package/build/expressiveMoneyInput/utils.mjs +78 -0
  36. package/build/expressiveMoneyInput/utils.mjs.map +1 -0
  37. package/build/i18n/en.json +2 -0
  38. package/build/i18n/en.json.js +2 -0
  39. package/build/i18n/en.json.js.map +1 -1
  40. package/build/i18n/en.json.mjs +2 -0
  41. package/build/i18n/en.json.mjs.map +1 -1
  42. package/build/index.js +2 -0
  43. package/build/index.js.map +1 -1
  44. package/build/index.mjs +1 -0
  45. package/build/index.mjs.map +1 -1
  46. package/build/main.css +58 -0
  47. package/build/styles/expressiveMoneyInput/AmountInput.css +32 -0
  48. package/build/styles/expressiveMoneyInput/Chevron.css +12 -0
  49. package/build/styles/expressiveMoneyInput/CurrencySelector.css +6 -0
  50. package/build/styles/expressiveMoneyInput/ExpressiveMoneyInput.css +58 -0
  51. package/build/styles/main.css +58 -0
  52. package/build/types/expressiveMoneyInput/AmountInput.d.ts +13 -0
  53. package/build/types/expressiveMoneyInput/AmountInput.d.ts.map +1 -0
  54. package/build/types/expressiveMoneyInput/AnimatedNumber.d.ts +9 -0
  55. package/build/types/expressiveMoneyInput/AnimatedNumber.d.ts.map +1 -0
  56. package/build/types/expressiveMoneyInput/Chevron.d.ts +6 -0
  57. package/build/types/expressiveMoneyInput/Chevron.d.ts.map +1 -0
  58. package/build/types/expressiveMoneyInput/CurrencySelector.d.ts +30 -0
  59. package/build/types/expressiveMoneyInput/CurrencySelector.d.ts.map +1 -0
  60. package/build/types/expressiveMoneyInput/ExpressiveMoneyInput.d.ts +30 -0
  61. package/build/types/expressiveMoneyInput/ExpressiveMoneyInput.d.ts.map +1 -0
  62. package/build/types/expressiveMoneyInput/ExpressiveMoneyInput.messages.d.ts +12 -0
  63. package/build/types/expressiveMoneyInput/ExpressiveMoneyInput.messages.d.ts.map +1 -0
  64. package/build/types/expressiveMoneyInput/index.d.ts +3 -0
  65. package/build/types/expressiveMoneyInput/index.d.ts.map +1 -0
  66. package/build/types/expressiveMoneyInput/useFocus.d.ts +7 -0
  67. package/build/types/expressiveMoneyInput/useFocus.d.ts.map +1 -0
  68. package/build/types/expressiveMoneyInput/useInputStyle.d.ts +10 -0
  69. package/build/types/expressiveMoneyInput/useInputStyle.d.ts.map +1 -0
  70. package/build/types/expressiveMoneyInput/useSelectionRange.d.ts +10 -0
  71. package/build/types/expressiveMoneyInput/useSelectionRange.d.ts.map +1 -0
  72. package/build/types/expressiveMoneyInput/utils.d.ts +22 -0
  73. package/build/types/expressiveMoneyInput/utils.d.ts.map +1 -0
  74. package/build/types/index.d.ts +2 -0
  75. package/build/types/index.d.ts.map +1 -1
  76. package/build/types/test-utils/index.d.ts +4 -0
  77. package/build/types/test-utils/index.d.ts.map +1 -1
  78. package/package.json +9 -2
  79. package/src/expressiveMoneyInput/AmountInput.css +32 -0
  80. package/src/expressiveMoneyInput/AmountInput.less +43 -0
  81. package/src/expressiveMoneyInput/AmountInput.tsx +353 -0
  82. package/src/expressiveMoneyInput/AnimatedNumber.tsx +40 -0
  83. package/src/expressiveMoneyInput/Chevron.css +12 -0
  84. package/src/expressiveMoneyInput/Chevron.less +13 -0
  85. package/src/expressiveMoneyInput/Chevron.tsx +35 -0
  86. package/src/expressiveMoneyInput/CurrencySelector.css +6 -0
  87. package/src/expressiveMoneyInput/CurrencySelector.less +7 -0
  88. package/src/expressiveMoneyInput/CurrencySelector.tsx +218 -0
  89. package/src/expressiveMoneyInput/ExpressiveMoneyInput.css +58 -0
  90. package/src/expressiveMoneyInput/ExpressiveMoneyInput.less +13 -0
  91. package/src/expressiveMoneyInput/ExpressiveMoneyInput.messages.ts +13 -0
  92. package/src/expressiveMoneyInput/ExpressiveMoneyInput.story.tsx +188 -0
  93. package/src/expressiveMoneyInput/ExpressiveMoneyInput.tsx +124 -0
  94. package/src/expressiveMoneyInput/index.ts +2 -0
  95. package/src/expressiveMoneyInput/useFocus.ts +35 -0
  96. package/src/expressiveMoneyInput/useInputStyle.ts +85 -0
  97. package/src/expressiveMoneyInput/useSelectionRange.ts +23 -0
  98. package/src/expressiveMoneyInput/utils.spec.ts +114 -0
  99. package/src/expressiveMoneyInput/utils.ts +116 -0
  100. package/src/i18n/en.json +2 -0
  101. package/src/index.ts +2 -0
  102. package/src/main.css +58 -0
  103. package/src/main.less +1 -0
  104. package/src/ssr.spec.tsx +1 -0
@@ -0,0 +1,22 @@
1
+ import type { KeyboardEvent } from 'react';
2
+ export declare const getDecimalSeparator: (currency: string, locale: string) => string | null;
3
+ export declare const getGroupSeparator: (currency: string, locale: string) => string | null;
4
+ export declare const getDecimalCount: (currency: string, locale: string) => number;
5
+ export declare const getEnteredDecimalsCount: (value: string, decimalSeparator: string) => number;
6
+ export declare const getUnformattedNumber: ({ value: formattedValue, currency, locale, }: {
7
+ value: string;
8
+ currency: string;
9
+ locale: string;
10
+ }) => number | null;
11
+ export declare const getFormattedString: ({ value: unformattedValue, currency, locale, alwaysShowDecimals, }: {
12
+ value: number;
13
+ currency: string;
14
+ locale: string;
15
+ alwaysShowDecimals?: boolean;
16
+ }) => string;
17
+ export declare const isInputPossiblyOverflowing: ({ ref, value, }: {
18
+ ref: React.RefObject<HTMLInputElement>;
19
+ value: string;
20
+ }) => boolean | undefined;
21
+ export declare const isAllowedInputKey: (e: KeyboardEvent<HTMLInputElement>) => boolean;
22
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/expressiveMoneyInput/utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,eAAO,MAAM,mBAAmB,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,KAAG,MAAM,GAAG,IAE/E,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,KAAG,MAAM,GAAG,IAE7E,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,EAAE,QAAQ,MAAM,KAAG,MAOlE,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,OAAO,MAAM,EAAE,kBAAkB,MAAM,WAE9E,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAAI,8CAIlC;IACD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,KAAG,MAAM,GAAG,IAmBZ,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,oEAKhC;IACD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,KAAG,MAiBH,CAAC;AAEF,eAAO,MAAM,0BAA0B,GAAI,iBAGxC;IACD,GAAG,EAAE,KAAK,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACvC,KAAK,EAAE,MAAM,CAAC;CACf,wBASA,CAAC;AAaF,eAAO,MAAM,iBAAiB,GAAI,GAAG,aAAa,CAAC,gBAAgB,CAAC,YAKnE,CAAC"}
@@ -40,6 +40,7 @@ export type { MarkdownProps } from './markdown';
40
40
  export type { ModalProps } from './modal';
41
41
  export type { MoneyProps } from './money';
42
42
  export type { CurrencyHeaderItem, CurrencyItem, CurrencyOptionItem, MoneyInputProps, } from './moneyInput';
43
+ export type { ExpressiveMoneyInputProps } from './expressiveMoneyInput';
43
44
  export type { NavigationOptionListProps } from './navigationOptionsList';
44
45
  export type { NavigationOptionProps } from './navigationOption/NavigationOption';
45
46
  export type { OverlayHeaderProps } from './overlayHeader';
@@ -133,6 +134,7 @@ export { default as Markdown } from './markdown';
133
134
  export { default as Modal } from './modal';
134
135
  export { default as Money } from './money';
135
136
  export { default as MoneyInput } from './moneyInput';
137
+ export { default as ExpressiveMoneyInput } from './expressiveMoneyInput';
136
138
  export { default as NavigationOption } from './navigationOption';
137
139
  export { default as NavigationOptionsList } from './navigationOptionsList';
138
140
  export { default as Nudge } from './nudge';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAClE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,YAAY,EAAE,cAAc,IAAI,WAAW,EAAE,MAAM,UAAU,CAAC;AAC9D,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,YAAY,EACV,SAAS,EACT,YAAY,EACZ,eAAe,EACf,SAAS,EACT,UAAU,EACV,eAAe,GAChB,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACtF,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,YAAY,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AAC5E,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,YAAY,EACV,oBAAoB,EACpB,eAAe,EACf,6BAA6B,EAC7B,qBAAqB,EACrB,gBAAgB,EAChB,wBAAwB,EACxB,6BAA6B,GAC9B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,YAAY,EAAE,UAAU,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAC3F,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,kBAAkB,EAClB,eAAe,GAChB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACxE,YAAY,EAAE,yBAAyB,EAAE,MAAM,yBAAyB,CAAC;AACzE,YAAY,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACjF,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AACjF,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AACxF,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC/F,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC1C,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACrE,YAAY,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,YAAY,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAChE,YAAY,EACV,UAAU,EACV,yBAAyB,EACzB,gBAAgB,EAChB,WAAW,GACZ,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,YAAY,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACjD,YAAY,EAAE,8BAA8B,EAAE,MAAM,6BAA6B,CAAC;AAClF,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnE,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACrF,YAAY,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,YAAY,EACV,UAAU,EACV,YAAY,EACZ,qBAAqB,EACrB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,eAAe,EACf,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,YAAY,EACV,aAAa,EACb,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,uBAAuB,EACvB,kBAAkB,EAClB,uBAAuB,EACvB,2BAA2B,EAC3B,mBAAmB,EACnB,qBAAqB,EACrB,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC;;GAEG;AACH,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAC5E,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC7E,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EACL,WAAW,EACX,wBAAwB,EACxB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC/E,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,EAAE,OAAO,IAAI,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AACnF,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,aAAa,CAAC;AACnD,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,eAAe,CAAC;AACvD,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,MAAM,SAAS,CAAC;AAC3C,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEzC;;GAEG;AACH,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAEhE;;GAEG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EACL,UAAU,EACV,WAAW,EACX,QAAQ,EACR,SAAS,EACT,QAAQ,EACR,MAAM,EACN,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,MAAM,EACN,SAAS,EACT,IAAI,EACJ,MAAM,EACN,KAAK,EACL,IAAI,EACJ,UAAU,EACV,OAAO,EACP,KAAK,GACN,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC;;GAEG;AACH,OAAO,EACL,YAAY,EACZ,cAAc,EACd,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,sBAAsB,EACtB,iBAAiB,EACjB,SAAS,EACT,YAAY,EACZ,qBAAqB,GACtB,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEjD;;GAEG;AACH,OAAO,EAAE,OAAO,IAAI,MAAM,EAAE,MAAM,UAAU,CAAC"}
@@ -26,6 +26,8 @@ declare function customRender(ui: ReactElement, { locale, messages, ...renderOpt
26
26
  "neptune.DateLookup.selected": string;
27
27
  "neptune.DateLookup.twentyYears": string;
28
28
  "neptune.DateLookup.year": string;
29
+ "neptune.ExpressiveMoneyInput.currency.search.placeholder": string;
30
+ "neptune.ExpressiveMoneyInput.currency.select.currency": string;
29
31
  "neptune.FlowNavigation.back": string;
30
32
  "neptune.Info.ariaLabel": string;
31
33
  "neptune.Label.optional": string;
@@ -109,6 +111,8 @@ declare function customRenderHook(callback: () => unknown, { locale, messages }?
109
111
  "neptune.DateLookup.selected": string;
110
112
  "neptune.DateLookup.twentyYears": string;
111
113
  "neptune.DateLookup.year": string;
114
+ "neptune.ExpressiveMoneyInput.currency.search.placeholder": string;
115
+ "neptune.ExpressiveMoneyInput.currency.select.currency": string;
112
116
  "neptune.FlowNavigation.back": string;
113
117
  "neptune.Info.ariaLabel": string;
114
118
  "neptune.Label.optional": string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/test-utils/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAM,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,MAAM,EAAc,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAMxD;;;;GAIG;AACH,iBAAS,YAAY,CACnB,EAAE,EAAE,YAAY,EAChB,EAAE,MAAuB,EAAE,QAAa,EAAE,GAAG,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAK,GAChE,UAAU,CAAC,OAAO,MAAM,CAAC,CAK3B;AAED;;;GAGG;AACH,iBAAS,gBAAgB,CACvB,QAAQ,EAAE,MAAM,OAAO,EACvB,EAAE,MAAuB,EAAE,QAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAK,uEAKhD;AAED,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,YAAY,IAAI,MAAM,EAAE,gBAAgB,IAAI,UAAU,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/test-utils/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAM,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,MAAM,EAAc,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAMxD;;;;GAIG;AACH,iBAAS,YAAY,CACnB,EAAE,EAAE,YAAY,EAChB,EAAE,MAAuB,EAAE,QAAa,EAAE,GAAG,aAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAK,GAChE,UAAU,CAAC,OAAO,MAAM,CAAC,CAK3B;AAED;;;GAGG;AACH,iBAAS,gBAAgB,CACvB,QAAQ,EAAE,MAAM,OAAO,EACvB,EAAE,MAAuB,EAAE,QAAa,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAK,uEAKhD;AAED,cAAc,wBAAwB,CAAC;AACvC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,OAAO,EAAE,YAAY,IAAI,MAAM,EAAE,gBAAgB,IAAI,UAAU,EAAE,SAAS,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-d3453cf",
3
+ "version": "0.0.0-experimental-3f5dc0d",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -83,6 +83,7 @@
83
83
  "storybook": "^9.1.3",
84
84
  "storybook-addon-tag-badges": "^2.0.2",
85
85
  "storybook-addon-test-codegen": "^2.0.1",
86
+ "framer-motion": "^12.23.22",
86
87
  "@transferwise/less-config": "3.1.2",
87
88
  "@transferwise/neptune-css": "14.25.0",
88
89
  "@wise/components-theming": "1.7.0",
@@ -95,7 +96,13 @@
95
96
  "@wise/components-theming": "^1.6.2",
96
97
  "react": ">=18",
97
98
  "react-dom": ">=18",
98
- "react-intl": "^5.10.0 || ^6 || ^7"
99
+ "react-intl": "^5.10.0 || ^6 || ^7",
100
+ "framer-motion": "^12.23.22"
101
+ },
102
+ "peerDependenciesMeta": {
103
+ "framer-motion": {
104
+ "optional": true
105
+ }
99
106
  },
100
107
  "dependencies": {
101
108
  "@babel/runtime": "^7.28.3",
@@ -0,0 +1,32 @@
1
+ .wds-amount-input-container {
2
+ width: 100%;
3
+ }
4
+ .wds-amount-input-input-container {
5
+ display: flex;
6
+ justify-content: right;
7
+ width: 100%;
8
+ transition: font-size 0.4s cubic-bezier(0.3, 0, 0.1, 1), height 0.4s cubic-bezier(0.3, 0, 0.1, 1), margin-top 0.4s cubic-bezier(0.3, 0, 0.1, 1), color 0.4s ease;
9
+ color: var(--color-interactive-primary);
10
+ overflow: hidden;
11
+ margin-bottom: 0 !important;
12
+ }
13
+ @media (prefers-reduced-motion: reduce) {
14
+ .wds-amount-input-input-container {
15
+ transition: none;
16
+ }
17
+ }
18
+ .wds-amount-input-input {
19
+ border: none;
20
+ outline: none;
21
+ flex-grow: 1;
22
+ text-align: right;
23
+ background-color: transparent;
24
+ }
25
+ .wds-amount-input-input:focus-visible {
26
+ outline: none;
27
+ }
28
+ .wds-amount-input-placeholder {
29
+ flex-grow: 0;
30
+ display: flex;
31
+ align-items: center;
32
+ }
@@ -0,0 +1,43 @@
1
+ .wds-amount-input {
2
+ &-container {
3
+ width: 100%;
4
+ }
5
+
6
+ &-input-container {
7
+ display: flex;
8
+ justify-content: right;
9
+ width: 100%;
10
+ transition:
11
+ font-size 0.4s cubic-bezier(0.3, 0, 0.1, 1),
12
+ height 0.4s cubic-bezier(0.3, 0, 0.1, 1),
13
+ margin-top 0.4s cubic-bezier(0.3, 0, 0.1, 1),
14
+ color 0.4s ease;
15
+ color: var(--color-interactive-primary);
16
+ overflow: hidden;
17
+ margin-bottom: 0 !important;
18
+ }
19
+
20
+ @media (prefers-reduced-motion: reduce) {
21
+ &-input-container {
22
+ transition: none;
23
+ }
24
+ }
25
+
26
+ &-input {
27
+ border: none;
28
+ outline: none;
29
+ flex-grow: 1;
30
+ text-align: right;
31
+ background-color: transparent;
32
+
33
+ &:focus-visible {
34
+ outline: none;
35
+ }
36
+ }
37
+
38
+ &-placeholder {
39
+ flex-grow: 0;
40
+ display: flex;
41
+ align-items: center;
42
+ }
43
+ }
@@ -0,0 +1,353 @@
1
+ import { formatAmount } from '@transferwise/formatting';
2
+ import { clsx } from 'clsx';
3
+ import { AnimatePresence } from 'framer-motion';
4
+ import { type ChangeEvent, type KeyboardEvent, useEffect, useMemo, useRef, useState } from 'react';
5
+ import { useIntl } from 'react-intl';
6
+
7
+ import { Props as ExpressiveMoneyInputProps } from './ExpressiveMoneyInput';
8
+ import { AnimatedNumber } from './AnimatedNumber';
9
+ import { useFocus } from './useFocus';
10
+ import { useInputStyle } from './useInputStyle';
11
+ import {
12
+ getDecimalCount,
13
+ getDecimalSeparator,
14
+ getEnteredDecimalsCount,
15
+ getFormattedString,
16
+ getGroupSeparator,
17
+ getUnformattedNumber,
18
+ isAllowedInputKey,
19
+ isInputPossiblyOverflowing,
20
+ } from './utils';
21
+
22
+ type Props = {
23
+ id: string;
24
+ describedById?: string;
25
+ amount?: number | null;
26
+ currency: string;
27
+ autoFocus?: boolean;
28
+ onChange: (amount: number | null) => void;
29
+ onFocusChange?: (focused: boolean) => void;
30
+ } & Pick<ExpressiveMoneyInputProps, 'loading'>;
31
+
32
+ export const AmountInput = ({
33
+ id,
34
+ describedById,
35
+ amount,
36
+ currency,
37
+ autoFocus,
38
+ onChange,
39
+ onFocusChange,
40
+ loading,
41
+ }: Props) => {
42
+ const intl = useIntl();
43
+ const { focus, setFocus, visualFocus, setVisualFocus } = useFocus();
44
+
45
+ const [value, setValue] = useState<string>(
46
+ amount
47
+ ? getFormattedString({
48
+ value: amount,
49
+ currency,
50
+ locale: intl.locale,
51
+ })
52
+ : '',
53
+ );
54
+ const numericValue = useMemo(() => {
55
+ return getUnformattedNumber({
56
+ value,
57
+ currency,
58
+ locale: intl.locale,
59
+ });
60
+ }, [value, currency, intl.locale]);
61
+
62
+ const valueWithFullDecimals = useMemo(() => {
63
+ return getFormattedString({
64
+ value: numericValue ?? 0,
65
+ currency,
66
+ locale: intl.locale,
67
+ alwaysShowDecimals: true,
68
+ });
69
+ }, [numericValue, currency, intl.locale]);
70
+
71
+ const ref = useRef<HTMLInputElement>(null);
72
+
73
+ useEffect(() => {
74
+ if (autoFocus) {
75
+ ref.current?.focus();
76
+ }
77
+ }, []);
78
+
79
+ const placeholder = getPlaceholder(currency, intl.locale);
80
+ const groupSeparator = getGroupSeparator(currency, intl.locale);
81
+ const decimalSeparator = getDecimalSeparator(currency, intl.locale);
82
+ const maxDecimalCount = getDecimalCount(currency, intl.locale);
83
+
84
+ const decimalPart = getDecimalPart(value, decimalSeparator);
85
+ const decimalMode = decimalSeparator && value.includes(decimalSeparator);
86
+
87
+ useEffect(() => {
88
+ if (!focus) {
89
+ setValue(
90
+ amount
91
+ ? getFormattedString({
92
+ value: amount,
93
+ currency,
94
+ locale: intl.locale,
95
+ })
96
+ : '',
97
+ );
98
+ }
99
+ // eslint-disable-next-line react-hooks/exhaustive-deps
100
+ }, [amount]);
101
+
102
+ useEffect(() => {
103
+ onFocusChange?.(visualFocus);
104
+ }, [visualFocus]);
105
+
106
+ const shouldReformatAfterUserInput = (newValue: string) => {
107
+ // don't reformat if formatting would wipe out user's input
108
+ if (reformatValue(newValue) === '') {
109
+ return false;
110
+ }
111
+
112
+ const endsWithDecimalSeparator = decimalSeparator && newValue.endsWith(decimalSeparator);
113
+ const endsWithGroupSeparator = groupSeparator && newValue.endsWith(groupSeparator);
114
+
115
+ // if the user has entered a seperator to the end, formatting would delete it
116
+ if (endsWithDecimalSeparator || endsWithGroupSeparator) {
117
+ return false;
118
+ }
119
+
120
+ const containsDecimalSeparator = decimalSeparator && newValue.includes(decimalSeparator);
121
+
122
+ if (containsDecimalSeparator) {
123
+ const enteredDecimalsCount = getEnteredDecimalsCount(newValue, decimalSeparator);
124
+ // don't reformat until user has entered all the allowed decimals
125
+ // for example, we don't want 1.1 to be reformatted to 1.10 immediately
126
+ if (enteredDecimalsCount < maxDecimalCount) {
127
+ return false;
128
+ }
129
+ }
130
+
131
+ return true;
132
+ };
133
+
134
+ const reformatValue = (newValue: string) => {
135
+ const unformattedValue = getUnformattedNumber({
136
+ value: newValue,
137
+ currency,
138
+ locale: intl.locale,
139
+ });
140
+ const formattedValue = unformattedValue
141
+ ? getFormattedString({
142
+ value: unformattedValue,
143
+ currency,
144
+ locale: intl.locale,
145
+ })
146
+ : '';
147
+ return formattedValue;
148
+ };
149
+
150
+ const handleChange = (newValue: string) => {
151
+ const oldCursorPosition = ref.current?.selectionStart ?? 0;
152
+
153
+ const newFormattedString = shouldReformatAfterUserInput(newValue)
154
+ ? reformatValue(newValue)
155
+ : newValue;
156
+ setValue(newFormattedString);
157
+
158
+ const newNumber = getUnformattedNumber({
159
+ value: newFormattedString,
160
+ currency,
161
+ locale: intl.locale,
162
+ });
163
+
164
+ if (newNumber !== numericValue) {
165
+ if (numericValue || newNumber) {
166
+ onChange(newNumber);
167
+ }
168
+ }
169
+
170
+ const newCursorPosition = oldCursorPosition + (newFormattedString.length - newValue.length);
171
+ requestAnimationFrame(() => {
172
+ ref?.current?.setSelectionRange(newCursorPosition, newCursorPosition);
173
+ });
174
+ };
175
+
176
+ const handlePaste = (e: React.ClipboardEvent<HTMLInputElement>) => {
177
+ e.preventDefault();
178
+
179
+ const clipboardData = e.clipboardData?.getData('text/plain');
180
+ if (!clipboardData) {
181
+ return;
182
+ }
183
+
184
+ // need to sanitise the pasted value otherwise other validation logic will ignore the input entirely
185
+ const sanitisedValue = reformatValue(clipboardData);
186
+
187
+ handleChange(sanitisedValue);
188
+ };
189
+
190
+ const handleBlur = () => {
191
+ setFocus(false);
192
+ setValue(reformatValue(value));
193
+ };
194
+
195
+ const handleBackspace = (e: KeyboardEvent<HTMLInputElement>) => {
196
+ const input = e.target as HTMLInputElement;
197
+ // using the updated selection range after the backspace key has been processed, instead of the current selection range in state
198
+ const { value: currentValue, selectionStart, selectionEnd } = input;
199
+
200
+ if (selectionStart === selectionEnd && selectionStart && selectionStart > 0) {
201
+ const charBeforeCursor = currentValue[selectionStart - 1];
202
+
203
+ // if the user deletes a thousands separator, remove the digit before it as well
204
+ if (charBeforeCursor === groupSeparator) {
205
+ e.preventDefault();
206
+ const beforeCursor = currentValue.slice(0, selectionStart - 2);
207
+ const afterCursor = currentValue.slice(selectionStart);
208
+ const newValue = `${beforeCursor}${afterCursor}`;
209
+ input.setSelectionRange(beforeCursor.length, beforeCursor.length);
210
+ handleChange(newValue);
211
+ }
212
+ }
213
+ };
214
+
215
+ const handleKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {
216
+ setFocus(true);
217
+ if (!isAllowedInputKey(e)) {
218
+ e.preventDefault();
219
+ }
220
+
221
+ if (e.key === 'Backspace') {
222
+ handleBackspace(e);
223
+ }
224
+ };
225
+
226
+ const isAllowedInput = (e: ChangeEvent<HTMLInputElement>) => {
227
+ const hasMultipleDecimalSeparators =
228
+ decimalSeparator && e.target.value.split(decimalSeparator).length > 2;
229
+ if (hasMultipleDecimalSeparators) {
230
+ return false;
231
+ }
232
+
233
+ const newNumericValue = getUnformattedNumber({
234
+ value: e.target.value,
235
+ currency,
236
+ locale: intl.locale,
237
+ });
238
+ const maxLength = Number.MAX_SAFE_INTEGER.toString().length;
239
+ if (String(newNumericValue).length > maxLength) {
240
+ return false;
241
+ }
242
+
243
+ return true;
244
+ };
245
+
246
+ const addonContent = useMemo((): string | null | undefined => {
247
+ // because we're using a separate "addon" element for the placeholder decimals, there is a possibility that the input itself will become scrollable
248
+ // and the decimals will appear on top of the input. Safest thing to do is to just hide the addon if there is not enough room
249
+ if (isInputPossiblyOverflowing({ ref, value })) {
250
+ return null;
251
+ }
252
+ if (!decimalSeparator || !value) {
253
+ return null;
254
+ }
255
+
256
+ // if the user has typed a decimal separator, show the full decimal part as a placeholder
257
+ // this returns a string even if there is no content, typing should replace the placeholder immediately without animation
258
+ // otherwise there is an ugly animation when going from 1.23 to 1.2 due to AnimatePresence
259
+ if (focus && decimalMode) {
260
+ // reuse getDecimalPart
261
+ const fullDecimalPart = getDecimalPart(valueWithFullDecimals, decimalSeparator);
262
+ // show only the characters that are not already displayed by the input
263
+ return fullDecimalPart?.slice(decimalPart?.length);
264
+ }
265
+
266
+ // in unfocused state, always show the full decimal part unless the user has already entered decimals
267
+ if (!focus && !decimalMode) {
268
+ const [_, decimalPlaceholder] = placeholder.split(decimalSeparator);
269
+ return decimalSeparator + decimalPlaceholder;
270
+ }
271
+
272
+ return null;
273
+ }, [
274
+ decimalMode,
275
+ decimalPart?.length,
276
+ decimalSeparator,
277
+ focus,
278
+ placeholder,
279
+ value,
280
+ valueWithFullDecimals,
281
+ ]);
282
+
283
+ const style = useInputStyle({
284
+ // whenever decimals are shown, we need to account for the full decimal part for the font size calculation
285
+ value: addonContent ? valueWithFullDecimals : value,
286
+ focus: visualFocus,
287
+ inputElement: ref.current,
288
+ loading,
289
+ });
290
+
291
+ return (
292
+ <div className="wds-amount-input-container">
293
+ <div
294
+ className={clsx('wds-amount-input-input-container', 'np-text-display-large')}
295
+ style={style}
296
+ >
297
+ <input
298
+ ref={ref}
299
+ className="wds-amount-input-input"
300
+ id={id}
301
+ autoComplete="off"
302
+ inputMode="decimal"
303
+ value={value}
304
+ type="text"
305
+ placeholder={placeholder}
306
+ aria-describedby={describedById}
307
+ /* without this, the input tries to keep an aspect ratio and doesn't respect CSS width rules */
308
+ size={1}
309
+ onChange={(e) => {
310
+ if (isAllowedInput(e)) {
311
+ handleChange(e.target.value);
312
+ }
313
+ }}
314
+ onBlurCapture={() => handleBlur()}
315
+ onPaste={(e) => handlePaste(e)}
316
+ onFocus={() => {
317
+ setFocus(true);
318
+ }}
319
+ onBlur={() => {
320
+ setTimeout(() => setVisualFocus(false), 30);
321
+ }}
322
+ onKeyDown={(e) => handleKeyDown(e)}
323
+ />
324
+ <AnimatePresence initial={false}>
325
+ {addonContent !== null && (
326
+ <AnimatedNumber
327
+ className={clsx(
328
+ 'wds-amount-input-placeholder',
329
+ visualFocus && 'wds-amount-input-placeholder-focus',
330
+ )}
331
+ onClick={() => ref.current?.focus()}
332
+ >
333
+ {addonContent}
334
+ </AnimatedNumber>
335
+ )}
336
+ </AnimatePresence>
337
+ </div>
338
+ </div>
339
+ );
340
+ };
341
+
342
+ const getPlaceholder = (currency: string, locale: string) => {
343
+ return formatAmount(0, currency, locale, { alwaysShowDecimals: true });
344
+ };
345
+
346
+ const getDecimalPart = (value: string, decimalSeparator: string | null) => {
347
+ if (!value || !decimalSeparator) {
348
+ return undefined;
349
+ }
350
+
351
+ const [_, decimalPart] = value.split(decimalSeparator);
352
+ return decimalPart ?? undefined;
353
+ };
@@ -0,0 +1,40 @@
1
+ import { motion, useReducedMotion } from 'framer-motion';
2
+ import type { ReactNode } from 'react';
3
+
4
+ interface Props {
5
+ children: ReactNode;
6
+ onClick?: () => void;
7
+ className?: string;
8
+ }
9
+
10
+ export const AnimatedNumber = ({ children, onClick, className }: Props) => {
11
+ const reducedMotion = useReducedMotion();
12
+
13
+ return (
14
+ <motion.span
15
+ className={className}
16
+ aria-hidden
17
+ initial={{ zoom: 0.01 }}
18
+ animate={{ zoom: 1 }}
19
+ exit={{ zoom: 0.01 }}
20
+ transition={{
21
+ duration: reducedMotion ? 0 : 0.3,
22
+ type: 'tween',
23
+ ease: [0.3, 0, 0.1, 1],
24
+ }}
25
+ onClick={() => onClick?.()}
26
+ >
27
+ <motion.span
28
+ initial={{ opacity: 0 }}
29
+ animate={{ opacity: [0, 0, 1] }}
30
+ exit={{ opacity: [1, 0, 0] }}
31
+ transition={{
32
+ duration: reducedMotion ? 0 : 0.3,
33
+ times: [0, 0.5, 1],
34
+ }}
35
+ >
36
+ {children}
37
+ </motion.span>
38
+ </motion.span>
39
+ );
40
+ };
@@ -0,0 +1,12 @@
1
+ .wds-chevron-container {
2
+ width: 32px;
3
+ width: var(--size-32);
4
+ overflow: hidden;
5
+ color: var(--color-interactive-primary);
6
+ margin-left: 8px;
7
+ margin-left: var(--size-8);
8
+ transition: width 0.3s ease;
9
+ }
10
+ .wds-chevron-hidden {
11
+ width: 0;
12
+ }
@@ -0,0 +1,13 @@
1
+ .wds-chevron {
2
+ &-container {
3
+ width: var(--size-32);
4
+ overflow: hidden;
5
+ color: var(--color-interactive-primary);
6
+ margin-left: var(--size-8);
7
+ transition: width 0.3s ease;
8
+ }
9
+
10
+ &-hidden {
11
+ width: 0;
12
+ }
13
+ }
@@ -0,0 +1,35 @@
1
+ import { ChevronLeft } from '@transferwise/icons';
2
+ import { clsx } from 'clsx';
3
+ import { motion } from 'framer-motion';
4
+
5
+ interface Props {
6
+ shouldShow: boolean;
7
+ }
8
+
9
+ export const Chevron = ({ shouldShow = true }: Props) => {
10
+ return (
11
+ <div
12
+ className={clsx(
13
+ 'd-flex align-items-center',
14
+ 'wds-chevron-container',
15
+ !shouldShow && 'wds-chevron-hidden',
16
+ )}
17
+ >
18
+ <motion.div
19
+ animate={{
20
+ x: [12, 0, 0, -12],
21
+ opacity: [0, 1, 1, 0],
22
+ }}
23
+ transition={{
24
+ duration: 3,
25
+ ease: [[0.3, 0, 0.1, 1], 'linear', [0.3, 0, 0.1, 1]],
26
+ times: [0, 0.1, 0.9, 1],
27
+ repeat: Infinity,
28
+ repeatType: 'loop',
29
+ }}
30
+ >
31
+ <ChevronLeft size={24} />
32
+ </motion.div>
33
+ </div>
34
+ );
35
+ };