@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 +39 -0
- package/dist/Component.d.ts +6 -0
- package/dist/Component.js +24 -15
- package/dist/cssm/Component.d.ts +6 -0
- package/dist/cssm/Component.js +23 -14
- package/dist/cssm/index.js +1 -0
- package/dist/cssm/utils.js +9 -6
- package/dist/esm/Component.d.ts +6 -0
- package/dist/esm/Component.js +24 -15
- package/dist/esm/index.css +13 -13
- package/dist/esm/index.js +1 -0
- package/dist/esm/utils.js +9 -6
- package/dist/index.css +13 -13
- package/dist/index.js +1 -0
- package/dist/modern/Component.d.ts +6 -0
- package/dist/modern/Component.js +18 -9
- package/dist/modern/index.css +13 -13
- package/dist/modern/index.js +1 -0
- package/dist/modern/utils.js +9 -6
- package/dist/utils.js +9 -6
- package/package.json +3 -2
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
|
|
package/dist/Component.d.ts
CHANGED
|
@@ -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-
|
|
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
|
|
67
|
-
var
|
|
68
|
-
var
|
|
69
|
-
var
|
|
70
|
-
var
|
|
71
|
-
var
|
|
72
|
-
var
|
|
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 || !
|
|
110
|
+
if (!scrollableNodeRef.current || !componentNodeRef.current)
|
|
107
111
|
return;
|
|
108
112
|
if (hasHeader) {
|
|
109
113
|
setHeaderHighlighted(!utils.isScrolledToTop(scrollableNodeRef.current) &&
|
|
110
|
-
|
|
114
|
+
componentNodeRef.current.getBoundingClientRect().top - headerOffset <= 0);
|
|
111
115
|
}
|
|
112
116
|
if (hasFooter) {
|
|
113
117
|
setFooterHighlighted(!utils.isScrolledToBottom(scrollableNodeRef.current) &&
|
|
114
|
-
|
|
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
|
|
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
|
});
|
package/dist/cssm/Component.d.ts
CHANGED
|
@@ -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/cssm/Component.js
CHANGED
|
@@ -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
|
|
66
|
-
var
|
|
67
|
-
var
|
|
68
|
-
var
|
|
69
|
-
var
|
|
70
|
-
var
|
|
71
|
-
var
|
|
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 || !
|
|
109
|
+
if (!scrollableNodeRef.current || !componentNodeRef.current)
|
|
106
110
|
return;
|
|
107
111
|
if (hasHeader) {
|
|
108
112
|
setHeaderHighlighted(!utils.isScrolledToTop(scrollableNodeRef.current) &&
|
|
109
|
-
|
|
113
|
+
componentNodeRef.current.getBoundingClientRect().top - headerOffset <= 0);
|
|
110
114
|
}
|
|
111
115
|
if (hasFooter) {
|
|
112
116
|
setFooterHighlighted(!utils.isScrolledToBottom(scrollableNodeRef.current) &&
|
|
113
|
-
|
|
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
|
|
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
|
});
|
package/dist/cssm/index.js
CHANGED
|
@@ -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
|
|
package/dist/cssm/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/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
|
|
38
|
-
var
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
96
|
+
modalRestoreStyles.push({
|
|
94
97
|
container: container,
|
|
95
98
|
modals: 1,
|
|
96
99
|
styles: containerStyles,
|
package/dist/esm/Component.d.ts
CHANGED
|
@@ -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/esm/Component.js
CHANGED
|
@@ -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-
|
|
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
|
|
56
|
-
var
|
|
57
|
-
var
|
|
58
|
-
var
|
|
59
|
-
var
|
|
60
|
-
var
|
|
61
|
-
var
|
|
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 || !
|
|
99
|
+
if (!scrollableNodeRef.current || !componentNodeRef.current)
|
|
96
100
|
return;
|
|
97
101
|
if (hasHeader) {
|
|
98
102
|
setHeaderHighlighted(!isScrolledToTop(scrollableNodeRef.current) &&
|
|
99
|
-
|
|
103
|
+
componentNodeRef.current.getBoundingClientRect().top - headerOffset <= 0);
|
|
100
104
|
}
|
|
101
105
|
if (hasFooter) {
|
|
102
106
|
setFooterHighlighted(!isScrolledToBottom(scrollableNodeRef.current) &&
|
|
103
|
-
|
|
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
|
|
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
|
});
|
package/dist/esm/index.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* hash:
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
40
|
+
.base-modal__hidden_t7alb {
|
|
41
41
|
display: none;
|
|
42
42
|
}
|
|
43
|
-
.base-
|
|
43
|
+
.base-modal__backdrop_t7alb {
|
|
44
44
|
z-index: 0;
|
|
45
45
|
}
|
|
46
|
-
.base-
|
|
47
|
-
.base-
|
|
46
|
+
.base-modal__appear_t7alb,
|
|
47
|
+
.base-modal__enter_t7alb {
|
|
48
48
|
opacity: 0;
|
|
49
49
|
}
|
|
50
|
-
.base-
|
|
51
|
-
.base-
|
|
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-
|
|
55
|
+
.base-modal__exit_t7alb {
|
|
56
56
|
opacity: 1;
|
|
57
57
|
}
|
|
58
|
-
.base-
|
|
59
|
-
.base-
|
|
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
|
|
34
|
-
var
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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:
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
40
|
+
.base-modal__hidden_t7alb {
|
|
41
41
|
display: none;
|
|
42
42
|
}
|
|
43
|
-
.base-
|
|
43
|
+
.base-modal__backdrop_t7alb {
|
|
44
44
|
z-index: 0;
|
|
45
45
|
}
|
|
46
|
-
.base-
|
|
47
|
-
.base-
|
|
46
|
+
.base-modal__appear_t7alb,
|
|
47
|
+
.base-modal__enter_t7alb {
|
|
48
48
|
opacity: 0;
|
|
49
49
|
}
|
|
50
|
-
.base-
|
|
51
|
-
.base-
|
|
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-
|
|
55
|
+
.base-modal__exit_t7alb {
|
|
56
56
|
opacity: 1;
|
|
57
57
|
}
|
|
58
|
-
.base-
|
|
59
|
-
.base-
|
|
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;
|
package/dist/modern/Component.js
CHANGED
|
@@ -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-
|
|
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
|
|
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 || !
|
|
72
|
+
if (!scrollableNodeRef.current || !componentNodeRef.current)
|
|
69
73
|
return;
|
|
70
74
|
if (hasHeader) {
|
|
71
75
|
setHeaderHighlighted(!isScrolledToTop(scrollableNodeRef.current) &&
|
|
72
|
-
|
|
76
|
+
componentNodeRef.current.getBoundingClientRect().top - headerOffset <= 0);
|
|
73
77
|
}
|
|
74
78
|
if (hasFooter) {
|
|
75
79
|
setFooterHighlighted(!isScrolledToBottom(scrollableNodeRef.current) &&
|
|
76
|
-
|
|
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
|
|
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
|
|
package/dist/modern/index.css
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/* hash:
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
40
|
+
.base-modal__hidden_t7alb {
|
|
41
41
|
display: none;
|
|
42
42
|
}
|
|
43
|
-
.base-
|
|
43
|
+
.base-modal__backdrop_t7alb {
|
|
44
44
|
z-index: 0;
|
|
45
45
|
}
|
|
46
|
-
.base-
|
|
47
|
-
.base-
|
|
46
|
+
.base-modal__appear_t7alb,
|
|
47
|
+
.base-modal__enter_t7alb {
|
|
48
48
|
opacity: 0;
|
|
49
49
|
}
|
|
50
|
-
.base-
|
|
51
|
-
.base-
|
|
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-
|
|
55
|
+
.base-modal__exit_t7alb {
|
|
56
56
|
opacity: 1;
|
|
57
57
|
}
|
|
58
|
-
.base-
|
|
59
|
-
.base-
|
|
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/modern/index.js
CHANGED
|
@@ -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';
|
package/dist/modern/utils.js
CHANGED
|
@@ -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
|
|
34
|
-
const
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
38
|
-
var
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
+
"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": "
|
|
34
|
+
"gitHead": "ae23b2de3600ef2921e125b35916a8b95cd1a909"
|
|
34
35
|
}
|