@alfalab/core-components-base-modal 3.0.1 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,40 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [3.2.0](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-base-modal@3.1.0...@alfalab/core-components-base-modal@3.2.0) (2022-03-01)
7
+
8
+
9
+ ### Features
10
+
11
+ * **base-modal:** add component ref for base modal ([#1008](https://github.com/alfa-laboratory/core-components/issues/1008)) ([fb13dbd](https://github.com/alfa-laboratory/core-components/commit/fb13dbdf6352b10b80a74fa87edfcb1f54b76d5a))
12
+ * Исправить импорты в сторях. ([#998](https://github.com/alfa-laboratory/core-components/issues/998)) ([e6a654a](https://github.com/alfa-laboratory/core-components/commit/e6a654a0599451c7d149484cb61d8067eed083b7))
13
+
14
+
15
+
16
+
17
+
18
+ # [3.1.0](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-base-modal@3.0.2...@alfalab/core-components-base-modal@3.1.0) (2022-01-17)
19
+
20
+
21
+ ### Features
22
+
23
+ * **base-modal:** extract modal store to global ([#943](https://github.com/alfa-laboratory/core-components/issues/943)) ([9587f17](https://github.com/alfa-laboratory/core-components/commit/9587f1773bb690ac6696077509d4a519aa109198))
24
+
25
+
26
+
27
+
28
+
29
+ ## [3.0.2](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-base-modal@3.0.1...@alfalab/core-components-base-modal@3.0.2) (2021-09-14)
30
+
31
+
32
+ ### Bug Fixes
33
+
34
+ * **base-modal:** modal scroll ([#820](https://github.com/alfa-laboratory/core-components/issues/820)) ([1b2d94a](https://github.com/alfa-laboratory/core-components/commit/1b2d94ad45e04145bf1292d749ae2028702dc622))
35
+
36
+
37
+
38
+
39
+
6
40
  ## [3.0.1](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-base-modal@3.0.0...@alfalab/core-components-base-modal@3.0.1) (2021-07-09)
7
41
 
8
42
  **Note:** Version bump only for package @alfalab/core-components-base-modal
@@ -108,6 +108,10 @@ type BaseModalProps = {
108
108
  * z-index компонента
109
109
  */
110
110
  zIndex?: number;
111
+ /**
112
+ * Реф, который должен быть установлен компонентной области
113
+ */
114
+ componentRef?: MutableRefObject<HTMLDivElement | null>;
111
115
  };
112
116
  type BaseModalContext = {
113
117
  hasFooter?: boolean;
package/dist/Component.js CHANGED
@@ -11,6 +11,7 @@ var FocusLock = require('react-focus-lock');
11
11
  var coreComponentsPortal = require('@alfalab/core-components-portal');
12
12
  var coreComponentsBackdrop = require('@alfalab/core-components-backdrop');
13
13
  var coreComponentsStack = require('@alfalab/core-components-stack');
14
+ require('@alfalab/core-components-global-store');
14
15
  var utils = require('./utils.js');
15
16
 
16
17
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -47,7 +48,7 @@ var __assign = function () {
47
48
  return __assign.apply(this, arguments);
48
49
  };
49
50
 
50
- var styles = {"component":"base-modal__component_1rshh","wrapper":"base-modal__wrapper_1rshh","content":"base-modal__content_1rshh","hidden":"base-modal__hidden_1rshh","backdrop":"base-modal__backdrop_1rshh","appear":"base-modal__appear_1rshh","enter":"base-modal__enter_1rshh","appearActive":"base-modal__appearActive_1rshh","enterActive":"base-modal__enterActive_1rshh","exit":"base-modal__exit_1rshh","exitActive":"base-modal__exitActive_1rshh","exitDone":"base-modal__exitDone_1rshh"};
51
+ var styles = {"component":"base-modal__component_pvkw5","wrapper":"base-modal__wrapper_pvkw5","content":"base-modal__content_pvkw5","hidden":"base-modal__hidden_pvkw5","backdrop":"base-modal__backdrop_pvkw5","appear":"base-modal__appear_pvkw5","enter":"base-modal__enter_pvkw5","appearActive":"base-modal__appearActive_pvkw5","enterActive":"base-modal__enterActive_pvkw5","exit":"base-modal__exit_pvkw5","exitActive":"base-modal__exitActive_pvkw5","exitDone":"base-modal__exitDone_pvkw5"};
51
52
  require('./index.css')
52
53
 
53
54
  var BaseModalContext = React__default['default'].createContext({
@@ -62,18 +63,18 @@ var BaseModalContext = React__default['default'].createContext({
62
63
  onClose: function () { return null; },
63
64
  });
64
65
  var BaseModal = React.forwardRef(function (_a, ref) {
65
- var open = _a.open, container = _a.container, children = _a.children, _b = _a.scrollHandler, scrollHandler = _b === void 0 ? 'wrapper' : _b, _c = _a.Backdrop, Backdrop = _c === void 0 ? coreComponentsBackdrop.Backdrop : _c, _d = _a.backdropProps, backdropProps = _d === void 0 ? {} : _d, _e = _a.transitionProps, transitionProps = _e === void 0 ? {} : _e, disableBackdropClick = _a.disableBackdropClick, _f = _a.disableAutoFocus, disableAutoFocus = _f === void 0 ? false : _f, _g = _a.disableFocusLock, disableFocusLock = _g === void 0 ? false : _g, _h = _a.disableEscapeKeyDown, disableEscapeKeyDown = _h === void 0 ? false : _h, _j = _a.disableRestoreFocus, disableRestoreFocus = _j === void 0 ? false : _j, _k = _a.keepMounted, keepMounted = _k === void 0 ? false : _k, className = _a.className, contentClassName = _a.contentClassName, wrapperClassName = _a.wrapperClassName, onBackdropClick = _a.onBackdropClick, onClose = _a.onClose, onEscapeKeyDown = _a.onEscapeKeyDown, onMount = _a.onMount, onUnmount = _a.onUnmount, dataTestId = _a.dataTestId, _l = _a.zIndex, zIndex = _l === void 0 ? coreComponentsStack.stackingOrder.MODAL : _l;
66
- var _m = React.useState(!open), exited = _m[0], setExited = _m[1];
67
- var _o = React.useState(false), hasScroll = _o[0], setHasScroll = _o[1];
68
- var _p = React.useState(false), hasHeader = _p[0], setHasHeader = _p[1];
69
- var _q = React.useState(false), hasFooter = _q[0], setHasFooter = _q[1];
70
- var _r = React.useState(false), headerHighlighted = _r[0], setHeaderHighlighted = _r[1];
71
- var _s = React.useState(false), footerHighlighted = _s[0], setFooterHighlighted = _s[1];
72
- var componentRef = React.useRef(null);
66
+ var open = _a.open, container = _a.container, children = _a.children, _b = _a.scrollHandler, scrollHandler = _b === void 0 ? 'wrapper' : _b, _c = _a.Backdrop, Backdrop = _c === void 0 ? coreComponentsBackdrop.Backdrop : _c, _d = _a.backdropProps, backdropProps = _d === void 0 ? {} : _d, _e = _a.transitionProps, transitionProps = _e === void 0 ? {} : _e, disableBackdropClick = _a.disableBackdropClick, _f = _a.disableAutoFocus, disableAutoFocus = _f === void 0 ? false : _f, _g = _a.disableFocusLock, disableFocusLock = _g === void 0 ? false : _g, _h = _a.disableEscapeKeyDown, disableEscapeKeyDown = _h === void 0 ? false : _h, _j = _a.disableRestoreFocus, disableRestoreFocus = _j === void 0 ? false : _j, _k = _a.keepMounted, keepMounted = _k === void 0 ? false : _k, className = _a.className, contentClassName = _a.contentClassName, wrapperClassName = _a.wrapperClassName, onBackdropClick = _a.onBackdropClick, onClose = _a.onClose, onEscapeKeyDown = _a.onEscapeKeyDown, onMount = _a.onMount, onUnmount = _a.onUnmount, dataTestId = _a.dataTestId, _l = _a.zIndex, zIndex = _l === void 0 ? coreComponentsStack.stackingOrder.MODAL : _l, _m = _a.componentRef, componentRef = _m === void 0 ? null : _m;
67
+ var _o = React.useState(!open), exited = _o[0], setExited = _o[1];
68
+ var _p = React.useState(false), hasScroll = _p[0], setHasScroll = _p[1];
69
+ var _q = React.useState(false), hasHeader = _q[0], setHasHeader = _q[1];
70
+ var _r = React.useState(false), hasFooter = _r[0], setHasFooter = _r[1];
71
+ var _s = React.useState(false), headerHighlighted = _s[0], setHeaderHighlighted = _s[1];
72
+ var _t = React.useState(false), footerHighlighted = _t[0], setFooterHighlighted = _t[1];
73
+ var componentNodeRef = React.useRef(null);
73
74
  var wrapperRef = React.useRef(null);
74
75
  var scrollableNodeRef = React.useRef(null);
75
76
  var contentNodeRef = React.useRef(null);
76
- var restoreContainerStyles = React.useRef(null);
77
+ var restoreContainerStylesRef = React.useRef(null);
77
78
  var checkToHasScrollBar = function () {
78
79
  if (scrollableNodeRef.current) {
79
80
  var scrollExists = utils.hasScrollbar(scrollableNodeRef.current);
@@ -82,6 +83,9 @@ var BaseModal = React.forwardRef(function (_a, ref) {
82
83
  }
83
84
  };
84
85
  var shouldRender = keepMounted || open || !exited;
86
+ var getContainer = React.useCallback(function () {
87
+ return (container ? container() : document.body);
88
+ }, [container]);
85
89
  var resizeObserver$1 = React.useMemo(function () { return new resizeObserver.ResizeObserver(checkToHasScrollBar); }, []);
86
90
  var addResizeHandle = React.useCallback(function () {
87
91
  if (scrollableNodeRef.current)
@@ -100,15 +104,16 @@ var BaseModal = React.forwardRef(function (_a, ref) {
100
104
  }
101
105
  }, [resizeObserver$1]);
102
106
  var handleScroll = React.useCallback(function () {
103
- if (!scrollableNodeRef.current || !componentRef.current)
107
+ if (!scrollableNodeRef.current || !componentNodeRef.current)
104
108
  return;
105
109
  if (hasHeader) {
106
110
  setHeaderHighlighted(!utils.isScrolledToTop(scrollableNodeRef.current) &&
107
- componentRef.current.getBoundingClientRect().top <= 0);
111
+ componentNodeRef.current.getBoundingClientRect().top <= 0);
108
112
  }
109
113
  if (hasFooter) {
110
114
  setFooterHighlighted(!utils.isScrolledToBottom(scrollableNodeRef.current) &&
111
- componentRef.current.getBoundingClientRect().bottom >= window.innerHeight);
115
+ componentNodeRef.current.getBoundingClientRect().bottom >=
116
+ window.innerHeight);
112
117
  }
113
118
  }, [hasFooter, hasHeader]);
114
119
  var handleClose = React.useCallback(function (event, reason) {
@@ -124,7 +129,7 @@ var BaseModal = React.forwardRef(function (_a, ref) {
124
129
  return null;
125
130
  }, [onBackdropClick, onClose, onEscapeKeyDown]);
126
131
  var handleBackdropClick = function (event) {
127
- if (!disableBackdropClick) {
132
+ if (!disableBackdropClick && event.target === wrapperRef.current) {
128
133
  handleClose(event, 'backdropClick');
129
134
  }
130
135
  };
@@ -146,7 +151,7 @@ var BaseModal = React.forwardRef(function (_a, ref) {
146
151
  if (scrollHandler === 'wrapper')
147
152
  return wrapperRef.current;
148
153
  if (scrollHandler === 'content')
149
- return componentRef.current;
154
+ return componentNodeRef.current;
150
155
  return scrollHandler.current || wrapperRef.current;
151
156
  }, [scrollHandler]);
152
157
  var handleEntered = React.useCallback(function (node, isAppearing) {
@@ -173,27 +178,29 @@ var BaseModal = React.forwardRef(function (_a, ref) {
173
178
  }
174
179
  if (onUnmount)
175
180
  onUnmount();
176
- if (restoreContainerStyles.current) {
177
- restoreContainerStyles.current();
178
- restoreContainerStyles.current = null;
181
+ if (restoreContainerStylesRef.current) {
182
+ restoreContainerStylesRef.current();
179
183
  }
180
184
  }, [handleScroll, onUnmount, removeResizeHandle, transitionProps]);
181
185
  React.useEffect(function () {
182
186
  if (open) {
183
- restoreContainerStyles.current = utils.handleContainer((container ? container() : document.body));
187
+ utils.handleContainer(getContainer());
188
+ restoreContainerStylesRef.current = function () {
189
+ restoreContainerStylesRef.current = null;
190
+ utils.restoreContainerStyles(getContainer());
191
+ };
184
192
  }
185
- // eslint-disable-next-line react-hooks/exhaustive-deps
186
- }, [open]);
193
+ }, [getContainer, open]);
187
194
  React.useEffect(function () {
188
195
  if (open)
189
196
  setExited(false);
190
197
  }, [open]);
191
198
  React.useEffect(function () {
192
199
  return function () {
193
- resizeObserver$1.disconnect();
194
- if (restoreContainerStyles.current) {
195
- restoreContainerStyles.current();
200
+ if (restoreContainerStylesRef.current) {
201
+ restoreContainerStylesRef.current();
196
202
  }
203
+ resizeObserver$1.disconnect();
197
204
  };
198
205
  // eslint-disable-next-line react-hooks/exhaustive-deps
199
206
  }, []);
@@ -223,14 +230,16 @@ var BaseModal = React.forwardRef(function (_a, ref) {
223
230
  return (React__default['default'].createElement(coreComponentsPortal.Portal, { getPortalContainer: container },
224
231
  React__default['default'].createElement(BaseModalContext.Provider, { value: contextValue },
225
232
  React__default['default'].createElement(FocusLock__default['default'], { autoFocus: !disableAutoFocus, disabled: disableFocusLock || !open, returnFocus: !disableRestoreFocus },
233
+ Backdrop && (React__default['default'].createElement(Backdrop, __assign({}, backdropProps, { className: cn__default['default'](backdropProps.className, styles.backdrop), open: open, style: {
234
+ zIndex: computedZIndex,
235
+ } }))),
226
236
  React__default['default'].createElement("div", { role: 'dialog', className: cn__default['default'](styles.wrapper, wrapperClassName, (_a = {},
227
237
  _a[styles.hidden] = !open && exited,
228
- _a)), ref: mergeRefs__default['default']([ref, wrapperRef]), onKeyDown: handleKeyDown, tabIndex: -1, "data-test-id": dataTestId, style: {
238
+ _a)), ref: mergeRefs__default['default']([ref, wrapperRef]), onKeyDown: handleKeyDown, onClick: handleBackdropClick, tabIndex: -1, "data-test-id": dataTestId, style: {
229
239
  zIndex: computedZIndex,
230
240
  } },
231
- Backdrop && (React__default['default'].createElement(Backdrop, __assign({}, backdropProps, { className: cn__default['default'](backdropProps.className, styles.backdrop), open: open, onClick: handleBackdropClick }))),
232
241
  React__default['default'].createElement(reactTransitionGroup.CSSTransition, __assign({ appear: true, timeout: 200, classNames: styles }, transitionProps, { in: open, onEntered: handleEntered, onExited: handleExited }),
233
- React__default['default'].createElement("div", { className: cn__default['default'](styles.component, className), ref: componentRef },
242
+ React__default['default'].createElement("div", { className: cn__default['default'](styles.component, className), ref: mergeRefs__default['default']([componentRef, componentNodeRef]) },
234
243
  React__default['default'].createElement("div", { className: cn__default['default'](styles.content, contentClassName) }, children))))))));
235
244
  }));
236
245
  });
@@ -108,6 +108,10 @@ type BaseModalProps = {
108
108
  * z-index компонента
109
109
  */
110
110
  zIndex?: number;
111
+ /**
112
+ * Реф, который должен быть установлен компонентной области
113
+ */
114
+ componentRef?: MutableRefObject<HTMLDivElement | null>;
111
115
  };
112
116
  type BaseModalContext = {
113
117
  hasFooter?: boolean;
@@ -11,6 +11,7 @@ var FocusLock = require('react-focus-lock');
11
11
  var coreComponentsPortal = require('@alfalab/core-components-portal/dist/cssm');
12
12
  var coreComponentsBackdrop = require('@alfalab/core-components-backdrop/dist/cssm');
13
13
  var coreComponentsStack = require('@alfalab/core-components-stack/dist/cssm');
14
+ require('@alfalab/core-components-global-store/dist/cssm');
14
15
  var utils = require('./utils.js');
15
16
  var styles = require('./index.module.css');
16
17
 
@@ -61,18 +62,18 @@ var BaseModalContext = React__default['default'].createContext({
61
62
  onClose: function () { return null; },
62
63
  });
63
64
  var BaseModal = React.forwardRef(function (_a, ref) {
64
- var open = _a.open, container = _a.container, children = _a.children, _b = _a.scrollHandler, scrollHandler = _b === void 0 ? 'wrapper' : _b, _c = _a.Backdrop, Backdrop = _c === void 0 ? coreComponentsBackdrop.Backdrop : _c, _d = _a.backdropProps, backdropProps = _d === void 0 ? {} : _d, _e = _a.transitionProps, transitionProps = _e === void 0 ? {} : _e, disableBackdropClick = _a.disableBackdropClick, _f = _a.disableAutoFocus, disableAutoFocus = _f === void 0 ? false : _f, _g = _a.disableFocusLock, disableFocusLock = _g === void 0 ? false : _g, _h = _a.disableEscapeKeyDown, disableEscapeKeyDown = _h === void 0 ? false : _h, _j = _a.disableRestoreFocus, disableRestoreFocus = _j === void 0 ? false : _j, _k = _a.keepMounted, keepMounted = _k === void 0 ? false : _k, className = _a.className, contentClassName = _a.contentClassName, wrapperClassName = _a.wrapperClassName, onBackdropClick = _a.onBackdropClick, onClose = _a.onClose, onEscapeKeyDown = _a.onEscapeKeyDown, onMount = _a.onMount, onUnmount = _a.onUnmount, dataTestId = _a.dataTestId, _l = _a.zIndex, zIndex = _l === void 0 ? coreComponentsStack.stackingOrder.MODAL : _l;
65
- var _m = React.useState(!open), exited = _m[0], setExited = _m[1];
66
- var _o = React.useState(false), hasScroll = _o[0], setHasScroll = _o[1];
67
- var _p = React.useState(false), hasHeader = _p[0], setHasHeader = _p[1];
68
- var _q = React.useState(false), hasFooter = _q[0], setHasFooter = _q[1];
69
- var _r = React.useState(false), headerHighlighted = _r[0], setHeaderHighlighted = _r[1];
70
- var _s = React.useState(false), footerHighlighted = _s[0], setFooterHighlighted = _s[1];
71
- var componentRef = React.useRef(null);
65
+ var open = _a.open, container = _a.container, children = _a.children, _b = _a.scrollHandler, scrollHandler = _b === void 0 ? 'wrapper' : _b, _c = _a.Backdrop, Backdrop = _c === void 0 ? coreComponentsBackdrop.Backdrop : _c, _d = _a.backdropProps, backdropProps = _d === void 0 ? {} : _d, _e = _a.transitionProps, transitionProps = _e === void 0 ? {} : _e, disableBackdropClick = _a.disableBackdropClick, _f = _a.disableAutoFocus, disableAutoFocus = _f === void 0 ? false : _f, _g = _a.disableFocusLock, disableFocusLock = _g === void 0 ? false : _g, _h = _a.disableEscapeKeyDown, disableEscapeKeyDown = _h === void 0 ? false : _h, _j = _a.disableRestoreFocus, disableRestoreFocus = _j === void 0 ? false : _j, _k = _a.keepMounted, keepMounted = _k === void 0 ? false : _k, className = _a.className, contentClassName = _a.contentClassName, wrapperClassName = _a.wrapperClassName, onBackdropClick = _a.onBackdropClick, onClose = _a.onClose, onEscapeKeyDown = _a.onEscapeKeyDown, onMount = _a.onMount, onUnmount = _a.onUnmount, dataTestId = _a.dataTestId, _l = _a.zIndex, zIndex = _l === void 0 ? coreComponentsStack.stackingOrder.MODAL : _l, _m = _a.componentRef, componentRef = _m === void 0 ? null : _m;
66
+ var _o = React.useState(!open), exited = _o[0], setExited = _o[1];
67
+ var _p = React.useState(false), hasScroll = _p[0], setHasScroll = _p[1];
68
+ var _q = React.useState(false), hasHeader = _q[0], setHasHeader = _q[1];
69
+ var _r = React.useState(false), hasFooter = _r[0], setHasFooter = _r[1];
70
+ var _s = React.useState(false), headerHighlighted = _s[0], setHeaderHighlighted = _s[1];
71
+ var _t = React.useState(false), footerHighlighted = _t[0], setFooterHighlighted = _t[1];
72
+ var componentNodeRef = React.useRef(null);
72
73
  var wrapperRef = React.useRef(null);
73
74
  var scrollableNodeRef = React.useRef(null);
74
75
  var contentNodeRef = React.useRef(null);
75
- var restoreContainerStyles = React.useRef(null);
76
+ var restoreContainerStylesRef = React.useRef(null);
76
77
  var checkToHasScrollBar = function () {
77
78
  if (scrollableNodeRef.current) {
78
79
  var scrollExists = utils.hasScrollbar(scrollableNodeRef.current);
@@ -81,6 +82,9 @@ var BaseModal = React.forwardRef(function (_a, ref) {
81
82
  }
82
83
  };
83
84
  var shouldRender = keepMounted || open || !exited;
85
+ var getContainer = React.useCallback(function () {
86
+ return (container ? container() : document.body);
87
+ }, [container]);
84
88
  var resizeObserver$1 = React.useMemo(function () { return new resizeObserver.ResizeObserver(checkToHasScrollBar); }, []);
85
89
  var addResizeHandle = React.useCallback(function () {
86
90
  if (scrollableNodeRef.current)
@@ -99,15 +103,16 @@ var BaseModal = React.forwardRef(function (_a, ref) {
99
103
  }
100
104
  }, [resizeObserver$1]);
101
105
  var handleScroll = React.useCallback(function () {
102
- if (!scrollableNodeRef.current || !componentRef.current)
106
+ if (!scrollableNodeRef.current || !componentNodeRef.current)
103
107
  return;
104
108
  if (hasHeader) {
105
109
  setHeaderHighlighted(!utils.isScrolledToTop(scrollableNodeRef.current) &&
106
- componentRef.current.getBoundingClientRect().top <= 0);
110
+ componentNodeRef.current.getBoundingClientRect().top <= 0);
107
111
  }
108
112
  if (hasFooter) {
109
113
  setFooterHighlighted(!utils.isScrolledToBottom(scrollableNodeRef.current) &&
110
- componentRef.current.getBoundingClientRect().bottom >= window.innerHeight);
114
+ componentNodeRef.current.getBoundingClientRect().bottom >=
115
+ window.innerHeight);
111
116
  }
112
117
  }, [hasFooter, hasHeader]);
113
118
  var handleClose = React.useCallback(function (event, reason) {
@@ -123,7 +128,7 @@ var BaseModal = React.forwardRef(function (_a, ref) {
123
128
  return null;
124
129
  }, [onBackdropClick, onClose, onEscapeKeyDown]);
125
130
  var handleBackdropClick = function (event) {
126
- if (!disableBackdropClick) {
131
+ if (!disableBackdropClick && event.target === wrapperRef.current) {
127
132
  handleClose(event, 'backdropClick');
128
133
  }
129
134
  };
@@ -145,7 +150,7 @@ var BaseModal = React.forwardRef(function (_a, ref) {
145
150
  if (scrollHandler === 'wrapper')
146
151
  return wrapperRef.current;
147
152
  if (scrollHandler === 'content')
148
- return componentRef.current;
153
+ return componentNodeRef.current;
149
154
  return scrollHandler.current || wrapperRef.current;
150
155
  }, [scrollHandler]);
151
156
  var handleEntered = React.useCallback(function (node, isAppearing) {
@@ -172,27 +177,29 @@ var BaseModal = React.forwardRef(function (_a, ref) {
172
177
  }
173
178
  if (onUnmount)
174
179
  onUnmount();
175
- if (restoreContainerStyles.current) {
176
- restoreContainerStyles.current();
177
- restoreContainerStyles.current = null;
180
+ if (restoreContainerStylesRef.current) {
181
+ restoreContainerStylesRef.current();
178
182
  }
179
183
  }, [handleScroll, onUnmount, removeResizeHandle, transitionProps]);
180
184
  React.useEffect(function () {
181
185
  if (open) {
182
- restoreContainerStyles.current = utils.handleContainer((container ? container() : document.body));
186
+ utils.handleContainer(getContainer());
187
+ restoreContainerStylesRef.current = function () {
188
+ restoreContainerStylesRef.current = null;
189
+ utils.restoreContainerStyles(getContainer());
190
+ };
183
191
  }
184
- // eslint-disable-next-line react-hooks/exhaustive-deps
185
- }, [open]);
192
+ }, [getContainer, open]);
186
193
  React.useEffect(function () {
187
194
  if (open)
188
195
  setExited(false);
189
196
  }, [open]);
190
197
  React.useEffect(function () {
191
198
  return function () {
192
- resizeObserver$1.disconnect();
193
- if (restoreContainerStyles.current) {
194
- restoreContainerStyles.current();
199
+ if (restoreContainerStylesRef.current) {
200
+ restoreContainerStylesRef.current();
195
201
  }
202
+ resizeObserver$1.disconnect();
196
203
  };
197
204
  // eslint-disable-next-line react-hooks/exhaustive-deps
198
205
  }, []);
@@ -222,14 +229,16 @@ var BaseModal = React.forwardRef(function (_a, ref) {
222
229
  return (React__default['default'].createElement(coreComponentsPortal.Portal, { getPortalContainer: container },
223
230
  React__default['default'].createElement(BaseModalContext.Provider, { value: contextValue },
224
231
  React__default['default'].createElement(FocusLock__default['default'], { autoFocus: !disableAutoFocus, disabled: disableFocusLock || !open, returnFocus: !disableRestoreFocus },
232
+ Backdrop && (React__default['default'].createElement(Backdrop, __assign({}, backdropProps, { className: cn__default['default'](backdropProps.className, styles__default['default'].backdrop), open: open, style: {
233
+ zIndex: computedZIndex,
234
+ } }))),
225
235
  React__default['default'].createElement("div", { role: 'dialog', className: cn__default['default'](styles__default['default'].wrapper, wrapperClassName, (_a = {},
226
236
  _a[styles__default['default'].hidden] = !open && exited,
227
- _a)), ref: mergeRefs__default['default']([ref, wrapperRef]), onKeyDown: handleKeyDown, tabIndex: -1, "data-test-id": dataTestId, style: {
237
+ _a)), ref: mergeRefs__default['default']([ref, wrapperRef]), onKeyDown: handleKeyDown, onClick: handleBackdropClick, tabIndex: -1, "data-test-id": dataTestId, style: {
228
238
  zIndex: computedZIndex,
229
239
  } },
230
- Backdrop && (React__default['default'].createElement(Backdrop, __assign({}, backdropProps, { className: cn__default['default'](backdropProps.className, styles__default['default'].backdrop), open: open, onClick: handleBackdropClick }))),
231
240
  React__default['default'].createElement(reactTransitionGroup.CSSTransition, __assign({ appear: true, timeout: 200, classNames: styles__default['default'] }, transitionProps, { in: open, onEntered: handleEntered, onExited: handleExited }),
232
- React__default['default'].createElement("div", { className: cn__default['default'](styles__default['default'].component, className), ref: componentRef },
241
+ React__default['default'].createElement("div", { className: cn__default['default'](styles__default['default'].component, className), ref: mergeRefs__default['default']([componentRef, componentNodeRef]) },
233
242
  React__default['default'].createElement("div", { className: cn__default['default'](styles__default['default'].content, contentClassName) }, children))))))));
234
243
  }));
235
244
  });
@@ -12,6 +12,7 @@ require('react-focus-lock');
12
12
  require('@alfalab/core-components-portal/dist/cssm');
13
13
  require('@alfalab/core-components-backdrop/dist/cssm');
14
14
  require('@alfalab/core-components-stack/dist/cssm');
15
+ require('@alfalab/core-components-global-store/dist/cssm');
15
16
  var utils = require('./utils.js');
16
17
  require('./index.module.css');
17
18
 
@@ -23,3 +24,4 @@ exports.handleContainer = utils.handleContainer;
23
24
  exports.hasScrollbar = utils.hasScrollbar;
24
25
  exports.isScrolledToBottom = utils.isScrolledToBottom;
25
26
  exports.isScrolledToTop = utils.isScrolledToTop;
27
+ exports.restoreContainerStyles = utils.restoreContainerStyles;
@@ -40,7 +40,7 @@
40
40
  display: none;
41
41
  }
42
42
  .backdrop {
43
- z-index: -1;
43
+ z-index: 0;
44
44
  }
45
45
  .appear,
46
46
  .enter {
@@ -1,5 +1,6 @@
1
1
  declare function isScrolledToTop(target: HTMLElement): boolean;
2
2
  declare function isScrolledToBottom(target: HTMLElement): boolean;
3
3
  declare function hasScrollbar(target: HTMLElement): boolean;
4
- declare const handleContainer: (container: HTMLElement) => () => void;
5
- export { isScrolledToTop, isScrolledToBottom, hasScrollbar, handleContainer };
4
+ declare const restoreContainerStyles: (container: HTMLElement) => void;
5
+ declare const handleContainer: (container?: HTMLElement | undefined) => void;
6
+ export { isScrolledToTop, isScrolledToBottom, hasScrollbar, restoreContainerStyles, handleContainer };
@@ -2,6 +2,8 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
+ var coreComponentsGlobalStore = require('@alfalab/core-components-global-store/dist/cssm');
6
+
5
7
  function isScrolledToTop(target) {
6
8
  return target.scrollTop <= 0;
7
9
  }
@@ -32,12 +34,40 @@ var isOverflowing = function (container) {
32
34
  var getPaddingRight = function (node) {
33
35
  return parseInt(window.getComputedStyle(node).paddingRight, 10) || 0;
34
36
  };
37
+ var restoreContainerStyles = function (container) {
38
+ var modalRestoreStyles = coreComponentsGlobalStore.getModalStore().getRestoreStyles();
39
+ var index = modalRestoreStyles.findIndex(function (s) { return s.container === container; });
40
+ var existingStyles = modalRestoreStyles[index];
41
+ if (!existingStyles)
42
+ return;
43
+ existingStyles.modals -= 1;
44
+ if (existingStyles.modals <= 0) {
45
+ modalRestoreStyles.splice(index, 1);
46
+ existingStyles.styles.forEach(function (_a) {
47
+ var value = _a.value, el = _a.el, key = _a.key;
48
+ if (value) {
49
+ el.style.setProperty(key, value);
50
+ }
51
+ else {
52
+ el.style.removeProperty(key);
53
+ }
54
+ });
55
+ }
56
+ };
35
57
  var handleContainer = function (container) {
36
- var restoreStyle = [];
58
+ if (!container)
59
+ return;
60
+ var modalRestoreStyles = coreComponentsGlobalStore.getModalStore().getRestoreStyles();
61
+ var existingStyles = modalRestoreStyles.find(function (s) { return s.container === container; });
62
+ if (existingStyles) {
63
+ existingStyles.modals += 1;
64
+ return;
65
+ }
66
+ var containerStyles = [];
37
67
  if (isOverflowing(container)) {
38
68
  // Вычисляет размер до применения `overflow hidden` для избежания скачков
39
69
  var scrollbarSize = getScrollbarSize();
40
- restoreStyle.push({
70
+ containerStyles.push({
41
71
  value: container.style.paddingRight,
42
72
  key: 'padding-right',
43
73
  el: container,
@@ -56,27 +86,22 @@ var handleContainer = function (container) {
56
86
  : container;
57
87
  // Блокируем скролл даже если отсутствует скроллбар
58
88
  if (scrollContainer.style.overflow !== 'hidden') {
59
- restoreStyle.push({
89
+ containerStyles.push({
60
90
  value: scrollContainer.style.overflow,
61
91
  key: 'overflow',
62
92
  el: scrollContainer,
63
93
  });
64
94
  }
65
95
  scrollContainer.style.overflow = 'hidden';
66
- return function () {
67
- restoreStyle.forEach(function (_a) {
68
- var value = _a.value, el = _a.el, key = _a.key;
69
- if (value) {
70
- el.style.setProperty(key, value);
71
- }
72
- else {
73
- el.style.removeProperty(key);
74
- }
75
- });
76
- };
96
+ modalRestoreStyles.push({
97
+ container: container,
98
+ modals: 1,
99
+ styles: containerStyles,
100
+ });
77
101
  };
78
102
 
79
103
  exports.handleContainer = handleContainer;
80
104
  exports.hasScrollbar = hasScrollbar;
81
105
  exports.isScrolledToBottom = isScrolledToBottom;
82
106
  exports.isScrolledToTop = isScrolledToTop;
107
+ exports.restoreContainerStyles = restoreContainerStyles;
@@ -108,6 +108,10 @@ type BaseModalProps = {
108
108
  * z-index компонента
109
109
  */
110
110
  zIndex?: number;
111
+ /**
112
+ * Реф, который должен быть установлен компонентной области
113
+ */
114
+ componentRef?: MutableRefObject<HTMLDivElement | null>;
111
115
  };
112
116
  type BaseModalContext = {
113
117
  hasFooter?: boolean;