@transferwise/components 0.0.0-experimental-4b93e2b → 0.0.0-experimental-f144cf1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/Calendar/DateHeader/DateHeader.js +6 -2
- package/build/Calendar/DateHeader/DateHeader.js.map +1 -1
- package/build/Calendar/DateHeader/DateHeader.mjs +7 -3
- package/build/Calendar/DateHeader/DateHeader.mjs.map +1 -1
- package/build/Carousel/Carousel.js +2 -2
- package/build/Carousel/Carousel.js.map +1 -1
- package/build/Carousel/Carousel.mjs +3 -3
- package/build/Carousel/Carousel.mjs.map +1 -1
- package/build/Inputs/SelectInput/OptionContent/SelectInputOptionContent.js +3 -4
- package/build/Inputs/SelectInput/OptionContent/SelectInputOptionContent.js.map +1 -1
- package/build/Inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs +3 -4
- package/build/Inputs/SelectInput/OptionContent/SelectInputOptionContent.mjs.map +1 -1
- package/build/ListItem/Navigation/ListItemNavigation.js +1 -1
- package/build/ListItem/Navigation/ListItemNavigation.js.map +1 -1
- package/build/ListItem/Navigation/ListItemNavigation.mjs +2 -2
- package/build/ListItem/Navigation/ListItemNavigation.mjs.map +1 -1
- package/build/PhoneNumberInput/PhoneNumberInput.js +1 -2
- package/build/PhoneNumberInput/PhoneNumberInput.js.map +1 -1
- package/build/PhoneNumberInput/PhoneNumberInput.mjs +1 -2
- package/build/PhoneNumberInput/PhoneNumberInput.mjs.map +1 -1
- package/build/PromoCard/Indicator/PromoCardIndicator.js +1 -1
- package/build/PromoCard/Indicator/PromoCardIndicator.js.map +1 -1
- package/build/PromoCard/Indicator/PromoCardIndicator.mjs +2 -2
- package/build/PromoCard/Indicator/PromoCardIndicator.mjs.map +1 -1
- package/build/Snackbar/Snackbar.js +212 -108
- package/build/Snackbar/Snackbar.js.map +1 -1
- package/build/Snackbar/Snackbar.messages.js +14 -0
- package/build/Snackbar/Snackbar.messages.js.map +1 -0
- package/build/Snackbar/Snackbar.messages.mjs +10 -0
- package/build/Snackbar/Snackbar.messages.mjs.map +1 -0
- package/build/Snackbar/Snackbar.mjs +213 -107
- package/build/Snackbar/Snackbar.mjs.map +1 -1
- package/build/Snackbar/SnackbarContext.js.map +1 -1
- package/build/Snackbar/SnackbarContext.mjs.map +1 -1
- package/build/Snackbar/SnackbarPortal.js +92 -0
- package/build/Snackbar/SnackbarPortal.js.map +1 -0
- package/build/Snackbar/SnackbarPortal.mjs +89 -0
- package/build/Snackbar/SnackbarPortal.mjs.map +1 -0
- package/build/Snackbar/SnackbarProvider.js +21 -31
- package/build/Snackbar/SnackbarProvider.js.map +1 -1
- package/build/Snackbar/SnackbarProvider.mjs +22 -32
- package/build/Snackbar/SnackbarProvider.mjs.map +1 -1
- package/build/Snackbar/constants.js +14 -0
- package/build/Snackbar/constants.js.map +1 -0
- package/build/Snackbar/constants.mjs +8 -0
- package/build/Snackbar/constants.mjs.map +1 -0
- package/build/Snackbar/useSnackbarAutoDismiss.js +135 -0
- package/build/Snackbar/useSnackbarAutoDismiss.js.map +1 -0
- package/build/Snackbar/useSnackbarAutoDismiss.mjs +131 -0
- package/build/Snackbar/useSnackbarAutoDismiss.mjs.map +1 -0
- package/build/Snackbar/useSnackbarManager.js +164 -0
- package/build/Snackbar/useSnackbarManager.js.map +1 -0
- package/build/Snackbar/useSnackbarManager.mjs +160 -0
- package/build/Snackbar/useSnackbarManager.mjs.map +1 -0
- package/build/Snackbar/useSnackbarSwipeDismiss.js +114 -0
- package/build/Snackbar/useSnackbarSwipeDismiss.js.map +1 -0
- package/build/Snackbar/useSnackbarSwipeDismiss.mjs +110 -0
- package/build/Snackbar/useSnackbarSwipeDismiss.mjs.map +1 -0
- package/build/common/PropsValues/typography.js +0 -6
- package/build/common/PropsValues/typography.js.map +1 -1
- package/build/common/PropsValues/typography.mjs +0 -6
- package/build/common/PropsValues/typography.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 +3 -1
- package/build/index.js.map +1 -1
- package/build/index.mjs +2 -1
- package/build/index.mjs.map +1 -1
- package/build/main.css +864 -1509
- package/build/styles/Button/Button.css +3 -0
- package/build/styles/DateInput/DateInput.css +0 -13
- package/build/styles/Inputs/Input/Input.css +24 -0
- package/build/styles/Inputs/TextArea/TextArea.css +24 -0
- package/build/styles/ListItem/ListItem.css +1 -1
- package/build/styles/PhoneNumberInput/PhoneNumberInput.css +0 -3
- package/build/styles/Popover/Popover.css +6 -0
- package/build/styles/PromoCard/PromoCard.css +3 -0
- package/build/styles/Snackbar/Snackbar.css +182 -61
- package/build/styles/_deprecated/Select/Select.css +6 -0
- package/build/styles/css/accordion.css +12 -0
- package/build/styles/css/button-groups.css +6 -0
- package/build/styles/css/buttons.css +2 -0
- package/build/styles/css/decision.css +12 -0
- package/build/styles/css/dropdowns.css +18 -2
- package/build/styles/css/droppable.css +6 -0
- package/build/styles/css/footer.css +12 -0
- package/build/styles/css/input-groups.css +42 -2
- package/build/styles/css/list-group.css +6 -0
- package/build/styles/css/navbar.css +18 -2
- package/build/styles/css/neptune-core.css +512 -4
- package/build/styles/css/neptune.css +640 -1426
- package/build/styles/css/popovers.css +18 -0
- package/build/styles/css/tooltip.css +6 -0
- package/build/styles/less/neptune-tokens.less +0 -8
- package/build/styles/main.css +864 -1509
- package/build/styles/props/neptune-tokens.css +0 -8
- package/build/styles/styles/less/accordion.css +12 -0
- package/build/styles/styles/less/button-groups.css +6 -0
- package/build/styles/styles/less/buttons.css +2 -0
- package/build/styles/styles/less/decision.css +12 -0
- package/build/styles/styles/less/dropdowns.css +18 -2
- package/build/styles/styles/less/droppable.css +6 -0
- package/build/styles/styles/less/footer.css +12 -0
- package/build/styles/styles/less/forms/bootstrap-forms.css +24 -2
- package/build/styles/styles/less/input-groups.css +42 -2
- package/build/styles/styles/less/list-group.css +6 -0
- package/build/styles/styles/less/navbar.css +18 -2
- package/build/styles/styles/less/neptune-core.css +512 -4
- package/build/styles/styles/less/neptune.css +640 -1426
- package/build/styles/styles/less/popovers.css +18 -0
- package/build/styles/styles/less/tooltip.css +6 -0
- package/build/types/Inputs/SelectInput/OptionContent/SelectInputOptionContent.d.ts +1 -2
- package/build/types/Inputs/SelectInput/OptionContent/SelectInputOptionContent.d.ts.map +1 -1
- package/build/types/PhoneNumberInput/PhoneNumberInput.d.ts.map +1 -1
- package/build/types/Snackbar/Snackbar.d.ts +41 -24
- package/build/types/Snackbar/Snackbar.d.ts.map +1 -1
- package/build/types/Snackbar/Snackbar.messages.d.ts +9 -0
- package/build/types/Snackbar/Snackbar.messages.d.ts.map +1 -0
- package/build/types/Snackbar/Snackbar.types.d.ts +21 -0
- package/build/types/Snackbar/Snackbar.types.d.ts.map +1 -0
- package/build/types/Snackbar/SnackbarContext.d.ts +2 -2
- package/build/types/Snackbar/SnackbarContext.d.ts.map +1 -1
- package/build/types/Snackbar/SnackbarPortal.d.ts +5 -0
- package/build/types/Snackbar/SnackbarPortal.d.ts.map +1 -0
- package/build/types/Snackbar/SnackbarProvider.d.ts +6 -0
- package/build/types/Snackbar/SnackbarProvider.d.ts.map +1 -1
- package/build/types/Snackbar/constants.d.ts +6 -0
- package/build/types/Snackbar/constants.d.ts.map +1 -0
- package/build/types/Snackbar/index.d.ts +3 -1
- package/build/types/Snackbar/index.d.ts.map +1 -1
- package/build/types/Snackbar/useSnackbar.d.ts +1 -1
- package/build/types/Snackbar/useSnackbar.d.ts.map +1 -1
- package/build/types/Snackbar/useSnackbarAutoDismiss.d.ts +18 -0
- package/build/types/Snackbar/useSnackbarAutoDismiss.d.ts.map +1 -0
- package/build/types/Snackbar/useSnackbarManager.d.ts +17 -0
- package/build/types/Snackbar/useSnackbarManager.d.ts.map +1 -0
- package/build/types/Snackbar/useSnackbarSwipeDismiss.d.ts +11 -0
- package/build/types/Snackbar/useSnackbarSwipeDismiss.d.ts.map +1 -0
- package/build/types/common/PropsValues/typography.d.ts +1 -13
- package/build/types/common/PropsValues/typography.d.ts.map +1 -1
- package/build/types/index.d.ts +2 -2
- 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 +2 -2
- package/src/Button/Button.css +3 -0
- package/src/Button/Button.less +16 -0
- package/src/Button/_stories/Button.test.story.tsx +12 -12
- package/src/Calendar/DateHeader/DateHeader.tsx +3 -3
- package/src/Carousel/Carousel.tsx +3 -3
- package/src/DateInput/DateInput.css +0 -13
- package/src/DateInput/DateInput.less +2 -10
- package/src/DateInput/_stories/DateInput.test.story.tsx +13 -0
- package/src/Display/_stories/Display.story.tsx +6 -20
- package/src/ExpressiveMoneyInput/_stories/ExpressiveMoneyInput.rtl.test.story.tsx +1 -1
- package/src/InputWithDisplayFormat/_stories/InputWithDisplayFormat.test.story.tsx +0 -52
- package/src/Inputs/Input/Input.css +24 -0
- package/src/Inputs/SelectInput/OptionContent/SelectInputOptionContent.tsx +1 -4
- package/src/Inputs/SelectInput/SelectInput.test.tsx +0 -74
- package/src/Inputs/TextArea/TextArea.css +24 -0
- package/src/ListItem/ListItem.css +1 -1
- package/src/ListItem/ListItem.grid.less +4 -4
- package/src/ListItem/ListItem.less +1 -1
- package/src/ListItem/Navigation/ListItemNavigation.tsx +2 -2
- package/src/PhoneNumberInput/PhoneNumberInput.css +0 -3
- package/src/PhoneNumberInput/PhoneNumberInput.less +2 -10
- package/src/PhoneNumberInput/PhoneNumberInput.tsx +0 -1
- package/src/PhoneNumberInput/_stories/PhoneNumberInput.rtl.test.story.tsx +1 -1
- package/src/Popover/Popover.css +6 -0
- package/src/PromoCard/Indicator/PromoCardIndicator.tsx +2 -2
- package/src/PromoCard/PromoCard.css +3 -0
- package/src/PromoCard/PromoCard.less +5 -0
- package/src/Prompt/CriticalBanner/_stories/CriticalBanner.test.story.tsx +1 -1
- package/src/Snackbar/Snackbar.css +182 -61
- package/src/Snackbar/Snackbar.less +185 -56
- package/src/Snackbar/Snackbar.messages.ts +9 -0
- package/src/Snackbar/Snackbar.test.tsx +697 -0
- package/src/Snackbar/Snackbar.tsx +227 -96
- package/src/Snackbar/Snackbar.types.ts +26 -0
- package/src/Snackbar/SnackbarContext.ts +2 -2
- package/src/Snackbar/SnackbarPortal.tsx +110 -0
- package/src/Snackbar/SnackbarProvider.test.tsx +202 -0
- package/src/Snackbar/SnackbarProvider.tsx +25 -25
- package/src/Snackbar/_stories/Snackbar.accessibility.docs.mdx +73 -0
- package/src/Snackbar/_stories/Snackbar.rtl.test.story.tsx +1 -12
- package/src/Snackbar/_stories/Snackbar.story.tsx +447 -62
- package/src/Snackbar/_stories/Snackbar.test.story.tsx +91 -16
- package/src/Snackbar/constants.ts +5 -0
- package/src/Snackbar/index.ts +3 -1
- package/src/Snackbar/useSnackbarAutoDismiss.ts +155 -0
- package/src/Snackbar/useSnackbarManager.ts +181 -0
- package/src/Snackbar/useSnackbarSwipeDismiss.ts +129 -0
- package/src/_deprecated/Select/Select.css +6 -0
- package/src/common/PropsValues/typography.ts +1 -20
- package/src/i18n/en.json +1 -1
- package/src/index.ts +7 -2
- package/src/main.css +864 -1509
- package/src/styles/less/accordion.css +12 -0
- package/src/styles/less/button-groups.css +6 -0
- package/src/styles/less/buttons.css +2 -0
- package/src/styles/less/core/_typography.less +194 -26
- package/src/styles/less/decision.css +12 -0
- package/src/styles/less/dropdowns.css +18 -2
- package/src/styles/less/droppable.css +6 -0
- package/src/styles/less/footer.css +12 -0
- package/src/styles/less/forms/bootstrap-forms.css +24 -2
- package/src/styles/less/input-groups.css +42 -2
- package/src/styles/less/list-group.css +6 -0
- package/src/styles/less/navbar.css +18 -2
- package/src/styles/less/neptune-core.css +512 -4
- package/src/styles/less/neptune.bundle.less +0 -2
- package/src/styles/less/neptune.css +640 -1426
- package/src/styles/less/popovers.css +18 -0
- package/src/styles/less/tooltip.css +6 -0
- package/src/DateInput/_stories/DateInput.rtl.test.story.tsx +0 -36
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { useRef, useEffect } from 'react';
|
|
2
|
+
import withNextPortalWrapper from '../WithNextPortal/WithNextPortal.mjs';
|
|
3
|
+
import { SnackbarInternal } from './Snackbar.mjs';
|
|
4
|
+
import useSnackbarManager from './useSnackbarManager.mjs';
|
|
5
|
+
import { jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
const PortalledSnackbar = withNextPortalWrapper(SnackbarInternal);
|
|
8
|
+
const hasSnackbarText = text => text !== null && text !== undefined && text !== '';
|
|
9
|
+
const SnackbarPortal = ({
|
|
10
|
+
action,
|
|
11
|
+
duration,
|
|
12
|
+
loading,
|
|
13
|
+
media,
|
|
14
|
+
onDismiss,
|
|
15
|
+
sentiment,
|
|
16
|
+
text,
|
|
17
|
+
theme,
|
|
18
|
+
timeout,
|
|
19
|
+
timestamp
|
|
20
|
+
}) => {
|
|
21
|
+
const hasText = hasSnackbarText(text);
|
|
22
|
+
const previousTimestamp = useRef(timestamp);
|
|
23
|
+
const previousText = useRef(text);
|
|
24
|
+
const isInitialRender = useRef(true);
|
|
25
|
+
const {
|
|
26
|
+
active,
|
|
27
|
+
announcementKey,
|
|
28
|
+
dismissSnackbar,
|
|
29
|
+
handleExited,
|
|
30
|
+
showSnackbar,
|
|
31
|
+
updateSnackbar,
|
|
32
|
+
visible
|
|
33
|
+
} = useSnackbarManager(hasText ? {
|
|
34
|
+
action,
|
|
35
|
+
duration,
|
|
36
|
+
loading,
|
|
37
|
+
media,
|
|
38
|
+
onDismiss,
|
|
39
|
+
sentiment,
|
|
40
|
+
text,
|
|
41
|
+
theme,
|
|
42
|
+
timeout
|
|
43
|
+
} : undefined);
|
|
44
|
+
useEffect(() => {
|
|
45
|
+
if (isInitialRender.current) {
|
|
46
|
+
isInitialRender.current = false;
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (!hasText) {
|
|
50
|
+
dismissSnackbar();
|
|
51
|
+
previousTimestamp.current = timestamp;
|
|
52
|
+
previousText.current = text;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const snackbar = {
|
|
56
|
+
action,
|
|
57
|
+
duration,
|
|
58
|
+
loading,
|
|
59
|
+
media,
|
|
60
|
+
onDismiss,
|
|
61
|
+
sentiment,
|
|
62
|
+
text,
|
|
63
|
+
theme,
|
|
64
|
+
timeout
|
|
65
|
+
};
|
|
66
|
+
if (timestamp === undefined) {
|
|
67
|
+
// Without the legacy identity prop, update in place so recreated callbacks/media do not
|
|
68
|
+
// repeatedly restart the exit animation or auto-dismiss timer.
|
|
69
|
+
updateSnackbar(snackbar, !hasSnackbarText(previousText.current));
|
|
70
|
+
} else if (!hasSnackbarText(previousText.current) || previousTimestamp.current !== timestamp) {
|
|
71
|
+
showSnackbar(snackbar);
|
|
72
|
+
}
|
|
73
|
+
previousTimestamp.current = timestamp;
|
|
74
|
+
previousText.current = text;
|
|
75
|
+
}, [dismissSnackbar, showSnackbar, action, duration, hasText, loading, media, onDismiss, sentiment, text, theme, timeout, timestamp, updateSnackbar]);
|
|
76
|
+
if (!active) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
return /*#__PURE__*/jsx(PortalledSnackbar, {
|
|
80
|
+
...active.props,
|
|
81
|
+
announcementKey: announcementKey,
|
|
82
|
+
visible: visible,
|
|
83
|
+
onDismissRequest: dismissSnackbar,
|
|
84
|
+
onExited: handleExited
|
|
85
|
+
});
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export { PortalledSnackbar, SnackbarPortal };
|
|
89
|
+
//# sourceMappingURL=SnackbarPortal.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SnackbarPortal.mjs","sources":["../../src/Snackbar/SnackbarPortal.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport withNextPortal from '../WithNextPortal/WithNextPortal';\nimport { SnackbarInternal } from './Snackbar';\nimport type { SnackbarPortalProps } from './Snackbar.types';\nimport useSnackbarManager from './useSnackbarManager';\n\nexport const PortalledSnackbar = withNextPortal(SnackbarInternal);\n\nconst hasSnackbarText = (text: SnackbarPortalProps['text']) =>\n text !== null && text !== undefined && text !== '';\n\nexport const SnackbarPortal = ({\n action,\n duration,\n loading,\n media,\n onDismiss,\n sentiment,\n text,\n theme,\n timeout,\n timestamp,\n}: SnackbarPortalProps) => {\n const hasText = hasSnackbarText(text);\n const previousTimestamp = useRef(timestamp);\n const previousText = useRef(text);\n const isInitialRender = useRef(true);\n const {\n active,\n announcementKey,\n dismissSnackbar,\n handleExited,\n showSnackbar,\n updateSnackbar,\n visible,\n } = useSnackbarManager(\n hasText\n ? { action, duration, loading, media, onDismiss, sentiment, text, theme, timeout }\n : undefined,\n );\n\n useEffect(() => {\n if (isInitialRender.current) {\n isInitialRender.current = false;\n return;\n }\n\n if (!hasText) {\n dismissSnackbar();\n previousTimestamp.current = timestamp;\n previousText.current = text;\n return;\n }\n\n const snackbar = {\n action,\n duration,\n loading,\n media,\n onDismiss,\n sentiment,\n text,\n theme,\n timeout,\n };\n\n if (timestamp === undefined) {\n // Without the legacy identity prop, update in place so recreated callbacks/media do not\n // repeatedly restart the exit animation or auto-dismiss timer.\n updateSnackbar(snackbar, !hasSnackbarText(previousText.current));\n } else if (!hasSnackbarText(previousText.current) || previousTimestamp.current !== timestamp) {\n showSnackbar(snackbar);\n }\n\n previousTimestamp.current = timestamp;\n previousText.current = text;\n }, [\n dismissSnackbar,\n showSnackbar,\n action,\n duration,\n hasText,\n loading,\n media,\n onDismiss,\n sentiment,\n text,\n theme,\n timeout,\n timestamp,\n updateSnackbar,\n ]);\n\n if (!active) {\n return null;\n }\n\n return (\n <PortalledSnackbar\n {...active.props}\n announcementKey={announcementKey}\n visible={visible}\n onDismissRequest={dismissSnackbar}\n onExited={handleExited}\n />\n );\n};\n\nexport default SnackbarPortal;\n"],"names":["PortalledSnackbar","withNextPortal","SnackbarInternal","hasSnackbarText","text","undefined","SnackbarPortal","action","duration","loading","media","onDismiss","sentiment","theme","timeout","timestamp","hasText","previousTimestamp","useRef","previousText","isInitialRender","active","announcementKey","dismissSnackbar","handleExited","showSnackbar","updateSnackbar","visible","useSnackbarManager","useEffect","current","snackbar","_jsx","props","onDismissRequest","onExited"],"mappings":";;;;;;MAOaA,iBAAiB,GAAGC,qBAAc,CAACC,gBAAgB;AAEhE,MAAMC,eAAe,GAAIC,IAAiC,IACxDA,IAAI,KAAK,IAAI,IAAIA,IAAI,KAAKC,SAAS,IAAID,IAAI,KAAK,EAAE;AAE7C,MAAME,cAAc,GAAGA,CAAC;EAC7BC,MAAM;EACNC,QAAQ;EACRC,OAAO;EACPC,KAAK;EACLC,SAAS;EACTC,SAAS;EACTR,IAAI;EACJS,KAAK;EACLC,OAAO;AACPC,EAAAA;AAAS,CACW,KAAI;AACxB,EAAA,MAAMC,OAAO,GAAGb,eAAe,CAACC,IAAI,CAAC;AACrC,EAAA,MAAMa,iBAAiB,GAAGC,MAAM,CAACH,SAAS,CAAC;AAC3C,EAAA,MAAMI,YAAY,GAAGD,MAAM,CAACd,IAAI,CAAC;AACjC,EAAA,MAAMgB,eAAe,GAAGF,MAAM,CAAC,IAAI,CAAC;EACpC,MAAM;IACJG,MAAM;IACNC,eAAe;IACfC,eAAe;IACfC,YAAY;IACZC,YAAY;IACZC,cAAc;AACdC,IAAAA;GACD,GAAGC,kBAAkB,CACpBZ,OAAO,GACH;IAAET,MAAM;IAAEC,QAAQ;IAAEC,OAAO;IAAEC,KAAK;IAAEC,SAAS;IAAEC,SAAS;IAAER,IAAI;IAAES,KAAK;AAAEC,IAAAA;GAAS,GAChFT,SAAS,CACd;AAEDwB,EAAAA,SAAS,CAAC,MAAK;IACb,IAAIT,eAAe,CAACU,OAAO,EAAE;MAC3BV,eAAe,CAACU,OAAO,GAAG,KAAK;AAC/B,MAAA;AACF,IAAA;IAEA,IAAI,CAACd,OAAO,EAAE;AACZO,MAAAA,eAAe,EAAE;MACjBN,iBAAiB,CAACa,OAAO,GAAGf,SAAS;MACrCI,YAAY,CAACW,OAAO,GAAG1B,IAAI;AAC3B,MAAA;AACF,IAAA;AAEA,IAAA,MAAM2B,QAAQ,GAAG;MACfxB,MAAM;MACNC,QAAQ;MACRC,OAAO;MACPC,KAAK;MACLC,SAAS;MACTC,SAAS;MACTR,IAAI;MACJS,KAAK;AACLC,MAAAA;KACD;IAED,IAAIC,SAAS,KAAKV,SAAS,EAAE;AAC3B;AACA;MACAqB,cAAc,CAACK,QAAQ,EAAE,CAAC5B,eAAe,CAACgB,YAAY,CAACW,OAAO,CAAC,CAAC;AAClE,IAAA,CAAC,MAAM,IAAI,CAAC3B,eAAe,CAACgB,YAAY,CAACW,OAAO,CAAC,IAAIb,iBAAiB,CAACa,OAAO,KAAKf,SAAS,EAAE;MAC5FU,YAAY,CAACM,QAAQ,CAAC;AACxB,IAAA;IAEAd,iBAAiB,CAACa,OAAO,GAAGf,SAAS;IACrCI,YAAY,CAACW,OAAO,GAAG1B,IAAI;AAC7B,EAAA,CAAC,EAAE,CACDmB,eAAe,EACfE,YAAY,EACZlB,MAAM,EACNC,QAAQ,EACRQ,OAAO,EACPP,OAAO,EACPC,KAAK,EACLC,SAAS,EACTC,SAAS,EACTR,IAAI,EACJS,KAAK,EACLC,OAAO,EACPC,SAAS,EACTW,cAAc,CACf,CAAC;EAEF,IAAI,CAACL,MAAM,EAAE;AACX,IAAA,OAAO,IAAI;AACb,EAAA;EAEA,oBACEW,GAAA,CAAChC,iBAAiB,EAAA;IAAA,GACZqB,MAAM,CAACY,KAAK;AAChBX,IAAAA,eAAe,EAAEA,eAAgB;AACjCK,IAAAA,OAAO,EAAEA,OAAQ;AACjBO,IAAAA,gBAAgB,EAAEX,eAAgB;AAClCY,IAAAA,QAAQ,EAAEX;AAAa,GAAA,CACvB;AAEN;;"}
|
|
@@ -3,46 +3,36 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var React = require('react');
|
|
6
|
-
var Snackbar = require('./Snackbar.js');
|
|
7
6
|
var SnackbarContext = require('./SnackbarContext.js');
|
|
7
|
+
var SnackbarPortal = require('./SnackbarPortal.js');
|
|
8
|
+
var useSnackbarManager = require('./useSnackbarManager.js');
|
|
8
9
|
var jsxRuntime = require('react/jsx-runtime');
|
|
9
10
|
|
|
10
11
|
function SnackbarProvider({
|
|
11
|
-
timeout
|
|
12
|
+
timeout,
|
|
12
13
|
children
|
|
13
14
|
}) {
|
|
14
|
-
const [state, setState] = React.useState({
|
|
15
|
-
text: '',
|
|
16
|
-
timestamp: 0
|
|
17
|
-
});
|
|
18
15
|
const {
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
16
|
+
active,
|
|
17
|
+
announcementKey,
|
|
18
|
+
dismissSnackbar,
|
|
19
|
+
handleExited,
|
|
20
|
+
showSnackbar,
|
|
21
|
+
visible
|
|
22
|
+
} = useSnackbarManager.default();
|
|
23
|
+
const contextValue = React.useMemo(() => ({
|
|
24
|
+
createSnackbar: showSnackbar
|
|
25
|
+
}), [showSnackbar]);
|
|
24
26
|
return /*#__PURE__*/jsxRuntime.jsxs(SnackbarContext.SnackbarContext.Provider, {
|
|
25
|
-
value:
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
theme
|
|
30
|
-
}) => {
|
|
31
|
-
setState({
|
|
32
|
-
action,
|
|
33
|
-
text,
|
|
34
|
-
theme,
|
|
35
|
-
timestamp: Date.now()
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
}), []),
|
|
39
|
-
children: [/*#__PURE__*/jsxRuntime.jsx(Snackbar.default, {
|
|
40
|
-
action: action,
|
|
41
|
-
text: text,
|
|
42
|
-
timestamp: timestamp,
|
|
27
|
+
value: contextValue,
|
|
28
|
+
children: [active ? /*#__PURE__*/jsxRuntime.jsx(SnackbarPortal.PortalledSnackbar, {
|
|
29
|
+
...active.props,
|
|
30
|
+
announcementKey: announcementKey,
|
|
43
31
|
timeout: timeout,
|
|
44
|
-
|
|
45
|
-
|
|
32
|
+
visible: visible,
|
|
33
|
+
onDismissRequest: dismissSnackbar,
|
|
34
|
+
onExited: handleExited
|
|
35
|
+
}, active.id) : null, children]
|
|
46
36
|
});
|
|
47
37
|
}
|
|
48
38
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnackbarProvider.js","sources":["../../src/Snackbar/SnackbarProvider.tsx"],"sourcesContent":["import { useMemo
|
|
1
|
+
{"version":3,"file":"SnackbarProvider.js","sources":["../../src/Snackbar/SnackbarProvider.tsx"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { SnackbarContext } from './SnackbarContext';\nimport { PortalledSnackbar } from './SnackbarPortal';\nimport useSnackbarManager from './useSnackbarManager';\n\nexport interface SnackbarProviderProps {\n /**\n * @deprecated Configure each Snackbar with semantic `duration` instead. Existing millisecond\n * values remain supported temporarily while consumers migrate. A Snackbar's `duration` takes\n * precedence when both are provided.\n */\n timeout?: number;\n /** Application content that can create Snackbars through the Provider context. */\n children?: React.ReactNode;\n}\n\nexport default function SnackbarProvider({ timeout, children }: SnackbarProviderProps) {\n const { active, announcementKey, dismissSnackbar, handleExited, showSnackbar, visible } =\n useSnackbarManager();\n const contextValue = useMemo(() => ({ createSnackbar: showSnackbar }), [showSnackbar]);\n\n return (\n <SnackbarContext.Provider value={contextValue}>\n {active ? (\n <PortalledSnackbar\n key={active.id}\n {...active.props}\n announcementKey={announcementKey}\n timeout={timeout}\n visible={visible}\n onDismissRequest={dismissSnackbar}\n onExited={handleExited}\n />\n ) : null}\n {children}\n </SnackbarContext.Provider>\n );\n}\n"],"names":["SnackbarProvider","timeout","children","active","announcementKey","dismissSnackbar","handleExited","showSnackbar","visible","useSnackbarManager","contextValue","useMemo","createSnackbar","_jsxs","SnackbarContext","Provider","value","_jsx","PortalledSnackbar","props","onDismissRequest","onExited","id"],"mappings":";;;;;;;;;;AAiBc,SAAUA,gBAAgBA,CAAC;EAAEC,OAAO;AAAEC,EAAAA;AAAQ,CAAyB,EAAA;EACnF,MAAM;IAAEC,MAAM;IAAEC,eAAe;IAAEC,eAAe;IAAEC,YAAY;IAAEC,YAAY;AAAEC,IAAAA;GAAS,GACrFC,0BAAkB,EAAE;AACtB,EAAA,MAAMC,YAAY,GAAGC,aAAO,CAAC,OAAO;AAAEC,IAAAA,cAAc,EAAEL;GAAc,CAAC,EAAE,CAACA,YAAY,CAAC,CAAC;AAEtF,EAAA,oBACEM,eAAA,CAACC,+BAAe,CAACC,QAAQ,EAAA;AAACC,IAAAA,KAAK,EAAEN,YAAa;AAAAR,IAAAA,QAAA,EAAA,CAC3CC,MAAM,gBACLc,cAAA,CAACC,gCAAiB,EAAA;MAAA,GAEZf,MAAM,CAACgB,KAAK;AAChBf,MAAAA,eAAe,EAAEA,eAAgB;AACjCH,MAAAA,OAAO,EAAEA,OAAQ;AACjBO,MAAAA,OAAO,EAAEA,OAAQ;AACjBY,MAAAA,gBAAgB,EAAEf,eAAgB;AAClCgB,MAAAA,QAAQ,EAAEf;AAAa,KAAA,EANlBH,MAAM,CAACmB,EAMW,CACvB,GACA,IAAI,EACPpB,QAAQ;AAAA,GACe,CAAC;AAE/B;;"}
|
|
@@ -1,44 +1,34 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import SnackbarPortal from './Snackbar.mjs';
|
|
1
|
+
import { useMemo } from 'react';
|
|
3
2
|
import { SnackbarContext } from './SnackbarContext.mjs';
|
|
3
|
+
import { PortalledSnackbar } from './SnackbarPortal.mjs';
|
|
4
|
+
import useSnackbarManager from './useSnackbarManager.mjs';
|
|
4
5
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
5
6
|
|
|
6
7
|
function SnackbarProvider({
|
|
7
|
-
timeout
|
|
8
|
+
timeout,
|
|
8
9
|
children
|
|
9
10
|
}) {
|
|
10
|
-
const [state, setState] = useState({
|
|
11
|
-
text: '',
|
|
12
|
-
timestamp: 0
|
|
13
|
-
});
|
|
14
11
|
const {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
active,
|
|
13
|
+
announcementKey,
|
|
14
|
+
dismissSnackbar,
|
|
15
|
+
handleExited,
|
|
16
|
+
showSnackbar,
|
|
17
|
+
visible
|
|
18
|
+
} = useSnackbarManager();
|
|
19
|
+
const contextValue = useMemo(() => ({
|
|
20
|
+
createSnackbar: showSnackbar
|
|
21
|
+
}), [showSnackbar]);
|
|
20
22
|
return /*#__PURE__*/jsxs(SnackbarContext.Provider, {
|
|
21
|
-
value:
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
theme
|
|
26
|
-
}) => {
|
|
27
|
-
setState({
|
|
28
|
-
action,
|
|
29
|
-
text,
|
|
30
|
-
theme,
|
|
31
|
-
timestamp: Date.now()
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
}), []),
|
|
35
|
-
children: [/*#__PURE__*/jsx(SnackbarPortal, {
|
|
36
|
-
action: action,
|
|
37
|
-
text: text,
|
|
38
|
-
timestamp: timestamp,
|
|
23
|
+
value: contextValue,
|
|
24
|
+
children: [active ? /*#__PURE__*/jsx(PortalledSnackbar, {
|
|
25
|
+
...active.props,
|
|
26
|
+
announcementKey: announcementKey,
|
|
39
27
|
timeout: timeout,
|
|
40
|
-
|
|
41
|
-
|
|
28
|
+
visible: visible,
|
|
29
|
+
onDismissRequest: dismissSnackbar,
|
|
30
|
+
onExited: handleExited
|
|
31
|
+
}, active.id) : null, children]
|
|
42
32
|
});
|
|
43
33
|
}
|
|
44
34
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnackbarProvider.mjs","sources":["../../src/Snackbar/SnackbarProvider.tsx"],"sourcesContent":["import { useMemo
|
|
1
|
+
{"version":3,"file":"SnackbarProvider.mjs","sources":["../../src/Snackbar/SnackbarProvider.tsx"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { SnackbarContext } from './SnackbarContext';\nimport { PortalledSnackbar } from './SnackbarPortal';\nimport useSnackbarManager from './useSnackbarManager';\n\nexport interface SnackbarProviderProps {\n /**\n * @deprecated Configure each Snackbar with semantic `duration` instead. Existing millisecond\n * values remain supported temporarily while consumers migrate. A Snackbar's `duration` takes\n * precedence when both are provided.\n */\n timeout?: number;\n /** Application content that can create Snackbars through the Provider context. */\n children?: React.ReactNode;\n}\n\nexport default function SnackbarProvider({ timeout, children }: SnackbarProviderProps) {\n const { active, announcementKey, dismissSnackbar, handleExited, showSnackbar, visible } =\n useSnackbarManager();\n const contextValue = useMemo(() => ({ createSnackbar: showSnackbar }), [showSnackbar]);\n\n return (\n <SnackbarContext.Provider value={contextValue}>\n {active ? (\n <PortalledSnackbar\n key={active.id}\n {...active.props}\n announcementKey={announcementKey}\n timeout={timeout}\n visible={visible}\n onDismissRequest={dismissSnackbar}\n onExited={handleExited}\n />\n ) : null}\n {children}\n </SnackbarContext.Provider>\n );\n}\n"],"names":["SnackbarProvider","timeout","children","active","announcementKey","dismissSnackbar","handleExited","showSnackbar","visible","useSnackbarManager","contextValue","useMemo","createSnackbar","_jsxs","SnackbarContext","Provider","value","_jsx","PortalledSnackbar","props","onDismissRequest","onExited","id"],"mappings":";;;;;;AAiBc,SAAUA,gBAAgBA,CAAC;EAAEC,OAAO;AAAEC,EAAAA;AAAQ,CAAyB,EAAA;EACnF,MAAM;IAAEC,MAAM;IAAEC,eAAe;IAAEC,eAAe;IAAEC,YAAY;IAAEC,YAAY;AAAEC,IAAAA;GAAS,GACrFC,kBAAkB,EAAE;AACtB,EAAA,MAAMC,YAAY,GAAGC,OAAO,CAAC,OAAO;AAAEC,IAAAA,cAAc,EAAEL;GAAc,CAAC,EAAE,CAACA,YAAY,CAAC,CAAC;AAEtF,EAAA,oBACEM,IAAA,CAACC,eAAe,CAACC,QAAQ,EAAA;AAACC,IAAAA,KAAK,EAAEN,YAAa;AAAAR,IAAAA,QAAA,EAAA,CAC3CC,MAAM,gBACLc,GAAA,CAACC,iBAAiB,EAAA;MAAA,GAEZf,MAAM,CAACgB,KAAK;AAChBf,MAAAA,eAAe,EAAEA,eAAgB;AACjCH,MAAAA,OAAO,EAAEA,OAAQ;AACjBO,MAAAA,OAAO,EAAEA,OAAQ;AACjBY,MAAAA,gBAAgB,EAAEf,eAAgB;AAClCgB,MAAAA,QAAQ,EAAEf;AAAa,KAAA,EANlBH,MAAM,CAACmB,EAMW,CACvB,GACA,IAAI,EACPpB,QAAQ;AAAA,GACe,CAAC;AAE/B;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const SNACKBAR_ENTER_DURATION = 300;
|
|
4
|
+
const SNACKBAR_EXIT_DURATION = 150;
|
|
5
|
+
const SNACKBAR_DEFAULT_DURATION = 4000;
|
|
6
|
+
const SNACKBAR_EXTENDED_DURATION = 6000;
|
|
7
|
+
const SWIPE_DISMISS_THRESHOLD_RATIO = 0.5;
|
|
8
|
+
|
|
9
|
+
exports.SNACKBAR_DEFAULT_DURATION = SNACKBAR_DEFAULT_DURATION;
|
|
10
|
+
exports.SNACKBAR_ENTER_DURATION = SNACKBAR_ENTER_DURATION;
|
|
11
|
+
exports.SNACKBAR_EXIT_DURATION = SNACKBAR_EXIT_DURATION;
|
|
12
|
+
exports.SNACKBAR_EXTENDED_DURATION = SNACKBAR_EXTENDED_DURATION;
|
|
13
|
+
exports.SWIPE_DISMISS_THRESHOLD_RATIO = SWIPE_DISMISS_THRESHOLD_RATIO;
|
|
14
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sources":["../../src/Snackbar/constants.ts"],"sourcesContent":["export const SNACKBAR_ENTER_DURATION = 300;\nexport const SNACKBAR_EXIT_DURATION = 150;\nexport const SNACKBAR_DEFAULT_DURATION = 4000;\nexport const SNACKBAR_EXTENDED_DURATION = 6000;\nexport const SWIPE_DISMISS_THRESHOLD_RATIO = 0.5;\n"],"names":["SNACKBAR_ENTER_DURATION","SNACKBAR_EXIT_DURATION","SNACKBAR_DEFAULT_DURATION","SNACKBAR_EXTENDED_DURATION","SWIPE_DISMISS_THRESHOLD_RATIO"],"mappings":";;AAAO,MAAMA,uBAAuB,GAAG;AAChC,MAAMC,sBAAsB,GAAG;AAC/B,MAAMC,yBAAyB,GAAG;AAClC,MAAMC,0BAA0B,GAAG;AACnC,MAAMC,6BAA6B,GAAG;;;;;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
const SNACKBAR_ENTER_DURATION = 300;
|
|
2
|
+
const SNACKBAR_EXIT_DURATION = 150;
|
|
3
|
+
const SNACKBAR_DEFAULT_DURATION = 4000;
|
|
4
|
+
const SNACKBAR_EXTENDED_DURATION = 6000;
|
|
5
|
+
const SWIPE_DISMISS_THRESHOLD_RATIO = 0.5;
|
|
6
|
+
|
|
7
|
+
export { SNACKBAR_DEFAULT_DURATION, SNACKBAR_ENTER_DURATION, SNACKBAR_EXIT_DURATION, SNACKBAR_EXTENDED_DURATION, SWIPE_DISMISS_THRESHOLD_RATIO };
|
|
8
|
+
//# sourceMappingURL=constants.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.mjs","sources":["../../src/Snackbar/constants.ts"],"sourcesContent":["export const SNACKBAR_ENTER_DURATION = 300;\nexport const SNACKBAR_EXIT_DURATION = 150;\nexport const SNACKBAR_DEFAULT_DURATION = 4000;\nexport const SNACKBAR_EXTENDED_DURATION = 6000;\nexport const SWIPE_DISMISS_THRESHOLD_RATIO = 0.5;\n"],"names":["SNACKBAR_ENTER_DURATION","SNACKBAR_EXIT_DURATION","SNACKBAR_DEFAULT_DURATION","SNACKBAR_EXTENDED_DURATION","SWIPE_DISMISS_THRESHOLD_RATIO"],"mappings":"AAAO,MAAMA,uBAAuB,GAAG;AAChC,MAAMC,sBAAsB,GAAG;AAC/B,MAAMC,yBAAyB,GAAG;AAClC,MAAMC,0BAA0B,GAAG;AACnC,MAAMC,6BAA6B,GAAG;;"}
|
|
@@ -0,0 +1,135 @@
|
|
|
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 getAutoDismissDuration = ({
|
|
9
|
+
duration,
|
|
10
|
+
loading,
|
|
11
|
+
timeout
|
|
12
|
+
}) => {
|
|
13
|
+
if (loading || duration === 'indefinite') {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
if (duration === 'extended') {
|
|
17
|
+
return constants.SNACKBAR_EXTENDED_DURATION;
|
|
18
|
+
}
|
|
19
|
+
if (duration === 'default') {
|
|
20
|
+
return constants.SNACKBAR_DEFAULT_DURATION;
|
|
21
|
+
}
|
|
22
|
+
return timeout ?? constants.SNACKBAR_DEFAULT_DURATION;
|
|
23
|
+
};
|
|
24
|
+
const useSnackbarAutoDismiss = ({
|
|
25
|
+
duration,
|
|
26
|
+
loading,
|
|
27
|
+
onDismissRequest,
|
|
28
|
+
resetKey,
|
|
29
|
+
timeout,
|
|
30
|
+
visible
|
|
31
|
+
}) => {
|
|
32
|
+
const surfaceRef = React.useRef(null);
|
|
33
|
+
const timeoutRef = React.useRef(0);
|
|
34
|
+
const remainingDurationRef = React.useRef(null);
|
|
35
|
+
const timerStartedAtRef = React.useRef(0);
|
|
36
|
+
const interactionStateRef = React.useRef({
|
|
37
|
+
focusWithin: false,
|
|
38
|
+
hovered: false
|
|
39
|
+
});
|
|
40
|
+
const isInterrupted = React.useCallback(() => {
|
|
41
|
+
const {
|
|
42
|
+
focusWithin,
|
|
43
|
+
hovered
|
|
44
|
+
} = interactionStateRef.current;
|
|
45
|
+
return focusWithin || hovered;
|
|
46
|
+
}, []);
|
|
47
|
+
const clearTimer = React.useCallback(() => {
|
|
48
|
+
window.clearTimeout(timeoutRef.current);
|
|
49
|
+
timeoutRef.current = 0;
|
|
50
|
+
}, []);
|
|
51
|
+
const startTimer = React.useCallback((remainingDuration = getAutoDismissDuration({
|
|
52
|
+
duration,
|
|
53
|
+
loading,
|
|
54
|
+
timeout
|
|
55
|
+
})) => {
|
|
56
|
+
clearTimer();
|
|
57
|
+
remainingDurationRef.current = remainingDuration;
|
|
58
|
+
if (!visible || remainingDuration === null || isInterrupted()) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
timerStartedAtRef.current = Date.now();
|
|
62
|
+
timeoutRef.current = window.setTimeout(() => {
|
|
63
|
+
timeoutRef.current = 0;
|
|
64
|
+
remainingDurationRef.current = 0;
|
|
65
|
+
onDismissRequest();
|
|
66
|
+
}, remainingDuration);
|
|
67
|
+
}, [clearTimer, duration, isInterrupted, loading, onDismissRequest, timeout, visible]);
|
|
68
|
+
const pauseTimer = React.useCallback(() => {
|
|
69
|
+
if (!timeoutRef.current || remainingDurationRef.current === null) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
clearTimer();
|
|
73
|
+
remainingDurationRef.current = Math.max(0, remainingDurationRef.current - (Date.now() - timerStartedAtRef.current));
|
|
74
|
+
}, [clearTimer]);
|
|
75
|
+
const resumeTimer = React.useCallback(() => {
|
|
76
|
+
if (isInterrupted() || remainingDurationRef.current === null) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
startTimer(remainingDurationRef.current);
|
|
80
|
+
}, [isInterrupted, startTimer]);
|
|
81
|
+
const handleMouseEnter = React.useCallback(() => {
|
|
82
|
+
interactionStateRef.current = {
|
|
83
|
+
...interactionStateRef.current,
|
|
84
|
+
hovered: true
|
|
85
|
+
};
|
|
86
|
+
pauseTimer();
|
|
87
|
+
}, [pauseTimer]);
|
|
88
|
+
const handleMouseLeave = React.useCallback(() => {
|
|
89
|
+
interactionStateRef.current = {
|
|
90
|
+
...interactionStateRef.current,
|
|
91
|
+
hovered: false
|
|
92
|
+
};
|
|
93
|
+
resumeTimer();
|
|
94
|
+
}, [resumeTimer]);
|
|
95
|
+
const handleFocus = React.useCallback(() => {
|
|
96
|
+
interactionStateRef.current = {
|
|
97
|
+
...interactionStateRef.current,
|
|
98
|
+
focusWithin: true
|
|
99
|
+
};
|
|
100
|
+
pauseTimer();
|
|
101
|
+
}, [pauseTimer]);
|
|
102
|
+
const handleBlur = React.useCallback(event => {
|
|
103
|
+
if (event.currentTarget.contains(event.relatedTarget)) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
interactionStateRef.current = {
|
|
107
|
+
...interactionStateRef.current,
|
|
108
|
+
focusWithin: false
|
|
109
|
+
};
|
|
110
|
+
resumeTimer();
|
|
111
|
+
}, [resumeTimer]);
|
|
112
|
+
React.useEffect(() => {
|
|
113
|
+
if (!visible) {
|
|
114
|
+
clearTimer();
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
const snackbar = surfaceRef.current;
|
|
118
|
+
interactionStateRef.current = {
|
|
119
|
+
focusWithin: Boolean(snackbar?.contains(document.activeElement)),
|
|
120
|
+
hovered: snackbar?.matches(':hover') ?? false
|
|
121
|
+
};
|
|
122
|
+
startTimer();
|
|
123
|
+
return clearTimer;
|
|
124
|
+
}, [clearTimer, resetKey, startTimer, visible]);
|
|
125
|
+
return {
|
|
126
|
+
handleBlur,
|
|
127
|
+
handleFocus,
|
|
128
|
+
handleMouseEnter,
|
|
129
|
+
handleMouseLeave,
|
|
130
|
+
surfaceRef
|
|
131
|
+
};
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
exports.default = useSnackbarAutoDismiss;
|
|
135
|
+
//# sourceMappingURL=useSnackbarAutoDismiss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSnackbarAutoDismiss.js","sources":["../../src/Snackbar/useSnackbarAutoDismiss.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nimport { SNACKBAR_DEFAULT_DURATION, SNACKBAR_EXTENDED_DURATION } from './constants';\nimport type { SnackbarDuration } from './Snackbar.types';\n\ntype UseSnackbarAutoDismissOptions = {\n duration?: SnackbarDuration;\n loading?: boolean;\n onDismissRequest: () => void;\n resetKey: string | number;\n timeout?: number;\n visible: boolean;\n};\n\ntype InteractionState = {\n focusWithin: boolean;\n hovered: boolean;\n};\n\nconst getAutoDismissDuration = ({\n duration,\n loading,\n timeout,\n}: Pick<UseSnackbarAutoDismissOptions, 'duration' | 'loading' | 'timeout'>) => {\n if (loading || duration === 'indefinite') {\n return null;\n }\n\n if (duration === 'extended') {\n return SNACKBAR_EXTENDED_DURATION;\n }\n\n if (duration === 'default') {\n return SNACKBAR_DEFAULT_DURATION;\n }\n\n return timeout ?? SNACKBAR_DEFAULT_DURATION;\n};\n\nconst useSnackbarAutoDismiss = ({\n duration,\n loading,\n onDismissRequest,\n resetKey,\n timeout,\n visible,\n}: UseSnackbarAutoDismissOptions) => {\n const surfaceRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef(0);\n const remainingDurationRef = useRef<number | null>(null);\n const timerStartedAtRef = useRef(0);\n const interactionStateRef = useRef<InteractionState>({ focusWithin: false, hovered: false });\n\n const isInterrupted = useCallback(() => {\n const { focusWithin, hovered } = interactionStateRef.current;\n return focusWithin || hovered;\n }, []);\n\n const clearTimer = useCallback(() => {\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = 0;\n }, []);\n\n const startTimer = useCallback(\n (remainingDuration = getAutoDismissDuration({ duration, loading, timeout })) => {\n clearTimer();\n remainingDurationRef.current = remainingDuration;\n\n if (!visible || remainingDuration === null || isInterrupted()) {\n return;\n }\n\n timerStartedAtRef.current = Date.now();\n timeoutRef.current = window.setTimeout(() => {\n timeoutRef.current = 0;\n remainingDurationRef.current = 0;\n onDismissRequest();\n }, remainingDuration);\n },\n [clearTimer, duration, isInterrupted, loading, onDismissRequest, timeout, visible],\n );\n\n const pauseTimer = useCallback(() => {\n if (!timeoutRef.current || remainingDurationRef.current === null) {\n return;\n }\n\n clearTimer();\n remainingDurationRef.current = Math.max(\n 0,\n remainingDurationRef.current - (Date.now() - timerStartedAtRef.current),\n );\n }, [clearTimer]);\n\n const resumeTimer = useCallback(() => {\n if (isInterrupted() || remainingDurationRef.current === null) {\n return;\n }\n\n startTimer(remainingDurationRef.current);\n }, [isInterrupted, startTimer]);\n\n const handleMouseEnter = useCallback(() => {\n interactionStateRef.current = { ...interactionStateRef.current, hovered: true };\n pauseTimer();\n }, [pauseTimer]);\n\n const handleMouseLeave = useCallback(() => {\n interactionStateRef.current = { ...interactionStateRef.current, hovered: false };\n resumeTimer();\n }, [resumeTimer]);\n\n const handleFocus = useCallback(() => {\n interactionStateRef.current = { ...interactionStateRef.current, focusWithin: true };\n pauseTimer();\n }, [pauseTimer]);\n\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n if (event.currentTarget.contains(event.relatedTarget)) {\n return;\n }\n\n interactionStateRef.current = { ...interactionStateRef.current, focusWithin: false };\n resumeTimer();\n },\n [resumeTimer],\n );\n\n useEffect(() => {\n if (!visible) {\n clearTimer();\n return undefined;\n }\n\n const snackbar = surfaceRef.current;\n interactionStateRef.current = {\n focusWithin: Boolean(snackbar?.contains(document.activeElement)),\n hovered: snackbar?.matches(':hover') ?? false,\n };\n startTimer();\n\n return clearTimer;\n }, [clearTimer, resetKey, startTimer, visible]);\n\n return {\n handleBlur,\n handleFocus,\n handleMouseEnter,\n handleMouseLeave,\n surfaceRef,\n };\n};\n\nexport default useSnackbarAutoDismiss;\n"],"names":["getAutoDismissDuration","duration","loading","timeout","SNACKBAR_EXTENDED_DURATION","SNACKBAR_DEFAULT_DURATION","useSnackbarAutoDismiss","onDismissRequest","resetKey","visible","surfaceRef","useRef","timeoutRef","remainingDurationRef","timerStartedAtRef","interactionStateRef","focusWithin","hovered","isInterrupted","useCallback","current","clearTimer","window","clearTimeout","startTimer","remainingDuration","Date","now","setTimeout","pauseTimer","Math","max","resumeTimer","handleMouseEnter","handleMouseLeave","handleFocus","handleBlur","event","currentTarget","contains","relatedTarget","useEffect","undefined","snackbar","Boolean","document","activeElement","matches"],"mappings":"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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { useRef, useCallback, useEffect } from 'react';
|
|
2
|
+
import { SNACKBAR_EXTENDED_DURATION, SNACKBAR_DEFAULT_DURATION } from './constants.mjs';
|
|
3
|
+
|
|
4
|
+
const getAutoDismissDuration = ({
|
|
5
|
+
duration,
|
|
6
|
+
loading,
|
|
7
|
+
timeout
|
|
8
|
+
}) => {
|
|
9
|
+
if (loading || duration === 'indefinite') {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
if (duration === 'extended') {
|
|
13
|
+
return SNACKBAR_EXTENDED_DURATION;
|
|
14
|
+
}
|
|
15
|
+
if (duration === 'default') {
|
|
16
|
+
return SNACKBAR_DEFAULT_DURATION;
|
|
17
|
+
}
|
|
18
|
+
return timeout ?? SNACKBAR_DEFAULT_DURATION;
|
|
19
|
+
};
|
|
20
|
+
const useSnackbarAutoDismiss = ({
|
|
21
|
+
duration,
|
|
22
|
+
loading,
|
|
23
|
+
onDismissRequest,
|
|
24
|
+
resetKey,
|
|
25
|
+
timeout,
|
|
26
|
+
visible
|
|
27
|
+
}) => {
|
|
28
|
+
const surfaceRef = useRef(null);
|
|
29
|
+
const timeoutRef = useRef(0);
|
|
30
|
+
const remainingDurationRef = useRef(null);
|
|
31
|
+
const timerStartedAtRef = useRef(0);
|
|
32
|
+
const interactionStateRef = useRef({
|
|
33
|
+
focusWithin: false,
|
|
34
|
+
hovered: false
|
|
35
|
+
});
|
|
36
|
+
const isInterrupted = useCallback(() => {
|
|
37
|
+
const {
|
|
38
|
+
focusWithin,
|
|
39
|
+
hovered
|
|
40
|
+
} = interactionStateRef.current;
|
|
41
|
+
return focusWithin || hovered;
|
|
42
|
+
}, []);
|
|
43
|
+
const clearTimer = useCallback(() => {
|
|
44
|
+
window.clearTimeout(timeoutRef.current);
|
|
45
|
+
timeoutRef.current = 0;
|
|
46
|
+
}, []);
|
|
47
|
+
const startTimer = useCallback((remainingDuration = getAutoDismissDuration({
|
|
48
|
+
duration,
|
|
49
|
+
loading,
|
|
50
|
+
timeout
|
|
51
|
+
})) => {
|
|
52
|
+
clearTimer();
|
|
53
|
+
remainingDurationRef.current = remainingDuration;
|
|
54
|
+
if (!visible || remainingDuration === null || isInterrupted()) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
timerStartedAtRef.current = Date.now();
|
|
58
|
+
timeoutRef.current = window.setTimeout(() => {
|
|
59
|
+
timeoutRef.current = 0;
|
|
60
|
+
remainingDurationRef.current = 0;
|
|
61
|
+
onDismissRequest();
|
|
62
|
+
}, remainingDuration);
|
|
63
|
+
}, [clearTimer, duration, isInterrupted, loading, onDismissRequest, timeout, visible]);
|
|
64
|
+
const pauseTimer = useCallback(() => {
|
|
65
|
+
if (!timeoutRef.current || remainingDurationRef.current === null) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
clearTimer();
|
|
69
|
+
remainingDurationRef.current = Math.max(0, remainingDurationRef.current - (Date.now() - timerStartedAtRef.current));
|
|
70
|
+
}, [clearTimer]);
|
|
71
|
+
const resumeTimer = useCallback(() => {
|
|
72
|
+
if (isInterrupted() || remainingDurationRef.current === null) {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
startTimer(remainingDurationRef.current);
|
|
76
|
+
}, [isInterrupted, startTimer]);
|
|
77
|
+
const handleMouseEnter = useCallback(() => {
|
|
78
|
+
interactionStateRef.current = {
|
|
79
|
+
...interactionStateRef.current,
|
|
80
|
+
hovered: true
|
|
81
|
+
};
|
|
82
|
+
pauseTimer();
|
|
83
|
+
}, [pauseTimer]);
|
|
84
|
+
const handleMouseLeave = useCallback(() => {
|
|
85
|
+
interactionStateRef.current = {
|
|
86
|
+
...interactionStateRef.current,
|
|
87
|
+
hovered: false
|
|
88
|
+
};
|
|
89
|
+
resumeTimer();
|
|
90
|
+
}, [resumeTimer]);
|
|
91
|
+
const handleFocus = useCallback(() => {
|
|
92
|
+
interactionStateRef.current = {
|
|
93
|
+
...interactionStateRef.current,
|
|
94
|
+
focusWithin: true
|
|
95
|
+
};
|
|
96
|
+
pauseTimer();
|
|
97
|
+
}, [pauseTimer]);
|
|
98
|
+
const handleBlur = useCallback(event => {
|
|
99
|
+
if (event.currentTarget.contains(event.relatedTarget)) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
interactionStateRef.current = {
|
|
103
|
+
...interactionStateRef.current,
|
|
104
|
+
focusWithin: false
|
|
105
|
+
};
|
|
106
|
+
resumeTimer();
|
|
107
|
+
}, [resumeTimer]);
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
if (!visible) {
|
|
110
|
+
clearTimer();
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
const snackbar = surfaceRef.current;
|
|
114
|
+
interactionStateRef.current = {
|
|
115
|
+
focusWithin: Boolean(snackbar?.contains(document.activeElement)),
|
|
116
|
+
hovered: snackbar?.matches(':hover') ?? false
|
|
117
|
+
};
|
|
118
|
+
startTimer();
|
|
119
|
+
return clearTimer;
|
|
120
|
+
}, [clearTimer, resetKey, startTimer, visible]);
|
|
121
|
+
return {
|
|
122
|
+
handleBlur,
|
|
123
|
+
handleFocus,
|
|
124
|
+
handleMouseEnter,
|
|
125
|
+
handleMouseLeave,
|
|
126
|
+
surfaceRef
|
|
127
|
+
};
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
export { useSnackbarAutoDismiss as default };
|
|
131
|
+
//# sourceMappingURL=useSnackbarAutoDismiss.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSnackbarAutoDismiss.mjs","sources":["../../src/Snackbar/useSnackbarAutoDismiss.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\n\nimport { SNACKBAR_DEFAULT_DURATION, SNACKBAR_EXTENDED_DURATION } from './constants';\nimport type { SnackbarDuration } from './Snackbar.types';\n\ntype UseSnackbarAutoDismissOptions = {\n duration?: SnackbarDuration;\n loading?: boolean;\n onDismissRequest: () => void;\n resetKey: string | number;\n timeout?: number;\n visible: boolean;\n};\n\ntype InteractionState = {\n focusWithin: boolean;\n hovered: boolean;\n};\n\nconst getAutoDismissDuration = ({\n duration,\n loading,\n timeout,\n}: Pick<UseSnackbarAutoDismissOptions, 'duration' | 'loading' | 'timeout'>) => {\n if (loading || duration === 'indefinite') {\n return null;\n }\n\n if (duration === 'extended') {\n return SNACKBAR_EXTENDED_DURATION;\n }\n\n if (duration === 'default') {\n return SNACKBAR_DEFAULT_DURATION;\n }\n\n return timeout ?? SNACKBAR_DEFAULT_DURATION;\n};\n\nconst useSnackbarAutoDismiss = ({\n duration,\n loading,\n onDismissRequest,\n resetKey,\n timeout,\n visible,\n}: UseSnackbarAutoDismissOptions) => {\n const surfaceRef = useRef<HTMLDivElement>(null);\n const timeoutRef = useRef(0);\n const remainingDurationRef = useRef<number | null>(null);\n const timerStartedAtRef = useRef(0);\n const interactionStateRef = useRef<InteractionState>({ focusWithin: false, hovered: false });\n\n const isInterrupted = useCallback(() => {\n const { focusWithin, hovered } = interactionStateRef.current;\n return focusWithin || hovered;\n }, []);\n\n const clearTimer = useCallback(() => {\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = 0;\n }, []);\n\n const startTimer = useCallback(\n (remainingDuration = getAutoDismissDuration({ duration, loading, timeout })) => {\n clearTimer();\n remainingDurationRef.current = remainingDuration;\n\n if (!visible || remainingDuration === null || isInterrupted()) {\n return;\n }\n\n timerStartedAtRef.current = Date.now();\n timeoutRef.current = window.setTimeout(() => {\n timeoutRef.current = 0;\n remainingDurationRef.current = 0;\n onDismissRequest();\n }, remainingDuration);\n },\n [clearTimer, duration, isInterrupted, loading, onDismissRequest, timeout, visible],\n );\n\n const pauseTimer = useCallback(() => {\n if (!timeoutRef.current || remainingDurationRef.current === null) {\n return;\n }\n\n clearTimer();\n remainingDurationRef.current = Math.max(\n 0,\n remainingDurationRef.current - (Date.now() - timerStartedAtRef.current),\n );\n }, [clearTimer]);\n\n const resumeTimer = useCallback(() => {\n if (isInterrupted() || remainingDurationRef.current === null) {\n return;\n }\n\n startTimer(remainingDurationRef.current);\n }, [isInterrupted, startTimer]);\n\n const handleMouseEnter = useCallback(() => {\n interactionStateRef.current = { ...interactionStateRef.current, hovered: true };\n pauseTimer();\n }, [pauseTimer]);\n\n const handleMouseLeave = useCallback(() => {\n interactionStateRef.current = { ...interactionStateRef.current, hovered: false };\n resumeTimer();\n }, [resumeTimer]);\n\n const handleFocus = useCallback(() => {\n interactionStateRef.current = { ...interactionStateRef.current, focusWithin: true };\n pauseTimer();\n }, [pauseTimer]);\n\n const handleBlur = useCallback(\n (event: React.FocusEvent<HTMLDivElement>) => {\n if (event.currentTarget.contains(event.relatedTarget)) {\n return;\n }\n\n interactionStateRef.current = { ...interactionStateRef.current, focusWithin: false };\n resumeTimer();\n },\n [resumeTimer],\n );\n\n useEffect(() => {\n if (!visible) {\n clearTimer();\n return undefined;\n }\n\n const snackbar = surfaceRef.current;\n interactionStateRef.current = {\n focusWithin: Boolean(snackbar?.contains(document.activeElement)),\n hovered: snackbar?.matches(':hover') ?? false,\n };\n startTimer();\n\n return clearTimer;\n }, [clearTimer, resetKey, startTimer, visible]);\n\n return {\n handleBlur,\n handleFocus,\n handleMouseEnter,\n handleMouseLeave,\n surfaceRef,\n };\n};\n\nexport default useSnackbarAutoDismiss;\n"],"names":["getAutoDismissDuration","duration","loading","timeout","SNACKBAR_EXTENDED_DURATION","SNACKBAR_DEFAULT_DURATION","useSnackbarAutoDismiss","onDismissRequest","resetKey","visible","surfaceRef","useRef","timeoutRef","remainingDurationRef","timerStartedAtRef","interactionStateRef","focusWithin","hovered","isInterrupted","useCallback","current","clearTimer","window","clearTimeout","startTimer","remainingDuration","Date","now","setTimeout","pauseTimer","Math","max","resumeTimer","handleMouseEnter","handleMouseLeave","handleFocus","handleBlur","event","currentTarget","contains","relatedTarget","useEffect","undefined","snackbar","Boolean","document","activeElement","matches"],"mappings":";;;AAmBA,MAAMA,sBAAsB,GAAGA,CAAC;EAC9BC,QAAQ;EACRC,OAAO;AACPC,EAAAA;AAAO,CACiE,KAAI;AAC5E,EAAA,IAAID,OAAO,IAAID,QAAQ,KAAK,YAAY,EAAE;AACxC,IAAA,OAAO,IAAI;AACb,EAAA;EAEA,IAAIA,QAAQ,KAAK,UAAU,EAAE;AAC3B,IAAA,OAAOG,0BAA0B;AACnC,EAAA;EAEA,IAAIH,QAAQ,KAAK,SAAS,EAAE;AAC1B,IAAA,OAAOI,yBAAyB;AAClC,EAAA;EAEA,OAAOF,OAAO,IAAIE,yBAAyB;AAC7C,CAAC;AAED,MAAMC,sBAAsB,GAAGA,CAAC;EAC9BL,QAAQ;EACRC,OAAO;EACPK,gBAAgB;EAChBC,QAAQ;EACRL,OAAO;AACPM,EAAAA;AAAO,CACuB,KAAI;AAClC,EAAA,MAAMC,UAAU,GAAGC,MAAM,CAAiB,IAAI,CAAC;AAC/C,EAAA,MAAMC,UAAU,GAAGD,MAAM,CAAC,CAAC,CAAC;AAC5B,EAAA,MAAME,oBAAoB,GAAGF,MAAM,CAAgB,IAAI,CAAC;AACxD,EAAA,MAAMG,iBAAiB,GAAGH,MAAM,CAAC,CAAC,CAAC;EACnC,MAAMI,mBAAmB,GAAGJ,MAAM,CAAmB;AAAEK,IAAAA,WAAW,EAAE,KAAK;AAAEC,IAAAA,OAAO,EAAE;AAAK,GAAE,CAAC;AAE5F,EAAA,MAAMC,aAAa,GAAGC,WAAW,CAAC,MAAK;IACrC,MAAM;MAAEH,WAAW;AAAEC,MAAAA;KAAS,GAAGF,mBAAmB,CAACK,OAAO;IAC5D,OAAOJ,WAAW,IAAIC,OAAO;EAC/B,CAAC,EAAE,EAAE,CAAC;AAEN,EAAA,MAAMI,UAAU,GAAGF,WAAW,CAAC,MAAK;AAClCG,IAAAA,MAAM,CAACC,YAAY,CAACX,UAAU,CAACQ,OAAO,CAAC;IACvCR,UAAU,CAACQ,OAAO,GAAG,CAAC;EACxB,CAAC,EAAE,EAAE,CAAC;EAEN,MAAMI,UAAU,GAAGL,WAAW,CAC5B,CAACM,iBAAiB,GAAGzB,sBAAsB,CAAC;IAAEC,QAAQ;IAAEC,OAAO;AAAEC,IAAAA;AAAO,GAAE,CAAC,KAAI;AAC7EkB,IAAAA,UAAU,EAAE;IACZR,oBAAoB,CAACO,OAAO,GAAGK,iBAAiB;IAEhD,IAAI,CAAChB,OAAO,IAAIgB,iBAAiB,KAAK,IAAI,IAAIP,aAAa,EAAE,EAAE;AAC7D,MAAA;AACF,IAAA;AAEAJ,IAAAA,iBAAiB,CAACM,OAAO,GAAGM,IAAI,CAACC,GAAG,EAAE;AACtCf,IAAAA,UAAU,CAACQ,OAAO,GAAGE,MAAM,CAACM,UAAU,CAAC,MAAK;MAC1ChB,UAAU,CAACQ,OAAO,GAAG,CAAC;MACtBP,oBAAoB,CAACO,OAAO,GAAG,CAAC;AAChCb,MAAAA,gBAAgB,EAAE;IACpB,CAAC,EAAEkB,iBAAiB,CAAC;AACvB,EAAA,CAAC,EACD,CAACJ,UAAU,EAAEpB,QAAQ,EAAEiB,aAAa,EAAEhB,OAAO,EAAEK,gBAAgB,EAAEJ,OAAO,EAAEM,OAAO,CAAC,CACnF;AAED,EAAA,MAAMoB,UAAU,GAAGV,WAAW,CAAC,MAAK;IAClC,IAAI,CAACP,UAAU,CAACQ,OAAO,IAAIP,oBAAoB,CAACO,OAAO,KAAK,IAAI,EAAE;AAChE,MAAA;AACF,IAAA;AAEAC,IAAAA,UAAU,EAAE;IACZR,oBAAoB,CAACO,OAAO,GAAGU,IAAI,CAACC,GAAG,CACrC,CAAC,EACDlB,oBAAoB,CAACO,OAAO,IAAIM,IAAI,CAACC,GAAG,EAAE,GAAGb,iBAAiB,CAACM,OAAO,CAAC,CACxE;AACH,EAAA,CAAC,EAAE,CAACC,UAAU,CAAC,CAAC;AAEhB,EAAA,MAAMW,WAAW,GAAGb,WAAW,CAAC,MAAK;IACnC,IAAID,aAAa,EAAE,IAAIL,oBAAoB,CAACO,OAAO,KAAK,IAAI,EAAE;AAC5D,MAAA;AACF,IAAA;AAEAI,IAAAA,UAAU,CAACX,oBAAoB,CAACO,OAAO,CAAC;AAC1C,EAAA,CAAC,EAAE,CAACF,aAAa,EAAEM,UAAU,CAAC,CAAC;AAE/B,EAAA,MAAMS,gBAAgB,GAAGd,WAAW,CAAC,MAAK;IACxCJ,mBAAmB,CAACK,OAAO,GAAG;MAAE,GAAGL,mBAAmB,CAACK,OAAO;AAAEH,MAAAA,OAAO,EAAE;KAAM;AAC/EY,IAAAA,UAAU,EAAE;AACd,EAAA,CAAC,EAAE,CAACA,UAAU,CAAC,CAAC;AAEhB,EAAA,MAAMK,gBAAgB,GAAGf,WAAW,CAAC,MAAK;IACxCJ,mBAAmB,CAACK,OAAO,GAAG;MAAE,GAAGL,mBAAmB,CAACK,OAAO;AAAEH,MAAAA,OAAO,EAAE;KAAO;AAChFe,IAAAA,WAAW,EAAE;AACf,EAAA,CAAC,EAAE,CAACA,WAAW,CAAC,CAAC;AAEjB,EAAA,MAAMG,WAAW,GAAGhB,WAAW,CAAC,MAAK;IACnCJ,mBAAmB,CAACK,OAAO,GAAG;MAAE,GAAGL,mBAAmB,CAACK,OAAO;AAAEJ,MAAAA,WAAW,EAAE;KAAM;AACnFa,IAAAA,UAAU,EAAE;AACd,EAAA,CAAC,EAAE,CAACA,UAAU,CAAC,CAAC;AAEhB,EAAA,MAAMO,UAAU,GAAGjB,WAAW,CAC3BkB,KAAuC,IAAI;IAC1C,IAAIA,KAAK,CAACC,aAAa,CAACC,QAAQ,CAACF,KAAK,CAACG,aAAa,CAAC,EAAE;AACrD,MAAA;AACF,IAAA;IAEAzB,mBAAmB,CAACK,OAAO,GAAG;MAAE,GAAGL,mBAAmB,CAACK,OAAO;AAAEJ,MAAAA,WAAW,EAAE;KAAO;AACpFgB,IAAAA,WAAW,EAAE;AACf,EAAA,CAAC,EACD,CAACA,WAAW,CAAC,CACd;AAEDS,EAAAA,SAAS,CAAC,MAAK;IACb,IAAI,CAAChC,OAAO,EAAE;AACZY,MAAAA,UAAU,EAAE;AACZ,MAAA,OAAOqB,SAAS;AAClB,IAAA;AAEA,IAAA,MAAMC,QAAQ,GAAGjC,UAAU,CAACU,OAAO;IACnCL,mBAAmB,CAACK,OAAO,GAAG;MAC5BJ,WAAW,EAAE4B,OAAO,CAACD,QAAQ,EAAEJ,QAAQ,CAACM,QAAQ,CAACC,aAAa,CAAC,CAAC;AAChE7B,MAAAA,OAAO,EAAE0B,QAAQ,EAAEI,OAAO,CAAC,QAAQ,CAAC,IAAI;KACzC;AACDvB,IAAAA,UAAU,EAAE;AAEZ,IAAA,OAAOH,UAAU;EACnB,CAAC,EAAE,CAACA,UAAU,EAAEb,QAAQ,EAAEgB,UAAU,EAAEf,OAAO,CAAC,CAAC;EAE/C,OAAO;IACL2B,UAAU;IACVD,WAAW;IACXF,gBAAgB;IAChBC,gBAAgB;AAChBxB,IAAAA;GACD;AACH;;"}
|