@transferwise/components 0.0.0-experimental-cf159cc → 0.0.0-experimental-7990d38

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/build/Snackbar/Snackbar.js +22 -9
  2. package/build/Snackbar/Snackbar.js.map +1 -1
  3. package/build/Snackbar/Snackbar.mjs +22 -9
  4. package/build/Snackbar/Snackbar.mjs.map +1 -1
  5. package/build/Snackbar/SnackbarProvider.js +1 -1
  6. package/build/Snackbar/SnackbarProvider.js.map +1 -1
  7. package/build/Snackbar/SnackbarProvider.mjs +1 -1
  8. package/build/Snackbar/SnackbarProvider.mjs.map +1 -1
  9. package/build/Snackbar/constants.js +6 -0
  10. package/build/Snackbar/constants.js.map +1 -1
  11. package/build/Snackbar/constants.mjs +5 -1
  12. package/build/Snackbar/constants.mjs.map +1 -1
  13. package/build/Snackbar/useSnackbarAutoDismiss.js +143 -0
  14. package/build/Snackbar/useSnackbarAutoDismiss.js.map +1 -0
  15. package/build/Snackbar/useSnackbarAutoDismiss.mjs +139 -0
  16. package/build/Snackbar/useSnackbarAutoDismiss.mjs.map +1 -0
  17. package/build/types/Snackbar/Snackbar.d.ts +26 -6
  18. package/build/types/Snackbar/Snackbar.d.ts.map +1 -1
  19. package/build/types/Snackbar/Snackbar.types.d.ts +3 -14
  20. package/build/types/Snackbar/Snackbar.types.d.ts.map +1 -1
  21. package/build/types/Snackbar/SnackbarPortal.d.ts +1 -1
  22. package/build/types/Snackbar/SnackbarPortal.d.ts.map +1 -1
  23. package/build/types/Snackbar/SnackbarProvider.d.ts +7 -0
  24. package/build/types/Snackbar/SnackbarProvider.d.ts.map +1 -1
  25. package/build/types/Snackbar/constants.d.ts +4 -0
  26. package/build/types/Snackbar/constants.d.ts.map +1 -1
  27. package/build/types/Snackbar/index.d.ts +1 -1
  28. package/build/types/Snackbar/index.d.ts.map +1 -1
  29. package/build/types/Snackbar/useSnackbarAutoDismiss.d.ts +19 -0
  30. package/build/types/Snackbar/useSnackbarAutoDismiss.d.ts.map +1 -0
  31. package/build/types/index.d.ts +1 -1
  32. package/build/types/index.d.ts.map +1 -1
  33. package/package.json +1 -1
  34. package/src/Snackbar/Snackbar.test.tsx +297 -9
  35. package/src/Snackbar/Snackbar.tsx +41 -17
  36. package/src/Snackbar/Snackbar.types.ts +7 -15
  37. package/src/Snackbar/SnackbarProvider.test.tsx +64 -4
  38. package/src/Snackbar/SnackbarProvider.tsx +8 -1
  39. package/src/Snackbar/_stories/Snackbar.rtl.test.story.tsx +2 -4
  40. package/src/Snackbar/_stories/Snackbar.story.tsx +40 -2
  41. package/src/Snackbar/_stories/Snackbar.test.story.tsx +6 -7
  42. package/src/Snackbar/constants.ts +5 -0
  43. package/src/Snackbar/index.ts +1 -1
  44. package/src/Snackbar/useSnackbarAutoDismiss.ts +152 -0
  45. package/src/index.ts +1 -1
@@ -1,7 +1,6 @@
1
1
  'use strict';
2
2
 
3
3
  var icons = require('@transferwise/icons');
4
- var React = require('react');
5
4
  var reactTransitionGroup = require('react-transition-group');
6
5
  var Button_resolver = require('../Button/Button.resolver.js');
7
6
  var Body = require('../Body/Body.js');
@@ -26,6 +25,7 @@ require('../common/PropsValues/markdownNodeType.js');
26
25
  require('../common/fileType.js');
27
26
  require('@transferwise/formatting');
28
27
  require('clsx');
28
+ require('react');
29
29
  require('react-intl');
30
30
  require('../common/CloseButton/CloseButton.messages.js');
31
31
  var jsxRuntime = require('react/jsx-runtime');
@@ -33,10 +33,12 @@ var LiveRegion = require('../common/LiveRegion/LiveRegion.js');
33
33
  var PrimitivePrompt = require('../Prompt/PrimitivePrompt/PrimitivePrompt.js');
34
34
  var StatusIcon = require('../StatusIcon/StatusIcon.js');
35
35
  var constants = require('./constants.js');
36
+ var useSnackbarAutoDismiss = require('./useSnackbarAutoDismiss.js');
36
37
 
37
38
  const Snackbar = ({
38
39
  action,
39
40
  announcementKey,
41
+ duration,
40
42
  media,
41
43
  onDismissRequest,
42
44
  onExited,
@@ -45,14 +47,20 @@ const Snackbar = ({
45
47
  timeout,
46
48
  visible
47
49
  }) => {
48
- const surfaceRef = React.useRef(null);
49
- React.useEffect(() => {
50
- if (!visible) {
51
- return undefined;
52
- }
53
- const id = window.setTimeout(onDismissRequest, timeout);
54
- return () => window.clearTimeout(id);
55
- }, [announcementKey, onDismissRequest, timeout, visible]);
50
+ const {
51
+ handleBlur,
52
+ handleEntered,
53
+ handleFocus,
54
+ handleMouseEnter,
55
+ handleMouseLeave,
56
+ surfaceRef
57
+ } = useSnackbarAutoDismiss.default({
58
+ duration,
59
+ onDismissRequest,
60
+ resetKey: announcementKey,
61
+ timeout,
62
+ visible
63
+ });
56
64
  const renderMedia = () => {
57
65
  if (media) {
58
66
  return /*#__PURE__*/jsxRuntime.jsx("span", {
@@ -91,6 +99,7 @@ const Snackbar = ({
91
99
  exit: constants.SNACKBAR_EXIT_DURATION
92
100
  },
93
101
  unmountOnExit: true,
102
+ onEntered: handleEntered,
94
103
  onExited: onExited,
95
104
  children: /*#__PURE__*/jsxRuntime.jsx(PrimitivePrompt.PrimitivePrompt, {
96
105
  ref: surfaceRef,
@@ -99,6 +108,10 @@ const Snackbar = ({
99
108
  emphasis: "elevated",
100
109
  media: renderMedia(),
101
110
  onDismiss: onDismissRequest,
111
+ onMouseEnter: handleMouseEnter,
112
+ onMouseLeave: handleMouseLeave,
113
+ onFocus: handleFocus,
114
+ onBlur: handleBlur,
102
115
  children: /*#__PURE__*/jsxRuntime.jsxs("div", {
103
116
  className: "wds-Snackbar__content",
104
117
  children: [/*#__PURE__*/jsxRuntime.jsx(LiveRegion.LiveRegion, {
@@ -1 +1 @@
1
- {"version":3,"file":"Snackbar.js","sources":["../../src/Snackbar/Snackbar.tsx"],"sourcesContent":["import { Tags } from '@transferwise/icons';\nimport { useEffect, useRef } from 'react';\nimport { CSSTransition } from 'react-transition-group';\n\nimport Button from '../Button';\nimport Body from '../Body';\nimport { LiveRegion } from '../common';\nimport type { ThemeDark, ThemeLight } from '../common';\nimport { PrimitivePrompt } from '../Prompt/PrimitivePrompt';\nimport type { Sentiment } from '../SentimentSurface';\nimport StatusIcon from '../StatusIcon';\n\nimport { SNACKBAR_ENTER_DURATION, SNACKBAR_EXIT_DURATION } from './constants';\nimport type { SnackbarAction, SnackbarInternalProps } from './Snackbar.types';\n\n/**\n * Message options retained for public type compatibility. Create notifications through\n * SnackbarProvider/useSnackbar; the controlled surface also needs provider-only lifecycle props.\n */\nexport interface SnackbarProps {\n /** One optional action, supporting a callback or navigation through `href` and `target`. */\n action?: SnackbarAction;\n /** Overrides sentiment-derived media with content for the 24×24px media slot. */\n media?: React.ReactNode;\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 /** Auto-dismiss delay in milliseconds, supplied by the provider. */\n timeout: number;\n /** @deprecated Has no effect when using SnackbarProvider, which manages Snackbar identity. */\n timestamp?: number;\n}\n\nexport const Snackbar = ({\n action,\n announcementKey,\n media,\n onDismissRequest,\n onExited,\n sentiment = 'neutral',\n text,\n timeout,\n visible,\n}: SnackbarInternalProps) => {\n const surfaceRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!visible) {\n return undefined;\n }\n\n const id = window.setTimeout(onDismissRequest, timeout);\n return () => window.clearTimeout(id);\n }, [announcementKey, onDismissRequest, timeout, visible]);\n\n const renderMedia = () => {\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 onExited={onExited}\n >\n <PrimitivePrompt\n ref={surfaceRef}\n className=\"wds-Snackbar-container\"\n sentiment={sentiment}\n emphasis=\"elevated\"\n media={renderMedia()}\n onDismiss={onDismissRequest}\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={action.onClick}\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","media","onDismissRequest","onExited","sentiment","text","timeout","visible","surfaceRef","useRef","useEffect","undefined","id","window","setTimeout","clearTimeout","renderMedia","_jsx","className","children","Tags","size","StatusIcon","style","SNACKBAR_ENTER_DURATION","SNACKBAR_EXIT_DURATION","CSSTransition","appear","nodeRef","in","classNames","enter","exit","unmountOnExit","PrimitivePrompt","ref","emphasis","onDismiss","_jsxs","LiveRegion","announceOnChange","Body","as","Button","v2","priority","href","target","onClick","label"],"mappings":"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"}
1
+ {"version":3,"file":"Snackbar.js","sources":["../../src/Snackbar/Snackbar.tsx"],"sourcesContent":["import { Tags } from '@transferwise/icons';\nimport { CSSTransition } from 'react-transition-group';\n\nimport Button from '../Button';\nimport Body from '../Body';\nimport { LiveRegion } from '../common';\nimport type { ThemeDark, ThemeLight } from '../common';\nimport { PrimitivePrompt } from '../Prompt/PrimitivePrompt';\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 action, supporting a callback or navigation through `href` and `target`. */\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 /** 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 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 onDismissRequest,\n resetKey: announcementKey,\n timeout,\n visible,\n });\n\n const renderMedia = () => {\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={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={action.onClick}\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","media","onDismissRequest","onExited","sentiment","text","timeout","visible","handleBlur","handleEntered","handleFocus","handleMouseEnter","handleMouseLeave","surfaceRef","useSnackbarAutoDismiss","resetKey","renderMedia","_jsx","className","children","Tags","size","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","onClick","label"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import { Tags } from '@transferwise/icons';
2
- import { useRef, useEffect } from 'react';
3
2
  import { CSSTransition } from 'react-transition-group';
4
3
  import Button from '../Button/Button.resolver.mjs';
5
4
  import Body from '../Body/Body.mjs';
@@ -24,6 +23,7 @@ import '../common/PropsValues/markdownNodeType.mjs';
24
23
  import '../common/fileType.mjs';
25
24
  import '@transferwise/formatting';
26
25
  import 'clsx';
26
+ import 'react';
27
27
  import 'react-intl';
28
28
  import '../common/CloseButton/CloseButton.messages.mjs';
29
29
  import { jsx, jsxs } from 'react/jsx-runtime';
@@ -31,10 +31,12 @@ import { LiveRegion } from '../common/LiveRegion/LiveRegion.mjs';
31
31
  import { PrimitivePrompt } from '../Prompt/PrimitivePrompt/PrimitivePrompt.mjs';
32
32
  import StatusIcon from '../StatusIcon/StatusIcon.mjs';
33
33
  import { SNACKBAR_EXIT_DURATION, SNACKBAR_ENTER_DURATION } from './constants.mjs';
34
+ import useSnackbarAutoDismiss from './useSnackbarAutoDismiss.mjs';
34
35
 
35
36
  const Snackbar = ({
36
37
  action,
37
38
  announcementKey,
39
+ duration,
38
40
  media,
39
41
  onDismissRequest,
40
42
  onExited,
@@ -43,14 +45,20 @@ const Snackbar = ({
43
45
  timeout,
44
46
  visible
45
47
  }) => {
46
- const surfaceRef = useRef(null);
47
- useEffect(() => {
48
- if (!visible) {
49
- return undefined;
50
- }
51
- const id = window.setTimeout(onDismissRequest, timeout);
52
- return () => window.clearTimeout(id);
53
- }, [announcementKey, onDismissRequest, timeout, visible]);
48
+ const {
49
+ handleBlur,
50
+ handleEntered,
51
+ handleFocus,
52
+ handleMouseEnter,
53
+ handleMouseLeave,
54
+ surfaceRef
55
+ } = useSnackbarAutoDismiss({
56
+ duration,
57
+ onDismissRequest,
58
+ resetKey: announcementKey,
59
+ timeout,
60
+ visible
61
+ });
54
62
  const renderMedia = () => {
55
63
  if (media) {
56
64
  return /*#__PURE__*/jsx("span", {
@@ -89,6 +97,7 @@ const Snackbar = ({
89
97
  exit: SNACKBAR_EXIT_DURATION
90
98
  },
91
99
  unmountOnExit: true,
100
+ onEntered: handleEntered,
92
101
  onExited: onExited,
93
102
  children: /*#__PURE__*/jsx(PrimitivePrompt, {
94
103
  ref: surfaceRef,
@@ -97,6 +106,10 @@ const Snackbar = ({
97
106
  emphasis: "elevated",
98
107
  media: renderMedia(),
99
108
  onDismiss: onDismissRequest,
109
+ onMouseEnter: handleMouseEnter,
110
+ onMouseLeave: handleMouseLeave,
111
+ onFocus: handleFocus,
112
+ onBlur: handleBlur,
100
113
  children: /*#__PURE__*/jsxs("div", {
101
114
  className: "wds-Snackbar__content",
102
115
  children: [/*#__PURE__*/jsx(LiveRegion, {
@@ -1 +1 @@
1
- {"version":3,"file":"Snackbar.mjs","sources":["../../src/Snackbar/Snackbar.tsx"],"sourcesContent":["import { Tags } from '@transferwise/icons';\nimport { useEffect, useRef } from 'react';\nimport { CSSTransition } from 'react-transition-group';\n\nimport Button from '../Button';\nimport Body from '../Body';\nimport { LiveRegion } from '../common';\nimport type { ThemeDark, ThemeLight } from '../common';\nimport { PrimitivePrompt } from '../Prompt/PrimitivePrompt';\nimport type { Sentiment } from '../SentimentSurface';\nimport StatusIcon from '../StatusIcon';\n\nimport { SNACKBAR_ENTER_DURATION, SNACKBAR_EXIT_DURATION } from './constants';\nimport type { SnackbarAction, SnackbarInternalProps } from './Snackbar.types';\n\n/**\n * Message options retained for public type compatibility. Create notifications through\n * SnackbarProvider/useSnackbar; the controlled surface also needs provider-only lifecycle props.\n */\nexport interface SnackbarProps {\n /** One optional action, supporting a callback or navigation through `href` and `target`. */\n action?: SnackbarAction;\n /** Overrides sentiment-derived media with content for the 24×24px media slot. */\n media?: React.ReactNode;\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 /** Auto-dismiss delay in milliseconds, supplied by the provider. */\n timeout: number;\n /** @deprecated Has no effect when using SnackbarProvider, which manages Snackbar identity. */\n timestamp?: number;\n}\n\nexport const Snackbar = ({\n action,\n announcementKey,\n media,\n onDismissRequest,\n onExited,\n sentiment = 'neutral',\n text,\n timeout,\n visible,\n}: SnackbarInternalProps) => {\n const surfaceRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (!visible) {\n return undefined;\n }\n\n const id = window.setTimeout(onDismissRequest, timeout);\n return () => window.clearTimeout(id);\n }, [announcementKey, onDismissRequest, timeout, visible]);\n\n const renderMedia = () => {\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 onExited={onExited}\n >\n <PrimitivePrompt\n ref={surfaceRef}\n className=\"wds-Snackbar-container\"\n sentiment={sentiment}\n emphasis=\"elevated\"\n media={renderMedia()}\n onDismiss={onDismissRequest}\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={action.onClick}\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","media","onDismissRequest","onExited","sentiment","text","timeout","visible","surfaceRef","useRef","useEffect","undefined","id","window","setTimeout","clearTimeout","renderMedia","_jsx","className","children","Tags","size","StatusIcon","style","SNACKBAR_ENTER_DURATION","SNACKBAR_EXIT_DURATION","CSSTransition","appear","nodeRef","in","classNames","enter","exit","unmountOnExit","PrimitivePrompt","ref","emphasis","onDismiss","_jsxs","LiveRegion","announceOnChange","Body","as","Button","v2","priority","href","target","onClick","label"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCO,MAAMA,QAAQ,GAAGA,CAAC;EACvBC,MAAM;EACNC,eAAe;EACfC,KAAK;EACLC,gBAAgB;EAChBC,QAAQ;AACRC,EAAAA,SAAS,GAAG,SAAS;EACrBC,IAAI;EACJC,OAAO;AACPC,EAAAA;AAAO,CACe,KAAI;AAC1B,EAAA,MAAMC,UAAU,GAAGC,MAAM,CAAiB,IAAI,CAAC;AAE/CC,EAAAA,SAAS,CAAC,MAAK;IACb,IAAI,CAACH,OAAO,EAAE;AACZ,MAAA,OAAOI,SAAS;AAClB,IAAA;IAEA,MAAMC,EAAE,GAAGC,MAAM,CAACC,UAAU,CAACZ,gBAAgB,EAAEI,OAAO,CAAC;AACvD,IAAA,OAAO,MAAMO,MAAM,CAACE,YAAY,CAACH,EAAE,CAAC;EACtC,CAAC,EAAE,CAACZ,eAAe,EAAEE,gBAAgB,EAAEI,OAAO,EAAEC,OAAO,CAAC,CAAC;EAEzD,MAAMS,WAAW,GAAGA,MAAK;AACvB,IAAA,IAAIf,KAAK,EAAE;AACT,MAAA,oBAAOgB,GAAA,CAAA,MAAA,EAAA;AAAMC,QAAAA,SAAS,EAAC,2BAA2B;AAAAC,QAAAA,QAAA,EAAElB;AAAK,OAAO,CAAC;AACnE,IAAA;IAEA,IAAIG,SAAS,KAAK,aAAa,EAAE;AAC/B,MAAA,oBACEa,GAAA,CAAA,MAAA,EAAA;AAAMC,QAAAA,SAAS,EAAC,2BAA2B;QAAAC,QAAA,eACzCF,GAAA,CAACG,IAAI,EAAA;UAAC,aAAA,EAAA,IAAW;AAACC,UAAAA,IAAI,EAAE;SAAG;AAC7B,OAAM,CAAC;AAEX,IAAA;IAEA,oBAAOJ,GAAA,CAACK,UAAU,EAAA;AAAClB,MAAAA,SAAS,EAAEA,SAAU;AAACiB,MAAAA,IAAI,EAAE;AAAG,MAAG;EACvD,CAAC;AAED,EAAA,oBACEJ,GAAA,CAAA,KAAA,EAAA;AACEC,IAAAA,SAAS,EAAC,cAAc;AACxBK,IAAAA,KAAK,EACH;MACE,2BAA2B,EAAE,CAAA,EAAGC,uBAAuB,CAAA,EAAA,CAAI;MAC3D,0BAA0B,EAAE,GAAGC,sBAAsB,CAAA,EAAA;KAExD;IAAAN,QAAA,eAEDF,GAAA,CAACS,aAAa,EAAA;MACZC,MAAM,EAAA,IAAA;AACNC,MAAAA,OAAO,EAAEpB,UAAW;AACpBqB,MAAAA,EAAE,EAAEtB,OAAQ;AACZuB,MAAAA,UAAU,EAAC,wBAAwB;AACnCxB,MAAAA,OAAO,EAAE;AACPqB,QAAAA,MAAM,EAAEH,uBAAuB;AAC/BO,QAAAA,KAAK,EAAEP,uBAAuB;AAC9BQ,QAAAA,IAAI,EAAEP;OACN;MACFQ,aAAa,EAAA,IAAA;AACb9B,MAAAA,QAAQ,EAAEA,QAAS;MAAAgB,QAAA,eAEnBF,GAAA,CAACiB,eAAe,EAAA;AACdC,QAAAA,GAAG,EAAE3B,UAAW;AAChBU,QAAAA,SAAS,EAAC,wBAAwB;AAClCd,QAAAA,SAAS,EAAEA,SAAU;AACrBgC,QAAAA,QAAQ,EAAC,UAAU;QACnBnC,KAAK,EAAEe,WAAW,EAAG;AACrBqB,QAAAA,SAAS,EAAEnC,gBAAiB;AAAAiB,QAAAA,QAAA,eAE5BmB,IAAA,CAAA,KAAA,EAAA;AAAKpB,UAAAA,SAAS,EAAC,uBAAuB;UAAAC,QAAA,EAAA,cACpCF,GAAA,CAACsB,UAAU,EAAA;AACT,YAAA,WAAA,EAAU,QAAQ;AAClBC,YAAAA,gBAAgB,EAAExC,eAAgB;AAClCkB,YAAAA,SAAS,EAAC,uBAAuB;YAAAC,QAAA,eAEjCF,GAAA,CAACwB,IAAI,EAAA;AAACC,cAAAA,EAAE,EAAC,MAAM;AAACxB,cAAAA,SAAS,EAAC,oBAAoB;AAAAC,cAAAA,QAAA,EAC3Cd;aACG;AACR,WAAY,CACZ,EAACN,MAAM,gBACLkB,GAAA,CAAC0B,MAAM,EAAA;AACLzB,YAAAA,SAAS,EAAC,sBAAsB;YAChC0B,EAAE,EAAA,IAAA;AACFvB,YAAAA,IAAI,EAAC,IAAI;AACTwB,YAAAA,QAAQ,EAAC,WAAW;YACpBC,IAAI,EAAE/C,MAAM,CAAC+C,IAAK;YAClBC,MAAM,EAAEhD,MAAM,CAACgD,MAAO;YACtBC,OAAO,EAAEjD,MAAM,CAACiD,OAAQ;YAAA7B,QAAA,EAEvBpB,MAAM,CAACkD;WACF,CAAC,GACP,IAAI;SACL;OACU;KACJ;AACjB,GAAK,CAAC;AAEV;;"}
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 from '../Button';\nimport Body from '../Body';\nimport { LiveRegion } from '../common';\nimport type { ThemeDark, ThemeLight } from '../common';\nimport { PrimitivePrompt } from '../Prompt/PrimitivePrompt';\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 action, supporting a callback or navigation through `href` and `target`. */\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 /** 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 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 onDismissRequest,\n resetKey: announcementKey,\n timeout,\n visible,\n });\n\n const renderMedia = () => {\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={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={action.onClick}\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","media","onDismissRequest","onExited","sentiment","text","timeout","visible","handleBlur","handleEntered","handleFocus","handleMouseEnter","handleMouseLeave","surfaceRef","useSnackbarAutoDismiss","resetKey","renderMedia","_jsx","className","children","Tags","size","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","onClick","label"],"mappings":"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"}
@@ -9,7 +9,7 @@ var useSnackbarManager = require('./useSnackbarManager.js');
9
9
  var jsxRuntime = require('react/jsx-runtime');
10
10
 
11
11
  function SnackbarProvider({
12
- timeout = 4500,
12
+ timeout,
13
13
  children
14
14
  }) {
15
15
  const {
@@ -1 +1 @@
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 timeout?: number;\n children?: React.ReactNode;\n}\n\nexport default function SnackbarProvider({ timeout = 4500, 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":";;;;;;;;;;AAWc,SAAUA,gBAAgBA,CAAC;AAAEC,EAAAA,OAAO,GAAG,IAAI;AAAEC,EAAAA;AAAQ,CAAyB,EAAA;EAC1F,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
+ {"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\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":";;;;;;;;;;AAkBc,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;;"}
@@ -5,7 +5,7 @@ import useSnackbarManager from './useSnackbarManager.mjs';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
7
7
  function SnackbarProvider({
8
- timeout = 4500,
8
+ timeout,
9
9
  children
10
10
  }) {
11
11
  const {
@@ -1 +1 @@
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 timeout?: number;\n children?: React.ReactNode;\n}\n\nexport default function SnackbarProvider({ timeout = 4500, 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":";;;;;;AAWc,SAAUA,gBAAgBA,CAAC;AAAEC,EAAAA,OAAO,GAAG,IAAI;AAAEC,EAAAA;AAAQ,CAAyB,EAAA;EAC1F,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;;"}
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\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":";;;;;;AAkBc,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;;"}
@@ -2,7 +2,13 @@
2
2
 
3
3
  const SNACKBAR_ENTER_DURATION = 300;
4
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;
5
9
 
10
+ exports.SNACKBAR_DEFAULT_DURATION = SNACKBAR_DEFAULT_DURATION;
6
11
  exports.SNACKBAR_ENTER_DURATION = SNACKBAR_ENTER_DURATION;
7
12
  exports.SNACKBAR_EXIT_DURATION = SNACKBAR_EXIT_DURATION;
13
+ exports.SNACKBAR_EXTENDED_DURATION = SNACKBAR_EXTENDED_DURATION;
8
14
  //# sourceMappingURL=constants.js.map
@@ -1 +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"],"names":["SNACKBAR_ENTER_DURATION","SNACKBAR_EXIT_DURATION"],"mappings":";;AAAO,MAAMA,uBAAuB,GAAG;AAChC,MAAMC,sBAAsB,GAAG;;;"}
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;;;;;"}
@@ -1,5 +1,9 @@
1
1
  const SNACKBAR_ENTER_DURATION = 300;
2
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;
3
7
 
4
- export { SNACKBAR_ENTER_DURATION, SNACKBAR_EXIT_DURATION };
8
+ export { SNACKBAR_DEFAULT_DURATION, SNACKBAR_ENTER_DURATION, SNACKBAR_EXIT_DURATION, SNACKBAR_EXTENDED_DURATION };
5
9
  //# sourceMappingURL=constants.mjs.map
@@ -1 +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"],"names":["SNACKBAR_ENTER_DURATION","SNACKBAR_EXIT_DURATION"],"mappings":"AAAO,MAAMA,uBAAuB,GAAG;AAChC,MAAMC,sBAAsB,GAAG;;"}
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,143 @@
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
+ timeout
11
+ }) => {
12
+ if (duration === 'indefinite') {
13
+ return null;
14
+ }
15
+ if (duration === 'extended') {
16
+ return constants.SNACKBAR_EXTENDED_DURATION;
17
+ }
18
+ if (duration === 'default') {
19
+ return constants.SNACKBAR_DEFAULT_DURATION;
20
+ }
21
+ return timeout ?? constants.SNACKBAR_DEFAULT_DURATION;
22
+ };
23
+ /** Starts after entry finishes and pauses on hover or focus, preserving the remaining time. */
24
+ const useSnackbarAutoDismiss = ({
25
+ duration,
26
+ onDismissRequest,
27
+ resetKey,
28
+ timeout,
29
+ visible
30
+ }) => {
31
+ const surfaceRef = React.useRef(null);
32
+ const hasEnteredRef = React.useRef(false);
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
+ timeout
54
+ })) => {
55
+ clearTimer();
56
+ remainingDurationRef.current = remainingDuration;
57
+ if (!visible || !hasEnteredRef.current || remainingDuration === null || isInterrupted()) {
58
+ return;
59
+ }
60
+ timerStartedAtRef.current = Date.now();
61
+ timeoutRef.current = window.setTimeout(() => {
62
+ timeoutRef.current = 0;
63
+ remainingDurationRef.current = 0;
64
+ onDismissRequest();
65
+ }, remainingDuration);
66
+ }, [clearTimer, duration, isInterrupted, onDismissRequest, timeout, visible]);
67
+ const pauseTimer = React.useCallback(() => {
68
+ if (!timeoutRef.current || remainingDurationRef.current === null) {
69
+ return;
70
+ }
71
+ clearTimer();
72
+ // Count only unpaused time; resuming must not grant another full duration.
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
+ const handleEntered = React.useCallback(() => {
113
+ hasEnteredRef.current = true;
114
+ const snackbar = surfaceRef.current;
115
+ // Entry can finish beneath the pointer or with keyboard focus already inside the surface.
116
+ interactionStateRef.current = {
117
+ focusWithin: Boolean(snackbar?.contains(document.activeElement)),
118
+ hovered: snackbar?.matches(':hover') ?? false
119
+ };
120
+ startTimer();
121
+ }, [startTimer]);
122
+ React.useEffect(() => {
123
+ if (!visible) {
124
+ hasEnteredRef.current = false;
125
+ clearTimer();
126
+ return undefined;
127
+ }
128
+ // Before onEntered this only prepares the duration; it cannot start the countdown.
129
+ startTimer();
130
+ return clearTimer;
131
+ }, [clearTimer, resetKey, startTimer, visible]);
132
+ return {
133
+ handleBlur,
134
+ handleEntered,
135
+ handleFocus,
136
+ handleMouseEnter,
137
+ handleMouseLeave,
138
+ surfaceRef
139
+ };
140
+ };
141
+
142
+ exports.default = useSnackbarAutoDismiss;
143
+ //# 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 onDismissRequest: () => void;\n resetKey: number;\n timeout?: number;\n visible: boolean;\n};\n\nconst getAutoDismissDuration = ({\n duration,\n timeout,\n}: Pick<UseSnackbarAutoDismissOptions, 'duration' | 'timeout'>) => {\n if (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\n/** Starts after entry finishes and pauses on hover or focus, preserving the remaining time. */\nconst useSnackbarAutoDismiss = ({\n duration,\n onDismissRequest,\n resetKey,\n timeout,\n visible,\n}: UseSnackbarAutoDismissOptions) => {\n const surfaceRef = useRef<HTMLDivElement>(null);\n const hasEnteredRef = useRef(false);\n const timeoutRef = useRef(0);\n const remainingDurationRef = useRef<number | null>(null);\n const timerStartedAtRef = useRef(0);\n const interactionStateRef = useRef({ 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, timeout })) => {\n clearTimer();\n remainingDurationRef.current = remainingDuration;\n\n if (!visible || !hasEnteredRef.current || 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, onDismissRequest, timeout, visible],\n );\n\n const pauseTimer = useCallback(() => {\n if (!timeoutRef.current || remainingDurationRef.current === null) {\n return;\n }\n\n clearTimer();\n // Count only unpaused time; resuming must not grant another full duration.\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 const handleEntered = useCallback(() => {\n hasEnteredRef.current = true;\n const snackbar = surfaceRef.current;\n // Entry can finish beneath the pointer or with keyboard focus already inside the surface.\n interactionStateRef.current = {\n focusWithin: Boolean(snackbar?.contains(document.activeElement)),\n hovered: snackbar?.matches(':hover') ?? false,\n };\n startTimer();\n }, [startTimer]);\n\n useEffect(() => {\n if (!visible) {\n hasEnteredRef.current = false;\n clearTimer();\n return undefined;\n }\n\n // Before onEntered this only prepares the duration; it cannot start the countdown.\n startTimer();\n\n return clearTimer;\n }, [clearTimer, resetKey, startTimer, visible]);\n\n return { handleBlur, handleEntered, handleFocus, handleMouseEnter, handleMouseLeave, surfaceRef };\n};\n\nexport default useSnackbarAutoDismiss;\n"],"names":["getAutoDismissDuration","duration","timeout","SNACKBAR_EXTENDED_DURATION","SNACKBAR_DEFAULT_DURATION","useSnackbarAutoDismiss","onDismissRequest","resetKey","visible","surfaceRef","useRef","hasEnteredRef","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","handleEntered","snackbar","Boolean","document","activeElement","matches","useEffect","undefined"],"mappings":"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"}
@@ -0,0 +1,139 @@
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
+ timeout
7
+ }) => {
8
+ if (duration === 'indefinite') {
9
+ return null;
10
+ }
11
+ if (duration === 'extended') {
12
+ return SNACKBAR_EXTENDED_DURATION;
13
+ }
14
+ if (duration === 'default') {
15
+ return SNACKBAR_DEFAULT_DURATION;
16
+ }
17
+ return timeout ?? SNACKBAR_DEFAULT_DURATION;
18
+ };
19
+ /** Starts after entry finishes and pauses on hover or focus, preserving the remaining time. */
20
+ const useSnackbarAutoDismiss = ({
21
+ duration,
22
+ onDismissRequest,
23
+ resetKey,
24
+ timeout,
25
+ visible
26
+ }) => {
27
+ const surfaceRef = useRef(null);
28
+ const hasEnteredRef = useRef(false);
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
+ timeout
50
+ })) => {
51
+ clearTimer();
52
+ remainingDurationRef.current = remainingDuration;
53
+ if (!visible || !hasEnteredRef.current || remainingDuration === null || isInterrupted()) {
54
+ return;
55
+ }
56
+ timerStartedAtRef.current = Date.now();
57
+ timeoutRef.current = window.setTimeout(() => {
58
+ timeoutRef.current = 0;
59
+ remainingDurationRef.current = 0;
60
+ onDismissRequest();
61
+ }, remainingDuration);
62
+ }, [clearTimer, duration, isInterrupted, onDismissRequest, timeout, visible]);
63
+ const pauseTimer = useCallback(() => {
64
+ if (!timeoutRef.current || remainingDurationRef.current === null) {
65
+ return;
66
+ }
67
+ clearTimer();
68
+ // Count only unpaused time; resuming must not grant another full duration.
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
+ const handleEntered = useCallback(() => {
109
+ hasEnteredRef.current = true;
110
+ const snackbar = surfaceRef.current;
111
+ // Entry can finish beneath the pointer or with keyboard focus already inside the surface.
112
+ interactionStateRef.current = {
113
+ focusWithin: Boolean(snackbar?.contains(document.activeElement)),
114
+ hovered: snackbar?.matches(':hover') ?? false
115
+ };
116
+ startTimer();
117
+ }, [startTimer]);
118
+ useEffect(() => {
119
+ if (!visible) {
120
+ hasEnteredRef.current = false;
121
+ clearTimer();
122
+ return undefined;
123
+ }
124
+ // Before onEntered this only prepares the duration; it cannot start the countdown.
125
+ startTimer();
126
+ return clearTimer;
127
+ }, [clearTimer, resetKey, startTimer, visible]);
128
+ return {
129
+ handleBlur,
130
+ handleEntered,
131
+ handleFocus,
132
+ handleMouseEnter,
133
+ handleMouseLeave,
134
+ surfaceRef
135
+ };
136
+ };
137
+
138
+ export { useSnackbarAutoDismiss as default };
139
+ //# sourceMappingURL=useSnackbarAutoDismiss.mjs.map