@transferwise/components 0.0.0-experimental-6e04f56 → 0.0.0-experimental-542ae69

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 (232) hide show
  1. package/build/Body/Body.js +1 -1
  2. package/build/Body/Body.js.map +1 -1
  3. package/build/Body/Body.mjs +1 -1
  4. package/build/Body/Body.mjs.map +1 -1
  5. package/build/Calendar/DayCalendar/Table/DayCalendarTable.js +1 -1
  6. package/build/Calendar/DayCalendar/Table/DayCalendarTable.js.map +1 -1
  7. package/build/Calendar/DayCalendar/Table/DayCalendarTable.mjs +1 -1
  8. package/build/Calendar/DayCalendar/Table/DayCalendarTable.mjs.map +1 -1
  9. package/build/Calendar/MonthCalendar/Table/MonthCalendarTable.js +1 -1
  10. package/build/Calendar/MonthCalendar/Table/MonthCalendarTable.js.map +1 -1
  11. package/build/Calendar/MonthCalendar/Table/MonthCalendarTable.mjs +1 -1
  12. package/build/Calendar/MonthCalendar/Table/MonthCalendarTable.mjs.map +1 -1
  13. package/build/Calendar/TableLink/TableLink.js +1 -1
  14. package/build/Calendar/TableLink/TableLink.js.map +1 -1
  15. package/build/Calendar/TableLink/TableLink.mjs +1 -1
  16. package/build/Calendar/TableLink/TableLink.mjs.map +1 -1
  17. package/build/FlowNavigation/AnimatedLabel/AnimatedLabel.js +1 -1
  18. package/build/FlowNavigation/AnimatedLabel/AnimatedLabel.js.map +1 -1
  19. package/build/FlowNavigation/AnimatedLabel/AnimatedLabel.mjs +1 -1
  20. package/build/FlowNavigation/AnimatedLabel/AnimatedLabel.mjs.map +1 -1
  21. package/build/Inputs/SelectInput/BottomSheet/SelectInputBottomSheet.js +2 -2
  22. package/build/Inputs/SelectInput/BottomSheet/SelectInputBottomSheet.js.map +1 -1
  23. package/build/Inputs/SelectInput/BottomSheet/SelectInputBottomSheet.mjs +2 -2
  24. package/build/Inputs/SelectInput/BottomSheet/SelectInputBottomSheet.mjs.map +1 -1
  25. package/build/Inputs/SelectInput/Option/SelectInputOption.js +1 -1
  26. package/build/Inputs/SelectInput/Option/SelectInputOption.js.map +1 -1
  27. package/build/Inputs/SelectInput/Option/SelectInputOption.mjs +1 -1
  28. package/build/Inputs/SelectInput/Option/SelectInputOption.mjs.map +1 -1
  29. package/build/Inputs/SelectInput/OptionContent/SelectInputOptionContent.js +3 -3
  30. package/build/Inputs/SelectInput/OptionContent/SelectInputOptionContent.js.map +1 -1
  31. package/build/Inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs +3 -3
  32. package/build/Inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs.map +1 -1
  33. package/build/Inputs/SelectInput/Popover/SelectInputPopover.js +2 -2
  34. package/build/Inputs/SelectInput/Popover/SelectInputPopover.js.map +1 -1
  35. package/build/Inputs/SelectInput/Popover/SelectInputPopover.mjs +2 -2
  36. package/build/Inputs/SelectInput/Popover/SelectInputPopover.mjs.map +1 -1
  37. package/build/Label/Label.js +1 -1
  38. package/build/Label/Label.js.map +1 -1
  39. package/build/Label/Label.mjs +1 -1
  40. package/build/Label/Label.mjs.map +1 -1
  41. package/build/Snackbar/Snackbar.js +101 -98
  42. package/build/Snackbar/Snackbar.js.map +1 -1
  43. package/build/Snackbar/Snackbar.mjs +102 -99
  44. package/build/Snackbar/Snackbar.mjs.map +1 -1
  45. package/build/Stepper/Stepper.js +1 -1
  46. package/build/Stepper/Stepper.js.map +1 -1
  47. package/build/Stepper/Stepper.mjs +1 -1
  48. package/build/Stepper/Stepper.mjs.map +1 -1
  49. package/build/Table/Header/TableHeader.js +1 -1
  50. package/build/Table/Header/TableHeader.js.map +1 -1
  51. package/build/Table/Header/TableHeader.mjs +1 -1
  52. package/build/Table/Header/TableHeader.mjs.map +1 -1
  53. package/build/Tabs/Tab/Tab.js +1 -1
  54. package/build/Tabs/Tab/Tab.js.map +1 -1
  55. package/build/Tabs/Tab/Tab.mjs +1 -1
  56. package/build/Tabs/Tab/Tab.mjs.map +1 -1
  57. package/build/Tag/Tag.js +1 -1
  58. package/build/Tag/Tag.js.map +1 -1
  59. package/build/Tag/Tag.mjs +1 -1
  60. package/build/Tag/Tag.mjs.map +1 -1
  61. package/build/Typeahead/TypeaheadOption/TypeaheadOption.js +2 -2
  62. package/build/Typeahead/TypeaheadOption/TypeaheadOption.js.map +1 -1
  63. package/build/Typeahead/TypeaheadOption/TypeaheadOption.mjs +2 -2
  64. package/build/Typeahead/TypeaheadOption/TypeaheadOption.mjs.map +1 -1
  65. package/build/Upload/Steps/UploadImageStep/UploadImageStep.js +2 -2
  66. package/build/Upload/Steps/UploadImageStep/UploadImageStep.js.map +1 -1
  67. package/build/Upload/Steps/UploadImageStep/UploadImageStep.mjs +2 -2
  68. package/build/Upload/Steps/UploadImageStep/UploadImageStep.mjs.map +1 -1
  69. package/build/_deprecated/ActionButton/ActionButton.js +1 -1
  70. package/build/_deprecated/ActionButton/ActionButton.js.map +1 -1
  71. package/build/_deprecated/ActionButton/ActionButton.mjs +1 -1
  72. package/build/_deprecated/ActionButton/ActionButton.mjs.map +1 -1
  73. package/build/_deprecated/Avatar/Avatar.js +1 -1
  74. package/build/_deprecated/Avatar/Avatar.js.map +1 -1
  75. package/build/_deprecated/Avatar/Avatar.mjs +1 -1
  76. package/build/_deprecated/Avatar/Avatar.mjs.map +1 -1
  77. package/build/_deprecated/Select/Select.js +2 -2
  78. package/build/_deprecated/Select/Select.js.map +1 -1
  79. package/build/_deprecated/Select/Select.mjs +2 -2
  80. package/build/_deprecated/Select/Select.mjs.map +1 -1
  81. package/build/common/PropsValues/typography.js +6 -0
  82. package/build/common/PropsValues/typography.js.map +1 -1
  83. package/build/common/PropsValues/typography.mjs +6 -0
  84. package/build/common/PropsValues/typography.mjs.map +1 -1
  85. package/build/main.css +2907 -1535
  86. package/build/styles/Accordion/Accordion.css +2 -1
  87. package/build/styles/Body/Body.css +1 -1
  88. package/build/styles/Chips/Chip/Chip.css +4 -2
  89. package/build/styles/Decision/Decision.css +2 -1
  90. package/build/styles/Inputs/Input/Input.css +62 -66
  91. package/build/styles/Inputs/TextArea/TextArea.css +62 -66
  92. package/build/styles/MoneyInput/MoneyInput.css +6 -3
  93. package/build/styles/Popover/Popover.css +3 -47
  94. package/build/styles/ProgressBar/ProgressBar.css +2 -1
  95. package/build/styles/Table/Table.css +15 -5
  96. package/build/styles/Tile/Tile.css +2 -1
  97. package/build/styles/Typeahead/Typeahead.css +4 -2
  98. package/build/styles/_deprecated/CriticalBanner/CriticalCommsBanner.css +2 -1
  99. package/build/styles/_deprecated/Select/Select.css +44 -11
  100. package/build/styles/css/accordion.css +23 -52
  101. package/build/styles/css/button-groups.css +29 -8
  102. package/build/styles/css/buttons.css +26 -2
  103. package/build/styles/css/decision.css +23 -52
  104. package/build/styles/css/dropdowns.css +39 -62
  105. package/build/styles/css/droppable.css +28 -8
  106. package/build/styles/css/footer.css +41 -14
  107. package/build/styles/css/input-groups.css +172 -165
  108. package/build/styles/css/list-group.css +0 -45
  109. package/build/styles/css/navbar.css +39 -62
  110. package/build/styles/css/neptune-addons.css +15 -0
  111. package/build/styles/css/neptune-core.css +250 -526
  112. package/build/styles/css/neptune.css +2759 -1422
  113. package/build/styles/css/popovers.css +35 -60
  114. package/build/styles/css/sequences.css +6 -1
  115. package/build/styles/css/tooltip.css +27 -7
  116. package/build/styles/less/neptune-tokens.less +0 -48
  117. package/build/styles/main.css +2907 -1535
  118. package/build/styles/props/neptune-tokens.css +793 -1
  119. package/build/styles/styles/less/accordion.css +23 -52
  120. package/build/styles/styles/less/button-groups.css +29 -8
  121. package/build/styles/styles/less/buttons.css +26 -2
  122. package/build/styles/styles/less/decision.css +23 -52
  123. package/build/styles/styles/less/dropdowns.css +39 -62
  124. package/build/styles/styles/less/droppable.css +28 -8
  125. package/build/styles/styles/less/footer.css +41 -14
  126. package/build/styles/styles/less/forms/bootstrap-forms.css +137 -91
  127. package/build/styles/styles/less/input-groups.css +172 -165
  128. package/build/styles/styles/less/list-group.css +0 -45
  129. package/build/styles/styles/less/navbar.css +39 -62
  130. package/build/styles/styles/less/neptune-addons.css +15 -0
  131. package/build/styles/styles/less/neptune-core.css +250 -526
  132. package/build/styles/styles/less/neptune.css +2759 -1422
  133. package/build/styles/styles/less/popovers.css +35 -60
  134. package/build/styles/styles/less/sequences.css +6 -1
  135. package/build/styles/styles/less/tooltip.css +27 -7
  136. package/build/types/Snackbar/Snackbar.d.ts +15 -1
  137. package/build/types/Snackbar/Snackbar.d.ts.map +1 -1
  138. package/build/types/common/PropsValues/typography.d.ts +13 -1
  139. package/build/types/common/PropsValues/typography.d.ts.map +1 -1
  140. package/package.json +1 -1
  141. package/src/Accordion/Accordion.css +2 -1
  142. package/src/Accordion/Accordion.less +2 -1
  143. package/src/Body/Body.css +1 -1
  144. package/src/Body/Body.less +1 -1
  145. package/src/Body/Body.test.tsx +4 -4
  146. package/src/Body/Body.tsx +2 -2
  147. package/src/Calendar/DayCalendar/Table/DayCalendarTable.tsx +2 -2
  148. package/src/Calendar/MonthCalendar/Table/MonthCalendarTable.tsx +1 -1
  149. package/src/Calendar/TableLink/TableLink.tsx +1 -1
  150. package/src/Chips/Chip/Chip.css +4 -2
  151. package/src/Chips/Chip/Chip.less +2 -1
  152. package/src/Decision/Decision.css +2 -1
  153. package/src/Decision/Decision.less +2 -1
  154. package/src/DefinitionList/_stories/DefinitionList.story.tsx +1 -1
  155. package/src/Display/_stories/Display.story.tsx +20 -6
  156. package/src/FlowNavigation/AnimatedLabel/AnimatedLabel.tsx +1 -1
  157. package/src/Inputs/Input/Input.css +62 -66
  158. package/src/Inputs/SelectInput/BottomSheet/SelectInputBottomSheet.tsx +2 -2
  159. package/src/Inputs/SelectInput/Option/SelectInputOption.tsx +1 -1
  160. package/src/Inputs/SelectInput/OptionContent/SelectInputOptionContent.tsx +3 -3
  161. package/src/Inputs/SelectInput/Popover/SelectInputPopover.tsx +2 -2
  162. package/src/Inputs/SelectInput/_stories/SelectInput.story.tsx +1 -1
  163. package/src/Inputs/TextArea/TextArea.css +62 -66
  164. package/src/Inputs/_common.less +5 -5
  165. package/src/Label/Label.tsx +1 -1
  166. package/src/MoneyInput/MoneyInput.css +6 -3
  167. package/src/MoneyInput/MoneyInput.less +7 -4
  168. package/src/PocketSurface/_stories/PocketSurface.story.tsx +2 -2
  169. package/src/Popover/Popover.css +3 -47
  170. package/src/Popover/Popover.less +1 -1
  171. package/src/ProgressBar/ProgressBar.css +2 -1
  172. package/src/ProgressBar/ProgressBar.less +12 -11
  173. package/src/SentimentSurface/_stories/SentimentSurface.story.tsx +1 -1
  174. package/src/Snackbar/Snackbar.tsx +88 -90
  175. package/src/Stepper/Stepper.tsx +1 -1
  176. package/src/Table/Header/TableHeader.tsx +1 -1
  177. package/src/Table/StatusText/TableStatusText.test.tsx +5 -5
  178. package/src/Table/Table.css +15 -5
  179. package/src/Table/Table.less +17 -6
  180. package/src/Tabs/Tab/Tab.tsx +1 -1
  181. package/src/Tag/Tag.tsx +1 -1
  182. package/src/Tag/_stories/Tag.story.tsx +1 -1
  183. package/src/Tile/Tile.css +2 -1
  184. package/src/Tile/Tile.less +2 -1
  185. package/src/Typeahead/Typeahead.css +4 -2
  186. package/src/Typeahead/Typeahead.less +2 -1
  187. package/src/Typeahead/TypeaheadOption/TypeaheadOption.tsx +2 -2
  188. package/src/Upload/Steps/UploadImageStep/UploadImageStep.tsx +2 -2
  189. package/src/_deprecated/ActionButton/ActionButton.tsx +1 -1
  190. package/src/_deprecated/Avatar/Avatar.tsx +1 -1
  191. package/src/_deprecated/CriticalBanner/CriticalCommsBanner.css +2 -1
  192. package/src/_deprecated/CriticalBanner/CriticalCommsBanner.less +2 -1
  193. package/src/_deprecated/NavigationOption/_stories/NavigationOption.story.tsx +6 -6
  194. package/src/_deprecated/Select/Select.css +44 -11
  195. package/src/_deprecated/Select/Select.less +10 -5
  196. package/src/_deprecated/Select/Select.tsx +2 -2
  197. package/src/common/PropsValues/typography.ts +20 -1
  198. package/src/main.css +2907 -1535
  199. package/src/styles/less/accordion.css +23 -52
  200. package/src/styles/less/addons/_background-utilities.less +5 -0
  201. package/src/styles/less/button-groups.css +29 -8
  202. package/src/styles/less/button-groups.less +3 -2
  203. package/src/styles/less/buttons.css +26 -2
  204. package/src/styles/less/buttons.less +1 -1
  205. package/src/styles/less/core/_typography.less +67 -221
  206. package/src/styles/less/decision.css +23 -52
  207. package/src/styles/less/decision.less +2 -2
  208. package/src/styles/less/dropdowns.css +39 -62
  209. package/src/styles/less/dropdowns.less +6 -5
  210. package/src/styles/less/droppable.css +28 -8
  211. package/src/styles/less/droppable.less +4 -4
  212. package/src/styles/less/footer.css +41 -14
  213. package/src/styles/less/footer.less +4 -3
  214. package/src/styles/less/forms/bootstrap-forms.css +137 -91
  215. package/src/styles/less/forms/bootstrap-forms.less +70 -57
  216. package/src/styles/less/input-groups.css +172 -165
  217. package/src/styles/less/input-groups.less +5 -5
  218. package/src/styles/less/list-group.css +0 -45
  219. package/src/styles/less/list-group.less +7 -4
  220. package/src/styles/less/mixins/_text-emphasis.less +7 -1
  221. package/src/styles/less/navbar.css +39 -62
  222. package/src/styles/less/neptune-addons.css +15 -0
  223. package/src/styles/less/neptune-core.css +250 -526
  224. package/src/styles/less/neptune.bundle.less +4 -0
  225. package/src/styles/less/neptune.css +2759 -1422
  226. package/src/styles/less/popovers.css +35 -60
  227. package/src/styles/less/popovers.less +3 -3
  228. package/src/styles/less/sequences.css +6 -1
  229. package/src/styles/less/sequences.less +7 -2
  230. package/src/styles/less/tooltip.css +27 -7
  231. package/src/styles/less/tooltip.less +1 -1
  232. package/src/Snackbar/Snackbar.test.tsx +0 -190
@@ -6,121 +6,124 @@ var React = require('react');
6
6
  var reactTransitionGroup = require('react-transition-group');
7
7
  var Button_resolver = require('../Button/Button.resolver.js');
8
8
  var Body = require('../Body/Body.js');
9
+ var DirectionProvider = require('../Provider/Direction/DirectionProvider.js');
9
10
  var WithNextPortal = require('../WithNextPortal/WithNextPortal.js');
10
11
  var jsxRuntime = require('react/jsx-runtime');
11
12
 
12
13
  const CSS_TRANSITION_DURATION = 400;
13
- const Snackbar = props => {
14
- const bodyRef = React.useRef(null);
15
- const leaveTimeout = React.useRef(0);
16
- const transitionTimeout = React.useRef(0);
17
- /** The props of the last committed render, as `this.props` was in the class component. */
18
- const committedProps = React.useRef(props);
19
- const [state, setState] = React.useState({
20
- visible: false,
21
- text: ''
22
- });
23
- React.useEffect(() => () => {
24
- window.clearTimeout(leaveTimeout.current);
25
- window.clearTimeout(transitionTimeout.current);
26
- }, []);
27
- // Runs after every render to mirror the componentDidUpdate lifecycle this component previously
28
- // relied on, including the shouldComponentUpdate guard that ignored every update without text.
29
- // Both rules below are disabled on purpose: the dependency-less effect and its synchronous state
30
- // updates are what keep this conversion behaviour-identical to the class component.
31
- /* eslint-disable react-hooks/exhaustive-deps, react-hooks/set-state-in-effect */
32
- React.useEffect(() => {
33
- const previousProps = committedProps.current;
34
- committedProps.current = props;
14
+ class Snackbar extends React.Component {
15
+ bodyRef = /*#__PURE__*/React.createRef();
16
+ timeout = 0;
17
+ transitionTimeout = 0;
18
+ constructor(props) {
19
+ super(props);
20
+ this.state = {
21
+ visible: false,
22
+ text: ''
23
+ };
24
+ }
25
+ componentWillUnmount() {
26
+ window.clearTimeout(this.timeout);
27
+ window.clearTimeout(this.transitionTimeout);
28
+ }
29
+ shouldComponentUpdate(nextProps, nextState) {
30
+ if (!nextProps.text) {
31
+ return false;
32
+ }
33
+ if (nextProps.timestamp === this.props.timestamp && nextState.visible === this.state.visible && nextState.text === this.state.text) {
34
+ return false;
35
+ }
36
+ return true;
37
+ }
38
+ setLeaveTimeout = () => {
39
+ const {
40
+ timeout
41
+ } = this.props;
42
+ this.timeout = window.setTimeout(() => {
43
+ this.setState({
44
+ visible: false
45
+ });
46
+ }, timeout);
47
+ };
48
+ componentDidUpdate(previousProps) {
35
49
  const {
36
50
  action,
37
51
  text,
38
- timeout,
39
52
  timestamp
40
- } = props;
41
- // shouldComponentUpdate bailed out whenever the incoming text was empty. That also blocked the
42
- // updates scheduled below, so a Snackbar whose text is cleared stays on screen until it is
43
- // given text again. Preserved here deliberately to keep this refactor behaviour-identical.
44
- const updateWhileTextIsPresent = update => {
45
- if (committedProps.current.text) {
46
- update();
47
- }
48
- };
49
- const setLeaveTimeout = () => {
50
- leaveTimeout.current = window.setTimeout(() => {
51
- updateWhileTextIsPresent(() => setState(current => ({
52
- ...current,
53
- visible: false
54
- })));
55
- }, timeout);
56
- };
57
- const show = () => {
58
- setState(current => ({
59
- ...current,
53
+ } = this.props;
54
+ if (!previousProps.text) {
55
+ this.setState({
60
56
  visible: true,
61
57
  action,
62
58
  text
63
- }));
64
- setLeaveTimeout();
65
- };
66
- if (!text) {
67
- return;
68
- }
69
- if (!previousProps.text) {
70
- show();
59
+ }, () => {
60
+ this.setLeaveTimeout();
61
+ });
71
62
  } else if (previousProps.timestamp !== timestamp) {
72
- window.clearTimeout(leaveTimeout.current);
73
- if (state.visible) {
74
- setState(current => ({
75
- ...current,
63
+ window.clearTimeout(this.timeout);
64
+ if (this.state.visible) {
65
+ this.setState({
76
66
  visible: false
77
- }));
78
- transitionTimeout.current = window.setTimeout(() => {
79
- updateWhileTextIsPresent(show);
80
- }, CSS_TRANSITION_DURATION);
67
+ }, () => {
68
+ this.transitionTimeout = window.setTimeout(() => {
69
+ this.setState({
70
+ visible: true,
71
+ action,
72
+ text
73
+ });
74
+ this.setLeaveTimeout();
75
+ }, CSS_TRANSITION_DURATION);
76
+ });
81
77
  } else {
82
- show();
78
+ this.setState({
79
+ visible: true,
80
+ action,
81
+ text
82
+ });
83
+ this.setLeaveTimeout();
83
84
  }
84
85
  }
85
- });
86
- /* eslint-enable react-hooks/exhaustive-deps, react-hooks/set-state-in-effect */
87
- const {
88
- action,
89
- text,
90
- visible
91
- } = state;
92
- const {
93
- timeout
94
- } = props;
95
- return /*#__PURE__*/jsxRuntime.jsx("div", {
96
- className: "snackbar",
97
- "aria-live": "assertive",
98
- role: "alert",
99
- children: /*#__PURE__*/jsxRuntime.jsx(reactTransitionGroup.CSSTransition, {
100
- nodeRef: bodyRef,
101
- in: visible,
102
- classNames: "snackbar__text-container",
103
- timeout: {
104
- appear: 0,
105
- enter: timeout,
106
- exit: CSS_TRANSITION_DURATION
107
- },
108
- unmountOnExit: true,
109
- children: /*#__PURE__*/jsxRuntime.jsxs(Body.default, {
110
- ref: bodyRef,
111
- as: "span",
112
- className: "snackbar__text",
113
- children: [text, action ? /*#__PURE__*/jsxRuntime.jsx(Button_resolver.default, {
114
- className: "snackbar__text__action",
115
- v2: true,
116
- size: "sm",
117
- onClick: action.onClick,
118
- children: action.label
119
- }) : null]
86
+ }
87
+ render() {
88
+ const {
89
+ action,
90
+ text,
91
+ visible
92
+ } = this.state;
93
+ const {
94
+ timeout
95
+ } = this.props;
96
+ return /*#__PURE__*/jsxRuntime.jsx("div", {
97
+ className: "snackbar",
98
+ "aria-live": "assertive",
99
+ role: "alert",
100
+ children: /*#__PURE__*/jsxRuntime.jsx(reactTransitionGroup.CSSTransition, {
101
+ nodeRef: this.bodyRef,
102
+ in: visible,
103
+ classNames: "snackbar__text-container",
104
+ timeout: {
105
+ appear: 0,
106
+ enter: timeout,
107
+ exit: CSS_TRANSITION_DURATION
108
+ },
109
+ unmountOnExit: true,
110
+ children: /*#__PURE__*/jsxRuntime.jsxs(Body.default, {
111
+ ref: this.bodyRef,
112
+ as: "span",
113
+ className: "snackbar__text",
114
+ children: [text, action ? /*#__PURE__*/jsxRuntime.jsx(Button_resolver.default, {
115
+ className: "snackbar__text__action",
116
+ v2: true,
117
+ size: "sm",
118
+ onClick: action.onClick,
119
+ children: action.label
120
+ }) : null]
121
+ })
120
122
  })
121
- })
122
- });
123
- };
123
+ });
124
+ }
125
+ }
126
+ Snackbar.contextType = DirectionProvider.DirectionContext;
124
127
  var SnackbarPortal = WithNextPortal.default(Snackbar);
125
128
 
126
129
  exports.Snackbar = Snackbar;
@@ -1 +1 @@
1
- {"version":3,"file":"Snackbar.js","sources":["../../src/Snackbar/Snackbar.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { CSSTransition } from 'react-transition-group';\n\nimport Button from '../Button';\nimport Body from '../Body';\nimport type { ThemeDark, ThemeLight } from '../common';\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 const Snackbar = (props: SnackbarProps) => {\n const bodyRef = useRef<HTMLSpanElement>(null);\n const leaveTimeout = useRef(0);\n const transitionTimeout = useRef(0);\n /** The props of the last committed render, as `this.props` was in the class component. */\n const committedProps = useRef(props);\n\n const [state, setState] = useState<SnackbarState>({\n visible: false,\n text: '',\n });\n\n useEffect(\n () => () => {\n window.clearTimeout(leaveTimeout.current);\n window.clearTimeout(transitionTimeout.current);\n },\n [],\n );\n\n // Runs after every render to mirror the componentDidUpdate lifecycle this component previously\n // relied on, including the shouldComponentUpdate guard that ignored every update without text.\n // Both rules below are disabled on purpose: the dependency-less effect and its synchronous state\n // updates are what keep this conversion behaviour-identical to the class component.\n /* eslint-disable react-hooks/exhaustive-deps, react-hooks/set-state-in-effect */\n useEffect(() => {\n const previousProps = committedProps.current;\n committedProps.current = props;\n\n const { action, text, timeout, timestamp } = props;\n\n // shouldComponentUpdate bailed out whenever the incoming text was empty. That also blocked the\n // updates scheduled below, so a Snackbar whose text is cleared stays on screen until it is\n // given text again. Preserved here deliberately to keep this refactor behaviour-identical.\n const updateWhileTextIsPresent = (update: () => void) => {\n if (committedProps.current.text) {\n update();\n }\n };\n\n const setLeaveTimeout = () => {\n leaveTimeout.current = window.setTimeout(() => {\n updateWhileTextIsPresent(() => setState((current) => ({ ...current, visible: false })));\n }, timeout);\n };\n\n const show = () => {\n setState((current) => ({ ...current, visible: true, action, text }));\n setLeaveTimeout();\n };\n\n if (!text) {\n return;\n }\n\n if (!previousProps.text) {\n show();\n } else if (previousProps.timestamp !== timestamp) {\n window.clearTimeout(leaveTimeout.current);\n\n if (state.visible) {\n setState((current) => ({ ...current, visible: false }));\n transitionTimeout.current = window.setTimeout(() => {\n updateWhileTextIsPresent(show);\n }, CSS_TRANSITION_DURATION);\n } else {\n show();\n }\n }\n });\n /* eslint-enable react-hooks/exhaustive-deps, react-hooks/set-state-in-effect */\n\n const { action, text, visible } = state;\n const { timeout } = props;\n\n return (\n <div className=\"snackbar\" aria-live=\"assertive\" role=\"alert\">\n <CSSTransition\n nodeRef={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={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\nexport default withNextPortal(Snackbar);\n"],"names":["CSS_TRANSITION_DURATION","Snackbar","props","bodyRef","useRef","leaveTimeout","transitionTimeout","committedProps","state","setState","useState","visible","text","useEffect","window","clearTimeout","current","previousProps","action","timeout","timestamp","updateWhileTextIsPresent","update","setLeaveTimeout","setTimeout","show","_jsx","className","role","children","CSSTransition","nodeRef","in","classNames","appear","enter","exit","unmountOnExit","_jsxs","Body","ref","as","Button","v2","size","onClick","label","withNextPortal"],"mappings":"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"}
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,122 +1,125 @@
1
- import { useRef, useState, useEffect } from 'react';
1
+ import { Component, createRef } from 'react';
2
2
  import { CSSTransition } from 'react-transition-group';
3
3
  import Button from '../Button/Button.resolver.mjs';
4
4
  import Body from '../Body/Body.mjs';
5
+ import { DirectionContext } from '../Provider/Direction/DirectionProvider.mjs';
5
6
  import withNextPortalWrapper from '../WithNextPortal/WithNextPortal.mjs';
6
7
  import { jsx, jsxs } from 'react/jsx-runtime';
7
8
 
8
9
  const CSS_TRANSITION_DURATION = 400;
9
- const Snackbar = props => {
10
- const bodyRef = useRef(null);
11
- const leaveTimeout = useRef(0);
12
- const transitionTimeout = useRef(0);
13
- /** The props of the last committed render, as `this.props` was in the class component. */
14
- const committedProps = useRef(props);
15
- const [state, setState] = useState({
16
- visible: false,
17
- text: ''
18
- });
19
- useEffect(() => () => {
20
- window.clearTimeout(leaveTimeout.current);
21
- window.clearTimeout(transitionTimeout.current);
22
- }, []);
23
- // Runs after every render to mirror the componentDidUpdate lifecycle this component previously
24
- // relied on, including the shouldComponentUpdate guard that ignored every update without text.
25
- // Both rules below are disabled on purpose: the dependency-less effect and its synchronous state
26
- // updates are what keep this conversion behaviour-identical to the class component.
27
- /* eslint-disable react-hooks/exhaustive-deps, react-hooks/set-state-in-effect */
28
- useEffect(() => {
29
- const previousProps = committedProps.current;
30
- committedProps.current = props;
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;
28
+ }
29
+ if (nextProps.timestamp === this.props.timestamp && nextState.visible === this.state.visible && nextState.text === this.state.text) {
30
+ return false;
31
+ }
32
+ return true;
33
+ }
34
+ setLeaveTimeout = () => {
35
+ const {
36
+ timeout
37
+ } = this.props;
38
+ this.timeout = window.setTimeout(() => {
39
+ this.setState({
40
+ visible: false
41
+ });
42
+ }, timeout);
43
+ };
44
+ componentDidUpdate(previousProps) {
31
45
  const {
32
46
  action,
33
47
  text,
34
- timeout,
35
48
  timestamp
36
- } = props;
37
- // shouldComponentUpdate bailed out whenever the incoming text was empty. That also blocked the
38
- // updates scheduled below, so a Snackbar whose text is cleared stays on screen until it is
39
- // given text again. Preserved here deliberately to keep this refactor behaviour-identical.
40
- const updateWhileTextIsPresent = update => {
41
- if (committedProps.current.text) {
42
- update();
43
- }
44
- };
45
- const setLeaveTimeout = () => {
46
- leaveTimeout.current = window.setTimeout(() => {
47
- updateWhileTextIsPresent(() => setState(current => ({
48
- ...current,
49
- visible: false
50
- })));
51
- }, timeout);
52
- };
53
- const show = () => {
54
- setState(current => ({
55
- ...current,
49
+ } = this.props;
50
+ if (!previousProps.text) {
51
+ this.setState({
56
52
  visible: true,
57
53
  action,
58
54
  text
59
- }));
60
- setLeaveTimeout();
61
- };
62
- if (!text) {
63
- return;
64
- }
65
- if (!previousProps.text) {
66
- show();
55
+ }, () => {
56
+ this.setLeaveTimeout();
57
+ });
67
58
  } else if (previousProps.timestamp !== timestamp) {
68
- window.clearTimeout(leaveTimeout.current);
69
- if (state.visible) {
70
- setState(current => ({
71
- ...current,
59
+ window.clearTimeout(this.timeout);
60
+ if (this.state.visible) {
61
+ this.setState({
72
62
  visible: false
73
- }));
74
- transitionTimeout.current = window.setTimeout(() => {
75
- updateWhileTextIsPresent(show);
76
- }, CSS_TRANSITION_DURATION);
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
+ });
77
73
  } else {
78
- show();
74
+ this.setState({
75
+ visible: true,
76
+ action,
77
+ text
78
+ });
79
+ this.setLeaveTimeout();
79
80
  }
80
81
  }
81
- });
82
- /* eslint-enable react-hooks/exhaustive-deps, react-hooks/set-state-in-effect */
83
- const {
84
- action,
85
- text,
86
- visible
87
- } = state;
88
- const {
89
- timeout
90
- } = props;
91
- return /*#__PURE__*/jsx("div", {
92
- className: "snackbar",
93
- "aria-live": "assertive",
94
- role: "alert",
95
- children: /*#__PURE__*/jsx(CSSTransition, {
96
- nodeRef: bodyRef,
97
- in: visible,
98
- classNames: "snackbar__text-container",
99
- timeout: {
100
- appear: 0,
101
- enter: timeout,
102
- exit: CSS_TRANSITION_DURATION
103
- },
104
- unmountOnExit: true,
105
- children: /*#__PURE__*/jsxs(Body, {
106
- ref: bodyRef,
107
- as: "span",
108
- className: "snackbar__text",
109
- children: [text, action ? /*#__PURE__*/jsx(Button, {
110
- className: "snackbar__text__action",
111
- v2: true,
112
- size: "sm",
113
- onClick: action.onClick,
114
- children: action.label
115
- }) : null]
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",
112
+ v2: true,
113
+ size: "sm",
114
+ onClick: action.onClick,
115
+ children: action.label
116
+ }) : null]
117
+ })
116
118
  })
117
- })
118
- });
119
- };
119
+ });
120
+ }
121
+ }
122
+ Snackbar.contextType = DirectionContext;
120
123
  var SnackbarPortal = withNextPortalWrapper(Snackbar);
121
124
 
122
125
  export { Snackbar, SnackbarPortal as default };
@@ -1 +1 @@
1
- {"version":3,"file":"Snackbar.mjs","sources":["../../src/Snackbar/Snackbar.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\nimport { CSSTransition } from 'react-transition-group';\n\nimport Button from '../Button';\nimport Body from '../Body';\nimport type { ThemeDark, ThemeLight } from '../common';\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 const Snackbar = (props: SnackbarProps) => {\n const bodyRef = useRef<HTMLSpanElement>(null);\n const leaveTimeout = useRef(0);\n const transitionTimeout = useRef(0);\n /** The props of the last committed render, as `this.props` was in the class component. */\n const committedProps = useRef(props);\n\n const [state, setState] = useState<SnackbarState>({\n visible: false,\n text: '',\n });\n\n useEffect(\n () => () => {\n window.clearTimeout(leaveTimeout.current);\n window.clearTimeout(transitionTimeout.current);\n },\n [],\n );\n\n // Runs after every render to mirror the componentDidUpdate lifecycle this component previously\n // relied on, including the shouldComponentUpdate guard that ignored every update without text.\n // Both rules below are disabled on purpose: the dependency-less effect and its synchronous state\n // updates are what keep this conversion behaviour-identical to the class component.\n /* eslint-disable react-hooks/exhaustive-deps, react-hooks/set-state-in-effect */\n useEffect(() => {\n const previousProps = committedProps.current;\n committedProps.current = props;\n\n const { action, text, timeout, timestamp } = props;\n\n // shouldComponentUpdate bailed out whenever the incoming text was empty. That also blocked the\n // updates scheduled below, so a Snackbar whose text is cleared stays on screen until it is\n // given text again. Preserved here deliberately to keep this refactor behaviour-identical.\n const updateWhileTextIsPresent = (update: () => void) => {\n if (committedProps.current.text) {\n update();\n }\n };\n\n const setLeaveTimeout = () => {\n leaveTimeout.current = window.setTimeout(() => {\n updateWhileTextIsPresent(() => setState((current) => ({ ...current, visible: false })));\n }, timeout);\n };\n\n const show = () => {\n setState((current) => ({ ...current, visible: true, action, text }));\n setLeaveTimeout();\n };\n\n if (!text) {\n return;\n }\n\n if (!previousProps.text) {\n show();\n } else if (previousProps.timestamp !== timestamp) {\n window.clearTimeout(leaveTimeout.current);\n\n if (state.visible) {\n setState((current) => ({ ...current, visible: false }));\n transitionTimeout.current = window.setTimeout(() => {\n updateWhileTextIsPresent(show);\n }, CSS_TRANSITION_DURATION);\n } else {\n show();\n }\n }\n });\n /* eslint-enable react-hooks/exhaustive-deps, react-hooks/set-state-in-effect */\n\n const { action, text, visible } = state;\n const { timeout } = props;\n\n return (\n <div className=\"snackbar\" aria-live=\"assertive\" role=\"alert\">\n <CSSTransition\n nodeRef={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={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\nexport default withNextPortal(Snackbar);\n"],"names":["CSS_TRANSITION_DURATION","Snackbar","props","bodyRef","useRef","leaveTimeout","transitionTimeout","committedProps","state","setState","useState","visible","text","useEffect","window","clearTimeout","current","previousProps","action","timeout","timestamp","updateWhileTextIsPresent","update","setLeaveTimeout","setTimeout","show","_jsx","className","role","children","CSSTransition","nodeRef","in","classNames","appear","enter","exit","unmountOnExit","_jsxs","Body","ref","as","Button","v2","size","onClick","label","withNextPortal"],"mappings":"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"}
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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"}
@@ -81,7 +81,7 @@ const Stepper = ({
81
81
  children: step.label
82
82
  });
83
83
  return /*#__PURE__*/jsxRuntime.jsx("li", {
84
- className: clsx.clsx('hidden-xs', 'tw-stepper__step', active ? 'np-text-body-default-bold tw-stepper__step--active' : 'np-text-body-default', clickable && 'tw-stepper__step--clickable', step.hoverLabel && 'tw-stepper__step--has-tooltip'),
84
+ className: clsx.clsx('hidden-xs', 'tw-stepper__step', active ? 'wds-text-body-default-bold tw-stepper__step--active' : 'wds-text-body-default', clickable && 'tw-stepper__step--clickable', step.hoverLabel && 'tw-stepper__step--has-tooltip'),
85
85
  "aria-current": active ? 'step' : false,
86
86
  style: isRTL ? {
87
87
  right: `${index * stepPercentage * 100}%`
@@ -1 +1 @@
1
- {"version":3,"file":"Stepper.js","sources":["../../src/Stepper/Stepper.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport * as React from 'react';\n\nimport { Position } from '../common';\nimport { useDirection } from '../common/hooks';\nimport Tooltip from '../Tooltip';\n\nimport { isTouchDevice } from './deviceDetection';\n\nfunction clamp(from: number, to: number, value: number) {\n return Math.max(Math.min(to, value), from);\n}\n\nexport interface Step {\n label: React.ReactNode;\n onClick?: () => void;\n hoverLabel?: React.ReactNode;\n}\n\nexport interface StepperProps {\n steps: readonly Step[];\n activeStep?: number;\n className?: string;\n testId?: string;\n}\n\n/**\n * This component is considered user-unfriendly and inaccessible on its own and will likely be made internal in the future. Please use `FlowNavigation` instead.\n * @see https://storybook.wise.design/?path=/story/navigation-flownavigation--variants\n */\nconst Stepper = ({ steps, activeStep = 0, className, testId }: StepperProps) => {\n const { isRTL } = useDirection();\n\n if (steps.length === 0) {\n return null;\n }\n\n const activeStepIndex = clamp(0, steps.length - 1, activeStep);\n const stepPercentage = 1 / (steps.length - 1);\n const percentageCompleted = activeStepIndex / (steps.length - 1);\n\n const getProgressWidth = (): string => {\n if (percentageCompleted === 0) {\n return '0%';\n }\n /**\n * Progress bar starts with left/right (depends on rtl) shift `--progress-bar-start-shift` for hiding Progress bar's left and right borders\n * which are used for progress vertical delimiter.\n * When progress is completed, we need to add `--progress-bar-border-width` to the width to allow the right border be outside of the progress area.\n */\n return `calc(${percentageCompleted * 100}% + var(--progress-bar-start-shift) + var(--progress-bar-border-width))`;\n };\n\n const renderStep = (step: Step, index: number) => {\n const active = index === activeStepIndex;\n const clickable = step.onClick && !active;\n\n const labelButton = clickable ? (\n <button\n type=\"button\"\n className=\"btn-unstyled tw-stepper__step-label\"\n onClick={() => clickable && step.onClick?.()}\n >\n <small>{step.label}</small>\n </button>\n ) : (\n <span className=\"tw-stepper__step-label\">{step.label}</span>\n );\n\n return (\n <li\n key={index}\n className={clsx(\n 'hidden-xs',\n 'tw-stepper__step',\n active ? 'np-text-body-default-bold tw-stepper__step--active' : 'np-text-body-default',\n clickable && 'tw-stepper__step--clickable',\n step.hoverLabel && 'tw-stepper__step--has-tooltip',\n )}\n aria-current={active ? 'step' : false}\n style={\n isRTL\n ? { right: `${index * stepPercentage * 100}%` }\n : { left: `${index * stepPercentage * 100}%` }\n }\n >\n {step.hoverLabel && !isTouchDevice() ? (\n <Tooltip position={Position.BOTTOM} label={step.hoverLabel}>\n {labelButton}\n </Tooltip>\n ) : (\n labelButton\n )}\n </li>\n );\n };\n\n return (\n <div className={clsx('tw-stepper', className)} data-testid={testId}>\n <div className=\"progress\">\n <div\n className=\"progress-bar\"\n style={{ width: getProgressWidth() }}\n data-testid=\"progress-bar\"\n />\n </div>\n <ol className=\"tw-stepper-steps p-t-1 m-b-0\">{steps.map(renderStep)}</ol>\n </div>\n );\n};\n\nexport default Stepper;\n"],"names":["clamp","from","to","value","Math","max","min","Stepper","steps","activeStep","className","testId","isRTL","useDirection","length","activeStepIndex","stepPercentage","percentageCompleted","getProgressWidth","renderStep","step","index","active","clickable","onClick","labelButton","_jsx","type","children","label","clsx","hoverLabel","style","right","left","isTouchDevice","Tooltip","position","Position","BOTTOM","_jsxs","width","map"],"mappings":"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"}
1
+ {"version":3,"file":"Stepper.js","sources":["../../src/Stepper/Stepper.tsx"],"sourcesContent":["import { clsx } from 'clsx';\nimport * as React from 'react';\n\nimport { Position } from '../common';\nimport { useDirection } from '../common/hooks';\nimport Tooltip from '../Tooltip';\n\nimport { isTouchDevice } from './deviceDetection';\n\nfunction clamp(from: number, to: number, value: number) {\n return Math.max(Math.min(to, value), from);\n}\n\nexport interface Step {\n label: React.ReactNode;\n onClick?: () => void;\n hoverLabel?: React.ReactNode;\n}\n\nexport interface StepperProps {\n steps: readonly Step[];\n activeStep?: number;\n className?: string;\n testId?: string;\n}\n\n/**\n * This component is considered user-unfriendly and inaccessible on its own and will likely be made internal in the future. Please use `FlowNavigation` instead.\n * @see https://storybook.wise.design/?path=/story/navigation-flownavigation--variants\n */\nconst Stepper = ({ steps, activeStep = 0, className, testId }: StepperProps) => {\n const { isRTL } = useDirection();\n\n if (steps.length === 0) {\n return null;\n }\n\n const activeStepIndex = clamp(0, steps.length - 1, activeStep);\n const stepPercentage = 1 / (steps.length - 1);\n const percentageCompleted = activeStepIndex / (steps.length - 1);\n\n const getProgressWidth = (): string => {\n if (percentageCompleted === 0) {\n return '0%';\n }\n /**\n * Progress bar starts with left/right (depends on rtl) shift `--progress-bar-start-shift` for hiding Progress bar's left and right borders\n * which are used for progress vertical delimiter.\n * When progress is completed, we need to add `--progress-bar-border-width` to the width to allow the right border be outside of the progress area.\n */\n return `calc(${percentageCompleted * 100}% + var(--progress-bar-start-shift) + var(--progress-bar-border-width))`;\n };\n\n const renderStep = (step: Step, index: number) => {\n const active = index === activeStepIndex;\n const clickable = step.onClick && !active;\n\n const labelButton = clickable ? (\n <button\n type=\"button\"\n className=\"btn-unstyled tw-stepper__step-label\"\n onClick={() => clickable && step.onClick?.()}\n >\n <small>{step.label}</small>\n </button>\n ) : (\n <span className=\"tw-stepper__step-label\">{step.label}</span>\n );\n\n return (\n <li\n key={index}\n className={clsx(\n 'hidden-xs',\n 'tw-stepper__step',\n active ? 'wds-text-body-default-bold tw-stepper__step--active' : 'wds-text-body-default',\n clickable && 'tw-stepper__step--clickable',\n step.hoverLabel && 'tw-stepper__step--has-tooltip',\n )}\n aria-current={active ? 'step' : false}\n style={\n isRTL\n ? { right: `${index * stepPercentage * 100}%` }\n : { left: `${index * stepPercentage * 100}%` }\n }\n >\n {step.hoverLabel && !isTouchDevice() ? (\n <Tooltip position={Position.BOTTOM} label={step.hoverLabel}>\n {labelButton}\n </Tooltip>\n ) : (\n labelButton\n )}\n </li>\n );\n };\n\n return (\n <div className={clsx('tw-stepper', className)} data-testid={testId}>\n <div className=\"progress\">\n <div\n className=\"progress-bar\"\n style={{ width: getProgressWidth() }}\n data-testid=\"progress-bar\"\n />\n </div>\n <ol className=\"tw-stepper-steps p-t-1 m-b-0\">{steps.map(renderStep)}</ol>\n </div>\n );\n};\n\nexport default Stepper;\n"],"names":["clamp","from","to","value","Math","max","min","Stepper","steps","activeStep","className","testId","isRTL","useDirection","length","activeStepIndex","stepPercentage","percentageCompleted","getProgressWidth","renderStep","step","index","active","clickable","onClick","labelButton","_jsx","type","children","label","clsx","hoverLabel","style","right","left","isTouchDevice","Tooltip","position","Position","BOTTOM","_jsxs","width","map"],"mappings":"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"}
@@ -77,7 +77,7 @@ const Stepper = ({
77
77
  children: step.label
78
78
  });
79
79
  return /*#__PURE__*/jsx("li", {
80
- className: clsx('hidden-xs', 'tw-stepper__step', active ? 'np-text-body-default-bold tw-stepper__step--active' : 'np-text-body-default', clickable && 'tw-stepper__step--clickable', step.hoverLabel && 'tw-stepper__step--has-tooltip'),
80
+ className: clsx('hidden-xs', 'tw-stepper__step', active ? 'wds-text-body-default-bold tw-stepper__step--active' : 'wds-text-body-default', clickable && 'tw-stepper__step--clickable', step.hoverLabel && 'tw-stepper__step--has-tooltip'),
81
81
  "aria-current": active ? 'step' : false,
82
82
  style: isRTL ? {
83
83
  right: `${index * stepPercentage * 100}%`