@transferwise/components 0.0.0-experimental-cb7b730 → 0.0.0-experimental-9463364

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 (168) hide show
  1. package/build/dateLookup/DateLookup.js +3 -2
  2. package/build/dateLookup/DateLookup.js.map +1 -1
  3. package/build/dateLookup/DateLookup.mjs +3 -2
  4. package/build/dateLookup/DateLookup.mjs.map +1 -1
  5. package/build/i18n/en.json +1 -0
  6. package/build/i18n/en.json.js +1 -0
  7. package/build/i18n/en.json.js.map +1 -1
  8. package/build/i18n/en.json.mjs +1 -0
  9. package/build/i18n/en.json.mjs.map +1 -1
  10. package/build/main.css +4 -95
  11. package/build/styles/accordion/Accordion.css +27 -16
  12. package/build/styles/avatar/Avatar.css +95 -50
  13. package/build/styles/dimmer/Dimmer.css +0 -1
  14. package/build/styles/inputs/Input.css +37 -21
  15. package/build/styles/inputs/TextArea.css +35 -20
  16. package/build/styles/loader/Loader.css +4 -90
  17. package/build/styles/main.css +4 -95
  18. package/build/styles/popover/Popover.css +19 -12
  19. package/build/styles/select/Select.css +131 -68
  20. package/build/styles/switch/Switch.css +27 -16
  21. package/build/styles/tile/Tile.css +31 -18
  22. package/build/types/dateLookup/DateLookup.d.ts +2 -2
  23. package/build/types/dateLookup/DateLookup.d.ts.map +1 -1
  24. package/build/types/test-utils/index.d.ts +2 -0
  25. package/build/types/test-utils/index.d.ts.map +1 -1
  26. package/build/types/test-utils/story-config.d.ts +2 -3
  27. package/build/types/test-utils/story-config.d.ts.map +1 -1
  28. package/build/types/upload/Upload.d.ts.map +1 -1
  29. package/build/types/upload/Upload.messages.d.ts +4 -0
  30. package/build/types/upload/Upload.messages.d.ts.map +1 -1
  31. package/build/types/uploadInput/uploadButton/UploadButton.d.ts.map +1 -1
  32. package/build/upload/Upload.js +13 -3
  33. package/build/upload/Upload.js.map +1 -1
  34. package/build/upload/Upload.messages.js +3 -0
  35. package/build/upload/Upload.messages.js.map +1 -1
  36. package/build/upload/Upload.messages.mjs +3 -0
  37. package/build/upload/Upload.messages.mjs.map +1 -1
  38. package/build/upload/Upload.mjs +13 -3
  39. package/build/upload/Upload.mjs.map +1 -1
  40. package/build/uploadInput/uploadButton/UploadButton.js +3 -0
  41. package/build/uploadInput/uploadButton/UploadButton.js.map +1 -1
  42. package/build/uploadInput/uploadButton/UploadButton.mjs +3 -0
  43. package/build/uploadInput/uploadButton/UploadButton.mjs.map +1 -1
  44. package/package.json +8 -16
  45. package/src/accordion/Accordion.css +27 -16
  46. package/src/accordion/Accordion.story.tsx +1 -1
  47. package/src/actionButton/ActionButton.story.tsx +3 -2
  48. package/src/actionOption/ActionOption.story.tsx +2 -2
  49. package/src/alert/Alert.story.tsx +2 -2
  50. package/src/alert/Alert.tests.story.tsx +2 -2
  51. package/src/avatar/Avatar.css +95 -50
  52. package/src/avatar/Avatar.story.tsx +3 -2
  53. package/src/avatarLayout/AvatarLayout.story.tsx +1 -1
  54. package/src/avatarView/AvatarView.story.tsx +1 -1
  55. package/src/avatarWrapper/AvatarWrapper.story.tsx +3 -2
  56. package/src/badge/Badge.story.tsx +49 -28
  57. package/src/button/Button.accessibility.docs.mdx +1 -1
  58. package/src/button/Button.story.tsx +2 -2
  59. package/src/button/Button.tests.story.tsx +2 -2
  60. package/src/button/LegacyButton.story.tsx +3 -2
  61. package/src/card/Card.story.tsx +2 -2
  62. package/src/carousel/Carousel.story.tsx +1 -1
  63. package/src/checkbox/Checkbox.story.tsx +2 -2
  64. package/src/checkboxButton/CheckboxButton.story.tsx +2 -2
  65. package/src/checkboxOption/CheckboxOption.story.tsx +35 -29
  66. package/src/chevron/Chevron.story.tsx +1 -1
  67. package/src/chips/Chips.story.tsx +1 -1
  68. package/src/circularButton/CircularButton.story.tsx +1 -1
  69. package/src/circularButton/CircularButton.tests.story.tsx +1 -1
  70. package/src/common/bottomSheet/BottomSheet.story.tsx +2 -2
  71. package/src/common/card/Card.story.tsx +1 -1
  72. package/src/common/circle/Circle.story.tsx +2 -2
  73. package/src/common/responsivePanel/ResponsivePanel.spec.js +8 -29
  74. package/src/criticalBanner/CriticalCommsBanner.story.tsx +1 -1
  75. package/src/dateInput/DateInput.story.tsx +2 -2
  76. package/src/dateInput/DateInput.tests.story.tsx +2 -2
  77. package/src/dateLookup/DateLookup.story.tsx +43 -71
  78. package/src/dateLookup/DateLookup.tests.story.tsx +3 -3
  79. package/src/dateLookup/DateLookup.tsx +4 -1
  80. package/src/decision/Decision.story.tsx +24 -49
  81. package/src/definitionList/DefinitionList.story.tsx +1 -1
  82. package/src/dimmer/Dimmer.css +0 -1
  83. package/src/dimmer/Dimmer.less +0 -1
  84. package/src/dimmer/Dimmer.story.tsx +2 -2
  85. package/src/divider/Divider.accessibility.docs.mdx +1 -1
  86. package/src/divider/Divider.story.tsx +1 -1
  87. package/src/drawer/Drawer.story.tsx +13 -7
  88. package/src/dropFade/DropFade.story.tsx +1 -1
  89. package/src/emphasis/Emphasis.story.tsx +1 -1
  90. package/src/field/Field.story.tsx +3 -3
  91. package/src/flowNavigation/FlowNavigation.story.tsx +305 -260
  92. package/src/i18n/en.json +1 -0
  93. package/src/iconButton/IconButton.story.tsx +2 -2
  94. package/src/image/Image.story.tsx +27 -54
  95. package/src/info/Info.story.tsx +2 -2
  96. package/src/inlineAlert/InlineAlert.story.tsx +1 -1
  97. package/src/inputWithDisplayFormat/InputWithDisplayFormat.story.tsx +2 -2
  98. package/src/inputs/Input.css +37 -21
  99. package/src/inputs/InputGroup.story.tsx +1 -1
  100. package/src/inputs/SearchInput.story.tsx +1 -1
  101. package/src/inputs/SelectInput.docs.mdx +1 -1
  102. package/src/inputs/SelectInput.story.tsx +2 -2
  103. package/src/inputs/TextArea.css +35 -20
  104. package/src/instructionsList/InstructionsList.story.tsx +2 -2
  105. package/src/legacylistItem/LegacyListItem.story.tsx +1 -1
  106. package/src/loader/Loader.css +4 -90
  107. package/src/loader/Loader.story.tsx +1 -1
  108. package/src/logo/Logo.story.tsx +1 -1
  109. package/src/main.css +4 -95
  110. package/src/markdown/Markdown.story.tsx +1 -1
  111. package/src/modal/Modal.story.tsx +2 -2
  112. package/src/money/Money.story.tsx +1 -1
  113. package/src/moneyInput/MoneyInput.docs.mdx +1 -1
  114. package/src/moneyInput/MoneyInput.story.tsx +2 -2
  115. package/src/navigationOption/NavigationOption.story.tsx +265 -226
  116. package/src/nudge/Nudge.story.tsx +1 -1
  117. package/src/overlayHeader/OverlayHeader.story.tsx +32 -24
  118. package/src/phoneNumberInput/PhoneNumberInput.story.tsx +1 -1
  119. package/src/popover/Popover.css +19 -12
  120. package/src/popover/Popover.story.tsx +2 -2
  121. package/src/primitives/PrimitiveAnchor/stories/PrimitiveAnchor.story.tsx +2 -2
  122. package/src/primitives/PrimitiveAnchor/stories/PrimitiveAnchor.tests.story.tsx +2 -2
  123. package/src/primitives/PrimitiveButton/stories/PrimitiveButton.story.tsx +2 -2
  124. package/src/primitives/PrimitiveButton/stories/PrimitiveButton.tests.story.tsx +2 -2
  125. package/src/processIndicator/ProcessIndicator.story.tsx +1 -1
  126. package/src/progress/Progress.story.tsx +1 -1
  127. package/src/progressBar/ProgressBar.story.tsx +1 -1
  128. package/src/promoCard/PromoCard.story.tsx +1 -1
  129. package/src/promoCard/PromoCardGroup.story.tsx +1 -1
  130. package/src/provider/Provider.story.tsx +1 -1
  131. package/src/provider/theme/ThemeProvider.story.tsx +1 -1
  132. package/src/radio/Radio.story.tsx +59 -42
  133. package/src/radioGroup/RadioGroup.story.tsx +2 -2
  134. package/src/radioOption/RadioOption.story.tsx +73 -38
  135. package/src/segmentedControl/SegmentedControl.story.tsx +1 -1
  136. package/src/select/Select.css +131 -68
  137. package/src/select/Select.story.tsx +385 -397
  138. package/src/slidingPanel/SlidingPanel.story.tsx +30 -13
  139. package/src/snackbar/Snackbar.story.tsx +50 -36
  140. package/src/snackbar/Snackbar.tests.story.tsx +3 -2
  141. package/src/statusIcon/StatusIcon.docs.mdx +1 -1
  142. package/src/statusIcon/StatusIcon.story.tsx +1 -1
  143. package/src/stepper/Stepper.story.tsx +2 -2
  144. package/src/stepper/Stepper.tests.story.tsx +2 -2
  145. package/src/sticky/Sticky.story.tsx +1 -1
  146. package/src/summary/Summary.story.tsx +18 -17
  147. package/src/switch/Switch.css +27 -16
  148. package/src/switch/Switch.story.tsx +2 -2
  149. package/src/switchOption/SwitchOption.story.tsx +1 -1
  150. package/src/table/Table.story.tsx +1 -1
  151. package/src/test-utils/story-config.ts +9 -6
  152. package/src/textareaWithDisplayFormat/TextareaWithDisplayFormat.story.tsx +2 -2
  153. package/src/tile/Tile.css +31 -18
  154. package/src/tile/Tile.story.tsx +43 -43
  155. package/src/tooltip/Tooltip.story.tsx +2 -2
  156. package/src/typeahead/Typeahead.story.tsx +2 -2
  157. package/src/upload/Upload.messages.ts +4 -0
  158. package/src/upload/Upload.spec.tsx +6 -0
  159. package/src/upload/Upload.story.tsx +2 -2
  160. package/src/upload/Upload.tests.story.tsx +2 -2
  161. package/src/upload/Upload.tsx +17 -5
  162. package/src/uploadInput/UploadInput.story.tsx +1 -1
  163. package/src/uploadInput/UploadInput.tests.story.tsx +3 -3
  164. package/src/uploadInput/uploadButton/UploadButton.spec.tsx +6 -0
  165. package/src/uploadInput/uploadButton/UploadButton.tsx +4 -0
  166. package/src/withId/withId.docs.mdx +1 -1
  167. package/src/withId/withId.story.tsx +1 -1
  168. package/src/common/responsivePanel/__snapshots__/ResponsivePanel.spec.js.snap +0 -21
@@ -1 +1 @@
1
- {"version":3,"file":"UploadButton.js","sources":["../../../src/uploadInput/uploadButton/UploadButton.tsx"],"sourcesContent":["import { PlusCircle as PlusIcon, Upload as UploadIcon } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport {\n ChangeEvent,\n DragEvent,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n ForwardedRef,\n} from 'react';\nimport { useIntl } from 'react-intl';\n\nimport Body from '../../body';\nimport { FileType, Typography } from '../../common';\n\nimport MESSAGES from './UploadButton.messages';\nimport { DEFAULT_SIZE_LIMIT, imageFileTypes } from './defaults';\nimport getAllowedFileTypes from './getAllowedFileTypes';\n\ntype AllowedFileTypes = string | readonly string[] | readonly FileType[];\nexport type UploadButtonProps = {\n /**\n * Disable the upload button if your app is not yet ready to accept uploads\n */\n disabled?: boolean;\n\n /**\n * Should be true, if the UploadInput has at least 1\n * file (valid or invalid) listed.\n */\n withEntries?: boolean;\n\n /**\n * Allow multiple file uploads\n */\n multiple?: boolean;\n\n /**\n * List of allowed filetypes, eg. '*' | '.zip,application/zip' | ['.jpg,.jpeg,image/jpeg', '.png,image/png'] (default: image files + PDF)\n */\n fileTypes?: AllowedFileTypes;\n\n /**\n * Size limit in KBs 1000 KB = 1 MB (default: 5000 KB)\n */\n sizeLimit?: number;\n\n /**\n * Description for the upload button\n */\n description?: string | undefined;\n\n /**\n * Maximum number of files allowed, if provided, shows error below file item\n */\n maxFiles?: number;\n\n /**\n * Called when some files were successfully selected\n *\n * @param files\n */\n onChange: (files: FileList) => void;\n\n /**\n * Id for the upload input\n */\n id?: string;\n\n /**\n * Title for the upload button\n */\n uploadButtonTitle?: string;\n};\n\nexport enum TEST_IDS {\n uploadInput = 'uploadInput',\n mediaBody = 'mediaBody',\n}\n\nconst onDragOver = (event: DragEvent): void => {\n event.preventDefault();\n};\n\nconst DEFAULT_FILE_INPUT_ID = 'np-upload-button';\nconst UploadButton = forwardRef<HTMLInputElement | null, UploadButtonProps>(\n (\n {\n disabled,\n withEntries,\n multiple,\n description,\n fileTypes = imageFileTypes,\n sizeLimit = DEFAULT_SIZE_LIMIT,\n maxFiles,\n onChange,\n id = DEFAULT_FILE_INPUT_ID,\n uploadButtonTitle,\n },\n ref: ForwardedRef<HTMLInputElement | null>,\n ) => {\n const { formatMessage } = useIntl();\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useImperativeHandle(ref, () => {\n if (!inputRef.current) {\n throw new Error('inputRef.current is null');\n }\n return inputRef.current;\n }, []);\n\n const [isDropping, setIsDropping] = useState(false);\n\n const dragCounter = useRef(0);\n\n const reset = (): void => {\n dragCounter.current = 0;\n setIsDropping(false);\n };\n\n const onDragLeave = (event: DragEvent): void => {\n event.preventDefault();\n dragCounter.current -= 1;\n if (dragCounter.current === 0) {\n setIsDropping(false);\n }\n };\n\n const onDragEnter = (event: DragEvent): void => {\n event.preventDefault();\n dragCounter.current += 1;\n if (dragCounter.current === 1) {\n setIsDropping(true);\n }\n };\n\n const onDrop = (event: DragEvent): void => {\n event.preventDefault();\n reset();\n if (event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files[0]) {\n onChange(event.dataTransfer.files);\n }\n };\n\n const filesSelected = (event: ChangeEvent<HTMLInputElement>): void => {\n const { files } = event.target;\n\n if (files) {\n onChange(files);\n\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }\n };\n\n const getFileTypesDescription = (): string => {\n if (fileTypes === '*') {\n return fileTypes;\n }\n\n return getAllowedFileTypes(Array.isArray(fileTypes) ? fileTypes : [fileTypes]).join(', ');\n };\n\n function getDescription() {\n if (description) {\n return description;\n }\n\n const fileTypesDescription = getFileTypesDescription();\n\n const derivedFileDescription =\n fileTypesDescription === '*' ? formatMessage(MESSAGES.allFileTypes) : fileTypesDescription;\n\n return formatMessage(MESSAGES.instructions, {\n fileTypes: derivedFileDescription,\n size: Math.round(sizeLimit / 1000),\n });\n }\n\n function getAcceptedTypes(): Pick<React.ComponentPropsWithoutRef<'input'>, 'accept'> {\n const areAllFilesAllowed = getFileTypesDescription() === '*';\n\n if (areAllFilesAllowed) {\n return {}; // file input by default allows all files\n }\n\n if (Array.isArray(fileTypes)) {\n return { accept: fileTypes.join(',') };\n }\n\n return { accept: fileTypes as string };\n }\n\n function renderDescription() {\n return (\n <Body className=\"np-upload-input__text\">\n {getDescription()}\n {maxFiles && (\n <>\n <br />\n {formatMessage(MESSAGES.maximumFiles, { maxFiles })}\n </>\n )}\n </Body>\n );\n }\n\n function renderButtonTitle() {\n if (uploadButtonTitle) {\n return uploadButtonTitle;\n }\n return formatMessage(multiple ? MESSAGES.uploadFiles : MESSAGES.uploadFile);\n }\n\n return (\n <label\n className={clsx(\n 'np-upload-input__upload-button',\n `np-upload-input__upload-button--${disabled ? 'disabled' : 'enabled'}`,\n `np-upload-input__upload-button--${withEntries ? 'with-entries' : 'without-entries'}`,\n {\n 'is-dropping': isDropping,\n },\n )}\n htmlFor={id}\n {...(!disabled && { onDragEnter, onDragLeave, onDrop, onDragOver })}\n >\n <span className=\"np-upload-input__icon\">\n <UploadIcon size={24} className=\"text-link\" />\n </span>\n <div className=\"np-upload-input__item-content\" data-testid={TEST_IDS.mediaBody}>\n <Body type={Typography.BODY_LARGE_BOLD} className=\"np-upload-input__title\">\n {renderButtonTitle()}\n </Body>\n {renderDescription()}\n </div>\n <input\n className=\"np-upload-input__upload-button-input sr-only\"\n type=\"file\"\n id={id}\n {...getAcceptedTypes()}\n {...(multiple && { multiple: true })}\n ref={inputRef}\n disabled={disabled}\n name=\"file-upload\"\n data-testid={TEST_IDS.uploadInput}\n onChange={filesSelected}\n />\n {isDropping && (\n <div\n className={clsx(\n 'np-upload-input__drop-file-overlay',\n 'droppable-card',\n 'droppable-dropping-card',\n 'droppable-card-content',\n )}\n >\n <PlusIcon className=\"m-x-1\" size={24} />\n <div>{formatMessage(MESSAGES.dropFile)}</div>\n </div>\n )}\n </label>\n );\n },\n);\n\nUploadButton.displayName = 'UploadButton';\n\nexport default UploadButton;\n"],"names":["TEST_IDS","onDragOver","event","preventDefault","DEFAULT_FILE_INPUT_ID","UploadButton","forwardRef","disabled","withEntries","multiple","description","fileTypes","imageFileTypes","sizeLimit","DEFAULT_SIZE_LIMIT","maxFiles","onChange","id","uploadButtonTitle","ref","formatMessage","useIntl","inputRef","useRef","useImperativeHandle","current","Error","isDropping","setIsDropping","useState","dragCounter","reset","onDragLeave","onDragEnter","onDrop","dataTransfer","files","filesSelected","target","value","getFileTypesDescription","getAllowedFileTypes","Array","isArray","join","getDescription","fileTypesDescription","derivedFileDescription","MESSAGES","allFileTypes","instructions","size","Math","round","getAcceptedTypes","areAllFilesAllowed","accept","renderDescription","_jsxs","Body","className","children","_Fragment","_jsx","maximumFiles","renderButtonTitle","uploadFiles","uploadFile","clsx","htmlFor","UploadIcon","mediaBody","type","Typography","BODY_LARGE_BOLD","name","uploadInput","PlusIcon","dropFile","displayName"],"mappings":"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"}
1
+ {"version":3,"file":"UploadButton.js","sources":["../../../src/uploadInput/uploadButton/UploadButton.tsx"],"sourcesContent":["import { PlusCircle as PlusIcon, Upload as UploadIcon } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport {\n ChangeEvent,\n DragEvent,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n ForwardedRef,\n} from 'react';\nimport { useIntl } from 'react-intl';\n\nimport Body from '../../body';\nimport { FileType, Typography } from '../../common';\n\nimport MESSAGES from './UploadButton.messages';\nimport { DEFAULT_SIZE_LIMIT, imageFileTypes } from './defaults';\nimport getAllowedFileTypes from './getAllowedFileTypes';\n\ntype AllowedFileTypes = string | readonly string[] | readonly FileType[];\nexport type UploadButtonProps = {\n /**\n * Disable the upload button if your app is not yet ready to accept uploads\n */\n disabled?: boolean;\n\n /**\n * Should be true, if the UploadInput has at least 1\n * file (valid or invalid) listed.\n */\n withEntries?: boolean;\n\n /**\n * Allow multiple file uploads\n */\n multiple?: boolean;\n\n /**\n * List of allowed filetypes, eg. '*' | '.zip,application/zip' | ['.jpg,.jpeg,image/jpeg', '.png,image/png'] (default: image files + PDF)\n */\n fileTypes?: AllowedFileTypes;\n\n /**\n * Size limit in KBs 1000 KB = 1 MB (default: 5000 KB)\n */\n sizeLimit?: number;\n\n /**\n * Description for the upload button\n */\n description?: string | undefined;\n\n /**\n * Maximum number of files allowed, if provided, shows error below file item\n */\n maxFiles?: number;\n\n /**\n * Called when some files were successfully selected\n *\n * @param files\n */\n onChange: (files: FileList) => void;\n\n /**\n * Id for the upload input\n */\n id?: string;\n\n /**\n * Title for the upload button\n */\n uploadButtonTitle?: string;\n};\n\nexport enum TEST_IDS {\n uploadInput = 'uploadInput',\n mediaBody = 'mediaBody',\n}\n\nconst onDragOver = (event: DragEvent): void => {\n event.preventDefault();\n};\n\nconst DEFAULT_FILE_INPUT_ID = 'np-upload-button';\nconst UploadButton = forwardRef<HTMLInputElement | null, UploadButtonProps>(\n (\n {\n disabled,\n withEntries,\n multiple,\n description,\n fileTypes = imageFileTypes,\n sizeLimit = DEFAULT_SIZE_LIMIT,\n maxFiles,\n onChange,\n id = DEFAULT_FILE_INPUT_ID,\n uploadButtonTitle,\n },\n ref: ForwardedRef<HTMLInputElement | null>,\n ) => {\n const { formatMessage } = useIntl();\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useImperativeHandle(ref, () => {\n if (!inputRef.current) {\n throw new Error('inputRef.current is null');\n }\n return inputRef.current;\n }, []);\n\n const [isDropping, setIsDropping] = useState(false);\n\n const dragCounter = useRef(0);\n\n const reset = (): void => {\n dragCounter.current = 0;\n setIsDropping(false);\n };\n\n const onDragLeave = (event: DragEvent): void => {\n event.preventDefault();\n dragCounter.current -= 1;\n if (dragCounter.current === 0) {\n setIsDropping(false);\n }\n };\n\n const onDragEnter = (event: DragEvent): void => {\n event.preventDefault();\n dragCounter.current += 1;\n if (dragCounter.current === 1) {\n setIsDropping(true);\n }\n };\n\n const onDrop = (event: DragEvent): void => {\n event.preventDefault();\n reset();\n if (event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files[0]) {\n onChange(event.dataTransfer.files);\n }\n };\n\n const filesSelected = (event: ChangeEvent<HTMLInputElement>): void => {\n const { files } = event.target;\n\n if (files) {\n onChange(files);\n\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }\n };\n\n const getFileTypesDescription = (): string => {\n if (fileTypes === '*') {\n return fileTypes;\n }\n\n return getAllowedFileTypes(Array.isArray(fileTypes) ? fileTypes : [fileTypes]).join(', ');\n };\n\n function getDescription() {\n if (description) {\n return description;\n }\n\n const fileTypesDescription = getFileTypesDescription();\n\n const derivedFileDescription =\n fileTypesDescription === '*' ? formatMessage(MESSAGES.allFileTypes) : fileTypesDescription;\n\n if (sizeLimit >= Number.MAX_SAFE_INTEGER) {\n return derivedFileDescription;\n }\n\n return formatMessage(MESSAGES.instructions, {\n fileTypes: derivedFileDescription,\n size: Math.round(sizeLimit / 1000),\n });\n }\n\n function getAcceptedTypes(): Pick<React.ComponentPropsWithoutRef<'input'>, 'accept'> {\n const areAllFilesAllowed = getFileTypesDescription() === '*';\n\n if (areAllFilesAllowed) {\n return {}; // file input by default allows all files\n }\n\n if (Array.isArray(fileTypes)) {\n return { accept: fileTypes.join(',') };\n }\n\n return { accept: fileTypes as string };\n }\n\n function renderDescription() {\n return (\n <Body className=\"np-upload-input__text\">\n {getDescription()}\n {maxFiles && (\n <>\n <br />\n {formatMessage(MESSAGES.maximumFiles, { maxFiles })}\n </>\n )}\n </Body>\n );\n }\n\n function renderButtonTitle() {\n if (uploadButtonTitle) {\n return uploadButtonTitle;\n }\n return formatMessage(multiple ? MESSAGES.uploadFiles : MESSAGES.uploadFile);\n }\n\n return (\n <label\n className={clsx(\n 'np-upload-input__upload-button',\n `np-upload-input__upload-button--${disabled ? 'disabled' : 'enabled'}`,\n `np-upload-input__upload-button--${withEntries ? 'with-entries' : 'without-entries'}`,\n {\n 'is-dropping': isDropping,\n },\n )}\n htmlFor={id}\n {...(!disabled && { onDragEnter, onDragLeave, onDrop, onDragOver })}\n >\n <span className=\"np-upload-input__icon\">\n <UploadIcon size={24} className=\"text-link\" />\n </span>\n <div className=\"np-upload-input__item-content\" data-testid={TEST_IDS.mediaBody}>\n <Body type={Typography.BODY_LARGE_BOLD} className=\"np-upload-input__title\">\n {renderButtonTitle()}\n </Body>\n {renderDescription()}\n </div>\n <input\n className=\"np-upload-input__upload-button-input sr-only\"\n type=\"file\"\n id={id}\n {...getAcceptedTypes()}\n {...(multiple && { multiple: true })}\n ref={inputRef}\n disabled={disabled}\n name=\"file-upload\"\n data-testid={TEST_IDS.uploadInput}\n onChange={filesSelected}\n />\n {isDropping && (\n <div\n className={clsx(\n 'np-upload-input__drop-file-overlay',\n 'droppable-card',\n 'droppable-dropping-card',\n 'droppable-card-content',\n )}\n >\n <PlusIcon className=\"m-x-1\" size={24} />\n <div>{formatMessage(MESSAGES.dropFile)}</div>\n </div>\n )}\n </label>\n );\n },\n);\n\nUploadButton.displayName = 'UploadButton';\n\nexport default UploadButton;\n"],"names":["TEST_IDS","onDragOver","event","preventDefault","DEFAULT_FILE_INPUT_ID","UploadButton","forwardRef","disabled","withEntries","multiple","description","fileTypes","imageFileTypes","sizeLimit","DEFAULT_SIZE_LIMIT","maxFiles","onChange","id","uploadButtonTitle","ref","formatMessage","useIntl","inputRef","useRef","useImperativeHandle","current","Error","isDropping","setIsDropping","useState","dragCounter","reset","onDragLeave","onDragEnter","onDrop","dataTransfer","files","filesSelected","target","value","getFileTypesDescription","getAllowedFileTypes","Array","isArray","join","getDescription","fileTypesDescription","derivedFileDescription","MESSAGES","allFileTypes","Number","MAX_SAFE_INTEGER","instructions","size","Math","round","getAcceptedTypes","areAllFilesAllowed","accept","renderDescription","_jsxs","Body","className","children","_Fragment","_jsx","maximumFiles","renderButtonTitle","uploadFiles","uploadFile","clsx","htmlFor","UploadIcon","mediaBody","type","Typography","BODY_LARGE_BOLD","name","uploadInput","PlusIcon","dropFile","displayName"],"mappings":"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"}
@@ -109,6 +109,9 @@ const UploadButton = /*#__PURE__*/forwardRef(({
109
109
  }
110
110
  const fileTypesDescription = getFileTypesDescription();
111
111
  const derivedFileDescription = fileTypesDescription === '*' ? formatMessage(MESSAGES.allFileTypes) : fileTypesDescription;
112
+ if (sizeLimit >= Number.MAX_SAFE_INTEGER) {
113
+ return derivedFileDescription;
114
+ }
112
115
  return formatMessage(MESSAGES.instructions, {
113
116
  fileTypes: derivedFileDescription,
114
117
  size: Math.round(sizeLimit / 1000)
@@ -1 +1 @@
1
- {"version":3,"file":"UploadButton.mjs","sources":["../../../src/uploadInput/uploadButton/UploadButton.tsx"],"sourcesContent":["import { PlusCircle as PlusIcon, Upload as UploadIcon } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport {\n ChangeEvent,\n DragEvent,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n ForwardedRef,\n} from 'react';\nimport { useIntl } from 'react-intl';\n\nimport Body from '../../body';\nimport { FileType, Typography } from '../../common';\n\nimport MESSAGES from './UploadButton.messages';\nimport { DEFAULT_SIZE_LIMIT, imageFileTypes } from './defaults';\nimport getAllowedFileTypes from './getAllowedFileTypes';\n\ntype AllowedFileTypes = string | readonly string[] | readonly FileType[];\nexport type UploadButtonProps = {\n /**\n * Disable the upload button if your app is not yet ready to accept uploads\n */\n disabled?: boolean;\n\n /**\n * Should be true, if the UploadInput has at least 1\n * file (valid or invalid) listed.\n */\n withEntries?: boolean;\n\n /**\n * Allow multiple file uploads\n */\n multiple?: boolean;\n\n /**\n * List of allowed filetypes, eg. '*' | '.zip,application/zip' | ['.jpg,.jpeg,image/jpeg', '.png,image/png'] (default: image files + PDF)\n */\n fileTypes?: AllowedFileTypes;\n\n /**\n * Size limit in KBs 1000 KB = 1 MB (default: 5000 KB)\n */\n sizeLimit?: number;\n\n /**\n * Description for the upload button\n */\n description?: string | undefined;\n\n /**\n * Maximum number of files allowed, if provided, shows error below file item\n */\n maxFiles?: number;\n\n /**\n * Called when some files were successfully selected\n *\n * @param files\n */\n onChange: (files: FileList) => void;\n\n /**\n * Id for the upload input\n */\n id?: string;\n\n /**\n * Title for the upload button\n */\n uploadButtonTitle?: string;\n};\n\nexport enum TEST_IDS {\n uploadInput = 'uploadInput',\n mediaBody = 'mediaBody',\n}\n\nconst onDragOver = (event: DragEvent): void => {\n event.preventDefault();\n};\n\nconst DEFAULT_FILE_INPUT_ID = 'np-upload-button';\nconst UploadButton = forwardRef<HTMLInputElement | null, UploadButtonProps>(\n (\n {\n disabled,\n withEntries,\n multiple,\n description,\n fileTypes = imageFileTypes,\n sizeLimit = DEFAULT_SIZE_LIMIT,\n maxFiles,\n onChange,\n id = DEFAULT_FILE_INPUT_ID,\n uploadButtonTitle,\n },\n ref: ForwardedRef<HTMLInputElement | null>,\n ) => {\n const { formatMessage } = useIntl();\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useImperativeHandle(ref, () => {\n if (!inputRef.current) {\n throw new Error('inputRef.current is null');\n }\n return inputRef.current;\n }, []);\n\n const [isDropping, setIsDropping] = useState(false);\n\n const dragCounter = useRef(0);\n\n const reset = (): void => {\n dragCounter.current = 0;\n setIsDropping(false);\n };\n\n const onDragLeave = (event: DragEvent): void => {\n event.preventDefault();\n dragCounter.current -= 1;\n if (dragCounter.current === 0) {\n setIsDropping(false);\n }\n };\n\n const onDragEnter = (event: DragEvent): void => {\n event.preventDefault();\n dragCounter.current += 1;\n if (dragCounter.current === 1) {\n setIsDropping(true);\n }\n };\n\n const onDrop = (event: DragEvent): void => {\n event.preventDefault();\n reset();\n if (event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files[0]) {\n onChange(event.dataTransfer.files);\n }\n };\n\n const filesSelected = (event: ChangeEvent<HTMLInputElement>): void => {\n const { files } = event.target;\n\n if (files) {\n onChange(files);\n\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }\n };\n\n const getFileTypesDescription = (): string => {\n if (fileTypes === '*') {\n return fileTypes;\n }\n\n return getAllowedFileTypes(Array.isArray(fileTypes) ? fileTypes : [fileTypes]).join(', ');\n };\n\n function getDescription() {\n if (description) {\n return description;\n }\n\n const fileTypesDescription = getFileTypesDescription();\n\n const derivedFileDescription =\n fileTypesDescription === '*' ? formatMessage(MESSAGES.allFileTypes) : fileTypesDescription;\n\n return formatMessage(MESSAGES.instructions, {\n fileTypes: derivedFileDescription,\n size: Math.round(sizeLimit / 1000),\n });\n }\n\n function getAcceptedTypes(): Pick<React.ComponentPropsWithoutRef<'input'>, 'accept'> {\n const areAllFilesAllowed = getFileTypesDescription() === '*';\n\n if (areAllFilesAllowed) {\n return {}; // file input by default allows all files\n }\n\n if (Array.isArray(fileTypes)) {\n return { accept: fileTypes.join(',') };\n }\n\n return { accept: fileTypes as string };\n }\n\n function renderDescription() {\n return (\n <Body className=\"np-upload-input__text\">\n {getDescription()}\n {maxFiles && (\n <>\n <br />\n {formatMessage(MESSAGES.maximumFiles, { maxFiles })}\n </>\n )}\n </Body>\n );\n }\n\n function renderButtonTitle() {\n if (uploadButtonTitle) {\n return uploadButtonTitle;\n }\n return formatMessage(multiple ? MESSAGES.uploadFiles : MESSAGES.uploadFile);\n }\n\n return (\n <label\n className={clsx(\n 'np-upload-input__upload-button',\n `np-upload-input__upload-button--${disabled ? 'disabled' : 'enabled'}`,\n `np-upload-input__upload-button--${withEntries ? 'with-entries' : 'without-entries'}`,\n {\n 'is-dropping': isDropping,\n },\n )}\n htmlFor={id}\n {...(!disabled && { onDragEnter, onDragLeave, onDrop, onDragOver })}\n >\n <span className=\"np-upload-input__icon\">\n <UploadIcon size={24} className=\"text-link\" />\n </span>\n <div className=\"np-upload-input__item-content\" data-testid={TEST_IDS.mediaBody}>\n <Body type={Typography.BODY_LARGE_BOLD} className=\"np-upload-input__title\">\n {renderButtonTitle()}\n </Body>\n {renderDescription()}\n </div>\n <input\n className=\"np-upload-input__upload-button-input sr-only\"\n type=\"file\"\n id={id}\n {...getAcceptedTypes()}\n {...(multiple && { multiple: true })}\n ref={inputRef}\n disabled={disabled}\n name=\"file-upload\"\n data-testid={TEST_IDS.uploadInput}\n onChange={filesSelected}\n />\n {isDropping && (\n <div\n className={clsx(\n 'np-upload-input__drop-file-overlay',\n 'droppable-card',\n 'droppable-dropping-card',\n 'droppable-card-content',\n )}\n >\n <PlusIcon className=\"m-x-1\" size={24} />\n <div>{formatMessage(MESSAGES.dropFile)}</div>\n </div>\n )}\n </label>\n );\n },\n);\n\nUploadButton.displayName = 'UploadButton';\n\nexport default UploadButton;\n"],"names":["TEST_IDS","onDragOver","event","preventDefault","DEFAULT_FILE_INPUT_ID","UploadButton","forwardRef","disabled","withEntries","multiple","description","fileTypes","imageFileTypes","sizeLimit","DEFAULT_SIZE_LIMIT","maxFiles","onChange","id","uploadButtonTitle","ref","formatMessage","useIntl","inputRef","useRef","useImperativeHandle","current","Error","isDropping","setIsDropping","useState","dragCounter","reset","onDragLeave","onDragEnter","onDrop","dataTransfer","files","filesSelected","target","value","getFileTypesDescription","getAllowedFileTypes","Array","isArray","join","getDescription","fileTypesDescription","derivedFileDescription","MESSAGES","allFileTypes","instructions","size","Math","round","getAcceptedTypes","areAllFilesAllowed","accept","renderDescription","_jsxs","Body","className","children","_Fragment","_jsx","maximumFiles","renderButtonTitle","uploadFiles","uploadFile","clsx","htmlFor","UploadIcon","mediaBody","type","Typography","BODY_LARGE_BOLD","name","uploadInput","PlusIcon","dropFile","displayName"],"mappings":"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"}
1
+ {"version":3,"file":"UploadButton.mjs","sources":["../../../src/uploadInput/uploadButton/UploadButton.tsx"],"sourcesContent":["import { PlusCircle as PlusIcon, Upload as UploadIcon } from '@transferwise/icons';\nimport { clsx } from 'clsx';\nimport {\n ChangeEvent,\n DragEvent,\n useRef,\n useState,\n forwardRef,\n useImperativeHandle,\n ForwardedRef,\n} from 'react';\nimport { useIntl } from 'react-intl';\n\nimport Body from '../../body';\nimport { FileType, Typography } from '../../common';\n\nimport MESSAGES from './UploadButton.messages';\nimport { DEFAULT_SIZE_LIMIT, imageFileTypes } from './defaults';\nimport getAllowedFileTypes from './getAllowedFileTypes';\n\ntype AllowedFileTypes = string | readonly string[] | readonly FileType[];\nexport type UploadButtonProps = {\n /**\n * Disable the upload button if your app is not yet ready to accept uploads\n */\n disabled?: boolean;\n\n /**\n * Should be true, if the UploadInput has at least 1\n * file (valid or invalid) listed.\n */\n withEntries?: boolean;\n\n /**\n * Allow multiple file uploads\n */\n multiple?: boolean;\n\n /**\n * List of allowed filetypes, eg. '*' | '.zip,application/zip' | ['.jpg,.jpeg,image/jpeg', '.png,image/png'] (default: image files + PDF)\n */\n fileTypes?: AllowedFileTypes;\n\n /**\n * Size limit in KBs 1000 KB = 1 MB (default: 5000 KB)\n */\n sizeLimit?: number;\n\n /**\n * Description for the upload button\n */\n description?: string | undefined;\n\n /**\n * Maximum number of files allowed, if provided, shows error below file item\n */\n maxFiles?: number;\n\n /**\n * Called when some files were successfully selected\n *\n * @param files\n */\n onChange: (files: FileList) => void;\n\n /**\n * Id for the upload input\n */\n id?: string;\n\n /**\n * Title for the upload button\n */\n uploadButtonTitle?: string;\n};\n\nexport enum TEST_IDS {\n uploadInput = 'uploadInput',\n mediaBody = 'mediaBody',\n}\n\nconst onDragOver = (event: DragEvent): void => {\n event.preventDefault();\n};\n\nconst DEFAULT_FILE_INPUT_ID = 'np-upload-button';\nconst UploadButton = forwardRef<HTMLInputElement | null, UploadButtonProps>(\n (\n {\n disabled,\n withEntries,\n multiple,\n description,\n fileTypes = imageFileTypes,\n sizeLimit = DEFAULT_SIZE_LIMIT,\n maxFiles,\n onChange,\n id = DEFAULT_FILE_INPUT_ID,\n uploadButtonTitle,\n },\n ref: ForwardedRef<HTMLInputElement | null>,\n ) => {\n const { formatMessage } = useIntl();\n const inputRef = useRef<HTMLInputElement | null>(null);\n\n useImperativeHandle(ref, () => {\n if (!inputRef.current) {\n throw new Error('inputRef.current is null');\n }\n return inputRef.current;\n }, []);\n\n const [isDropping, setIsDropping] = useState(false);\n\n const dragCounter = useRef(0);\n\n const reset = (): void => {\n dragCounter.current = 0;\n setIsDropping(false);\n };\n\n const onDragLeave = (event: DragEvent): void => {\n event.preventDefault();\n dragCounter.current -= 1;\n if (dragCounter.current === 0) {\n setIsDropping(false);\n }\n };\n\n const onDragEnter = (event: DragEvent): void => {\n event.preventDefault();\n dragCounter.current += 1;\n if (dragCounter.current === 1) {\n setIsDropping(true);\n }\n };\n\n const onDrop = (event: DragEvent): void => {\n event.preventDefault();\n reset();\n if (event.dataTransfer && event.dataTransfer.files && event.dataTransfer.files[0]) {\n onChange(event.dataTransfer.files);\n }\n };\n\n const filesSelected = (event: ChangeEvent<HTMLInputElement>): void => {\n const { files } = event.target;\n\n if (files) {\n onChange(files);\n\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }\n };\n\n const getFileTypesDescription = (): string => {\n if (fileTypes === '*') {\n return fileTypes;\n }\n\n return getAllowedFileTypes(Array.isArray(fileTypes) ? fileTypes : [fileTypes]).join(', ');\n };\n\n function getDescription() {\n if (description) {\n return description;\n }\n\n const fileTypesDescription = getFileTypesDescription();\n\n const derivedFileDescription =\n fileTypesDescription === '*' ? formatMessage(MESSAGES.allFileTypes) : fileTypesDescription;\n\n if (sizeLimit >= Number.MAX_SAFE_INTEGER) {\n return derivedFileDescription;\n }\n\n return formatMessage(MESSAGES.instructions, {\n fileTypes: derivedFileDescription,\n size: Math.round(sizeLimit / 1000),\n });\n }\n\n function getAcceptedTypes(): Pick<React.ComponentPropsWithoutRef<'input'>, 'accept'> {\n const areAllFilesAllowed = getFileTypesDescription() === '*';\n\n if (areAllFilesAllowed) {\n return {}; // file input by default allows all files\n }\n\n if (Array.isArray(fileTypes)) {\n return { accept: fileTypes.join(',') };\n }\n\n return { accept: fileTypes as string };\n }\n\n function renderDescription() {\n return (\n <Body className=\"np-upload-input__text\">\n {getDescription()}\n {maxFiles && (\n <>\n <br />\n {formatMessage(MESSAGES.maximumFiles, { maxFiles })}\n </>\n )}\n </Body>\n );\n }\n\n function renderButtonTitle() {\n if (uploadButtonTitle) {\n return uploadButtonTitle;\n }\n return formatMessage(multiple ? MESSAGES.uploadFiles : MESSAGES.uploadFile);\n }\n\n return (\n <label\n className={clsx(\n 'np-upload-input__upload-button',\n `np-upload-input__upload-button--${disabled ? 'disabled' : 'enabled'}`,\n `np-upload-input__upload-button--${withEntries ? 'with-entries' : 'without-entries'}`,\n {\n 'is-dropping': isDropping,\n },\n )}\n htmlFor={id}\n {...(!disabled && { onDragEnter, onDragLeave, onDrop, onDragOver })}\n >\n <span className=\"np-upload-input__icon\">\n <UploadIcon size={24} className=\"text-link\" />\n </span>\n <div className=\"np-upload-input__item-content\" data-testid={TEST_IDS.mediaBody}>\n <Body type={Typography.BODY_LARGE_BOLD} className=\"np-upload-input__title\">\n {renderButtonTitle()}\n </Body>\n {renderDescription()}\n </div>\n <input\n className=\"np-upload-input__upload-button-input sr-only\"\n type=\"file\"\n id={id}\n {...getAcceptedTypes()}\n {...(multiple && { multiple: true })}\n ref={inputRef}\n disabled={disabled}\n name=\"file-upload\"\n data-testid={TEST_IDS.uploadInput}\n onChange={filesSelected}\n />\n {isDropping && (\n <div\n className={clsx(\n 'np-upload-input__drop-file-overlay',\n 'droppable-card',\n 'droppable-dropping-card',\n 'droppable-card-content',\n )}\n >\n <PlusIcon className=\"m-x-1\" size={24} />\n <div>{formatMessage(MESSAGES.dropFile)}</div>\n </div>\n )}\n </label>\n );\n },\n);\n\nUploadButton.displayName = 'UploadButton';\n\nexport default UploadButton;\n"],"names":["TEST_IDS","onDragOver","event","preventDefault","DEFAULT_FILE_INPUT_ID","UploadButton","forwardRef","disabled","withEntries","multiple","description","fileTypes","imageFileTypes","sizeLimit","DEFAULT_SIZE_LIMIT","maxFiles","onChange","id","uploadButtonTitle","ref","formatMessage","useIntl","inputRef","useRef","useImperativeHandle","current","Error","isDropping","setIsDropping","useState","dragCounter","reset","onDragLeave","onDragEnter","onDrop","dataTransfer","files","filesSelected","target","value","getFileTypesDescription","getAllowedFileTypes","Array","isArray","join","getDescription","fileTypesDescription","derivedFileDescription","MESSAGES","allFileTypes","Number","MAX_SAFE_INTEGER","instructions","size","Math","round","getAcceptedTypes","areAllFilesAllowed","accept","renderDescription","_jsxs","Body","className","children","_Fragment","_jsx","maximumFiles","renderButtonTitle","uploadFiles","uploadFile","clsx","htmlFor","UploadIcon","mediaBody","type","Typography","BODY_LARGE_BOLD","name","uploadInput","PlusIcon","dropFile","displayName"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@transferwise/components",
3
- "version": "0.0.0-experimental-cb7b730",
3
+ "version": "0.0.0-experimental-9463364",
4
4
  "description": "Neptune React components",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -49,20 +49,10 @@
49
49
  "@rollup/plugin-node-resolve": "^15.3.1",
50
50
  "@rollup/plugin-typescript": "^12.1.4",
51
51
  "@rollup/plugin-url": "^8.0.2",
52
- "@storybook/addon-a11y": "^8.6.14",
53
- "@storybook/addon-actions": "^8.6.14",
54
- "@storybook/addon-essentials": "^8.6.14",
55
- "@storybook/addon-interactions": "^8.6.14",
56
- "@storybook/addon-knobs": "^8.0.1",
57
- "@storybook/addon-viewport": "^8.6.14",
52
+ "@storybook/addon-a11y": "^9.0.17",
53
+ "@storybook/addon-docs": "^9.0.17",
58
54
  "@storybook/addon-webpack5-compiler-babel": "^3.0.6",
59
- "@storybook/components": "^8.6.14",
60
- "@storybook/core-events": "^8.6.14",
61
- "@storybook/manager-api": "^8.6.14",
62
- "@storybook/react": "^8.6.14",
63
- "@storybook/react-webpack5": "^8.6.14",
64
- "@storybook/test": "^8.6.14",
65
- "@storybook/theming": "^8.6.14",
55
+ "@storybook/react-webpack5": "^9.0.17",
66
56
  "@testing-library/dom": "^10.4.0",
67
57
  "@testing-library/jest-dom": "^6.6.3",
68
58
  "@testing-library/react": "^16.3.0",
@@ -81,7 +71,7 @@
81
71
  "@wise/art": "^2.23.0",
82
72
  "@wise/eslint-config": "^12.4.0",
83
73
  "babel-plugin-formatjs": "^10.5.39",
84
- "eslint": "^9.30.1",
74
+ "eslint": "^9.31.0",
85
75
  "gulp": "^5.0.1",
86
76
  "jest": "^30.0.4",
87
77
  "jest-environment-jsdom": "^29.7.0",
@@ -90,7 +80,9 @@
90
80
  "react-intl": "^7.1.11",
91
81
  "rollup": "^4.44.2",
92
82
  "rollup-preserve-directives": "^1.1.3",
93
- "storybook": "^8.6.14",
83
+ "storybook": "^9.0.17",
84
+ "storybook-addon-tag-badges": "^2.0.1",
85
+ "storybook-addon-test-codegen": "^2.0.1",
94
86
  "@transferwise/less-config": "3.1.2",
95
87
  "@transferwise/neptune-css": "14.24.5",
96
88
  "@wise/components-theming": "1.6.4",
@@ -1,21 +1,24 @@
1
- @media (min-width: 768px) {
2
- }@media (min-width: 768px) {
3
- }.np-accordion-item {
1
+ .np-accordion-item {
4
2
  display: block;
5
3
  width: 100%;
6
- }.np-accordion-item--open .media {
4
+ }
5
+ .np-accordion-item--open .media {
7
6
  border: 0 !important;
8
- }.np-accordion-item .decision:not(.disabled):not(:disabled):hover {
7
+ }
8
+ .np-accordion-item .decision:not(.disabled):not(:disabled):hover {
9
9
  background-color: transparent;
10
- }.np-accordion-item.np-accordion-item--dark .media-body,
10
+ }
11
+ .np-accordion-item.np-accordion-item--dark .media-body,
11
12
  .np-accordion-item.np-accordion-item--dark .np-text-title-body {
12
13
  color: #ffffff;
13
- }.np-accordion-item__content {
14
+ }
15
+ .np-accordion-item__content {
14
16
  padding: 0 12px 24px 12px;
15
17
  padding: 0 var(--size-12) var(--size-24) var(--size-12);
16
18
  border-bottom: 1px solid rgba(0,0,0,0.10196);
17
19
  border-bottom: 1px solid var(--color-border-neutral);
18
- }@media (min-width: 480px) {
20
+ }
21
+ @media (min-width: 480px) {
19
22
  .np-accordion-item__content.has-icon {
20
23
  padding-left: 68px;
21
24
  }
@@ -24,22 +27,28 @@
24
27
  padding-left: 0;
25
28
  padding-left: initial;
26
29
  }
27
- }.np-accordion-item .np-option .np-option__title {
30
+ }
31
+ .np-accordion-item .np-option .np-option__title {
28
32
  font-weight: 600;
29
33
  font-weight: var(--font-weight-semi-bold);
30
- }.np-theme-personal .np-accordion-item--with-media .media {
34
+ }
35
+ .np-theme-personal .np-accordion-item--with-media .media {
31
36
  display: flex;
32
37
  align-items: center;
33
- }.np-theme-personal .np-accordion-item--with-icon .np-accordion-item__content {
38
+ }
39
+ .np-theme-personal .np-accordion-item--with-icon .np-accordion-item__content {
34
40
  padding: 0 56px 16px;
35
41
  padding: 0 var(--size-56) var(--size-16);
36
- }.np-theme-personal .np-accordion-item--with-icon .media {
42
+ }
43
+ .np-theme-personal .np-accordion-item--with-icon .media {
37
44
  display: flex;
38
45
  align-items: flex-start;
39
- }.np-theme-personal .np-accordion-item .decision__title {
46
+ }
47
+ .np-theme-personal .np-accordion-item .decision__title {
40
48
  font-size: 1.125rem;
41
49
  font-size: var(--font-size-18);
42
- }.np-theme-personal .np-accordion-item .np-option .np-option__title {
50
+ }
51
+ .np-theme-personal .np-accordion-item .np-option .np-option__title {
43
52
  margin-bottom: 0;
44
53
  font-size: 1.125rem;
45
54
  font-size: var(--font-size-18);
@@ -47,14 +56,16 @@
47
56
  letter-spacing: var(--letter-spacing-negative-xs);
48
57
  line-height: 1.5rem;
49
58
  line-height: var(--line-height-24);
50
- }.np-theme-personal .np-accordion-item .np-option .circle-sm {
59
+ }
60
+ .np-theme-personal .np-accordion-item .np-option .circle-sm {
51
61
  background-color: transparent;
52
62
  width: 24px;
53
63
  width: var(--size-24);
54
64
  height: 24px;
55
65
  height: var(--size-24);
56
66
  border-radius: 0;
57
- }.np-theme-personal .np-accordion-item__content {
67
+ }
68
+ .np-theme-personal .np-accordion-item__content {
58
69
  padding: 0 56px 16px 16px;
59
70
  padding: 0 var(--size-56) var(--size-16) var(--size-16);
60
71
  border-bottom: none;
@@ -1,5 +1,5 @@
1
1
  import React, { useState } from 'react';
2
- import { Meta, StoryObj } from '@storybook/react';
2
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
3
3
  import { FastFlag as FastFlagIcon, CardWise as CardWiseIcon } from '@transferwise/icons';
4
4
 
5
5
  import { Scroll, Size } from '../common';
@@ -1,4 +1,4 @@
1
- import { Meta, StoryObj } from '@storybook/react';
1
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
2
2
  import { Settings } from '@transferwise/icons';
3
3
 
4
4
  import { storyConfig } from '../test-utils/story-config';
@@ -12,7 +12,8 @@ import ActionButton from './ActionButton';
12
12
  */
13
13
  export default {
14
14
  component: ActionButton,
15
- title: 'Actions/ActionButton (Deprecated)',
15
+ title: 'Actions/ActionButton',
16
+ tags: ['deprecated'],
16
17
  } satisfies Meta<typeof ActionButton>;
17
18
 
18
19
  type Story = StoryObj<typeof ActionButton>;
@@ -1,5 +1,5 @@
1
- import { action } from '@storybook/addon-actions';
2
- import { Meta, StoryObj } from '@storybook/react';
1
+ import { action } from 'storybook/actions';
2
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
3
3
  import { FastFlag as FastFlagIcon } from '@transferwise/icons';
4
4
 
5
5
  import { Nudge, Title, Typography } from '..';
@@ -1,6 +1,6 @@
1
1
  import { useState } from 'react';
2
- import { Meta, StoryObj } from '@storybook/react';
3
- import { action } from '@storybook/addon-actions';
2
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
3
+ import { action } from 'storybook/actions';
4
4
  import { ClockBorderless } from '@transferwise/icons';
5
5
 
6
6
  import { lorem40 } from '../test-utils';
@@ -1,6 +1,6 @@
1
1
  import { useState } from 'react';
2
- import { Meta, StoryObj } from '@storybook/react';
3
- import { userEvent, within, expect, waitFor } from '@storybook/test';
2
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
3
+ import { userEvent, within, expect, waitFor } from 'storybook/test';
4
4
  import { Button, Field, SelectInput, Sentiment } from '..';
5
5
  import Alert, { type AlertProps } from './Alert';
6
6
 
@@ -1,13 +1,12 @@
1
- @media (min-width: 768px) {
2
- }@media (min-width: 768px) {
3
- }.tw-avatar {
1
+ .tw-avatar {
4
2
  position: relative;
5
3
  border-radius: 50%;
6
4
  -webkit-user-select: none;
7
5
  -moz-user-select: none;
8
6
  user-select: none;
9
7
  box-sizing: border-box;
10
- }.tw-avatar .tw-avatar__content {
8
+ }
9
+ .tw-avatar .tw-avatar__content {
11
10
  align-items: center;
12
11
  background-color: rgba(134,167,189,0.10196);
13
12
  background-color: #86a7bd1a;
@@ -22,58 +21,73 @@
22
21
  max-width: 100%;
23
22
  overflow: hidden;
24
23
  width: 100%;
25
- }.tw-avatar--outlined {
24
+ }
25
+ .tw-avatar--outlined {
26
26
  border: 1px solid #00a2dd;
27
27
  border: 1px solid var(--color-interactive-accent);
28
28
  cursor: pointer;
29
- }.tw-avatar--outlined:not(.disabled):not(:disabled):hover {
29
+ }
30
+ .tw-avatar--outlined:not(.disabled):not(:disabled):hover {
30
31
  border-color: #008fc9;
31
32
  border-color: var(--color-interactive-accent-hover);
32
- }.tw-avatar--thumbnail * {
33
+ }
34
+ .tw-avatar--thumbnail * {
33
35
  width: 100%;
34
36
  height: 100%;
35
37
  -o-object-fit: cover;
36
38
  object-fit: cover;
37
- }.tw-avatar--icon * {
39
+ }
40
+ .tw-avatar--icon * {
38
41
  max-height: 100%;
39
42
  max-width: 100%;
40
- }.tw-avatar.tw-avatar--initials,
43
+ }
44
+ .tw-avatar.tw-avatar--initials,
41
45
  .tw-avatar.tw-avatar--emoji {
42
46
  font-family: Arial, sans-serif;
43
47
  font-weight: 600;
44
48
  font-weight: var(--font-weight-semi-bold);
45
- }.tw-avatar.tw-avatar--initials,
49
+ }
50
+ .tw-avatar.tw-avatar--initials,
46
51
  .tw-avatar.tw-avatar--icon {
47
52
  color: #37517e;
48
53
  color: var(--color-content-primary);
49
- }.tw-avatar.tw-avatar--initials,
54
+ }
55
+ .tw-avatar.tw-avatar--initials,
50
56
  .tw-avatar.tw-avatar--emoji {
51
57
  font-family: Arial, sans-serif;
52
- }.tw-avatar.tw-avatar--branded .tw-avatar__content {
58
+ }
59
+ .tw-avatar.tw-avatar--branded .tw-avatar__content {
53
60
  font-family: 'Wise Sans', 'Inter', sans-serif;
54
61
  font-family: var(--font-family-display);
55
62
  font-feature-settings: "ss01";
56
63
  color: var(--color-dark-charcoal);
57
64
  line-height: 1;
58
- }.tw-avatar--24 {
65
+ }
66
+ .tw-avatar--24 {
59
67
  min-width: 24px;
60
68
  width: 24px;
61
69
  height: 24px;
62
- }.tw-avatar--24.tw-avatar--emoji,
70
+ }
71
+ .tw-avatar--24.tw-avatar--emoji,
63
72
  .tw-avatar--24.tw-avatar--icon {
64
73
  font-size: 12px;
65
- }.tw-avatar--24.tw-avatar--initials {
74
+ }
75
+ .tw-avatar--24.tw-avatar--initials {
66
76
  font-size: 8.4px;
67
- }.tw-avatar--24.tw-avatar--branded {
77
+ }
78
+ .tw-avatar--24.tw-avatar--branded {
68
79
  font-size: 10.8px;
69
- }.tw-avatar--24.tw-avatar--outlined {
80
+ }
81
+ .tw-avatar--24.tw-avatar--outlined {
70
82
  padding: 2px;
71
- }.tw-avatar--24.tw-avatar--outlined.tw-avatar--thumbnail::after {
83
+ }
84
+ .tw-avatar--24.tw-avatar--outlined.tw-avatar--thumbnail::after {
72
85
  top: 2px;
73
86
  left: 2px;
74
87
  right: 2px;
75
88
  bottom: 2px;
76
- }.tw-avatar--24.tw-avatar--thumbnail::after {
89
+ }
90
+ .tw-avatar--24.tw-avatar--thumbnail::after {
77
91
  position: absolute;
78
92
  top: 0;
79
93
  left: 0;
@@ -83,25 +97,32 @@
83
97
  border: 1px solid var(--color-border-overlay);
84
98
  content: "";
85
99
  border-radius: 50%;
86
- }.tw-avatar--40 {
100
+ }
101
+ .tw-avatar--40 {
87
102
  min-width: 40px;
88
103
  width: 40px;
89
104
  height: 40px;
90
- }.tw-avatar--40.tw-avatar--emoji,
105
+ }
106
+ .tw-avatar--40.tw-avatar--emoji,
91
107
  .tw-avatar--40.tw-avatar--icon {
92
108
  font-size: 20px;
93
- }.tw-avatar--40.tw-avatar--initials {
109
+ }
110
+ .tw-avatar--40.tw-avatar--initials {
94
111
  font-size: 14px;
95
- }.tw-avatar--40.tw-avatar--branded {
112
+ }
113
+ .tw-avatar--40.tw-avatar--branded {
96
114
  font-size: 18px;
97
- }.tw-avatar--40.tw-avatar--outlined {
115
+ }
116
+ .tw-avatar--40.tw-avatar--outlined {
98
117
  padding: 2px;
99
- }.tw-avatar--40.tw-avatar--outlined.tw-avatar--thumbnail::after {
118
+ }
119
+ .tw-avatar--40.tw-avatar--outlined.tw-avatar--thumbnail::after {
100
120
  top: 2px;
101
121
  left: 2px;
102
122
  right: 2px;
103
123
  bottom: 2px;
104
- }.tw-avatar--40.tw-avatar--thumbnail::after {
124
+ }
125
+ .tw-avatar--40.tw-avatar--thumbnail::after {
105
126
  position: absolute;
106
127
  top: 0;
107
128
  left: 0;
@@ -111,25 +132,32 @@
111
132
  border: 1px solid var(--color-border-overlay);
112
133
  content: "";
113
134
  border-radius: 50%;
114
- }.tw-avatar--48 {
135
+ }
136
+ .tw-avatar--48 {
115
137
  min-width: 48px;
116
138
  width: 48px;
117
139
  height: 48px;
118
- }.tw-avatar--48.tw-avatar--emoji,
140
+ }
141
+ .tw-avatar--48.tw-avatar--emoji,
119
142
  .tw-avatar--48.tw-avatar--icon {
120
143
  font-size: 24px;
121
- }.tw-avatar--48.tw-avatar--initials {
144
+ }
145
+ .tw-avatar--48.tw-avatar--initials {
122
146
  font-size: 16.8px;
123
- }.tw-avatar--48.tw-avatar--branded {
147
+ }
148
+ .tw-avatar--48.tw-avatar--branded {
124
149
  font-size: 21.6px;
125
- }.tw-avatar--48.tw-avatar--outlined {
150
+ }
151
+ .tw-avatar--48.tw-avatar--outlined {
126
152
  padding: 2px;
127
- }.tw-avatar--48.tw-avatar--outlined.tw-avatar--thumbnail::after {
153
+ }
154
+ .tw-avatar--48.tw-avatar--outlined.tw-avatar--thumbnail::after {
128
155
  top: 2px;
129
156
  left: 2px;
130
157
  right: 2px;
131
158
  bottom: 2px;
132
- }.tw-avatar--48.tw-avatar--thumbnail::after {
159
+ }
160
+ .tw-avatar--48.tw-avatar--thumbnail::after {
133
161
  position: absolute;
134
162
  top: 0;
135
163
  left: 0;
@@ -139,25 +167,32 @@
139
167
  border: 1px solid var(--color-border-overlay);
140
168
  content: "";
141
169
  border-radius: 50%;
142
- }.tw-avatar--56 {
170
+ }
171
+ .tw-avatar--56 {
143
172
  min-width: 56px;
144
173
  width: 56px;
145
174
  height: 56px;
146
- }.tw-avatar--56.tw-avatar--emoji,
175
+ }
176
+ .tw-avatar--56.tw-avatar--emoji,
147
177
  .tw-avatar--56.tw-avatar--icon {
148
178
  font-size: 28px;
149
- }.tw-avatar--56.tw-avatar--initials {
179
+ }
180
+ .tw-avatar--56.tw-avatar--initials {
150
181
  font-size: 19.6px;
151
- }.tw-avatar--56.tw-avatar--branded {
182
+ }
183
+ .tw-avatar--56.tw-avatar--branded {
152
184
  font-size: 25.2px;
153
- }.tw-avatar--56.tw-avatar--outlined {
185
+ }
186
+ .tw-avatar--56.tw-avatar--outlined {
154
187
  padding: 2px;
155
- }.tw-avatar--56.tw-avatar--outlined.tw-avatar--thumbnail::after {
188
+ }
189
+ .tw-avatar--56.tw-avatar--outlined.tw-avatar--thumbnail::after {
156
190
  top: 2px;
157
191
  left: 2px;
158
192
  right: 2px;
159
193
  bottom: 2px;
160
- }.tw-avatar--56.tw-avatar--thumbnail::after {
194
+ }
195
+ .tw-avatar--56.tw-avatar--thumbnail::after {
161
196
  position: absolute;
162
197
  top: 0;
163
198
  left: 0;
@@ -167,25 +202,32 @@
167
202
  border: 1px solid var(--color-border-overlay);
168
203
  content: "";
169
204
  border-radius: 50%;
170
- }.tw-avatar--72 {
205
+ }
206
+ .tw-avatar--72 {
171
207
  min-width: 72px;
172
208
  width: 72px;
173
209
  height: 72px;
174
- }.tw-avatar--72.tw-avatar--emoji,
210
+ }
211
+ .tw-avatar--72.tw-avatar--emoji,
175
212
  .tw-avatar--72.tw-avatar--icon {
176
213
  font-size: 36px;
177
- }.tw-avatar--72.tw-avatar--initials {
214
+ }
215
+ .tw-avatar--72.tw-avatar--initials {
178
216
  font-size: 25.2px;
179
- }.tw-avatar--72.tw-avatar--branded {
217
+ }
218
+ .tw-avatar--72.tw-avatar--branded {
180
219
  font-size: 32.4px;
181
- }.tw-avatar--72.tw-avatar--outlined {
220
+ }
221
+ .tw-avatar--72.tw-avatar--outlined {
182
222
  padding: 2px;
183
- }.tw-avatar--72.tw-avatar--outlined.tw-avatar--thumbnail::after {
223
+ }
224
+ .tw-avatar--72.tw-avatar--outlined.tw-avatar--thumbnail::after {
184
225
  top: 2px;
185
226
  left: 2px;
186
227
  right: 2px;
187
228
  bottom: 2px;
188
- }.tw-avatar--72.tw-avatar--thumbnail::after {
229
+ }
230
+ .tw-avatar--72.tw-avatar--thumbnail::after {
189
231
  position: absolute;
190
232
  top: 0;
191
233
  left: 0;
@@ -195,11 +237,14 @@
195
237
  border: 1px solid var(--color-border-overlay);
196
238
  content: "";
197
239
  border-radius: 50%;
198
- }.tw-avatar img {
240
+ }
241
+ .tw-avatar img {
199
242
  width: 100%;
200
243
  height: 100%;
201
- }.np-theme-personal .tw-avatar--outlined {
244
+ }
245
+ .np-theme-personal .tw-avatar--outlined {
202
246
  border-color: var(--color-interactive-primary);
203
- }.np-theme-personal .tw-avatar--outlined:not(.disabled):not(:disabled):hover {
247
+ }
248
+ .np-theme-personal .tw-avatar--outlined:not(.disabled):not(:disabled):hover {
204
249
  border-color: var(--color-interactive-primary-hover);
205
250
  }
@@ -1,4 +1,4 @@
1
- import { Meta, StoryObj } from '@storybook/react';
1
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
2
2
  import * as wiseIcons from '@transferwise/icons';
3
3
  import { Flag } from '@wise/art';
4
4
 
@@ -12,7 +12,8 @@ import Avatar, { AvatarType } from '.';
12
12
  */
13
13
  export default {
14
14
  component: Avatar,
15
- title: 'Content/Avatar (Deprecated)',
15
+ title: 'Content/Avatar',
16
+ tags: ['deprecated'],
16
17
  } satisfies Meta<typeof Avatar>;
17
18
 
18
19
  type Story = StoryObj<typeof Avatar>;
@@ -1,5 +1,5 @@
1
1
  /* eslint-disable react/jsx-key */
2
- import { Meta, StoryObj } from '@storybook/react';
2
+ import { Meta, StoryObj } from '@storybook/react-webpack5';
3
3
  import AvatarLayout, { AvatarLayoutProps } from '.';
4
4
  import { Freeze, Graph, Plane, Rewards } from '@transferwise/icons';
5
5
  import { Flag } from '@wise/art';