@alfalab/core-components-base-modal 3.0.2 → 4.0.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,45 @@
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
+ # [4.0.0](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-base-modal@3.2.0...@alfalab/core-components-base-modal@4.0.0) (2022-03-24)
7
+
8
+
9
+ ### Features
10
+
11
+ * **bottom-sheet:** update-bottom-sheet ([#1025](https://github.com/alfa-laboratory/core-components/issues/1025)) ([26fa9aa](https://github.com/alfa-laboratory/core-components/commit/26fa9aab68bebf0f7093a38bc0f18a9b596ccf37)), closes [#1032](https://github.com/alfa-laboratory/core-components/issues/1032)
12
+
13
+
14
+ ### BREAKING CHANGES
15
+
16
+ * **bottom-sheet:** Большое обновление стилей, множество дополнительных настроек
17
+
18
+
19
+
20
+
21
+
22
+ # [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)
23
+
24
+
25
+ ### Features
26
+
27
+ * **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))
28
+ * Исправить импорты в сторях. ([#998](https://github.com/alfa-laboratory/core-components/issues/998)) ([e6a654a](https://github.com/alfa-laboratory/core-components/commit/e6a654a0599451c7d149484cb61d8067eed083b7))
29
+
30
+
31
+
32
+
33
+
34
+ # [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)
35
+
36
+
37
+ ### Features
38
+
39
+ * **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))
40
+
41
+
42
+
43
+
44
+
6
45
  ## [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)
7
46
 
8
47
 
@@ -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;
@@ -115,6 +119,8 @@ type BaseModalContext = {
115
119
  hasScroll?: boolean;
116
120
  headerHighlighted?: boolean;
117
121
  footerHighlighted?: boolean;
122
+ headerOffset?: number;
123
+ setHeaderOffset: (offset: number) => void;
118
124
  contentRef: Ref<HTMLElement>;
119
125
  setHasHeader: (exists: boolean) => void;
120
126
  setHasFooter: (exists: boolean) => void;
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_nnjeq","wrapper":"base-modal__wrapper_nnjeq","content":"base-modal__content_nnjeq","hidden":"base-modal__hidden_nnjeq","backdrop":"base-modal__backdrop_nnjeq","appear":"base-modal__appear_nnjeq","enter":"base-modal__enter_nnjeq","appearActive":"base-modal__appearActive_nnjeq","enterActive":"base-modal__enterActive_nnjeq","exit":"base-modal__exit_nnjeq","exitActive":"base-modal__exitActive_nnjeq","exitDone":"base-modal__exitDone_nnjeq"};
51
+ var styles = {"component":"base-modal__component_t7alb","wrapper":"base-modal__wrapper_t7alb","content":"base-modal__content_t7alb","hidden":"base-modal__hidden_t7alb","backdrop":"base-modal__backdrop_t7alb","appear":"base-modal__appear_t7alb","enter":"base-modal__enter_t7alb","appearActive":"base-modal__appearActive_t7alb","enterActive":"base-modal__enterActive_t7alb","exit":"base-modal__exit_t7alb","exitActive":"base-modal__exitActive_t7alb","exitDone":"base-modal__exitDone_t7alb"};
51
52
  require('./index.css')
52
53
 
53
54
  var BaseModalContext = React__default['default'].createContext({
@@ -56,20 +57,23 @@ var BaseModalContext = React__default['default'].createContext({
56
57
  hasScroll: false,
57
58
  headerHighlighted: false,
58
59
  footerHighlighted: false,
60
+ headerOffset: 0,
61
+ setHeaderOffset: function () { return null; },
59
62
  contentRef: function () { return null; },
60
63
  setHasHeader: function () { return null; },
61
64
  setHasFooter: function () { return null; },
62
65
  onClose: function () { return null; },
63
66
  });
64
67
  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);
68
+ 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;
69
+ var _o = React.useState(!open), exited = _o[0], setExited = _o[1];
70
+ var _p = React.useState(false), hasScroll = _p[0], setHasScroll = _p[1];
71
+ var _q = React.useState(false), hasHeader = _q[0], setHasHeader = _q[1];
72
+ var _r = React.useState(false), hasFooter = _r[0], setHasFooter = _r[1];
73
+ var _s = React.useState(false), headerHighlighted = _s[0], setHeaderHighlighted = _s[1];
74
+ var _t = React.useState(false), footerHighlighted = _t[0], setFooterHighlighted = _t[1];
75
+ var _u = React.useState(0), headerOffset = _u[0], setHeaderOffset = _u[1];
76
+ var componentNodeRef = React.useRef(null);
73
77
  var wrapperRef = React.useRef(null);
74
78
  var scrollableNodeRef = React.useRef(null);
75
79
  var contentNodeRef = React.useRef(null);
@@ -103,17 +107,18 @@ var BaseModal = React.forwardRef(function (_a, ref) {
103
107
  }
104
108
  }, [resizeObserver$1]);
105
109
  var handleScroll = React.useCallback(function () {
106
- if (!scrollableNodeRef.current || !componentRef.current)
110
+ if (!scrollableNodeRef.current || !componentNodeRef.current)
107
111
  return;
108
112
  if (hasHeader) {
109
113
  setHeaderHighlighted(!utils.isScrolledToTop(scrollableNodeRef.current) &&
110
- componentRef.current.getBoundingClientRect().top <= 0);
114
+ componentNodeRef.current.getBoundingClientRect().top - headerOffset <= 0);
111
115
  }
112
116
  if (hasFooter) {
113
117
  setFooterHighlighted(!utils.isScrolledToBottom(scrollableNodeRef.current) &&
114
- componentRef.current.getBoundingClientRect().bottom >= window.innerHeight);
118
+ componentNodeRef.current.getBoundingClientRect().bottom >=
119
+ window.innerHeight);
115
120
  }
116
- }, [hasFooter, hasHeader]);
121
+ }, [hasFooter, hasHeader, headerOffset]);
117
122
  var handleClose = React.useCallback(function (event, reason) {
118
123
  if (onClose) {
119
124
  onClose(event, reason);
@@ -149,7 +154,7 @@ var BaseModal = React.forwardRef(function (_a, ref) {
149
154
  if (scrollHandler === 'wrapper')
150
155
  return wrapperRef.current;
151
156
  if (scrollHandler === 'content')
152
- return componentRef.current;
157
+ return componentNodeRef.current;
153
158
  return scrollHandler.current || wrapperRef.current;
154
159
  }, [scrollHandler]);
155
160
  var handleEntered = React.useCallback(function (node, isAppearing) {
@@ -208,6 +213,8 @@ var BaseModal = React.forwardRef(function (_a, ref) {
208
213
  hasScroll: hasScroll,
209
214
  headerHighlighted: headerHighlighted,
210
215
  footerHighlighted: footerHighlighted,
216
+ headerOffset: headerOffset,
217
+ setHeaderOffset: setHeaderOffset,
211
218
  contentRef: contentRef,
212
219
  setHasHeader: setHasHeader,
213
220
  setHasFooter: setHasFooter,
@@ -219,6 +226,8 @@ var BaseModal = React.forwardRef(function (_a, ref) {
219
226
  hasScroll,
220
227
  headerHighlighted,
221
228
  footerHighlighted,
229
+ headerOffset,
230
+ setHeaderOffset,
222
231
  handleClose,
223
232
  ]);
224
233
  if (!shouldRender)
@@ -237,7 +246,7 @@ var BaseModal = React.forwardRef(function (_a, ref) {
237
246
  zIndex: computedZIndex,
238
247
  } },
239
248
  React__default['default'].createElement(reactTransitionGroup.CSSTransition, __assign({ appear: true, timeout: 200, classNames: styles }, transitionProps, { in: open, onEntered: handleEntered, onExited: handleExited }),
240
- React__default['default'].createElement("div", { className: cn__default['default'](styles.component, className), ref: componentRef },
249
+ React__default['default'].createElement("div", { className: cn__default['default'](styles.component, className), ref: mergeRefs__default['default']([componentRef, componentNodeRef]) },
241
250
  React__default['default'].createElement("div", { className: cn__default['default'](styles.content, contentClassName) }, children))))))));
242
251
  }));
243
252
  });
@@ -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;
@@ -115,6 +119,8 @@ type BaseModalContext = {
115
119
  hasScroll?: boolean;
116
120
  headerHighlighted?: boolean;
117
121
  footerHighlighted?: boolean;
122
+ headerOffset?: number;
123
+ setHeaderOffset: (offset: number) => void;
118
124
  contentRef: Ref<HTMLElement>;
119
125
  setHasHeader: (exists: boolean) => void;
120
126
  setHasFooter: (exists: boolean) => void;
@@ -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
 
@@ -55,20 +56,23 @@ var BaseModalContext = React__default['default'].createContext({
55
56
  hasScroll: false,
56
57
  headerHighlighted: false,
57
58
  footerHighlighted: false,
59
+ headerOffset: 0,
60
+ setHeaderOffset: function () { return null; },
58
61
  contentRef: function () { return null; },
59
62
  setHasHeader: function () { return null; },
60
63
  setHasFooter: function () { return null; },
61
64
  onClose: function () { return null; },
62
65
  });
63
66
  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);
67
+ 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;
68
+ var _o = React.useState(!open), exited = _o[0], setExited = _o[1];
69
+ var _p = React.useState(false), hasScroll = _p[0], setHasScroll = _p[1];
70
+ var _q = React.useState(false), hasHeader = _q[0], setHasHeader = _q[1];
71
+ var _r = React.useState(false), hasFooter = _r[0], setHasFooter = _r[1];
72
+ var _s = React.useState(false), headerHighlighted = _s[0], setHeaderHighlighted = _s[1];
73
+ var _t = React.useState(false), footerHighlighted = _t[0], setFooterHighlighted = _t[1];
74
+ var _u = React.useState(0), headerOffset = _u[0], setHeaderOffset = _u[1];
75
+ var componentNodeRef = React.useRef(null);
72
76
  var wrapperRef = React.useRef(null);
73
77
  var scrollableNodeRef = React.useRef(null);
74
78
  var contentNodeRef = React.useRef(null);
@@ -102,17 +106,18 @@ var BaseModal = React.forwardRef(function (_a, ref) {
102
106
  }
103
107
  }, [resizeObserver$1]);
104
108
  var handleScroll = React.useCallback(function () {
105
- if (!scrollableNodeRef.current || !componentRef.current)
109
+ if (!scrollableNodeRef.current || !componentNodeRef.current)
106
110
  return;
107
111
  if (hasHeader) {
108
112
  setHeaderHighlighted(!utils.isScrolledToTop(scrollableNodeRef.current) &&
109
- componentRef.current.getBoundingClientRect().top <= 0);
113
+ componentNodeRef.current.getBoundingClientRect().top - headerOffset <= 0);
110
114
  }
111
115
  if (hasFooter) {
112
116
  setFooterHighlighted(!utils.isScrolledToBottom(scrollableNodeRef.current) &&
113
- componentRef.current.getBoundingClientRect().bottom >= window.innerHeight);
117
+ componentNodeRef.current.getBoundingClientRect().bottom >=
118
+ window.innerHeight);
114
119
  }
115
- }, [hasFooter, hasHeader]);
120
+ }, [hasFooter, hasHeader, headerOffset]);
116
121
  var handleClose = React.useCallback(function (event, reason) {
117
122
  if (onClose) {
118
123
  onClose(event, reason);
@@ -148,7 +153,7 @@ var BaseModal = React.forwardRef(function (_a, ref) {
148
153
  if (scrollHandler === 'wrapper')
149
154
  return wrapperRef.current;
150
155
  if (scrollHandler === 'content')
151
- return componentRef.current;
156
+ return componentNodeRef.current;
152
157
  return scrollHandler.current || wrapperRef.current;
153
158
  }, [scrollHandler]);
154
159
  var handleEntered = React.useCallback(function (node, isAppearing) {
@@ -207,6 +212,8 @@ var BaseModal = React.forwardRef(function (_a, ref) {
207
212
  hasScroll: hasScroll,
208
213
  headerHighlighted: headerHighlighted,
209
214
  footerHighlighted: footerHighlighted,
215
+ headerOffset: headerOffset,
216
+ setHeaderOffset: setHeaderOffset,
210
217
  contentRef: contentRef,
211
218
  setHasHeader: setHasHeader,
212
219
  setHasFooter: setHasFooter,
@@ -218,6 +225,8 @@ var BaseModal = React.forwardRef(function (_a, ref) {
218
225
  hasScroll,
219
226
  headerHighlighted,
220
227
  footerHighlighted,
228
+ headerOffset,
229
+ setHeaderOffset,
221
230
  handleClose,
222
231
  ]);
223
232
  if (!shouldRender)
@@ -236,7 +245,7 @@ var BaseModal = React.forwardRef(function (_a, ref) {
236
245
  zIndex: computedZIndex,
237
246
  } },
238
247
  React__default['default'].createElement(reactTransitionGroup.CSSTransition, __assign({ appear: true, timeout: 200, classNames: styles__default['default'] }, transitionProps, { in: open, onEntered: handleEntered, onExited: handleExited }),
239
- React__default['default'].createElement("div", { className: cn__default['default'](styles__default['default'].component, className), ref: componentRef },
248
+ React__default['default'].createElement("div", { className: cn__default['default'](styles__default['default'].component, className), ref: mergeRefs__default['default']([componentRef, componentNodeRef]) },
240
249
  React__default['default'].createElement("div", { className: cn__default['default'](styles__default['default'].content, contentClassName) }, children))))))));
241
250
  }));
242
251
  });
@@ -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
 
@@ -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,15 +34,15 @@ var isOverflowing = function (container) {
32
34
  var getPaddingRight = function (node) {
33
35
  return parseInt(window.getComputedStyle(node).paddingRight, 10) || 0;
34
36
  };
35
- var restoreStylesStore = [];
36
37
  var restoreContainerStyles = function (container) {
37
- var index = restoreStylesStore.findIndex(function (s) { return s.container === container; });
38
- var existingStyles = restoreStylesStore[index];
38
+ var modalRestoreStyles = coreComponentsGlobalStore.getModalStore().getRestoreStyles();
39
+ var index = modalRestoreStyles.findIndex(function (s) { return s.container === container; });
40
+ var existingStyles = modalRestoreStyles[index];
39
41
  if (!existingStyles)
40
42
  return;
41
43
  existingStyles.modals -= 1;
42
44
  if (existingStyles.modals <= 0) {
43
- restoreStylesStore.splice(index, 1);
45
+ modalRestoreStyles.splice(index, 1);
44
46
  existingStyles.styles.forEach(function (_a) {
45
47
  var value = _a.value, el = _a.el, key = _a.key;
46
48
  if (value) {
@@ -55,7 +57,8 @@ var restoreContainerStyles = function (container) {
55
57
  var handleContainer = function (container) {
56
58
  if (!container)
57
59
  return;
58
- var existingStyles = restoreStylesStore.find(function (s) { return s.container === container; });
60
+ var modalRestoreStyles = coreComponentsGlobalStore.getModalStore().getRestoreStyles();
61
+ var existingStyles = modalRestoreStyles.find(function (s) { return s.container === container; });
59
62
  if (existingStyles) {
60
63
  existingStyles.modals += 1;
61
64
  return;
@@ -90,7 +93,7 @@ var handleContainer = function (container) {
90
93
  });
91
94
  }
92
95
  scrollContainer.style.overflow = 'hidden';
93
- restoreStylesStore.push({
96
+ modalRestoreStyles.push({
94
97
  container: container,
95
98
  modals: 1,
96
99
  styles: containerStyles,
@@ -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;
@@ -115,6 +119,8 @@ type BaseModalContext = {
115
119
  hasScroll?: boolean;
116
120
  headerHighlighted?: boolean;
117
121
  footerHighlighted?: boolean;
122
+ headerOffset?: number;
123
+ setHeaderOffset: (offset: number) => void;
118
124
  contentRef: Ref<HTMLElement>;
119
125
  setHasHeader: (exists: boolean) => void;
120
126
  setHasFooter: (exists: boolean) => void;
@@ -7,6 +7,7 @@ import FocusLock from 'react-focus-lock';
7
7
  import { Portal } from '@alfalab/core-components-portal/dist/esm';
8
8
  import { Backdrop } from '@alfalab/core-components-backdrop/dist/esm';
9
9
  import { stackingOrder, Stack } from '@alfalab/core-components-stack/dist/esm';
10
+ import '@alfalab/core-components-global-store/dist/esm';
10
11
  import { isScrolledToTop, isScrolledToBottom, handleContainer, restoreContainerStyles, hasScrollbar } from './utils.js';
11
12
 
12
13
  /*! *****************************************************************************
@@ -36,7 +37,7 @@ var __assign = function () {
36
37
  return __assign.apply(this, arguments);
37
38
  };
38
39
 
39
- var styles = {"component":"base-modal__component_nnjeq","wrapper":"base-modal__wrapper_nnjeq","content":"base-modal__content_nnjeq","hidden":"base-modal__hidden_nnjeq","backdrop":"base-modal__backdrop_nnjeq","appear":"base-modal__appear_nnjeq","enter":"base-modal__enter_nnjeq","appearActive":"base-modal__appearActive_nnjeq","enterActive":"base-modal__enterActive_nnjeq","exit":"base-modal__exit_nnjeq","exitActive":"base-modal__exitActive_nnjeq","exitDone":"base-modal__exitDone_nnjeq"};
40
+ var styles = {"component":"base-modal__component_t7alb","wrapper":"base-modal__wrapper_t7alb","content":"base-modal__content_t7alb","hidden":"base-modal__hidden_t7alb","backdrop":"base-modal__backdrop_t7alb","appear":"base-modal__appear_t7alb","enter":"base-modal__enter_t7alb","appearActive":"base-modal__appearActive_t7alb","enterActive":"base-modal__enterActive_t7alb","exit":"base-modal__exit_t7alb","exitActive":"base-modal__exitActive_t7alb","exitDone":"base-modal__exitDone_t7alb"};
40
41
  require('./index.css')
41
42
 
42
43
  var BaseModalContext = React.createContext({
@@ -45,20 +46,23 @@ var BaseModalContext = React.createContext({
45
46
  hasScroll: false,
46
47
  headerHighlighted: false,
47
48
  footerHighlighted: false,
49
+ headerOffset: 0,
50
+ setHeaderOffset: function () { return null; },
48
51
  contentRef: function () { return null; },
49
52
  setHasHeader: function () { return null; },
50
53
  setHasFooter: function () { return null; },
51
54
  onClose: function () { return null; },
52
55
  });
53
56
  var BaseModal = forwardRef(function (_a, ref) {
54
- var open = _a.open, container = _a.container, children = _a.children, _b = _a.scrollHandler, scrollHandler = _b === void 0 ? 'wrapper' : _b, _c = _a.Backdrop, Backdrop$1 = _c === void 0 ? 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 ? stackingOrder.MODAL : _l;
55
- var _m = useState(!open), exited = _m[0], setExited = _m[1];
56
- var _o = useState(false), hasScroll = _o[0], setHasScroll = _o[1];
57
- var _p = useState(false), hasHeader = _p[0], setHasHeader = _p[1];
58
- var _q = useState(false), hasFooter = _q[0], setHasFooter = _q[1];
59
- var _r = useState(false), headerHighlighted = _r[0], setHeaderHighlighted = _r[1];
60
- var _s = useState(false), footerHighlighted = _s[0], setFooterHighlighted = _s[1];
61
- var componentRef = useRef(null);
57
+ var open = _a.open, container = _a.container, children = _a.children, _b = _a.scrollHandler, scrollHandler = _b === void 0 ? 'wrapper' : _b, _c = _a.Backdrop, Backdrop$1 = _c === void 0 ? 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 ? stackingOrder.MODAL : _l, _m = _a.componentRef, componentRef = _m === void 0 ? null : _m;
58
+ var _o = useState(!open), exited = _o[0], setExited = _o[1];
59
+ var _p = useState(false), hasScroll = _p[0], setHasScroll = _p[1];
60
+ var _q = useState(false), hasHeader = _q[0], setHasHeader = _q[1];
61
+ var _r = useState(false), hasFooter = _r[0], setHasFooter = _r[1];
62
+ var _s = useState(false), headerHighlighted = _s[0], setHeaderHighlighted = _s[1];
63
+ var _t = useState(false), footerHighlighted = _t[0], setFooterHighlighted = _t[1];
64
+ var _u = useState(0), headerOffset = _u[0], setHeaderOffset = _u[1];
65
+ var componentNodeRef = useRef(null);
62
66
  var wrapperRef = useRef(null);
63
67
  var scrollableNodeRef = useRef(null);
64
68
  var contentNodeRef = useRef(null);
@@ -92,17 +96,18 @@ var BaseModal = forwardRef(function (_a, ref) {
92
96
  }
93
97
  }, [resizeObserver]);
94
98
  var handleScroll = useCallback(function () {
95
- if (!scrollableNodeRef.current || !componentRef.current)
99
+ if (!scrollableNodeRef.current || !componentNodeRef.current)
96
100
  return;
97
101
  if (hasHeader) {
98
102
  setHeaderHighlighted(!isScrolledToTop(scrollableNodeRef.current) &&
99
- componentRef.current.getBoundingClientRect().top <= 0);
103
+ componentNodeRef.current.getBoundingClientRect().top - headerOffset <= 0);
100
104
  }
101
105
  if (hasFooter) {
102
106
  setFooterHighlighted(!isScrolledToBottom(scrollableNodeRef.current) &&
103
- componentRef.current.getBoundingClientRect().bottom >= window.innerHeight);
107
+ componentNodeRef.current.getBoundingClientRect().bottom >=
108
+ window.innerHeight);
104
109
  }
105
- }, [hasFooter, hasHeader]);
110
+ }, [hasFooter, hasHeader, headerOffset]);
106
111
  var handleClose = useCallback(function (event, reason) {
107
112
  if (onClose) {
108
113
  onClose(event, reason);
@@ -138,7 +143,7 @@ var BaseModal = forwardRef(function (_a, ref) {
138
143
  if (scrollHandler === 'wrapper')
139
144
  return wrapperRef.current;
140
145
  if (scrollHandler === 'content')
141
- return componentRef.current;
146
+ return componentNodeRef.current;
142
147
  return scrollHandler.current || wrapperRef.current;
143
148
  }, [scrollHandler]);
144
149
  var handleEntered = useCallback(function (node, isAppearing) {
@@ -197,6 +202,8 @@ var BaseModal = forwardRef(function (_a, ref) {
197
202
  hasScroll: hasScroll,
198
203
  headerHighlighted: headerHighlighted,
199
204
  footerHighlighted: footerHighlighted,
205
+ headerOffset: headerOffset,
206
+ setHeaderOffset: setHeaderOffset,
200
207
  contentRef: contentRef,
201
208
  setHasHeader: setHasHeader,
202
209
  setHasFooter: setHasFooter,
@@ -208,6 +215,8 @@ var BaseModal = forwardRef(function (_a, ref) {
208
215
  hasScroll,
209
216
  headerHighlighted,
210
217
  footerHighlighted,
218
+ headerOffset,
219
+ setHeaderOffset,
211
220
  handleClose,
212
221
  ]);
213
222
  if (!shouldRender)
@@ -226,7 +235,7 @@ var BaseModal = forwardRef(function (_a, ref) {
226
235
  zIndex: computedZIndex,
227
236
  } },
228
237
  React.createElement(CSSTransition, __assign({ appear: true, timeout: 200, classNames: styles }, transitionProps, { in: open, onEntered: handleEntered, onExited: handleExited }),
229
- React.createElement("div", { className: cn(styles.component, className), ref: componentRef },
238
+ React.createElement("div", { className: cn(styles.component, className), ref: mergeRefs([componentRef, componentNodeRef]) },
230
239
  React.createElement("div", { className: cn(styles.content, contentClassName) }, children))))))));
231
240
  }));
232
241
  });
@@ -1,4 +1,4 @@
1
- /* hash: nnjeq */
1
+ /* hash: 10wmb */
2
2
  :root {
3
3
  --color-light-bg-primary: #fff;
4
4
  }
@@ -10,14 +10,14 @@
10
10
 
11
11
  /* Hard up */
12
12
  }
13
- .base-modal__component_nnjeq {
13
+ .base-modal__component_t7alb {
14
14
  position: relative;
15
15
  box-sizing: border-box;
16
16
  background: var(--color-light-bg-primary);
17
17
  margin: auto;
18
18
  flex-shrink: 0;
19
19
  }
20
- .base-modal__wrapper_nnjeq {
20
+ .base-modal__wrapper_t7alb {
21
21
  position: fixed;
22
22
  top: 0;
23
23
  left: 0;
@@ -30,33 +30,33 @@
30
30
  align-items: center;
31
31
  outline: 0;
32
32
  }
33
- .base-modal__content_nnjeq {
33
+ .base-modal__content_t7alb {
34
34
  width: 100%;
35
35
  height: 100%;
36
36
  display: flex;
37
37
  flex-direction: column;
38
38
  flex: 1;
39
39
  }
40
- .base-modal__hidden_nnjeq {
40
+ .base-modal__hidden_t7alb {
41
41
  display: none;
42
42
  }
43
- .base-modal__backdrop_nnjeq {
43
+ .base-modal__backdrop_t7alb {
44
44
  z-index: 0;
45
45
  }
46
- .base-modal__appear_nnjeq,
47
- .base-modal__enter_nnjeq {
46
+ .base-modal__appear_t7alb,
47
+ .base-modal__enter_t7alb {
48
48
  opacity: 0;
49
49
  }
50
- .base-modal__appearActive_nnjeq,
51
- .base-modal__enterActive_nnjeq {
50
+ .base-modal__appearActive_t7alb,
51
+ .base-modal__enterActive_t7alb {
52
52
  opacity: 1;
53
53
  transition: opacity 200ms ease-in;
54
54
  }
55
- .base-modal__exit_nnjeq {
55
+ .base-modal__exit_t7alb {
56
56
  opacity: 1;
57
57
  }
58
- .base-modal__exitActive_nnjeq,
59
- .base-modal__exitDone_nnjeq {
58
+ .base-modal__exitActive_t7alb,
59
+ .base-modal__exitDone_t7alb {
60
60
  opacity: 0;
61
61
  transition: opacity 200ms ease-out;
62
62
  }
package/dist/esm/index.js CHANGED
@@ -8,4 +8,5 @@ import 'react-focus-lock';
8
8
  import '@alfalab/core-components-portal/dist/esm';
9
9
  import '@alfalab/core-components-backdrop/dist/esm';
10
10
  import '@alfalab/core-components-stack/dist/esm';
11
+ import '@alfalab/core-components-global-store/dist/esm';
11
12
  export { handleContainer, hasScrollbar, isScrolledToBottom, isScrolledToTop, restoreContainerStyles } from './utils.js';
package/dist/esm/utils.js CHANGED
@@ -1,3 +1,5 @@
1
+ import { getModalStore } from '@alfalab/core-components-global-store/dist/esm';
2
+
1
3
  function isScrolledToTop(target) {
2
4
  return target.scrollTop <= 0;
3
5
  }
@@ -28,15 +30,15 @@ var isOverflowing = function (container) {
28
30
  var getPaddingRight = function (node) {
29
31
  return parseInt(window.getComputedStyle(node).paddingRight, 10) || 0;
30
32
  };
31
- var restoreStylesStore = [];
32
33
  var restoreContainerStyles = function (container) {
33
- var index = restoreStylesStore.findIndex(function (s) { return s.container === container; });
34
- var existingStyles = restoreStylesStore[index];
34
+ var modalRestoreStyles = getModalStore().getRestoreStyles();
35
+ var index = modalRestoreStyles.findIndex(function (s) { return s.container === container; });
36
+ var existingStyles = modalRestoreStyles[index];
35
37
  if (!existingStyles)
36
38
  return;
37
39
  existingStyles.modals -= 1;
38
40
  if (existingStyles.modals <= 0) {
39
- restoreStylesStore.splice(index, 1);
41
+ modalRestoreStyles.splice(index, 1);
40
42
  existingStyles.styles.forEach(function (_a) {
41
43
  var value = _a.value, el = _a.el, key = _a.key;
42
44
  if (value) {
@@ -51,7 +53,8 @@ var restoreContainerStyles = function (container) {
51
53
  var handleContainer = function (container) {
52
54
  if (!container)
53
55
  return;
54
- var existingStyles = restoreStylesStore.find(function (s) { return s.container === container; });
56
+ var modalRestoreStyles = getModalStore().getRestoreStyles();
57
+ var existingStyles = modalRestoreStyles.find(function (s) { return s.container === container; });
55
58
  if (existingStyles) {
56
59
  existingStyles.modals += 1;
57
60
  return;
@@ -86,7 +89,7 @@ var handleContainer = function (container) {
86
89
  });
87
90
  }
88
91
  scrollContainer.style.overflow = 'hidden';
89
- restoreStylesStore.push({
92
+ modalRestoreStyles.push({
90
93
  container: container,
91
94
  modals: 1,
92
95
  styles: containerStyles,
package/dist/index.css CHANGED
@@ -1,4 +1,4 @@
1
- /* hash: nnjeq */
1
+ /* hash: 10wmb */
2
2
  :root {
3
3
  --color-light-bg-primary: #fff;
4
4
  }
@@ -10,14 +10,14 @@
10
10
 
11
11
  /* Hard up */
12
12
  }
13
- .base-modal__component_nnjeq {
13
+ .base-modal__component_t7alb {
14
14
  position: relative;
15
15
  box-sizing: border-box;
16
16
  background: var(--color-light-bg-primary);
17
17
  margin: auto;
18
18
  flex-shrink: 0;
19
19
  }
20
- .base-modal__wrapper_nnjeq {
20
+ .base-modal__wrapper_t7alb {
21
21
  position: fixed;
22
22
  top: 0;
23
23
  left: 0;
@@ -30,33 +30,33 @@
30
30
  align-items: center;
31
31
  outline: 0;
32
32
  }
33
- .base-modal__content_nnjeq {
33
+ .base-modal__content_t7alb {
34
34
  width: 100%;
35
35
  height: 100%;
36
36
  display: flex;
37
37
  flex-direction: column;
38
38
  flex: 1;
39
39
  }
40
- .base-modal__hidden_nnjeq {
40
+ .base-modal__hidden_t7alb {
41
41
  display: none;
42
42
  }
43
- .base-modal__backdrop_nnjeq {
43
+ .base-modal__backdrop_t7alb {
44
44
  z-index: 0;
45
45
  }
46
- .base-modal__appear_nnjeq,
47
- .base-modal__enter_nnjeq {
46
+ .base-modal__appear_t7alb,
47
+ .base-modal__enter_t7alb {
48
48
  opacity: 0;
49
49
  }
50
- .base-modal__appearActive_nnjeq,
51
- .base-modal__enterActive_nnjeq {
50
+ .base-modal__appearActive_t7alb,
51
+ .base-modal__enterActive_t7alb {
52
52
  opacity: 1;
53
53
  transition: opacity 200ms ease-in;
54
54
  }
55
- .base-modal__exit_nnjeq {
55
+ .base-modal__exit_t7alb {
56
56
  opacity: 1;
57
57
  }
58
- .base-modal__exitActive_nnjeq,
59
- .base-modal__exitDone_nnjeq {
58
+ .base-modal__exitActive_t7alb,
59
+ .base-modal__exitDone_t7alb {
60
60
  opacity: 0;
61
61
  transition: opacity 200ms ease-out;
62
62
  }
package/dist/index.js CHANGED
@@ -12,6 +12,7 @@ require('react-focus-lock');
12
12
  require('@alfalab/core-components-portal');
13
13
  require('@alfalab/core-components-backdrop');
14
14
  require('@alfalab/core-components-stack');
15
+ require('@alfalab/core-components-global-store');
15
16
  var utils = require('./utils.js');
16
17
 
17
18
 
@@ -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;
@@ -115,6 +119,8 @@ type BaseModalContext = {
115
119
  hasScroll?: boolean;
116
120
  headerHighlighted?: boolean;
117
121
  footerHighlighted?: boolean;
122
+ headerOffset?: number;
123
+ setHeaderOffset: (offset: number) => void;
118
124
  contentRef: Ref<HTMLElement>;
119
125
  setHasHeader: (exists: boolean) => void;
120
126
  setHasFooter: (exists: boolean) => void;
@@ -7,9 +7,10 @@ import FocusLock from 'react-focus-lock';
7
7
  import { Portal } from '@alfalab/core-components-portal/dist/modern';
8
8
  import { Backdrop } from '@alfalab/core-components-backdrop/dist/modern';
9
9
  import { stackingOrder, Stack } from '@alfalab/core-components-stack/dist/modern';
10
+ import '@alfalab/core-components-global-store/dist/modern';
10
11
  import { isScrolledToTop, isScrolledToBottom, handleContainer, restoreContainerStyles, hasScrollbar } from './utils.js';
11
12
 
12
- var styles = {"component":"base-modal__component_nnjeq","wrapper":"base-modal__wrapper_nnjeq","content":"base-modal__content_nnjeq","hidden":"base-modal__hidden_nnjeq","backdrop":"base-modal__backdrop_nnjeq","appear":"base-modal__appear_nnjeq","enter":"base-modal__enter_nnjeq","appearActive":"base-modal__appearActive_nnjeq","enterActive":"base-modal__enterActive_nnjeq","exit":"base-modal__exit_nnjeq","exitActive":"base-modal__exitActive_nnjeq","exitDone":"base-modal__exitDone_nnjeq"};
13
+ var styles = {"component":"base-modal__component_t7alb","wrapper":"base-modal__wrapper_t7alb","content":"base-modal__content_t7alb","hidden":"base-modal__hidden_t7alb","backdrop":"base-modal__backdrop_t7alb","appear":"base-modal__appear_t7alb","enter":"base-modal__enter_t7alb","appearActive":"base-modal__appearActive_t7alb","enterActive":"base-modal__enterActive_t7alb","exit":"base-modal__exit_t7alb","exitActive":"base-modal__exitActive_t7alb","exitDone":"base-modal__exitDone_t7alb"};
13
14
  require('./index.css')
14
15
 
15
16
  /* eslint-disable jsx-a11y/no-noninteractive-element-interactions */
@@ -19,19 +20,22 @@ const BaseModalContext = React.createContext({
19
20
  hasScroll: false,
20
21
  headerHighlighted: false,
21
22
  footerHighlighted: false,
23
+ headerOffset: 0,
24
+ setHeaderOffset: () => null,
22
25
  contentRef: () => null,
23
26
  setHasHeader: () => null,
24
27
  setHasFooter: () => null,
25
28
  onClose: () => null,
26
29
  });
27
- const BaseModal = forwardRef(({ open, container, children, scrollHandler = 'wrapper', Backdrop: Backdrop$1 = Backdrop, backdropProps = {}, transitionProps = {}, disableBackdropClick, disableAutoFocus = false, disableFocusLock = false, disableEscapeKeyDown = false, disableRestoreFocus = false, keepMounted = false, className, contentClassName, wrapperClassName, onBackdropClick, onClose, onEscapeKeyDown, onMount, onUnmount, dataTestId, zIndex = stackingOrder.MODAL, }, ref) => {
30
+ const BaseModal = forwardRef(({ open, container, children, scrollHandler = 'wrapper', Backdrop: Backdrop$1 = Backdrop, backdropProps = {}, transitionProps = {}, disableBackdropClick, disableAutoFocus = false, disableFocusLock = false, disableEscapeKeyDown = false, disableRestoreFocus = false, keepMounted = false, className, contentClassName, wrapperClassName, onBackdropClick, onClose, onEscapeKeyDown, onMount, onUnmount, dataTestId, zIndex = stackingOrder.MODAL, componentRef = null, }, ref) => {
28
31
  const [exited, setExited] = useState(!open);
29
32
  const [hasScroll, setHasScroll] = useState(false);
30
33
  const [hasHeader, setHasHeader] = useState(false);
31
34
  const [hasFooter, setHasFooter] = useState(false);
32
35
  const [headerHighlighted, setHeaderHighlighted] = useState(false);
33
36
  const [footerHighlighted, setFooterHighlighted] = useState(false);
34
- const componentRef = useRef(null);
37
+ const [headerOffset, setHeaderOffset] = useState(0);
38
+ const componentNodeRef = useRef(null);
35
39
  const wrapperRef = useRef(null);
36
40
  const scrollableNodeRef = useRef(null);
37
41
  const contentNodeRef = useRef(null);
@@ -65,17 +69,18 @@ const BaseModal = forwardRef(({ open, container, children, scrollHandler = 'wrap
65
69
  }
66
70
  }, [resizeObserver]);
67
71
  const handleScroll = useCallback(() => {
68
- if (!scrollableNodeRef.current || !componentRef.current)
72
+ if (!scrollableNodeRef.current || !componentNodeRef.current)
69
73
  return;
70
74
  if (hasHeader) {
71
75
  setHeaderHighlighted(!isScrolledToTop(scrollableNodeRef.current) &&
72
- componentRef.current.getBoundingClientRect().top <= 0);
76
+ componentNodeRef.current.getBoundingClientRect().top - headerOffset <= 0);
73
77
  }
74
78
  if (hasFooter) {
75
79
  setFooterHighlighted(!isScrolledToBottom(scrollableNodeRef.current) &&
76
- componentRef.current.getBoundingClientRect().bottom >= window.innerHeight);
80
+ componentNodeRef.current.getBoundingClientRect().bottom >=
81
+ window.innerHeight);
77
82
  }
78
- }, [hasFooter, hasHeader]);
83
+ }, [hasFooter, hasHeader, headerOffset]);
79
84
  const handleClose = useCallback((event, reason) => {
80
85
  if (onClose) {
81
86
  onClose(event, reason);
@@ -111,7 +116,7 @@ const BaseModal = forwardRef(({ open, container, children, scrollHandler = 'wrap
111
116
  if (scrollHandler === 'wrapper')
112
117
  return wrapperRef.current;
113
118
  if (scrollHandler === 'content')
114
- return componentRef.current;
119
+ return componentNodeRef.current;
115
120
  return scrollHandler.current || wrapperRef.current;
116
121
  }, [scrollHandler]);
117
122
  const handleEntered = useCallback((node, isAppearing) => {
@@ -170,6 +175,8 @@ const BaseModal = forwardRef(({ open, container, children, scrollHandler = 'wrap
170
175
  hasScroll,
171
176
  headerHighlighted,
172
177
  footerHighlighted,
178
+ headerOffset,
179
+ setHeaderOffset,
173
180
  contentRef,
174
181
  setHasHeader,
175
182
  setHasFooter,
@@ -181,6 +188,8 @@ const BaseModal = forwardRef(({ open, container, children, scrollHandler = 'wrap
181
188
  hasScroll,
182
189
  headerHighlighted,
183
190
  footerHighlighted,
191
+ headerOffset,
192
+ setHeaderOffset,
184
193
  handleClose,
185
194
  ]);
186
195
  if (!shouldRender)
@@ -197,7 +206,7 @@ const BaseModal = forwardRef(({ open, container, children, scrollHandler = 'wrap
197
206
  zIndex: computedZIndex,
198
207
  } },
199
208
  React.createElement(CSSTransition, Object.assign({ appear: true, timeout: 200, classNames: styles }, transitionProps, { in: open, onEntered: handleEntered, onExited: handleExited }),
200
- React.createElement("div", { className: cn(styles.component, className), ref: componentRef },
209
+ React.createElement("div", { className: cn(styles.component, className), ref: mergeRefs([componentRef, componentNodeRef]) },
201
210
  React.createElement("div", { className: cn(styles.content, contentClassName) }, children))))))))));
202
211
  });
203
212
 
@@ -1,4 +1,4 @@
1
- /* hash: nnjeq */
1
+ /* hash: 10wmb */
2
2
  :root {
3
3
  --color-light-bg-primary: #fff;
4
4
  }
@@ -10,14 +10,14 @@
10
10
 
11
11
  /* Hard up */
12
12
  }
13
- .base-modal__component_nnjeq {
13
+ .base-modal__component_t7alb {
14
14
  position: relative;
15
15
  box-sizing: border-box;
16
16
  background: var(--color-light-bg-primary);
17
17
  margin: auto;
18
18
  flex-shrink: 0;
19
19
  }
20
- .base-modal__wrapper_nnjeq {
20
+ .base-modal__wrapper_t7alb {
21
21
  position: fixed;
22
22
  top: 0;
23
23
  left: 0;
@@ -30,33 +30,33 @@
30
30
  align-items: center;
31
31
  outline: 0;
32
32
  }
33
- .base-modal__content_nnjeq {
33
+ .base-modal__content_t7alb {
34
34
  width: 100%;
35
35
  height: 100%;
36
36
  display: flex;
37
37
  flex-direction: column;
38
38
  flex: 1;
39
39
  }
40
- .base-modal__hidden_nnjeq {
40
+ .base-modal__hidden_t7alb {
41
41
  display: none;
42
42
  }
43
- .base-modal__backdrop_nnjeq {
43
+ .base-modal__backdrop_t7alb {
44
44
  z-index: 0;
45
45
  }
46
- .base-modal__appear_nnjeq,
47
- .base-modal__enter_nnjeq {
46
+ .base-modal__appear_t7alb,
47
+ .base-modal__enter_t7alb {
48
48
  opacity: 0;
49
49
  }
50
- .base-modal__appearActive_nnjeq,
51
- .base-modal__enterActive_nnjeq {
50
+ .base-modal__appearActive_t7alb,
51
+ .base-modal__enterActive_t7alb {
52
52
  opacity: 1;
53
53
  transition: opacity 200ms ease-in;
54
54
  }
55
- .base-modal__exit_nnjeq {
55
+ .base-modal__exit_t7alb {
56
56
  opacity: 1;
57
57
  }
58
- .base-modal__exitActive_nnjeq,
59
- .base-modal__exitDone_nnjeq {
58
+ .base-modal__exitActive_t7alb,
59
+ .base-modal__exitDone_t7alb {
60
60
  opacity: 0;
61
61
  transition: opacity 200ms ease-out;
62
62
  }
@@ -7,5 +7,6 @@ import 'react-focus-lock';
7
7
  import '@alfalab/core-components-portal/dist/modern';
8
8
  import '@alfalab/core-components-backdrop/dist/modern';
9
9
  import '@alfalab/core-components-stack/dist/modern';
10
+ import '@alfalab/core-components-global-store/dist/modern';
10
11
  export { handleContainer, hasScrollbar, isScrolledToBottom, isScrolledToTop, restoreContainerStyles } from './utils.js';
11
12
  export { BaseModal, BaseModalContext } from './Component.js';
@@ -1,3 +1,5 @@
1
+ import { getModalStore } from '@alfalab/core-components-global-store/dist/modern';
2
+
1
3
  function isScrolledToTop(target) {
2
4
  return target.scrollTop <= 0;
3
5
  }
@@ -28,15 +30,15 @@ const isOverflowing = (container) => {
28
30
  const getPaddingRight = (node) => {
29
31
  return parseInt(window.getComputedStyle(node).paddingRight, 10) || 0;
30
32
  };
31
- const restoreStylesStore = [];
32
33
  const restoreContainerStyles = (container) => {
33
- const index = restoreStylesStore.findIndex(s => s.container === container);
34
- const existingStyles = restoreStylesStore[index];
34
+ const modalRestoreStyles = getModalStore().getRestoreStyles();
35
+ const index = modalRestoreStyles.findIndex(s => s.container === container);
36
+ const existingStyles = modalRestoreStyles[index];
35
37
  if (!existingStyles)
36
38
  return;
37
39
  existingStyles.modals -= 1;
38
40
  if (existingStyles.modals <= 0) {
39
- restoreStylesStore.splice(index, 1);
41
+ modalRestoreStyles.splice(index, 1);
40
42
  existingStyles.styles.forEach(({ value, el, key }) => {
41
43
  if (value) {
42
44
  el.style.setProperty(key, value);
@@ -50,7 +52,8 @@ const restoreContainerStyles = (container) => {
50
52
  const handleContainer = (container) => {
51
53
  if (!container)
52
54
  return;
53
- const existingStyles = restoreStylesStore.find(s => s.container === container);
55
+ const modalRestoreStyles = getModalStore().getRestoreStyles();
56
+ const existingStyles = modalRestoreStyles.find(s => s.container === container);
54
57
  if (existingStyles) {
55
58
  existingStyles.modals += 1;
56
59
  return;
@@ -85,7 +88,7 @@ const handleContainer = (container) => {
85
88
  });
86
89
  }
87
90
  scrollContainer.style.overflow = 'hidden';
88
- restoreStylesStore.push({
91
+ modalRestoreStyles.push({
89
92
  container,
90
93
  modals: 1,
91
94
  styles: containerStyles,
package/dist/utils.js CHANGED
@@ -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');
6
+
5
7
  function isScrolledToTop(target) {
6
8
  return target.scrollTop <= 0;
7
9
  }
@@ -32,15 +34,15 @@ var isOverflowing = function (container) {
32
34
  var getPaddingRight = function (node) {
33
35
  return parseInt(window.getComputedStyle(node).paddingRight, 10) || 0;
34
36
  };
35
- var restoreStylesStore = [];
36
37
  var restoreContainerStyles = function (container) {
37
- var index = restoreStylesStore.findIndex(function (s) { return s.container === container; });
38
- var existingStyles = restoreStylesStore[index];
38
+ var modalRestoreStyles = coreComponentsGlobalStore.getModalStore().getRestoreStyles();
39
+ var index = modalRestoreStyles.findIndex(function (s) { return s.container === container; });
40
+ var existingStyles = modalRestoreStyles[index];
39
41
  if (!existingStyles)
40
42
  return;
41
43
  existingStyles.modals -= 1;
42
44
  if (existingStyles.modals <= 0) {
43
- restoreStylesStore.splice(index, 1);
45
+ modalRestoreStyles.splice(index, 1);
44
46
  existingStyles.styles.forEach(function (_a) {
45
47
  var value = _a.value, el = _a.el, key = _a.key;
46
48
  if (value) {
@@ -55,7 +57,8 @@ var restoreContainerStyles = function (container) {
55
57
  var handleContainer = function (container) {
56
58
  if (!container)
57
59
  return;
58
- var existingStyles = restoreStylesStore.find(function (s) { return s.container === container; });
60
+ var modalRestoreStyles = coreComponentsGlobalStore.getModalStore().getRestoreStyles();
61
+ var existingStyles = modalRestoreStyles.find(function (s) { return s.container === container; });
59
62
  if (existingStyles) {
60
63
  existingStyles.modals += 1;
61
64
  return;
@@ -90,7 +93,7 @@ var handleContainer = function (container) {
90
93
  });
91
94
  }
92
95
  scrollContainer.style.overflow = 'hidden';
93
- restoreStylesStore.push({
96
+ modalRestoreStyles.push({
94
97
  container: container,
95
98
  modals: 1,
96
99
  styles: containerStyles,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfalab/core-components-base-modal",
3
- "version": "3.0.2",
3
+ "version": "4.0.0",
4
4
  "description": "BaseModal component",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -16,6 +16,7 @@
16
16
  },
17
17
  "dependencies": {
18
18
  "@alfalab/core-components-backdrop": "^2.0.1",
19
+ "@alfalab/core-components-global-store": "^1.1.0",
19
20
  "@alfalab/core-components-portal": "^2.0.1",
20
21
  "@alfalab/core-components-stack": "^3.0.1",
21
22
  "classnames": "^2.2.6",
@@ -30,5 +31,5 @@
30
31
  "peerDependencies": {
31
32
  "react": "^16.9.0 || ^17.0.1"
32
33
  },
33
- "gitHead": "a80a4377703da0cb8fd257612117ef3eb2d9bc42"
34
+ "gitHead": "ae23b2de3600ef2921e125b35916a8b95cd1a909"
34
35
  }