@transferwise/components 0.0.0-experimental-49c6983 → 0.0.0-experimental-7636184
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/Provider/Provider.js +4 -1
- package/build/Provider/Provider.js.map +1 -1
- package/build/Provider/Provider.mjs +4 -1
- package/build/Provider/Provider.mjs.map +1 -1
- package/build/Snackbar/Snackbar.js +136 -105
- package/build/Snackbar/Snackbar.js.map +1 -1
- package/build/Snackbar/Snackbar.mjs +137 -103
- 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 +12 -0
- package/build/Snackbar/SnackbarPortal.js.map +1 -0
- package/build/Snackbar/SnackbarPortal.mjs +8 -0
- package/build/Snackbar/SnackbarPortal.mjs.map +1 -0
- package/build/Snackbar/SnackbarProvider.js +24 -28
- package/build/Snackbar/SnackbarProvider.js.map +1 -1
- package/build/Snackbar/SnackbarProvider.mjs +25 -29
- 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 +9 -0
- package/build/Snackbar/constants.mjs.map +1 -0
- package/build/Snackbar/useSnackbarAutoDismiss.js +64 -0
- package/build/Snackbar/useSnackbarAutoDismiss.js.map +1 -0
- package/build/Snackbar/useSnackbarAutoDismiss.mjs +60 -0
- package/build/Snackbar/useSnackbarAutoDismiss.mjs.map +1 -0
- package/build/Snackbar/useSnackbarManager.js +144 -0
- package/build/Snackbar/useSnackbarManager.js.map +1 -0
- package/build/Snackbar/useSnackbarManager.mjs +140 -0
- package/build/Snackbar/useSnackbarManager.mjs.map +1 -0
- package/build/Typeahead/TypeaheadInput/TypeaheadInput.js +5 -5
- package/build/Typeahead/TypeaheadInput/TypeaheadInput.js.map +1 -1
- package/build/Typeahead/TypeaheadInput/TypeaheadInput.mjs +5 -5
- package/build/Typeahead/TypeaheadInput/TypeaheadInput.mjs.map +1 -1
- package/build/main.css +131 -61
- package/build/styles/Snackbar/Snackbar.css +105 -54
- package/build/styles/Typeahead/Typeahead.css +27 -8
- package/build/styles/main.css +131 -61
- package/build/types/Provider/Provider.d.ts.map +1 -1
- package/build/types/Snackbar/Snackbar.d.ts +48 -9
- package/build/types/Snackbar/Snackbar.d.ts.map +1 -1
- package/build/types/Snackbar/Snackbar.types.d.ts +12 -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 +4 -0
- package/build/types/Snackbar/SnackbarPortal.d.ts.map +1 -0
- package/build/types/Snackbar/SnackbarProvider.d.ts +10 -0
- package/build/types/Snackbar/SnackbarProvider.d.ts.map +1 -1
- package/build/types/Snackbar/constants.d.ts +7 -0
- package/build/types/Snackbar/constants.d.ts.map +1 -0
- package/build/types/Snackbar/index.d.ts +1 -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 +12 -0
- package/build/types/Snackbar/useSnackbarAutoDismiss.d.ts.map +1 -0
- package/build/types/Snackbar/useSnackbarManager.d.ts +20 -0
- package/build/types/Snackbar/useSnackbarManager.d.ts.map +1 -0
- package/build/types/Typeahead/TypeaheadInput/TypeaheadInput.d.ts.map +1 -1
- package/build/types/index.d.ts +1 -1
- package/build/types/index.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/ListItem/_stories/ListItem.scenarios.story.tsx +13 -16
- package/src/Provider/Provider.tsx +2 -1
- package/src/Snackbar/Snackbar.css +105 -54
- package/src/Snackbar/Snackbar.less +124 -60
- package/src/Snackbar/Snackbar.test.tsx +540 -120
- package/src/Snackbar/Snackbar.tsx +159 -99
- package/src/Snackbar/Snackbar.types.ts +17 -0
- package/src/Snackbar/SnackbarContext.ts +2 -2
- package/src/Snackbar/SnackbarPortal.tsx +8 -0
- package/src/Snackbar/SnackbarProvider.test.tsx +577 -0
- package/src/Snackbar/SnackbarProvider.tsx +32 -19
- package/src/Snackbar/_stories/Snackbar.rtl.test.story.tsx +13 -10
- package/src/Snackbar/_stories/Snackbar.story.tsx +132 -39
- package/src/Snackbar/_stories/Snackbar.test.story.tsx +101 -35
- package/src/Snackbar/constants.ts +7 -0
- package/src/Snackbar/index.ts +1 -1
- package/src/Snackbar/useSnackbarAutoDismiss.ts +72 -0
- package/src/Snackbar/useSnackbarManager.ts +159 -0
- package/src/Typeahead/Typeahead.css +27 -8
- package/src/Typeahead/Typeahead.less +32 -9
- package/src/Typeahead/TypeaheadInput/TypeaheadInput.tsx +5 -5
- package/src/Typeahead/_stories/Typeahead.test.story.tsx +0 -65
- package/src/index.ts +1 -1
- package/src/main.css +131 -61
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Snackbar.mjs","sources":["../../src/Snackbar/Snackbar.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"Snackbar.mjs","sources":["../../src/Snackbar/Snackbar.tsx"],"sourcesContent":["import { Tags } from '@transferwise/icons';\nimport { CSSTransition } from 'react-transition-group';\n\nimport Button, { type ButtonReferenceType } from '../Button';\nimport Body from '../Body';\nimport { LiveRegion } from '../common';\nimport type { ThemeDark, ThemeLight } from '../common';\nimport { PrimitivePrompt } from '../Prompt/PrimitivePrompt';\nimport ProcessIndicator from '../ProcessIndicator';\nimport type { Sentiment } from '../SentimentSurface';\nimport StatusIcon from '../StatusIcon';\n\nimport { SNACKBAR_ENTER_DURATION, SNACKBAR_EXIT_DURATION } from './constants';\nimport type { SnackbarAction, SnackbarDuration } from './Snackbar.types';\nimport useSnackbarAutoDismiss from './useSnackbarAutoDismiss';\n\n/**\n * Props for the controlled Snackbar surface, including provider-managed lifecycle controls.\n * Use SnackbarCreationProps when creating notifications through SnackbarProvider/useSnackbar.\n */\nexport interface SnackbarProps {\n /** One optional callback or navigation action. Activating it dismisses after its callback runs. */\n action?: SnackbarAction;\n /** Changes for each new Snackbar so LiveRegion re-announces it. */\n announcementKey: number;\n /**\n * Controls auto-dismiss with a four-second, six-second or indefinite duration after entry finishes.\n * Takes precedence over the deprecated `timeout`.\n * When neither option is supplied, the default is 4000ms (previously 4500ms).\n * @default 'default'\n */\n duration?: SnackbarDuration;\n /**\n * Replaces the media with a progress indicator, uses neutral styling and prevents auto-dismiss.\n * Takes precedence over `media`, `sentiment`, `duration` and the deprecated `timeout`.\n * @default false\n */\n loading?: boolean;\n /** Overrides sentiment-derived media with content for the 24×24px media slot. */\n media?: React.ReactNode;\n /** Requests an exit; the provider retains the surface until onExited confirms it has finished. */\n onDismissRequest: () => void;\n /** Called after the exit animation so the provider can unmount active or show its replacement. */\n onExited: () => void;\n /**\n * Controls the sentiment surface and default media.\n * @default 'neutral'\n */\n sentiment?: Sentiment;\n /** Message content. Empty strings or absent text dismiss without creating a blank replacement. */\n text: React.ReactNode;\n /** @deprecated Has no effect. Snackbar theming is based on ThemeProvider. */\n theme?: ThemeLight | ThemeDark;\n /**\n * @deprecated Use `duration` instead. Explicit millisecond values remain supported and are not\n * automatically remapped when no `duration` is supplied.\n * To migrate, use `default` for 0–5000ms, `extended` for values above 5000ms, and `indefinite`\n * for intentionally persistent notifications.\n */\n timeout?: number;\n /** @deprecated Has no effect when using SnackbarProvider, which manages Snackbar identity. */\n timestamp?: number;\n /** Controls entry/exit; the surface does not manage visibility itself. */\n visible: boolean;\n}\n\nexport const Snackbar = ({\n action,\n announcementKey,\n duration,\n loading = false,\n media,\n onDismissRequest,\n onExited,\n sentiment = 'neutral',\n text,\n timeout,\n visible,\n}: SnackbarProps) => {\n const { handleBlur, handleEntered, handleFocus, handleMouseEnter, handleMouseLeave, surfaceRef } =\n useSnackbarAutoDismiss({\n duration,\n loading,\n onDismissRequest,\n timeout,\n visible,\n });\n\n const handleActionClick: React.MouseEventHandler<ButtonReferenceType> = (event) => {\n try {\n action?.onClick?.(event);\n } finally {\n onDismissRequest();\n }\n };\n\n const renderMedia = () => {\n if (loading) {\n return (\n <ProcessIndicator\n className=\"wds-Snackbar__process-indicator\"\n data-testid=\"Snackbar_ProcessIndicator\"\n size=\"xs\"\n />\n );\n }\n\n if (media) {\n return <span className=\"wds-Snackbar__media-asset\">{media}</span>;\n }\n\n if (sentiment === 'proposition') {\n return (\n <span className=\"wds-Snackbar__media-asset\">\n <Tags aria-hidden size={24} />\n </span>\n );\n }\n\n return <StatusIcon sentiment={sentiment} size={24} />;\n };\n\n return (\n <div\n className=\"wds-Snackbar\"\n style={\n {\n '--Snackbar-enter-duration': `${SNACKBAR_ENTER_DURATION}ms`,\n '--Snackbar-exit-duration': `${SNACKBAR_EXIT_DURATION}ms`,\n } as React.CSSProperties\n }\n >\n <CSSTransition\n appear\n nodeRef={surfaceRef}\n in={visible}\n classNames=\"wds-Snackbar-container\"\n timeout={{\n appear: SNACKBAR_ENTER_DURATION,\n enter: SNACKBAR_ENTER_DURATION,\n exit: SNACKBAR_EXIT_DURATION,\n }}\n unmountOnExit\n onEntered={handleEntered}\n onExited={onExited}\n >\n <PrimitivePrompt\n ref={surfaceRef}\n className=\"wds-Snackbar-container\"\n sentiment={loading ? 'neutral' : sentiment}\n emphasis=\"elevated\"\n media={renderMedia()}\n onDismiss={onDismissRequest}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n onFocus={handleFocus}\n onBlur={handleBlur}\n >\n <div className=\"wds-Snackbar__content\">\n <LiveRegion\n aria-live=\"polite\"\n announceOnChange={announcementKey}\n className=\"wds-Snackbar__message\"\n >\n <Body as=\"span\" className=\"wds-Snackbar__body\">\n {text}\n </Body>\n </LiveRegion>\n {action ? (\n <Button\n className=\"wds-Snackbar__action\"\n v2\n size=\"sm\"\n priority=\"secondary\"\n href={action.href}\n target={action.target}\n onClick={handleActionClick}\n >\n {action.label}\n </Button>\n ) : null}\n </div>\n </PrimitivePrompt>\n </CSSTransition>\n </div>\n );\n};\n\nexport default Snackbar;\n"],"names":["Snackbar","action","announcementKey","duration","loading","media","onDismissRequest","onExited","sentiment","text","timeout","visible","handleBlur","handleEntered","handleFocus","handleMouseEnter","handleMouseLeave","surfaceRef","useSnackbarAutoDismiss","handleActionClick","event","onClick","renderMedia","_jsx","ProcessIndicator","className","size","children","Tags","StatusIcon","style","SNACKBAR_ENTER_DURATION","SNACKBAR_EXIT_DURATION","CSSTransition","appear","nodeRef","in","classNames","enter","exit","unmountOnExit","onEntered","PrimitivePrompt","ref","emphasis","onDismiss","onMouseEnter","onMouseLeave","onFocus","onBlur","_jsxs","LiveRegion","announceOnChange","Body","as","Button","v2","priority","href","target","label"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnackbarContext.js","sources":["../../src/Snackbar/SnackbarContext.ts"],"sourcesContent":["import { createContext } from 'react';\n\nimport {
|
|
1
|
+
{"version":3,"file":"SnackbarContext.js","sources":["../../src/Snackbar/SnackbarContext.ts"],"sourcesContent":["import { createContext } from 'react';\n\nimport type { SnackbarCreationProps } from './Snackbar.types';\n\nexport type SnackbarContextType = {\n createSnackbar: (props: SnackbarCreationProps) => void;\n};\n\nexport const SnackbarContext = createContext<SnackbarContextType>({ createSnackbar: () => {} });\n\nexport const SnackbarConsumer = SnackbarContext.Consumer;\n"],"names":["SnackbarContext","createContext","createSnackbar","SnackbarConsumer","Consumer"],"mappings":";;;;AAQO,MAAMA,eAAe,gBAAGC,mBAAa,CAAsB;EAAEC,cAAc,EAAEA,MAAK,CAAE;AAAC,CAAE;AAEvF,MAAMC,gBAAgB,GAAGH,eAAe,CAACI;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SnackbarContext.mjs","sources":["../../src/Snackbar/SnackbarContext.ts"],"sourcesContent":["import { createContext } from 'react';\n\nimport {
|
|
1
|
+
{"version":3,"file":"SnackbarContext.mjs","sources":["../../src/Snackbar/SnackbarContext.ts"],"sourcesContent":["import { createContext } from 'react';\n\nimport type { SnackbarCreationProps } from './Snackbar.types';\n\nexport type SnackbarContextType = {\n createSnackbar: (props: SnackbarCreationProps) => void;\n};\n\nexport const SnackbarContext = createContext<SnackbarContextType>({ createSnackbar: () => {} });\n\nexport const SnackbarConsumer = SnackbarContext.Consumer;\n"],"names":["SnackbarContext","createContext","createSnackbar","SnackbarConsumer","Consumer"],"mappings":";;AAQO,MAAMA,eAAe,gBAAGC,aAAa,CAAsB;EAAEC,cAAc,EAAEA,MAAK,CAAE;AAAC,CAAE;AAEvF,MAAMC,gBAAgB,GAAGH,eAAe,CAACI;;"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var WithNextPortal = require('../WithNextPortal/WithNextPortal.js');
|
|
6
|
+
var Snackbar = require('./Snackbar.js');
|
|
7
|
+
|
|
8
|
+
/** Renders the Snackbar into `document.body` after mount, so it's safe for SSR. */
|
|
9
|
+
const SnackbarPortal = WithNextPortal.default(Snackbar.Snackbar);
|
|
10
|
+
|
|
11
|
+
exports.default = SnackbarPortal;
|
|
12
|
+
//# sourceMappingURL=SnackbarPortal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SnackbarPortal.js","sources":["../../src/Snackbar/SnackbarPortal.tsx"],"sourcesContent":["import withNextPortal from '../WithNextPortal/WithNextPortal';\n\nimport { Snackbar } from './Snackbar';\n\n/** Renders the Snackbar into `document.body` after mount, so it's safe for SSR. */\nconst SnackbarPortal = withNextPortal(Snackbar);\n\nexport default SnackbarPortal;\n"],"names":["SnackbarPortal","withNextPortal","Snackbar"],"mappings":";;;;;;;AAIA;AACA,MAAMA,cAAc,GAAGC,sBAAc,CAACC,iBAAQ;;"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import withNextPortalWrapper from '../WithNextPortal/WithNextPortal.mjs';
|
|
2
|
+
import { Snackbar } from './Snackbar.mjs';
|
|
3
|
+
|
|
4
|
+
/** Renders the Snackbar into `document.body` after mount, so it's safe for SSR. */
|
|
5
|
+
const SnackbarPortal = withNextPortalWrapper(Snackbar);
|
|
6
|
+
|
|
7
|
+
export { SnackbarPortal as default };
|
|
8
|
+
//# sourceMappingURL=SnackbarPortal.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SnackbarPortal.mjs","sources":["../../src/Snackbar/SnackbarPortal.tsx"],"sourcesContent":["import withNextPortal from '../WithNextPortal/WithNextPortal';\n\nimport { Snackbar } from './Snackbar';\n\n/** Renders the Snackbar into `document.body` after mount, so it's safe for SSR. */\nconst SnackbarPortal = withNextPortal(Snackbar);\n\nexport default SnackbarPortal;\n"],"names":["SnackbarPortal","withNextPortal","Snackbar"],"mappings":";;;AAIA;AACA,MAAMA,cAAc,GAAGC,qBAAc,CAACC,QAAQ;;"}
|
|
@@ -3,42 +3,38 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var React = require('react');
|
|
6
|
-
var
|
|
6
|
+
var SnackbarPortal = require('./SnackbarPortal.js');
|
|
7
7
|
var SnackbarContext = require('./SnackbarContext.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
|
-
|
|
16
|
+
active,
|
|
17
|
+
announcementKey,
|
|
18
|
+
createSnackbar,
|
|
19
|
+
dismissSnackbar,
|
|
20
|
+
handleExited,
|
|
21
|
+
visible
|
|
22
|
+
} = useSnackbarManager.default();
|
|
23
|
+
const contextValue = React.useMemo(() => ({
|
|
24
|
+
createSnackbar
|
|
25
|
+
}), [createSnackbar]);
|
|
23
26
|
return /*#__PURE__*/jsxRuntime.jsxs(SnackbarContext.SnackbarContext.Provider, {
|
|
24
|
-
value:
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
}), []),
|
|
36
|
-
children: [/*#__PURE__*/jsxRuntime.jsx(Snackbar.default, {
|
|
37
|
-
action: action,
|
|
38
|
-
text: text,
|
|
39
|
-
timestamp: timestamp,
|
|
40
|
-
timeout: timeout
|
|
41
|
-
}), children]
|
|
27
|
+
value: contextValue,
|
|
28
|
+
children: [active ? /*#__PURE__*/jsxRuntime.jsx(SnackbarPortal.default
|
|
29
|
+
// Each instance gets a fresh appear transition and live-region announcement.
|
|
30
|
+
, {
|
|
31
|
+
...active.props,
|
|
32
|
+
announcementKey: announcementKey,
|
|
33
|
+
timeout: timeout,
|
|
34
|
+
visible: visible,
|
|
35
|
+
onDismissRequest: dismissSnackbar,
|
|
36
|
+
onExited: handleExited
|
|
37
|
+
}, active.id) : null, children]
|
|
42
38
|
});
|
|
43
39
|
}
|
|
44
40
|
|
|
@@ -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 SnackbarPortal from './SnackbarPortal';\nimport { SnackbarContext } from './SnackbarContext';\nimport useSnackbarManager from './useSnackbarManager';\n\nexport interface SnackbarProviderProps {\n /**\n * @deprecated Use per-Snackbar `duration` instead. Explicit millisecond values remain supported\n * and are not automatically remapped when no `duration` is supplied.\n * When neither option is supplied, the default is 4000ms (previously 4500ms), after entry finishes.\n * To migrate, use `default` for 0–5000ms, `extended` for values above 5000ms, and `indefinite`\n * for intentionally persistent notifications.\n */\n timeout?: number;\n children?: React.ReactNode;\n}\n\n// Note: SnackbarProvider is not going away, we want to stop its direct usage on consumer side.\n// It is rendered by `Provider`, so the deprecation notice hints consumers to remove their own.\n/**\n * @deprecated `Provider` already includes it. Call `useSnackbar()` anywhere below `Provider` instead.\n */\nexport default function SnackbarProvider({ timeout, children }: SnackbarProviderProps) {\n const { active, announcementKey, createSnackbar, dismissSnackbar, handleExited, visible } =\n useSnackbarManager();\n const contextValue = useMemo(() => ({ createSnackbar }), [createSnackbar]);\n\n return (\n <SnackbarContext.Provider value={contextValue}>\n {active ? (\n <SnackbarPortal\n // Each instance gets a fresh appear transition and live-region announcement.\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","createSnackbar","dismissSnackbar","handleExited","visible","useSnackbarManager","contextValue","useMemo","_jsxs","SnackbarContext","Provider","value","_jsx","SnackbarPortal","props","onDismissRequest","onExited","id"],"mappings":";;;;;;;;;;AAuBc,SAAUA,gBAAgBA,CAAC;EAAEC,OAAO;AAAEC,EAAAA;AAAQ,CAAyB,EAAA;EACnF,MAAM;IAAEC,MAAM;IAAEC,eAAe;IAAEC,cAAc;IAAEC,eAAe;IAAEC,YAAY;AAAEC,IAAAA;GAAS,GACvFC,0BAAkB,EAAE;AACtB,EAAA,MAAMC,YAAY,GAAGC,aAAO,CAAC,OAAO;AAAEN,IAAAA;GAAgB,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;AAE1E,EAAA,oBACEO,eAAA,CAACC,+BAAe,CAACC,QAAQ,EAAA;AAACC,IAAAA,KAAK,EAAEL,YAAa;AAAAR,IAAAA,QAAA,EAAA,CAC3CC,MAAM,gBACLa,cAAA,CAACC;AACC;AAAA,MAAA;MAAA,GAEId,MAAM,CAACe,KAAK;AAChBd,MAAAA,eAAe,EAAEA,eAAgB;AACjCH,MAAAA,OAAO,EAAEA,OAAQ;AACjBO,MAAAA,OAAO,EAAEA,OAAQ;AACjBW,MAAAA,gBAAgB,EAAEb,eAAgB;AAClCc,MAAAA,QAAQ,EAAEb;AAAa,KAAA,EANlBJ,MAAM,CAACkB,EAMW,CACvB,GACA,IAAI,EACPnB,QAAQ;AAAA,GACe,CAAC;AAE/B;;"}
|
|
@@ -1,40 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import SnackbarPortal from './
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
import SnackbarPortal from './SnackbarPortal.mjs';
|
|
3
3
|
import { SnackbarContext } from './SnackbarContext.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
|
-
|
|
12
|
+
active,
|
|
13
|
+
announcementKey,
|
|
14
|
+
createSnackbar,
|
|
15
|
+
dismissSnackbar,
|
|
16
|
+
handleExited,
|
|
17
|
+
visible
|
|
18
|
+
} = useSnackbarManager();
|
|
19
|
+
const contextValue = useMemo(() => ({
|
|
20
|
+
createSnackbar
|
|
21
|
+
}), [createSnackbar]);
|
|
19
22
|
return /*#__PURE__*/jsxs(SnackbarContext.Provider, {
|
|
20
|
-
value:
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}), []),
|
|
32
|
-
children: [/*#__PURE__*/jsx(SnackbarPortal, {
|
|
33
|
-
action: action,
|
|
34
|
-
text: text,
|
|
35
|
-
timestamp: timestamp,
|
|
36
|
-
timeout: timeout
|
|
37
|
-
}), children]
|
|
23
|
+
value: contextValue,
|
|
24
|
+
children: [active ? /*#__PURE__*/jsx(SnackbarPortal
|
|
25
|
+
// Each instance gets a fresh appear transition and live-region announcement.
|
|
26
|
+
, {
|
|
27
|
+
...active.props,
|
|
28
|
+
announcementKey: announcementKey,
|
|
29
|
+
timeout: timeout,
|
|
30
|
+
visible: visible,
|
|
31
|
+
onDismissRequest: dismissSnackbar,
|
|
32
|
+
onExited: handleExited
|
|
33
|
+
}, active.id) : null, children]
|
|
38
34
|
});
|
|
39
35
|
}
|
|
40
36
|
|
|
@@ -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 SnackbarPortal from './SnackbarPortal';\nimport { SnackbarContext } from './SnackbarContext';\nimport useSnackbarManager from './useSnackbarManager';\n\nexport interface SnackbarProviderProps {\n /**\n * @deprecated Use per-Snackbar `duration` instead. Explicit millisecond values remain supported\n * and are not automatically remapped when no `duration` is supplied.\n * When neither option is supplied, the default is 4000ms (previously 4500ms), after entry finishes.\n * To migrate, use `default` for 0–5000ms, `extended` for values above 5000ms, and `indefinite`\n * for intentionally persistent notifications.\n */\n timeout?: number;\n children?: React.ReactNode;\n}\n\n// Note: SnackbarProvider is not going away, we want to stop its direct usage on consumer side.\n// It is rendered by `Provider`, so the deprecation notice hints consumers to remove their own.\n/**\n * @deprecated `Provider` already includes it. Call `useSnackbar()` anywhere below `Provider` instead.\n */\nexport default function SnackbarProvider({ timeout, children }: SnackbarProviderProps) {\n const { active, announcementKey, createSnackbar, dismissSnackbar, handleExited, visible } =\n useSnackbarManager();\n const contextValue = useMemo(() => ({ createSnackbar }), [createSnackbar]);\n\n return (\n <SnackbarContext.Provider value={contextValue}>\n {active ? (\n <SnackbarPortal\n // Each instance gets a fresh appear transition and live-region announcement.\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","createSnackbar","dismissSnackbar","handleExited","visible","useSnackbarManager","contextValue","useMemo","_jsxs","SnackbarContext","Provider","value","_jsx","SnackbarPortal","props","onDismissRequest","onExited","id"],"mappings":";;;;;;AAuBc,SAAUA,gBAAgBA,CAAC;EAAEC,OAAO;AAAEC,EAAAA;AAAQ,CAAyB,EAAA;EACnF,MAAM;IAAEC,MAAM;IAAEC,eAAe;IAAEC,cAAc;IAAEC,eAAe;IAAEC,YAAY;AAAEC,IAAAA;GAAS,GACvFC,kBAAkB,EAAE;AACtB,EAAA,MAAMC,YAAY,GAAGC,OAAO,CAAC,OAAO;AAAEN,IAAAA;GAAgB,CAAC,EAAE,CAACA,cAAc,CAAC,CAAC;AAE1E,EAAA,oBACEO,IAAA,CAACC,eAAe,CAACC,QAAQ,EAAA;AAACC,IAAAA,KAAK,EAAEL,YAAa;AAAAR,IAAAA,QAAA,EAAA,CAC3CC,MAAM,gBACLa,GAAA,CAACC;AACC;AAAA,MAAA;MAAA,GAEId,MAAM,CAACe,KAAK;AAChBd,MAAAA,eAAe,EAAEA,eAAgB;AACjCH,MAAAA,OAAO,EAAEA,OAAQ;AACjBO,MAAAA,OAAO,EAAEA,OAAQ;AACjBW,MAAAA,gBAAgB,EAAEb,eAAgB;AAClCc,MAAAA,QAAQ,EAAEb;AAAa,KAAA,EANlBJ,MAAM,CAACkB,EAMW,CACvB,GACA,IAAI,EACPnB,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
|
+
/** 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
|
+
|
|
10
|
+
exports.SNACKBAR_DEFAULT_DURATION = SNACKBAR_DEFAULT_DURATION;
|
|
11
|
+
exports.SNACKBAR_ENTER_DURATION = SNACKBAR_ENTER_DURATION;
|
|
12
|
+
exports.SNACKBAR_EXIT_DURATION = SNACKBAR_EXIT_DURATION;
|
|
13
|
+
exports.SNACKBAR_EXTENDED_DURATION = SNACKBAR_EXTENDED_DURATION;
|
|
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;\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"],"names":["SNACKBAR_ENTER_DURATION","SNACKBAR_EXIT_DURATION","SNACKBAR_DEFAULT_DURATION","SNACKBAR_EXTENDED_DURATION"],"mappings":";;AAAO,MAAMA,uBAAuB,GAAG;AAChC,MAAMC,sBAAsB,GAAG;AAEtC;AACO,MAAMC,yBAAyB,GAAG;AACzC;AACO,MAAMC,0BAA0B,GAAG;;;;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
|
|
8
|
+
export { SNACKBAR_DEFAULT_DURATION, SNACKBAR_ENTER_DURATION, SNACKBAR_EXIT_DURATION, SNACKBAR_EXTENDED_DURATION };
|
|
9
|
+
//# 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;\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"],"names":["SNACKBAR_ENTER_DURATION","SNACKBAR_EXIT_DURATION","SNACKBAR_DEFAULT_DURATION","SNACKBAR_EXTENDED_DURATION"],"mappings":"AAAO,MAAMA,uBAAuB,GAAG;AAChC,MAAMC,sBAAsB,GAAG;AAEtC;AACO,MAAMC,yBAAyB,GAAG;AACzC;AACO,MAAMC,0BAA0B,GAAG;;"}
|
|
@@ -0,0 +1,64 @@
|
|
|
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 or focus, 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 running = visible && entered && !hovered && !focusWithin;
|
|
28
|
+
React.useEffect(() => {
|
|
29
|
+
// Only a timing change starts a fresh budget; interaction and callback changes preserve it.
|
|
30
|
+
remaining.current = milliseconds;
|
|
31
|
+
}, [milliseconds]);
|
|
32
|
+
React.useEffect(() => {
|
|
33
|
+
const ms = remaining.current;
|
|
34
|
+
if (!running || ms === null) {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
const startedAt = Date.now();
|
|
38
|
+
const id = window.setTimeout(() => onDismissRequest(), ms);
|
|
39
|
+
return () => {
|
|
40
|
+
window.clearTimeout(id);
|
|
41
|
+
remaining.current = Math.max(0, ms - (Date.now() - startedAt));
|
|
42
|
+
};
|
|
43
|
+
}, [running, onDismissRequest, milliseconds]);
|
|
44
|
+
return {
|
|
45
|
+
handleBlur: event => {
|
|
46
|
+
if (!event.currentTarget.contains(event.relatedTarget)) {
|
|
47
|
+
setFocusWithin(false);
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
handleEntered: () => {
|
|
51
|
+
// Entry can finish beneath the pointer or with focus already inside the surface.
|
|
52
|
+
setHovered(surfaceRef.current?.matches(':hover') ?? false);
|
|
53
|
+
setFocusWithin(Boolean(surfaceRef.current?.contains(document.activeElement)));
|
|
54
|
+
setEntered(true);
|
|
55
|
+
},
|
|
56
|
+
handleFocus: () => setFocusWithin(true),
|
|
57
|
+
handleMouseEnter: () => setHovered(true),
|
|
58
|
+
handleMouseLeave: () => setHovered(false),
|
|
59
|
+
surfaceRef
|
|
60
|
+
};
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
exports.default = useSnackbarAutoDismiss;
|
|
64
|
+
//# sourceMappingURL=useSnackbarAutoDismiss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSnackbarAutoDismiss.js","sources":["../../src/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 or focus, 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\n const running = visible && entered && !hovered && !focusWithin;\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 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","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":";;;;;;;AAMA,MAAMA,SAAS,GAA4C;AACzDC,EAAAA,OAAO,EAAEC,mCAAyB;AAClCC,EAAAA,QAAQ,EAAEC,oCAA0B;AACpCC,EAAAA,UAAU,EAAE;CACb;AAED;AACA,MAAMC,sBAAsB,GAAGA,CAAC;EAC9BC,QAAQ;EACRC,OAAO;EACPC,gBAAgB;EAChBC,OAAO;AACPC,EAAAA;AAAO,CACkF,KAAI;AAC7F,EAAA,MAAMC,UAAU,GAAGC,YAAM,CAAiB,IAAI,CAAC;AAC/C,EAAA,MAAMC,YAAY,GAAGN,OAAO,GACxB,IAAI,GACJD,QAAQ,GACNP,SAAS,CAACO,QAAQ,CAAC,GAClBG,OAAO,IAAIR,mCAA0B;AAC5C,EAAA,MAAMa,SAAS,GAAGF,YAAM,CAACC,YAAY,CAAC;EACtC,MAAM,CAACE,OAAO,EAAEC,UAAU,CAAC,GAAGC,cAAQ,CAAC,KAAK,CAAC;EAC7C,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGF,cAAQ,CAAC,KAAK,CAAC;EAC7C,MAAM,CAACG,WAAW,EAAEC,cAAc,CAAC,GAAGJ,cAAQ,CAAC,KAAK,CAAC;EAErD,MAAMK,OAAO,GAAGZ,OAAO,IAAIK,OAAO,IAAI,CAACG,OAAO,IAAI,CAACE,WAAW;AAE9DG,EAAAA,eAAS,CAAC,MAAK;AACb;IACAT,SAAS,CAACU,OAAO,GAAGX,YAAY;AAClC,EAAA,CAAC,EAAE,CAACA,YAAY,CAAC,CAAC;AAElBU,EAAAA,eAAS,CAAC,MAAK;AACb,IAAA,MAAME,EAAE,GAAGX,SAAS,CAACU,OAAO;AAC5B,IAAA,IAAI,CAACF,OAAO,IAAIG,EAAE,KAAK,IAAI,EAAE;AAC3B,MAAA,OAAOC,SAAS;AAClB,IAAA;AAEA,IAAA,MAAMC,SAAS,GAAGC,IAAI,CAACC,GAAG,EAAE;AAC5B,IAAA,MAAMC,EAAE,GAAGC,MAAM,CAACC,UAAU,CAAC,MAAMxB,gBAAgB,EAAE,EAAEiB,EAAE,CAAC;AAC1D,IAAA,OAAO,MAAK;AACVM,MAAAA,MAAM,CAACE,YAAY,CAACH,EAAE,CAAC;AACvBhB,MAAAA,SAAS,CAACU,OAAO,GAAGU,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEV,EAAE,IAAIG,IAAI,CAACC,GAAG,EAAE,GAAGF,SAAS,CAAC,CAAC;IAChE,CAAC;EACH,CAAC,EAAE,CAACL,OAAO,EAAEd,gBAAgB,EAAEK,YAAY,CAAC,CAAC;EAE7C,OAAO;IACLuB,UAAU,EAAGC,KAAuC,IAAI;MACtD,IAAI,CAACA,KAAK,CAACC,aAAa,CAACC,QAAQ,CAACF,KAAK,CAACG,aAAa,CAAC,EAAE;QACtDnB,cAAc,CAAC,KAAK,CAAC;AACvB,MAAA;IACF,CAAC;IACDoB,aAAa,EAAEA,MAAK;AAClB;MACAtB,UAAU,CAACR,UAAU,CAACa,OAAO,EAAEkB,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;AAC1DrB,MAAAA,cAAc,CAACsB,OAAO,CAAChC,UAAU,CAACa,OAAO,EAAEe,QAAQ,CAACK,QAAQ,CAACC,aAAa,CAAC,CAAC,CAAC;MAC7E7B,UAAU,CAAC,IAAI,CAAC;IAClB,CAAC;AACD8B,IAAAA,WAAW,EAAEA,MAAMzB,cAAc,CAAC,IAAI,CAAC;AACvC0B,IAAAA,gBAAgB,EAAEA,MAAM5B,UAAU,CAAC,IAAI,CAAC;AACxC6B,IAAAA,gBAAgB,EAAEA,MAAM7B,UAAU,CAAC,KAAK,CAAC;AACzCR,IAAAA;GACD;AACH;;"}
|
|
@@ -0,0 +1,60 @@
|
|
|
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 or focus, 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 running = visible && entered && !hovered && !focusWithin;
|
|
24
|
+
useEffect(() => {
|
|
25
|
+
// Only a timing change starts a fresh budget; interaction and callback changes preserve it.
|
|
26
|
+
remaining.current = milliseconds;
|
|
27
|
+
}, [milliseconds]);
|
|
28
|
+
useEffect(() => {
|
|
29
|
+
const ms = remaining.current;
|
|
30
|
+
if (!running || ms === null) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
const startedAt = Date.now();
|
|
34
|
+
const id = window.setTimeout(() => onDismissRequest(), ms);
|
|
35
|
+
return () => {
|
|
36
|
+
window.clearTimeout(id);
|
|
37
|
+
remaining.current = Math.max(0, ms - (Date.now() - startedAt));
|
|
38
|
+
};
|
|
39
|
+
}, [running, onDismissRequest, milliseconds]);
|
|
40
|
+
return {
|
|
41
|
+
handleBlur: event => {
|
|
42
|
+
if (!event.currentTarget.contains(event.relatedTarget)) {
|
|
43
|
+
setFocusWithin(false);
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
handleEntered: () => {
|
|
47
|
+
// Entry can finish beneath the pointer or with focus already inside the surface.
|
|
48
|
+
setHovered(surfaceRef.current?.matches(':hover') ?? false);
|
|
49
|
+
setFocusWithin(Boolean(surfaceRef.current?.contains(document.activeElement)));
|
|
50
|
+
setEntered(true);
|
|
51
|
+
},
|
|
52
|
+
handleFocus: () => setFocusWithin(true),
|
|
53
|
+
handleMouseEnter: () => setHovered(true),
|
|
54
|
+
handleMouseLeave: () => setHovered(false),
|
|
55
|
+
surfaceRef
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
export { useSnackbarAutoDismiss as default };
|
|
60
|
+
//# sourceMappingURL=useSnackbarAutoDismiss.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSnackbarAutoDismiss.mjs","sources":["../../src/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 or focus, 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\n const running = visible && entered && !hovered && !focusWithin;\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 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","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":";;;AAMA,MAAMA,SAAS,GAA4C;AACzDC,EAAAA,OAAO,EAAEC,yBAAyB;AAClCC,EAAAA,QAAQ,EAAEC,0BAA0B;AACpCC,EAAAA,UAAU,EAAE;CACb;AAED;AACA,MAAMC,sBAAsB,GAAGA,CAAC;EAC9BC,QAAQ;EACRC,OAAO;EACPC,gBAAgB;EAChBC,OAAO;AACPC,EAAAA;AAAO,CACkF,KAAI;AAC7F,EAAA,MAAMC,UAAU,GAAGC,MAAM,CAAiB,IAAI,CAAC;AAC/C,EAAA,MAAMC,YAAY,GAAGN,OAAO,GACxB,IAAI,GACJD,QAAQ,GACNP,SAAS,CAACO,QAAQ,CAAC,GAClBG,OAAO,IAAIR,yBAA0B;AAC5C,EAAA,MAAMa,SAAS,GAAGF,MAAM,CAACC,YAAY,CAAC;EACtC,MAAM,CAACE,OAAO,EAAEC,UAAU,CAAC,GAAGC,QAAQ,CAAC,KAAK,CAAC;EAC7C,MAAM,CAACC,OAAO,EAAEC,UAAU,CAAC,GAAGF,QAAQ,CAAC,KAAK,CAAC;EAC7C,MAAM,CAACG,WAAW,EAAEC,cAAc,CAAC,GAAGJ,QAAQ,CAAC,KAAK,CAAC;EAErD,MAAMK,OAAO,GAAGZ,OAAO,IAAIK,OAAO,IAAI,CAACG,OAAO,IAAI,CAACE,WAAW;AAE9DG,EAAAA,SAAS,CAAC,MAAK;AACb;IACAT,SAAS,CAACU,OAAO,GAAGX,YAAY;AAClC,EAAA,CAAC,EAAE,CAACA,YAAY,CAAC,CAAC;AAElBU,EAAAA,SAAS,CAAC,MAAK;AACb,IAAA,MAAME,EAAE,GAAGX,SAAS,CAACU,OAAO;AAC5B,IAAA,IAAI,CAACF,OAAO,IAAIG,EAAE,KAAK,IAAI,EAAE;AAC3B,MAAA,OAAOC,SAAS;AAClB,IAAA;AAEA,IAAA,MAAMC,SAAS,GAAGC,IAAI,CAACC,GAAG,EAAE;AAC5B,IAAA,MAAMC,EAAE,GAAGC,MAAM,CAACC,UAAU,CAAC,MAAMxB,gBAAgB,EAAE,EAAEiB,EAAE,CAAC;AAC1D,IAAA,OAAO,MAAK;AACVM,MAAAA,MAAM,CAACE,YAAY,CAACH,EAAE,CAAC;AACvBhB,MAAAA,SAAS,CAACU,OAAO,GAAGU,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEV,EAAE,IAAIG,IAAI,CAACC,GAAG,EAAE,GAAGF,SAAS,CAAC,CAAC;IAChE,CAAC;EACH,CAAC,EAAE,CAACL,OAAO,EAAEd,gBAAgB,EAAEK,YAAY,CAAC,CAAC;EAE7C,OAAO;IACLuB,UAAU,EAAGC,KAAuC,IAAI;MACtD,IAAI,CAACA,KAAK,CAACC,aAAa,CAACC,QAAQ,CAACF,KAAK,CAACG,aAAa,CAAC,EAAE;QACtDnB,cAAc,CAAC,KAAK,CAAC;AACvB,MAAA;IACF,CAAC;IACDoB,aAAa,EAAEA,MAAK;AAClB;MACAtB,UAAU,CAACR,UAAU,CAACa,OAAO,EAAEkB,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;AAC1DrB,MAAAA,cAAc,CAACsB,OAAO,CAAChC,UAAU,CAACa,OAAO,EAAEe,QAAQ,CAACK,QAAQ,CAACC,aAAa,CAAC,CAAC,CAAC;MAC7E7B,UAAU,CAAC,IAAI,CAAC;IAClB,CAAC;AACD8B,IAAAA,WAAW,EAAEA,MAAMzB,cAAc,CAAC,IAAI,CAAC;AACvC0B,IAAAA,gBAAgB,EAAEA,MAAM5B,UAAU,CAAC,IAAI,CAAC;AACxC6B,IAAAA,gBAAgB,EAAEA,MAAM7B,UAAU,CAAC,KAAK,CAAC;AACzCR,IAAAA;GACD;AACH;;"}
|