@transferwise/components 46.166.0 → 46.168.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. package/README.md +1 -1
  2. package/build/CardContainer/CardContainer.js +34 -0
  3. package/build/CardContainer/CardContainer.js.map +1 -0
  4. package/build/CardContainer/CardContainer.mjs +30 -0
  5. package/build/CardContainer/CardContainer.mjs.map +1 -0
  6. package/build/CardWidget/CardWidget.js +98 -0
  7. package/build/CardWidget/CardWidget.js.map +1 -0
  8. package/build/CardWidget/CardWidget.mjs +94 -0
  9. package/build/CardWidget/CardWidget.mjs.map +1 -0
  10. package/build/CardWidget/CardWidgetAction.js +73 -0
  11. package/build/CardWidget/CardWidgetAction.js.map +1 -0
  12. package/build/CardWidget/CardWidgetAction.mjs +68 -0
  13. package/build/CardWidget/CardWidgetAction.mjs.map +1 -0
  14. package/build/Link/Link.js.map +1 -1
  15. package/build/Link/Link.mjs.map +1 -1
  16. package/build/ListItem/ListItem.js +2 -0
  17. package/build/ListItem/ListItem.js.map +1 -1
  18. package/build/ListItem/ListItem.mjs +2 -0
  19. package/build/ListItem/ListItem.mjs.map +1 -1
  20. package/build/Loader/Loader.js.map +1 -1
  21. package/build/Loader/Loader.mjs.map +1 -1
  22. package/build/Prompt/PrimitivePrompt/PrimitivePrompt.js +2 -1
  23. package/build/Prompt/PrimitivePrompt/PrimitivePrompt.js.map +1 -1
  24. package/build/Prompt/PrimitivePrompt/PrimitivePrompt.mjs +2 -1
  25. package/build/Prompt/PrimitivePrompt/PrimitivePrompt.mjs.map +1 -1
  26. package/build/Prompt/Snackbar/Snackbar.js +205 -0
  27. package/build/Prompt/Snackbar/Snackbar.js.map +1 -0
  28. package/build/Prompt/Snackbar/Snackbar.messages.js +14 -0
  29. package/build/Prompt/Snackbar/Snackbar.messages.js.map +1 -0
  30. package/build/Prompt/Snackbar/Snackbar.messages.mjs +10 -0
  31. package/build/Prompt/Snackbar/Snackbar.messages.mjs.map +1 -0
  32. package/build/Prompt/Snackbar/Snackbar.mjs +203 -0
  33. package/build/Prompt/Snackbar/Snackbar.mjs.map +1 -0
  34. package/build/Prompt/Snackbar/SnackbarContext.js.map +1 -0
  35. package/build/Prompt/Snackbar/SnackbarContext.mjs.map +1 -0
  36. package/build/Prompt/Snackbar/SnackbarPortal.js +12 -0
  37. package/build/Prompt/Snackbar/SnackbarPortal.js.map +1 -0
  38. package/build/Prompt/Snackbar/SnackbarPortal.mjs +8 -0
  39. package/build/Prompt/Snackbar/SnackbarPortal.mjs.map +1 -0
  40. package/build/Prompt/Snackbar/SnackbarProvider.js +42 -0
  41. package/build/Prompt/Snackbar/SnackbarProvider.js.map +1 -0
  42. package/build/Prompt/Snackbar/SnackbarProvider.mjs +38 -0
  43. package/build/Prompt/Snackbar/SnackbarProvider.mjs.map +1 -0
  44. package/build/Prompt/Snackbar/constants.js +17 -0
  45. package/build/Prompt/Snackbar/constants.js.map +1 -0
  46. package/build/Prompt/Snackbar/constants.mjs +11 -0
  47. package/build/Prompt/Snackbar/constants.mjs.map +1 -0
  48. package/build/Prompt/Snackbar/useSnackbar.js.map +1 -0
  49. package/build/Prompt/Snackbar/useSnackbar.mjs.map +1 -0
  50. package/build/Prompt/Snackbar/useSnackbarAutoDismiss.js +66 -0
  51. package/build/Prompt/Snackbar/useSnackbarAutoDismiss.js.map +1 -0
  52. package/build/Prompt/Snackbar/useSnackbarAutoDismiss.mjs +62 -0
  53. package/build/Prompt/Snackbar/useSnackbarAutoDismiss.mjs.map +1 -0
  54. package/build/Prompt/Snackbar/useSnackbarManager.js +153 -0
  55. package/build/Prompt/Snackbar/useSnackbarManager.js.map +1 -0
  56. package/build/Prompt/Snackbar/useSnackbarManager.mjs +149 -0
  57. package/build/Prompt/Snackbar/useSnackbarManager.mjs.map +1 -0
  58. package/build/Prompt/Snackbar/useSnackbarSwipeDismiss.js +135 -0
  59. package/build/Prompt/Snackbar/useSnackbarSwipeDismiss.js.map +1 -0
  60. package/build/Prompt/Snackbar/useSnackbarSwipeDismiss.mjs +131 -0
  61. package/build/Prompt/Snackbar/useSnackbarSwipeDismiss.mjs.map +1 -0
  62. package/build/Section/Section.js.map +1 -1
  63. package/build/Section/Section.mjs.map +1 -1
  64. package/build/_deprecated/Select/Select.js +1 -1
  65. package/build/_deprecated/Select/Select.js.map +1 -1
  66. package/build/_deprecated/Select/Select.mjs +1 -1
  67. package/build/_deprecated/Select/Select.mjs.map +1 -1
  68. package/build/common/BottomSheet/BottomSheet.js +1 -3
  69. package/build/common/BottomSheet/BottomSheet.js.map +1 -1
  70. package/build/common/BottomSheet/BottomSheet.mjs +1 -3
  71. package/build/common/BottomSheet/BottomSheet.mjs.map +1 -1
  72. package/build/i18n/en.json +1 -0
  73. package/build/i18n/en.json.js +1 -0
  74. package/build/i18n/en.json.js.map +1 -1
  75. package/build/i18n/en.json.mjs +1 -0
  76. package/build/i18n/en.json.mjs.map +1 -1
  77. package/build/index.js +7 -3
  78. package/build/index.js.map +1 -1
  79. package/build/index.mjs +5 -3
  80. package/build/index.mjs.map +1 -1
  81. package/build/main.css +331 -75
  82. package/build/styles/CardContainer/CardContainer.css +108 -0
  83. package/build/styles/CardWidget/CardWidget.css +78 -0
  84. package/build/styles/IconButton/IconButton.css +3 -4
  85. package/build/styles/ListItem/ListItem.css +8 -0
  86. package/build/styles/Prompt/Snackbar/Snackbar.css +134 -0
  87. package/build/styles/main.css +331 -75
  88. package/build/types/Body/Body.d.ts +2 -2
  89. package/build/types/CardContainer/CardContainer.d.ts +8 -0
  90. package/build/types/CardContainer/CardContainer.d.ts.map +1 -0
  91. package/build/types/CardContainer/CardContainer.types.d.ts +55 -0
  92. package/build/types/CardContainer/CardContainer.types.d.ts.map +1 -0
  93. package/build/types/CardContainer/_stories/helpers.d.ts +3 -0
  94. package/build/types/CardContainer/_stories/helpers.d.ts.map +1 -0
  95. package/build/types/CardContainer/index.d.ts +3 -0
  96. package/build/types/CardContainer/index.d.ts.map +1 -0
  97. package/build/types/CardWidget/CardWidget.d.ts +10 -0
  98. package/build/types/CardWidget/CardWidget.d.ts.map +1 -0
  99. package/build/types/CardWidget/CardWidget.types.d.ts +55 -0
  100. package/build/types/CardWidget/CardWidget.types.d.ts.map +1 -0
  101. package/build/types/CardWidget/CardWidgetAction.d.ts +54 -0
  102. package/build/types/CardWidget/CardWidgetAction.d.ts.map +1 -0
  103. package/build/types/CardWidget/index.d.ts +4 -0
  104. package/build/types/CardWidget/index.d.ts.map +1 -0
  105. package/build/types/IconButton/IconButton.d.ts +1 -1
  106. package/build/types/Link/Link.d.ts +1 -1
  107. package/build/types/ListItem/ListItem.d.ts +1 -1
  108. package/build/types/ListItem/ListItem.d.ts.map +1 -1
  109. package/build/types/Loader/Loader.d.ts +1 -1
  110. package/build/types/MoneyInput/MoneyInput.d.ts +1 -1
  111. package/build/types/MoneyInput/MoneyInput.d.ts.map +1 -1
  112. package/build/types/Prompt/PrimitivePrompt/PrimitivePrompt.d.ts +11 -0
  113. package/build/types/Prompt/PrimitivePrompt/PrimitivePrompt.d.ts.map +1 -1
  114. package/build/types/Prompt/Snackbar/Snackbar.d.ts +62 -0
  115. package/build/types/Prompt/Snackbar/Snackbar.d.ts.map +1 -0
  116. package/build/types/Prompt/Snackbar/Snackbar.messages.d.ts +9 -0
  117. package/build/types/Prompt/Snackbar/Snackbar.messages.d.ts.map +1 -0
  118. package/build/types/Prompt/Snackbar/Snackbar.types.d.ts +12 -0
  119. package/build/types/Prompt/Snackbar/Snackbar.types.d.ts.map +1 -0
  120. package/build/types/{Snackbar → Prompt/Snackbar}/SnackbarContext.d.ts +2 -2
  121. package/build/types/Prompt/Snackbar/SnackbarContext.d.ts.map +1 -0
  122. package/build/types/Prompt/Snackbar/SnackbarPortal.d.ts +4 -0
  123. package/build/types/Prompt/Snackbar/SnackbarPortal.d.ts.map +1 -0
  124. package/build/types/Prompt/Snackbar/SnackbarProvider.d.ts +13 -0
  125. package/build/types/Prompt/Snackbar/SnackbarProvider.d.ts.map +1 -0
  126. package/build/types/Prompt/Snackbar/constants.d.ts +9 -0
  127. package/build/types/Prompt/Snackbar/constants.d.ts.map +1 -0
  128. package/build/types/{Snackbar → Prompt/Snackbar}/index.d.ts +1 -1
  129. package/build/types/Prompt/Snackbar/index.d.ts.map +1 -0
  130. package/build/types/Prompt/Snackbar/useSnackbar.d.ts +3 -0
  131. package/build/types/Prompt/Snackbar/useSnackbar.d.ts.map +1 -0
  132. package/build/types/Prompt/Snackbar/useSnackbarAutoDismiss.d.ts +13 -0
  133. package/build/types/Prompt/Snackbar/useSnackbarAutoDismiss.d.ts.map +1 -0
  134. package/build/types/Prompt/Snackbar/useSnackbarManager.d.ts +20 -0
  135. package/build/types/Prompt/Snackbar/useSnackbarManager.d.ts.map +1 -0
  136. package/build/types/Prompt/Snackbar/useSnackbarSwipeDismiss.d.ts +22 -0
  137. package/build/types/Prompt/Snackbar/useSnackbarSwipeDismiss.d.ts.map +1 -0
  138. package/build/types/Section/Section.d.ts +1 -1
  139. package/build/types/Title/Title.d.ts +2 -2
  140. package/build/types/Upload/Steps/UploadImageStep/UploadImageStep.d.ts +1 -1
  141. package/build/types/UploadInput/UploadItem/UploadItemLink.d.ts +1 -1
  142. package/build/types/_deprecated/Select/Select.d.ts +1 -1
  143. package/build/types/common/BottomSheet/BottomSheet.d.ts +1 -3
  144. package/build/types/common/BottomSheet/BottomSheet.d.ts.map +1 -1
  145. package/build/types/index.d.ts +9 -5
  146. package/build/types/index.d.ts.map +1 -1
  147. package/build/types/test-utils/index.d.ts +2 -0
  148. package/build/types/test-utils/index.d.ts.map +1 -1
  149. package/package.json +4 -4
  150. package/src/CardContainer/CardContainer.css +108 -0
  151. package/src/CardContainer/CardContainer.less +171 -0
  152. package/src/CardContainer/CardContainer.test.tsx +150 -0
  153. package/src/CardContainer/CardContainer.tsx +51 -0
  154. package/src/CardContainer/CardContainer.types.ts +62 -0
  155. package/src/CardContainer/_stories/CardContainer.story.tsx +167 -0
  156. package/src/CardContainer/_stories/CardContainer.test.story.tsx +103 -0
  157. package/src/CardContainer/_stories/helpers.tsx +50 -0
  158. package/src/CardContainer/index.ts +6 -0
  159. package/src/CardWidget/CardWidget.css +78 -0
  160. package/src/CardWidget/CardWidget.less +107 -0
  161. package/src/CardWidget/CardWidget.test.tsx +221 -0
  162. package/src/CardWidget/CardWidget.tsx +78 -0
  163. package/src/CardWidget/CardWidget.types.ts +63 -0
  164. package/src/CardWidget/CardWidgetAction.tsx +128 -0
  165. package/src/CardWidget/_stories/CardWidget.story.tsx +238 -0
  166. package/src/CardWidget/_stories/CardWidget.test.story.tsx +350 -0
  167. package/src/CardWidget/index.ts +3 -0
  168. package/src/IconButton/IconButton.css +3 -4
  169. package/src/IconButton/IconButton.less +14 -1
  170. package/src/Link/Link.tsx +1 -1
  171. package/src/ListItem/AdditionalInfo/_stories/ListItemAdditionalInfo.story.tsx +1 -1
  172. package/src/ListItem/AvatarView/_stories/ListItemAvatarView.story.tsx +3 -3
  173. package/src/ListItem/ListItem.css +8 -0
  174. package/src/ListItem/ListItem.less +8 -0
  175. package/src/ListItem/ListItem.test.tsx +20 -0
  176. package/src/ListItem/ListItem.tsx +3 -1
  177. package/src/ListItem/_stories/ListItem.disabled.story.tsx +1 -1
  178. package/src/ListItem/_stories/ListItem.layout.test.story.tsx +1 -1
  179. package/src/ListItem/_stories/ListItem.scenarios.story.tsx +2 -2
  180. package/src/ListItem/_stories/ListItem.story.tsx +1 -1
  181. package/src/Loader/Loader.tsx +1 -1
  182. package/src/Prompt/CriticalBanner/_stories/CriticalBanner.docs.mdx +122 -0
  183. package/src/Prompt/CriticalBanner/_stories/CriticalBanner.story.tsx +0 -2
  184. package/src/Prompt/PrimitivePrompt/PrimitivePrompt.test.tsx +24 -1
  185. package/src/Prompt/PrimitivePrompt/PrimitivePrompt.tsx +8 -2
  186. package/src/Prompt/Snackbar/Snackbar.css +134 -0
  187. package/src/Prompt/Snackbar/Snackbar.less +159 -0
  188. package/src/Prompt/Snackbar/Snackbar.messages.ts +9 -0
  189. package/src/Prompt/Snackbar/Snackbar.test.tsx +1079 -0
  190. package/src/Prompt/Snackbar/Snackbar.tsx +245 -0
  191. package/src/Prompt/Snackbar/Snackbar.types.ts +17 -0
  192. package/src/{Snackbar → Prompt/Snackbar}/SnackbarContext.ts +2 -2
  193. package/src/Prompt/Snackbar/SnackbarPortal.tsx +8 -0
  194. package/src/Prompt/Snackbar/SnackbarProvider.test.tsx +783 -0
  195. package/src/Prompt/Snackbar/SnackbarProvider.tsx +41 -0
  196. package/src/Prompt/Snackbar/_stories/Snackbar.accessibility.docs.mdx +58 -0
  197. package/src/{Snackbar → Prompt/Snackbar}/_stories/Snackbar.rtl.test.story.tsx +17 -9
  198. package/src/Prompt/Snackbar/_stories/Snackbar.story.tsx +416 -0
  199. package/src/Prompt/Snackbar/_stories/Snackbar.test.story.tsx +263 -0
  200. package/src/Prompt/Snackbar/constants.ts +10 -0
  201. package/src/{Snackbar → Prompt/Snackbar}/index.ts +1 -1
  202. package/src/Prompt/Snackbar/useSnackbarAutoDismiss.ts +74 -0
  203. package/src/Prompt/Snackbar/useSnackbarManager.ts +169 -0
  204. package/src/Prompt/Snackbar/useSnackbarSwipeDismiss.ts +169 -0
  205. package/src/Section/Section.tsx +1 -1
  206. package/src/_deprecated/Select/Select.tsx +1 -1
  207. package/src/_deprecated/Select/_stories/Select.story.tsx +1 -1
  208. package/src/common/BottomSheet/BottomSheet.tsx +1 -3
  209. package/src/i18n/en.json +1 -0
  210. package/src/index.ts +18 -5
  211. package/src/main.css +331 -75
  212. package/src/main.less +3 -1
  213. package/build/Snackbar/Snackbar.js +0 -128
  214. package/build/Snackbar/Snackbar.js.map +0 -1
  215. package/build/Snackbar/Snackbar.mjs +0 -123
  216. package/build/Snackbar/Snackbar.mjs.map +0 -1
  217. package/build/Snackbar/SnackbarContext.js.map +0 -1
  218. package/build/Snackbar/SnackbarContext.mjs.map +0 -1
  219. package/build/Snackbar/SnackbarProvider.js +0 -46
  220. package/build/Snackbar/SnackbarProvider.js.map +0 -1
  221. package/build/Snackbar/SnackbarProvider.mjs +0 -42
  222. package/build/Snackbar/SnackbarProvider.mjs.map +0 -1
  223. package/build/Snackbar/useSnackbar.js.map +0 -1
  224. package/build/Snackbar/useSnackbar.mjs.map +0 -1
  225. package/build/styles/Snackbar/Snackbar.css +0 -71
  226. package/build/types/Snackbar/Snackbar.d.ts +0 -16
  227. package/build/types/Snackbar/Snackbar.d.ts.map +0 -1
  228. package/build/types/Snackbar/SnackbarContext.d.ts.map +0 -1
  229. package/build/types/Snackbar/SnackbarProvider.d.ts +0 -6
  230. package/build/types/Snackbar/SnackbarProvider.d.ts.map +0 -1
  231. package/build/types/Snackbar/index.d.ts.map +0 -1
  232. package/build/types/Snackbar/useSnackbar.d.ts +0 -3
  233. package/build/types/Snackbar/useSnackbar.d.ts.map +0 -1
  234. package/src/FlowNavigation/_stories/FlowNavigation.CriticalBanner.docs.mdx +0 -66
  235. package/src/Snackbar/Snackbar.css +0 -71
  236. package/src/Snackbar/Snackbar.less +0 -80
  237. package/src/Snackbar/Snackbar.test.tsx +0 -206
  238. package/src/Snackbar/Snackbar.tsx +0 -129
  239. package/src/Snackbar/SnackbarProvider.tsx +0 -33
  240. package/src/Snackbar/_stories/Snackbar.story.tsx +0 -89
  241. package/src/Snackbar/_stories/Snackbar.test.story.tsx +0 -139
  242. /package/build/{Snackbar → Prompt/Snackbar}/SnackbarContext.js +0 -0
  243. /package/build/{Snackbar → Prompt/Snackbar}/SnackbarContext.mjs +0 -0
  244. /package/build/{Snackbar → Prompt/Snackbar}/useSnackbar.js +0 -0
  245. /package/build/{Snackbar → Prompt/Snackbar}/useSnackbar.mjs +0 -0
  246. /package/src/{Snackbar → Prompt/Snackbar}/useSnackbar.ts +0 -0
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ const SNACKBAR_ENTER_DURATION = 300;
4
+ const SNACKBAR_EXIT_DURATION = 150;
5
+ /** Default auto-dismiss duration for short feedback, in milliseconds. */
6
+ const SNACKBAR_DEFAULT_DURATION = 4000;
7
+ /** Extended auto-dismiss duration for messages needing more reading time, in milliseconds. */
8
+ const SNACKBAR_EXTENDED_DURATION = 6000;
9
+ /** Fraction of the Snackbar surface height a downward swipe must travel to dismiss (0.5 = half). */
10
+ const SNACKBAR_SWIPE_DISMISS_THRESHOLD = 0.5;
11
+
12
+ exports.SNACKBAR_DEFAULT_DURATION = SNACKBAR_DEFAULT_DURATION;
13
+ exports.SNACKBAR_ENTER_DURATION = SNACKBAR_ENTER_DURATION;
14
+ exports.SNACKBAR_EXIT_DURATION = SNACKBAR_EXIT_DURATION;
15
+ exports.SNACKBAR_EXTENDED_DURATION = SNACKBAR_EXTENDED_DURATION;
16
+ exports.SNACKBAR_SWIPE_DISMISS_THRESHOLD = SNACKBAR_SWIPE_DISMISS_THRESHOLD;
17
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../../src/Prompt/Snackbar/constants.ts"],"sourcesContent":["export const SNACKBAR_ENTER_DURATION = 300;\nexport const SNACKBAR_EXIT_DURATION = 150;\n\n/** Default auto-dismiss duration for short feedback, in milliseconds. */\nexport const SNACKBAR_DEFAULT_DURATION = 4000;\n/** Extended auto-dismiss duration for messages needing more reading time, in milliseconds. */\nexport const SNACKBAR_EXTENDED_DURATION = 6000;\n\n/** Fraction of the Snackbar surface height a downward swipe must travel to dismiss (0.5 = half). */\nexport const SNACKBAR_SWIPE_DISMISS_THRESHOLD = 0.5;\n"],"names":["SNACKBAR_ENTER_DURATION","SNACKBAR_EXIT_DURATION","SNACKBAR_DEFAULT_DURATION","SNACKBAR_EXTENDED_DURATION","SNACKBAR_SWIPE_DISMISS_THRESHOLD"],"mappings":";;AAAO,MAAMA,uBAAuB,GAAG;AAChC,MAAMC,sBAAsB,GAAG;AAEtC;AACO,MAAMC,yBAAyB,GAAG;AACzC;AACO,MAAMC,0BAA0B,GAAG;AAE1C;AACO,MAAMC,gCAAgC,GAAG;;;;;;"}
@@ -0,0 +1,11 @@
1
+ const SNACKBAR_ENTER_DURATION = 300;
2
+ const SNACKBAR_EXIT_DURATION = 150;
3
+ /** Default auto-dismiss duration for short feedback, in milliseconds. */
4
+ const SNACKBAR_DEFAULT_DURATION = 4000;
5
+ /** Extended auto-dismiss duration for messages needing more reading time, in milliseconds. */
6
+ const SNACKBAR_EXTENDED_DURATION = 6000;
7
+ /** Fraction of the Snackbar surface height a downward swipe must travel to dismiss (0.5 = half). */
8
+ const SNACKBAR_SWIPE_DISMISS_THRESHOLD = 0.5;
9
+
10
+ export { SNACKBAR_DEFAULT_DURATION, SNACKBAR_ENTER_DURATION, SNACKBAR_EXIT_DURATION, SNACKBAR_EXTENDED_DURATION, SNACKBAR_SWIPE_DISMISS_THRESHOLD };
11
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.mjs","sources":["../../../src/Prompt/Snackbar/constants.ts"],"sourcesContent":["export const SNACKBAR_ENTER_DURATION = 300;\nexport const SNACKBAR_EXIT_DURATION = 150;\n\n/** Default auto-dismiss duration for short feedback, in milliseconds. */\nexport const SNACKBAR_DEFAULT_DURATION = 4000;\n/** Extended auto-dismiss duration for messages needing more reading time, in milliseconds. */\nexport const SNACKBAR_EXTENDED_DURATION = 6000;\n\n/** Fraction of the Snackbar surface height a downward swipe must travel to dismiss (0.5 = half). */\nexport const SNACKBAR_SWIPE_DISMISS_THRESHOLD = 0.5;\n"],"names":["SNACKBAR_ENTER_DURATION","SNACKBAR_EXIT_DURATION","SNACKBAR_DEFAULT_DURATION","SNACKBAR_EXTENDED_DURATION","SNACKBAR_SWIPE_DISMISS_THRESHOLD"],"mappings":"AAAO,MAAMA,uBAAuB,GAAG;AAChC,MAAMC,sBAAsB,GAAG;AAEtC;AACO,MAAMC,yBAAyB,GAAG;AACzC;AACO,MAAMC,0BAA0B,GAAG;AAE1C;AACO,MAAMC,gCAAgC,GAAG;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSnackbar.js","sources":["../../../src/Prompt/Snackbar/useSnackbar.ts"],"sourcesContent":["import { useContext } from 'react';\n\nimport { SnackbarContext } from './SnackbarContext';\n\nfunction useSnackbar() {\n const { createSnackbar } = useContext(SnackbarContext);\n\n return createSnackbar;\n}\n\nexport default useSnackbar;\n"],"names":["useSnackbar","createSnackbar","useContext","SnackbarContext"],"mappings":";;;;;;;AAIA,SAASA,WAAWA,GAAA;EAClB,MAAM;AAAEC,IAAAA;AAAc,GAAE,GAAGC,gBAAU,CAACC,+BAAe,CAAC;AAEtD,EAAA,OAAOF,cAAc;AACvB;;"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSnackbar.mjs","sources":["../../../src/Prompt/Snackbar/useSnackbar.ts"],"sourcesContent":["import { useContext } from 'react';\n\nimport { SnackbarContext } from './SnackbarContext';\n\nfunction useSnackbar() {\n const { createSnackbar } = useContext(SnackbarContext);\n\n return createSnackbar;\n}\n\nexport default useSnackbar;\n"],"names":["useSnackbar","createSnackbar","useContext","SnackbarContext"],"mappings":";;;AAIA,SAASA,WAAWA,GAAA;EAClB,MAAM;AAAEC,IAAAA;AAAc,GAAE,GAAGC,UAAU,CAACC,eAAe,CAAC;AAEtD,EAAA,OAAOF,cAAc;AACvB;;"}
@@ -0,0 +1,66 @@
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 DURATIONS = {
9
+ default: constants.SNACKBAR_DEFAULT_DURATION,
10
+ extended: constants.SNACKBAR_EXTENDED_DURATION,
11
+ indefinite: null
12
+ };
13
+ /** Starts after entry finishes and pauses on hover, focus or swipe, preserving the remaining time. */
14
+ const useSnackbarAutoDismiss = ({
15
+ duration,
16
+ loading,
17
+ onDismissRequest,
18
+ timeout,
19
+ visible
20
+ }) => {
21
+ const surfaceRef = React.useRef(null);
22
+ const milliseconds = loading ? null : duration ? DURATIONS[duration] : timeout ?? constants.SNACKBAR_DEFAULT_DURATION;
23
+ const remaining = React.useRef(milliseconds);
24
+ const [entered, setEntered] = React.useState(false);
25
+ const [hovered, setHovered] = React.useState(false);
26
+ const [focusWithin, setFocusWithin] = React.useState(false);
27
+ const [swiping, setSwiping] = React.useState(false);
28
+ const running = visible && entered && !hovered && !focusWithin && !swiping;
29
+ React.useEffect(() => {
30
+ // Only a timing change starts a fresh budget; interaction and callback changes preserve it.
31
+ remaining.current = milliseconds;
32
+ }, [milliseconds]);
33
+ React.useEffect(() => {
34
+ const ms = remaining.current;
35
+ if (!running || ms === null) {
36
+ return undefined;
37
+ }
38
+ const startedAt = Date.now();
39
+ const id = window.setTimeout(() => onDismissRequest(), ms);
40
+ return () => {
41
+ window.clearTimeout(id);
42
+ remaining.current = Math.max(0, ms - (Date.now() - startedAt));
43
+ };
44
+ }, [running, onDismissRequest, milliseconds]);
45
+ return {
46
+ handleBlur: event => {
47
+ if (!event.currentTarget.contains(event.relatedTarget)) {
48
+ setFocusWithin(false);
49
+ }
50
+ },
51
+ handleEntered: () => {
52
+ // Entry can finish beneath the pointer or with focus already inside the surface.
53
+ setHovered(surfaceRef.current?.matches(':hover') ?? false);
54
+ setFocusWithin(Boolean(surfaceRef.current?.contains(document.activeElement)));
55
+ setEntered(true);
56
+ },
57
+ handleFocus: () => setFocusWithin(true),
58
+ handleMouseEnter: () => setHovered(true),
59
+ handleMouseLeave: () => setHovered(false),
60
+ setSwiping,
61
+ surfaceRef
62
+ };
63
+ };
64
+
65
+ exports.default = useSnackbarAutoDismiss;
66
+ //# sourceMappingURL=useSnackbarAutoDismiss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSnackbarAutoDismiss.js","sources":["../../../src/Prompt/Snackbar/useSnackbarAutoDismiss.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport { SNACKBAR_DEFAULT_DURATION, SNACKBAR_EXTENDED_DURATION } from './constants';\nimport type { SnackbarProps } from './Snackbar';\nimport type { SnackbarDuration } from './Snackbar.types';\n\nconst DURATIONS: Record<SnackbarDuration, number | null> = {\n default: SNACKBAR_DEFAULT_DURATION,\n extended: SNACKBAR_EXTENDED_DURATION,\n indefinite: null,\n};\n\n/** Starts after entry finishes and pauses on hover, focus or swipe, preserving the remaining time. */\nconst useSnackbarAutoDismiss = ({\n duration,\n loading,\n onDismissRequest,\n timeout,\n visible,\n}: Pick<SnackbarProps, 'duration' | 'loading' | 'onDismissRequest' | 'timeout' | 'visible'>) => {\n const surfaceRef = useRef<HTMLDivElement>(null);\n const milliseconds = loading\n ? null\n : duration\n ? DURATIONS[duration]\n : (timeout ?? SNACKBAR_DEFAULT_DURATION);\n const remaining = useRef(milliseconds);\n const [entered, setEntered] = useState(false);\n const [hovered, setHovered] = useState(false);\n const [focusWithin, setFocusWithin] = useState(false);\n const [swiping, setSwiping] = useState(false);\n\n const running = visible && entered && !hovered && !focusWithin && !swiping;\n\n useEffect(() => {\n // Only a timing change starts a fresh budget; interaction and callback changes preserve it.\n remaining.current = milliseconds;\n }, [milliseconds]);\n\n useEffect(() => {\n const ms = remaining.current;\n if (!running || ms === null) {\n return undefined;\n }\n\n const startedAt = Date.now();\n const id = window.setTimeout(() => onDismissRequest(), ms);\n return () => {\n window.clearTimeout(id);\n remaining.current = Math.max(0, ms - (Date.now() - startedAt));\n };\n }, [running, onDismissRequest, milliseconds]);\n\n return {\n handleBlur: (event: React.FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n setFocusWithin(false);\n }\n },\n handleEntered: () => {\n // Entry can finish beneath the pointer or with focus already inside the surface.\n setHovered(surfaceRef.current?.matches(':hover') ?? false);\n setFocusWithin(Boolean(surfaceRef.current?.contains(document.activeElement)));\n setEntered(true);\n },\n handleFocus: () => setFocusWithin(true),\n handleMouseEnter: () => setHovered(true),\n handleMouseLeave: () => setHovered(false),\n setSwiping,\n surfaceRef,\n };\n};\n\nexport default useSnackbarAutoDismiss;\n"],"names":["DURATIONS","default","SNACKBAR_DEFAULT_DURATION","extended","SNACKBAR_EXTENDED_DURATION","indefinite","useSnackbarAutoDismiss","duration","loading","onDismissRequest","timeout","visible","surfaceRef","useRef","milliseconds","remaining","entered","setEntered","useState","hovered","setHovered","focusWithin","setFocusWithin","swiping","setSwiping","running","useEffect","current","ms","undefined","startedAt","Date","now","id","window","setTimeout","clearTimeout","Math","max","handleBlur","event","currentTarget","contains","relatedTarget","handleEntered","matches","Boolean","document","activeElement","handleFocus","handleMouseEnter","handleMouseLeave"],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ import { useRef, useState, useEffect } from 'react';
2
+ import { SNACKBAR_EXTENDED_DURATION, SNACKBAR_DEFAULT_DURATION } from './constants.mjs';
3
+
4
+ const DURATIONS = {
5
+ default: SNACKBAR_DEFAULT_DURATION,
6
+ extended: SNACKBAR_EXTENDED_DURATION,
7
+ indefinite: null
8
+ };
9
+ /** Starts after entry finishes and pauses on hover, focus or swipe, preserving the remaining time. */
10
+ const useSnackbarAutoDismiss = ({
11
+ duration,
12
+ loading,
13
+ onDismissRequest,
14
+ timeout,
15
+ visible
16
+ }) => {
17
+ const surfaceRef = useRef(null);
18
+ const milliseconds = loading ? null : duration ? DURATIONS[duration] : timeout ?? SNACKBAR_DEFAULT_DURATION;
19
+ const remaining = useRef(milliseconds);
20
+ const [entered, setEntered] = useState(false);
21
+ const [hovered, setHovered] = useState(false);
22
+ const [focusWithin, setFocusWithin] = useState(false);
23
+ const [swiping, setSwiping] = useState(false);
24
+ const running = visible && entered && !hovered && !focusWithin && !swiping;
25
+ useEffect(() => {
26
+ // Only a timing change starts a fresh budget; interaction and callback changes preserve it.
27
+ remaining.current = milliseconds;
28
+ }, [milliseconds]);
29
+ useEffect(() => {
30
+ const ms = remaining.current;
31
+ if (!running || ms === null) {
32
+ return undefined;
33
+ }
34
+ const startedAt = Date.now();
35
+ const id = window.setTimeout(() => onDismissRequest(), ms);
36
+ return () => {
37
+ window.clearTimeout(id);
38
+ remaining.current = Math.max(0, ms - (Date.now() - startedAt));
39
+ };
40
+ }, [running, onDismissRequest, milliseconds]);
41
+ return {
42
+ handleBlur: event => {
43
+ if (!event.currentTarget.contains(event.relatedTarget)) {
44
+ setFocusWithin(false);
45
+ }
46
+ },
47
+ handleEntered: () => {
48
+ // Entry can finish beneath the pointer or with focus already inside the surface.
49
+ setHovered(surfaceRef.current?.matches(':hover') ?? false);
50
+ setFocusWithin(Boolean(surfaceRef.current?.contains(document.activeElement)));
51
+ setEntered(true);
52
+ },
53
+ handleFocus: () => setFocusWithin(true),
54
+ handleMouseEnter: () => setHovered(true),
55
+ handleMouseLeave: () => setHovered(false),
56
+ setSwiping,
57
+ surfaceRef
58
+ };
59
+ };
60
+
61
+ export { useSnackbarAutoDismiss as default };
62
+ //# sourceMappingURL=useSnackbarAutoDismiss.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSnackbarAutoDismiss.mjs","sources":["../../../src/Prompt/Snackbar/useSnackbarAutoDismiss.ts"],"sourcesContent":["import { useEffect, useRef, useState } from 'react';\n\nimport { SNACKBAR_DEFAULT_DURATION, SNACKBAR_EXTENDED_DURATION } from './constants';\nimport type { SnackbarProps } from './Snackbar';\nimport type { SnackbarDuration } from './Snackbar.types';\n\nconst DURATIONS: Record<SnackbarDuration, number | null> = {\n default: SNACKBAR_DEFAULT_DURATION,\n extended: SNACKBAR_EXTENDED_DURATION,\n indefinite: null,\n};\n\n/** Starts after entry finishes and pauses on hover, focus or swipe, preserving the remaining time. */\nconst useSnackbarAutoDismiss = ({\n duration,\n loading,\n onDismissRequest,\n timeout,\n visible,\n}: Pick<SnackbarProps, 'duration' | 'loading' | 'onDismissRequest' | 'timeout' | 'visible'>) => {\n const surfaceRef = useRef<HTMLDivElement>(null);\n const milliseconds = loading\n ? null\n : duration\n ? DURATIONS[duration]\n : (timeout ?? SNACKBAR_DEFAULT_DURATION);\n const remaining = useRef(milliseconds);\n const [entered, setEntered] = useState(false);\n const [hovered, setHovered] = useState(false);\n const [focusWithin, setFocusWithin] = useState(false);\n const [swiping, setSwiping] = useState(false);\n\n const running = visible && entered && !hovered && !focusWithin && !swiping;\n\n useEffect(() => {\n // Only a timing change starts a fresh budget; interaction and callback changes preserve it.\n remaining.current = milliseconds;\n }, [milliseconds]);\n\n useEffect(() => {\n const ms = remaining.current;\n if (!running || ms === null) {\n return undefined;\n }\n\n const startedAt = Date.now();\n const id = window.setTimeout(() => onDismissRequest(), ms);\n return () => {\n window.clearTimeout(id);\n remaining.current = Math.max(0, ms - (Date.now() - startedAt));\n };\n }, [running, onDismissRequest, milliseconds]);\n\n return {\n handleBlur: (event: React.FocusEvent<HTMLDivElement>) => {\n if (!event.currentTarget.contains(event.relatedTarget)) {\n setFocusWithin(false);\n }\n },\n handleEntered: () => {\n // Entry can finish beneath the pointer or with focus already inside the surface.\n setHovered(surfaceRef.current?.matches(':hover') ?? false);\n setFocusWithin(Boolean(surfaceRef.current?.contains(document.activeElement)));\n setEntered(true);\n },\n handleFocus: () => setFocusWithin(true),\n handleMouseEnter: () => setHovered(true),\n handleMouseLeave: () => setHovered(false),\n setSwiping,\n surfaceRef,\n };\n};\n\nexport default useSnackbarAutoDismiss;\n"],"names":["DURATIONS","default","SNACKBAR_DEFAULT_DURATION","extended","SNACKBAR_EXTENDED_DURATION","indefinite","useSnackbarAutoDismiss","duration","loading","onDismissRequest","timeout","visible","surfaceRef","useRef","milliseconds","remaining","entered","setEntered","useState","hovered","setHovered","focusWithin","setFocusWithin","swiping","setSwiping","running","useEffect","current","ms","undefined","startedAt","Date","now","id","window","setTimeout","clearTimeout","Math","max","handleBlur","event","currentTarget","contains","relatedTarget","handleEntered","matches","Boolean","document","activeElement","handleFocus","handleMouseEnter","handleMouseLeave"],"mappings":"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"}
@@ -0,0 +1,153 @@
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
+ /**
15
+ * Coalesces creates before the first commit, then keeps active content until its exit finishes.
16
+ * Only the latest pending replacement is retained. Exited promotes pending or returns to idle.
17
+ * Instance IDs prevent stale exit callbacks from affecting a newer Snackbar.
18
+ */
19
+ const snackbarManagerReducer = (state, action) => {
20
+ switch (action.type) {
21
+ case 'show':
22
+ if (!state.active || !state.activeHasRendered) {
23
+ // Batched creates collapse to the latest instance before anything has entered.
24
+ return {
25
+ active: action.instance,
26
+ activeHasRendered: false,
27
+ announcementKey: state.announcementKey + 1,
28
+ pending: null,
29
+ visible: true
30
+ };
31
+ }
32
+ // Keep the active content until it exits; newer creates replace only the pending instance.
33
+ return {
34
+ ...state,
35
+ pending: action.instance,
36
+ visible: false
37
+ };
38
+ case 'rendered':
39
+ if (state.active?.id !== action.instanceId || state.activeHasRendered) {
40
+ return state;
41
+ }
42
+ return {
43
+ ...state,
44
+ activeHasRendered: true
45
+ };
46
+ case 'dismiss':
47
+ case 'clear':
48
+ if (!state.active) {
49
+ return state;
50
+ }
51
+ if (!state.activeHasRendered) {
52
+ return {
53
+ ...emptyState,
54
+ announcementKey: state.announcementKey
55
+ };
56
+ }
57
+ // Dismissal lets a queued replacement show next; clearing cancels it as well.
58
+ return {
59
+ ...state,
60
+ pending: action.type === 'clear' ? null : state.pending,
61
+ visible: false
62
+ };
63
+ case 'exited':
64
+ // Ignore callbacks from an instance that has already been replaced.
65
+ if (state.active?.id !== action.instanceId) {
66
+ return state;
67
+ }
68
+ if (state.pending) {
69
+ return {
70
+ active: state.pending,
71
+ activeHasRendered: false,
72
+ announcementKey: state.announcementKey + 1,
73
+ pending: null,
74
+ visible: true
75
+ };
76
+ }
77
+ return {
78
+ ...emptyState,
79
+ announcementKey: state.announcementKey
80
+ };
81
+ default:
82
+ return state;
83
+ }
84
+ };
85
+ /**
86
+ * Owns latest-wins replacement through reducer actions, separate from rendering and animation.
87
+ * Stable create/dismiss callbacks request state changes; the surface's onExited callback completes
88
+ * dismissal. The provider uses this state to mount/unmount the portal without a notification queue.
89
+ */
90
+ const useSnackbarManager = () => {
91
+ const [state, dispatch] = React.useReducer(snackbarManagerReducer, emptyState);
92
+ const nextInstanceId = React.useRef(0);
93
+ const createSnackbar = React.useCallback(props => {
94
+ const {
95
+ text
96
+ } = props;
97
+ if (text == null || typeof text === 'boolean' || typeof text === 'string' && text.trim() === '') {
98
+ // A clear request must dismiss active and cancel pending, never create a blank replacement.
99
+ dispatch({
100
+ type: 'clear'
101
+ });
102
+ return;
103
+ }
104
+ nextInstanceId.current += 1;
105
+ dispatch({
106
+ type: 'show',
107
+ instance: {
108
+ id: nextInstanceId.current,
109
+ props
110
+ }
111
+ });
112
+ }, []);
113
+ const dismissSnackbar = React.useCallback(() => dispatch({
114
+ type: 'dismiss'
115
+ }), []);
116
+ const handleExited = React.useCallback(() => {
117
+ if (!state.active) {
118
+ return;
119
+ }
120
+ try {
121
+ state.active.props.onDismiss?.();
122
+ } catch (error) {
123
+ // This runs in a transition commit; an escaping error could unmount the provider.
124
+ // eslint-disable-next-line no-console
125
+ console.error('Snackbar onDismiss callback failed:', error);
126
+ } finally {
127
+ dispatch({
128
+ type: 'exited',
129
+ instanceId: state.active.id
130
+ });
131
+ }
132
+ }, [state.active]);
133
+ React.useEffect(() => {
134
+ if (state.active && state.visible && !state.activeHasRendered) {
135
+ // Later creates can now wait for this instance's exit instead of coalescing before render.
136
+ dispatch({
137
+ type: 'rendered',
138
+ instanceId: state.active.id
139
+ });
140
+ }
141
+ }, [state.active, state.activeHasRendered, state.visible]);
142
+ return {
143
+ active: state.active,
144
+ announcementKey: state.announcementKey,
145
+ createSnackbar,
146
+ dismissSnackbar,
147
+ handleExited,
148
+ visible: state.visible
149
+ };
150
+ };
151
+
152
+ exports.default = useSnackbarManager;
153
+ //# sourceMappingURL=useSnackbarManager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSnackbarManager.js","sources":["../../../src/Prompt/Snackbar/useSnackbarManager.ts"],"sourcesContent":["import { useCallback, useEffect, useReducer, useRef } from 'react';\n\nimport type { SnackbarCreationProps } from './Snackbar.types';\n\ntype SnackbarInstance = {\n id: number;\n props: SnackbarCreationProps;\n};\n\ntype SnackbarManagerState = {\n /** The instance currently entering, visible or exiting. `null` means the provider is idle. */\n active: SnackbarInstance | null;\n /** Marks the active provider render as committed, not its entry animation as finished. */\n activeHasRendered: boolean;\n /** Changes when a new instance becomes active so repeated message text can be announced. */\n announcementKey: number;\n /** The latest replacement waiting for active to exit. `null` means no replacement is waiting. */\n pending: SnackbarInstance | null;\n /** Whether active should enter/stay visible; false requests its exit or indicates idle state. */\n visible: boolean;\n};\n\ntype SnackbarManagerAction =\n | { type: 'show'; instance: SnackbarInstance }\n | {\n /** Ends pre-render coalescing; subsequent creates must wait for the committed instance to exit. */\n type: 'rendered';\n instanceId: number;\n }\n | { type: 'dismiss' }\n | {\n /** Like `dismiss`, but also cancels a queued replacement. Sent when `createSnackbar` gets empty text. */\n type: 'clear';\n }\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\n/**\n * Coalesces creates before the first commit, then keeps active content until its exit finishes.\n * Only the latest pending replacement is retained. Exited promotes pending or returns to idle.\n * Instance IDs prevent stale exit callbacks from affecting a newer Snackbar.\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 // Batched creates collapse to the latest instance before anything has 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 // Keep the active content until it exits; newer creates replace only the pending instance.\n return { ...state, pending: action.instance, visible: false };\n case 'rendered':\n if (state.active?.id !== action.instanceId || state.activeHasRendered) {\n return state;\n }\n\n return { ...state, activeHasRendered: true };\n case 'dismiss':\n case 'clear':\n if (!state.active) {\n return state;\n }\n\n if (!state.activeHasRendered) {\n return { ...emptyState, announcementKey: state.announcementKey };\n }\n\n // Dismissal lets a queued replacement show next; clearing cancels it as well.\n return { ...state, pending: action.type === 'clear' ? null : state.pending, visible: false };\n case 'exited':\n // Ignore callbacks from an instance that has already been replaced.\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/**\n * Owns latest-wins replacement through reducer actions, separate from rendering and animation.\n * Stable create/dismiss callbacks request state changes; the surface's onExited callback completes\n * dismissal. The provider uses this state to mount/unmount the portal without a notification queue.\n */\nconst useSnackbarManager = () => {\n const [state, dispatch] = useReducer(snackbarManagerReducer, emptyState);\n const nextInstanceId = useRef(0);\n\n const createSnackbar = useCallback((props: SnackbarCreationProps) => {\n const { text } = props;\n if (\n text == null ||\n typeof text === 'boolean' ||\n (typeof text === 'string' && text.trim() === '')\n ) {\n // A clear request must dismiss active and cancel pending, never create a blank replacement.\n dispatch({ type: 'clear' });\n return;\n }\n\n nextInstanceId.current += 1;\n dispatch({ type: 'show', instance: { id: nextInstanceId.current, props } });\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 } catch (error) {\n // This runs in a transition commit; an escaping error could unmount the provider.\n // eslint-disable-next-line no-console\n console.error('Snackbar onDismiss callback failed:', error);\n } finally {\n dispatch({ type: 'exited', instanceId: state.active.id });\n }\n }, [state.active]);\n\n useEffect(() => {\n if (state.active && state.visible && !state.activeHasRendered) {\n // Later creates can now wait for this instance's exit instead of coalescing before render.\n dispatch({ type: 'rendered', instanceId: state.active.id });\n }\n }, [state.active, state.activeHasRendered, state.visible]);\n\n return {\n active: state.active,\n announcementKey: state.announcementKey,\n createSnackbar,\n dismissSnackbar,\n handleExited,\n visible: state.visible,\n };\n};\n\nexport default useSnackbarManager;\n"],"names":["emptyState","active","activeHasRendered","announcementKey","pending","visible","snackbarManagerReducer","state","action","type","instance","id","instanceId","useSnackbarManager","dispatch","useReducer","nextInstanceId","useRef","createSnackbar","useCallback","props","text","trim","current","dismissSnackbar","handleExited","onDismiss","error","console","useEffect"],"mappings":"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"}
@@ -0,0 +1,149 @@
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
+ /**
11
+ * Coalesces creates before the first commit, then keeps active content until its exit finishes.
12
+ * Only the latest pending replacement is retained. Exited promotes pending or returns to idle.
13
+ * Instance IDs prevent stale exit callbacks from affecting a newer Snackbar.
14
+ */
15
+ const snackbarManagerReducer = (state, action) => {
16
+ switch (action.type) {
17
+ case 'show':
18
+ if (!state.active || !state.activeHasRendered) {
19
+ // Batched creates collapse to the latest instance before anything has entered.
20
+ return {
21
+ active: action.instance,
22
+ activeHasRendered: false,
23
+ announcementKey: state.announcementKey + 1,
24
+ pending: null,
25
+ visible: true
26
+ };
27
+ }
28
+ // Keep the active content until it exits; newer creates replace only the pending instance.
29
+ return {
30
+ ...state,
31
+ pending: action.instance,
32
+ visible: false
33
+ };
34
+ case 'rendered':
35
+ if (state.active?.id !== action.instanceId || state.activeHasRendered) {
36
+ return state;
37
+ }
38
+ return {
39
+ ...state,
40
+ activeHasRendered: true
41
+ };
42
+ case 'dismiss':
43
+ case 'clear':
44
+ if (!state.active) {
45
+ return state;
46
+ }
47
+ if (!state.activeHasRendered) {
48
+ return {
49
+ ...emptyState,
50
+ announcementKey: state.announcementKey
51
+ };
52
+ }
53
+ // Dismissal lets a queued replacement show next; clearing cancels it as well.
54
+ return {
55
+ ...state,
56
+ pending: action.type === 'clear' ? null : state.pending,
57
+ visible: false
58
+ };
59
+ case 'exited':
60
+ // Ignore callbacks from an instance that has already been replaced.
61
+ if (state.active?.id !== action.instanceId) {
62
+ return state;
63
+ }
64
+ if (state.pending) {
65
+ return {
66
+ active: state.pending,
67
+ activeHasRendered: false,
68
+ announcementKey: state.announcementKey + 1,
69
+ pending: null,
70
+ visible: true
71
+ };
72
+ }
73
+ return {
74
+ ...emptyState,
75
+ announcementKey: state.announcementKey
76
+ };
77
+ default:
78
+ return state;
79
+ }
80
+ };
81
+ /**
82
+ * Owns latest-wins replacement through reducer actions, separate from rendering and animation.
83
+ * Stable create/dismiss callbacks request state changes; the surface's onExited callback completes
84
+ * dismissal. The provider uses this state to mount/unmount the portal without a notification queue.
85
+ */
86
+ const useSnackbarManager = () => {
87
+ const [state, dispatch] = useReducer(snackbarManagerReducer, emptyState);
88
+ const nextInstanceId = useRef(0);
89
+ const createSnackbar = useCallback(props => {
90
+ const {
91
+ text
92
+ } = props;
93
+ if (text == null || typeof text === 'boolean' || typeof text === 'string' && text.trim() === '') {
94
+ // A clear request must dismiss active and cancel pending, never create a blank replacement.
95
+ dispatch({
96
+ type: 'clear'
97
+ });
98
+ return;
99
+ }
100
+ nextInstanceId.current += 1;
101
+ dispatch({
102
+ type: 'show',
103
+ instance: {
104
+ id: nextInstanceId.current,
105
+ props
106
+ }
107
+ });
108
+ }, []);
109
+ const dismissSnackbar = useCallback(() => dispatch({
110
+ type: 'dismiss'
111
+ }), []);
112
+ const handleExited = useCallback(() => {
113
+ if (!state.active) {
114
+ return;
115
+ }
116
+ try {
117
+ state.active.props.onDismiss?.();
118
+ } catch (error) {
119
+ // This runs in a transition commit; an escaping error could unmount the provider.
120
+ // eslint-disable-next-line no-console
121
+ console.error('Snackbar onDismiss callback failed:', error);
122
+ } finally {
123
+ dispatch({
124
+ type: 'exited',
125
+ instanceId: state.active.id
126
+ });
127
+ }
128
+ }, [state.active]);
129
+ useEffect(() => {
130
+ if (state.active && state.visible && !state.activeHasRendered) {
131
+ // Later creates can now wait for this instance's exit instead of coalescing before render.
132
+ dispatch({
133
+ type: 'rendered',
134
+ instanceId: state.active.id
135
+ });
136
+ }
137
+ }, [state.active, state.activeHasRendered, state.visible]);
138
+ return {
139
+ active: state.active,
140
+ announcementKey: state.announcementKey,
141
+ createSnackbar,
142
+ dismissSnackbar,
143
+ handleExited,
144
+ visible: state.visible
145
+ };
146
+ };
147
+
148
+ export { useSnackbarManager as default };
149
+ //# sourceMappingURL=useSnackbarManager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSnackbarManager.mjs","sources":["../../../src/Prompt/Snackbar/useSnackbarManager.ts"],"sourcesContent":["import { useCallback, useEffect, useReducer, useRef } from 'react';\n\nimport type { SnackbarCreationProps } from './Snackbar.types';\n\ntype SnackbarInstance = {\n id: number;\n props: SnackbarCreationProps;\n};\n\ntype SnackbarManagerState = {\n /** The instance currently entering, visible or exiting. `null` means the provider is idle. */\n active: SnackbarInstance | null;\n /** Marks the active provider render as committed, not its entry animation as finished. */\n activeHasRendered: boolean;\n /** Changes when a new instance becomes active so repeated message text can be announced. */\n announcementKey: number;\n /** The latest replacement waiting for active to exit. `null` means no replacement is waiting. */\n pending: SnackbarInstance | null;\n /** Whether active should enter/stay visible; false requests its exit or indicates idle state. */\n visible: boolean;\n};\n\ntype SnackbarManagerAction =\n | { type: 'show'; instance: SnackbarInstance }\n | {\n /** Ends pre-render coalescing; subsequent creates must wait for the committed instance to exit. */\n type: 'rendered';\n instanceId: number;\n }\n | { type: 'dismiss' }\n | {\n /** Like `dismiss`, but also cancels a queued replacement. Sent when `createSnackbar` gets empty text. */\n type: 'clear';\n }\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\n/**\n * Coalesces creates before the first commit, then keeps active content until its exit finishes.\n * Only the latest pending replacement is retained. Exited promotes pending or returns to idle.\n * Instance IDs prevent stale exit callbacks from affecting a newer Snackbar.\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 // Batched creates collapse to the latest instance before anything has 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 // Keep the active content until it exits; newer creates replace only the pending instance.\n return { ...state, pending: action.instance, visible: false };\n case 'rendered':\n if (state.active?.id !== action.instanceId || state.activeHasRendered) {\n return state;\n }\n\n return { ...state, activeHasRendered: true };\n case 'dismiss':\n case 'clear':\n if (!state.active) {\n return state;\n }\n\n if (!state.activeHasRendered) {\n return { ...emptyState, announcementKey: state.announcementKey };\n }\n\n // Dismissal lets a queued replacement show next; clearing cancels it as well.\n return { ...state, pending: action.type === 'clear' ? null : state.pending, visible: false };\n case 'exited':\n // Ignore callbacks from an instance that has already been replaced.\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/**\n * Owns latest-wins replacement through reducer actions, separate from rendering and animation.\n * Stable create/dismiss callbacks request state changes; the surface's onExited callback completes\n * dismissal. The provider uses this state to mount/unmount the portal without a notification queue.\n */\nconst useSnackbarManager = () => {\n const [state, dispatch] = useReducer(snackbarManagerReducer, emptyState);\n const nextInstanceId = useRef(0);\n\n const createSnackbar = useCallback((props: SnackbarCreationProps) => {\n const { text } = props;\n if (\n text == null ||\n typeof text === 'boolean' ||\n (typeof text === 'string' && text.trim() === '')\n ) {\n // A clear request must dismiss active and cancel pending, never create a blank replacement.\n dispatch({ type: 'clear' });\n return;\n }\n\n nextInstanceId.current += 1;\n dispatch({ type: 'show', instance: { id: nextInstanceId.current, props } });\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 } catch (error) {\n // This runs in a transition commit; an escaping error could unmount the provider.\n // eslint-disable-next-line no-console\n console.error('Snackbar onDismiss callback failed:', error);\n } finally {\n dispatch({ type: 'exited', instanceId: state.active.id });\n }\n }, [state.active]);\n\n useEffect(() => {\n if (state.active && state.visible && !state.activeHasRendered) {\n // Later creates can now wait for this instance's exit instead of coalescing before render.\n dispatch({ type: 'rendered', instanceId: state.active.id });\n }\n }, [state.active, state.activeHasRendered, state.visible]);\n\n return {\n active: state.active,\n announcementKey: state.announcementKey,\n createSnackbar,\n dismissSnackbar,\n handleExited,\n visible: state.visible,\n };\n};\n\nexport default useSnackbarManager;\n"],"names":["emptyState","active","activeHasRendered","announcementKey","pending","visible","snackbarManagerReducer","state","action","type","instance","id","instanceId","useSnackbarManager","dispatch","useReducer","nextInstanceId","useRef","createSnackbar","useCallback","props","text","trim","current","dismissSnackbar","handleExited","onDismiss","error","console","useEffect"],"mappings":"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"}