@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.
- package/README.md +1 -1
- package/build/CardContainer/CardContainer.js +34 -0
- package/build/CardContainer/CardContainer.js.map +1 -0
- package/build/CardContainer/CardContainer.mjs +30 -0
- package/build/CardContainer/CardContainer.mjs.map +1 -0
- package/build/CardWidget/CardWidget.js +98 -0
- package/build/CardWidget/CardWidget.js.map +1 -0
- package/build/CardWidget/CardWidget.mjs +94 -0
- package/build/CardWidget/CardWidget.mjs.map +1 -0
- package/build/CardWidget/CardWidgetAction.js +73 -0
- package/build/CardWidget/CardWidgetAction.js.map +1 -0
- package/build/CardWidget/CardWidgetAction.mjs +68 -0
- package/build/CardWidget/CardWidgetAction.mjs.map +1 -0
- package/build/Link/Link.js.map +1 -1
- package/build/Link/Link.mjs.map +1 -1
- package/build/ListItem/ListItem.js +2 -0
- package/build/ListItem/ListItem.js.map +1 -1
- package/build/ListItem/ListItem.mjs +2 -0
- package/build/ListItem/ListItem.mjs.map +1 -1
- package/build/Loader/Loader.js.map +1 -1
- package/build/Loader/Loader.mjs.map +1 -1
- package/build/Prompt/PrimitivePrompt/PrimitivePrompt.js +2 -1
- package/build/Prompt/PrimitivePrompt/PrimitivePrompt.js.map +1 -1
- package/build/Prompt/PrimitivePrompt/PrimitivePrompt.mjs +2 -1
- package/build/Prompt/PrimitivePrompt/PrimitivePrompt.mjs.map +1 -1
- package/build/Prompt/Snackbar/Snackbar.js +205 -0
- package/build/Prompt/Snackbar/Snackbar.js.map +1 -0
- package/build/Prompt/Snackbar/Snackbar.messages.js +14 -0
- package/build/Prompt/Snackbar/Snackbar.messages.js.map +1 -0
- package/build/Prompt/Snackbar/Snackbar.messages.mjs +10 -0
- package/build/Prompt/Snackbar/Snackbar.messages.mjs.map +1 -0
- package/build/Prompt/Snackbar/Snackbar.mjs +203 -0
- package/build/Prompt/Snackbar/Snackbar.mjs.map +1 -0
- package/build/Prompt/Snackbar/SnackbarContext.js.map +1 -0
- package/build/Prompt/Snackbar/SnackbarContext.mjs.map +1 -0
- package/build/Prompt/Snackbar/SnackbarPortal.js +12 -0
- package/build/Prompt/Snackbar/SnackbarPortal.js.map +1 -0
- package/build/Prompt/Snackbar/SnackbarPortal.mjs +8 -0
- package/build/Prompt/Snackbar/SnackbarPortal.mjs.map +1 -0
- package/build/Prompt/Snackbar/SnackbarProvider.js +42 -0
- package/build/Prompt/Snackbar/SnackbarProvider.js.map +1 -0
- package/build/Prompt/Snackbar/SnackbarProvider.mjs +38 -0
- package/build/Prompt/Snackbar/SnackbarProvider.mjs.map +1 -0
- package/build/Prompt/Snackbar/constants.js +17 -0
- package/build/Prompt/Snackbar/constants.js.map +1 -0
- package/build/Prompt/Snackbar/constants.mjs +11 -0
- package/build/Prompt/Snackbar/constants.mjs.map +1 -0
- package/build/Prompt/Snackbar/useSnackbar.js.map +1 -0
- package/build/Prompt/Snackbar/useSnackbar.mjs.map +1 -0
- package/build/Prompt/Snackbar/useSnackbarAutoDismiss.js +66 -0
- package/build/Prompt/Snackbar/useSnackbarAutoDismiss.js.map +1 -0
- package/build/Prompt/Snackbar/useSnackbarAutoDismiss.mjs +62 -0
- package/build/Prompt/Snackbar/useSnackbarAutoDismiss.mjs.map +1 -0
- package/build/Prompt/Snackbar/useSnackbarManager.js +153 -0
- package/build/Prompt/Snackbar/useSnackbarManager.js.map +1 -0
- package/build/Prompt/Snackbar/useSnackbarManager.mjs +149 -0
- package/build/Prompt/Snackbar/useSnackbarManager.mjs.map +1 -0
- package/build/Prompt/Snackbar/useSnackbarSwipeDismiss.js +135 -0
- package/build/Prompt/Snackbar/useSnackbarSwipeDismiss.js.map +1 -0
- package/build/Prompt/Snackbar/useSnackbarSwipeDismiss.mjs +131 -0
- package/build/Prompt/Snackbar/useSnackbarSwipeDismiss.mjs.map +1 -0
- package/build/Section/Section.js.map +1 -1
- package/build/Section/Section.mjs.map +1 -1
- package/build/_deprecated/Select/Select.js +1 -1
- package/build/_deprecated/Select/Select.js.map +1 -1
- package/build/_deprecated/Select/Select.mjs +1 -1
- package/build/_deprecated/Select/Select.mjs.map +1 -1
- package/build/common/BottomSheet/BottomSheet.js +1 -3
- package/build/common/BottomSheet/BottomSheet.js.map +1 -1
- package/build/common/BottomSheet/BottomSheet.mjs +1 -3
- package/build/common/BottomSheet/BottomSheet.mjs.map +1 -1
- package/build/i18n/en.json +1 -0
- package/build/i18n/en.json.js +1 -0
- package/build/i18n/en.json.js.map +1 -1
- package/build/i18n/en.json.mjs +1 -0
- package/build/i18n/en.json.mjs.map +1 -1
- package/build/index.js +7 -3
- package/build/index.js.map +1 -1
- package/build/index.mjs +5 -3
- package/build/index.mjs.map +1 -1
- package/build/main.css +331 -75
- package/build/styles/CardContainer/CardContainer.css +108 -0
- package/build/styles/CardWidget/CardWidget.css +78 -0
- package/build/styles/IconButton/IconButton.css +3 -4
- package/build/styles/ListItem/ListItem.css +8 -0
- package/build/styles/Prompt/Snackbar/Snackbar.css +134 -0
- package/build/styles/main.css +331 -75
- package/build/types/Body/Body.d.ts +2 -2
- package/build/types/CardContainer/CardContainer.d.ts +8 -0
- package/build/types/CardContainer/CardContainer.d.ts.map +1 -0
- package/build/types/CardContainer/CardContainer.types.d.ts +55 -0
- package/build/types/CardContainer/CardContainer.types.d.ts.map +1 -0
- package/build/types/CardContainer/_stories/helpers.d.ts +3 -0
- package/build/types/CardContainer/_stories/helpers.d.ts.map +1 -0
- package/build/types/CardContainer/index.d.ts +3 -0
- package/build/types/CardContainer/index.d.ts.map +1 -0
- package/build/types/CardWidget/CardWidget.d.ts +10 -0
- package/build/types/CardWidget/CardWidget.d.ts.map +1 -0
- package/build/types/CardWidget/CardWidget.types.d.ts +55 -0
- package/build/types/CardWidget/CardWidget.types.d.ts.map +1 -0
- package/build/types/CardWidget/CardWidgetAction.d.ts +54 -0
- package/build/types/CardWidget/CardWidgetAction.d.ts.map +1 -0
- package/build/types/CardWidget/index.d.ts +4 -0
- package/build/types/CardWidget/index.d.ts.map +1 -0
- package/build/types/IconButton/IconButton.d.ts +1 -1
- package/build/types/Link/Link.d.ts +1 -1
- package/build/types/ListItem/ListItem.d.ts +1 -1
- package/build/types/ListItem/ListItem.d.ts.map +1 -1
- package/build/types/Loader/Loader.d.ts +1 -1
- package/build/types/MoneyInput/MoneyInput.d.ts +1 -1
- package/build/types/MoneyInput/MoneyInput.d.ts.map +1 -1
- package/build/types/Prompt/PrimitivePrompt/PrimitivePrompt.d.ts +11 -0
- package/build/types/Prompt/PrimitivePrompt/PrimitivePrompt.d.ts.map +1 -1
- package/build/types/Prompt/Snackbar/Snackbar.d.ts +62 -0
- package/build/types/Prompt/Snackbar/Snackbar.d.ts.map +1 -0
- package/build/types/Prompt/Snackbar/Snackbar.messages.d.ts +9 -0
- package/build/types/Prompt/Snackbar/Snackbar.messages.d.ts.map +1 -0
- package/build/types/Prompt/Snackbar/Snackbar.types.d.ts +12 -0
- package/build/types/Prompt/Snackbar/Snackbar.types.d.ts.map +1 -0
- package/build/types/{Snackbar → Prompt/Snackbar}/SnackbarContext.d.ts +2 -2
- package/build/types/Prompt/Snackbar/SnackbarContext.d.ts.map +1 -0
- package/build/types/Prompt/Snackbar/SnackbarPortal.d.ts +4 -0
- package/build/types/Prompt/Snackbar/SnackbarPortal.d.ts.map +1 -0
- package/build/types/Prompt/Snackbar/SnackbarProvider.d.ts +13 -0
- package/build/types/Prompt/Snackbar/SnackbarProvider.d.ts.map +1 -0
- package/build/types/Prompt/Snackbar/constants.d.ts +9 -0
- package/build/types/Prompt/Snackbar/constants.d.ts.map +1 -0
- package/build/types/{Snackbar → Prompt/Snackbar}/index.d.ts +1 -1
- package/build/types/Prompt/Snackbar/index.d.ts.map +1 -0
- package/build/types/Prompt/Snackbar/useSnackbar.d.ts +3 -0
- package/build/types/Prompt/Snackbar/useSnackbar.d.ts.map +1 -0
- package/build/types/Prompt/Snackbar/useSnackbarAutoDismiss.d.ts +13 -0
- package/build/types/Prompt/Snackbar/useSnackbarAutoDismiss.d.ts.map +1 -0
- package/build/types/Prompt/Snackbar/useSnackbarManager.d.ts +20 -0
- package/build/types/Prompt/Snackbar/useSnackbarManager.d.ts.map +1 -0
- package/build/types/Prompt/Snackbar/useSnackbarSwipeDismiss.d.ts +22 -0
- package/build/types/Prompt/Snackbar/useSnackbarSwipeDismiss.d.ts.map +1 -0
- package/build/types/Section/Section.d.ts +1 -1
- package/build/types/Title/Title.d.ts +2 -2
- package/build/types/Upload/Steps/UploadImageStep/UploadImageStep.d.ts +1 -1
- package/build/types/UploadInput/UploadItem/UploadItemLink.d.ts +1 -1
- package/build/types/_deprecated/Select/Select.d.ts +1 -1
- package/build/types/common/BottomSheet/BottomSheet.d.ts +1 -3
- package/build/types/common/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/build/types/index.d.ts +9 -5
- package/build/types/index.d.ts.map +1 -1
- package/build/types/test-utils/index.d.ts +2 -0
- package/build/types/test-utils/index.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/CardContainer/CardContainer.css +108 -0
- package/src/CardContainer/CardContainer.less +171 -0
- package/src/CardContainer/CardContainer.test.tsx +150 -0
- package/src/CardContainer/CardContainer.tsx +51 -0
- package/src/CardContainer/CardContainer.types.ts +62 -0
- package/src/CardContainer/_stories/CardContainer.story.tsx +167 -0
- package/src/CardContainer/_stories/CardContainer.test.story.tsx +103 -0
- package/src/CardContainer/_stories/helpers.tsx +50 -0
- package/src/CardContainer/index.ts +6 -0
- package/src/CardWidget/CardWidget.css +78 -0
- package/src/CardWidget/CardWidget.less +107 -0
- package/src/CardWidget/CardWidget.test.tsx +221 -0
- package/src/CardWidget/CardWidget.tsx +78 -0
- package/src/CardWidget/CardWidget.types.ts +63 -0
- package/src/CardWidget/CardWidgetAction.tsx +128 -0
- package/src/CardWidget/_stories/CardWidget.story.tsx +238 -0
- package/src/CardWidget/_stories/CardWidget.test.story.tsx +350 -0
- package/src/CardWidget/index.ts +3 -0
- package/src/IconButton/IconButton.css +3 -4
- package/src/IconButton/IconButton.less +14 -1
- package/src/Link/Link.tsx +1 -1
- package/src/ListItem/AdditionalInfo/_stories/ListItemAdditionalInfo.story.tsx +1 -1
- package/src/ListItem/AvatarView/_stories/ListItemAvatarView.story.tsx +3 -3
- package/src/ListItem/ListItem.css +8 -0
- package/src/ListItem/ListItem.less +8 -0
- package/src/ListItem/ListItem.test.tsx +20 -0
- package/src/ListItem/ListItem.tsx +3 -1
- package/src/ListItem/_stories/ListItem.disabled.story.tsx +1 -1
- package/src/ListItem/_stories/ListItem.layout.test.story.tsx +1 -1
- package/src/ListItem/_stories/ListItem.scenarios.story.tsx +2 -2
- package/src/ListItem/_stories/ListItem.story.tsx +1 -1
- package/src/Loader/Loader.tsx +1 -1
- package/src/Prompt/CriticalBanner/_stories/CriticalBanner.docs.mdx +122 -0
- package/src/Prompt/CriticalBanner/_stories/CriticalBanner.story.tsx +0 -2
- package/src/Prompt/PrimitivePrompt/PrimitivePrompt.test.tsx +24 -1
- package/src/Prompt/PrimitivePrompt/PrimitivePrompt.tsx +8 -2
- package/src/Prompt/Snackbar/Snackbar.css +134 -0
- package/src/Prompt/Snackbar/Snackbar.less +159 -0
- package/src/Prompt/Snackbar/Snackbar.messages.ts +9 -0
- package/src/Prompt/Snackbar/Snackbar.test.tsx +1079 -0
- package/src/Prompt/Snackbar/Snackbar.tsx +245 -0
- package/src/Prompt/Snackbar/Snackbar.types.ts +17 -0
- package/src/{Snackbar → Prompt/Snackbar}/SnackbarContext.ts +2 -2
- package/src/Prompt/Snackbar/SnackbarPortal.tsx +8 -0
- package/src/Prompt/Snackbar/SnackbarProvider.test.tsx +783 -0
- package/src/Prompt/Snackbar/SnackbarProvider.tsx +41 -0
- package/src/Prompt/Snackbar/_stories/Snackbar.accessibility.docs.mdx +58 -0
- package/src/{Snackbar → Prompt/Snackbar}/_stories/Snackbar.rtl.test.story.tsx +17 -9
- package/src/Prompt/Snackbar/_stories/Snackbar.story.tsx +416 -0
- package/src/Prompt/Snackbar/_stories/Snackbar.test.story.tsx +263 -0
- package/src/Prompt/Snackbar/constants.ts +10 -0
- package/src/{Snackbar → Prompt/Snackbar}/index.ts +1 -1
- package/src/Prompt/Snackbar/useSnackbarAutoDismiss.ts +74 -0
- package/src/Prompt/Snackbar/useSnackbarManager.ts +169 -0
- package/src/Prompt/Snackbar/useSnackbarSwipeDismiss.ts +169 -0
- package/src/Section/Section.tsx +1 -1
- package/src/_deprecated/Select/Select.tsx +1 -1
- package/src/_deprecated/Select/_stories/Select.story.tsx +1 -1
- package/src/common/BottomSheet/BottomSheet.tsx +1 -3
- package/src/i18n/en.json +1 -0
- package/src/index.ts +18 -5
- package/src/main.css +331 -75
- package/src/main.less +3 -1
- package/build/Snackbar/Snackbar.js +0 -128
- package/build/Snackbar/Snackbar.js.map +0 -1
- package/build/Snackbar/Snackbar.mjs +0 -123
- package/build/Snackbar/Snackbar.mjs.map +0 -1
- package/build/Snackbar/SnackbarContext.js.map +0 -1
- package/build/Snackbar/SnackbarContext.mjs.map +0 -1
- package/build/Snackbar/SnackbarProvider.js +0 -46
- package/build/Snackbar/SnackbarProvider.js.map +0 -1
- package/build/Snackbar/SnackbarProvider.mjs +0 -42
- package/build/Snackbar/SnackbarProvider.mjs.map +0 -1
- package/build/Snackbar/useSnackbar.js.map +0 -1
- package/build/Snackbar/useSnackbar.mjs.map +0 -1
- package/build/styles/Snackbar/Snackbar.css +0 -71
- package/build/types/Snackbar/Snackbar.d.ts +0 -16
- package/build/types/Snackbar/Snackbar.d.ts.map +0 -1
- package/build/types/Snackbar/SnackbarContext.d.ts.map +0 -1
- package/build/types/Snackbar/SnackbarProvider.d.ts +0 -6
- package/build/types/Snackbar/SnackbarProvider.d.ts.map +0 -1
- package/build/types/Snackbar/index.d.ts.map +0 -1
- package/build/types/Snackbar/useSnackbar.d.ts +0 -3
- package/build/types/Snackbar/useSnackbar.d.ts.map +0 -1
- package/src/FlowNavigation/_stories/FlowNavigation.CriticalBanner.docs.mdx +0 -66
- package/src/Snackbar/Snackbar.css +0 -71
- package/src/Snackbar/Snackbar.less +0 -80
- package/src/Snackbar/Snackbar.test.tsx +0 -206
- package/src/Snackbar/Snackbar.tsx +0 -129
- package/src/Snackbar/SnackbarProvider.tsx +0 -33
- package/src/Snackbar/_stories/Snackbar.story.tsx +0 -89
- package/src/Snackbar/_stories/Snackbar.test.story.tsx +0 -139
- /package/build/{Snackbar → Prompt/Snackbar}/SnackbarContext.js +0 -0
- /package/build/{Snackbar → Prompt/Snackbar}/SnackbarContext.mjs +0 -0
- /package/build/{Snackbar → Prompt/Snackbar}/useSnackbar.js +0 -0
- /package/build/{Snackbar → Prompt/Snackbar}/useSnackbar.mjs +0 -0
- /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":";;;;;;AAoCA,MAAMA,UAAU,GAAyB;AACvCC,EAAAA,MAAM,EAAE,IAAI;AACZC,EAAAA,iBAAiB,EAAE,KAAK;AACxBC,EAAAA,eAAe,EAAE,CAAC;AAClBC,EAAAA,OAAO,EAAE,IAAI;AACbC,EAAAA,OAAO,EAAE;CACV;AAED;;;;AAIG;AACH,MAAMC,sBAAsB,GAAGA,CAC7BC,KAA2B,EAC3BC,MAA6B,KACL;EACxB,QAAQA,MAAM,CAACC,IAAI;AACjB,IAAA,KAAK,MAAM;MACT,IAAI,CAACF,KAAK,CAACN,MAAM,IAAI,CAACM,KAAK,CAACL,iBAAiB,EAAE;AAC7C;QACA,OAAO;UACLD,MAAM,EAAEO,MAAM,CAACE,QAAQ;AACvBR,UAAAA,iBAAiB,EAAE,KAAK;AACxBC,UAAAA,eAAe,EAAEI,KAAK,CAACJ,eAAe,GAAG,CAAC;AAC1CC,UAAAA,OAAO,EAAE,IAAI;AACbC,UAAAA,OAAO,EAAE;SACV;AACH,MAAA;AAEA;MACA,OAAO;AAAE,QAAA,GAAGE,KAAK;QAAEH,OAAO,EAAEI,MAAM,CAACE,QAAQ;AAAEL,QAAAA,OAAO,EAAE;OAAO;AAC/D,IAAA,KAAK,UAAU;AACb,MAAA,IAAIE,KAAK,CAACN,MAAM,EAAEU,EAAE,KAAKH,MAAM,CAACI,UAAU,IAAIL,KAAK,CAACL,iBAAiB,EAAE;AACrE,QAAA,OAAOK,KAAK;AACd,MAAA;MAEA,OAAO;AAAE,QAAA,GAAGA,KAAK;AAAEL,QAAAA,iBAAiB,EAAE;OAAM;AAC9C,IAAA,KAAK,SAAS;AACd,IAAA,KAAK,OAAO;AACV,MAAA,IAAI,CAACK,KAAK,CAACN,MAAM,EAAE;AACjB,QAAA,OAAOM,KAAK;AACd,MAAA;AAEA,MAAA,IAAI,CAACA,KAAK,CAACL,iBAAiB,EAAE;QAC5B,OAAO;AAAE,UAAA,GAAGF,UAAU;UAAEG,eAAe,EAAEI,KAAK,CAACJ;SAAiB;AAClE,MAAA;AAEA;MACA,OAAO;AAAE,QAAA,GAAGI,KAAK;QAAEH,OAAO,EAAEI,MAAM,CAACC,IAAI,KAAK,OAAO,GAAG,IAAI,GAAGF,KAAK,CAACH,OAAO;AAAEC,QAAAA,OAAO,EAAE;OAAO;AAC9F,IAAA,KAAK,QAAQ;AACX;MACA,IAAIE,KAAK,CAACN,MAAM,EAAEU,EAAE,KAAKH,MAAM,CAACI,UAAU,EAAE;AAC1C,QAAA,OAAOL,KAAK;AACd,MAAA;MAEA,IAAIA,KAAK,CAACH,OAAO,EAAE;QACjB,OAAO;UACLH,MAAM,EAAEM,KAAK,CAACH,OAAO;AACrBF,UAAAA,iBAAiB,EAAE,KAAK;AACxBC,UAAAA,eAAe,EAAEI,KAAK,CAACJ,eAAe,GAAG,CAAC;AAC1CC,UAAAA,OAAO,EAAE,IAAI;AACbC,UAAAA,OAAO,EAAE;SACV;AACH,MAAA;MAEA,OAAO;AAAE,QAAA,GAAGL,UAAU;QAAEG,eAAe,EAAEI,KAAK,CAACJ;OAAiB;AAClE,IAAA;AACE,MAAA,OAAOI,KAAK;AAChB;AACF,CAAC;AAED;;;;AAIG;AACH,MAAMM,kBAAkB,GAAGA,MAAK;EAC9B,MAAM,CAACN,KAAK,EAAEO,QAAQ,CAAC,GAAGC,gBAAU,CAACT,sBAAsB,EAAEN,UAAU,CAAC;AACxE,EAAA,MAAMgB,cAAc,GAAGC,YAAM,CAAC,CAAC,CAAC;AAEhC,EAAA,MAAMC,cAAc,GAAGC,iBAAW,CAAEC,KAA4B,IAAI;IAClE,MAAM;AAAEC,MAAAA;AAAI,KAAE,GAAGD,KAAK;IACtB,IACEC,IAAI,IAAI,IAAI,IACZ,OAAOA,IAAI,KAAK,SAAS,IACxB,OAAOA,IAAI,KAAK,QAAQ,IAAIA,IAAI,CAACC,IAAI,EAAE,KAAK,EAAG,EAChD;AACA;AACAR,MAAAA,QAAQ,CAAC;AAAEL,QAAAA,IAAI,EAAE;AAAO,OAAE,CAAC;AAC3B,MAAA;AACF,IAAA;IAEAO,cAAc,CAACO,OAAO,IAAI,CAAC;AAC3BT,IAAAA,QAAQ,CAAC;AAAEL,MAAAA,IAAI,EAAE,MAAM;AAAEC,MAAAA,QAAQ,EAAE;QAAEC,EAAE,EAAEK,cAAc,CAACO,OAAO;AAAEH,QAAAA;AAAK;AAAE,KAAE,CAAC;EAC7E,CAAC,EAAE,EAAE,CAAC;AAEN,EAAA,MAAMI,eAAe,GAAGL,iBAAW,CAAC,MAAML,QAAQ,CAAC;AAAEL,IAAAA,IAAI,EAAE;GAAW,CAAC,EAAE,EAAE,CAAC;AAE5E,EAAA,MAAMgB,YAAY,GAAGN,iBAAW,CAAC,MAAK;AACpC,IAAA,IAAI,CAACZ,KAAK,CAACN,MAAM,EAAE;AACjB,MAAA;AACF,IAAA;IAEA,IAAI;AACFM,MAAAA,KAAK,CAACN,MAAM,CAACmB,KAAK,CAACM,SAAS,IAAI;IAClC,CAAC,CAAC,OAAOC,KAAK,EAAE;AACd;AACA;AACAC,MAAAA,OAAO,CAACD,KAAK,CAAC,qCAAqC,EAAEA,KAAK,CAAC;AAC7D,IAAA,CAAC,SAAS;AACRb,MAAAA,QAAQ,CAAC;AAAEL,QAAAA,IAAI,EAAE,QAAQ;AAAEG,QAAAA,UAAU,EAAEL,KAAK,CAACN,MAAM,CAACU;AAAE,OAAE,CAAC;AAC3D,IAAA;AACF,EAAA,CAAC,EAAE,CAACJ,KAAK,CAACN,MAAM,CAAC,CAAC;AAElB4B,EAAAA,eAAS,CAAC,MAAK;AACb,IAAA,IAAItB,KAAK,CAACN,MAAM,IAAIM,KAAK,CAACF,OAAO,IAAI,CAACE,KAAK,CAACL,iBAAiB,EAAE;AAC7D;AACAY,MAAAA,QAAQ,CAAC;AAAEL,QAAAA,IAAI,EAAE,UAAU;AAAEG,QAAAA,UAAU,EAAEL,KAAK,CAACN,MAAM,CAACU;AAAE,OAAE,CAAC;AAC7D,IAAA;AACF,EAAA,CAAC,EAAE,CAACJ,KAAK,CAACN,MAAM,EAAEM,KAAK,CAACL,iBAAiB,EAAEK,KAAK,CAACF,OAAO,CAAC,CAAC;EAE1D,OAAO;IACLJ,MAAM,EAAEM,KAAK,CAACN,MAAM;IACpBE,eAAe,EAAEI,KAAK,CAACJ,eAAe;IACtCe,cAAc;IACdM,eAAe;IACfC,YAAY;IACZpB,OAAO,EAAEE,KAAK,CAACF;GAChB;AACH;;"}
|
|
@@ -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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"}
|