@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
@@ -0,0 +1,164 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+
7
+ const emptyState = {
8
+ active: null,
9
+ activeHasRendered: false,
10
+ announcementKey: 0,
11
+ pending: null,
12
+ visible: false
13
+ };
14
+ const createInitialState = initialSnackbar => initialSnackbar ? {
15
+ active: {
16
+ id: 1,
17
+ props: initialSnackbar
18
+ },
19
+ activeHasRendered: false,
20
+ announcementKey: 1,
21
+ pending: null,
22
+ visible: true
23
+ } : emptyState;
24
+ const snackbarManagerReducer = (state, action) => {
25
+ switch (action.type) {
26
+ case 'show':
27
+ if (!state.active || !state.activeHasRendered) {
28
+ // Nothing has rendered yet, so consecutive creates from the same React batch collapse to
29
+ // the latest Snackbar instead of trying to animate out an instance that never entered.
30
+ return {
31
+ active: action.instance,
32
+ activeHasRendered: false,
33
+ announcementKey: state.announcementKey + 1,
34
+ pending: null,
35
+ visible: true
36
+ };
37
+ }
38
+ // Latest wins: replace any pending Snackbar while the active one completes its exit.
39
+ return {
40
+ ...state,
41
+ pending: action.instance,
42
+ visible: false
43
+ };
44
+ case 'rendered':
45
+ if (state.active?.id !== action.instanceId || state.activeHasRendered) {
46
+ return state;
47
+ }
48
+ return {
49
+ ...state,
50
+ activeHasRendered: true
51
+ };
52
+ case 'update':
53
+ if (!state.active) {
54
+ return {
55
+ active: action.instance,
56
+ activeHasRendered: false,
57
+ announcementKey: state.announcementKey + 1,
58
+ pending: null,
59
+ visible: true
60
+ };
61
+ }
62
+ return {
63
+ ...state,
64
+ active: {
65
+ ...state.active,
66
+ props: action.instance.props
67
+ },
68
+ pending: action.reactivate ? null : state.pending,
69
+ visible: action.reactivate ? true : state.visible,
70
+ announcementKey: state.active.props.text === action.instance.props.text ? state.announcementKey : state.announcementKey + 1
71
+ };
72
+ case 'dismiss':
73
+ if (!state.active) {
74
+ return state;
75
+ }
76
+ return state.activeHasRendered ? {
77
+ ...state,
78
+ visible: false
79
+ } : {
80
+ ...emptyState,
81
+ announcementKey: state.announcementKey
82
+ };
83
+ case 'exited':
84
+ if (state.active?.id !== action.instanceId) {
85
+ return state;
86
+ }
87
+ if (state.pending) {
88
+ return {
89
+ active: state.pending,
90
+ activeHasRendered: false,
91
+ announcementKey: state.announcementKey + 1,
92
+ pending: null,
93
+ visible: true
94
+ };
95
+ }
96
+ return {
97
+ ...emptyState,
98
+ announcementKey: state.announcementKey
99
+ };
100
+ default:
101
+ return state;
102
+ }
103
+ };
104
+ /** Owns the shared latest-wins and exit-before-enter lifecycle used by Snackbar portals. */
105
+ const useSnackbarManager = initialSnackbar => {
106
+ const [state, dispatch] = React.useReducer(snackbarManagerReducer, initialSnackbar, createInitialState);
107
+ const nextInstanceId = React.useRef(initialSnackbar ? 1 : 0);
108
+ const createInstance = React.useCallback(props => {
109
+ nextInstanceId.current += 1;
110
+ return {
111
+ id: nextInstanceId.current,
112
+ props
113
+ };
114
+ }, []);
115
+ const showSnackbar = React.useCallback(props => dispatch({
116
+ type: 'show',
117
+ instance: createInstance(props)
118
+ }), [createInstance]);
119
+ const updateSnackbar = React.useCallback((props, reactivate = false) => dispatch({
120
+ type: 'update',
121
+ instance: createInstance(props),
122
+ reactivate
123
+ }), [createInstance]);
124
+ const dismissSnackbar = React.useCallback(() => dispatch({
125
+ type: 'dismiss'
126
+ }), []);
127
+ const handleExited = React.useCallback(() => {
128
+ if (!state.active) {
129
+ return;
130
+ }
131
+ try {
132
+ state.active.props.onDismiss?.();
133
+ } finally {
134
+ // Consumer callbacks must not prevent a pending Snackbar from being promoted.
135
+ dispatch({
136
+ type: 'exited',
137
+ instanceId: state.active.id
138
+ });
139
+ }
140
+ }, [state.active]);
141
+ React.useEffect(() => {
142
+ if (!state.active || !state.visible || state.activeHasRendered) {
143
+ return;
144
+ }
145
+ // This runs after React commits the active Snackbar. Later creates can now safely wait for its
146
+ // exit transition; creates dispatched before this point continue to coalesce to the latest.
147
+ dispatch({
148
+ type: 'rendered',
149
+ instanceId: state.active.id
150
+ });
151
+ }, [state.active, state.activeHasRendered, state.visible]);
152
+ return {
153
+ active: state.active,
154
+ announcementKey: state.announcementKey,
155
+ dismissSnackbar,
156
+ handleExited,
157
+ showSnackbar,
158
+ updateSnackbar,
159
+ visible: state.visible
160
+ };
161
+ };
162
+
163
+ exports.default = useSnackbarManager;
164
+ //# sourceMappingURL=useSnackbarManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSnackbarManager.js","sources":["../../src/Snackbar/useSnackbarManager.ts"],"sourcesContent":["import { useCallback, useEffect, useReducer, useRef } from 'react';\n\nimport type { SnackbarProps } from './Snackbar.types';\n\ntype SnackbarInstance = {\n id: number;\n props: SnackbarProps;\n};\n\ntype SnackbarManagerState = {\n active: SnackbarInstance | null;\n activeHasRendered: boolean;\n announcementKey: number;\n pending: SnackbarInstance | null;\n visible: boolean;\n};\n\ntype SnackbarManagerAction =\n | { type: 'show'; instance: SnackbarInstance }\n | { type: 'update'; instance: SnackbarInstance; reactivate: boolean }\n | { type: 'rendered'; instanceId: number }\n | { type: 'dismiss' }\n | { type: 'exited'; instanceId: number };\n\nconst emptyState: SnackbarManagerState = {\n active: null,\n activeHasRendered: false,\n announcementKey: 0,\n pending: null,\n visible: false,\n};\n\nconst createInitialState = (initialSnackbar?: SnackbarProps): SnackbarManagerState =>\n initialSnackbar\n ? {\n active: { id: 1, props: initialSnackbar },\n activeHasRendered: false,\n announcementKey: 1,\n pending: null,\n visible: true,\n }\n : emptyState;\n\nconst snackbarManagerReducer = (\n state: SnackbarManagerState,\n action: SnackbarManagerAction,\n): SnackbarManagerState => {\n switch (action.type) {\n case 'show':\n if (!state.active || !state.activeHasRendered) {\n // Nothing has rendered yet, so consecutive creates from the same React batch collapse to\n // the latest Snackbar instead of trying to animate out an instance that never entered.\n return {\n active: action.instance,\n activeHasRendered: false,\n announcementKey: state.announcementKey + 1,\n pending: null,\n visible: true,\n };\n }\n\n // Latest wins: replace any pending Snackbar while the active one completes its exit.\n return {\n ...state,\n pending: action.instance,\n visible: false,\n };\n case 'rendered':\n if (state.active?.id !== action.instanceId || state.activeHasRendered) {\n return state;\n }\n\n return { ...state, activeHasRendered: true };\n case 'update':\n if (!state.active) {\n return {\n active: action.instance,\n activeHasRendered: false,\n announcementKey: state.announcementKey + 1,\n pending: null,\n visible: true,\n };\n }\n\n return {\n ...state,\n active: { ...state.active, props: action.instance.props },\n pending: action.reactivate ? null : state.pending,\n visible: action.reactivate ? true : state.visible,\n announcementKey:\n state.active.props.text === action.instance.props.text\n ? state.announcementKey\n : state.announcementKey + 1,\n };\n case 'dismiss':\n if (!state.active) {\n return state;\n }\n\n return state.activeHasRendered\n ? { ...state, visible: false }\n : { ...emptyState, announcementKey: state.announcementKey };\n case 'exited':\n if (state.active?.id !== action.instanceId) {\n return state;\n }\n\n if (state.pending) {\n return {\n active: state.pending,\n activeHasRendered: false,\n announcementKey: state.announcementKey + 1,\n pending: null,\n visible: true,\n };\n }\n\n return { ...emptyState, announcementKey: state.announcementKey };\n default:\n return state;\n }\n};\n\n/** Owns the shared latest-wins and exit-before-enter lifecycle used by Snackbar portals. */\nconst useSnackbarManager = (initialSnackbar?: SnackbarProps) => {\n const [state, dispatch] = useReducer(snackbarManagerReducer, initialSnackbar, createInitialState);\n const nextInstanceId = useRef(initialSnackbar ? 1 : 0);\n\n const createInstance = useCallback((props: SnackbarProps): SnackbarInstance => {\n nextInstanceId.current += 1;\n return { id: nextInstanceId.current, props };\n }, []);\n\n const showSnackbar = useCallback(\n (props: SnackbarProps) => dispatch({ type: 'show', instance: createInstance(props) }),\n [createInstance],\n );\n\n const updateSnackbar = useCallback(\n (props: SnackbarProps, reactivate = false) =>\n dispatch({ type: 'update', instance: createInstance(props), reactivate }),\n [createInstance],\n );\n\n const dismissSnackbar = useCallback(() => dispatch({ type: 'dismiss' }), []);\n\n const handleExited = useCallback(() => {\n if (!state.active) {\n return;\n }\n\n try {\n state.active.props.onDismiss?.();\n } finally {\n // Consumer callbacks must not prevent a pending Snackbar from being promoted.\n dispatch({ type: 'exited', instanceId: state.active.id });\n }\n }, [state.active]);\n\n useEffect(() => {\n if (!state.active || !state.visible || state.activeHasRendered) {\n return;\n }\n\n // This runs after React commits the active Snackbar. Later creates can now safely wait for its\n // exit transition; creates dispatched before this point continue to coalesce to the latest.\n dispatch({ type: 'rendered', instanceId: state.active.id });\n }, [state.active, state.activeHasRendered, state.visible]);\n\n return {\n active: state.active,\n announcementKey: state.announcementKey,\n dismissSnackbar,\n handleExited,\n showSnackbar,\n updateSnackbar,\n visible: state.visible,\n };\n};\n\nexport default useSnackbarManager;\n"],"names":["emptyState","active","activeHasRendered","announcementKey","pending","visible","createInitialState","initialSnackbar","id","props","snackbarManagerReducer","state","action","type","instance","instanceId","reactivate","text","useSnackbarManager","dispatch","useReducer","nextInstanceId","useRef","createInstance","useCallback","current","showSnackbar","updateSnackbar","dismissSnackbar","handleExited","onDismiss","useEffect"],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ import { useReducer, useRef, useCallback, useEffect } from 'react';
2
+
3
+ const emptyState = {
4
+ active: null,
5
+ activeHasRendered: false,
6
+ announcementKey: 0,
7
+ pending: null,
8
+ visible: false
9
+ };
10
+ const createInitialState = initialSnackbar => initialSnackbar ? {
11
+ active: {
12
+ id: 1,
13
+ props: initialSnackbar
14
+ },
15
+ activeHasRendered: false,
16
+ announcementKey: 1,
17
+ pending: null,
18
+ visible: true
19
+ } : emptyState;
20
+ const snackbarManagerReducer = (state, action) => {
21
+ switch (action.type) {
22
+ case 'show':
23
+ if (!state.active || !state.activeHasRendered) {
24
+ // Nothing has rendered yet, so consecutive creates from the same React batch collapse to
25
+ // the latest Snackbar instead of trying to animate out an instance that never entered.
26
+ return {
27
+ active: action.instance,
28
+ activeHasRendered: false,
29
+ announcementKey: state.announcementKey + 1,
30
+ pending: null,
31
+ visible: true
32
+ };
33
+ }
34
+ // Latest wins: replace any pending Snackbar while the active one completes its exit.
35
+ return {
36
+ ...state,
37
+ pending: action.instance,
38
+ visible: false
39
+ };
40
+ case 'rendered':
41
+ if (state.active?.id !== action.instanceId || state.activeHasRendered) {
42
+ return state;
43
+ }
44
+ return {
45
+ ...state,
46
+ activeHasRendered: true
47
+ };
48
+ case 'update':
49
+ if (!state.active) {
50
+ return {
51
+ active: action.instance,
52
+ activeHasRendered: false,
53
+ announcementKey: state.announcementKey + 1,
54
+ pending: null,
55
+ visible: true
56
+ };
57
+ }
58
+ return {
59
+ ...state,
60
+ active: {
61
+ ...state.active,
62
+ props: action.instance.props
63
+ },
64
+ pending: action.reactivate ? null : state.pending,
65
+ visible: action.reactivate ? true : state.visible,
66
+ announcementKey: state.active.props.text === action.instance.props.text ? state.announcementKey : state.announcementKey + 1
67
+ };
68
+ case 'dismiss':
69
+ if (!state.active) {
70
+ return state;
71
+ }
72
+ return state.activeHasRendered ? {
73
+ ...state,
74
+ visible: false
75
+ } : {
76
+ ...emptyState,
77
+ announcementKey: state.announcementKey
78
+ };
79
+ case 'exited':
80
+ if (state.active?.id !== action.instanceId) {
81
+ return state;
82
+ }
83
+ if (state.pending) {
84
+ return {
85
+ active: state.pending,
86
+ activeHasRendered: false,
87
+ announcementKey: state.announcementKey + 1,
88
+ pending: null,
89
+ visible: true
90
+ };
91
+ }
92
+ return {
93
+ ...emptyState,
94
+ announcementKey: state.announcementKey
95
+ };
96
+ default:
97
+ return state;
98
+ }
99
+ };
100
+ /** Owns the shared latest-wins and exit-before-enter lifecycle used by Snackbar portals. */
101
+ const useSnackbarManager = initialSnackbar => {
102
+ const [state, dispatch] = useReducer(snackbarManagerReducer, initialSnackbar, createInitialState);
103
+ const nextInstanceId = useRef(initialSnackbar ? 1 : 0);
104
+ const createInstance = useCallback(props => {
105
+ nextInstanceId.current += 1;
106
+ return {
107
+ id: nextInstanceId.current,
108
+ props
109
+ };
110
+ }, []);
111
+ const showSnackbar = useCallback(props => dispatch({
112
+ type: 'show',
113
+ instance: createInstance(props)
114
+ }), [createInstance]);
115
+ const updateSnackbar = useCallback((props, reactivate = false) => dispatch({
116
+ type: 'update',
117
+ instance: createInstance(props),
118
+ reactivate
119
+ }), [createInstance]);
120
+ const dismissSnackbar = useCallback(() => dispatch({
121
+ type: 'dismiss'
122
+ }), []);
123
+ const handleExited = useCallback(() => {
124
+ if (!state.active) {
125
+ return;
126
+ }
127
+ try {
128
+ state.active.props.onDismiss?.();
129
+ } finally {
130
+ // Consumer callbacks must not prevent a pending Snackbar from being promoted.
131
+ dispatch({
132
+ type: 'exited',
133
+ instanceId: state.active.id
134
+ });
135
+ }
136
+ }, [state.active]);
137
+ useEffect(() => {
138
+ if (!state.active || !state.visible || state.activeHasRendered) {
139
+ return;
140
+ }
141
+ // This runs after React commits the active Snackbar. Later creates can now safely wait for its
142
+ // exit transition; creates dispatched before this point continue to coalesce to the latest.
143
+ dispatch({
144
+ type: 'rendered',
145
+ instanceId: state.active.id
146
+ });
147
+ }, [state.active, state.activeHasRendered, state.visible]);
148
+ return {
149
+ active: state.active,
150
+ announcementKey: state.announcementKey,
151
+ dismissSnackbar,
152
+ handleExited,
153
+ showSnackbar,
154
+ updateSnackbar,
155
+ visible: state.visible
156
+ };
157
+ };
158
+
159
+ export { useSnackbarManager as default };
160
+ //# sourceMappingURL=useSnackbarManager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSnackbarManager.mjs","sources":["../../src/Snackbar/useSnackbarManager.ts"],"sourcesContent":["import { useCallback, useEffect, useReducer, useRef } from 'react';\n\nimport type { SnackbarProps } from './Snackbar.types';\n\ntype SnackbarInstance = {\n id: number;\n props: SnackbarProps;\n};\n\ntype SnackbarManagerState = {\n active: SnackbarInstance | null;\n activeHasRendered: boolean;\n announcementKey: number;\n pending: SnackbarInstance | null;\n visible: boolean;\n};\n\ntype SnackbarManagerAction =\n | { type: 'show'; instance: SnackbarInstance }\n | { type: 'update'; instance: SnackbarInstance; reactivate: boolean }\n | { type: 'rendered'; instanceId: number }\n | { type: 'dismiss' }\n | { type: 'exited'; instanceId: number };\n\nconst emptyState: SnackbarManagerState = {\n active: null,\n activeHasRendered: false,\n announcementKey: 0,\n pending: null,\n visible: false,\n};\n\nconst createInitialState = (initialSnackbar?: SnackbarProps): SnackbarManagerState =>\n initialSnackbar\n ? {\n active: { id: 1, props: initialSnackbar },\n activeHasRendered: false,\n announcementKey: 1,\n pending: null,\n visible: true,\n }\n : emptyState;\n\nconst snackbarManagerReducer = (\n state: SnackbarManagerState,\n action: SnackbarManagerAction,\n): SnackbarManagerState => {\n switch (action.type) {\n case 'show':\n if (!state.active || !state.activeHasRendered) {\n // Nothing has rendered yet, so consecutive creates from the same React batch collapse to\n // the latest Snackbar instead of trying to animate out an instance that never entered.\n return {\n active: action.instance,\n activeHasRendered: false,\n announcementKey: state.announcementKey + 1,\n pending: null,\n visible: true,\n };\n }\n\n // Latest wins: replace any pending Snackbar while the active one completes its exit.\n return {\n ...state,\n pending: action.instance,\n visible: false,\n };\n case 'rendered':\n if (state.active?.id !== action.instanceId || state.activeHasRendered) {\n return state;\n }\n\n return { ...state, activeHasRendered: true };\n case 'update':\n if (!state.active) {\n return {\n active: action.instance,\n activeHasRendered: false,\n announcementKey: state.announcementKey + 1,\n pending: null,\n visible: true,\n };\n }\n\n return {\n ...state,\n active: { ...state.active, props: action.instance.props },\n pending: action.reactivate ? null : state.pending,\n visible: action.reactivate ? true : state.visible,\n announcementKey:\n state.active.props.text === action.instance.props.text\n ? state.announcementKey\n : state.announcementKey + 1,\n };\n case 'dismiss':\n if (!state.active) {\n return state;\n }\n\n return state.activeHasRendered\n ? { ...state, visible: false }\n : { ...emptyState, announcementKey: state.announcementKey };\n case 'exited':\n if (state.active?.id !== action.instanceId) {\n return state;\n }\n\n if (state.pending) {\n return {\n active: state.pending,\n activeHasRendered: false,\n announcementKey: state.announcementKey + 1,\n pending: null,\n visible: true,\n };\n }\n\n return { ...emptyState, announcementKey: state.announcementKey };\n default:\n return state;\n }\n};\n\n/** Owns the shared latest-wins and exit-before-enter lifecycle used by Snackbar portals. */\nconst useSnackbarManager = (initialSnackbar?: SnackbarProps) => {\n const [state, dispatch] = useReducer(snackbarManagerReducer, initialSnackbar, createInitialState);\n const nextInstanceId = useRef(initialSnackbar ? 1 : 0);\n\n const createInstance = useCallback((props: SnackbarProps): SnackbarInstance => {\n nextInstanceId.current += 1;\n return { id: nextInstanceId.current, props };\n }, []);\n\n const showSnackbar = useCallback(\n (props: SnackbarProps) => dispatch({ type: 'show', instance: createInstance(props) }),\n [createInstance],\n );\n\n const updateSnackbar = useCallback(\n (props: SnackbarProps, reactivate = false) =>\n dispatch({ type: 'update', instance: createInstance(props), reactivate }),\n [createInstance],\n );\n\n const dismissSnackbar = useCallback(() => dispatch({ type: 'dismiss' }), []);\n\n const handleExited = useCallback(() => {\n if (!state.active) {\n return;\n }\n\n try {\n state.active.props.onDismiss?.();\n } finally {\n // Consumer callbacks must not prevent a pending Snackbar from being promoted.\n dispatch({ type: 'exited', instanceId: state.active.id });\n }\n }, [state.active]);\n\n useEffect(() => {\n if (!state.active || !state.visible || state.activeHasRendered) {\n return;\n }\n\n // This runs after React commits the active Snackbar. Later creates can now safely wait for its\n // exit transition; creates dispatched before this point continue to coalesce to the latest.\n dispatch({ type: 'rendered', instanceId: state.active.id });\n }, [state.active, state.activeHasRendered, state.visible]);\n\n return {\n active: state.active,\n announcementKey: state.announcementKey,\n dismissSnackbar,\n handleExited,\n showSnackbar,\n updateSnackbar,\n visible: state.visible,\n };\n};\n\nexport default useSnackbarManager;\n"],"names":["emptyState","active","activeHasRendered","announcementKey","pending","visible","createInitialState","initialSnackbar","id","props","snackbarManagerReducer","state","action","type","instance","instanceId","reactivate","text","useSnackbarManager","dispatch","useReducer","nextInstanceId","useRef","createInstance","useCallback","current","showSnackbar","updateSnackbar","dismissSnackbar","handleExited","onDismiss","useEffect"],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+ var constants = require('./constants.js');
7
+
8
+ const SWIPE_DISMISS_CLASS_NAME = 'wds-Snackbar--swipe-dismiss';
9
+ const useSnackbarSwipeDismiss = onDismissRequest => {
10
+ const containerRef = React.useRef(null);
11
+ const initialXCoordinate = React.useRef(0);
12
+ const initialYCoordinate = React.useRef(0);
13
+ const moveOffsetX = React.useRef(0);
14
+ const moveOffsetY = React.useRef(0);
15
+ const dismissThreshold = React.useRef(0);
16
+ const activePointerId = React.useRef(null);
17
+ const captureTarget = React.useRef(null);
18
+ const suppressClick = React.useRef(false);
19
+ const clearSwipePosition = React.useCallback(() => {
20
+ activePointerId.current = null;
21
+ captureTarget.current = null;
22
+ suppressClick.current = false;
23
+ moveOffsetX.current = 0;
24
+ moveOffsetY.current = 0;
25
+ containerRef.current?.classList.remove(SWIPE_DISMISS_CLASS_NAME);
26
+ containerRef.current?.style.removeProperty('transform');
27
+ }, []);
28
+ const updateMoveOffset = ({
29
+ clientX,
30
+ clientY
31
+ }) => {
32
+ moveOffsetX.current = clientX - initialXCoordinate.current;
33
+ moveOffsetY.current = clientY - initialYCoordinate.current;
34
+ };
35
+ const releasePointerCapture = pointerId => {
36
+ const target = captureTarget.current;
37
+ if (target?.hasPointerCapture?.(pointerId)) {
38
+ target.releasePointerCapture(pointerId);
39
+ }
40
+ captureTarget.current = null;
41
+ };
42
+ const handlePointerDown = event => {
43
+ if (event.button !== 0 || !event.isPrimary || activePointerId.current !== null) {
44
+ return;
45
+ }
46
+ const target = event.target;
47
+ target.setPointerCapture?.(event.pointerId);
48
+ captureTarget.current = target;
49
+ activePointerId.current = event.pointerId;
50
+ initialXCoordinate.current = event.clientX;
51
+ initialYCoordinate.current = event.clientY;
52
+ moveOffsetX.current = 0;
53
+ moveOffsetY.current = 0;
54
+ dismissThreshold.current = event.currentTarget.offsetHeight * constants.SWIPE_DISMISS_THRESHOLD_RATIO;
55
+ };
56
+ const handlePointerMove = event => {
57
+ if (activePointerId.current !== event.pointerId) {
58
+ return;
59
+ }
60
+ updateMoveOffset(event);
61
+ if (moveOffsetY.current <= 0 || moveOffsetY.current <= Math.abs(moveOffsetX.current)) {
62
+ containerRef.current?.style.removeProperty('transform');
63
+ return;
64
+ }
65
+ containerRef.current?.style.setProperty('transform', `translateY(${moveOffsetY.current}px)`);
66
+ };
67
+ const handlePointerUp = event => {
68
+ if (activePointerId.current !== event.pointerId) {
69
+ return;
70
+ }
71
+ updateMoveOffset(event);
72
+ releasePointerCapture(event.pointerId);
73
+ activePointerId.current = null;
74
+ if (moveOffsetY.current >= dismissThreshold.current && moveOffsetY.current > Math.abs(moveOffsetX.current)) {
75
+ const container = containerRef.current;
76
+ if (container) {
77
+ const dismissOffset = Math.max(moveOffsetY.current, container.offsetHeight);
78
+ container.classList.add(SWIPE_DISMISS_CLASS_NAME);
79
+ container.style.setProperty('transform', `translateY(${dismissOffset}px)`);
80
+ }
81
+ suppressClick.current = true;
82
+ onDismissRequest();
83
+ return;
84
+ }
85
+ clearSwipePosition();
86
+ };
87
+ const handlePointerCancel = event => {
88
+ if (activePointerId.current !== event.pointerId) {
89
+ return;
90
+ }
91
+ releasePointerCapture(event.pointerId);
92
+ clearSwipePosition();
93
+ };
94
+ const handleClickCapture = event => {
95
+ if (!suppressClick.current) {
96
+ return;
97
+ }
98
+ suppressClick.current = false;
99
+ event.preventDefault();
100
+ event.stopPropagation();
101
+ };
102
+ return {
103
+ clearSwipePosition,
104
+ containerRef,
105
+ handleClickCapture,
106
+ handlePointerCancel,
107
+ handlePointerDown,
108
+ handlePointerMove,
109
+ handlePointerUp
110
+ };
111
+ };
112
+
113
+ exports.default = useSnackbarSwipeDismiss;
114
+ //# sourceMappingURL=useSnackbarSwipeDismiss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSnackbarSwipeDismiss.js","sources":["../../src/Snackbar/useSnackbarSwipeDismiss.ts"],"sourcesContent":["import { useCallback, useRef } from 'react';\n\nimport { SWIPE_DISMISS_THRESHOLD_RATIO } from './constants';\n\nconst SWIPE_DISMISS_CLASS_NAME = 'wds-Snackbar--swipe-dismiss';\n\nconst useSnackbarSwipeDismiss = (onDismissRequest: () => void) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const initialXCoordinate = useRef(0);\n const initialYCoordinate = useRef(0);\n const moveOffsetX = useRef(0);\n const moveOffsetY = useRef(0);\n const dismissThreshold = useRef(0);\n const activePointerId = useRef<number | null>(null);\n const captureTarget = useRef<Element | null>(null);\n const suppressClick = useRef(false);\n\n const clearSwipePosition = useCallback(() => {\n activePointerId.current = null;\n captureTarget.current = null;\n suppressClick.current = false;\n moveOffsetX.current = 0;\n moveOffsetY.current = 0;\n containerRef.current?.classList.remove(SWIPE_DISMISS_CLASS_NAME);\n containerRef.current?.style.removeProperty('transform');\n }, []);\n\n const updateMoveOffset = ({ clientX, clientY }: React.PointerEvent<HTMLDivElement>) => {\n moveOffsetX.current = clientX - initialXCoordinate.current;\n moveOffsetY.current = clientY - initialYCoordinate.current;\n };\n\n const releasePointerCapture = (pointerId: number) => {\n const target = captureTarget.current;\n if (target?.hasPointerCapture?.(pointerId)) {\n target.releasePointerCapture(pointerId);\n }\n captureTarget.current = null;\n };\n\n const handlePointerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n if (event.button !== 0 || !event.isPrimary || activePointerId.current !== null) {\n return;\n }\n\n const target = event.target as Element;\n target.setPointerCapture?.(event.pointerId);\n captureTarget.current = target;\n activePointerId.current = event.pointerId;\n initialXCoordinate.current = event.clientX;\n initialYCoordinate.current = event.clientY;\n moveOffsetX.current = 0;\n moveOffsetY.current = 0;\n dismissThreshold.current = event.currentTarget.offsetHeight * SWIPE_DISMISS_THRESHOLD_RATIO;\n };\n\n const handlePointerMove = (event: React.PointerEvent<HTMLDivElement>) => {\n if (activePointerId.current !== event.pointerId) {\n return;\n }\n\n updateMoveOffset(event);\n\n if (moveOffsetY.current <= 0 || moveOffsetY.current <= Math.abs(moveOffsetX.current)) {\n containerRef.current?.style.removeProperty('transform');\n return;\n }\n\n containerRef.current?.style.setProperty('transform', `translateY(${moveOffsetY.current}px)`);\n };\n\n const handlePointerUp = (event: React.PointerEvent<HTMLDivElement>) => {\n if (activePointerId.current !== event.pointerId) {\n return;\n }\n\n updateMoveOffset(event);\n releasePointerCapture(event.pointerId);\n activePointerId.current = null;\n\n if (\n moveOffsetY.current >= dismissThreshold.current &&\n moveOffsetY.current > Math.abs(moveOffsetX.current)\n ) {\n const container = containerRef.current;\n if (container) {\n const dismissOffset = Math.max(moveOffsetY.current, container.offsetHeight);\n container.classList.add(SWIPE_DISMISS_CLASS_NAME);\n container.style.setProperty('transform', `translateY(${dismissOffset}px)`);\n }\n suppressClick.current = true;\n onDismissRequest();\n return;\n }\n\n clearSwipePosition();\n };\n\n const handlePointerCancel = (event: React.PointerEvent<HTMLDivElement>) => {\n if (activePointerId.current !== event.pointerId) {\n return;\n }\n\n releasePointerCapture(event.pointerId);\n clearSwipePosition();\n };\n\n const handleClickCapture = (event: React.MouseEvent<HTMLDivElement>) => {\n if (!suppressClick.current) {\n return;\n }\n\n suppressClick.current = false;\n event.preventDefault();\n event.stopPropagation();\n };\n\n return {\n clearSwipePosition,\n containerRef,\n handleClickCapture,\n handlePointerCancel,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n };\n};\n\nexport default useSnackbarSwipeDismiss;\n"],"names":["SWIPE_DISMISS_CLASS_NAME","useSnackbarSwipeDismiss","onDismissRequest","containerRef","useRef","initialXCoordinate","initialYCoordinate","moveOffsetX","moveOffsetY","dismissThreshold","activePointerId","captureTarget","suppressClick","clearSwipePosition","useCallback","current","classList","remove","style","removeProperty","updateMoveOffset","clientX","clientY","releasePointerCapture","pointerId","target","hasPointerCapture","handlePointerDown","event","button","isPrimary","setPointerCapture","currentTarget","offsetHeight","SWIPE_DISMISS_THRESHOLD_RATIO","handlePointerMove","Math","abs","setProperty","handlePointerUp","container","dismissOffset","max","add","handlePointerCancel","handleClickCapture","preventDefault","stopPropagation"],"mappings":"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"}
@@ -0,0 +1,110 @@
1
+ import { useRef, useCallback } from 'react';
2
+ import { SWIPE_DISMISS_THRESHOLD_RATIO } from './constants.mjs';
3
+
4
+ const SWIPE_DISMISS_CLASS_NAME = 'wds-Snackbar--swipe-dismiss';
5
+ const useSnackbarSwipeDismiss = onDismissRequest => {
6
+ const containerRef = useRef(null);
7
+ const initialXCoordinate = useRef(0);
8
+ const initialYCoordinate = useRef(0);
9
+ const moveOffsetX = useRef(0);
10
+ const moveOffsetY = useRef(0);
11
+ const dismissThreshold = useRef(0);
12
+ const activePointerId = useRef(null);
13
+ const captureTarget = useRef(null);
14
+ const suppressClick = useRef(false);
15
+ const clearSwipePosition = useCallback(() => {
16
+ activePointerId.current = null;
17
+ captureTarget.current = null;
18
+ suppressClick.current = false;
19
+ moveOffsetX.current = 0;
20
+ moveOffsetY.current = 0;
21
+ containerRef.current?.classList.remove(SWIPE_DISMISS_CLASS_NAME);
22
+ containerRef.current?.style.removeProperty('transform');
23
+ }, []);
24
+ const updateMoveOffset = ({
25
+ clientX,
26
+ clientY
27
+ }) => {
28
+ moveOffsetX.current = clientX - initialXCoordinate.current;
29
+ moveOffsetY.current = clientY - initialYCoordinate.current;
30
+ };
31
+ const releasePointerCapture = pointerId => {
32
+ const target = captureTarget.current;
33
+ if (target?.hasPointerCapture?.(pointerId)) {
34
+ target.releasePointerCapture(pointerId);
35
+ }
36
+ captureTarget.current = null;
37
+ };
38
+ const handlePointerDown = event => {
39
+ if (event.button !== 0 || !event.isPrimary || activePointerId.current !== null) {
40
+ return;
41
+ }
42
+ const target = event.target;
43
+ target.setPointerCapture?.(event.pointerId);
44
+ captureTarget.current = target;
45
+ activePointerId.current = event.pointerId;
46
+ initialXCoordinate.current = event.clientX;
47
+ initialYCoordinate.current = event.clientY;
48
+ moveOffsetX.current = 0;
49
+ moveOffsetY.current = 0;
50
+ dismissThreshold.current = event.currentTarget.offsetHeight * SWIPE_DISMISS_THRESHOLD_RATIO;
51
+ };
52
+ const handlePointerMove = event => {
53
+ if (activePointerId.current !== event.pointerId) {
54
+ return;
55
+ }
56
+ updateMoveOffset(event);
57
+ if (moveOffsetY.current <= 0 || moveOffsetY.current <= Math.abs(moveOffsetX.current)) {
58
+ containerRef.current?.style.removeProperty('transform');
59
+ return;
60
+ }
61
+ containerRef.current?.style.setProperty('transform', `translateY(${moveOffsetY.current}px)`);
62
+ };
63
+ const handlePointerUp = event => {
64
+ if (activePointerId.current !== event.pointerId) {
65
+ return;
66
+ }
67
+ updateMoveOffset(event);
68
+ releasePointerCapture(event.pointerId);
69
+ activePointerId.current = null;
70
+ if (moveOffsetY.current >= dismissThreshold.current && moveOffsetY.current > Math.abs(moveOffsetX.current)) {
71
+ const container = containerRef.current;
72
+ if (container) {
73
+ const dismissOffset = Math.max(moveOffsetY.current, container.offsetHeight);
74
+ container.classList.add(SWIPE_DISMISS_CLASS_NAME);
75
+ container.style.setProperty('transform', `translateY(${dismissOffset}px)`);
76
+ }
77
+ suppressClick.current = true;
78
+ onDismissRequest();
79
+ return;
80
+ }
81
+ clearSwipePosition();
82
+ };
83
+ const handlePointerCancel = event => {
84
+ if (activePointerId.current !== event.pointerId) {
85
+ return;
86
+ }
87
+ releasePointerCapture(event.pointerId);
88
+ clearSwipePosition();
89
+ };
90
+ const handleClickCapture = event => {
91
+ if (!suppressClick.current) {
92
+ return;
93
+ }
94
+ suppressClick.current = false;
95
+ event.preventDefault();
96
+ event.stopPropagation();
97
+ };
98
+ return {
99
+ clearSwipePosition,
100
+ containerRef,
101
+ handleClickCapture,
102
+ handlePointerCancel,
103
+ handlePointerDown,
104
+ handlePointerMove,
105
+ handlePointerUp
106
+ };
107
+ };
108
+
109
+ export { useSnackbarSwipeDismiss as default };
110
+ //# sourceMappingURL=useSnackbarSwipeDismiss.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSnackbarSwipeDismiss.mjs","sources":["../../src/Snackbar/useSnackbarSwipeDismiss.ts"],"sourcesContent":["import { useCallback, useRef } from 'react';\n\nimport { SWIPE_DISMISS_THRESHOLD_RATIO } from './constants';\n\nconst SWIPE_DISMISS_CLASS_NAME = 'wds-Snackbar--swipe-dismiss';\n\nconst useSnackbarSwipeDismiss = (onDismissRequest: () => void) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const initialXCoordinate = useRef(0);\n const initialYCoordinate = useRef(0);\n const moveOffsetX = useRef(0);\n const moveOffsetY = useRef(0);\n const dismissThreshold = useRef(0);\n const activePointerId = useRef<number | null>(null);\n const captureTarget = useRef<Element | null>(null);\n const suppressClick = useRef(false);\n\n const clearSwipePosition = useCallback(() => {\n activePointerId.current = null;\n captureTarget.current = null;\n suppressClick.current = false;\n moveOffsetX.current = 0;\n moveOffsetY.current = 0;\n containerRef.current?.classList.remove(SWIPE_DISMISS_CLASS_NAME);\n containerRef.current?.style.removeProperty('transform');\n }, []);\n\n const updateMoveOffset = ({ clientX, clientY }: React.PointerEvent<HTMLDivElement>) => {\n moveOffsetX.current = clientX - initialXCoordinate.current;\n moveOffsetY.current = clientY - initialYCoordinate.current;\n };\n\n const releasePointerCapture = (pointerId: number) => {\n const target = captureTarget.current;\n if (target?.hasPointerCapture?.(pointerId)) {\n target.releasePointerCapture(pointerId);\n }\n captureTarget.current = null;\n };\n\n const handlePointerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n if (event.button !== 0 || !event.isPrimary || activePointerId.current !== null) {\n return;\n }\n\n const target = event.target as Element;\n target.setPointerCapture?.(event.pointerId);\n captureTarget.current = target;\n activePointerId.current = event.pointerId;\n initialXCoordinate.current = event.clientX;\n initialYCoordinate.current = event.clientY;\n moveOffsetX.current = 0;\n moveOffsetY.current = 0;\n dismissThreshold.current = event.currentTarget.offsetHeight * SWIPE_DISMISS_THRESHOLD_RATIO;\n };\n\n const handlePointerMove = (event: React.PointerEvent<HTMLDivElement>) => {\n if (activePointerId.current !== event.pointerId) {\n return;\n }\n\n updateMoveOffset(event);\n\n if (moveOffsetY.current <= 0 || moveOffsetY.current <= Math.abs(moveOffsetX.current)) {\n containerRef.current?.style.removeProperty('transform');\n return;\n }\n\n containerRef.current?.style.setProperty('transform', `translateY(${moveOffsetY.current}px)`);\n };\n\n const handlePointerUp = (event: React.PointerEvent<HTMLDivElement>) => {\n if (activePointerId.current !== event.pointerId) {\n return;\n }\n\n updateMoveOffset(event);\n releasePointerCapture(event.pointerId);\n activePointerId.current = null;\n\n if (\n moveOffsetY.current >= dismissThreshold.current &&\n moveOffsetY.current > Math.abs(moveOffsetX.current)\n ) {\n const container = containerRef.current;\n if (container) {\n const dismissOffset = Math.max(moveOffsetY.current, container.offsetHeight);\n container.classList.add(SWIPE_DISMISS_CLASS_NAME);\n container.style.setProperty('transform', `translateY(${dismissOffset}px)`);\n }\n suppressClick.current = true;\n onDismissRequest();\n return;\n }\n\n clearSwipePosition();\n };\n\n const handlePointerCancel = (event: React.PointerEvent<HTMLDivElement>) => {\n if (activePointerId.current !== event.pointerId) {\n return;\n }\n\n releasePointerCapture(event.pointerId);\n clearSwipePosition();\n };\n\n const handleClickCapture = (event: React.MouseEvent<HTMLDivElement>) => {\n if (!suppressClick.current) {\n return;\n }\n\n suppressClick.current = false;\n event.preventDefault();\n event.stopPropagation();\n };\n\n return {\n clearSwipePosition,\n containerRef,\n handleClickCapture,\n handlePointerCancel,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n };\n};\n\nexport default useSnackbarSwipeDismiss;\n"],"names":["SWIPE_DISMISS_CLASS_NAME","useSnackbarSwipeDismiss","onDismissRequest","containerRef","useRef","initialXCoordinate","initialYCoordinate","moveOffsetX","moveOffsetY","dismissThreshold","activePointerId","captureTarget","suppressClick","clearSwipePosition","useCallback","current","classList","remove","style","removeProperty","updateMoveOffset","clientX","clientY","releasePointerCapture","pointerId","target","hasPointerCapture","handlePointerDown","event","button","isPrimary","setPointerCapture","currentTarget","offsetHeight","SWIPE_DISMISS_THRESHOLD_RATIO","handlePointerMove","Math","abs","setProperty","handlePointerUp","container","dismissOffset","max","add","handlePointerCancel","handleClickCapture","preventDefault","stopPropagation"],"mappings":"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"}
@@ -9,13 +9,7 @@ exports.Typography = void 0;
9
9
  Typography["DISPLAY_LARGE"] = "display-large";
10
10
  Typography["DISPLAY_MEDIUM"] = "display-medium";
11
11
  Typography["DISPLAY_SMALL"] = "display-small";
12
- /**
13
- * @deprecated Use {@link Typography.DISPLAY_NUMBER_SMALL} instead.
14
- */
15
12
  Typography["DISPLAY_NUMBER"] = "display-number";
16
- Typography["DISPLAY_NUMBER_SMALL"] = "display-number-small";
17
- Typography["DISPLAY_NUMBER_MEDIUM"] = "display-number-medium";
18
- Typography["DISPLAY_NUMBER_LARGE"] = "display-number-large";
19
13
  Typography["TITLE_SCREEN"] = "title-screen";
20
14
  Typography["TITLE_SECTION"] = "title-section";
21
15
  Typography["TITLE_SUBSECTION"] = "title-subsection";