@hh.ru/magritte-ui-snackbar 5.1.29 → 6.0.1

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/Snackbar.js CHANGED
@@ -3,14 +3,51 @@ import { useContext, useId, useRef, useEffect } from 'react';
3
3
  import { SnackbarContext } from './context.js';
4
4
  import { SnackbarTransitionName } from './types.js';
5
5
 
6
- const Snackbar = ({ removeOnUnmount = true, ...rest }) => {
6
+ const Snackbar = ({ actionLabel, align, addon, autohideTime, children, containerId, 'data-qa': dataQa, stretched, showClose, showTimer, 'aria-label-close': ariaLabelClose, 'aria-label': ariaLabel, role, removeOnUnmount = true, onAction, onClose, }) => {
7
7
  const context = useContext(SnackbarContext);
8
8
  const uid = useId();
9
9
  const removeOnUnmountRef = useRef(removeOnUnmount);
10
10
  removeOnUnmountRef.current = removeOnUnmount;
11
+ // коллбэки не мемоизированы => вызывают animateIn
12
+ const onActionRef = useRef(onAction);
13
+ onActionRef.current = onAction;
14
+ const onCloseRef = useRef(onClose);
15
+ onCloseRef.current = onClose;
11
16
  useEffect(() => {
12
- context.animateIn(uid, rest);
13
- }, [context, uid, rest]);
17
+ context.animateIn(uid, {
18
+ actionLabel,
19
+ align,
20
+ addon,
21
+ autohideTime,
22
+ children,
23
+ 'data-qa': dataQa,
24
+ containerId,
25
+ stretched,
26
+ showClose,
27
+ showTimer,
28
+ 'aria-label-close': ariaLabelClose,
29
+ 'aria-label': ariaLabel,
30
+ role,
31
+ onAction: onActionRef.current,
32
+ onClose: onCloseRef.current,
33
+ });
34
+ }, [
35
+ context,
36
+ uid,
37
+ actionLabel,
38
+ align,
39
+ addon,
40
+ autohideTime,
41
+ dataQa,
42
+ children,
43
+ containerId,
44
+ stretched,
45
+ showClose,
46
+ showTimer,
47
+ ariaLabelClose,
48
+ ariaLabel,
49
+ role,
50
+ ]);
14
51
  useEffect(() => {
15
52
  return () => {
16
53
  if (!removeOnUnmountRef.current) {
package/Snackbar.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"Snackbar.js","sources":["../src/Snackbar.tsx"],"sourcesContent":["import { FC, useContext, useEffect, useId, useRef } from 'react';\n\nimport { SnackbarContext } from '@hh.ru/magritte-ui-snackbar/context';\nimport { SnackbarProps, SnackbarTransitionName } from '@hh.ru/magritte-ui-snackbar/types';\n\nexport const Snackbar: FC<SnackbarProps> = ({ removeOnUnmount = true, ...rest }) => {\n const context = useContext(SnackbarContext);\n const uid = useId();\n const removeOnUnmountRef = useRef(removeOnUnmount);\n removeOnUnmountRef.current = removeOnUnmount;\n\n useEffect(() => {\n context.animateIn(uid, rest);\n }, [context, uid, rest]);\n\n useEffect(() => {\n return () => {\n if (!removeOnUnmountRef.current) {\n return;\n }\n\n context.animateOut(\n uid,\n context.isShown(uid) ? SnackbarTransitionName.Hide : SnackbarTransitionName.RemoveImmediately\n );\n };\n }, [context, uid]);\n\n return null;\n};\n"],"names":[],"mappings":";;;;AAKO,MAAM,QAAQ,GAAsB,CAAC,EAAE,eAAe,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,KAAI;AAC/E,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;AAC5C,IAAA,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC;AACpB,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AACnD,IAAA,kBAAkB,CAAC,OAAO,GAAG,eAAe,CAAC;IAE7C,SAAS,CAAC,MAAK;AACX,QAAA,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;KAChC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;IAEzB,SAAS,CAAC,MAAK;AACX,QAAA,OAAO,MAAK;AACR,YAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;gBAC7B,OAAO;aACV;YAED,OAAO,CAAC,UAAU,CACd,GAAG,EACH,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,IAAI,GAAG,sBAAsB,CAAC,iBAAiB,CAChG,CAAC;AACN,SAAC,CAAC;AACN,KAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;AAEnB,IAAA,OAAO,IAAI,CAAC;AAChB;;;;"}
1
+ {"version":3,"file":"Snackbar.js","sources":["../src/Snackbar.tsx"],"sourcesContent":["import { FC, useContext, useEffect, useId, useRef } from 'react';\n\nimport { SnackbarContext } from '@hh.ru/magritte-ui-snackbar/context';\nimport { SnackbarProps, SnackbarTransitionName } from '@hh.ru/magritte-ui-snackbar/types';\n\nexport const Snackbar: FC<SnackbarProps> = ({\n actionLabel,\n align,\n addon,\n autohideTime,\n children,\n containerId,\n 'data-qa': dataQa,\n stretched,\n showClose,\n showTimer,\n 'aria-label-close': ariaLabelClose,\n 'aria-label': ariaLabel,\n role,\n removeOnUnmount = true,\n onAction,\n onClose,\n}) => {\n const context = useContext(SnackbarContext);\n const uid = useId();\n const removeOnUnmountRef = useRef(removeOnUnmount);\n removeOnUnmountRef.current = removeOnUnmount;\n\n // коллбэки не мемоизированы => вызывают animateIn\n const onActionRef = useRef<VoidFunction | undefined>(onAction);\n onActionRef.current = onAction;\n const onCloseRef = useRef<VoidFunction | undefined>(onClose);\n onCloseRef.current = onClose;\n\n useEffect(() => {\n context.animateIn(uid, {\n actionLabel,\n align,\n addon,\n autohideTime,\n children,\n 'data-qa': dataQa,\n containerId,\n stretched,\n showClose,\n showTimer,\n 'aria-label-close': ariaLabelClose,\n 'aria-label': ariaLabel,\n role,\n onAction: onActionRef.current,\n onClose: onCloseRef.current,\n } as SnackbarProps);\n }, [\n context,\n uid,\n actionLabel,\n align,\n addon,\n autohideTime,\n dataQa,\n children,\n containerId,\n stretched,\n showClose,\n showTimer,\n ariaLabelClose,\n ariaLabel,\n role,\n ]);\n\n useEffect(() => {\n return () => {\n if (!removeOnUnmountRef.current) {\n return;\n }\n context.animateOut(\n uid,\n context.isShown(uid) ? SnackbarTransitionName.Hide : SnackbarTransitionName.RemoveImmediately\n );\n };\n }, [context, uid]);\n\n return null;\n};\n"],"names":[],"mappings":";;;;MAKa,QAAQ,GAAsB,CAAC,EACxC,WAAW,EACX,KAAK,EACL,KAAK,EACL,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,SAAS,EAAE,MAAM,EACjB,SAAS,EACT,SAAS,EACT,SAAS,EACT,kBAAkB,EAAE,cAAc,EAClC,YAAY,EAAE,SAAS,EACvB,IAAI,EACJ,eAAe,GAAG,IAAI,EACtB,QAAQ,EACR,OAAO,GACV,KAAI;AACD,IAAA,MAAM,OAAO,GAAG,UAAU,CAAC,eAAe,CAAC,CAAC;AAC5C,IAAA,MAAM,GAAG,GAAG,KAAK,EAAE,CAAC;AACpB,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AACnD,IAAA,kBAAkB,CAAC,OAAO,GAAG,eAAe,CAAC;;AAG7C,IAAA,MAAM,WAAW,GAAG,MAAM,CAA2B,QAAQ,CAAC,CAAC;AAC/D,IAAA,WAAW,CAAC,OAAO,GAAG,QAAQ,CAAC;AAC/B,IAAA,MAAM,UAAU,GAAG,MAAM,CAA2B,OAAO,CAAC,CAAC;AAC7D,IAAA,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAE7B,SAAS,CAAC,MAAK;AACX,QAAA,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE;YACnB,WAAW;YACX,KAAK;YACL,KAAK;YACL,YAAY;YACZ,QAAQ;AACR,YAAA,SAAS,EAAE,MAAM;YACjB,WAAW;YACX,SAAS;YACT,SAAS;YACT,SAAS;AACT,YAAA,kBAAkB,EAAE,cAAc;AAClC,YAAA,YAAY,EAAE,SAAS;YACvB,IAAI;YACJ,QAAQ,EAAE,WAAW,CAAC,OAAO;YAC7B,OAAO,EAAE,UAAU,CAAC,OAAO;AACb,SAAA,CAAC,CAAC;AACxB,KAAC,EAAE;QACC,OAAO;QACP,GAAG;QACH,WAAW;QACX,KAAK;QACL,KAAK;QACL,YAAY;QACZ,MAAM;QACN,QAAQ;QACR,WAAW;QACX,SAAS;QACT,SAAS;QACT,SAAS;QACT,cAAc;QACd,SAAS;QACT,IAAI;AACP,KAAA,CAAC,CAAC;IAEH,SAAS,CAAC,MAAK;AACX,QAAA,OAAO,MAAK;AACR,YAAA,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;gBAC7B,OAAO;aACV;YACD,OAAO,CAAC,UAAU,CACd,GAAG,EACH,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,sBAAsB,CAAC,IAAI,GAAG,sBAAsB,CAAC,iBAAiB,CAChG,CAAC;AACN,SAAC,CAAC;AACN,KAAC,EAAE,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;AAEnB,IAAA,OAAO,IAAI,CAAC;AAChB;;;;"}
@@ -2,7 +2,7 @@ import './index.css';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
3
  import { useContext, useCallback, Fragment } from 'react';
4
4
  import { SnackbarContext } from './context.js';
5
- import { s as styles } from './snackbar-0C5Em6lA.js';
5
+ import { s as styles } from './snackbar-BUXYCBno.js';
6
6
 
7
7
  const SnackbarContainer = ({ children, id, ...props }) => {
8
8
  const context = useContext(SnackbarContext);
@@ -5,73 +5,148 @@ import { createPortal } from 'react-dom';
5
5
  import { SnackbarRenderer } from './SnackbarRenderer.js';
6
6
  import { SnackbarContext } from './context.js';
7
7
  import { SnackbarTransitionName } from './types.js';
8
- import { s as styles } from './snackbar-0C5Em6lA.js';
8
+ import { s as styles } from './snackbar-BUXYCBno.js';
9
9
  import 'react-transition-group';
10
10
  import 'classnames';
11
- import '@hh.ru/magritte-common-func-utils';
12
11
  import '@hh.ru/magritte-common-keyboard';
13
- import '@hh.ru/magritte-common-resize';
14
12
  import '@hh.ru/magritte-common-use-multiple-refs';
15
13
  import '@hh.ru/magritte-common-use-swipe';
14
+ import '@hh.ru/magritte-ui-divider';
16
15
  import '@hh.ru/magritte-ui-icon/icon';
17
16
  import '@hh.ru/magritte-ui-layer';
18
17
  import '@hh.ru/magritte-ui-link';
19
18
  import './useAriaSnackbar.js';
20
19
  import '@hh.ru/magritte-ui-timer';
21
20
 
21
+ const DEFAULT_CONTAINER = 'body';
22
+ const DEFAULT_POSITION = 0;
23
+ const MAX_SNACKBAR_IN_CONTAINER = 2; // отсчет с 0
24
+ const getContainerIdByState = (state, uid) => state[uid]?.containerId ?? DEFAULT_CONTAINER;
25
+ const getContainerIdByProps = (props) => props.containerId || DEFAULT_CONTAINER;
26
+ const getContainerWasChanged = (state, props) => {
27
+ return getContainerIdByState(state, Object.keys(state)[0]) !== getContainerIdByProps(props);
28
+ };
29
+ const getOverridesByState = (state, props) => {
30
+ let stretchedOverride;
31
+ let alignOverride;
32
+ Object.keys(state).forEach((currentUid) => {
33
+ const { stretched: prevStretched, align: prevAlign } = state[currentUid];
34
+ if (stretchedOverride === undefined && (prevStretched === true || prevStretched === undefined)) {
35
+ stretchedOverride = true;
36
+ }
37
+ if (alignOverride === undefined) {
38
+ alignOverride = prevAlign;
39
+ }
40
+ });
41
+ return getContainerWasChanged(state, props)
42
+ ? {}
43
+ : {
44
+ stretched: stretchedOverride ?? props.stretched,
45
+ align: alignOverride ?? props.align,
46
+ };
47
+ };
22
48
  const SnackbarContextProvider = ({ children }) => {
23
49
  const animationTimeoutRef = useRef({
24
50
  [SnackbarTransitionName.Show]: 0,
25
51
  [SnackbarTransitionName.Hide]: 0,
26
52
  [SnackbarTransitionName.Autohide]: 0,
27
- [SnackbarTransitionName.Replace]: 0,
28
53
  [SnackbarTransitionName.RemoveImmediately]: 0,
29
54
  });
30
55
  const containerRefs = useRef({});
31
56
  const isShownRef = useRef({});
32
57
  const [state, setState] = useState({});
58
+ const snackbarsByUidMapRef = useRef({});
33
59
  const animateOut = useCallback((uid, transition) => {
34
60
  setState((prevState) => {
35
- if (uid in prevState) {
36
- const prevTransition = prevState[uid].transition;
37
- const isCurrentlyVisible = prevTransition === SnackbarTransitionName.Show ||
38
- prevTransition === SnackbarTransitionName.Replace;
39
- const willBeHidden = transition === SnackbarTransitionName.Hide || transition === SnackbarTransitionName.Autohide;
40
- if (transition === SnackbarTransitionName.RemoveImmediately ||
41
- (willBeHidden && !isCurrentlyVisible)) {
42
- return Object.fromEntries(Object.entries(prevState).filter(([key]) => key !== uid));
43
- }
44
- return { ...prevState, [uid]: { ...prevState[uid], transition } };
61
+ if (!(uid in prevState)) {
62
+ return prevState;
63
+ }
64
+ const isCurrentlyVisible = prevState[uid].transition === SnackbarTransitionName.Show;
65
+ const willBeHidden = [SnackbarTransitionName.Hide, SnackbarTransitionName.Autohide].includes(transition);
66
+ if (transition === SnackbarTransitionName.RemoveImmediately || (willBeHidden && !isCurrentlyVisible)) {
67
+ const snackbarsByUidMap = snackbarsByUidMapRef.current[getContainerIdByState(prevState, uid)];
68
+ snackbarsByUidMap.delete(uid);
69
+ const uids = [...snackbarsByUidMap].reverse();
70
+ delete isShownRef.current[uid];
71
+ return Object.fromEntries(Object.entries(prevState)
72
+ .filter(([key]) => key !== uid)
73
+ .map(([key, state]) => {
74
+ // обновляем позицию на основе нового сета
75
+ const index = uids.indexOf(key);
76
+ state.position = index !== -1 ? index : state.position;
77
+ return [key, state];
78
+ }));
45
79
  }
46
- return prevState;
80
+ return { ...prevState, [uid]: { ...prevState[uid], transition } };
47
81
  });
48
- }, [setState]);
82
+ }, []);
49
83
  const animateIn = useCallback((uid, props) => {
50
84
  setState((prevState) => {
51
85
  if (uid in prevState) {
52
86
  // не даем менять некоторые пропсы у существующего снекбара
53
87
  const { autohideTime, containerId, showTimer, ..._props } = props;
54
- return { ...prevState, [uid]: { ...prevState[uid], ..._props } };
88
+ // применяем оверайды, так как из пропсов прилетают старые значения
89
+ const overridesProps = getOverridesByState(prevState, props);
90
+ return {
91
+ ...prevState,
92
+ [uid]: { ...prevState[uid], ..._props, ...overridesProps },
93
+ };
55
94
  }
56
- const _props = {
95
+ // сохраняем информацию о uid
96
+ const containerIdFromProps = getContainerIdByProps(props);
97
+ const snackbarsByUidMap = snackbarsByUidMapRef.current;
98
+ if (snackbarsByUidMap.hasOwnProperty(containerIdFromProps)) {
99
+ snackbarsByUidMap[containerIdFromProps].add(uid);
100
+ }
101
+ else {
102
+ snackbarsByUidMap[containerIdFromProps] = new Set([uid]);
103
+ }
104
+ // если прилетел новый снекбар, то все текущие снеки мы скрываем
105
+ const containerWasChanged = getContainerWasChanged(prevState, props);
106
+ // если stretched есть в новом снакбаре => везде ставим stretched
107
+ // аналогичная логика с align (новому снекбару ставим align из стака)
108
+ const uidsFromSet = [...snackbarsByUidMap[containerIdFromProps]].reverse();
109
+ const stretchedByNewSnackbar = props.stretched === undefined || props.stretched === true;
110
+ // обходим старый стейт и обновлям параметры (align, stretched, position, transition)
111
+ const prevStateWithUpdatedProps = Object.keys(prevState).reduce((accumulator, currentUid) => {
112
+ const { transition, stretched: prevStretched, position } = prevState[currentUid];
113
+ // если stretched есть в стаке => везде ставим stretched
114
+ const stretched = prevStretched === false ? stretchedByNewSnackbar : prevStretched;
115
+ const positionBySet = uidsFromSet.indexOf(currentUid);
116
+ // скрываем последний снэкбар
117
+ const limitReached = positionBySet > MAX_SNACKBAR_IN_CONTAINER;
118
+ const value = {
119
+ ...prevState[currentUid],
120
+ transition: containerWasChanged || limitReached ? SnackbarTransitionName.Hide : transition,
121
+ position: containerWasChanged || limitReached ? position : positionBySet,
122
+ stretched,
123
+ };
124
+ return { ...accumulator, [currentUid]: value };
125
+ }, {});
126
+ // создаем новый snackbar
127
+ const defaultProps = {
57
128
  animateOut: (transition) => animateOut(uid, transition),
58
129
  isShown: () => !!isShownRef.current[uid],
59
130
  onShown: () => (isShownRef.current[uid] = true),
60
- transition: SnackbarTransitionName[Object.keys(prevState).length > 0 ? 'Replace' : 'Show'],
131
+ transition: SnackbarTransitionName.Show,
132
+ position: DEFAULT_POSITION,
133
+ };
134
+ // учитываем оверайды на основе стака
135
+ const overridesProps = getOverridesByState(prevState, props);
136
+ const newState = {
137
+ ...prevStateWithUpdatedProps,
138
+ ...{ [uid]: { ...defaultProps, ...props, ...overridesProps } },
61
139
  };
62
- return Object.keys(prevState).reduce((accumulator, key) => {
63
- const value = { ...prevState[key], transition: SnackbarTransitionName.Hide };
64
- return key === uid ? accumulator : { ...accumulator, [key]: value };
65
- }, { [uid]: { ..._props, ...props } });
140
+ return newState;
66
141
  });
67
- }, [animateOut, setState]);
142
+ }, [animateOut]);
68
143
  const renderFunc = useCallback((uid) => {
69
144
  const containerId = state[uid].containerId;
70
145
  const container = containerId ? containerRefs.current[containerId] : document.body;
71
146
  if (!container) {
72
147
  return null;
73
148
  }
74
- return createPortal(jsx(SnackbarRenderer, { ...state[uid], timeout: animationTimeoutRef.current[state[uid].transition] }), container, uid);
149
+ return createPortal(jsx(SnackbarRenderer, { ...state[uid], timeout: animationTimeoutRef.current[state[uid].transition], container: container }), container, uid);
75
150
  }, [state]);
76
151
  const setContainerRef = useCallback((containerId, instance) => {
77
152
  if (!instance) {
@@ -1 +1 @@
1
- {"version":3,"file":"SnackbarContextProvider.js","sources":["../src/SnackbarContextProvider.tsx"],"sourcesContent":["import { FC, ReactNode, useCallback, useEffect, useMemo, useState, useRef, PropsWithChildren } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { SnackbarRenderer } from '@hh.ru/magritte-ui-snackbar/SnackbarRenderer';\nimport { SnackbarContext, SnackbarContextProps } from '@hh.ru/magritte-ui-snackbar/context';\nimport { SnackbarProps, SnackbarState, SnackbarTransitionName } from '@hh.ru/magritte-ui-snackbar/types';\n\nimport styles from './snackbar.less';\n\nexport const SnackbarContextProvider: FC<PropsWithChildren> = ({ children }) => {\n const animationTimeoutRef = useRef({\n [SnackbarTransitionName.Show]: 0,\n [SnackbarTransitionName.Hide]: 0,\n [SnackbarTransitionName.Autohide]: 0,\n [SnackbarTransitionName.Replace]: 0,\n [SnackbarTransitionName.RemoveImmediately]: 0,\n });\n const containerRefs = useRef<{ [id: string]: HTMLElement }>({});\n const isShownRef = useRef<{ [uid: string]: boolean }>({});\n const [state, setState] = useState<{ [uid: string]: SnackbarState }>({});\n\n const animateOut: SnackbarContextProps['animateOut'] = useCallback(\n (uid, transition) => {\n setState((prevState) => {\n if (uid in prevState) {\n const prevTransition = prevState[uid].transition;\n\n const isCurrentlyVisible =\n prevTransition === SnackbarTransitionName.Show ||\n prevTransition === SnackbarTransitionName.Replace;\n\n const willBeHidden =\n transition === SnackbarTransitionName.Hide || transition === SnackbarTransitionName.Autohide;\n\n if (\n transition === SnackbarTransitionName.RemoveImmediately ||\n (willBeHidden && !isCurrentlyVisible)\n ) {\n return Object.fromEntries(Object.entries(prevState).filter(([key]) => key !== uid));\n }\n\n return { ...prevState, [uid]: { ...prevState[uid], transition } };\n }\n\n return prevState;\n });\n },\n [setState]\n );\n\n const animateIn: SnackbarContextProps['animateIn'] = useCallback(\n (uid: string, props: SnackbarProps) => {\n setState((prevState) => {\n if (uid in prevState) {\n // не даем менять некоторые пропсы у существующего снекбара\n const { autohideTime, containerId, showTimer, ..._props } = props;\n return { ...prevState, [uid]: { ...prevState[uid], ..._props } as SnackbarState };\n }\n\n const _props: Pick<SnackbarState, 'animateOut' | 'isShown' | 'onShown' | 'transition'> = {\n animateOut: (transition) => animateOut(uid, transition),\n isShown: () => !!isShownRef.current[uid],\n onShown: () => (isShownRef.current[uid] = true),\n transition: SnackbarTransitionName[Object.keys(prevState).length > 0 ? 'Replace' : 'Show'],\n };\n\n return Object.keys(prevState).reduce(\n (accumulator, key) => {\n const value = { ...prevState[key], transition: SnackbarTransitionName.Hide };\n return key === uid ? accumulator : { ...accumulator, [key]: value };\n },\n { [uid]: { ..._props, ...props } as SnackbarState }\n );\n });\n },\n [animateOut, setState]\n );\n\n const renderFunc = useCallback(\n (uid: string): ReactNode => {\n const containerId = state[uid].containerId;\n const container = containerId ? containerRefs.current[containerId] : document.body;\n\n if (!container) {\n return null;\n }\n\n return createPortal(\n <SnackbarRenderer {...state[uid]} timeout={animationTimeoutRef.current[state[uid].transition]} />,\n container,\n uid\n );\n },\n [state]\n );\n\n const setContainerRef: SnackbarContextProps['setContainerRef'] = useCallback((containerId, instance) => {\n if (!instance) {\n return;\n }\n\n containerRefs.current[containerId] = instance;\n }, []);\n\n useEffect(() => {\n const animationTimeoutElement = document.createElement('div');\n animationTimeoutElement.classList.add(styles['snackbar-animation-timeout']);\n document.body.appendChild(animationTimeoutElement);\n const style = window.getComputedStyle(animationTimeoutElement);\n\n for (const transition of Object.values(SnackbarTransitionName)) {\n const animationTimeout = parseInt(style.getPropertyValue(`--${transition}-animation-duration`), 10);\n if (Number.isInteger(animationTimeout)) {\n animationTimeoutRef.current[transition] = animationTimeout;\n }\n }\n\n document.body.removeChild(animationTimeoutElement);\n }, []);\n\n const value = useMemo<SnackbarContextProps>(() => {\n return {\n animateIn,\n animateOut,\n isShown: (uid) => isShownRef.current[uid],\n setContainerRef,\n };\n }, [animateIn, animateOut, setContainerRef]);\n\n return (\n <SnackbarContext.Provider value={value}>\n {Object.keys(state).map(renderFunc)}\n {children}\n </SnackbarContext.Provider>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"SnackbarContextProvider.js","sources":["../src/SnackbarContextProvider.tsx"],"sourcesContent":["import { FC, ReactNode, useCallback, useEffect, useMemo, useState, useRef, PropsWithChildren } from 'react';\nimport { createPortal } from 'react-dom';\n\nimport { SnackbarRenderer } from '@hh.ru/magritte-ui-snackbar/SnackbarRenderer';\nimport { SnackbarContext, SnackbarContextProps } from '@hh.ru/magritte-ui-snackbar/context';\nimport {\n Align,\n SnackbarProps,\n SnackbarState,\n SnackbarTransitionName,\n SnackbarInternalState,\n} from '@hh.ru/magritte-ui-snackbar/types';\n\nimport styles from './snackbar.less';\n\ntype ProviderState = { [uid: string]: SnackbarState };\ntype SnackbarsByUidMap = Record<string, Set<string>>;\ntype Overrides = { stretched?: boolean; align?: Align };\n\nconst DEFAULT_CONTAINER = 'body';\nconst DEFAULT_POSITION = 0;\nconst MAX_SNACKBAR_IN_CONTAINER = 2; // отсчет с 0\n\nconst getContainerIdByState = (state: ProviderState, uid: string) => state[uid]?.containerId ?? DEFAULT_CONTAINER;\nconst getContainerIdByProps = (props: SnackbarProps) => props.containerId || DEFAULT_CONTAINER;\n\nconst getContainerWasChanged = (state: ProviderState, props: SnackbarProps) => {\n return getContainerIdByState(state, Object.keys(state)[0]) !== getContainerIdByProps(props);\n};\n\nconst getOverridesByState = (state: ProviderState, props: SnackbarProps): Overrides => {\n let stretchedOverride: undefined | boolean;\n let alignOverride: undefined | Align;\n Object.keys(state).forEach((currentUid) => {\n const { stretched: prevStretched, align: prevAlign } = state[currentUid];\n if (stretchedOverride === undefined && (prevStretched === true || prevStretched === undefined)) {\n stretchedOverride = true;\n }\n if (alignOverride === undefined) {\n alignOverride = prevAlign;\n }\n });\n return getContainerWasChanged(state, props)\n ? {}\n : {\n stretched: stretchedOverride ?? props.stretched,\n align: alignOverride ?? props.align,\n };\n};\n\nexport const SnackbarContextProvider: FC<PropsWithChildren> = ({ children }) => {\n const animationTimeoutRef = useRef({\n [SnackbarTransitionName.Show]: 0,\n [SnackbarTransitionName.Hide]: 0,\n [SnackbarTransitionName.Autohide]: 0,\n [SnackbarTransitionName.RemoveImmediately]: 0,\n });\n const containerRefs = useRef<{ [id: string]: HTMLElement }>({});\n const isShownRef = useRef<{ [uid: string]: boolean }>({});\n const [state, setState] = useState<ProviderState>({});\n const snackbarsByUidMapRef = useRef<SnackbarsByUidMap>({});\n\n const animateOut: SnackbarContextProps['animateOut'] = useCallback((uid, transition) => {\n setState((prevState) => {\n if (!(uid in prevState)) {\n return prevState;\n }\n const isCurrentlyVisible = prevState[uid].transition === SnackbarTransitionName.Show;\n const willBeHidden = [SnackbarTransitionName.Hide, SnackbarTransitionName.Autohide].includes(transition);\n\n if (transition === SnackbarTransitionName.RemoveImmediately || (willBeHidden && !isCurrentlyVisible)) {\n const snackbarsByUidMap = snackbarsByUidMapRef.current[getContainerIdByState(prevState, uid)];\n snackbarsByUidMap.delete(uid);\n const uids = [...snackbarsByUidMap].reverse();\n delete isShownRef.current[uid];\n return Object.fromEntries(\n Object.entries(prevState)\n .filter(([key]) => key !== uid)\n .map(([key, state]) => {\n // обновляем позицию на основе нового сета\n const index = uids.indexOf(key);\n state.position = index !== -1 ? index : state.position;\n return [key, state];\n })\n );\n }\n return { ...prevState, [uid]: { ...prevState[uid], transition } };\n });\n }, []);\n\n const animateIn: SnackbarContextProps['animateIn'] = useCallback(\n (uid: string, props: SnackbarProps) => {\n setState((prevState) => {\n if (uid in prevState) {\n // не даем менять некоторые пропсы у существующего снекбара\n const { autohideTime, containerId, showTimer, ..._props } = props;\n // применяем оверайды, так как из пропсов прилетают старые значения\n const overridesProps = getOverridesByState(prevState, props);\n return {\n ...prevState,\n [uid]: { ...prevState[uid], ..._props, ...overridesProps } as SnackbarState,\n };\n }\n // сохраняем информацию о uid\n const containerIdFromProps = getContainerIdByProps(props);\n const snackbarsByUidMap = snackbarsByUidMapRef.current;\n if (snackbarsByUidMap.hasOwnProperty(containerIdFromProps)) {\n snackbarsByUidMap[containerIdFromProps].add(uid);\n } else {\n snackbarsByUidMap[containerIdFromProps] = new Set([uid]);\n }\n\n // если прилетел новый снекбар, то все текущие снеки мы скрываем\n const containerWasChanged = getContainerWasChanged(prevState, props);\n\n // если stretched есть в новом снакбаре => везде ставим stretched\n // аналогичная логика с align (новому снекбару ставим align из стака)\n const uidsFromSet = [...snackbarsByUidMap[containerIdFromProps]].reverse();\n const stretchedByNewSnackbar = props.stretched === undefined || props.stretched === true;\n\n // обходим старый стейт и обновлям параметры (align, stretched, position, transition)\n const prevStateWithUpdatedProps = Object.keys(prevState).reduce((accumulator, currentUid) => {\n const { transition, stretched: prevStretched, position } = prevState[currentUid];\n // если stretched есть в стаке => везде ставим stretched\n const stretched = prevStretched === false ? stretchedByNewSnackbar : prevStretched;\n const positionBySet = uidsFromSet.indexOf(currentUid);\n // скрываем последний снэкбар\n const limitReached = positionBySet > MAX_SNACKBAR_IN_CONTAINER;\n const value = {\n ...prevState[currentUid],\n transition: containerWasChanged || limitReached ? SnackbarTransitionName.Hide : transition,\n position: containerWasChanged || limitReached ? position : positionBySet,\n stretched,\n };\n return { ...accumulator, [currentUid]: value };\n }, {});\n\n // создаем новый snackbar\n const defaultProps: SnackbarInternalState = {\n animateOut: (transition) => animateOut(uid, transition),\n isShown: () => !!isShownRef.current[uid],\n onShown: () => (isShownRef.current[uid] = true),\n transition: SnackbarTransitionName.Show,\n position: DEFAULT_POSITION,\n };\n\n // учитываем оверайды на основе стака\n const overridesProps = getOverridesByState(prevState, props);\n const newState = {\n ...prevStateWithUpdatedProps,\n ...{ [uid]: { ...defaultProps, ...props, ...overridesProps } },\n };\n return newState;\n });\n },\n [animateOut]\n );\n\n const renderFunc = useCallback(\n (uid: string): ReactNode => {\n const containerId = state[uid].containerId;\n const container = containerId ? containerRefs.current[containerId] : document.body;\n\n if (!container) {\n return null;\n }\n return createPortal(\n <SnackbarRenderer\n {...state[uid]}\n timeout={animationTimeoutRef.current[state[uid].transition]}\n container={container}\n />,\n container,\n uid\n );\n },\n [state]\n );\n\n const setContainerRef: SnackbarContextProps['setContainerRef'] = useCallback((containerId, instance) => {\n if (!instance) {\n return;\n }\n containerRefs.current[containerId] = instance;\n }, []);\n\n useEffect(() => {\n const animationTimeoutElement = document.createElement('div');\n animationTimeoutElement.classList.add(styles['snackbar-animation-timeout']);\n document.body.appendChild(animationTimeoutElement);\n const style = window.getComputedStyle(animationTimeoutElement);\n\n for (const transition of Object.values(SnackbarTransitionName)) {\n const animationTimeout = parseInt(style.getPropertyValue(`--${transition}-animation-duration`), 10);\n if (Number.isInteger(animationTimeout)) {\n animationTimeoutRef.current[transition] = animationTimeout;\n }\n }\n\n document.body.removeChild(animationTimeoutElement);\n }, []);\n\n const value = useMemo<SnackbarContextProps>(() => {\n return {\n animateIn,\n animateOut,\n isShown: (uid) => isShownRef.current[uid],\n setContainerRef,\n };\n }, [animateIn, animateOut, setContainerRef]);\n\n return (\n <SnackbarContext.Provider value={value}>\n {Object.keys(state).map(renderFunc)}\n {children}\n </SnackbarContext.Provider>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
@@ -1,27 +1,21 @@
1
1
  import './index.css';
2
2
  import { jsx, jsxs } from 'react/jsx-runtime';
3
- import { useCallback, useState, useRef, useLayoutEffect, useEffect } from 'react';
3
+ import { useCallback, useState, useRef, useEffect, useLayoutEffect } from 'react';
4
4
  import { CSSTransition } from 'react-transition-group';
5
5
  import classnames from 'classnames';
6
- import { useDebounce } from '@hh.ru/magritte-common-func-utils';
7
6
  import { useEscapeToClose } from '@hh.ru/magritte-common-keyboard';
8
- import { useResize } from '@hh.ru/magritte-common-resize';
9
7
  import { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';
10
8
  import { useSwipeHandlers } from '@hh.ru/magritte-common-use-swipe';
9
+ import { Divider } from '@hh.ru/magritte-ui-divider';
11
10
  import { CrossOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';
12
11
  import { Layer } from '@hh.ru/magritte-ui-layer';
13
12
  import { Link } from '@hh.ru/magritte-ui-link';
14
- import { SnackbarTransitionName, SnackbarLayout } from './types.js';
13
+ import { SnackbarTransitionName } from './types.js';
15
14
  import { useAriaSnackbar } from './useAriaSnackbar.js';
16
15
  import { useTimer, Timer } from '@hh.ru/magritte-ui-timer';
17
- import { s as styles } from './snackbar-0C5Em6lA.js';
16
+ import { s as styles } from './snackbar-BUXYCBno.js';
18
17
 
19
- const CLASS_NAMES = {
20
- [SnackbarTransitionName.Show]: {
21
- appear: styles.appear,
22
- appearActive: styles['appear-active'],
23
- appearDone: styles['appear-done'],
24
- },
18
+ const OTHER_CLASS_NAMES = {
25
19
  [SnackbarTransitionName.Hide]: {
26
20
  exit: styles.exit,
27
21
  exitActive: styles['exit-active'],
@@ -32,26 +26,36 @@ const CLASS_NAMES = {
32
26
  exitActive: styles['exit-active_autohide'],
33
27
  exitDone: styles['exit-done'],
34
28
  },
35
- [SnackbarTransitionName.Replace]: {
36
- appear: styles.appear,
37
- appearDone: styles['appear-done'],
38
- },
39
29
  [SnackbarTransitionName.RemoveImmediately]: {},
40
30
  };
31
+ const OPEN_CLASS_NAMES = {
32
+ [SnackbarTransitionName.Show]: {
33
+ top: {
34
+ appear: styles.appearTop,
35
+ appearActive: styles['appear-active'],
36
+ appearDone: styles['appear-done'],
37
+ },
38
+ bottom: {
39
+ appear: styles.appearBottom,
40
+ appearActive: styles['appear-active'],
41
+ appearDone: styles['appear-done'],
42
+ },
43
+ },
44
+ };
41
45
  const DEFAULT_AUTOHIDE_TIME_MS = 6000;
42
- const SnackbarRenderer = ({ actionLabel, addon, align = 'bottom', animateOut, autohideTime = DEFAULT_AUTOHIDE_TIME_MS, children, containerId, isShown, onAction, onClose, onShown, showClose, showTimer, timeout, transition, 'aria-label': ariaLabel, 'aria-label-close': ariaLabelClose, role = 'status', ...props }) => {
46
+ const BASE_VERTICAL_PADDING = 16;
47
+ const VERTICAL_PADDING_BETWEEN_SNACKBAR = 8;
48
+ const SnackbarRenderer = ({ actionLabel, addon, align = 'bottom', animateOut, autohideTime = DEFAULT_AUTOHIDE_TIME_MS, children, containerId, isShown, onAction, onClose, onShown, showClose, showTimer, timeout, transition, 'aria-label': ariaLabel, 'aria-label-close': ariaLabelClose, role = 'status', stretched = true, position, container, ...props }) => {
43
49
  const actionFunc = useCallback(() => onAction?.(), [onAction]);
44
50
  const [hasFocus, setHasFocus] = useState(false);
45
51
  const [hasHover, setHasHover] = useState(false);
46
52
  const hasTouchSupportRef = useRef(false);
47
- const [layout, setLayout] = useState(SnackbarLayout.Horizontal);
53
+ const prevWidth = useRef(0);
54
+ const stretchedRef = useRef(stretched);
48
55
  const autohideFunc = useCallback(() => animateOut(SnackbarTransitionName.Autohide), [animateOut]);
49
56
  const closeFunc = useCallback(() => animateOut(SnackbarTransitionName.Hide), [animateOut]);
50
- const previousMetrics = useRef(null);
51
57
  const ariaAttributes = useAriaSnackbar({ role, hasAction: !!actionLabel, 'aria-label': ariaLabel });
52
- const textRef = useRef(null);
53
- const resizableContentRef = useRef(null);
54
- const visible = transition === SnackbarTransitionName.Show || transition === SnackbarTransitionName.Replace;
58
+ const visible = transition === SnackbarTransitionName.Show;
55
59
  const maxDistanceSqRef = useRef({ nearestSide: Number.POSITIVE_INFINITY, farSide: Number.POSITIVE_INFINITY });
56
60
  const swipeThresholdXRef = useRef(null);
57
61
  const swipeThresholdYRef = useRef(null);
@@ -62,44 +66,12 @@ const SnackbarRenderer = ({ actionLabel, addon, align = 'bottom', animateOut, au
62
66
  const snackbarRef = useRef(null);
63
67
  const bindEscapeToClose = useEscapeToClose(closeFunc);
64
68
  const snackbarRefMultiplexer = useMultipleRefs(snackbarRef, bindEscapeToClose);
65
- const calculateLayout = useCallback(() => {
66
- if (textRef.current && resizableContentRef.current) {
67
- const metrics = resizableContentRef.current?.getBoundingClientRect();
68
- const style = window.getComputedStyle(textRef.current);
69
- const isVerticalLayout = textRef.current.getBoundingClientRect().height - parseInt(style.lineHeight, 10) > 1;
70
- if (previousMetrics.current !== null) {
71
- const increaseScreenSize = metrics.width > previousMetrics.current.width;
72
- setLayout((layout) => {
73
- /* Уменьшаем размер экрана и если нужно переключиться в вертикальный лейаут */
74
- if (!increaseScreenSize && isVerticalLayout && layout === SnackbarLayout.Horizontal) {
75
- return SnackbarLayout.Vertical;
76
- }
77
- /* Увеличиваем размер экрана и если нужно переключиться в вертикальный лейаут */
78
- if (increaseScreenSize && isVerticalLayout && layout === SnackbarLayout.Horizontal) {
79
- return SnackbarLayout.Vertical;
80
- }
81
- /* Кейсы когда уменьшаем или увеличиваем размер экрана и нужно переключиться
82
- * с вертикального на горизонтальный лейаут скипаем, потому как доступного места для текста
83
- * меньше и может оказаться что текст будет в 2 строки и надо
84
- * снова переключаться на вертикальный лейаут. */
85
- return layout;
86
- });
87
- }
88
- else {
89
- setLayout(isVerticalLayout ? SnackbarLayout.Vertical : SnackbarLayout.Horizontal);
90
- }
91
- previousMetrics.current = resizableContentRef.current?.getBoundingClientRect();
92
- }
93
- }, []);
94
- useLayoutEffect(calculateLayout, [calculateLayout]);
95
- useResize(useDebounce(calculateLayout, 64));
96
69
  useTimer(!!autohideTime && !showTimer ? autohideTime : -1, (callable) => {
97
70
  const timeoutId = setTimeout(callable, 50);
98
71
  return () => clearTimeout(timeoutId);
99
72
  }, (remaining) => {
100
73
  remaining < 0 && autohideFunc();
101
74
  }, hasFocus || hasHover);
102
- useEffect(() => void (!!actionLabel && snackbarRef.current?.focus?.()), [actionLabel]);
103
75
  useEffect(() => {
104
76
  if (snackbarRef.current !== null) {
105
77
  const maxDistanceX = snackbarRef.current.clientWidth * 0.66;
@@ -113,8 +85,7 @@ const SnackbarRenderer = ({ actionLabel, addon, align = 'bottom', animateOut, au
113
85
  ? { minDelta: -maxDistanceNearestY, maxDelta: maxDistanceFarY }
114
86
  : { minDelta: -maxDistanceFarY, maxDelta: maxDistanceNearestY };
115
87
  }
116
- // при смене layout может поменяться clientHeight
117
- }, [align, visible, layout]);
88
+ }, [align, visible]);
118
89
  const handleSwipeMove = useCallback((event) => {
119
90
  if (snackbarRef.current !== null) {
120
91
  // насколько прозрачным нужно сделать снекбар с учетом расстояния от начальной позиции
@@ -136,8 +107,8 @@ const SnackbarRenderer = ({ actionLabel, addon, align = 'bottom', animateOut, au
136
107
  }, [closeFunc]);
137
108
  const handleSwipeCancel = useCallback(() => {
138
109
  if (snackbarRef.current !== null) {
139
- snackbarRef.current.style.opacity = `1`;
140
- snackbarRef.current.style.transform = ``;
110
+ snackbarRef.current.style.removeProperty('opacity');
111
+ snackbarRef.current.style.removeProperty('transform');
141
112
  }
142
113
  }, []);
143
114
  const swipeHandlers = useSwipeHandlers({
@@ -182,16 +153,90 @@ const SnackbarRenderer = ({ actionLabel, addon, align = 'bottom', animateOut, au
182
153
  snackbar.removeEventListener('touchcancel', handleTouchCancel);
183
154
  };
184
155
  }, [swipeHandlers]);
185
- return (jsx(CSSTransition, { appear: true, classNames: CLASS_NAMES[transition], in: visible, nodeRef: snackbarRef, onEntered: onShown, onExited: removeImmediately, timeout: timeout, children: jsx(Layer, { layer: "snackbar", children: jsx("div", { ...props, ...ariaAttributes, className: classnames(styles.snackbar, {
156
+ useEffect(() => {
157
+ const snackbar = snackbarRef.current;
158
+ if (!snackbar) {
159
+ return;
160
+ }
161
+ snackbar.style.setProperty('--snackbar-offset', `${snackbarRef.current.offsetHeight}px`);
162
+ prevWidth.current = snackbar.getBoundingClientRect().width;
163
+ }, []);
164
+ useEffect(() => {
165
+ const snackbar = snackbarRef.current;
166
+ if (!snackbar) {
167
+ return;
168
+ }
169
+ // снекбары могут быть разные по высоте
170
+ // для расчета текущей позиции
171
+ // высоту каждого предыдущего надо учесть
172
+ const snackbars = container.querySelectorAll('[data-magritte-snackbar="true"]');
173
+ let offset = 0;
174
+ let found = false;
175
+ for (const node of snackbars) {
176
+ if (found) {
177
+ offset += node.offsetHeight;
178
+ }
179
+ if (node === snackbar) {
180
+ found = true;
181
+ }
182
+ }
183
+ const value = `${offset + VERTICAL_PADDING_BETWEEN_SNACKBAR * position + BASE_VERTICAL_PADDING}px`;
184
+ if (align === 'top') {
185
+ snackbar.style.top = value;
186
+ snackbar.style.removeProperty('bottom');
187
+ return;
188
+ }
189
+ snackbar.style.bottom = value;
190
+ snackbar.style.removeProperty('top');
191
+ }, [position, align, container]);
192
+ useLayoutEffect(() => {
193
+ const snackbar = snackbarRef.current;
194
+ if (!snackbar || stretched === stretchedRef.current) {
195
+ return void 0;
196
+ }
197
+ const width = snackbar.getBoundingClientRect().width;
198
+ if (Math.abs(width - prevWidth.current) < 1) {
199
+ return void 0;
200
+ }
201
+ // width: auto не анимируется, поэтому
202
+ // зафиксировали ширину → анимировали → снял инлайн свойство
203
+ snackbar.style.width = `${prevWidth.current}px`;
204
+ void snackbar.offsetWidth; // force layout
205
+ snackbar.style.width = `${width}px`;
206
+ const onEnd = (event) => {
207
+ if (event.propertyName !== 'width') {
208
+ return;
209
+ }
210
+ snackbar.style.removeProperty('width');
211
+ snackbar.removeEventListener('transitionend', onEnd);
212
+ };
213
+ snackbar.addEventListener('transitionend', onEnd);
214
+ stretchedRef.current = stretched;
215
+ prevWidth.current = width;
216
+ return () => {
217
+ snackbar.removeEventListener('transitionend', onEnd);
218
+ snackbar.style.removeProperty('width');
219
+ };
220
+ }, [stretched]);
221
+ const showDivider = showClose || Boolean(actionLabel);
222
+ const classNames = transition === SnackbarTransitionName.Show
223
+ ? OPEN_CLASS_NAMES[transition][align]
224
+ : OTHER_CLASS_NAMES[transition];
225
+ return (jsx(CSSTransition, { appear: true, classNames: classNames, in: visible, nodeRef: snackbarRef, onEnter: () => {
226
+ onShown();
227
+ }, onEntered: () => {
228
+ if (actionLabel) {
229
+ snackbarRef.current?.focus();
230
+ }
231
+ }, onExited: removeImmediately, timeout: timeout, children: jsx(Layer, { layer: "snackbar", children: jsx("div", { ...props, ...ariaAttributes, className: classnames(styles.snackbar, {
232
+ [styles.snackbarStretched]: stretched,
186
233
  [styles[`snackbar_align-${align}`]]: align,
187
234
  [styles.snackbarInBody]: !containerId,
188
- [styles.snackbarLayoutVertical]: layout === SnackbarLayout.Vertical,
189
- [styles.snackbarLayoutHorizontal]: layout === SnackbarLayout.Horizontal,
190
235
  }), ref: snackbarRefMultiplexer, onFocus: (event) => {
191
236
  if (event.target !== snackbarRef.current && !hasTouchSupportRef.current) {
192
237
  setHasFocus(true);
193
238
  }
194
- }, onBlur: () => !hasTouchSupportRef.current && setHasFocus(false), onMouseEnter: () => setHasHover(true), onMouseLeave: () => setHasHover(false), children: jsxs("div", { className: styles.snackbarContent, children: [!!addon && (jsx("div", { className: styles.snackbarAddon, "data-qa": "snackbar-addon", children: addon })), !!autohideTime && showTimer && (jsx("div", { className: styles.snackbarAddon, "data-qa": "snackbar-timer", children: jsx(Timer, { timeout: autohideTime, pause: hasFocus || hasHover, callback: autohideFunc }) })), jsxs("div", { className: styles.snackbarTextAndAction, ref: resizableContentRef, children: [jsx("div", { className: styles.snackbarText, ref: textRef, id: "dialog-description", children: children }), !!actionLabel && (jsx(Link, { "data-qa": "snackbar-user-action", "aria-label": actionLabel, Element: "button", type: "button", onClick: actionFunc, typography: "subtitle-1-semibold", style: "contrast", children: actionLabel }))] }), showClose && (jsx("div", { className: styles.snackbarClose, children: jsx(CrossOutlinedSize24, { padding: 8, borderRadius: "halfHeight", initialColor: "constant-secondary", "data-qa": "snackbar-close-action", tabIndex: actionLabel ? 0 : -1, "aria-label": actionLabel && typeof ariaLabelClose === 'string' ? ariaLabelClose : undefined, onClick: closeFunc }) }))] }) }) }) }));
239
+ }, onBlur: () => !hasTouchSupportRef.current && setHasFocus(false), onMouseEnter: () => setHasHover(true), onMouseLeave: () => setHasHover(false), "data-magritte-snackbar": true, children: jsxs("div", { className: styles.snackbarContent, children: [!!addon && (jsx("div", { className: styles.snackbarAddon, "data-qa": "snackbar-addon", children: addon })), !!autohideTime && showTimer && (jsx("div", { className: styles.snackbarAddon, "data-qa": "snackbar-timer", children: jsx(Timer, { timeout: autohideTime, pause: hasFocus || hasHover, callback: autohideFunc }) })), jsx("div", { className: styles.snackbarTextWrapper, children: jsx("div", { className: styles.snackbarText, id: "dialog-description", children: children }) }), showDivider && (jsx("div", { className: styles.divider, children: jsx(Divider, { mode: "vertical" }) })), !!actionLabel && (jsx("div", { className: styles.action, children: jsx(Link, { "data-qa": "snackbar-user-action", "aria-label": actionLabel, Element: "button", type: "button", onClick: actionFunc, typography: "subtitle-1-semibold", style: "contrast", children: actionLabel }) })), showClose && (jsx("div", { className: styles.snackbarClose, children: jsx(CrossOutlinedSize24, { padding: 8, borderRadius: "halfHeight", initialColor: "constant-secondary", "data-qa": "snackbar-close-action", tabIndex: actionLabel ? 0 : -1, "aria-label": actionLabel && typeof ariaLabelClose === 'string' ? ariaLabelClose : undefined, onClick: closeFunc }) }))] }) }) }) }));
195
240
  };
196
241
 
197
242
  export { SnackbarRenderer };
@@ -1 +1 @@
1
- {"version":3,"file":"SnackbarRenderer.js","sources":["../src/SnackbarRenderer.tsx"],"sourcesContent":["import { FC, useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport classnames from 'classnames';\n\nimport { useDebounce } from '@hh.ru/magritte-common-func-utils';\nimport { useEscapeToClose } from '@hh.ru/magritte-common-keyboard';\nimport { useResize } from '@hh.ru/magritte-common-resize';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { SwipeEventHandler, SwipeThreshold, useSwipeHandlers } from '@hh.ru/magritte-common-use-swipe';\nimport { CrossOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\nimport { Layer } from '@hh.ru/magritte-ui-layer';\nimport { Link } from '@hh.ru/magritte-ui-link';\nimport { SnackbarLayout, SnackbarRendererProps, SnackbarTransitionName } from '@hh.ru/magritte-ui-snackbar/types';\nimport { useAriaSnackbar } from '@hh.ru/magritte-ui-snackbar/useAriaSnackbar';\nimport { Timer, useTimer } from '@hh.ru/magritte-ui-timer';\n\nimport styles from './snackbar.less';\n\nconst CLASS_NAMES = {\n [SnackbarTransitionName.Show]: {\n appear: styles.appear,\n appearActive: styles['appear-active'],\n appearDone: styles['appear-done'],\n },\n [SnackbarTransitionName.Hide]: {\n exit: styles.exit,\n exitActive: styles['exit-active'],\n exitDone: styles['exit-done'],\n },\n [SnackbarTransitionName.Autohide]: {\n exit: styles.exit,\n exitActive: styles['exit-active_autohide'],\n exitDone: styles['exit-done'],\n },\n [SnackbarTransitionName.Replace]: {\n appear: styles.appear,\n appearDone: styles['appear-done'],\n },\n [SnackbarTransitionName.RemoveImmediately]: {},\n};\n\nconst DEFAULT_AUTOHIDE_TIME_MS = 6000;\n\nexport const SnackbarRenderer: FC<SnackbarRendererProps> = ({\n actionLabel,\n addon,\n align = 'bottom',\n animateOut,\n autohideTime = DEFAULT_AUTOHIDE_TIME_MS,\n children,\n containerId,\n isShown,\n onAction,\n onClose,\n onShown,\n showClose,\n showTimer,\n timeout,\n transition,\n 'aria-label': ariaLabel,\n 'aria-label-close': ariaLabelClose,\n role = 'status',\n ...props\n}) => {\n const actionFunc = useCallback(() => onAction?.(), [onAction]);\n const [hasFocus, setHasFocus] = useState(false);\n const [hasHover, setHasHover] = useState(false);\n const hasTouchSupportRef = useRef(false);\n const [layout, setLayout] = useState<SnackbarLayout>(SnackbarLayout.Horizontal);\n const autohideFunc = useCallback(() => animateOut(SnackbarTransitionName.Autohide), [animateOut]);\n const closeFunc = useCallback(() => animateOut(SnackbarTransitionName.Hide), [animateOut]);\n const previousMetrics = useRef<DOMRect | null>(null);\n const ariaAttributes = useAriaSnackbar({ role, hasAction: !!actionLabel, 'aria-label': ariaLabel });\n const textRef = useRef<HTMLDivElement>(null);\n const resizableContentRef = useRef<HTMLDivElement>(null);\n const visible = transition === SnackbarTransitionName.Show || transition === SnackbarTransitionName.Replace;\n const maxDistanceSqRef = useRef({ nearestSide: Number.POSITIVE_INFINITY, farSide: Number.POSITIVE_INFINITY });\n const swipeThresholdXRef = useRef<SwipeThreshold | null>(null);\n const swipeThresholdYRef = useRef<SwipeThreshold | null>(null);\n\n const removeImmediately = useCallback(() => {\n animateOut(SnackbarTransitionName.RemoveImmediately);\n onClose?.();\n }, [animateOut, onClose]);\n\n const snackbarRef = useRef<HTMLDivElement>(null);\n const bindEscapeToClose = useEscapeToClose(closeFunc);\n const snackbarRefMultiplexer = useMultipleRefs(snackbarRef, bindEscapeToClose);\n\n const calculateLayout = useCallback(() => {\n if (textRef.current && resizableContentRef.current) {\n const metrics = resizableContentRef.current?.getBoundingClientRect();\n const style = window.getComputedStyle(textRef.current);\n const isVerticalLayout =\n textRef.current.getBoundingClientRect().height - parseInt(style.lineHeight, 10) > 1;\n\n if (previousMetrics.current !== null) {\n const increaseScreenSize = metrics.width > previousMetrics.current.width;\n\n setLayout((layout) => {\n /* Уменьшаем размер экрана и если нужно переключиться в вертикальный лейаут */\n if (!increaseScreenSize && isVerticalLayout && layout === SnackbarLayout.Horizontal) {\n return SnackbarLayout.Vertical;\n }\n\n /* Увеличиваем размер экрана и если нужно переключиться в вертикальный лейаут */\n if (increaseScreenSize && isVerticalLayout && layout === SnackbarLayout.Horizontal) {\n return SnackbarLayout.Vertical;\n }\n\n /* Кейсы когда уменьшаем или увеличиваем размер экрана и нужно переключиться\n * с вертикального на горизонтальный лейаут скипаем, потому как доступного места для текста\n * меньше и может оказаться что текст будет в 2 строки и надо\n * снова переключаться на вертикальный лейаут. */\n return layout;\n });\n } else {\n setLayout(isVerticalLayout ? SnackbarLayout.Vertical : SnackbarLayout.Horizontal);\n }\n previousMetrics.current = resizableContentRef.current?.getBoundingClientRect();\n }\n }, []);\n\n useLayoutEffect(calculateLayout, [calculateLayout]);\n\n useResize(useDebounce(calculateLayout, 64));\n\n useTimer(\n !!autohideTime && !showTimer ? autohideTime : -1,\n (callable) => {\n const timeoutId = setTimeout(callable, 50);\n return () => clearTimeout(timeoutId);\n },\n (remaining) => {\n remaining < 0 && autohideFunc();\n },\n hasFocus || hasHover\n );\n\n useEffect(() => void (!!actionLabel && snackbarRef.current?.focus?.()), [actionLabel]);\n\n useEffect(() => {\n if (snackbarRef.current !== null) {\n const maxDistanceX = snackbarRef.current.clientWidth * 0.66;\n const maxDistanceNearestY = snackbarRef.current.clientHeight * 0.5;\n const maxDistanceFarY = snackbarRef.current.clientHeight;\n maxDistanceSqRef.current.nearestSide = Math.pow(maxDistanceX, 2) + Math.pow(maxDistanceNearestY, 2);\n maxDistanceSqRef.current.farSide = Math.pow(maxDistanceX, 2) + Math.pow(maxDistanceFarY, 2);\n swipeThresholdXRef.current = { minDelta: -maxDistanceX, maxDelta: maxDistanceX };\n swipeThresholdYRef.current =\n align === 'top'\n ? { minDelta: -maxDistanceNearestY, maxDelta: maxDistanceFarY }\n : { minDelta: -maxDistanceFarY, maxDelta: maxDistanceNearestY };\n }\n // при смене layout может поменяться clientHeight\n }, [align, visible, layout]);\n\n const handleSwipeMove: SwipeEventHandler = useCallback(\n (event) => {\n if (snackbarRef.current !== null) {\n // насколько прозрачным нужно сделать снекбар с учетом расстояния от начальной позиции\n let maxDistanceSq = maxDistanceSqRef.current.nearestSide;\n\n // определяем был ли свайп в дальнюю сторону экрана по вертикали\n if ((align === 'top' && event.distanceY > 0) || (align === 'bottom' && event.distanceY < 0)) {\n maxDistanceSq = maxDistanceSqRef.current.farSide;\n }\n\n const fadeDistanceSq = Math.pow(event.distanceX, 2) + Math.pow(event.distanceY, 2);\n snackbarRef.current.style.opacity = `${1 - fadeDistanceSq / maxDistanceSq}`;\n snackbarRef.current.style.transform = `translate(${event.distanceX}px, ${event.distanceY}px)`;\n }\n },\n [align]\n );\n\n const handleSwipeEnd: SwipeEventHandler = useCallback(() => {\n if (snackbarRef.current !== null) {\n snackbarRef.current.style.opacity = `0`;\n }\n closeFunc();\n }, [closeFunc]);\n\n const handleSwipeCancel: SwipeEventHandler = useCallback(() => {\n if (snackbarRef.current !== null) {\n snackbarRef.current.style.opacity = `1`;\n snackbarRef.current.style.transform = ``;\n }\n }, []);\n\n const swipeHandlers = useSwipeHandlers({\n thresholdXRef: swipeThresholdXRef,\n thresholdYRef: swipeThresholdYRef,\n onSwipeMove: handleSwipeMove,\n onSwipeEnd: handleSwipeEnd,\n onSwipeCancel: handleSwipeCancel,\n });\n\n useEffect(() => {\n const snackbar = snackbarRef.current;\n if (!snackbar) {\n return void 0;\n }\n\n const handleTouchStart = (event: TouchEvent) => {\n event.stopPropagation();\n hasTouchSupportRef.current = true;\n setHasHover(true);\n swipeHandlers.onTouchStart(event);\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n swipeHandlers.onTouchMove(event);\n };\n\n const handleTouchEnd = (event: TouchEvent) => {\n setHasHover(false);\n swipeHandlers.onTouchEnd(event);\n };\n\n const handleTouchCancel = (event: TouchEvent) => {\n setHasHover(false);\n swipeHandlers.onTouchCancel(event);\n };\n\n snackbar.addEventListener('touchstart', handleTouchStart);\n snackbar.addEventListener('touchmove', handleTouchMove, { passive: false });\n snackbar.addEventListener('touchend', handleTouchEnd);\n snackbar.addEventListener('touchcancel', handleTouchCancel);\n\n return () => {\n snackbar.removeEventListener('touchstart', handleTouchStart);\n snackbar.removeEventListener('touchmove', handleTouchMove);\n snackbar.removeEventListener('touchend', handleTouchEnd);\n snackbar.removeEventListener('touchcancel', handleTouchCancel);\n };\n }, [swipeHandlers]);\n\n return (\n <CSSTransition\n appear\n classNames={CLASS_NAMES[transition]}\n in={visible}\n nodeRef={snackbarRef}\n onEntered={onShown}\n onExited={removeImmediately}\n timeout={timeout}\n >\n <Layer layer=\"snackbar\">\n <div\n {...props}\n {...ariaAttributes}\n className={classnames(styles.snackbar, {\n [styles[`snackbar_align-${align}`]]: align,\n [styles.snackbarInBody]: !containerId,\n [styles.snackbarLayoutVertical]: layout === SnackbarLayout.Vertical,\n [styles.snackbarLayoutHorizontal]: layout === SnackbarLayout.Horizontal,\n })}\n ref={snackbarRefMultiplexer}\n onFocus={(event) => {\n if (event.target !== snackbarRef.current && !hasTouchSupportRef.current) {\n setHasFocus(true);\n }\n }}\n onBlur={() => !hasTouchSupportRef.current && setHasFocus(false)}\n onMouseEnter={() => setHasHover(true)}\n onMouseLeave={() => setHasHover(false)}\n >\n <div className={styles.snackbarContent}>\n {!!addon && (\n <div className={styles.snackbarAddon} data-qa=\"snackbar-addon\">\n {addon}\n </div>\n )}\n {!!autohideTime && showTimer && (\n <div className={styles.snackbarAddon} data-qa=\"snackbar-timer\">\n <Timer timeout={autohideTime} pause={hasFocus || hasHover} callback={autohideFunc} />\n </div>\n )}\n <div className={styles.snackbarTextAndAction} ref={resizableContentRef}>\n <div className={styles.snackbarText} ref={textRef} id=\"dialog-description\">\n {children}\n </div>\n {!!actionLabel && (\n <Link\n data-qa=\"snackbar-user-action\"\n aria-label={actionLabel}\n Element=\"button\"\n type=\"button\"\n onClick={actionFunc}\n typography=\"subtitle-1-semibold\"\n style=\"contrast\"\n >\n {actionLabel}\n </Link>\n )}\n </div>\n {showClose && (\n <div className={styles.snackbarClose}>\n <CrossOutlinedSize24\n padding={8}\n borderRadius=\"halfHeight\"\n initialColor=\"constant-secondary\"\n data-qa=\"snackbar-close-action\"\n tabIndex={actionLabel ? 0 : -1}\n aria-label={\n actionLabel && typeof ariaLabelClose === 'string' ? ariaLabelClose : undefined\n }\n onClick={closeFunc}\n />\n </div>\n )}\n </div>\n </div>\n </Layer>\n </CSSTransition>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,MAAM,WAAW,GAAG;AAChB,IAAA,CAAC,sBAAsB,CAAC,IAAI,GAAG;QAC3B,MAAM,EAAE,MAAM,CAAC,MAAM;AACrB,QAAA,YAAY,EAAE,MAAM,CAAC,eAAe,CAAC;AACrC,QAAA,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC;AACpC,KAAA;AACD,IAAA,CAAC,sBAAsB,CAAC,IAAI,GAAG;QAC3B,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,QAAA,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC;AACjC,QAAA,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC;AAChC,KAAA;AACD,IAAA,CAAC,sBAAsB,CAAC,QAAQ,GAAG;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;AACjB,QAAA,UAAU,EAAE,MAAM,CAAC,sBAAsB,CAAC;AAC1C,QAAA,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC;AAChC,KAAA;AACD,IAAA,CAAC,sBAAsB,CAAC,OAAO,GAAG;QAC9B,MAAM,EAAE,MAAM,CAAC,MAAM;AACrB,QAAA,UAAU,EAAE,MAAM,CAAC,aAAa,CAAC;AACpC,KAAA;AACD,IAAA,CAAC,sBAAsB,CAAC,iBAAiB,GAAG,EAAE;CACjD,CAAC;AAEF,MAAM,wBAAwB,GAAG,IAAI,CAAC;AAEzB,MAAA,gBAAgB,GAA8B,CAAC,EACxD,WAAW,EACX,KAAK,EACL,KAAK,GAAG,QAAQ,EAChB,UAAU,EACV,YAAY,GAAG,wBAAwB,EACvC,QAAQ,EACR,WAAW,EACX,OAAO,EACP,QAAQ,EACR,OAAO,EACP,OAAO,EACP,SAAS,EACT,SAAS,EACT,OAAO,EACP,UAAU,EACV,YAAY,EAAE,SAAS,EACvB,kBAAkB,EAAE,cAAc,EAClC,IAAI,GAAG,QAAQ,EACf,GAAG,KAAK,EACX,KAAI;AACD,IAAA,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,QAAQ,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC/D,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;AAChD,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;AACzC,IAAA,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAiB,cAAc,CAAC,UAAU,CAAC,CAAC;AAChF,IAAA,MAAM,YAAY,GAAG,WAAW,CAAC,MAAM,UAAU,CAAC,sBAAsB,CAAC,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;AAClG,IAAA,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,UAAU,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;AAC3F,IAAA,MAAM,eAAe,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;AACrD,IAAA,MAAM,cAAc,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC;AACpG,IAAA,MAAM,OAAO,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;AAC7C,IAAA,MAAM,mBAAmB,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;AACzD,IAAA,MAAM,OAAO,GAAG,UAAU,KAAK,sBAAsB,CAAC,IAAI,IAAI,UAAU,KAAK,sBAAsB,CAAC,OAAO,CAAC;AAC5G,IAAA,MAAM,gBAAgB,GAAG,MAAM,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,iBAAiB,EAAE,OAAO,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;AAC9G,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;AAC/D,IAAA,MAAM,kBAAkB,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;AAE/D,IAAA,MAAM,iBAAiB,GAAG,WAAW,CAAC,MAAK;AACvC,QAAA,UAAU,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC;AAChB,KAAC,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;AAE1B,IAAA,MAAM,WAAW,GAAG,MAAM,CAAiB,IAAI,CAAC,CAAC;AACjD,IAAA,MAAM,iBAAiB,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IACtD,MAAM,sBAAsB,GAAG,eAAe,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;AAE/E,IAAA,MAAM,eAAe,GAAG,WAAW,CAAC,MAAK;QACrC,IAAI,OAAO,CAAC,OAAO,IAAI,mBAAmB,CAAC,OAAO,EAAE;YAChD,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,EAAE,CAAC;YACrE,MAAM,KAAK,GAAG,MAAM,CAAC,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,gBAAgB,GAClB,OAAO,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AAExF,YAAA,IAAI,eAAe,CAAC,OAAO,KAAK,IAAI,EAAE;gBAClC,MAAM,kBAAkB,GAAG,OAAO,CAAC,KAAK,GAAG,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC;AAEzE,gBAAA,SAAS,CAAC,CAAC,MAAM,KAAI;;oBAEjB,IAAI,CAAC,kBAAkB,IAAI,gBAAgB,IAAI,MAAM,KAAK,cAAc,CAAC,UAAU,EAAE;wBACjF,OAAO,cAAc,CAAC,QAAQ,CAAC;qBAClC;;oBAGD,IAAI,kBAAkB,IAAI,gBAAgB,IAAI,MAAM,KAAK,cAAc,CAAC,UAAU,EAAE;wBAChF,OAAO,cAAc,CAAC,QAAQ,CAAC;qBAClC;AAED;;;AAGiD;AACjD,oBAAA,OAAO,MAAM,CAAC;AAClB,iBAAC,CAAC,CAAC;aACN;iBAAM;AACH,gBAAA,SAAS,CAAC,gBAAgB,GAAG,cAAc,CAAC,QAAQ,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;aACrF;YACD,eAAe,CAAC,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,qBAAqB,EAAE,CAAC;SAClF;KACJ,EAAE,EAAE,CAAC,CAAC;AAEP,IAAA,eAAe,CAAC,eAAe,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC;IAEpD,SAAS,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,CAAC;IAE5C,QAAQ,CACJ,CAAC,CAAC,YAAY,IAAI,CAAC,SAAS,GAAG,YAAY,GAAG,CAAC,CAAC,EAChD,CAAC,QAAQ,KAAI;QACT,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AAC3C,QAAA,OAAO,MAAM,YAAY,CAAC,SAAS,CAAC,CAAC;AACzC,KAAC,EACD,CAAC,SAAS,KAAI;AACV,QAAA,SAAS,GAAG,CAAC,IAAI,YAAY,EAAE,CAAC;AACpC,KAAC,EACD,QAAQ,IAAI,QAAQ,CACvB,CAAC;IAEF,SAAS,CAAC,MAAM,MAAM,CAAC,CAAC,WAAW,IAAI,WAAW,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAEvF,SAAS,CAAC,MAAK;AACX,QAAA,IAAI,WAAW,CAAC,OAAO,KAAK,IAAI,EAAE;YAC9B,MAAM,YAAY,GAAG,WAAW,CAAC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;YAC5D,MAAM,mBAAmB,GAAG,WAAW,CAAC,OAAO,CAAC,YAAY,GAAG,GAAG,CAAC;AACnE,YAAA,MAAM,eAAe,GAAG,WAAW,CAAC,OAAO,CAAC,YAAY,CAAC;YACzD,gBAAgB,CAAC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC;YACpG,gBAAgB,CAAC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;AAC5F,YAAA,kBAAkB,CAAC,OAAO,GAAG,EAAE,QAAQ,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;AACjF,YAAA,kBAAkB,CAAC,OAAO;AACtB,gBAAA,KAAK,KAAK,KAAK;sBACT,EAAE,QAAQ,EAAE,CAAC,mBAAmB,EAAE,QAAQ,EAAE,eAAe,EAAE;sBAC7D,EAAE,QAAQ,EAAE,CAAC,eAAe,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC;SAC3E;;KAEJ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAE7B,IAAA,MAAM,eAAe,GAAsB,WAAW,CAClD,CAAC,KAAK,KAAI;AACN,QAAA,IAAI,WAAW,CAAC,OAAO,KAAK,IAAI,EAAE;;AAE9B,YAAA,IAAI,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,WAAW,CAAC;;YAGzD,IAAI,CAAC,KAAK,KAAK,KAAK,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,MAAM,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,EAAE;AACzF,gBAAA,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC;aACpD;YAED,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AACnF,YAAA,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAG,EAAA,CAAC,GAAG,cAAc,GAAG,aAAa,EAAE,CAAC;AAC5E,YAAA,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,CAAA,UAAA,EAAa,KAAK,CAAC,SAAS,CAAO,IAAA,EAAA,KAAK,CAAC,SAAS,KAAK,CAAC;SACjG;AACL,KAAC,EACD,CAAC,KAAK,CAAC,CACV,CAAC;AAEF,IAAA,MAAM,cAAc,GAAsB,WAAW,CAAC,MAAK;AACvD,QAAA,IAAI,WAAW,CAAC,OAAO,KAAK,IAAI,EAAE;YAC9B,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;SAC3C;AACD,QAAA,SAAS,EAAE,CAAC;AAChB,KAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AAEhB,IAAA,MAAM,iBAAiB,GAAsB,WAAW,CAAC,MAAK;AAC1D,QAAA,IAAI,WAAW,CAAC,OAAO,KAAK,IAAI,EAAE;YAC9B,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC;YACxC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC;SAC5C;KACJ,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,gBAAgB,CAAC;AACnC,QAAA,aAAa,EAAE,kBAAkB;AACjC,QAAA,aAAa,EAAE,kBAAkB;AACjC,QAAA,WAAW,EAAE,eAAe;AAC5B,QAAA,UAAU,EAAE,cAAc;AAC1B,QAAA,aAAa,EAAE,iBAAiB;AACnC,KAAA,CAAC,CAAC;IAEH,SAAS,CAAC,MAAK;AACX,QAAA,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC;QACrC,IAAI,CAAC,QAAQ,EAAE;YACX,OAAO,KAAK,CAAC,CAAC;SACjB;AAED,QAAA,MAAM,gBAAgB,GAAG,CAAC,KAAiB,KAAI;YAC3C,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,YAAA,kBAAkB,CAAC,OAAO,GAAG,IAAI,CAAC;YAClC,WAAW,CAAC,IAAI,CAAC,CAAC;AAClB,YAAA,aAAa,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AACtC,SAAC,CAAC;AAEF,QAAA,MAAM,eAAe,GAAG,CAAC,KAAiB,KAAI;YAC1C,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,eAAe,EAAE,CAAC;AACxB,YAAA,aAAa,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACrC,SAAC,CAAC;AAEF,QAAA,MAAM,cAAc,GAAG,CAAC,KAAiB,KAAI;YACzC,WAAW,CAAC,KAAK,CAAC,CAAC;AACnB,YAAA,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AACpC,SAAC,CAAC;AAEF,QAAA,MAAM,iBAAiB,GAAG,CAAC,KAAiB,KAAI;YAC5C,WAAW,CAAC,KAAK,CAAC,CAAC;AACnB,YAAA,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AACvC,SAAC,CAAC;AAEF,QAAA,QAAQ,CAAC,gBAAgB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;AAC1D,QAAA,QAAQ,CAAC,gBAAgB,CAAC,WAAW,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAC5E,QAAA,QAAQ,CAAC,gBAAgB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AACtD,QAAA,QAAQ,CAAC,gBAAgB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;AAE5D,QAAA,OAAO,MAAK;AACR,YAAA,QAAQ,CAAC,mBAAmB,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;AAC7D,YAAA,QAAQ,CAAC,mBAAmB,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;AAC3D,YAAA,QAAQ,CAAC,mBAAmB,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;AACzD,YAAA,QAAQ,CAAC,mBAAmB,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;AACnE,SAAC,CAAC;AACN,KAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAEpB,QACIA,GAAC,CAAA,aAAa,EACV,EAAA,MAAM,QACN,UAAU,EAAE,WAAW,CAAC,UAAU,CAAC,EACnC,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,WAAW,EACpB,SAAS,EAAE,OAAO,EAClB,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,EAAE,OAAO,EAAA,QAAA,EAEhBA,IAAC,KAAK,EAAA,EAAC,KAAK,EAAC,UAAU,EAAA,QAAA,EACnBA,gBACQ,KAAK,EAAA,GACL,cAAc,EAClB,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,QAAQ,EAAE;oBACnC,CAAC,MAAM,CAAC,CAAkB,eAAA,EAAA,KAAK,EAAE,CAAC,GAAG,KAAK;AAC1C,oBAAA,CAAC,MAAM,CAAC,cAAc,GAAG,CAAC,WAAW;oBACrC,CAAC,MAAM,CAAC,sBAAsB,GAAG,MAAM,KAAK,cAAc,CAAC,QAAQ;oBACnE,CAAC,MAAM,CAAC,wBAAwB,GAAG,MAAM,KAAK,cAAc,CAAC,UAAU;iBAC1E,CAAC,EACF,GAAG,EAAE,sBAAsB,EAC3B,OAAO,EAAE,CAAC,KAAK,KAAI;AACf,oBAAA,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE;wBACrE,WAAW,CAAC,IAAI,CAAC,CAAC;qBACrB;iBACJ,EACD,MAAM,EAAE,MAAM,CAAC,kBAAkB,CAAC,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,EAC/D,YAAY,EAAE,MAAM,WAAW,CAAC,IAAI,CAAC,EACrC,YAAY,EAAE,MAAM,WAAW,CAAC,KAAK,CAAC,EAEtC,QAAA,EAAAC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAE,MAAM,CAAC,eAAe,EACjC,QAAA,EAAA,CAAA,CAAC,CAAC,KAAK,KACJD,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,aAAa,EAAU,SAAA,EAAA,gBAAgB,YACzD,KAAK,EAAA,CACJ,CACT,EACA,CAAC,CAAC,YAAY,IAAI,SAAS,KACxBA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,aAAa,EAAA,SAAA,EAAU,gBAAgB,EAAA,QAAA,EAC1DA,GAAC,CAAA,KAAK,EAAC,EAAA,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,IAAI,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAI,CAAA,EAAA,CACnF,CACT,EACDC,IAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,qBAAqB,EAAE,GAAG,EAAE,mBAAmB,EAAA,QAAA,EAAA,CAClED,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAC,oBAAoB,EACrE,QAAA,EAAA,QAAQ,EACP,CAAA,EACL,CAAC,CAAC,WAAW,KACVA,GAAC,CAAA,IAAI,EACO,EAAA,SAAA,EAAA,sBAAsB,EAClB,YAAA,EAAA,WAAW,EACvB,OAAO,EAAC,QAAQ,EAChB,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,UAAU,EACnB,UAAU,EAAC,qBAAqB,EAChC,KAAK,EAAC,UAAU,YAEf,WAAW,EAAA,CACT,CACV,CAAA,EAAA,CACC,EACL,SAAS,KACNA,GAAK,CAAA,KAAA,EAAA,EAAA,SAAS,EAAE,MAAM,CAAC,aAAa,YAChCA,GAAC,CAAA,mBAAmB,EAChB,EAAA,OAAO,EAAE,CAAC,EACV,YAAY,EAAC,YAAY,EACzB,YAAY,EAAC,oBAAoB,EACzB,SAAA,EAAA,uBAAuB,EAC/B,QAAQ,EAAE,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC,EAE1B,YAAA,EAAA,WAAW,IAAI,OAAO,cAAc,KAAK,QAAQ,GAAG,cAAc,GAAG,SAAS,EAElF,OAAO,EAAE,SAAS,EACpB,CAAA,EAAA,CACA,CACT,CAAA,EAAA,CACC,EACJ,CAAA,EAAA,CACF,EACI,CAAA,EAClB;AACN;;;;"}
1
+ {"version":3,"file":"SnackbarRenderer.js","sources":["../src/SnackbarRenderer.tsx"],"sourcesContent":["import { FC, useCallback, useEffect, useRef, useState, useLayoutEffect } from 'react';\nimport { CSSTransition } from 'react-transition-group';\nimport classnames from 'classnames';\n\nimport { useEscapeToClose } from '@hh.ru/magritte-common-keyboard';\nimport { useMultipleRefs } from '@hh.ru/magritte-common-use-multiple-refs';\nimport { SwipeEventHandler, SwipeThreshold, useSwipeHandlers } from '@hh.ru/magritte-common-use-swipe';\nimport { Divider } from '@hh.ru/magritte-ui-divider';\nimport { CrossOutlinedSize24 } from '@hh.ru/magritte-ui-icon/icon';\nimport { Layer } from '@hh.ru/magritte-ui-layer';\nimport { Link } from '@hh.ru/magritte-ui-link';\nimport { SnackbarRendererProps, SnackbarTransitionName } from '@hh.ru/magritte-ui-snackbar/types';\nimport { useAriaSnackbar } from '@hh.ru/magritte-ui-snackbar/useAriaSnackbar';\nimport { Timer, useTimer } from '@hh.ru/magritte-ui-timer';\n\nimport styles from './snackbar.less';\n\nconst OTHER_CLASS_NAMES = {\n [SnackbarTransitionName.Hide]: {\n exit: styles.exit,\n exitActive: styles['exit-active'],\n exitDone: styles['exit-done'],\n },\n [SnackbarTransitionName.Autohide]: {\n exit: styles.exit,\n exitActive: styles['exit-active_autohide'],\n exitDone: styles['exit-done'],\n },\n [SnackbarTransitionName.RemoveImmediately]: {},\n};\n\nconst OPEN_CLASS_NAMES = {\n [SnackbarTransitionName.Show]: {\n top: {\n appear: styles.appearTop,\n appearActive: styles['appear-active'],\n appearDone: styles['appear-done'],\n },\n bottom: {\n appear: styles.appearBottom,\n appearActive: styles['appear-active'],\n appearDone: styles['appear-done'],\n },\n },\n};\n\nconst DEFAULT_AUTOHIDE_TIME_MS = 6000;\nconst BASE_VERTICAL_PADDING = 16;\nconst VERTICAL_PADDING_BETWEEN_SNACKBAR = 8;\n\nexport const SnackbarRenderer: FC<SnackbarRendererProps> = ({\n actionLabel,\n addon,\n align = 'bottom',\n animateOut,\n autohideTime = DEFAULT_AUTOHIDE_TIME_MS,\n children,\n containerId,\n isShown,\n onAction,\n onClose,\n onShown,\n showClose,\n showTimer,\n timeout,\n transition,\n 'aria-label': ariaLabel,\n 'aria-label-close': ariaLabelClose,\n role = 'status',\n stretched = true,\n position,\n container,\n ...props\n}) => {\n const actionFunc = useCallback(() => onAction?.(), [onAction]);\n const [hasFocus, setHasFocus] = useState(false);\n const [hasHover, setHasHover] = useState(false);\n const hasTouchSupportRef = useRef(false);\n const prevWidth = useRef<number>(0);\n const stretchedRef = useRef(stretched);\n const autohideFunc = useCallback(() => animateOut(SnackbarTransitionName.Autohide), [animateOut]);\n const closeFunc = useCallback(() => animateOut(SnackbarTransitionName.Hide), [animateOut]);\n const ariaAttributes = useAriaSnackbar({ role, hasAction: !!actionLabel, 'aria-label': ariaLabel });\n const visible = transition === SnackbarTransitionName.Show;\n const maxDistanceSqRef = useRef({ nearestSide: Number.POSITIVE_INFINITY, farSide: Number.POSITIVE_INFINITY });\n const swipeThresholdXRef = useRef<SwipeThreshold | null>(null);\n const swipeThresholdYRef = useRef<SwipeThreshold | null>(null);\n\n const removeImmediately = useCallback(() => {\n animateOut(SnackbarTransitionName.RemoveImmediately);\n onClose?.();\n }, [animateOut, onClose]);\n\n const snackbarRef = useRef<HTMLDivElement>(null);\n const bindEscapeToClose = useEscapeToClose(closeFunc);\n const snackbarRefMultiplexer = useMultipleRefs(snackbarRef, bindEscapeToClose);\n\n useTimer(\n !!autohideTime && !showTimer ? autohideTime : -1,\n (callable) => {\n const timeoutId = setTimeout(callable, 50);\n return () => clearTimeout(timeoutId);\n },\n (remaining) => {\n remaining < 0 && autohideFunc();\n },\n hasFocus || hasHover\n );\n\n useEffect(() => {\n if (snackbarRef.current !== null) {\n const maxDistanceX = snackbarRef.current.clientWidth * 0.66;\n const maxDistanceNearestY = snackbarRef.current.clientHeight * 0.5;\n const maxDistanceFarY = snackbarRef.current.clientHeight;\n maxDistanceSqRef.current.nearestSide = Math.pow(maxDistanceX, 2) + Math.pow(maxDistanceNearestY, 2);\n maxDistanceSqRef.current.farSide = Math.pow(maxDistanceX, 2) + Math.pow(maxDistanceFarY, 2);\n swipeThresholdXRef.current = { minDelta: -maxDistanceX, maxDelta: maxDistanceX };\n swipeThresholdYRef.current =\n align === 'top'\n ? { minDelta: -maxDistanceNearestY, maxDelta: maxDistanceFarY }\n : { minDelta: -maxDistanceFarY, maxDelta: maxDistanceNearestY };\n }\n }, [align, visible]);\n\n const handleSwipeMove: SwipeEventHandler = useCallback(\n (event) => {\n if (snackbarRef.current !== null) {\n // насколько прозрачным нужно сделать снекбар с учетом расстояния от начальной позиции\n let maxDistanceSq = maxDistanceSqRef.current.nearestSide;\n\n // определяем был ли свайп в дальнюю сторону экрана по вертикали\n if ((align === 'top' && event.distanceY > 0) || (align === 'bottom' && event.distanceY < 0)) {\n maxDistanceSq = maxDistanceSqRef.current.farSide;\n }\n\n const fadeDistanceSq = Math.pow(event.distanceX, 2) + Math.pow(event.distanceY, 2);\n snackbarRef.current.style.opacity = `${1 - fadeDistanceSq / maxDistanceSq}`;\n snackbarRef.current.style.transform = `translate(${event.distanceX}px, ${event.distanceY}px)`;\n }\n },\n [align]\n );\n\n const handleSwipeEnd: SwipeEventHandler = useCallback(() => {\n if (snackbarRef.current !== null) {\n snackbarRef.current.style.opacity = `0`;\n }\n closeFunc();\n }, [closeFunc]);\n\n const handleSwipeCancel: SwipeEventHandler = useCallback(() => {\n if (snackbarRef.current !== null) {\n snackbarRef.current.style.removeProperty('opacity');\n snackbarRef.current.style.removeProperty('transform');\n }\n }, []);\n\n const swipeHandlers = useSwipeHandlers({\n thresholdXRef: swipeThresholdXRef,\n thresholdYRef: swipeThresholdYRef,\n onSwipeMove: handleSwipeMove,\n onSwipeEnd: handleSwipeEnd,\n onSwipeCancel: handleSwipeCancel,\n });\n\n useEffect(() => {\n const snackbar = snackbarRef.current;\n if (!snackbar) {\n return void 0;\n }\n\n const handleTouchStart = (event: TouchEvent) => {\n event.stopPropagation();\n hasTouchSupportRef.current = true;\n setHasHover(true);\n swipeHandlers.onTouchStart(event);\n };\n\n const handleTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n swipeHandlers.onTouchMove(event);\n };\n\n const handleTouchEnd = (event: TouchEvent) => {\n setHasHover(false);\n swipeHandlers.onTouchEnd(event);\n };\n\n const handleTouchCancel = (event: TouchEvent) => {\n setHasHover(false);\n swipeHandlers.onTouchCancel(event);\n };\n\n snackbar.addEventListener('touchstart', handleTouchStart);\n snackbar.addEventListener('touchmove', handleTouchMove, { passive: false });\n snackbar.addEventListener('touchend', handleTouchEnd);\n snackbar.addEventListener('touchcancel', handleTouchCancel);\n\n return () => {\n snackbar.removeEventListener('touchstart', handleTouchStart);\n snackbar.removeEventListener('touchmove', handleTouchMove);\n snackbar.removeEventListener('touchend', handleTouchEnd);\n snackbar.removeEventListener('touchcancel', handleTouchCancel);\n };\n }, [swipeHandlers]);\n\n useEffect(() => {\n const snackbar = snackbarRef.current;\n if (!snackbar) {\n return;\n }\n snackbar.style.setProperty('--snackbar-offset', `${snackbarRef.current.offsetHeight}px`);\n prevWidth.current = snackbar.getBoundingClientRect().width;\n }, []);\n\n useEffect(() => {\n const snackbar = snackbarRef.current;\n if (!snackbar) {\n return;\n }\n // снекбары могут быть разные по высоте\n // для расчета текущей позиции\n // высоту каждого предыдущего надо учесть\n const snackbars = container.querySelectorAll<HTMLElement>('[data-magritte-snackbar=\"true\"]');\n let offset = 0;\n let found = false;\n for (const node of snackbars) {\n if (found) {\n offset += node.offsetHeight;\n }\n if (node === snackbar) {\n found = true;\n }\n }\n const value = `${offset + VERTICAL_PADDING_BETWEEN_SNACKBAR * position + BASE_VERTICAL_PADDING}px`;\n if (align === 'top') {\n snackbar.style.top = value;\n snackbar.style.removeProperty('bottom');\n return;\n }\n snackbar.style.bottom = value;\n snackbar.style.removeProperty('top');\n }, [position, align, container]);\n\n useLayoutEffect(() => {\n const snackbar = snackbarRef.current;\n if (!snackbar || stretched === stretchedRef.current) {\n return void 0;\n }\n const width = snackbar.getBoundingClientRect().width;\n if (Math.abs(width - prevWidth.current) < 1) {\n return void 0;\n }\n // width: auto не анимируется, поэтому\n // зафиксировали ширину → анимировали → снял инлайн свойство\n snackbar.style.width = `${prevWidth.current}px`;\n void snackbar.offsetWidth; // force layout\n snackbar.style.width = `${width}px`;\n const onEnd = (event: TransitionEvent) => {\n if (event.propertyName !== 'width') {\n return;\n }\n snackbar.style.removeProperty('width');\n snackbar.removeEventListener('transitionend', onEnd);\n };\n snackbar.addEventListener('transitionend', onEnd);\n stretchedRef.current = stretched;\n prevWidth.current = width;\n\n return () => {\n snackbar.removeEventListener('transitionend', onEnd);\n snackbar.style.removeProperty('width');\n };\n }, [stretched]);\n\n const showDivider = showClose || Boolean(actionLabel);\n const classNames =\n transition === SnackbarTransitionName.Show\n ? OPEN_CLASS_NAMES[transition][align]\n : OTHER_CLASS_NAMES[transition];\n\n return (\n <CSSTransition\n appear\n classNames={classNames}\n in={visible}\n nodeRef={snackbarRef}\n onEnter={() => {\n onShown();\n }}\n onEntered={() => {\n if (actionLabel) {\n snackbarRef.current?.focus();\n }\n }}\n onExited={removeImmediately}\n timeout={timeout}\n >\n <Layer layer=\"snackbar\">\n <div\n {...props}\n {...ariaAttributes}\n className={classnames(styles.snackbar, {\n [styles.snackbarStretched]: stretched,\n [styles[`snackbar_align-${align}`]]: align,\n [styles.snackbarInBody]: !containerId,\n })}\n ref={snackbarRefMultiplexer}\n onFocus={(event) => {\n if (event.target !== snackbarRef.current && !hasTouchSupportRef.current) {\n setHasFocus(true);\n }\n }}\n onBlur={() => !hasTouchSupportRef.current && setHasFocus(false)}\n onMouseEnter={() => setHasHover(true)}\n onMouseLeave={() => setHasHover(false)}\n data-magritte-snackbar={true}\n >\n <div className={styles.snackbarContent}>\n {!!addon && (\n <div className={styles.snackbarAddon} data-qa=\"snackbar-addon\">\n {addon}\n </div>\n )}\n {!!autohideTime && showTimer && (\n <div className={styles.snackbarAddon} data-qa=\"snackbar-timer\">\n <Timer timeout={autohideTime} pause={hasFocus || hasHover} callback={autohideFunc} />\n </div>\n )}\n <div className={styles.snackbarTextWrapper}>\n <div className={styles.snackbarText} id=\"dialog-description\">\n {children}\n </div>\n </div>\n {showDivider && (\n <div className={styles.divider}>\n <Divider mode=\"vertical\" />\n </div>\n )}\n {!!actionLabel && (\n <div className={styles.action}>\n <Link\n data-qa=\"snackbar-user-action\"\n aria-label={actionLabel}\n Element=\"button\"\n type=\"button\"\n onClick={actionFunc}\n typography=\"subtitle-1-semibold\"\n style=\"contrast\"\n >\n {actionLabel}\n </Link>\n </div>\n )}\n {showClose && (\n <div className={styles.snackbarClose}>\n <CrossOutlinedSize24\n padding={8}\n borderRadius=\"halfHeight\"\n initialColor=\"constant-secondary\"\n data-qa=\"snackbar-close-action\"\n tabIndex={actionLabel ? 0 : -1}\n aria-label={\n actionLabel && typeof ariaLabelClose === 'string' ? ariaLabelClose : undefined\n }\n onClick={closeFunc}\n />\n </div>\n )}\n </div>\n </div>\n </Layer>\n </CSSTransition>\n );\n};\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
package/index.css CHANGED
@@ -1,11 +1,11 @@
1
1
  :root{
2
2
  --magritte-color-component-snackbar-background-content-v23-1-0:#000000;
3
3
  --magritte-color-component-snackbar-stroke-content-v23-1-0:#ffffff00;
4
+ --magritte-color-component-snackbar-stroke-divider-v23-1-0:#303030;
4
5
  --magritte-color-component-snackbar-text-content-v23-1-0:#ffffff;
5
6
  --magritte-color-component-snackbar-text-action-v23-1-0:#78c0ff;
6
7
  --magritte-color-component-snackbar-text-state-action-hovered-v23-1-0:#8ac8ff;
7
8
  --magritte-color-component-snackbar-text-state-action-pressed-v23-1-0:#78c0ff;
8
- --magritte-color-component-snackbar-text-state-action-disabled-v23-1-0:#AABBCA;
9
9
  }
10
10
 
11
11
  :root{
@@ -17,145 +17,133 @@
17
17
  --magritte-typography-label-2-regular-text-indent-v23-1-0:0px;
18
18
  --magritte-typography-label-2-regular-text-transform-v23-1-0:none;
19
19
  --magritte-typography-label-2-regular-text-decoration-v23-1-0:none;
20
- --magritte-semantic-animation-ease-in-out-tiger-100-timing-function-v23-1-0:cubic-bezier(0.25, 0.1, 0.25, 1);
21
- --magritte-semantic-animation-ease-in-out-tiger-100-duration-v23-1-0:100ms;
22
- --magritte-semantic-animation-ease-in-out-tiger-300-timing-function-v23-1-0:cubic-bezier(0.25, 0.1, 0.25, 1);
23
- --magritte-semantic-animation-ease-in-out-tiger-300-duration-v23-1-0:300ms;
24
- --magritte-semantic-animation-ease-in-out-tiger-500-timing-function-v23-1-0:cubic-bezier(0.25, 0.1, 0.25, 1);
25
- --magritte-semantic-animation-ease-in-out-tiger-500-duration-v23-1-0:500ms;
26
- --magritte-static-border-radius-600-v23-1-0:24px;
20
+ --magritte-semantic-animation-time-m-duration-v23-1-0:400ms;
21
+ --magritte-semantic-animation-ease-base-timing-function-v23-1-0:cubic-bezier(0.4, 0.24, 0, 1);
22
+ --magritte-semantic-blur-floating-v23-1-0:48px;
23
+ --magritte-static-border-radius-400-v23-1-0:16px;
27
24
  --magritte-core-line-heights-600-v23-1-0:24;
28
25
  }
29
26
 
30
27
  .magritte-night-theme{
31
28
  --magritte-color-component-snackbar-background-content-v23-1-0:#2e2e2ef5;
32
29
  --magritte-color-component-snackbar-stroke-content-v23-1-0:#ffffff00;
30
+ --magritte-color-component-snackbar-stroke-divider-v23-1-0:#ffffff29;
33
31
  --magritte-color-component-snackbar-text-content-v23-1-0:#ffffff;
34
32
  --magritte-color-component-snackbar-text-action-v23-1-0:#78c0ff;
35
33
  --magritte-color-component-snackbar-text-state-action-hovered-v23-1-0:#8ac8ff;
36
34
  --magritte-color-component-snackbar-text-state-action-pressed-v23-1-0:#78c0ff;
37
- --magritte-color-component-snackbar-text-state-action-disabled-v23-1-0:#AABBCA;
38
35
  }
39
36
 
40
37
  .magritte-zp-day-theme{
41
38
  --magritte-color-component-snackbar-background-content-v23-1-0:#000000;
42
39
  --magritte-color-component-snackbar-stroke-content-v23-1-0:#ffffff00;
40
+ --magritte-color-component-snackbar-stroke-divider-v23-1-0:#303030;
43
41
  --magritte-color-component-snackbar-text-content-v23-1-0:#ffffff;
44
42
  --magritte-color-component-snackbar-text-action-v23-1-0:#78c0ff;
45
43
  --magritte-color-component-snackbar-text-state-action-hovered-v23-1-0:#8ac8ff;
46
44
  --magritte-color-component-snackbar-text-state-action-pressed-v23-1-0:#78c0ff;
47
- --magritte-color-component-snackbar-text-state-action-disabled-v23-1-0:#AABBCA;
48
45
  }
49
- .magritte-snackbar-container___SeRql_5-1-29{
46
+ .magritte-snackbar-container___SeRql_6-0-1{
50
47
  pointer-events:none;
51
48
  position:absolute;
52
49
  inset:0;
50
+ overflow:hidden;
53
51
  }
54
- .magritte-snackbar-animation-timeout___EQLvG_5-1-29,
55
- .magritte-snackbar___jgq4H_5-1-29{
52
+ .magritte-snackbar-animation-timeout___EQLvG_6-0-1,
53
+ .magritte-snackbar___jgq4H_6-0-1{
56
54
  outline:none;
57
- --show-animation-duration:var(--magritte-semantic-animation-ease-in-out-tiger-300-duration-v23-1-0);
58
- --hide-animation-duration:var(--magritte-semantic-animation-ease-in-out-tiger-100-duration-v23-1-0);
59
- --autohide-animation-duration:var(--magritte-semantic-animation-ease-in-out-tiger-500-duration-v23-1-0);
60
- --replace-animation-duration:var(--hide-animation-duration);
55
+ padding:16px 20px;
56
+ margin:0 auto;
57
+ border-radius:var(--magritte-static-border-radius-400-v23-1-0);
58
+ backdrop-filter:blur(var(--magritte-semantic-blur-floating-v23-1-0));
59
+ -webkit-backdrop-filter:blur(var(--magritte-semantic-blur-floating-v23-1-0));
60
+ box-sizing:border-box;
61
+ will-change:transform;
62
+ transition:top var(--stack-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0), bottom var(--stack-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0), width var(--resize-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0);
63
+ --show-animation-duration:var(--magritte-semantic-animation-time-m-duration-v23-1-0);
64
+ --hide-animation-duration:var(--magritte-semantic-animation-time-m-duration-v23-1-0);
65
+ --stack-animation-duration:var(--magritte-semantic-animation-time-m-duration-v23-1-0);
66
+ --resize-animation-duration:var(--magritte-semantic-animation-time-m-duration-v23-1-0);
67
+ --autohide-animation-duration:var(--magritte-semantic-animation-time-m-duration-v23-1-0);
61
68
  --removeImmediately-animation-duration:0;
62
- --magritte-color-component-action-icon-secondary-override:var(--magritte-color-component-snackbar-text-action-v23-1-0);
63
- --magritte-color-component-action-icon-secondary-hovered-override:var(--magritte-color-component-snackbar-text-state-action-hovered-v23-1-0);
64
- --magritte-color-component-action-icon-secondary-pressed-override:var(--magritte-color-component-snackbar-text-state-action-pressed-v23-1-0);
65
- --magritte-color-component-action-icon-secondary-disabled-override:var(--magritte-color-component-snackbar-text-state-action-disabled-v23-1-0);
66
69
  }
67
70
  @media (prefers-reduced-motion){
68
- .magritte-snackbar-animation-timeout___EQLvG_5-1-29,
69
- .magritte-snackbar___jgq4H_5-1-29{
71
+ .magritte-snackbar-animation-timeout___EQLvG_6-0-1,
72
+ .magritte-snackbar___jgq4H_6-0-1{
70
73
  --show-animation-duration:0;
71
74
  --hide-animation-duration:0;
75
+ --stack-animation-duration:0;
76
+ --resize-animation-duration:0;
72
77
  --autohide-animation-duration:0;
73
- --replace-animation-duration:0;
74
78
  --removeImmediately-animation-duration:0;
75
79
  }
76
80
  }
77
- .magritte-snackbar-animation-timeout___EQLvG_5-1-29{
81
+ @media (min-width: 700px){
82
+ body.magritte-old-layout .magritte-snackbar-animation-timeout___EQLvG_6-0-1,
83
+ body.magritte-old-layout .magritte-snackbar___jgq4H_6-0-1{
84
+ max-width:600px;
85
+ }
86
+ }
87
+ @media (min-width: 600px){
88
+ body:not(.magritte-old-layout) .magritte-snackbar-animation-timeout___EQLvG_6-0-1,
89
+ body:not(.magritte-old-layout) .magritte-snackbar___jgq4H_6-0-1{
90
+ max-width:600px;
91
+ }
92
+ }
93
+ .magritte-snackbar-animation-timeout___EQLvG_6-0-1{
78
94
  display:none;
79
95
  }
80
- .magritte-snackbar___jgq4H_5-1-29{
96
+ .magritte-snackbar___jgq4H_6-0-1{
81
97
  background:var(--magritte-color-component-snackbar-background-content-v23-1-0);
82
98
  color:var(--magritte-color-component-snackbar-text-content-v23-1-0);
83
99
  box-shadow:inset 0 0 0 1px var(--magritte-color-component-snackbar-stroke-content-v23-1-0);
84
100
  position:absolute;
85
101
  pointer-events:auto;
102
+ width:max-content;
86
103
  }
87
- .magritte-snackbar_align-top___WWWbk_5-1-29{
88
- inset:16px 16px auto;
104
+ .magritte-snackbar_stretched___xVhgJ_6-0-1{
105
+ width:auto;
89
106
  }
90
- @media (min-width: 1020px){
91
- body.magritte-old-layout .magritte-snackbar_align-top___WWWbk_5-1-29{
92
- inset:0 0 auto;
93
- }
94
- }
95
- @media (min-width: 1024px){
96
- body:not(.magritte-old-layout) .magritte-snackbar_align-top___WWWbk_5-1-29{
97
- inset:0 0 auto;
98
- }
99
- }
100
- .magritte-snackbar_align-bottom___tCBBP_5-1-29{
101
- inset:auto 16px 16px;
107
+ .magritte-snackbar_align-top___WWWbk_6-0-1{
108
+ inset:16px 8px auto;
102
109
  }
103
110
  @media (min-width: 1020px){
104
- body.magritte-old-layout .magritte-snackbar_align-bottom___tCBBP_5-1-29{
105
- inset:auto 0 0;
111
+ body.magritte-old-layout .magritte-snackbar_align-top___WWWbk_6-0-1{
112
+ inset:16px 16px auto 16px;
106
113
  }
107
114
  }
108
115
  @media (min-width: 1024px){
109
- body:not(.magritte-old-layout) .magritte-snackbar_align-bottom___tCBBP_5-1-29{
110
- inset:auto 0 0;
111
- }
112
- }
113
- .magritte-snackbar-in-body___Zer4o_5-1-29{
114
- position:fixed;
115
- }
116
- @media (min-width: 1020px){
117
- body.magritte-old-layout .magritte-snackbar-in-body___Zer4o_5-1-29{
118
- box-sizing:border-box;
119
- margin:auto;
120
- max-width:600px;
116
+ body:not(.magritte-old-layout) .magritte-snackbar_align-top___WWWbk_6-0-1{
117
+ inset:16px 16px auto 16px;
121
118
  }
122
119
  }
123
- @media (min-width: 1024px){
124
- body:not(.magritte-old-layout) .magritte-snackbar-in-body___Zer4o_5-1-29{
125
- box-sizing:border-box;
126
- margin:auto;
127
- max-width:600px;
128
- }
120
+ .magritte-snackbar_align-bottom___tCBBP_6-0-1{
121
+ inset:auto 8px 16px;
129
122
  }
130
123
  @media (min-width: 1020px){
131
- body.magritte-old-layout .magritte-snackbar-in-body___Zer4o_5-1-29.magritte-snackbar_align-top___WWWbk_5-1-29{
132
- inset:48px 16px auto 16px;
124
+ body.magritte-old-layout .magritte-snackbar_align-bottom___tCBBP_6-0-1{
125
+ inset:auto 16px 16px 16px;
133
126
  }
134
127
  }
135
128
  @media (min-width: 1024px){
136
- body:not(.magritte-old-layout) .magritte-snackbar-in-body___Zer4o_5-1-29.magritte-snackbar_align-top___WWWbk_5-1-29{
137
- inset:48px 16px auto 16px;
129
+ body:not(.magritte-old-layout) .magritte-snackbar_align-bottom___tCBBP_6-0-1{
130
+ inset:auto 16px 16px 16px;
138
131
  }
139
132
  }
140
- @media (min-width: 1020px){
141
- body.magritte-old-layout .magritte-snackbar-in-body___Zer4o_5-1-29.magritte-snackbar_align-bottom___tCBBP_5-1-29{
142
- inset:auto 16px 48px 16px;
143
- }
144
- }
145
- @media (min-width: 1024px){
146
- body:not(.magritte-old-layout) .magritte-snackbar-in-body___Zer4o_5-1-29.magritte-snackbar_align-bottom___tCBBP_5-1-29{
147
- inset:auto 16px 48px 16px;
148
- }
133
+ .magritte-snackbar-in-body___Zer4o_6-0-1{
134
+ position:fixed;
149
135
  }
150
- .magritte-snackbar-content___MlP5J_5-1-29{
136
+ .magritte-snackbar-content___MlP5J_6-0-1{
151
137
  display:flex;
138
+ align-items:center;
152
139
  }
153
- .magritte-snackbar-addon___-eJn7_5-1-29{
140
+ .magritte-snackbar-addon___-eJn7_6-0-1{
154
141
  margin-right:12px;
155
142
  width:24px;
156
143
  height:24px;
144
+ margin-left:-4px;
157
145
  }
158
- .magritte-snackbar-text___PCxnB_5-1-29{
146
+ .magritte-snackbar-text___PCxnB_6-0-1{
159
147
  font-family:var(--magritte-typography-label-2-regular-font-family-v23-1-0);
160
148
  font-weight:var(--magritte-typography-label-2-regular-font-weight-v23-1-0);
161
149
  line-height:var(--magritte-typography-label-2-regular-line-height-v23-1-0);
@@ -166,71 +154,62 @@
166
154
  text-decoration:var(--magritte-typography-label-2-regular-text-decoration-v23-1-0);
167
155
  margin-right:auto;
168
156
  }
169
- .magritte-snackbar-text-and-action___weegp_5-1-29{
157
+ .magritte-snackbar-text-wrapper___SH6YB_6-0-1{
170
158
  display:flex;
171
159
  width:100%;
172
160
  }
173
- .magritte-snackbar-layout-horizontal___WrBPj_5-1-29{
174
- padding:20px 24px;
175
- border-radius:calc((20px * 2 + calc(var(--magritte-core-line-heights-600-v23-1-0) * 1px)) / 2);
176
- }
177
- .magritte-snackbar-layout-horizontal___WrBPj_5-1-29 .magritte-snackbar-text___PCxnB_5-1-29{
178
- line-height:calc(var(--magritte-core-line-heights-600-v23-1-0) * 1px);
179
- }
180
- .magritte-snackbar-layout-horizontal___WrBPj_5-1-29 .magritte-snackbar-content___MlP5J_5-1-29{
181
- height:calc(var(--magritte-core-line-heights-600-v23-1-0) * 1px);
161
+ .magritte-action___Yjp2t_6-0-1{
162
+ display:flex;
182
163
  align-items:center;
164
+ margin-left:8px;
165
+ height:calc(var(--magritte-core-line-heights-600-v23-1-0) * 1px);
166
+ white-space:nowrap;
167
+ --magritte-ui-link-padding-override:12px;
168
+ --magritte-ui-link-text-color-override:var(--magritte-color-component-snackbar-text-action-v23-1-0);
169
+ --magritte-ui-link-text-color-hovered-override:var(--magritte-color-component-snackbar-text-state-action-hovered-v23-1-0);
170
+ --magritte-ui-link-text-color-pressed-override:var(--magritte-color-component-snackbar-text-state-action-pressed-v23-1-0);
183
171
  }
184
- .magritte-snackbar-layout-horizontal___WrBPj_5-1-29 .magritte-snackbar-text-and-action___weegp_5-1-29{
172
+ .magritte-snackbar-close___U8YT5_6-0-1{
173
+ height:calc(var(--magritte-core-line-heights-600-v23-1-0) * 1px);
174
+ display:flex;
185
175
  align-items:center;
186
- gap:8px;
187
- flex-direction:row;
188
- justify-content:space-between;
189
- --magritte-ui-link-padding-override:11px;
190
- }
191
- .magritte-snackbar-layout-horizontal___WrBPj_5-1-29 .magritte-snackbar-close___U8YT5_5-1-29{
192
- margin-left:4px;
193
176
  margin-right:-12px;
194
177
  }
195
- .magritte-snackbar-layout-vertical___aR52S_5-1-29{
196
- border-radius:var(--magritte-static-border-radius-600-v23-1-0);
197
- padding:24px;
178
+ .magritte-divider___GQ492_6-0-1{
179
+ align-self:stretch;
180
+ margin-top:-8px;
181
+ margin-bottom:-8px;
182
+ margin-left:16px;
183
+ margin-right:8px;
184
+ --magritte-ui-divider-color-override:var(--magritte-color-component-snackbar-stroke-divider-v23-1-0);
198
185
  }
199
- .magritte-snackbar-layout-vertical___aR52S_5-1-29 .magritte-snackbar-content___MlP5J_5-1-29{
200
- height:auto;
201
- align-items:flex-start;
186
+ .magritte-appearTop___UJQ6-_6-0-1{
187
+ transform:translateY(calc(var(--snackbar-offset, 60px) * -1 + 16px * -1));
202
188
  }
203
- .magritte-snackbar-layout-vertical___aR52S_5-1-29 .magritte-snackbar-text-and-action___weegp_5-1-29{
204
- gap:12px;
205
- flex-direction:column;
206
- align-items:flex-start;
207
- --magritte-ui-link-padding-override:3px;
189
+ .magritte-appearBottom___wDoOa_6-0-1{
190
+ transform:translateY(calc(var(--snackbar-offset, 60px) + 16px));
208
191
  }
209
- .magritte-snackbar-layout-vertical___aR52S_5-1-29 .magritte-snackbar-close___U8YT5_5-1-29{
210
- margin-top:-13px;
211
- margin-right:-13px;
192
+ .magritte-appear-active___Kl7by_6-0-1{
193
+ transform:translateY(0);
194
+ transition:opacity var(--hide-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0), transform var(--show-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0), top var(--stack-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0), bottom var(--stack-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0);
212
195
  }
213
- .magritte-appear___aGbJS_5-1-29{
214
- opacity:0;
215
- }
216
- .magritte-appear-active___Kl7by_5-1-29{
217
- opacity:1;
218
- transition:opacity var(--show-animation-duration) var(--magritte-semantic-animation-ease-in-out-tiger-300-timing-function-v23-1-0);
219
- }
220
- .magritte-appear-done___3g7bl_5-1-29{
221
- opacity:1;
196
+ .magritte-appear-done___3g7bl_6-0-1{
197
+ transform:translateY(0);
222
198
  }
223
- .magritte-exit___MsYCK_5-1-29{
199
+ .magritte-exit___MsYCK_6-0-1{
224
200
  opacity:1;
225
201
  }
226
- .magritte-exit-active___I4AYt_5-1-29{
202
+ .magritte-exit-active___I4AYt_6-0-1{
227
203
  opacity:0;
228
- transition:opacity var(--hide-animation-duration) var(--magritte-semantic-animation-ease-in-out-tiger-100-timing-function-v23-1-0);
204
+ transform:scale(0.75);
205
+ transition:opacity var(--hide-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0), transform var(--hide-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0), top var(--stack-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0), bottom var(--stack-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0);
229
206
  }
230
- .magritte-exit-active_autohide___jvdWc_5-1-29{
207
+ .magritte-exit-active_autohide___jvdWc_6-0-1{
231
208
  opacity:0;
232
- transition:opacity var(--autohide-animation-duration) var(--magritte-semantic-animation-ease-in-out-tiger-500-timing-function-v23-1-0);
209
+ transform:scale(0.75);
210
+ transition:opacity var(--hide-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0), transform var(--hide-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0), top var(--stack-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0), bottom var(--stack-animation-duration) var(--magritte-semantic-animation-ease-base-timing-function-v23-1-0);
233
211
  }
234
- .magritte-exit-done___DK8l2_5-1-29{
212
+ .magritte-exit-done___DK8l2_6-0-1{
235
213
  opacity:0;
214
+ transform:scale(0.75);
236
215
  }
package/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { Snackbar } from '@hh.ru/magritte-ui-snackbar/Snackbar';
2
2
  export { SnackbarContainer } from '@hh.ru/magritte-ui-snackbar/SnackbarContainer';
3
3
  export { SnackbarContextProvider } from '@hh.ru/magritte-ui-snackbar/SnackbarContextProvider';
4
- export type { SnackbarProps, SnackbarContainerProps } from '@hh.ru/magritte-ui-snackbar/types';
4
+ export type { SnackbarProps, SnackbarContainerProps, Align } from '@hh.ru/magritte-ui-snackbar/types';
5
5
  export { useAriaSnackbar } from '@hh.ru/magritte-ui-snackbar/useAriaSnackbar';
package/index.js CHANGED
@@ -7,16 +7,15 @@ import 'react';
7
7
  import './context.js';
8
8
  import './types.js';
9
9
  import 'react/jsx-runtime';
10
- import './snackbar-0C5Em6lA.js';
10
+ import './snackbar-BUXYCBno.js';
11
11
  import 'react-dom';
12
12
  import './SnackbarRenderer.js';
13
13
  import 'react-transition-group';
14
14
  import 'classnames';
15
- import '@hh.ru/magritte-common-func-utils';
16
15
  import '@hh.ru/magritte-common-keyboard';
17
- import '@hh.ru/magritte-common-resize';
18
16
  import '@hh.ru/magritte-common-use-multiple-refs';
19
17
  import '@hh.ru/magritte-common-use-swipe';
18
+ import '@hh.ru/magritte-ui-divider';
20
19
  import '@hh.ru/magritte-ui-icon/icon';
21
20
  import '@hh.ru/magritte-ui-layer';
22
21
  import '@hh.ru/magritte-ui-link';
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hh.ru/magritte-ui-snackbar",
3
- "version": "5.1.29",
3
+ "version": "6.0.1",
4
4
  "main": "index.js",
5
5
  "types": "index.d.ts",
6
6
  "sideEffects": [
@@ -26,9 +26,10 @@
26
26
  "@hh.ru/magritte-common-use-swipe": "3.1.6",
27
27
  "@hh.ru/magritte-design-tokens": "23.1.0",
28
28
  "@hh.ru/magritte-internal-layer-name": "3.0.2",
29
+ "@hh.ru/magritte-ui-divider": "3.0.3",
29
30
  "@hh.ru/magritte-ui-icon": "12.3.0",
30
31
  "@hh.ru/magritte-ui-layer": "3.0.2",
31
- "@hh.ru/magritte-ui-link": "6.0.7",
32
+ "@hh.ru/magritte-ui-link": "6.0.8",
32
33
  "@hh.ru/magritte-ui-timer": "1.2.58",
33
34
  "@hh.ru/magritte-ui-typography": "4.2.0"
34
35
  },
@@ -44,5 +45,5 @@
44
45
  "publishConfig": {
45
46
  "access": "public"
46
47
  },
47
- "gitHead": "8394869b0fcf1a65e854af99d8f614a67f0cea7d"
48
+ "gitHead": "7d23d2d4ae89834e27894b920fd6e2c59e8c3a4c"
48
49
  }
@@ -0,0 +1,5 @@
1
+ import './index.css';
2
+ var styles = {"snackbar-container":"magritte-snackbar-container___SeRql_6-0-1","snackbarContainer":"magritte-snackbar-container___SeRql_6-0-1","snackbar-animation-timeout":"magritte-snackbar-animation-timeout___EQLvG_6-0-1","snackbarAnimationTimeout":"magritte-snackbar-animation-timeout___EQLvG_6-0-1","snackbar":"magritte-snackbar___jgq4H_6-0-1","snackbar_stretched":"magritte-snackbar_stretched___xVhgJ_6-0-1","snackbarStretched":"magritte-snackbar_stretched___xVhgJ_6-0-1","snackbar_align-top":"magritte-snackbar_align-top___WWWbk_6-0-1","snackbarAlignTop":"magritte-snackbar_align-top___WWWbk_6-0-1","snackbar_align-bottom":"magritte-snackbar_align-bottom___tCBBP_6-0-1","snackbarAlignBottom":"magritte-snackbar_align-bottom___tCBBP_6-0-1","snackbar-in-body":"magritte-snackbar-in-body___Zer4o_6-0-1","snackbarInBody":"magritte-snackbar-in-body___Zer4o_6-0-1","snackbar-content":"magritte-snackbar-content___MlP5J_6-0-1","snackbarContent":"magritte-snackbar-content___MlP5J_6-0-1","snackbar-addon":"magritte-snackbar-addon___-eJn7_6-0-1","snackbarAddon":"magritte-snackbar-addon___-eJn7_6-0-1","snackbar-text":"magritte-snackbar-text___PCxnB_6-0-1","snackbarText":"magritte-snackbar-text___PCxnB_6-0-1","snackbar-text-wrapper":"magritte-snackbar-text-wrapper___SH6YB_6-0-1","snackbarTextWrapper":"magritte-snackbar-text-wrapper___SH6YB_6-0-1","action":"magritte-action___Yjp2t_6-0-1","snackbar-close":"magritte-snackbar-close___U8YT5_6-0-1","snackbarClose":"magritte-snackbar-close___U8YT5_6-0-1","divider":"magritte-divider___GQ492_6-0-1","appearTop":"magritte-appearTop___UJQ6-_6-0-1","appearBottom":"magritte-appearBottom___wDoOa_6-0-1","appear-active":"magritte-appear-active___Kl7by_6-0-1","appearActive":"magritte-appear-active___Kl7by_6-0-1","appear-done":"magritte-appear-done___3g7bl_6-0-1","appearDone":"magritte-appear-done___3g7bl_6-0-1","exit":"magritte-exit___MsYCK_6-0-1","exit-active":"magritte-exit-active___I4AYt_6-0-1","exitActive":"magritte-exit-active___I4AYt_6-0-1","exit-active_autohide":"magritte-exit-active_autohide___jvdWc_6-0-1","exitActiveAutohide":"magritte-exit-active_autohide___jvdWc_6-0-1","exit-done":"magritte-exit-done___DK8l2_6-0-1","exitDone":"magritte-exit-done___DK8l2_6-0-1"};
3
+
4
+ export { styles as s };
5
+ //# sourceMappingURL=snackbar-BUXYCBno.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snackbar-BUXYCBno.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
package/types.d.ts CHANGED
@@ -1,13 +1,9 @@
1
1
  import type { ReactNode, PropsWithChildren } from 'react';
2
- export declare enum SnackbarLayout {
3
- Horizontal = "horizontal",
4
- Vertical = "vertical"
5
- }
2
+ export type Align = 'top' | 'bottom';
6
3
  export declare enum SnackbarTransitionName {
7
4
  Show = "show",
8
5
  Hide = "hide",
9
6
  Autohide = "autohide",
10
- Replace = "replace",
11
7
  RemoveImmediately = "removeImmediately"
12
8
  }
13
9
  export interface AriaSnackbarProps {
@@ -32,7 +28,7 @@ interface BaseSnackbarProps extends AriaSnackbarProps {
32
28
  /**
33
29
  * Край экрана или контейнера, относительно которого снекбар позиционируется
34
30
  * */
35
- align?: 'top' | 'bottom';
31
+ align?: Align;
36
32
  /**
37
33
  * Время aвтоматического скрытия уведомления в мс(дефолт 6000). Если не нужно скрывать
38
34
  * по истечению времени, тогда нужно передать 0.
@@ -56,6 +52,10 @@ interface BaseSnackbarProps extends AriaSnackbarProps {
56
52
  * удаления компонента из дерева
57
53
  **/
58
54
  removeOnUnmount?: boolean;
55
+ /** Флаг включающий растягивание на всю ширину контейнера */
56
+ stretched?: boolean;
57
+ /** Кастомный data-qa для тестирования */
58
+ 'data-qa'?: string;
59
59
  }
60
60
  interface SnackbarPropsWithClose {
61
61
  /**
@@ -86,16 +86,23 @@ interface SnackbarPropsWithTimer {
86
86
  showTimer: true;
87
87
  }
88
88
  export type SnackbarProps = BaseSnackbarProps & (SnackbarPropsWithAddon | SnackbarPropsWithTimer) & (SnackbarPropsWithClose | SnackbarPropsWithoutClose);
89
- export type SnackbarState = SnackbarProps & {
90
- animateIn: VoidFunction;
89
+ export interface SnackbarInternalState {
91
90
  animateOut: (transition: SnackbarTransitionName.Hide | SnackbarTransitionName.Autohide | SnackbarTransitionName.RemoveImmediately) => void;
92
91
  isShown: () => boolean;
93
92
  onShown: VoidFunction;
94
93
  transition: SnackbarTransitionName;
95
- };
96
- export type SnackbarRendererProps = SnackbarState & {
94
+ position: number;
95
+ stretched?: boolean;
96
+ }
97
+ export interface SnackbarHelper {
98
+ animateIn: VoidFunction;
99
+ }
100
+ export interface SnackbarRenderHelper {
97
101
  timeout: number;
98
- };
102
+ container: HTMLElement;
103
+ }
104
+ export type SnackbarState = SnackbarProps & SnackbarInternalState & SnackbarHelper;
105
+ export type SnackbarRendererProps = SnackbarState & SnackbarRenderHelper;
99
106
  export interface SnackbarContainerProps extends PropsWithChildren {
100
107
  /**
101
108
  * Уникальный идентификатор контейнера
package/types.js CHANGED
@@ -1,17 +1,11 @@
1
1
  import './index.css';
2
- var SnackbarLayout;
3
- (function (SnackbarLayout) {
4
- SnackbarLayout["Horizontal"] = "horizontal";
5
- SnackbarLayout["Vertical"] = "vertical";
6
- })(SnackbarLayout || (SnackbarLayout = {}));
7
2
  var SnackbarTransitionName;
8
3
  (function (SnackbarTransitionName) {
9
4
  SnackbarTransitionName["Show"] = "show";
10
5
  SnackbarTransitionName["Hide"] = "hide";
11
6
  SnackbarTransitionName["Autohide"] = "autohide";
12
- SnackbarTransitionName["Replace"] = "replace";
13
7
  SnackbarTransitionName["RemoveImmediately"] = "removeImmediately";
14
8
  })(SnackbarTransitionName || (SnackbarTransitionName = {}));
15
9
 
16
- export { SnackbarLayout, SnackbarTransitionName };
10
+ export { SnackbarTransitionName };
17
11
  //# sourceMappingURL=types.js.map
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import type { ReactNode, PropsWithChildren } from 'react';\n\nexport enum SnackbarLayout {\n Horizontal = 'horizontal',\n Vertical = 'vertical',\n}\n\nexport enum SnackbarTransitionName {\n Show = 'show',\n Hide = 'hide',\n Autohide = 'autohide',\n Replace = 'replace',\n RemoveImmediately = 'removeImmediately',\n}\n\nexport interface AriaSnackbarProps {\n /**\n * Aтрибут role, логика выбора описана в разделе доступность\n **/\n role?: 'status' | 'alertdialog' | 'alert';\n /**\n * Aтрибут aria-label\n **/\n 'aria-label'?: string;\n}\n\ninterface BaseSnackbarProps extends AriaSnackbarProps {\n /**\n * Cодержимое уведомления (текст, без каких либо активных компонентов)\n **/\n children: ReactNode;\n /**\n * Текст действия, фокусирует юзера на уведомлении\n **/\n actionLabel?: string;\n /**\n * Край экрана или контейнера, относительно которого снекбар позиционируется\n * */\n align?: 'top' | 'bottom';\n /**\n * Время aвтоматического скрытия уведомления в мс(дефолт 6000). Если не нужно скрывать\n * по истечению времени, тогда нужно передать 0.\n **/\n autohideTime?: number;\n /**\n * Идентификатор контейнера, в котором отрисуется компонент\n **/\n containerId?: string;\n /**\n * Колбек действия, вызывается после нажатия на действие\n **/\n onAction?: VoidFunction;\n /**\n * Колбек закрытия компонента, вызывается после скрытия\n **/\n onClose?: VoidFunction;\n /**\n * Флаг, который отвечает за скрытие снекбара при размонтировании компонента. Если он установлен в false,\n * то снекбар скроется только после закрытия его пользователем или по истечении времени автоскрытия даже в случае\n * удаления компонента из дерева\n **/\n removeOnUnmount?: boolean;\n}\n\ninterface SnackbarPropsWithClose {\n /**\n * Булев флаг, который отвечает за показ кнопки закрытия\n **/\n showClose?: true;\n /**\n * Aria-label атрибут для кнопки закрытия, устанавливается в случае если показываем кнопку закрытия\n **/\n 'aria-label-close'?: string;\n}\n\ninterface SnackbarPropsWithoutClose {\n showClose?: false;\n 'aria-label-close'?: never;\n}\n\ninterface SnackbarPropsWithAddon {\n /**\n * Компонент, который отрисуется в контейнере с левой стороны children, размер 24*24px\n **/\n addon?: ReactNode;\n showTimer?: false;\n}\n\ninterface SnackbarPropsWithTimer {\n addon?: never;\n /**\n * Булев флаг, который отвечает за показ таймера закрытия компонента, вместо на месте addon\n **/\n showTimer: true;\n}\n\nexport type SnackbarProps = BaseSnackbarProps &\n (SnackbarPropsWithAddon | SnackbarPropsWithTimer) &\n (SnackbarPropsWithClose | SnackbarPropsWithoutClose);\n\nexport type SnackbarState = SnackbarProps & {\n animateIn: VoidFunction;\n animateOut: (\n transition:\n | SnackbarTransitionName.Hide\n | SnackbarTransitionName.Autohide\n | SnackbarTransitionName.RemoveImmediately\n ) => void;\n isShown: () => boolean;\n onShown: VoidFunction;\n transition: SnackbarTransitionName;\n};\n\nexport type SnackbarRendererProps = SnackbarState & { timeout: number };\n\nexport interface SnackbarContainerProps extends PropsWithChildren {\n /**\n * Уникальный идентификатор контейнера\n **/\n id: string;\n}\n"],"names":[],"mappings":"IAEY,eAGX;AAHD,CAAA,UAAY,cAAc,EAAA;AACtB,IAAA,cAAA,CAAA,YAAA,CAAA,GAAA,YAAyB,CAAA;AACzB,IAAA,cAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACzB,CAAC,EAHW,cAAc,KAAd,cAAc,GAGzB,EAAA,CAAA,CAAA,CAAA;IAEW,uBAMX;AAND,CAAA,UAAY,sBAAsB,EAAA;AAC9B,IAAA,sBAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,sBAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,sBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACrB,IAAA,sBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,sBAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC,CAAA;AAC3C,CAAC,EANW,sBAAsB,KAAtB,sBAAsB,GAMjC,EAAA,CAAA,CAAA;;;;"}
1
+ {"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import type { ReactNode, PropsWithChildren } from 'react';\n\nexport type Align = 'top' | 'bottom';\n\nexport enum SnackbarTransitionName {\n Show = 'show',\n Hide = 'hide',\n Autohide = 'autohide',\n RemoveImmediately = 'removeImmediately',\n}\n\nexport interface AriaSnackbarProps {\n /**\n * Aтрибут role, логика выбора описана в разделе доступность\n **/\n role?: 'status' | 'alertdialog' | 'alert';\n /**\n * Aтрибут aria-label\n **/\n 'aria-label'?: string;\n}\n\ninterface BaseSnackbarProps extends AriaSnackbarProps {\n /**\n * Cодержимое уведомления (текст, без каких либо активных компонентов)\n **/\n children: ReactNode;\n /**\n * Текст действия, фокусирует юзера на уведомлении\n **/\n actionLabel?: string;\n /**\n * Край экрана или контейнера, относительно которого снекбар позиционируется\n * */\n align?: Align;\n /**\n * Время aвтоматического скрытия уведомления в мс(дефолт 6000). Если не нужно скрывать\n * по истечению времени, тогда нужно передать 0.\n **/\n autohideTime?: number;\n /**\n * Идентификатор контейнера, в котором отрисуется компонент\n **/\n containerId?: string;\n /**\n * Колбек действия, вызывается после нажатия на действие\n **/\n onAction?: VoidFunction;\n /**\n * Колбек закрытия компонента, вызывается после скрытия\n **/\n onClose?: VoidFunction;\n /**\n * Флаг, который отвечает за скрытие снекбара при размонтировании компонента. Если он установлен в false,\n * то снекбар скроется только после закрытия его пользователем или по истечении времени автоскрытия даже в случае\n * удаления компонента из дерева\n **/\n removeOnUnmount?: boolean;\n /** Флаг включающий растягивание на всю ширину контейнера */\n stretched?: boolean;\n /** Кастомный data-qa для тестирования */\n 'data-qa'?: string;\n}\n\ninterface SnackbarPropsWithClose {\n /**\n * Булев флаг, который отвечает за показ кнопки закрытия\n **/\n showClose?: true;\n /**\n * Aria-label атрибут для кнопки закрытия, устанавливается в случае если показываем кнопку закрытия\n **/\n 'aria-label-close'?: string;\n}\n\ninterface SnackbarPropsWithoutClose {\n showClose?: false;\n 'aria-label-close'?: never;\n}\n\ninterface SnackbarPropsWithAddon {\n /**\n * Компонент, который отрисуется в контейнере с левой стороны children, размер 24*24px\n **/\n addon?: ReactNode;\n showTimer?: false;\n}\n\ninterface SnackbarPropsWithTimer {\n addon?: never;\n /**\n * Булев флаг, который отвечает за показ таймера закрытия компонента, вместо на месте addon\n **/\n showTimer: true;\n}\n\nexport type SnackbarProps = BaseSnackbarProps &\n (SnackbarPropsWithAddon | SnackbarPropsWithTimer) &\n (SnackbarPropsWithClose | SnackbarPropsWithoutClose);\n\nexport interface SnackbarInternalState {\n animateOut: (\n transition:\n | SnackbarTransitionName.Hide\n | SnackbarTransitionName.Autohide\n | SnackbarTransitionName.RemoveImmediately\n ) => void;\n isShown: () => boolean;\n onShown: VoidFunction;\n transition: SnackbarTransitionName;\n position: number;\n stretched?: boolean;\n}\n\nexport interface SnackbarHelper {\n animateIn: VoidFunction;\n}\n\nexport interface SnackbarRenderHelper {\n timeout: number;\n container: HTMLElement;\n}\n\nexport type SnackbarState = SnackbarProps & SnackbarInternalState & SnackbarHelper;\n\nexport type SnackbarRendererProps = SnackbarState & SnackbarRenderHelper;\n\nexport interface SnackbarContainerProps extends PropsWithChildren {\n /**\n * Уникальный идентификатор контейнера\n **/\n id: string;\n}\n"],"names":[],"mappings":"IAIY,uBAKX;AALD,CAAA,UAAY,sBAAsB,EAAA;AAC9B,IAAA,sBAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,sBAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,sBAAA,CAAA,UAAA,CAAA,GAAA,UAAqB,CAAA;AACrB,IAAA,sBAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC,CAAA;AAC3C,CAAC,EALW,sBAAsB,KAAtB,sBAAsB,GAKjC,EAAA,CAAA,CAAA;;;;"}
@@ -1,5 +0,0 @@
1
- import './index.css';
2
- var styles = {"snackbar-container":"magritte-snackbar-container___SeRql_5-1-29","snackbarContainer":"magritte-snackbar-container___SeRql_5-1-29","snackbar-animation-timeout":"magritte-snackbar-animation-timeout___EQLvG_5-1-29","snackbarAnimationTimeout":"magritte-snackbar-animation-timeout___EQLvG_5-1-29","snackbar":"magritte-snackbar___jgq4H_5-1-29","snackbar_align-top":"magritte-snackbar_align-top___WWWbk_5-1-29","snackbarAlignTop":"magritte-snackbar_align-top___WWWbk_5-1-29","snackbar_align-bottom":"magritte-snackbar_align-bottom___tCBBP_5-1-29","snackbarAlignBottom":"magritte-snackbar_align-bottom___tCBBP_5-1-29","snackbar-in-body":"magritte-snackbar-in-body___Zer4o_5-1-29","snackbarInBody":"magritte-snackbar-in-body___Zer4o_5-1-29","snackbar-content":"magritte-snackbar-content___MlP5J_5-1-29","snackbarContent":"magritte-snackbar-content___MlP5J_5-1-29","snackbar-addon":"magritte-snackbar-addon___-eJn7_5-1-29","snackbarAddon":"magritte-snackbar-addon___-eJn7_5-1-29","snackbar-text":"magritte-snackbar-text___PCxnB_5-1-29","snackbarText":"magritte-snackbar-text___PCxnB_5-1-29","snackbar-text-and-action":"magritte-snackbar-text-and-action___weegp_5-1-29","snackbarTextAndAction":"magritte-snackbar-text-and-action___weegp_5-1-29","snackbar-layout-horizontal":"magritte-snackbar-layout-horizontal___WrBPj_5-1-29","snackbarLayoutHorizontal":"magritte-snackbar-layout-horizontal___WrBPj_5-1-29","snackbar-close":"magritte-snackbar-close___U8YT5_5-1-29","snackbarClose":"magritte-snackbar-close___U8YT5_5-1-29","snackbar-layout-vertical":"magritte-snackbar-layout-vertical___aR52S_5-1-29","snackbarLayoutVertical":"magritte-snackbar-layout-vertical___aR52S_5-1-29","appear":"magritte-appear___aGbJS_5-1-29","appear-active":"magritte-appear-active___Kl7by_5-1-29","appearActive":"magritte-appear-active___Kl7by_5-1-29","appear-done":"magritte-appear-done___3g7bl_5-1-29","appearDone":"magritte-appear-done___3g7bl_5-1-29","exit":"magritte-exit___MsYCK_5-1-29","exit-active":"magritte-exit-active___I4AYt_5-1-29","exitActive":"magritte-exit-active___I4AYt_5-1-29","exit-active_autohide":"magritte-exit-active_autohide___jvdWc_5-1-29","exitActiveAutohide":"magritte-exit-active_autohide___jvdWc_5-1-29","exit-done":"magritte-exit-done___DK8l2_5-1-29","exitDone":"magritte-exit-done___DK8l2_5-1-29"};
3
-
4
- export { styles as s };
5
- //# sourceMappingURL=snackbar-0C5Em6lA.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"snackbar-0C5Em6lA.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}