@transferwise/components 0.0.0-experimental-4b93e2b → 0.0.0-experimental-f144cf1

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 (218) hide show
  1. package/build/Calendar/DateHeader/DateHeader.js +6 -2
  2. package/build/Calendar/DateHeader/DateHeader.js.map +1 -1
  3. package/build/Calendar/DateHeader/DateHeader.mjs +7 -3
  4. package/build/Calendar/DateHeader/DateHeader.mjs.map +1 -1
  5. package/build/Carousel/Carousel.js +2 -2
  6. package/build/Carousel/Carousel.js.map +1 -1
  7. package/build/Carousel/Carousel.mjs +3 -3
  8. package/build/Carousel/Carousel.mjs.map +1 -1
  9. package/build/Inputs/SelectInput/OptionContent/SelectInputOptionContent.js +3 -4
  10. package/build/Inputs/SelectInput/OptionContent/SelectInputOptionContent.js.map +1 -1
  11. package/build/Inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs +3 -4
  12. package/build/Inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs.map +1 -1
  13. package/build/ListItem/Navigation/ListItemNavigation.js +1 -1
  14. package/build/ListItem/Navigation/ListItemNavigation.js.map +1 -1
  15. package/build/ListItem/Navigation/ListItemNavigation.mjs +2 -2
  16. package/build/ListItem/Navigation/ListItemNavigation.mjs.map +1 -1
  17. package/build/PhoneNumberInput/PhoneNumberInput.js +1 -2
  18. package/build/PhoneNumberInput/PhoneNumberInput.js.map +1 -1
  19. package/build/PhoneNumberInput/PhoneNumberInput.mjs +1 -2
  20. package/build/PhoneNumberInput/PhoneNumberInput.mjs.map +1 -1
  21. package/build/PromoCard/Indicator/PromoCardIndicator.js +1 -1
  22. package/build/PromoCard/Indicator/PromoCardIndicator.js.map +1 -1
  23. package/build/PromoCard/Indicator/PromoCardIndicator.mjs +2 -2
  24. package/build/PromoCard/Indicator/PromoCardIndicator.mjs.map +1 -1
  25. package/build/Snackbar/Snackbar.js +212 -108
  26. package/build/Snackbar/Snackbar.js.map +1 -1
  27. package/build/Snackbar/Snackbar.messages.js +14 -0
  28. package/build/Snackbar/Snackbar.messages.js.map +1 -0
  29. package/build/Snackbar/Snackbar.messages.mjs +10 -0
  30. package/build/Snackbar/Snackbar.messages.mjs.map +1 -0
  31. package/build/Snackbar/Snackbar.mjs +213 -107
  32. package/build/Snackbar/Snackbar.mjs.map +1 -1
  33. package/build/Snackbar/SnackbarContext.js.map +1 -1
  34. package/build/Snackbar/SnackbarContext.mjs.map +1 -1
  35. package/build/Snackbar/SnackbarPortal.js +92 -0
  36. package/build/Snackbar/SnackbarPortal.js.map +1 -0
  37. package/build/Snackbar/SnackbarPortal.mjs +89 -0
  38. package/build/Snackbar/SnackbarPortal.mjs.map +1 -0
  39. package/build/Snackbar/SnackbarProvider.js +21 -31
  40. package/build/Snackbar/SnackbarProvider.js.map +1 -1
  41. package/build/Snackbar/SnackbarProvider.mjs +22 -32
  42. package/build/Snackbar/SnackbarProvider.mjs.map +1 -1
  43. package/build/Snackbar/constants.js +14 -0
  44. package/build/Snackbar/constants.js.map +1 -0
  45. package/build/Snackbar/constants.mjs +8 -0
  46. package/build/Snackbar/constants.mjs.map +1 -0
  47. package/build/Snackbar/useSnackbarAutoDismiss.js +135 -0
  48. package/build/Snackbar/useSnackbarAutoDismiss.js.map +1 -0
  49. package/build/Snackbar/useSnackbarAutoDismiss.mjs +131 -0
  50. package/build/Snackbar/useSnackbarAutoDismiss.mjs.map +1 -0
  51. package/build/Snackbar/useSnackbarManager.js +164 -0
  52. package/build/Snackbar/useSnackbarManager.js.map +1 -0
  53. package/build/Snackbar/useSnackbarManager.mjs +160 -0
  54. package/build/Snackbar/useSnackbarManager.mjs.map +1 -0
  55. package/build/Snackbar/useSnackbarSwipeDismiss.js +114 -0
  56. package/build/Snackbar/useSnackbarSwipeDismiss.js.map +1 -0
  57. package/build/Snackbar/useSnackbarSwipeDismiss.mjs +110 -0
  58. package/build/Snackbar/useSnackbarSwipeDismiss.mjs.map +1 -0
  59. package/build/common/PropsValues/typography.js +0 -6
  60. package/build/common/PropsValues/typography.js.map +1 -1
  61. package/build/common/PropsValues/typography.mjs +0 -6
  62. package/build/common/PropsValues/typography.mjs.map +1 -1
  63. package/build/i18n/en.json +1 -0
  64. package/build/i18n/en.json.js +1 -0
  65. package/build/i18n/en.json.js.map +1 -1
  66. package/build/i18n/en.json.mjs +1 -0
  67. package/build/i18n/en.json.mjs.map +1 -1
  68. package/build/index.js +3 -1
  69. package/build/index.js.map +1 -1
  70. package/build/index.mjs +2 -1
  71. package/build/index.mjs.map +1 -1
  72. package/build/main.css +864 -1509
  73. package/build/styles/Button/Button.css +3 -0
  74. package/build/styles/DateInput/DateInput.css +0 -13
  75. package/build/styles/Inputs/Input/Input.css +24 -0
  76. package/build/styles/Inputs/TextArea/TextArea.css +24 -0
  77. package/build/styles/ListItem/ListItem.css +1 -1
  78. package/build/styles/PhoneNumberInput/PhoneNumberInput.css +0 -3
  79. package/build/styles/Popover/Popover.css +6 -0
  80. package/build/styles/PromoCard/PromoCard.css +3 -0
  81. package/build/styles/Snackbar/Snackbar.css +182 -61
  82. package/build/styles/_deprecated/Select/Select.css +6 -0
  83. package/build/styles/css/accordion.css +12 -0
  84. package/build/styles/css/button-groups.css +6 -0
  85. package/build/styles/css/buttons.css +2 -0
  86. package/build/styles/css/decision.css +12 -0
  87. package/build/styles/css/dropdowns.css +18 -2
  88. package/build/styles/css/droppable.css +6 -0
  89. package/build/styles/css/footer.css +12 -0
  90. package/build/styles/css/input-groups.css +42 -2
  91. package/build/styles/css/list-group.css +6 -0
  92. package/build/styles/css/navbar.css +18 -2
  93. package/build/styles/css/neptune-core.css +512 -4
  94. package/build/styles/css/neptune.css +640 -1426
  95. package/build/styles/css/popovers.css +18 -0
  96. package/build/styles/css/tooltip.css +6 -0
  97. package/build/styles/less/neptune-tokens.less +0 -8
  98. package/build/styles/main.css +864 -1509
  99. package/build/styles/props/neptune-tokens.css +0 -8
  100. package/build/styles/styles/less/accordion.css +12 -0
  101. package/build/styles/styles/less/button-groups.css +6 -0
  102. package/build/styles/styles/less/buttons.css +2 -0
  103. package/build/styles/styles/less/decision.css +12 -0
  104. package/build/styles/styles/less/dropdowns.css +18 -2
  105. package/build/styles/styles/less/droppable.css +6 -0
  106. package/build/styles/styles/less/footer.css +12 -0
  107. package/build/styles/styles/less/forms/bootstrap-forms.css +24 -2
  108. package/build/styles/styles/less/input-groups.css +42 -2
  109. package/build/styles/styles/less/list-group.css +6 -0
  110. package/build/styles/styles/less/navbar.css +18 -2
  111. package/build/styles/styles/less/neptune-core.css +512 -4
  112. package/build/styles/styles/less/neptune.css +640 -1426
  113. package/build/styles/styles/less/popovers.css +18 -0
  114. package/build/styles/styles/less/tooltip.css +6 -0
  115. package/build/types/Inputs/SelectInput/OptionContent/SelectInputOptionContent.d.ts +1 -2
  116. package/build/types/Inputs/SelectInput/OptionContent/SelectInputOptionContent.d.ts.map +1 -1
  117. package/build/types/PhoneNumberInput/PhoneNumberInput.d.ts.map +1 -1
  118. package/build/types/Snackbar/Snackbar.d.ts +41 -24
  119. package/build/types/Snackbar/Snackbar.d.ts.map +1 -1
  120. package/build/types/Snackbar/Snackbar.messages.d.ts +9 -0
  121. package/build/types/Snackbar/Snackbar.messages.d.ts.map +1 -0
  122. package/build/types/Snackbar/Snackbar.types.d.ts +21 -0
  123. package/build/types/Snackbar/Snackbar.types.d.ts.map +1 -0
  124. package/build/types/Snackbar/SnackbarContext.d.ts +2 -2
  125. package/build/types/Snackbar/SnackbarContext.d.ts.map +1 -1
  126. package/build/types/Snackbar/SnackbarPortal.d.ts +5 -0
  127. package/build/types/Snackbar/SnackbarPortal.d.ts.map +1 -0
  128. package/build/types/Snackbar/SnackbarProvider.d.ts +6 -0
  129. package/build/types/Snackbar/SnackbarProvider.d.ts.map +1 -1
  130. package/build/types/Snackbar/constants.d.ts +6 -0
  131. package/build/types/Snackbar/constants.d.ts.map +1 -0
  132. package/build/types/Snackbar/index.d.ts +3 -1
  133. package/build/types/Snackbar/index.d.ts.map +1 -1
  134. package/build/types/Snackbar/useSnackbar.d.ts +1 -1
  135. package/build/types/Snackbar/useSnackbar.d.ts.map +1 -1
  136. package/build/types/Snackbar/useSnackbarAutoDismiss.d.ts +18 -0
  137. package/build/types/Snackbar/useSnackbarAutoDismiss.d.ts.map +1 -0
  138. package/build/types/Snackbar/useSnackbarManager.d.ts +17 -0
  139. package/build/types/Snackbar/useSnackbarManager.d.ts.map +1 -0
  140. package/build/types/Snackbar/useSnackbarSwipeDismiss.d.ts +11 -0
  141. package/build/types/Snackbar/useSnackbarSwipeDismiss.d.ts.map +1 -0
  142. package/build/types/common/PropsValues/typography.d.ts +1 -13
  143. package/build/types/common/PropsValues/typography.d.ts.map +1 -1
  144. package/build/types/index.d.ts +2 -2
  145. package/build/types/index.d.ts.map +1 -1
  146. package/build/types/test-utils/index.d.ts +2 -0
  147. package/build/types/test-utils/index.d.ts.map +1 -1
  148. package/package.json +2 -2
  149. package/src/Button/Button.css +3 -0
  150. package/src/Button/Button.less +16 -0
  151. package/src/Button/_stories/Button.test.story.tsx +12 -12
  152. package/src/Calendar/DateHeader/DateHeader.tsx +3 -3
  153. package/src/Carousel/Carousel.tsx +3 -3
  154. package/src/DateInput/DateInput.css +0 -13
  155. package/src/DateInput/DateInput.less +2 -10
  156. package/src/DateInput/_stories/DateInput.test.story.tsx +13 -0
  157. package/src/Display/_stories/Display.story.tsx +6 -20
  158. package/src/ExpressiveMoneyInput/_stories/ExpressiveMoneyInput.rtl.test.story.tsx +1 -1
  159. package/src/InputWithDisplayFormat/_stories/InputWithDisplayFormat.test.story.tsx +0 -52
  160. package/src/Inputs/Input/Input.css +24 -0
  161. package/src/Inputs/SelectInput/OptionContent/SelectInputOptionContent.tsx +1 -4
  162. package/src/Inputs/SelectInput/SelectInput.test.tsx +0 -74
  163. package/src/Inputs/TextArea/TextArea.css +24 -0
  164. package/src/ListItem/ListItem.css +1 -1
  165. package/src/ListItem/ListItem.grid.less +4 -4
  166. package/src/ListItem/ListItem.less +1 -1
  167. package/src/ListItem/Navigation/ListItemNavigation.tsx +2 -2
  168. package/src/PhoneNumberInput/PhoneNumberInput.css +0 -3
  169. package/src/PhoneNumberInput/PhoneNumberInput.less +2 -10
  170. package/src/PhoneNumberInput/PhoneNumberInput.tsx +0 -1
  171. package/src/PhoneNumberInput/_stories/PhoneNumberInput.rtl.test.story.tsx +1 -1
  172. package/src/Popover/Popover.css +6 -0
  173. package/src/PromoCard/Indicator/PromoCardIndicator.tsx +2 -2
  174. package/src/PromoCard/PromoCard.css +3 -0
  175. package/src/PromoCard/PromoCard.less +5 -0
  176. package/src/Prompt/CriticalBanner/_stories/CriticalBanner.test.story.tsx +1 -1
  177. package/src/Snackbar/Snackbar.css +182 -61
  178. package/src/Snackbar/Snackbar.less +185 -56
  179. package/src/Snackbar/Snackbar.messages.ts +9 -0
  180. package/src/Snackbar/Snackbar.test.tsx +697 -0
  181. package/src/Snackbar/Snackbar.tsx +227 -96
  182. package/src/Snackbar/Snackbar.types.ts +26 -0
  183. package/src/Snackbar/SnackbarContext.ts +2 -2
  184. package/src/Snackbar/SnackbarPortal.tsx +110 -0
  185. package/src/Snackbar/SnackbarProvider.test.tsx +202 -0
  186. package/src/Snackbar/SnackbarProvider.tsx +25 -25
  187. package/src/Snackbar/_stories/Snackbar.accessibility.docs.mdx +73 -0
  188. package/src/Snackbar/_stories/Snackbar.rtl.test.story.tsx +1 -12
  189. package/src/Snackbar/_stories/Snackbar.story.tsx +447 -62
  190. package/src/Snackbar/_stories/Snackbar.test.story.tsx +91 -16
  191. package/src/Snackbar/constants.ts +5 -0
  192. package/src/Snackbar/index.ts +3 -1
  193. package/src/Snackbar/useSnackbarAutoDismiss.ts +155 -0
  194. package/src/Snackbar/useSnackbarManager.ts +181 -0
  195. package/src/Snackbar/useSnackbarSwipeDismiss.ts +129 -0
  196. package/src/_deprecated/Select/Select.css +6 -0
  197. package/src/common/PropsValues/typography.ts +1 -20
  198. package/src/i18n/en.json +1 -1
  199. package/src/index.ts +7 -2
  200. package/src/main.css +864 -1509
  201. package/src/styles/less/accordion.css +12 -0
  202. package/src/styles/less/button-groups.css +6 -0
  203. package/src/styles/less/buttons.css +2 -0
  204. package/src/styles/less/core/_typography.less +194 -26
  205. package/src/styles/less/decision.css +12 -0
  206. package/src/styles/less/dropdowns.css +18 -2
  207. package/src/styles/less/droppable.css +6 -0
  208. package/src/styles/less/footer.css +12 -0
  209. package/src/styles/less/forms/bootstrap-forms.css +24 -2
  210. package/src/styles/less/input-groups.css +42 -2
  211. package/src/styles/less/list-group.css +6 -0
  212. package/src/styles/less/navbar.css +18 -2
  213. package/src/styles/less/neptune-core.css +512 -4
  214. package/src/styles/less/neptune.bundle.less +0 -2
  215. package/src/styles/less/neptune.css +640 -1426
  216. package/src/styles/less/popovers.css +18 -0
  217. package/src/styles/less/tooltip.css +6 -0
  218. package/src/DateInput/_stories/DateInput.rtl.test.story.tsx +0 -36
@@ -1 +1 @@
1
- {"version":3,"file":"Snackbar.js","sources":["../../src/Snackbar/Snackbar.tsx"],"sourcesContent":["import { Component, createRef } from 'react';\nimport { CSSTransition } from 'react-transition-group';\n\nimport Button from '../Button';\nimport Body from '../Body';\nimport type { ThemeDark, ThemeLight } from '../common';\nimport { DirectionContext } from '../Provider/Direction';\nimport withNextPortal from '../WithNextPortal/WithNextPortal';\n\nconst CSS_TRANSITION_DURATION = 400;\n\nexport interface SnackbarProps {\n action?: {\n label: string;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n };\n text: React.ReactNode;\n /** @deprecated */\n theme?: ThemeLight | ThemeDark;\n timeout: number;\n timestamp: number;\n}\n\ninterface SnackbarState extends Pick<SnackbarProps, 'action' | 'text' | 'theme'> {\n visible: boolean;\n}\n\nexport class Snackbar extends Component<SnackbarProps, SnackbarState> {\n bodyRef = createRef<HTMLSpanElement>();\n timeout = 0;\n transitionTimeout = 0;\n\n constructor(props: SnackbarProps) {\n super(props);\n this.state = {\n visible: false,\n text: '',\n };\n }\n\n componentWillUnmount() {\n window.clearTimeout(this.timeout);\n window.clearTimeout(this.transitionTimeout);\n }\n\n shouldComponentUpdate(nextProps: SnackbarProps, nextState: SnackbarState) {\n if (!nextProps.text) {\n return false;\n }\n if (\n nextProps.timestamp === this.props.timestamp &&\n nextState.visible === this.state.visible &&\n nextState.text === this.state.text\n ) {\n return false;\n }\n\n return true;\n }\n\n setLeaveTimeout = () => {\n const { timeout } = this.props;\n\n this.timeout = window.setTimeout(() => {\n this.setState({ visible: false });\n }, timeout);\n };\n\n componentDidUpdate(previousProps: SnackbarProps) {\n const { action, text, timestamp } = this.props;\n\n if (!previousProps.text) {\n this.setState({ visible: true, action, text }, () => {\n this.setLeaveTimeout();\n });\n } else if (previousProps.timestamp !== timestamp) {\n window.clearTimeout(this.timeout);\n\n if (this.state.visible) {\n this.setState({ visible: false }, () => {\n this.transitionTimeout = window.setTimeout(() => {\n this.setState({ visible: true, action, text });\n this.setLeaveTimeout();\n }, CSS_TRANSITION_DURATION);\n });\n } else {\n this.setState({ visible: true, action, text });\n this.setLeaveTimeout();\n }\n }\n }\n\n render() {\n const { action, text, visible } = this.state;\n const { timeout } = this.props;\n\n return (\n <div className=\"snackbar\" aria-live=\"assertive\" role=\"alert\">\n <CSSTransition\n nodeRef={this.bodyRef}\n in={visible}\n classNames=\"snackbar__text-container\"\n timeout={{\n appear: 0,\n enter: timeout,\n exit: CSS_TRANSITION_DURATION,\n }}\n unmountOnExit\n >\n <Body ref={this.bodyRef} as=\"span\" className=\"snackbar__text\">\n {text}\n {action ? (\n <Button className=\"snackbar__text__action\" v2 size=\"sm\" onClick={action.onClick}>\n {action.label}\n </Button>\n ) : null}\n </Body>\n </CSSTransition>\n </div>\n );\n }\n}\n\nSnackbar.contextType = DirectionContext;\n\nexport default withNextPortal(Snackbar);\n"],"names":["CSS_TRANSITION_DURATION","Snackbar","Component","bodyRef","createRef","timeout","transitionTimeout","constructor","props","state","visible","text","componentWillUnmount","window","clearTimeout","shouldComponentUpdate","nextProps","nextState","timestamp","setLeaveTimeout","setTimeout","setState","componentDidUpdate","previousProps","action","render","_jsx","className","role","children","CSSTransition","nodeRef","in","classNames","appear","enter","exit","unmountOnExit","_jsxs","Body","ref","as","Button","v2","size","onClick","label","contextType","DirectionContext","withNextPortal"],"mappings":"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"}
1
+ {"version":3,"file":"Snackbar.js","sources":["../../src/Snackbar/Snackbar.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport { useIntl } from 'react-intl';\nimport { Tags } from '@transferwise/icons';\n\nimport Button from '../Button';\nimport type { ButtonReferenceType } from '../Button/Button.types';\nimport Body from '../Body';\nimport { LiveRegion } from '../common';\nimport type { ThemeDark, ThemeLight } from '../common';\nimport ProcessIndicator from '../ProcessIndicator';\nimport { PrimitivePrompt } from '../Prompt/PrimitivePrompt';\nimport type { Sentiment } from '../SentimentSurface';\nimport StatusIcon from '../StatusIcon';\nimport { SNACKBAR_ENTER_DURATION, SNACKBAR_EXIT_DURATION } from './constants';\nimport messages from './Snackbar.messages';\nimport type { SnackbarAction, SnackbarDuration, SnackbarInternalProps } from './Snackbar.types';\nimport useSnackbarAutoDismiss from './useSnackbarAutoDismiss';\nimport useSnackbarSwipeDismiss from './useSnackbarSwipeDismiss';\n\nexport interface SnackbarProps {\n /** One optional action. Supports callbacks and navigation through the Button API. */\n action?: SnackbarAction;\n /**\n * Controls auto-dismiss using the design-defined duration presets.\n * @default 'default'\n */\n duration?: SnackbarDuration;\n /**\n * Replaces the sentiment-derived default media.\n * Custom media should fit the 24x24px media slot.\n * The asset should include its own accessibility attributes if it conveys meaning.\n */\n media?: React.ReactNode;\n /**\n * Replaces the media with a progress indicator and uses neutral sentiment styling.\n * @default false\n */\n loading?: boolean;\n /** Called after the Snackbar completes dismissal. */\n onDismiss?: () => void;\n /**\n * Determines the colour scheme and default media.\n * @default 'neutral'\n */\n sentiment?: Sentiment;\n /** Short Snackbar message. Plain text is recommended. */\n text: React.ReactNode;\n /**\n * @deprecated Theme no longer changes Snackbar appearance. Use `sentiment` for the semantic\n * colour scheme. This prop remains available temporarily for existing implementations.\n */\n theme?: ThemeLight | ThemeDark;\n /**\n * @deprecated Use `duration` instead. Existing millisecond values remain supported during\n * migration: use `default` for 0–5000ms, `extended` above 5000ms, and `indefinite` only when\n * the existing usage is intentionally persistent. `duration` takes precedence when both are\n * provided.\n */\n timeout?: number;\n}\n\nexport const SnackbarInternal = ({\n action,\n announcementKey,\n duration,\n loading = false,\n media,\n onDismissRequest,\n onExited,\n sentiment = 'neutral',\n text,\n timeout,\n visible,\n}: SnackbarInternalProps) => {\n const { formatMessage } = useIntl();\n const {\n clearSwipePosition,\n containerRef,\n handleClickCapture,\n handlePointerCancel,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n } = useSnackbarSwipeDismiss(onDismissRequest);\n const { handleBlur, handleFocus, handleMouseEnter, handleMouseLeave, surfaceRef } =\n useSnackbarAutoDismiss({\n duration,\n loading,\n onDismissRequest,\n timeout,\n visible,\n resetKey: announcementKey,\n });\n\n const handleExited = () => {\n clearSwipePosition();\n onExited();\n };\n\n const handleActionClick: React.MouseEventHandler<ButtonReferenceType> = (event) => {\n const handleClick: React.MouseEventHandler<ButtonReferenceType> | undefined = action?.onClick;\n try {\n handleClick?.(event);\n } finally {\n onDismissRequest();\n }\n };\n\n const renderMedia = () => {\n if (loading) {\n return (\n <ProcessIndicator\n className=\"wds-Snackbar__process-indicator\"\n data-testid=\"Snackbar_ProcessIndicator\"\n size=\"xs\"\n />\n );\n }\n\n if (media) {\n return <span className=\"wds-Snackbar__media-asset\">{media}</span>;\n }\n\n if (sentiment === 'proposition') {\n return (\n <span className=\"wds-Snackbar__media-asset\">\n <Tags aria-hidden size={24} />\n </span>\n );\n }\n\n return <StatusIcon sentiment={sentiment} size={24} />;\n };\n\n useEffect(() => {\n if (visible) {\n clearSwipePosition();\n }\n }, [clearSwipePosition, visible]);\n\n useEffect(() => {\n if (!visible) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && !event.defaultPrevented) {\n onDismissRequest();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [onDismissRequest, visible]);\n\n return (\n <div ref={containerRef} className=\"wds-Snackbar\">\n <CSSTransition\n appear\n nodeRef={surfaceRef}\n in={visible}\n classNames=\"wds-Snackbar-container\"\n timeout={{\n appear: SNACKBAR_ENTER_DURATION,\n enter: SNACKBAR_ENTER_DURATION,\n exit: SNACKBAR_EXIT_DURATION,\n }}\n unmountOnExit\n onExited={handleExited}\n >\n <PrimitivePrompt\n ref={surfaceRef}\n className=\"wds-Snackbar-container\"\n sentiment={loading ? 'neutral' : sentiment}\n emphasis=\"elevated\"\n media={renderMedia()}\n onDismiss={onDismissRequest}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClickCapture={handleClickCapture}\n onPointerCancel={handlePointerCancel}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n >\n <div className=\"wds-Snackbar__content\">\n <LiveRegion\n aria-live=\"polite\"\n announceOnChange={announcementKey}\n className=\"wds-Snackbar__message\"\n >\n <Body as=\"span\" className=\"wds-Snackbar__body\">\n {text}\n <span className=\"sr-only\"> {formatMessage(messages.escapeDismissHint)}</span>\n </Body>\n </LiveRegion>\n {action ? (\n <Button\n className=\"wds-Snackbar__action\"\n v2\n size=\"sm\"\n priority=\"secondary\"\n href={action.href}\n target={action.target}\n onClick={handleActionClick}\n >\n {action.label}\n </Button>\n ) : null}\n </div>\n </PrimitivePrompt>\n </CSSTransition>\n </div>\n );\n};\n\nexport const Snackbar = ({ onDismiss, ...props }: SnackbarProps) => {\n const [mounted, setMounted] = useState(true);\n const [visible, setVisible] = useState(true);\n const [announcementKey, setAnnouncementKey] = useState(0);\n const previousText = useRef(props.text);\n const handleDismissRequest = useCallback(() => setVisible(false), []);\n const handleExited = useCallback(() => {\n setMounted(false);\n onDismiss?.();\n }, [onDismiss]);\n\n useEffect(() => {\n if (previousText.current === props.text) {\n return;\n }\n\n previousText.current = props.text;\n // Direct Snackbars do not have a Provider-generated instance id, so text changes advance this\n // key to schedule a fresh announcement and restart the semantic duration.\n setMounted(true);\n setVisible(true);\n setAnnouncementKey((key) => key + 1);\n }, [props.text]);\n\n if (!mounted) {\n return null;\n }\n\n return (\n <SnackbarInternal\n {...props}\n announcementKey={announcementKey}\n visible={visible}\n onDismissRequest={handleDismissRequest}\n onExited={handleExited}\n />\n );\n};\n"],"names":["SnackbarInternal","action","announcementKey","duration","loading","media","onDismissRequest","onExited","sentiment","text","timeout","visible","formatMessage","useIntl","clearSwipePosition","containerRef","handleClickCapture","handlePointerCancel","handlePointerDown","handlePointerMove","handlePointerUp","useSnackbarSwipeDismiss","handleBlur","handleFocus","handleMouseEnter","handleMouseLeave","surfaceRef","useSnackbarAutoDismiss","resetKey","handleExited","handleActionClick","event","handleClick","onClick","renderMedia","_jsx","ProcessIndicator","className","size","children","Tags","StatusIcon","useEffect","undefined","handleKeyDown","key","defaultPrevented","document","addEventListener","removeEventListener","ref","CSSTransition","appear","nodeRef","in","classNames","SNACKBAR_ENTER_DURATION","enter","exit","SNACKBAR_EXIT_DURATION","unmountOnExit","PrimitivePrompt","emphasis","onDismiss","onBlur","onFocus","onMouseEnter","onMouseLeave","onClickCapture","onPointerCancel","onPointerDown","onPointerMove","onPointerUp","_jsxs","LiveRegion","announceOnChange","Body","as","messages","escapeDismissHint","Button","v2","priority","href","target","label","Snackbar","props","mounted","setMounted","useState","setVisible","setAnnouncementKey","previousText","useRef","handleDismissRequest","useCallback","current"],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var reactIntl = require('react-intl');
6
+
7
+ var messages = reactIntl.defineMessages({
8
+ escapeDismissHint: {
9
+ id: "neptune.Snackbar.escapeDismissHint"
10
+ }
11
+ });
12
+
13
+ exports.default = messages;
14
+ //# sourceMappingURL=Snackbar.messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Snackbar.messages.js","sources":["../../src/Snackbar/Snackbar.messages.ts"],"sourcesContent":["import { defineMessages } from 'react-intl';\n\nexport default defineMessages({\n escapeDismissHint: {\n id: 'neptune.Snackbar.escapeDismissHint',\n defaultMessage: 'Press Escape to dismiss.',\n description: 'Screen-reader instruction for dismissing a Snackbar without moving focus',\n },\n});\n"],"names":["defineMessages","escapeDismissHint","id"],"mappings":";;;;;;AAEA,eAAeA,wBAAc,CAAC;AAC5BC,EAAAA,iBAAiB,EAAE;IACjBC,EAAE,EAAA;AAGH;AACF,CAAA,CAAC;;"}
@@ -0,0 +1,10 @@
1
+ import { defineMessages } from 'react-intl';
2
+
3
+ var messages = defineMessages({
4
+ escapeDismissHint: {
5
+ id: "neptune.Snackbar.escapeDismissHint"
6
+ }
7
+ });
8
+
9
+ export { messages as default };
10
+ //# sourceMappingURL=Snackbar.messages.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Snackbar.messages.mjs","sources":["../../src/Snackbar/Snackbar.messages.ts"],"sourcesContent":["import { defineMessages } from 'react-intl';\n\nexport default defineMessages({\n escapeDismissHint: {\n id: 'neptune.Snackbar.escapeDismissHint',\n defaultMessage: 'Press Escape to dismiss.',\n description: 'Screen-reader instruction for dismissing a Snackbar without moving focus',\n },\n});\n"],"names":["defineMessages","escapeDismissHint","id"],"mappings":";;AAEA,eAAeA,cAAc,CAAC;AAC5BC,EAAAA,iBAAiB,EAAE;IACjBC,EAAE,EAAA;AAGH;AACF,CAAA,CAAC;;"}
@@ -1,126 +1,232 @@
1
- import { Component, createRef } from 'react';
1
+ import { useState, useRef, useCallback, useEffect } from 'react';
2
2
  import { CSSTransition } from 'react-transition-group';
3
+ import { useIntl } from 'react-intl';
4
+ import { Tags } from '@transferwise/icons';
3
5
  import Button from '../Button/Button.resolver.mjs';
4
6
  import Body from '../Body/Body.mjs';
5
- import { DirectionContext } from '../Provider/Direction/DirectionProvider.mjs';
6
- import withNextPortalWrapper from '../WithNextPortal/WithNextPortal.mjs';
7
+ import '../common/theme.mjs';
8
+ import '../common/direction.mjs';
9
+ import '@transferwise/neptune-tokens';
10
+ import '../common/PropsValues/control.mjs';
11
+ import '../common/PropsValues/size.mjs';
12
+ import '../common/PropsValues/typography.mjs';
13
+ import '../common/PropsValues/width.mjs';
14
+ import '../common/PropsValues/type.mjs';
15
+ import '../common/PropsValues/dateMode.mjs';
16
+ import '../common/PropsValues/monthFormat.mjs';
17
+ import '../common/PropsValues/position.mjs';
18
+ import '../common/PropsValues/layouts.mjs';
19
+ import '../common/PropsValues/status.mjs';
20
+ import '../common/PropsValues/sentiment.mjs';
21
+ import '../common/PropsValues/profileType.mjs';
22
+ import '../common/PropsValues/variant.mjs';
23
+ import '../common/PropsValues/scroll.mjs';
24
+ import '../common/PropsValues/markdownNodeType.mjs';
25
+ import '../common/fileType.mjs';
26
+ import '@transferwise/formatting';
27
+ import 'clsx';
28
+ import '../common/CloseButton/CloseButton.messages.mjs';
7
29
  import { jsx, jsxs } from 'react/jsx-runtime';
30
+ import { LiveRegion } from '../common/LiveRegion/LiveRegion.mjs';
31
+ import ProcessIndicator from '../ProcessIndicator/ProcessIndicator.mjs';
32
+ import { PrimitivePrompt } from '../Prompt/PrimitivePrompt/PrimitivePrompt.mjs';
33
+ import StatusIcon from '../StatusIcon/StatusIcon.mjs';
34
+ import { SNACKBAR_EXIT_DURATION, SNACKBAR_ENTER_DURATION } from './constants.mjs';
35
+ import messages from './Snackbar.messages.mjs';
36
+ import useSnackbarAutoDismiss from './useSnackbarAutoDismiss.mjs';
37
+ import useSnackbarSwipeDismiss from './useSnackbarSwipeDismiss.mjs';
8
38
 
9
- const CSS_TRANSITION_DURATION = 400;
10
- class Snackbar extends Component {
11
- bodyRef = /*#__PURE__*/createRef();
12
- timeout = 0;
13
- transitionTimeout = 0;
14
- constructor(props) {
15
- super(props);
16
- this.state = {
17
- visible: false,
18
- text: ''
19
- };
20
- }
21
- componentWillUnmount() {
22
- window.clearTimeout(this.timeout);
23
- window.clearTimeout(this.transitionTimeout);
24
- }
25
- shouldComponentUpdate(nextProps, nextState) {
26
- if (!nextProps.text) {
27
- return false;
39
+ const SnackbarInternal = ({
40
+ action,
41
+ announcementKey,
42
+ duration,
43
+ loading = false,
44
+ media,
45
+ onDismissRequest,
46
+ onExited,
47
+ sentiment = 'neutral',
48
+ text,
49
+ timeout,
50
+ visible
51
+ }) => {
52
+ const {
53
+ formatMessage
54
+ } = useIntl();
55
+ const {
56
+ clearSwipePosition,
57
+ containerRef,
58
+ handleClickCapture,
59
+ handlePointerCancel,
60
+ handlePointerDown,
61
+ handlePointerMove,
62
+ handlePointerUp
63
+ } = useSnackbarSwipeDismiss(onDismissRequest);
64
+ const {
65
+ handleBlur,
66
+ handleFocus,
67
+ handleMouseEnter,
68
+ handleMouseLeave,
69
+ surfaceRef
70
+ } = useSnackbarAutoDismiss({
71
+ duration,
72
+ loading,
73
+ onDismissRequest,
74
+ timeout,
75
+ visible,
76
+ resetKey: announcementKey
77
+ });
78
+ const handleExited = () => {
79
+ clearSwipePosition();
80
+ onExited();
81
+ };
82
+ const handleActionClick = event => {
83
+ const handleClick = action?.onClick;
84
+ try {
85
+ handleClick?.(event);
86
+ } finally {
87
+ onDismissRequest();
28
88
  }
29
- if (nextProps.timestamp === this.props.timestamp && nextState.visible === this.state.visible && nextState.text === this.state.text) {
30
- return false;
89
+ };
90
+ const renderMedia = () => {
91
+ if (loading) {
92
+ return /*#__PURE__*/jsx(ProcessIndicator, {
93
+ className: "wds-Snackbar__process-indicator",
94
+ "data-testid": "Snackbar_ProcessIndicator",
95
+ size: "xs"
96
+ });
31
97
  }
32
- return true;
33
- }
34
- setLeaveTimeout = () => {
35
- const {
36
- timeout
37
- } = this.props;
38
- this.timeout = window.setTimeout(() => {
39
- this.setState({
40
- visible: false
98
+ if (media) {
99
+ return /*#__PURE__*/jsx("span", {
100
+ className: "wds-Snackbar__media-asset",
101
+ children: media
41
102
  });
42
- }, timeout);
43
- };
44
- componentDidUpdate(previousProps) {
45
- const {
46
- action,
47
- text,
48
- timestamp
49
- } = this.props;
50
- if (!previousProps.text) {
51
- this.setState({
52
- visible: true,
53
- action,
54
- text
55
- }, () => {
56
- this.setLeaveTimeout();
103
+ }
104
+ if (sentiment === 'proposition') {
105
+ return /*#__PURE__*/jsx("span", {
106
+ className: "wds-Snackbar__media-asset",
107
+ children: /*#__PURE__*/jsx(Tags, {
108
+ "aria-hidden": true,
109
+ size: 24
110
+ })
57
111
  });
58
- } else if (previousProps.timestamp !== timestamp) {
59
- window.clearTimeout(this.timeout);
60
- if (this.state.visible) {
61
- this.setState({
62
- visible: false
63
- }, () => {
64
- this.transitionTimeout = window.setTimeout(() => {
65
- this.setState({
66
- visible: true,
67
- action,
68
- text
69
- });
70
- this.setLeaveTimeout();
71
- }, CSS_TRANSITION_DURATION);
72
- });
73
- } else {
74
- this.setState({
75
- visible: true,
76
- action,
77
- text
78
- });
79
- this.setLeaveTimeout();
80
- }
81
112
  }
82
- }
83
- render() {
84
- const {
85
- action,
86
- text,
87
- visible
88
- } = this.state;
89
- const {
90
- timeout
91
- } = this.props;
92
- return /*#__PURE__*/jsx("div", {
93
- className: "snackbar",
94
- "aria-live": "assertive",
95
- role: "alert",
96
- children: /*#__PURE__*/jsx(CSSTransition, {
97
- nodeRef: this.bodyRef,
98
- in: visible,
99
- classNames: "snackbar__text-container",
100
- timeout: {
101
- appear: 0,
102
- enter: timeout,
103
- exit: CSS_TRANSITION_DURATION
104
- },
105
- unmountOnExit: true,
106
- children: /*#__PURE__*/jsxs(Body, {
107
- ref: this.bodyRef,
108
- as: "span",
109
- className: "snackbar__text",
110
- children: [text, action ? /*#__PURE__*/jsx(Button, {
111
- className: "snackbar__text__action",
113
+ return /*#__PURE__*/jsx(StatusIcon, {
114
+ sentiment: sentiment,
115
+ size: 24
116
+ });
117
+ };
118
+ useEffect(() => {
119
+ if (visible) {
120
+ clearSwipePosition();
121
+ }
122
+ }, [clearSwipePosition, visible]);
123
+ useEffect(() => {
124
+ if (!visible) {
125
+ return undefined;
126
+ }
127
+ const handleKeyDown = event => {
128
+ if (event.key === 'Escape' && !event.defaultPrevented) {
129
+ onDismissRequest();
130
+ }
131
+ };
132
+ document.addEventListener('keydown', handleKeyDown);
133
+ return () => document.removeEventListener('keydown', handleKeyDown);
134
+ }, [onDismissRequest, visible]);
135
+ return /*#__PURE__*/jsx("div", {
136
+ ref: containerRef,
137
+ className: "wds-Snackbar",
138
+ children: /*#__PURE__*/jsx(CSSTransition, {
139
+ appear: true,
140
+ nodeRef: surfaceRef,
141
+ in: visible,
142
+ classNames: "wds-Snackbar-container",
143
+ timeout: {
144
+ appear: SNACKBAR_ENTER_DURATION,
145
+ enter: SNACKBAR_ENTER_DURATION,
146
+ exit: SNACKBAR_EXIT_DURATION
147
+ },
148
+ unmountOnExit: true,
149
+ onExited: handleExited,
150
+ children: /*#__PURE__*/jsx(PrimitivePrompt, {
151
+ ref: surfaceRef,
152
+ className: "wds-Snackbar-container",
153
+ sentiment: loading ? 'neutral' : sentiment,
154
+ emphasis: "elevated",
155
+ media: renderMedia(),
156
+ onDismiss: onDismissRequest,
157
+ onBlur: handleBlur,
158
+ onFocus: handleFocus,
159
+ onMouseEnter: handleMouseEnter,
160
+ onMouseLeave: handleMouseLeave,
161
+ onClickCapture: handleClickCapture,
162
+ onPointerCancel: handlePointerCancel,
163
+ onPointerDown: handlePointerDown,
164
+ onPointerMove: handlePointerMove,
165
+ onPointerUp: handlePointerUp,
166
+ children: /*#__PURE__*/jsxs("div", {
167
+ className: "wds-Snackbar__content",
168
+ children: [/*#__PURE__*/jsx(LiveRegion, {
169
+ "aria-live": "polite",
170
+ announceOnChange: announcementKey,
171
+ className: "wds-Snackbar__message",
172
+ children: /*#__PURE__*/jsxs(Body, {
173
+ as: "span",
174
+ className: "wds-Snackbar__body",
175
+ children: [text, /*#__PURE__*/jsxs("span", {
176
+ className: "sr-only",
177
+ children: [" ", formatMessage(messages.escapeDismissHint)]
178
+ })]
179
+ })
180
+ }), action ? /*#__PURE__*/jsx(Button, {
181
+ className: "wds-Snackbar__action",
112
182
  v2: true,
113
183
  size: "sm",
114
- onClick: action.onClick,
184
+ priority: "secondary",
185
+ href: action.href,
186
+ target: action.target,
187
+ onClick: handleActionClick,
115
188
  children: action.label
116
189
  }) : null]
117
190
  })
118
191
  })
119
- });
192
+ })
193
+ });
194
+ };
195
+ const Snackbar = ({
196
+ onDismiss,
197
+ ...props
198
+ }) => {
199
+ const [mounted, setMounted] = useState(true);
200
+ const [visible, setVisible] = useState(true);
201
+ const [announcementKey, setAnnouncementKey] = useState(0);
202
+ const previousText = useRef(props.text);
203
+ const handleDismissRequest = useCallback(() => setVisible(false), []);
204
+ const handleExited = useCallback(() => {
205
+ setMounted(false);
206
+ onDismiss?.();
207
+ }, [onDismiss]);
208
+ useEffect(() => {
209
+ if (previousText.current === props.text) {
210
+ return;
211
+ }
212
+ previousText.current = props.text;
213
+ // Direct Snackbars do not have a Provider-generated instance id, so text changes advance this
214
+ // key to schedule a fresh announcement and restart the semantic duration.
215
+ setMounted(true);
216
+ setVisible(true);
217
+ setAnnouncementKey(key => key + 1);
218
+ }, [props.text]);
219
+ if (!mounted) {
220
+ return null;
120
221
  }
121
- }
122
- Snackbar.contextType = DirectionContext;
123
- var SnackbarPortal = withNextPortalWrapper(Snackbar);
222
+ return /*#__PURE__*/jsx(SnackbarInternal, {
223
+ ...props,
224
+ announcementKey: announcementKey,
225
+ visible: visible,
226
+ onDismissRequest: handleDismissRequest,
227
+ onExited: handleExited
228
+ });
229
+ };
124
230
 
125
- export { Snackbar, SnackbarPortal as default };
231
+ export { Snackbar, SnackbarInternal };
126
232
  //# sourceMappingURL=Snackbar.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Snackbar.mjs","sources":["../../src/Snackbar/Snackbar.tsx"],"sourcesContent":["import { Component, createRef } from 'react';\nimport { CSSTransition } from 'react-transition-group';\n\nimport Button from '../Button';\nimport Body from '../Body';\nimport type { ThemeDark, ThemeLight } from '../common';\nimport { DirectionContext } from '../Provider/Direction';\nimport withNextPortal from '../WithNextPortal/WithNextPortal';\n\nconst CSS_TRANSITION_DURATION = 400;\n\nexport interface SnackbarProps {\n action?: {\n label: string;\n onClick?: React.MouseEventHandler<HTMLButtonElement>;\n };\n text: React.ReactNode;\n /** @deprecated */\n theme?: ThemeLight | ThemeDark;\n timeout: number;\n timestamp: number;\n}\n\ninterface SnackbarState extends Pick<SnackbarProps, 'action' | 'text' | 'theme'> {\n visible: boolean;\n}\n\nexport class Snackbar extends Component<SnackbarProps, SnackbarState> {\n bodyRef = createRef<HTMLSpanElement>();\n timeout = 0;\n transitionTimeout = 0;\n\n constructor(props: SnackbarProps) {\n super(props);\n this.state = {\n visible: false,\n text: '',\n };\n }\n\n componentWillUnmount() {\n window.clearTimeout(this.timeout);\n window.clearTimeout(this.transitionTimeout);\n }\n\n shouldComponentUpdate(nextProps: SnackbarProps, nextState: SnackbarState) {\n if (!nextProps.text) {\n return false;\n }\n if (\n nextProps.timestamp === this.props.timestamp &&\n nextState.visible === this.state.visible &&\n nextState.text === this.state.text\n ) {\n return false;\n }\n\n return true;\n }\n\n setLeaveTimeout = () => {\n const { timeout } = this.props;\n\n this.timeout = window.setTimeout(() => {\n this.setState({ visible: false });\n }, timeout);\n };\n\n componentDidUpdate(previousProps: SnackbarProps) {\n const { action, text, timestamp } = this.props;\n\n if (!previousProps.text) {\n this.setState({ visible: true, action, text }, () => {\n this.setLeaveTimeout();\n });\n } else if (previousProps.timestamp !== timestamp) {\n window.clearTimeout(this.timeout);\n\n if (this.state.visible) {\n this.setState({ visible: false }, () => {\n this.transitionTimeout = window.setTimeout(() => {\n this.setState({ visible: true, action, text });\n this.setLeaveTimeout();\n }, CSS_TRANSITION_DURATION);\n });\n } else {\n this.setState({ visible: true, action, text });\n this.setLeaveTimeout();\n }\n }\n }\n\n render() {\n const { action, text, visible } = this.state;\n const { timeout } = this.props;\n\n return (\n <div className=\"snackbar\" aria-live=\"assertive\" role=\"alert\">\n <CSSTransition\n nodeRef={this.bodyRef}\n in={visible}\n classNames=\"snackbar__text-container\"\n timeout={{\n appear: 0,\n enter: timeout,\n exit: CSS_TRANSITION_DURATION,\n }}\n unmountOnExit\n >\n <Body ref={this.bodyRef} as=\"span\" className=\"snackbar__text\">\n {text}\n {action ? (\n <Button className=\"snackbar__text__action\" v2 size=\"sm\" onClick={action.onClick}>\n {action.label}\n </Button>\n ) : null}\n </Body>\n </CSSTransition>\n </div>\n );\n }\n}\n\nSnackbar.contextType = DirectionContext;\n\nexport default withNextPortal(Snackbar);\n"],"names":["CSS_TRANSITION_DURATION","Snackbar","Component","bodyRef","createRef","timeout","transitionTimeout","constructor","props","state","visible","text","componentWillUnmount","window","clearTimeout","shouldComponentUpdate","nextProps","nextState","timestamp","setLeaveTimeout","setTimeout","setState","componentDidUpdate","previousProps","action","render","_jsx","className","role","children","CSSTransition","nodeRef","in","classNames","appear","enter","exit","unmountOnExit","_jsxs","Body","ref","as","Button","v2","size","onClick","label","contextType","DirectionContext","withNextPortal"],"mappings":"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"}
1
+ {"version":3,"file":"Snackbar.mjs","sources":["../../src/Snackbar/Snackbar.tsx"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport { useIntl } from 'react-intl';\nimport { Tags } from '@transferwise/icons';\n\nimport Button from '../Button';\nimport type { ButtonReferenceType } from '../Button/Button.types';\nimport Body from '../Body';\nimport { LiveRegion } from '../common';\nimport type { ThemeDark, ThemeLight } from '../common';\nimport ProcessIndicator from '../ProcessIndicator';\nimport { PrimitivePrompt } from '../Prompt/PrimitivePrompt';\nimport type { Sentiment } from '../SentimentSurface';\nimport StatusIcon from '../StatusIcon';\nimport { SNACKBAR_ENTER_DURATION, SNACKBAR_EXIT_DURATION } from './constants';\nimport messages from './Snackbar.messages';\nimport type { SnackbarAction, SnackbarDuration, SnackbarInternalProps } from './Snackbar.types';\nimport useSnackbarAutoDismiss from './useSnackbarAutoDismiss';\nimport useSnackbarSwipeDismiss from './useSnackbarSwipeDismiss';\n\nexport interface SnackbarProps {\n /** One optional action. Supports callbacks and navigation through the Button API. */\n action?: SnackbarAction;\n /**\n * Controls auto-dismiss using the design-defined duration presets.\n * @default 'default'\n */\n duration?: SnackbarDuration;\n /**\n * Replaces the sentiment-derived default media.\n * Custom media should fit the 24x24px media slot.\n * The asset should include its own accessibility attributes if it conveys meaning.\n */\n media?: React.ReactNode;\n /**\n * Replaces the media with a progress indicator and uses neutral sentiment styling.\n * @default false\n */\n loading?: boolean;\n /** Called after the Snackbar completes dismissal. */\n onDismiss?: () => void;\n /**\n * Determines the colour scheme and default media.\n * @default 'neutral'\n */\n sentiment?: Sentiment;\n /** Short Snackbar message. Plain text is recommended. */\n text: React.ReactNode;\n /**\n * @deprecated Theme no longer changes Snackbar appearance. Use `sentiment` for the semantic\n * colour scheme. This prop remains available temporarily for existing implementations.\n */\n theme?: ThemeLight | ThemeDark;\n /**\n * @deprecated Use `duration` instead. Existing millisecond values remain supported during\n * migration: use `default` for 0–5000ms, `extended` above 5000ms, and `indefinite` only when\n * the existing usage is intentionally persistent. `duration` takes precedence when both are\n * provided.\n */\n timeout?: number;\n}\n\nexport const SnackbarInternal = ({\n action,\n announcementKey,\n duration,\n loading = false,\n media,\n onDismissRequest,\n onExited,\n sentiment = 'neutral',\n text,\n timeout,\n visible,\n}: SnackbarInternalProps) => {\n const { formatMessage } = useIntl();\n const {\n clearSwipePosition,\n containerRef,\n handleClickCapture,\n handlePointerCancel,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n } = useSnackbarSwipeDismiss(onDismissRequest);\n const { handleBlur, handleFocus, handleMouseEnter, handleMouseLeave, surfaceRef } =\n useSnackbarAutoDismiss({\n duration,\n loading,\n onDismissRequest,\n timeout,\n visible,\n resetKey: announcementKey,\n });\n\n const handleExited = () => {\n clearSwipePosition();\n onExited();\n };\n\n const handleActionClick: React.MouseEventHandler<ButtonReferenceType> = (event) => {\n const handleClick: React.MouseEventHandler<ButtonReferenceType> | undefined = action?.onClick;\n try {\n handleClick?.(event);\n } finally {\n onDismissRequest();\n }\n };\n\n const renderMedia = () => {\n if (loading) {\n return (\n <ProcessIndicator\n className=\"wds-Snackbar__process-indicator\"\n data-testid=\"Snackbar_ProcessIndicator\"\n size=\"xs\"\n />\n );\n }\n\n if (media) {\n return <span className=\"wds-Snackbar__media-asset\">{media}</span>;\n }\n\n if (sentiment === 'proposition') {\n return (\n <span className=\"wds-Snackbar__media-asset\">\n <Tags aria-hidden size={24} />\n </span>\n );\n }\n\n return <StatusIcon sentiment={sentiment} size={24} />;\n };\n\n useEffect(() => {\n if (visible) {\n clearSwipePosition();\n }\n }, [clearSwipePosition, visible]);\n\n useEffect(() => {\n if (!visible) {\n return undefined;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && !event.defaultPrevented) {\n onDismissRequest();\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [onDismissRequest, visible]);\n\n return (\n <div ref={containerRef} className=\"wds-Snackbar\">\n <CSSTransition\n appear\n nodeRef={surfaceRef}\n in={visible}\n classNames=\"wds-Snackbar-container\"\n timeout={{\n appear: SNACKBAR_ENTER_DURATION,\n enter: SNACKBAR_ENTER_DURATION,\n exit: SNACKBAR_EXIT_DURATION,\n }}\n unmountOnExit\n onExited={handleExited}\n >\n <PrimitivePrompt\n ref={surfaceRef}\n className=\"wds-Snackbar-container\"\n sentiment={loading ? 'neutral' : sentiment}\n emphasis=\"elevated\"\n media={renderMedia()}\n onDismiss={onDismissRequest}\n onBlur={handleBlur}\n onFocus={handleFocus}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onClickCapture={handleClickCapture}\n onPointerCancel={handlePointerCancel}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n >\n <div className=\"wds-Snackbar__content\">\n <LiveRegion\n aria-live=\"polite\"\n announceOnChange={announcementKey}\n className=\"wds-Snackbar__message\"\n >\n <Body as=\"span\" className=\"wds-Snackbar__body\">\n {text}\n <span className=\"sr-only\"> {formatMessage(messages.escapeDismissHint)}</span>\n </Body>\n </LiveRegion>\n {action ? (\n <Button\n className=\"wds-Snackbar__action\"\n v2\n size=\"sm\"\n priority=\"secondary\"\n href={action.href}\n target={action.target}\n onClick={handleActionClick}\n >\n {action.label}\n </Button>\n ) : null}\n </div>\n </PrimitivePrompt>\n </CSSTransition>\n </div>\n );\n};\n\nexport const Snackbar = ({ onDismiss, ...props }: SnackbarProps) => {\n const [mounted, setMounted] = useState(true);\n const [visible, setVisible] = useState(true);\n const [announcementKey, setAnnouncementKey] = useState(0);\n const previousText = useRef(props.text);\n const handleDismissRequest = useCallback(() => setVisible(false), []);\n const handleExited = useCallback(() => {\n setMounted(false);\n onDismiss?.();\n }, [onDismiss]);\n\n useEffect(() => {\n if (previousText.current === props.text) {\n return;\n }\n\n previousText.current = props.text;\n // Direct Snackbars do not have a Provider-generated instance id, so text changes advance this\n // key to schedule a fresh announcement and restart the semantic duration.\n setMounted(true);\n setVisible(true);\n setAnnouncementKey((key) => key + 1);\n }, [props.text]);\n\n if (!mounted) {\n return null;\n }\n\n return (\n <SnackbarInternal\n {...props}\n announcementKey={announcementKey}\n visible={visible}\n onDismissRequest={handleDismissRequest}\n onExited={handleExited}\n />\n );\n};\n"],"names":["SnackbarInternal","action","announcementKey","duration","loading","media","onDismissRequest","onExited","sentiment","text","timeout","visible","formatMessage","useIntl","clearSwipePosition","containerRef","handleClickCapture","handlePointerCancel","handlePointerDown","handlePointerMove","handlePointerUp","useSnackbarSwipeDismiss","handleBlur","handleFocus","handleMouseEnter","handleMouseLeave","surfaceRef","useSnackbarAutoDismiss","resetKey","handleExited","handleActionClick","event","handleClick","onClick","renderMedia","_jsx","ProcessIndicator","className","size","children","Tags","StatusIcon","useEffect","undefined","handleKeyDown","key","defaultPrevented","document","addEventListener","removeEventListener","ref","CSSTransition","appear","nodeRef","in","classNames","SNACKBAR_ENTER_DURATION","enter","exit","SNACKBAR_EXIT_DURATION","unmountOnExit","PrimitivePrompt","emphasis","onDismiss","onBlur","onFocus","onMouseEnter","onMouseLeave","onClickCapture","onPointerCancel","onPointerDown","onPointerMove","onPointerUp","_jsxs","LiveRegion","announceOnChange","Body","as","messages","escapeDismissHint","Button","v2","priority","href","target","label","Snackbar","props","mounted","setMounted","useState","setVisible","setAnnouncementKey","previousText","useRef","handleDismissRequest","useCallback","current"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"SnackbarContext.js","sources":["../../src/Snackbar/SnackbarContext.ts"],"sourcesContent":["import { createContext } from 'react';\n\nimport { SnackbarProps } from './Snackbar';\n\nexport type SnackbarContextType = {\n createSnackbar: (props: Omit<SnackbarProps, 'timeout' | 'timestamp'>) => void;\n};\n\nexport const SnackbarContext = createContext<SnackbarContextType>({ createSnackbar: () => {} });\n\nexport const SnackbarConsumer = SnackbarContext.Consumer;\n"],"names":["SnackbarContext","createContext","createSnackbar","SnackbarConsumer","Consumer"],"mappings":";;;;AAQO,MAAMA,eAAe,gBAAGC,mBAAa,CAAsB;EAAEC,cAAc,EAAEA,MAAK,CAAE;AAAC,CAAE;AAEvF,MAAMC,gBAAgB,GAAGH,eAAe,CAACI;;;"}
1
+ {"version":3,"file":"SnackbarContext.js","sources":["../../src/Snackbar/SnackbarContext.ts"],"sourcesContent":["import { createContext } from 'react';\n\nimport type { SnackbarCreationProps } from './Snackbar.types';\n\nexport type SnackbarContextType = {\n createSnackbar: (props: SnackbarCreationProps) => void;\n};\n\nexport const SnackbarContext = createContext<SnackbarContextType>({ createSnackbar: () => {} });\n\nexport const SnackbarConsumer = SnackbarContext.Consumer;\n"],"names":["SnackbarContext","createContext","createSnackbar","SnackbarConsumer","Consumer"],"mappings":";;;;AAQO,MAAMA,eAAe,gBAAGC,mBAAa,CAAsB;EAAEC,cAAc,EAAEA,MAAK,CAAE;AAAC,CAAE;AAEvF,MAAMC,gBAAgB,GAAGH,eAAe,CAACI;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"SnackbarContext.mjs","sources":["../../src/Snackbar/SnackbarContext.ts"],"sourcesContent":["import { createContext } from 'react';\n\nimport { SnackbarProps } from './Snackbar';\n\nexport type SnackbarContextType = {\n createSnackbar: (props: Omit<SnackbarProps, 'timeout' | 'timestamp'>) => void;\n};\n\nexport const SnackbarContext = createContext<SnackbarContextType>({ createSnackbar: () => {} });\n\nexport const SnackbarConsumer = SnackbarContext.Consumer;\n"],"names":["SnackbarContext","createContext","createSnackbar","SnackbarConsumer","Consumer"],"mappings":";;AAQO,MAAMA,eAAe,gBAAGC,aAAa,CAAsB;EAAEC,cAAc,EAAEA,MAAK,CAAE;AAAC,CAAE;AAEvF,MAAMC,gBAAgB,GAAGH,eAAe,CAACI;;"}
1
+ {"version":3,"file":"SnackbarContext.mjs","sources":["../../src/Snackbar/SnackbarContext.ts"],"sourcesContent":["import { createContext } from 'react';\n\nimport type { SnackbarCreationProps } from './Snackbar.types';\n\nexport type SnackbarContextType = {\n createSnackbar: (props: SnackbarCreationProps) => void;\n};\n\nexport const SnackbarContext = createContext<SnackbarContextType>({ createSnackbar: () => {} });\n\nexport const SnackbarConsumer = SnackbarContext.Consumer;\n"],"names":["SnackbarContext","createContext","createSnackbar","SnackbarConsumer","Consumer"],"mappings":";;AAQO,MAAMA,eAAe,gBAAGC,aAAa,CAAsB;EAAEC,cAAc,EAAEA,MAAK,CAAE;AAAC,CAAE;AAEvF,MAAMC,gBAAgB,GAAGH,eAAe,CAACI;;"}
@@ -0,0 +1,92 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var WithNextPortal = require('../WithNextPortal/WithNextPortal.js');
5
+ var Snackbar = require('./Snackbar.js');
6
+ var useSnackbarManager = require('./useSnackbarManager.js');
7
+ var jsxRuntime = require('react/jsx-runtime');
8
+
9
+ const PortalledSnackbar = WithNextPortal.default(Snackbar.SnackbarInternal);
10
+ const hasSnackbarText = text => text !== null && text !== undefined && text !== '';
11
+ const SnackbarPortal = ({
12
+ action,
13
+ duration,
14
+ loading,
15
+ media,
16
+ onDismiss,
17
+ sentiment,
18
+ text,
19
+ theme,
20
+ timeout,
21
+ timestamp
22
+ }) => {
23
+ const hasText = hasSnackbarText(text);
24
+ const previousTimestamp = React.useRef(timestamp);
25
+ const previousText = React.useRef(text);
26
+ const isInitialRender = React.useRef(true);
27
+ const {
28
+ active,
29
+ announcementKey,
30
+ dismissSnackbar,
31
+ handleExited,
32
+ showSnackbar,
33
+ updateSnackbar,
34
+ visible
35
+ } = useSnackbarManager.default(hasText ? {
36
+ action,
37
+ duration,
38
+ loading,
39
+ media,
40
+ onDismiss,
41
+ sentiment,
42
+ text,
43
+ theme,
44
+ timeout
45
+ } : undefined);
46
+ React.useEffect(() => {
47
+ if (isInitialRender.current) {
48
+ isInitialRender.current = false;
49
+ return;
50
+ }
51
+ if (!hasText) {
52
+ dismissSnackbar();
53
+ previousTimestamp.current = timestamp;
54
+ previousText.current = text;
55
+ return;
56
+ }
57
+ const snackbar = {
58
+ action,
59
+ duration,
60
+ loading,
61
+ media,
62
+ onDismiss,
63
+ sentiment,
64
+ text,
65
+ theme,
66
+ timeout
67
+ };
68
+ if (timestamp === undefined) {
69
+ // Without the legacy identity prop, update in place so recreated callbacks/media do not
70
+ // repeatedly restart the exit animation or auto-dismiss timer.
71
+ updateSnackbar(snackbar, !hasSnackbarText(previousText.current));
72
+ } else if (!hasSnackbarText(previousText.current) || previousTimestamp.current !== timestamp) {
73
+ showSnackbar(snackbar);
74
+ }
75
+ previousTimestamp.current = timestamp;
76
+ previousText.current = text;
77
+ }, [dismissSnackbar, showSnackbar, action, duration, hasText, loading, media, onDismiss, sentiment, text, theme, timeout, timestamp, updateSnackbar]);
78
+ if (!active) {
79
+ return null;
80
+ }
81
+ return /*#__PURE__*/jsxRuntime.jsx(PortalledSnackbar, {
82
+ ...active.props,
83
+ announcementKey: announcementKey,
84
+ visible: visible,
85
+ onDismissRequest: dismissSnackbar,
86
+ onExited: handleExited
87
+ });
88
+ };
89
+
90
+ exports.PortalledSnackbar = PortalledSnackbar;
91
+ exports.SnackbarPortal = SnackbarPortal;
92
+ //# sourceMappingURL=SnackbarPortal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SnackbarPortal.js","sources":["../../src/Snackbar/SnackbarPortal.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport withNextPortal from '../WithNextPortal/WithNextPortal';\nimport { SnackbarInternal } from './Snackbar';\nimport type { SnackbarPortalProps } from './Snackbar.types';\nimport useSnackbarManager from './useSnackbarManager';\n\nexport const PortalledSnackbar = withNextPortal(SnackbarInternal);\n\nconst hasSnackbarText = (text: SnackbarPortalProps['text']) =>\n text !== null && text !== undefined && text !== '';\n\nexport const SnackbarPortal = ({\n action,\n duration,\n loading,\n media,\n onDismiss,\n sentiment,\n text,\n theme,\n timeout,\n timestamp,\n}: SnackbarPortalProps) => {\n const hasText = hasSnackbarText(text);\n const previousTimestamp = useRef(timestamp);\n const previousText = useRef(text);\n const isInitialRender = useRef(true);\n const {\n active,\n announcementKey,\n dismissSnackbar,\n handleExited,\n showSnackbar,\n updateSnackbar,\n visible,\n } = useSnackbarManager(\n hasText\n ? { action, duration, loading, media, onDismiss, sentiment, text, theme, timeout }\n : undefined,\n );\n\n useEffect(() => {\n if (isInitialRender.current) {\n isInitialRender.current = false;\n return;\n }\n\n if (!hasText) {\n dismissSnackbar();\n previousTimestamp.current = timestamp;\n previousText.current = text;\n return;\n }\n\n const snackbar = {\n action,\n duration,\n loading,\n media,\n onDismiss,\n sentiment,\n text,\n theme,\n timeout,\n };\n\n if (timestamp === undefined) {\n // Without the legacy identity prop, update in place so recreated callbacks/media do not\n // repeatedly restart the exit animation or auto-dismiss timer.\n updateSnackbar(snackbar, !hasSnackbarText(previousText.current));\n } else if (!hasSnackbarText(previousText.current) || previousTimestamp.current !== timestamp) {\n showSnackbar(snackbar);\n }\n\n previousTimestamp.current = timestamp;\n previousText.current = text;\n }, [\n dismissSnackbar,\n showSnackbar,\n action,\n duration,\n hasText,\n loading,\n media,\n onDismiss,\n sentiment,\n text,\n theme,\n timeout,\n timestamp,\n updateSnackbar,\n ]);\n\n if (!active) {\n return null;\n }\n\n return (\n <PortalledSnackbar\n {...active.props}\n announcementKey={announcementKey}\n visible={visible}\n onDismissRequest={dismissSnackbar}\n onExited={handleExited}\n />\n );\n};\n\nexport default SnackbarPortal;\n"],"names":["PortalledSnackbar","withNextPortal","SnackbarInternal","hasSnackbarText","text","undefined","SnackbarPortal","action","duration","loading","media","onDismiss","sentiment","theme","timeout","timestamp","hasText","previousTimestamp","useRef","previousText","isInitialRender","active","announcementKey","dismissSnackbar","handleExited","showSnackbar","updateSnackbar","visible","useSnackbarManager","useEffect","current","snackbar","_jsx","props","onDismissRequest","onExited"],"mappings":";;;;;;;;MAOaA,iBAAiB,GAAGC,sBAAc,CAACC,yBAAgB;AAEhE,MAAMC,eAAe,GAAIC,IAAiC,IACxDA,IAAI,KAAK,IAAI,IAAIA,IAAI,KAAKC,SAAS,IAAID,IAAI,KAAK,EAAE;AAE7C,MAAME,cAAc,GAAGA,CAAC;EAC7BC,MAAM;EACNC,QAAQ;EACRC,OAAO;EACPC,KAAK;EACLC,SAAS;EACTC,SAAS;EACTR,IAAI;EACJS,KAAK;EACLC,OAAO;AACPC,EAAAA;AAAS,CACW,KAAI;AACxB,EAAA,MAAMC,OAAO,GAAGb,eAAe,CAACC,IAAI,CAAC;AACrC,EAAA,MAAMa,iBAAiB,GAAGC,YAAM,CAACH,SAAS,CAAC;AAC3C,EAAA,MAAMI,YAAY,GAAGD,YAAM,CAACd,IAAI,CAAC;AACjC,EAAA,MAAMgB,eAAe,GAAGF,YAAM,CAAC,IAAI,CAAC;EACpC,MAAM;IACJG,MAAM;IACNC,eAAe;IACfC,eAAe;IACfC,YAAY;IACZC,YAAY;IACZC,cAAc;AACdC,IAAAA;GACD,GAAGC,0BAAkB,CACpBZ,OAAO,GACH;IAAET,MAAM;IAAEC,QAAQ;IAAEC,OAAO;IAAEC,KAAK;IAAEC,SAAS;IAAEC,SAAS;IAAER,IAAI;IAAES,KAAK;AAAEC,IAAAA;GAAS,GAChFT,SAAS,CACd;AAEDwB,EAAAA,eAAS,CAAC,MAAK;IACb,IAAIT,eAAe,CAACU,OAAO,EAAE;MAC3BV,eAAe,CAACU,OAAO,GAAG,KAAK;AAC/B,MAAA;AACF,IAAA;IAEA,IAAI,CAACd,OAAO,EAAE;AACZO,MAAAA,eAAe,EAAE;MACjBN,iBAAiB,CAACa,OAAO,GAAGf,SAAS;MACrCI,YAAY,CAACW,OAAO,GAAG1B,IAAI;AAC3B,MAAA;AACF,IAAA;AAEA,IAAA,MAAM2B,QAAQ,GAAG;MACfxB,MAAM;MACNC,QAAQ;MACRC,OAAO;MACPC,KAAK;MACLC,SAAS;MACTC,SAAS;MACTR,IAAI;MACJS,KAAK;AACLC,MAAAA;KACD;IAED,IAAIC,SAAS,KAAKV,SAAS,EAAE;AAC3B;AACA;MACAqB,cAAc,CAACK,QAAQ,EAAE,CAAC5B,eAAe,CAACgB,YAAY,CAACW,OAAO,CAAC,CAAC;AAClE,IAAA,CAAC,MAAM,IAAI,CAAC3B,eAAe,CAACgB,YAAY,CAACW,OAAO,CAAC,IAAIb,iBAAiB,CAACa,OAAO,KAAKf,SAAS,EAAE;MAC5FU,YAAY,CAACM,QAAQ,CAAC;AACxB,IAAA;IAEAd,iBAAiB,CAACa,OAAO,GAAGf,SAAS;IACrCI,YAAY,CAACW,OAAO,GAAG1B,IAAI;AAC7B,EAAA,CAAC,EAAE,CACDmB,eAAe,EACfE,YAAY,EACZlB,MAAM,EACNC,QAAQ,EACRQ,OAAO,EACPP,OAAO,EACPC,KAAK,EACLC,SAAS,EACTC,SAAS,EACTR,IAAI,EACJS,KAAK,EACLC,OAAO,EACPC,SAAS,EACTW,cAAc,CACf,CAAC;EAEF,IAAI,CAACL,MAAM,EAAE;AACX,IAAA,OAAO,IAAI;AACb,EAAA;EAEA,oBACEW,cAAA,CAAChC,iBAAiB,EAAA;IAAA,GACZqB,MAAM,CAACY,KAAK;AAChBX,IAAAA,eAAe,EAAEA,eAAgB;AACjCK,IAAAA,OAAO,EAAEA,OAAQ;AACjBO,IAAAA,gBAAgB,EAAEX,eAAgB;AAClCY,IAAAA,QAAQ,EAAEX;AAAa,GAAA,CACvB;AAEN;;;"}