@transferwise/components 46.37.0 → 46.38.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.
Files changed (300) hide show
  1. package/README.md +1 -1
  2. package/build/index.js +159 -317
  3. package/build/index.js.map +1 -1
  4. package/build/index.mjs +154 -311
  5. package/build/index.mjs.map +1 -1
  6. package/build/main.css +127 -108
  7. package/build/styles/main.css +127 -108
  8. package/build/styles/uploadInput/UploadInput.css +25 -27
  9. package/build/styles/uploadInput/uploadButton/UploadButton.css +24 -38
  10. package/build/styles/uploadInput/uploadItem/UploadItem.css +81 -46
  11. package/build/types/actionButton/ActionButton.d.ts +2 -2
  12. package/build/types/actionButton/ActionButton.d.ts.map +1 -1
  13. package/build/types/actionOption/ActionOption.d.ts +0 -1
  14. package/build/types/actionOption/ActionOption.d.ts.map +1 -1
  15. package/build/types/alert/Alert.d.ts +0 -1
  16. package/build/types/alert/Alert.d.ts.map +1 -1
  17. package/build/types/alert/inlineMarkdown/InlineMarkdown.d.ts +4 -11
  18. package/build/types/alert/inlineMarkdown/InlineMarkdown.d.ts.map +1 -1
  19. package/build/types/alert/inlineMarkdown/index.d.ts +2 -1
  20. package/build/types/alert/inlineMarkdown/index.d.ts.map +1 -1
  21. package/build/types/avatar/Avatar.d.ts +0 -1
  22. package/build/types/avatar/Avatar.d.ts.map +1 -1
  23. package/build/types/avatar/colors/colors.d.ts.map +1 -1
  24. package/build/types/avatarWrapper/AvatarWrapper.d.ts +0 -1
  25. package/build/types/avatarWrapper/AvatarWrapper.d.ts.map +1 -1
  26. package/build/types/body/Body.d.ts +2 -2
  27. package/build/types/body/Body.d.ts.map +1 -1
  28. package/build/types/button/Button.d.ts +0 -1
  29. package/build/types/button/Button.d.ts.map +1 -1
  30. package/build/types/button/Button.messages.d.ts +3 -3
  31. package/build/types/button/classMap.d.ts +6 -6
  32. package/build/types/card/Card.d.ts +16 -20
  33. package/build/types/card/Card.d.ts.map +1 -1
  34. package/build/types/card/index.d.ts +2 -1
  35. package/build/types/card/index.d.ts.map +1 -1
  36. package/build/types/checkbox/Checkbox.d.ts +15 -20
  37. package/build/types/checkbox/Checkbox.d.ts.map +1 -1
  38. package/build/types/checkbox/index.d.ts +2 -2
  39. package/build/types/checkbox/index.d.ts.map +1 -1
  40. package/build/types/checkboxOption/CheckboxOption.d.ts +2 -3
  41. package/build/types/checkboxOption/CheckboxOption.d.ts.map +1 -1
  42. package/build/types/chevron/Chevron.d.ts +0 -1
  43. package/build/types/chevron/Chevron.d.ts.map +1 -1
  44. package/build/types/chips/Chip.d.ts +0 -1
  45. package/build/types/chips/Chip.d.ts.map +1 -1
  46. package/build/types/chips/Chips.d.ts +0 -1
  47. package/build/types/chips/Chips.d.ts.map +1 -1
  48. package/build/types/circularButton/CircularButton.d.ts +0 -1
  49. package/build/types/circularButton/CircularButton.d.ts.map +1 -1
  50. package/build/types/common/RadioButton/RadioButton.d.ts +0 -1
  51. package/build/types/common/RadioButton/RadioButton.d.ts.map +1 -1
  52. package/build/types/common/action/Action.d.ts +0 -1
  53. package/build/types/common/action/Action.d.ts.map +1 -1
  54. package/build/types/common/closeButton/CloseButton.d.ts +4 -5
  55. package/build/types/common/closeButton/CloseButton.d.ts.map +1 -1
  56. package/build/types/common/commonProps.d.ts +0 -1
  57. package/build/types/common/commonProps.d.ts.map +1 -1
  58. package/build/types/common/dateUtils/getMonthNames/getMonthNames.d.ts +1 -1
  59. package/build/types/common/dateUtils/getMonthNames/getMonthNames.d.ts.map +1 -1
  60. package/build/types/common/focusBoundary/FocusBoundary.d.ts +0 -1
  61. package/build/types/common/focusBoundary/FocusBoundary.d.ts.map +1 -1
  62. package/build/types/common/hooks/useDirection/useDirection.d.ts.map +1 -1
  63. package/build/types/common/hooks/useResizeObserver.d.ts +0 -1
  64. package/build/types/common/hooks/useResizeObserver.d.ts.map +1 -1
  65. package/build/types/common/panel/Panel.d.ts +8 -8
  66. package/build/types/common/panel/Panel.d.ts.map +1 -1
  67. package/build/types/common/polymorphicWithOverrides/PolymorphicWithOverrides.d.ts +0 -1
  68. package/build/types/common/polymorphicWithOverrides/PolymorphicWithOverrides.d.ts.map +1 -1
  69. package/build/types/common/responsivePanel/ResponsivePanel.d.ts +8 -9
  70. package/build/types/common/responsivePanel/ResponsivePanel.d.ts.map +1 -1
  71. package/build/types/criticalBanner/CriticalCommsBanner.d.ts +0 -1
  72. package/build/types/criticalBanner/CriticalCommsBanner.d.ts.map +1 -1
  73. package/build/types/dateInput/DateInput.d.ts +0 -1
  74. package/build/types/dateInput/DateInput.d.ts.map +1 -1
  75. package/build/types/dateLookup/DateLookup.d.ts +1 -1
  76. package/build/types/dateLookup/DateLookup.d.ts.map +1 -1
  77. package/build/types/dateLookup/dateHeader/DateHeader.d.ts +0 -1
  78. package/build/types/dateLookup/dateHeader/DateHeader.d.ts.map +1 -1
  79. package/build/types/dateLookup/dateTrigger/DateTrigger.d.ts +0 -1
  80. package/build/types/dateLookup/dateTrigger/DateTrigger.d.ts.map +1 -1
  81. package/build/types/dateLookup/dayCalendar/DayCalendar.d.ts +0 -1
  82. package/build/types/dateLookup/dayCalendar/DayCalendar.d.ts.map +1 -1
  83. package/build/types/dateLookup/dayCalendar/table/DayCalendarTable.d.ts +0 -1
  84. package/build/types/dateLookup/dayCalendar/table/DayCalendarTable.d.ts.map +1 -1
  85. package/build/types/dateLookup/monthCalendar/MonthCalendar.d.ts +0 -1
  86. package/build/types/dateLookup/monthCalendar/MonthCalendar.d.ts.map +1 -1
  87. package/build/types/dateLookup/monthCalendar/table/MonthCalendarTable.d.ts +0 -1
  88. package/build/types/dateLookup/monthCalendar/table/MonthCalendarTable.d.ts.map +1 -1
  89. package/build/types/dateLookup/tableLink/TableLink.d.ts +0 -1
  90. package/build/types/dateLookup/tableLink/TableLink.d.ts.map +1 -1
  91. package/build/types/dateLookup/yearCalendar/YearCalendar.d.ts +0 -1
  92. package/build/types/dateLookup/yearCalendar/YearCalendar.d.ts.map +1 -1
  93. package/build/types/dateLookup/yearCalendar/table/YearCalendarTable.d.ts +0 -1
  94. package/build/types/dateLookup/yearCalendar/table/YearCalendarTable.d.ts.map +1 -1
  95. package/build/types/decision/Decision.d.ts +1 -2
  96. package/build/types/decision/Decision.d.ts.map +1 -1
  97. package/build/types/definitionList/DefinitionList.d.ts +19 -24
  98. package/build/types/definitionList/DefinitionList.d.ts.map +1 -1
  99. package/build/types/definitionList/index.d.ts +2 -1
  100. package/build/types/definitionList/index.d.ts.map +1 -1
  101. package/build/types/dimmer/Dimmer.d.ts.map +1 -1
  102. package/build/types/drawer/Drawer.d.ts +18 -36
  103. package/build/types/drawer/Drawer.d.ts.map +1 -1
  104. package/build/types/drawer/index.d.ts +2 -1
  105. package/build/types/drawer/index.d.ts.map +1 -1
  106. package/build/types/dropFade/DropFade.d.ts.map +1 -1
  107. package/build/types/emphasis/Emphasis.d.ts +0 -1
  108. package/build/types/emphasis/Emphasis.d.ts.map +1 -1
  109. package/build/types/field/Field.d.ts +0 -1
  110. package/build/types/field/Field.d.ts.map +1 -1
  111. package/build/types/flowNavigation/FlowNavigation.d.ts +0 -1
  112. package/build/types/flowNavigation/FlowNavigation.d.ts.map +1 -1
  113. package/build/types/flowNavigation/backButton/BackButton.d.ts +3 -3
  114. package/build/types/flowNavigation/backButton/index.d.ts +1 -1
  115. package/build/types/flowNavigation/backButton/index.d.ts.map +1 -1
  116. package/build/types/header/Header.d.ts +0 -1
  117. package/build/types/header/Header.d.ts.map +1 -1
  118. package/build/types/image/Image.d.ts +0 -1
  119. package/build/types/image/Image.d.ts.map +1 -1
  120. package/build/types/index.d.ts +4 -0
  121. package/build/types/index.d.ts.map +1 -1
  122. package/build/types/info/Info.d.ts +0 -1
  123. package/build/types/info/Info.d.ts.map +1 -1
  124. package/build/types/inputWithDisplayFormat/InputWithDisplayFormat.d.ts +0 -1
  125. package/build/types/inputWithDisplayFormat/InputWithDisplayFormat.d.ts.map +1 -1
  126. package/build/types/inputs/Input.d.ts +0 -1
  127. package/build/types/inputs/Input.d.ts.map +1 -1
  128. package/build/types/inputs/InputGroup.d.ts +0 -1
  129. package/build/types/inputs/InputGroup.d.ts.map +1 -1
  130. package/build/types/inputs/SearchInput.d.ts +0 -1
  131. package/build/types/inputs/SearchInput.d.ts.map +1 -1
  132. package/build/types/inputs/SelectInput.d.ts +0 -1
  133. package/build/types/inputs/SelectInput.d.ts.map +1 -1
  134. package/build/types/inputs/TextArea.d.ts +0 -1
  135. package/build/types/inputs/TextArea.d.ts.map +1 -1
  136. package/build/types/inputs/_BottomSheet.d.ts +0 -1
  137. package/build/types/inputs/_BottomSheet.d.ts.map +1 -1
  138. package/build/types/inputs/_ButtonInput.d.ts +0 -1
  139. package/build/types/inputs/_ButtonInput.d.ts.map +1 -1
  140. package/build/types/inputs/_Popover.d.ts +0 -1
  141. package/build/types/inputs/_Popover.d.ts.map +1 -1
  142. package/build/types/inputs/contexts.d.ts +0 -1
  143. package/build/types/inputs/contexts.d.ts.map +1 -1
  144. package/build/types/label/Label.d.ts +0 -1
  145. package/build/types/label/Label.d.ts.map +1 -1
  146. package/build/types/loader/Loader.d.ts +0 -1
  147. package/build/types/loader/Loader.d.ts.map +1 -1
  148. package/build/types/logo/Logo.d.ts +15 -23
  149. package/build/types/logo/Logo.d.ts.map +1 -1
  150. package/build/types/logo/index.d.ts +1 -2
  151. package/build/types/logo/index.d.ts.map +1 -1
  152. package/build/types/markdown/Markdown.d.ts +0 -1
  153. package/build/types/markdown/Markdown.d.ts.map +1 -1
  154. package/build/types/money/Money.d.ts +0 -1
  155. package/build/types/money/Money.d.ts.map +1 -1
  156. package/build/types/moneyInput/MoneyInput.d.ts +0 -1
  157. package/build/types/moneyInput/MoneyInput.d.ts.map +1 -1
  158. package/build/types/navigationOption/NavigationOption.d.ts +0 -1
  159. package/build/types/navigationOption/NavigationOption.d.ts.map +1 -1
  160. package/build/types/phoneNumberInput/PhoneNumberInput.d.ts +0 -1
  161. package/build/types/phoneNumberInput/PhoneNumberInput.d.ts.map +1 -1
  162. package/build/types/popover/Popover.d.ts +0 -1
  163. package/build/types/popover/Popover.d.ts.map +1 -1
  164. package/build/types/progress/Progress.d.ts +0 -1
  165. package/build/types/progress/Progress.d.ts.map +1 -1
  166. package/build/types/progressBar/ProgressBar.d.ts +0 -1
  167. package/build/types/progressBar/ProgressBar.d.ts.map +1 -1
  168. package/build/types/provider/Provider.d.ts +0 -1
  169. package/build/types/provider/Provider.d.ts.map +1 -1
  170. package/build/types/radio/Radio.d.ts +0 -1
  171. package/build/types/radio/Radio.d.ts.map +1 -1
  172. package/build/types/radioGroup/RadioGroup.d.ts +0 -1
  173. package/build/types/radioGroup/RadioGroup.d.ts.map +1 -1
  174. package/build/types/radioOption/RadioOption.d.ts +0 -1
  175. package/build/types/radioOption/RadioOption.d.ts.map +1 -1
  176. package/build/types/segmentedControl/SegmentedControl.d.ts +0 -1
  177. package/build/types/segmentedControl/SegmentedControl.d.ts.map +1 -1
  178. package/build/types/select/index.d.ts +1 -1
  179. package/build/types/select/index.d.ts.map +1 -1
  180. package/build/types/select/option/index.d.ts +1 -1
  181. package/build/types/select/option/index.d.ts.map +1 -1
  182. package/build/types/select/searchBox/SearchBox.d.ts +3 -3
  183. package/build/types/select/searchBox/SearchBox.d.ts.map +1 -1
  184. package/build/types/slidingPanel/SlidingPanel.d.ts +1 -1
  185. package/build/types/slidingPanel/SlidingPanel.d.ts.map +1 -1
  186. package/build/types/snackbar/Snackbar.d.ts +2 -1
  187. package/build/types/snackbar/Snackbar.d.ts.map +1 -1
  188. package/build/types/snackbar/SnackbarContext.d.ts +0 -1
  189. package/build/types/snackbar/SnackbarContext.d.ts.map +1 -1
  190. package/build/types/snackbar/SnackbarProvider.d.ts +0 -1
  191. package/build/types/snackbar/SnackbarProvider.d.ts.map +1 -1
  192. package/build/types/statusIcon/StatusIcon.d.ts +0 -1
  193. package/build/types/statusIcon/StatusIcon.d.ts.map +1 -1
  194. package/build/types/sticky/Sticky.d.ts +32 -4
  195. package/build/types/sticky/Sticky.d.ts.map +1 -1
  196. package/build/types/switchOption/SwitchOption.d.ts +0 -1
  197. package/build/types/switchOption/SwitchOption.d.ts.map +1 -1
  198. package/build/types/tabs/TabList.d.ts +1 -1
  199. package/build/types/tabs/TabPanel.d.ts +4 -4
  200. package/build/types/tabs/Tabs.d.ts.map +1 -1
  201. package/build/types/test-utils/story-config.d.ts +8 -0
  202. package/build/types/test-utils/story-config.d.ts.map +1 -1
  203. package/build/types/textareaWithDisplayFormat/TextareaWithDisplayFormat.d.ts +0 -1
  204. package/build/types/textareaWithDisplayFormat/TextareaWithDisplayFormat.d.ts.map +1 -1
  205. package/build/types/tile/Tile.d.ts +16 -37
  206. package/build/types/tile/Tile.d.ts.map +1 -1
  207. package/build/types/tile/index.d.ts +1 -1
  208. package/build/types/tile/index.d.ts.map +1 -1
  209. package/build/types/typeahead/Typeahead.d.ts.map +1 -1
  210. package/build/types/typeahead/typeaheadOption/TypeaheadOption.d.ts +0 -1
  211. package/build/types/typeahead/typeaheadOption/TypeaheadOption.d.ts.map +1 -1
  212. package/build/types/typeahead/util/highlight.d.ts +0 -1
  213. package/build/types/typeahead/util/highlight.d.ts.map +1 -1
  214. package/build/types/upload/Upload.d.ts.map +1 -1
  215. package/build/types/upload/Upload.messages.d.ts +20 -20
  216. package/build/types/upload/steps/completeStep/completeStep.d.ts +10 -10
  217. package/build/types/upload/steps/mediaUploadStep/mediaUploadStep.d.ts +8 -8
  218. package/build/types/upload/steps/processingStep/processingStep.d.ts +8 -8
  219. package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts +9 -9
  220. package/build/types/upload/steps/uploadImageStep/uploadImageStep.d.ts.map +1 -1
  221. package/build/types/uploadInput/UploadInput.d.ts +0 -1
  222. package/build/types/uploadInput/UploadInput.d.ts.map +1 -1
  223. package/build/types/uploadInput/types.d.ts +9 -1
  224. package/build/types/uploadInput/types.d.ts.map +1 -1
  225. package/build/types/uploadInput/uploadButton/UploadButton.d.ts +1 -6
  226. package/build/types/uploadInput/uploadButton/UploadButton.d.ts.map +1 -1
  227. package/build/types/uploadInput/uploadItem/UploadItem.d.ts +0 -1
  228. package/build/types/uploadInput/uploadItem/UploadItem.d.ts.map +1 -1
  229. package/build/types/withDisplayFormat/WithDisplayFormat.d.ts.map +1 -1
  230. package/build/types/withNextPortal/withNextPortal.d.ts +0 -1
  231. package/build/types/withNextPortal/withNextPortal.d.ts.map +1 -1
  232. package/package.json +1 -2
  233. package/src/alert/inlineMarkdown/InlineMarkdown.tsx +13 -0
  234. package/src/alert/inlineMarkdown/index.ts +2 -0
  235. package/src/card/{Card.story.js → Card.story.tsx} +6 -15
  236. package/src/card/{Card.js → Card.tsx} +23 -34
  237. package/src/card/index.ts +2 -0
  238. package/src/checkbox/{Checkbox.spec.js → Checkbox.spec.tsx} +5 -5
  239. package/src/checkbox/{Checkbox.js → Checkbox.tsx} +19 -41
  240. package/src/checkbox/index.ts +2 -0
  241. package/src/decision/Decision.tsx +1 -1
  242. package/src/definitionList/{DefinitionList.story.js → DefinitionList.story.tsx} +22 -2
  243. package/src/definitionList/DefinitionList.tsx +95 -0
  244. package/src/definitionList/index.ts +2 -0
  245. package/src/drawer/{Drawer.rtl.spec.js → Drawer.rtl.spec.tsx} +4 -2
  246. package/src/drawer/{Drawer.story.js → Drawer.story.tsx} +20 -28
  247. package/src/drawer/{Drawer.js → Drawer.tsx} +26 -31
  248. package/src/drawer/index.ts +2 -0
  249. package/src/index.ts +4 -0
  250. package/src/logo/Logo.story.tsx +3 -6
  251. package/src/logo/{Logo.js → Logo.tsx} +25 -35
  252. package/src/logo/index.ts +1 -0
  253. package/src/main.css +127 -108
  254. package/src/section/Section.story.tsx +0 -2
  255. package/src/slidingPanel/SlidingPanel.spec.js +2 -1
  256. package/src/slidingPanel/SlidingPanel.tsx +3 -0
  257. package/src/snackbar/Snackbar.story.tsx +20 -100
  258. package/src/snackbar/Snackbar.tests.story.tsx +281 -0
  259. package/src/snackbar/Snackbar.tsx +8 -12
  260. package/src/sticky/Sticky.spec.tsx +71 -0
  261. package/src/sticky/Sticky.story.tsx +72 -15
  262. package/src/sticky/Sticky.tsx +49 -5
  263. package/src/test-utils/Parameters.d.ts +8 -0
  264. package/src/test-utils/story-config.ts +5 -0
  265. package/src/tile/{Tile.spec.js → Tile.spec.tsx} +1 -1
  266. package/src/tile/{Tile.js → Tile.tsx} +24 -35
  267. package/src/uploadInput/UploadInput.css +25 -27
  268. package/src/uploadInput/UploadInput.less +24 -23
  269. package/src/uploadInput/UploadInput.story.tsx +60 -10
  270. package/src/uploadInput/UploadInput.tsx +1 -4
  271. package/src/uploadInput/types.ts +11 -1
  272. package/src/uploadInput/uploadButton/UploadButton.css +24 -38
  273. package/src/uploadInput/uploadButton/UploadButton.less +27 -40
  274. package/src/uploadInput/uploadButton/UploadButton.spec.tsx +0 -1
  275. package/src/uploadInput/uploadButton/UploadButton.tsx +12 -37
  276. package/src/uploadInput/uploadItem/UploadItem.css +81 -46
  277. package/src/uploadInput/uploadItem/UploadItem.less +75 -40
  278. package/src/uploadInput/uploadItem/UploadItem.tsx +30 -25
  279. package/src/uploadInput/uploadItem/UploadItemBody.tsx +1 -1
  280. package/build/types/logo/logoTypes.d.ts +0 -6
  281. package/build/types/logo/logoTypes.d.ts.map +0 -1
  282. package/src/alert/inlineMarkdown/InlineMarkdown.js +0 -21
  283. package/src/alert/inlineMarkdown/index.js +0 -1
  284. package/src/card/index.js +0 -1
  285. package/src/checkbox/index.js +0 -3
  286. package/src/definitionList/DefinitionList.js +0 -100
  287. package/src/definitionList/index.js +0 -1
  288. package/src/drawer/index.js +0 -1
  289. package/src/logo/index.js +0 -2
  290. package/src/logo/logoTypes.ts +0 -6
  291. package/src/snackbar/Snackbar.spec.js +0 -112
  292. package/src/sticky/Sticky.spec.js +0 -34
  293. /package/src/card/{Card.spec.js → Card.spec.tsx} +0 -0
  294. /package/src/checkbox/__snapshots__/{Checkbox.spec.js.snap → Checkbox.spec.tsx.snap} +0 -0
  295. /package/src/drawer/__snapshots__/{Drawer.rtl.spec.js.snap → Drawer.rtl.spec.tsx.snap} +0 -0
  296. /package/src/logo/{Logo.spec.js → Logo.spec.tsx} +0 -0
  297. /package/src/logo/__snapshots__/{Logo.spec.js.snap → Logo.spec.tsx.snap} +0 -0
  298. /package/src/tile/{Tile.story.js → Tile.story.tsx} +0 -0
  299. /package/src/tile/__snapshots__/{Tile.spec.js.snap → Tile.spec.tsx.snap} +0 -0
  300. /package/src/tile/{index.js → index.ts} +0 -0
@@ -1,16 +1,60 @@
1
1
  import { Position } from '../common';
2
2
  import SlidingPanel from '../slidingPanel';
3
+ import { FunctionComponent } from 'react';
3
4
 
4
5
  export interface StickyProps {
5
- open?: boolean;
6
- position?: `${Position.TOP | Position.BOTTOM}`;
6
+ /** Optional prop for children components to be rendered inside the Sticky component. */
7
7
  children?: React.ReactNode;
8
+
9
+ /** Optional props that determines if the Sticky component is open or closed. Default value is `true`. */
10
+ open?: boolean;
11
+
12
+ /** Optional props that specifies the position of the Sticky component on the screen. Can be either `top` or `bottom`. */
13
+ position?: `${Position.TOP}` | `${Position.BOTTOM}`;
14
+
15
+ /** Optional prop to specify the ID used for testing */
16
+ testId?: string;
8
17
  }
9
18
 
10
- export default function Sticky({ open = true, position = 'bottom', children }: StickyProps) {
19
+ /**
20
+ * ### Sticky Component
21
+ *
22
+ * `<Sticky />` is a component that renders a `<SlidingPanel />` with specified props.
23
+ * It uses the `<SlidingPanel />` component to create a panel that can slide in and out of view,
24
+ * based on the `open` prop. It can be positioned at the top or bottom of the container,
25
+ * as specified by the `position` prop.
26
+ *
27
+ * @component
28
+ * @param {ReactNode} children - Children content.
29
+ * @param {boolean} open - Determines if the Sticky component is open or closed.
30
+ * @param {('top'|'bottom')} position - Specifies the position.
31
+ * @param {string} testId - ID used for testing.
32
+ * @returns {JSX.Element} The `SlidingPanel` component with applied props.
33
+ * @example
34
+ * <Button onClick={() => setOpen(!open)}>Open Sticky</Button>
35
+ * <Sticky open={open} position={'bottom'}>
36
+ * <div>
37
+ * <Button onClick={() => setOpen(!open)}>Close Sticky</Button>
38
+ * </div>
39
+ * </Sticky>
40
+ */
41
+ const Sticky: FunctionComponent<StickyProps> = ({
42
+ children,
43
+ open = true,
44
+ position = Position.BOTTOM,
45
+ testId,
46
+ }: StickyProps) => {
11
47
  return (
12
- <SlidingPanel open={open} position={position} slidingPanelPositionFixed showSlidingPanelBorder>
48
+ <SlidingPanel
49
+ testId={testId}
50
+ open={open}
51
+ position={position}
52
+ slidingPanelPositionFixed
53
+ showSlidingPanelBorder
54
+ >
13
55
  {children}
14
56
  </SlidingPanel>
15
57
  );
16
- }
58
+ };
59
+
60
+ export default Sticky;
@@ -58,4 +58,12 @@ export interface ChromaticParameters {
58
58
  * @default 0.063
59
59
  */
60
60
  diffThreshold?: number;
61
+
62
+ /**
63
+ * Modes for Chromatic testing.
64
+ *
65
+ * Specify the mode in which Chromatic should run tests. For example, 'light' for light mode,
66
+ * 'dark' for dark mode, or `rtl` for right to left content.
67
+ */
68
+ modes?: object;
61
69
  }
@@ -9,6 +9,11 @@ export const viewports = {
9
9
  styles: { height: '256px', width: '320px' },
10
10
  type: 'mobile',
11
11
  },
12
+ desktop: {
13
+ name: 'Desktop',
14
+ styles: { height: '1024px', width: '1280px' },
15
+ type: 'desktop',
16
+ },
12
17
  };
13
18
 
14
19
  interface StoryConfig {
@@ -9,7 +9,7 @@ describe(Tile, () => {
9
9
  description: 'Receive money from friends and family like a local',
10
10
  href: '#href',
11
11
  media: <svg data-testid="illustration" />,
12
- onClick: () => onClick(),
12
+ onClick,
13
13
  title: 'Receive money',
14
14
  };
15
15
 
@@ -1,11 +1,26 @@
1
1
  import classNames from 'classnames';
2
- import PropTypes from 'prop-types';
3
2
 
4
3
  import Body from '../body';
5
4
  import { Size, Typography } from '../common';
6
5
  import Title from '../title';
7
6
 
8
- export const Tile = ({
7
+ export interface TileProps {
8
+ /** Classes to apply to the Tile container */
9
+ className?: string;
10
+ description?: React.ReactNode;
11
+ disabled?: boolean;
12
+ href?: string;
13
+ target?: React.HTMLAttributeAnchorTarget;
14
+ /** Accepts only Avatar and images */
15
+ media: React.ReactNode;
16
+ /** Function called onClick or onKeyDown */
17
+ onClick?: (event?: React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>) => void;
18
+ /** The size applied to Tile */
19
+ size?: `${Size.SMALL | Size.MEDIUM}`;
20
+ title: React.ReactNode;
21
+ }
22
+
23
+ export default function Tile({
9
24
  className,
10
25
  description,
11
26
  disabled,
@@ -13,10 +28,10 @@ export const Tile = ({
13
28
  target,
14
29
  media,
15
30
  onClick,
16
- size,
31
+ size = 'md',
17
32
  title,
18
- }) => {
19
- const isSmall = size === Size.SMALL;
33
+ }: TileProps) {
34
+ const isSmall = size === 'sm';
20
35
  const Element = href ? 'a' : 'button';
21
36
 
22
37
  return (
@@ -36,13 +51,13 @@ export const Tile = ({
36
51
  )}
37
52
  href={href}
38
53
  target={target}
39
- onClick={disabled ? null : onClick}
54
+ onClick={disabled ? undefined : onClick}
40
55
  onKeyDown={
41
56
  disabled
42
- ? null
57
+ ? undefined
43
58
  : ({ key }) => {
44
59
  if (key === 'Enter' || key === ' ') {
45
- onClick();
60
+ onClick?.();
46
61
  }
47
62
  }
48
63
  }
@@ -58,30 +73,4 @@ export const Tile = ({
58
73
  ) : null}
59
74
  </Element>
60
75
  );
61
- };
62
-
63
- Tile.propTypes = {
64
- /** Classes to apply to the Tile container */
65
- className: PropTypes.string,
66
- description: PropTypes.node,
67
- disabled: PropTypes.bool,
68
- href: PropTypes.string,
69
- target: PropTypes.oneOf(['_self', '_blank', '_parent', '_top']),
70
- /** Accepts only Avatar and images */
71
- media: PropTypes.node.isRequired,
72
- /** Function called onClick or onKeyDown */
73
- onClick: PropTypes.func,
74
- /** The size applied to Tile */
75
- size: PropTypes.oneOf(['sm', 'md']),
76
- title: PropTypes.node.isRequired,
77
- };
78
-
79
- Tile.defaultProps = {
80
- className: '',
81
- description: null,
82
- disabled: false,
83
- size: Size.MEDIUM,
84
- target: undefined,
85
- };
86
-
87
- export default Tile;
76
+ }
@@ -1,46 +1,40 @@
1
- .np-upload-input {
2
- border: 1px solid #c9cbce;
3
- border: 1px solid var(--color-interactive-secondary);
4
- border-radius: 10px;
5
- border-radius: var(--radius-small);
6
- }
7
- .np-upload-input:has(:focus-visible) {
8
- outline: var(--ring-outline-color) solid var(--ring-outline-width);
9
- outline-offset: var(--ring-outline-offset);
10
- }
11
1
  .np-upload-input.form-control {
12
2
  height: auto;
13
3
  padding: 0;
14
4
  padding: initial;
15
5
  }
16
- .np-theme-personal .np-upload-input {
17
- border-radius: 10px;
18
- border-radius: var(--radius-small);
6
+ .np-upload-input > div:first-child,
7
+ .np-upload-input > div:first-child .np-upload-item--single-file,
8
+ .np-upload-input > div:first-child .np-upload-item--link {
9
+ border-top-left-radius: 10px;
10
+ border-top-left-radius: var(--radius-small);
11
+ border-top-right-radius: 10px;
12
+ border-top-right-radius: var(--radius-small);
13
+ }
14
+ .np-upload-input > div:last-child {
15
+ border-bottom-left-radius: 10px;
16
+ border-bottom-left-radius: var(--radius-small);
17
+ border-bottom-right-radius: 10px;
18
+ border-bottom-right-radius: var(--radius-small);
19
19
  }
20
20
  .np-theme-personal .np-upload-input.disabled .btn {
21
21
  cursor: inherit;
22
22
  }
23
- .np-theme-personal .np-upload-input .np-upload-button {
24
- border-radius: calc(10px - 1px);
25
- border-radius: calc(var(--radius-small) - 1px);
26
- padding: 16px;
27
- padding: var(--padding-small);
28
- }
29
- .np-theme-personal .np-upload-input .np-upload-input--square-top {
30
- border-top-right-radius: 0px;
31
- border-top-left-radius: 0px;
32
- }
33
- .np-theme-personal .np-upload-input .np-upload-item__remove-button {
34
- border-radius: 0;
35
- border-radius: initial;
36
- }
37
23
  .np-theme-personal .np-upload-input .np-upload-icon {
38
24
  color: var(--color-interactive-primary);
39
25
  }
40
26
  .np-theme-personal .np-upload-input .media-body {
27
+ padding-right: 32px;
28
+ padding-right: var(--size-32);
41
29
  color: var(--color-content-link);
42
30
  white-space: break-spaces;
43
31
  }
32
+ @media (max-width: 320px) {
33
+ .np-theme-personal .np-upload-input .media-body {
34
+ padding-right: 64px;
35
+ padding-right: var(--size-64);
36
+ }
37
+ }
44
38
  .np-theme-personal .np-upload-input .media-body .np-text-body-large-bold {
45
39
  -webkit-text-decoration: underline;
46
40
  text-decoration: underline;
@@ -55,6 +49,10 @@
55
49
  .np-theme-personal .np-upload-input .media-body .text-negative {
56
50
  color: var(--color-sentiment-negative) !important;
57
51
  }
52
+ .np-theme-personal .np-upload-input-errors {
53
+ padding-left: 0;
54
+ list-style-position: inside;
55
+ }
58
56
  .np-theme-personal .np-upload-input .status-circle {
59
57
  width: 24px;
60
58
  width: var(--size-x-small);
@@ -3,49 +3,45 @@
3
3
  @import (reference) './uploadItem/UploadItem.less';
4
4
 
5
5
  .np-upload-input {
6
- border: 1px solid var(--color-interactive-secondary);
7
- border-radius: var(--radius-small);
8
-
9
- &:has(:focus-visible) {
10
- .ring();
11
- }
12
-
13
6
  &.form-control {
14
7
  height: auto;
15
8
  padding: initial;
16
9
  }
10
+
11
+ & > div {
12
+ &:first-child,
13
+ &:first-child .np-upload-item--single-file,
14
+ &:first-child .np-upload-item--link {
15
+ border-top-left-radius: var(--radius-small);
16
+ border-top-right-radius: var(--radius-small);
17
+ }
18
+
19
+ &:last-child {
20
+ border-bottom-left-radius: var(--radius-small);
21
+ border-bottom-right-radius: var(--radius-small);
22
+ }
23
+ }
17
24
  }
18
25
 
19
26
  .np-theme-personal {
20
27
  .np-upload-input {
21
- border-radius: var(--radius-small);
22
-
23
28
  &.disabled .btn {
24
29
  cursor: inherit;
25
30
  }
26
31
 
27
- .np-upload-button {
28
- border-radius: @small-border-minus-one;
29
- padding: var(--padding-small);
30
- }
31
-
32
- .np-upload-input--square-top {
33
- border-top-right-radius: 0px;
34
- border-top-left-radius: 0px;
35
- }
36
-
37
- .np-upload-item__remove-button {
38
- border-radius: unset;
39
- }
40
-
41
32
  .np-upload-icon {
42
33
  color: var(--color-interactive-primary);
43
34
  }
44
35
 
45
36
  .media-body {
37
+ padding-right: var(--size-32);
46
38
  color: var(--color-content-link);
47
39
  white-space: break-spaces;
48
40
 
41
+ @media (--screen-400-zoom) {
42
+ padding-right: var(--size-64);
43
+ }
44
+
49
45
  .np-text-body-large-bold {
50
46
  text-decoration: underline;
51
47
  .link-underline();
@@ -62,6 +58,11 @@
62
58
  }
63
59
  }
64
60
 
61
+ &-errors {
62
+ padding-left: 0;
63
+ list-style-position: inside;
64
+ }
65
+
65
66
  .status-circle {
66
67
  width: var(--size-x-small);
67
68
  height: var(--size-x-small);
@@ -4,7 +4,7 @@ import { Story, Meta } from '@storybook/react';
4
4
  import { Status } from '../common';
5
5
 
6
6
  import UploadInput, { UploadInputProps } from './UploadInput';
7
- import { UploadResponse } from './types';
7
+ import { UploadedFile, UploadResponse } from './types';
8
8
 
9
9
  const meta: Meta<typeof UploadInput> = {
10
10
  title: 'Forms/UploadInput',
@@ -17,7 +17,12 @@ export default meta;
17
17
  const files = [
18
18
  {
19
19
  id: 1,
20
- filename: 'purchase-receipt.pdf',
20
+ filename: 'purchase-receipt-0.pdf',
21
+ url: 'https://wise.com/public-resources/assets/logos/wise/brand_logo_inverse.svg',
22
+ },
23
+ {
24
+ id: 2,
25
+ filename: 'purchase-receipt-1.pdf',
21
26
  url: 'https://wise.com/public-resources/assets/logos/wise/brand_logo_inverse.svg',
22
27
  },
23
28
  {
@@ -28,16 +33,18 @@ const files = [
28
33
  {
29
34
  id: 3,
30
35
  filename: 'receipt failed with error string.png',
31
- status: Status.SUCCEEDED,
36
+ status: Status.FAILED,
37
+ error: 'Something went wrong',
32
38
  },
33
39
  {
34
40
  id: 4,
35
41
  filename: 'receipt failed with error object.png',
36
- status: Status.SUCCEEDED,
42
+ status: Status.FAILED,
43
+ error: { message: 'Something went wrong' },
37
44
  },
38
- ];
45
+ ] satisfies UploadedFile[];
39
46
 
40
- const createDelayedPromise = ({
47
+ const createDelayedPromise = async ({
41
48
  successful = true,
42
49
  delaySeconds = 3,
43
50
  response = { id: Math.round(Math.random() * 10000), url: '#' },
@@ -54,10 +61,10 @@ const createDelayedPromise = ({
54
61
  });
55
62
 
56
63
  const props = {
57
- onUploadFile: (formData: FormData) => {
64
+ onUploadFile: async (formData: FormData) => {
58
65
  return createDelayedPromise();
59
66
  },
60
- onDeleteFile: (id: string | number) => {
67
+ onDeleteFile: async (id: string | number) => {
61
68
  return createDelayedPromise();
62
69
  },
63
70
  };
@@ -93,6 +100,49 @@ WithMultipleExistingFiles.args = {
93
100
  multiple: true,
94
101
  };
95
102
 
103
+ export const WithFileErrors: Story<UploadInputProps> = Template.bind({});
104
+ WithFileErrors.args = {
105
+ ...props,
106
+ files: [
107
+ {
108
+ id: 1,
109
+ filename: 'Error with default message.png',
110
+ status: Status.FAILED,
111
+ },
112
+ {
113
+ id: 2,
114
+ filename: 'Error with `string` error.png',
115
+ status: Status.FAILED,
116
+ error: 'Single string error',
117
+ },
118
+ {
119
+ id: 3,
120
+ filename: 'Error with `obj` error ({ message : `string` }).png',
121
+ status: Status.FAILED,
122
+ error: { message: 'Single obj error' },
123
+ },
124
+ {
125
+ id: 4,
126
+ filename: 'Error with single error passed in `array`.png',
127
+ status: Status.FAILED,
128
+ errors: ['Single error in array'],
129
+ },
130
+ {
131
+ id: 5,
132
+ filename: 'Error with multiple `string` errors passed in `array`.png',
133
+ status: Status.FAILED,
134
+ errors: ['Error 1', 'Error 2', 'Error 3'],
135
+ },
136
+ {
137
+ id: 6,
138
+ filename: 'Error with multiple `obj` errors passed in `array`.png',
139
+ status: Status.FAILED,
140
+ errors: [{ message: 'Error 1' }, { message: 'Error 2' }, { message: 'Error 3' }],
141
+ },
142
+ ],
143
+ multiple: true,
144
+ };
145
+
96
146
  export const WithoutDelete: Story<UploadInputProps> = Template.bind({});
97
147
  WithoutDelete.args = {
98
148
  ...props,
@@ -105,7 +155,7 @@ export const WithUploadFailed: Story<UploadInputProps> = Template.bind({});
105
155
  WithUploadFailed.args = {
106
156
  ...props,
107
157
  files: files.slice(0),
108
- onUploadFile: () => createDelayedPromise({ successful: false }),
158
+ onUploadFile: async () => createDelayedPromise({ successful: false }),
109
159
  multiple: true,
110
160
  };
111
161
 
@@ -113,7 +163,7 @@ export const WithDeleteFailed: Story<UploadInputProps> = Template.bind({});
113
163
  WithDeleteFailed.args = {
114
164
  ...props,
115
165
  files: files.slice(0),
116
- onDeleteFile: () => createDelayedPromise({ successful: false }),
166
+ onDeleteFile: async () => createDelayedPromise({ successful: false }),
117
167
  multiple: true,
118
168
  };
119
169
 
@@ -1,4 +1,3 @@
1
- import { useTheme } from '@wise/components-theming';
2
1
  import classNames from 'classnames';
3
2
  import { useEffect, useRef, useState } from 'react';
4
3
  import { useIntl } from 'react-intl';
@@ -128,7 +127,6 @@ const UploadInput = ({
128
127
  sizeLimitErrorMessage,
129
128
  uploadButtonTitle,
130
129
  }: UploadInputProps) => {
131
- const { isModern } = useTheme();
132
130
  const [markedFileForDelete, setMarkedFileForDelete] = useState<UploadedFile | null>(null);
133
131
  const [mounted, setMounted] = useState(false);
134
132
  const { formatMessage } = useIntl();
@@ -301,7 +299,7 @@ const UploadInput = ({
301
299
 
302
300
  return (
303
301
  <>
304
- <div className={classNames('np-upload-input', className, { disabled: isModern && disabled })}>
302
+ <div className={classNames('np-upload-input', className, { disabled })}>
305
303
  {uploadedFiles.map((file) => (
306
304
  <UploadItem
307
305
  key={file.id}
@@ -329,7 +327,6 @@ const UploadInput = ({
329
327
  sizeLimit={sizeLimit}
330
328
  description={description}
331
329
  maxFiles={maxFiles}
332
- multipleFileInputWithFilesAdded={multiple && uploadedFiles.length > 0}
333
330
  onChange={addFiles}
334
331
  />
335
332
  )}
@@ -19,9 +19,14 @@ export type UploadResponse = {
19
19
  url?: string;
20
20
 
21
21
  /**
22
- * Optionally set a translated error message when file was rejected
22
+ * Optionally sets translated error message when a file gets rejected
23
23
  */
24
24
  error?: UploadError;
25
+
26
+ /**
27
+ * Optionally sets translated error messages when a file gets rejected
28
+ */
29
+ errors?: UploadError[];
25
30
  [key: string]: any;
26
31
  };
27
32
 
@@ -46,6 +51,11 @@ export type UploadedFile = {
46
51
  */
47
52
  error?: UploadError;
48
53
 
54
+ /**
55
+ * Any API errors array. The messages should be localized.
56
+ */
57
+ errors?: UploadError[];
58
+
49
59
  /**
50
60
  * Optional. An external URL where the file can be opened from.
51
61
  */
@@ -1,49 +1,35 @@
1
- .np-upload-button {
2
- width: 100%;
3
- border: 0 !important;
4
- padding: 12px 16px;
5
- padding: var(--size-12) var(--size-16);
6
- }
7
- .np-upload-button.np-upload-accent {
8
- color: #00a2dd;
9
- color: var(--color-interactive-accent);
10
- }
11
- label.np-upload-button:not(.disabled):hover,
12
- label.np-upload-button:not(.disabled):focus-visible,
13
- label.np-upload-button:not(.disabled):active {
14
- background-color: rgba(134,167,189,0.10196);
15
- background-color: var(--color-background-neutral);
16
- }
17
- .np-theme-personal label.np-upload-button:not(.disabled):hover,
18
- .np-theme-personal label.np-upload-button:not(.disabled):focus-visible,
19
- .np-theme-personal label.np-upload-button:not(.disabled):active {
20
- background-color: var(--color-background-screen-hover);
21
- }
22
- .np-theme-personal .disabled label.np-upload-button:not(.disabled):hover,
23
- .np-theme-personal .disabled label.np-upload-button:not(.disabled):focus-visible,
24
- .np-theme-personal .disabled label.np-upload-button:not(.disabled):active {
25
- background-color: transparent;
26
- }
27
- .np-upload-button .np-upload-icon {
28
- display: flex;
29
- align-items: center;
30
- }
31
- .np-upload-button-container.droppable {
32
- border: 0;
1
+ .np-upload-button-container {
2
+ border-style: solid;
33
3
  }
34
4
  .np-upload-button-container .droppable-card-content {
35
5
  display: flex;
36
6
  }
37
- .np-theme-personal .np-upload-button-container .droppable-card-content {
38
- border-radius: calc(10px - 1px);
39
- border-radius: calc(var(--radius-small) - 1px);
7
+ .np-upload-button-container.droppable-dropping {
8
+ border-color: #c9cbce !important;
9
+ border-color: var(--color-interactive-secondary) !important;
40
10
  }
41
11
  .np-upload-button-container input[type="file"] {
42
12
  opacity: 0;
43
13
  z-index: -1;
44
14
  position: absolute;
45
15
  }
46
- .np-upload-button-container input[type="file"]:focus-visible + label {
47
- background-color: rgba(134,167,189,0.10196);
48
- background-color: var(--color-background-neutral);
16
+ .np-upload-button-container .np-upload-button {
17
+ border: none;
18
+ }
19
+ .np-upload-button {
20
+ width: 100%;
21
+ padding: 16px;
22
+ padding: var(--padding-small);
23
+ border-radius: 0;
24
+ }
25
+ label.np-upload-button:not(.disabled):hover,
26
+ label.np-upload-button:not(.disabled):active {
27
+ background-color: var(--color-background-screen-hover);
28
+ }
29
+ .disabled label.np-upload-button:not(.disabled):hover,
30
+ .disabled label.np-upload-button:not(.disabled):active {
31
+ background-color: transparent;
32
+ }
33
+ .np-upload-button .media {
34
+ align-items: flex-start;
49
35
  }
@@ -1,57 +1,44 @@
1
- @import (reference) '../uploadItem/UploadItem.less';
1
+ .np-upload-button-container {
2
+ border-style: solid;
2
3
 
3
- .np-upload-button {
4
- width: 100%;
5
- border: 0 !important; // Remove from btn
6
- padding: var(--size-12) var(--size-16);
4
+ .droppable-card-content {
5
+ display: flex;
6
+ }
7
7
 
8
- &.np-upload-accent {
9
- color: var(--color-interactive-accent);
8
+ &.droppable-dropping {
9
+ border-color: var(--color-interactive-secondary) !important;
10
10
  }
11
11
 
12
+ input[type="file"] {
13
+ opacity: 0;
14
+ z-index: -1;
15
+ position: absolute;
16
+ }
17
+
18
+ .np-upload-button {
19
+ border: none;
20
+ }
21
+ }
22
+
23
+ .np-upload-button {
24
+ width: 100%;
25
+ padding: var(--padding-small);
26
+ border-radius: 0;
27
+
12
28
  label& {
13
29
  &:not(.disabled) {
14
30
  &:hover,
15
- &:focus-visible,
16
31
  &:active {
17
- background-color: var(--color-background-neutral);
18
-
19
- .np-theme-personal & {
20
- background-color: var(--color-background-screen-hover);
21
- }
32
+ background-color: var(--color-background-screen-hover);
22
33
 
23
- .np-theme-personal .disabled & {
34
+ .disabled & {
24
35
  background-color: transparent;
25
36
  }
26
37
  }
27
38
  }
28
39
  }
29
40
 
30
- .np-upload-icon {
31
- display: flex;
32
- align-items: center;
33
- }
34
- }
35
-
36
- .np-upload-button-container {
37
- &.droppable {
38
- border: 0;
39
- }
40
-
41
- .droppable-card-content {
42
- display: flex;
43
- .np-theme-personal & {
44
- border-radius: @small-border-minus-one;
45
- }
46
- }
47
-
48
- input[type="file"] {
49
- opacity: 0;
50
- z-index: -1;
51
- position: absolute;
52
-
53
- &:focus-visible + label {
54
- background-color: var(--color-background-neutral); // Tab focus style
55
- }
41
+ .media {
42
+ align-items: flex-start;
56
43
  }
57
44
  }