@ozen-ui/kit 0.7.0 → 0.8.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/__inner__/cjs/components/Modal/Modal.css +4 -8
- package/__inner__/cjs/components/Modal/Modal.d.ts +17 -1
- package/__inner__/cjs/components/Modal/Modal.js +13 -21
- package/__inner__/cjs/components/Modal/components/ModalConsumer.d.ts +5 -0
- package/__inner__/cjs/components/Modal/components/ModalConsumer.js +15 -0
- package/__inner__/cjs/components/Modal/components/index.d.ts +1 -0
- package/__inner__/cjs/components/Modal/components/index.js +4 -0
- package/__inner__/cjs/hooks/useLockBodyScroll/index.d.ts +1 -0
- package/__inner__/cjs/hooks/useLockBodyScroll/index.js +4 -0
- package/__inner__/cjs/hooks/useLockBodyScroll/useLockBodyScroll.d.ts +1 -0
- package/__inner__/cjs/hooks/useLockBodyScroll/useLockBodyScroll.js +18 -0
- package/__inner__/esm/components/Modal/Modal.css +4 -8
- package/__inner__/esm/components/Modal/Modal.d.ts +17 -1
- package/__inner__/esm/components/Modal/Modal.js +13 -21
- package/__inner__/esm/components/Modal/components/ModalConsumer.d.ts +5 -0
- package/__inner__/esm/components/Modal/components/ModalConsumer.js +12 -0
- package/__inner__/esm/components/Modal/components/index.d.ts +1 -0
- package/__inner__/esm/components/Modal/components/index.js +1 -0
- package/__inner__/esm/hooks/useLockBodyScroll/index.d.ts +1 -0
- package/__inner__/esm/hooks/useLockBodyScroll/index.js +1 -0
- package/__inner__/esm/hooks/useLockBodyScroll/useLockBodyScroll.d.ts +1 -0
- package/__inner__/esm/hooks/useLockBodyScroll/useLockBodyScroll.js +14 -0
- package/package.json +1 -1
- package/useLockBodyScroll/package.json +5 -0
|
@@ -1,22 +1,18 @@
|
|
|
1
|
-
.no-scroll {
|
|
2
|
-
overflow: hidden;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
1
|
.Modal {
|
|
6
2
|
position: fixed;
|
|
7
3
|
z-index: var(--z-index-modal);
|
|
8
4
|
inset: 0;
|
|
9
5
|
}
|
|
10
6
|
|
|
11
|
-
.Modal:not(.Modal_hasBackdrop) {
|
|
7
|
+
.Modal:not(.Modal_hasBackdrop) {
|
|
12
8
|
pointer-events: none;
|
|
13
9
|
}
|
|
14
10
|
|
|
15
|
-
.Modal:not(.Modal_hasBackdrop) .Modal-Window {
|
|
11
|
+
.Modal:not(.Modal_hasBackdrop) .Modal-Window {
|
|
16
12
|
pointer-events: auto;
|
|
17
13
|
}
|
|
18
14
|
|
|
19
|
-
.Modal-Window {
|
|
15
|
+
.Modal-Window {
|
|
20
16
|
position: absolute;
|
|
21
17
|
inset-block-start: 50%;
|
|
22
18
|
inset-inline-start: 50%;
|
|
@@ -27,7 +23,7 @@
|
|
|
27
23
|
padding: var(--space-2xl);
|
|
28
24
|
}
|
|
29
25
|
|
|
30
|
-
.Modal_hidden {
|
|
26
|
+
.Modal_hidden {
|
|
31
27
|
visibility: hidden;
|
|
32
28
|
}
|
|
33
29
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './Modal.css';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import type { ReactNode } from 'react';
|
|
3
|
+
import type { ReactNode, RefObject } from 'react';
|
|
4
4
|
import { CSSTransitionProps } from 'react-transition-group/CSSTransition';
|
|
5
5
|
import { type BackdropProps } from '../Backdrop';
|
|
6
6
|
import { type PaperProps } from '../Paper';
|
|
@@ -30,6 +30,12 @@ export type ModalProps = {
|
|
|
30
30
|
hideBackdrop?: boolean;
|
|
31
31
|
/** Если {true} предотвращает размонтирование компонента при событии закрыть */
|
|
32
32
|
keepMounted?: boolean;
|
|
33
|
+
/** Если {true} отключает блокировку прокрутки основного экрана приложения */
|
|
34
|
+
disableScrollLock?: boolean;
|
|
35
|
+
/** Если {true} отключает закрытие окна при клике за его пределами */
|
|
36
|
+
disableClickOutside?: boolean;
|
|
37
|
+
/** Если {true} отключает закрытие окна при нажатии на клавишу ESC */
|
|
38
|
+
disableEscapeKeyDown?: boolean;
|
|
33
39
|
/** Свойства компонента Backdrop (подложка) */
|
|
34
40
|
backdropProps?: BackdropProps & {
|
|
35
41
|
'data-testid'?: string;
|
|
@@ -48,6 +54,8 @@ export type ModalProps = {
|
|
|
48
54
|
'data-testid'?: string;
|
|
49
55
|
/** Контейнер для монтирования всплывающего окна */
|
|
50
56
|
container?: PortalProps['container'];
|
|
57
|
+
/** Список ссылок на элементы при клике на которые Modal не будет закрываться (см. хук useClickOutside) */
|
|
58
|
+
ignoreClickOutsideRefs?: Array<RefObject<HTMLElement>>;
|
|
51
59
|
} & PortalProps;
|
|
52
60
|
export type ModalRef = PortalRef;
|
|
53
61
|
export declare const Modal: React.ForwardRefExoticComponent<{
|
|
@@ -74,6 +82,12 @@ export declare const Modal: React.ForwardRefExoticComponent<{
|
|
|
74
82
|
hideBackdrop?: boolean | undefined;
|
|
75
83
|
/** Если {true} предотвращает размонтирование компонента при событии закрыть */
|
|
76
84
|
keepMounted?: boolean | undefined;
|
|
85
|
+
/** Если {true} отключает блокировку прокрутки основного экрана приложения */
|
|
86
|
+
disableScrollLock?: boolean | undefined;
|
|
87
|
+
/** Если {true} отключает закрытие окна при клике за его пределами */
|
|
88
|
+
disableClickOutside?: boolean | undefined;
|
|
89
|
+
/** Если {true} отключает закрытие окна при нажатии на клавишу ESC */
|
|
90
|
+
disableEscapeKeyDown?: boolean | undefined;
|
|
77
91
|
/** Свойства компонента Backdrop (подложка) */
|
|
78
92
|
backdropProps?: (import("../Backdrop").BackdropBaseProps & {
|
|
79
93
|
as?: "div" | undefined;
|
|
@@ -100,6 +114,8 @@ export declare const Modal: React.ForwardRefExoticComponent<{
|
|
|
100
114
|
'data-testid'?: string | undefined;
|
|
101
115
|
/** Контейнер для монтирования всплывающего окна */
|
|
102
116
|
container?: PortalProps['container'];
|
|
117
|
+
/** Список ссылок на элементы при клике на которые Modal не будет закрываться (см. хук useClickOutside) */
|
|
118
|
+
ignoreClickOutsideRefs?: React.RefObject<HTMLElement>[] | undefined;
|
|
103
119
|
} & import("../Portal").PortalBaseProps & {
|
|
104
120
|
as?: "div" | undefined;
|
|
105
121
|
} & Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "container"> & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -12,25 +12,27 @@ var useMultiRef_1 = require("../../hooks/useMultiRef");
|
|
|
12
12
|
var classname_1 = require("../../utils/classname");
|
|
13
13
|
var isKey_1 = require("../../utils/isKey");
|
|
14
14
|
var Backdrop_1 = require("../Backdrop");
|
|
15
|
-
var Paper_1 = require("../Paper");
|
|
16
15
|
var Portal_1 = require("../Portal");
|
|
16
|
+
var components_1 = require("./components");
|
|
17
17
|
var index_1 = require("./index");
|
|
18
18
|
exports.cnModal = (0, classname_1.cn)('Modal');
|
|
19
19
|
exports.Modal = (0, react_1.forwardRef)(function (_a, ref) {
|
|
20
|
-
var _b = _a.open, open = _b === void 0 ? false : _b, _c = _a.keepMounted, keepMounted = _c === void 0 ? false : _c, _d = _a.hideBackdrop, hideBackdrop = _d === void 0 ? false : _d, children = _a.children, onEnter = _a.onEnter, onEntered = _a.onEntered, onExit = _a.onExit, onExitedProp = _a.onExited, onClose = _a.onClose, backdropProps = _a.backdropProps, windowProps = _a.windowProps, transitionProps = _a.transitionProps, className = _a.className, other = tslib_1.__rest(_a, ["open", "keepMounted", "hideBackdrop", "children", "onEnter", "onEntered", "onExit", "onExited", "onClose", "backdropProps", "windowProps", "transitionProps", "className"]);
|
|
20
|
+
var _b = _a.open, open = _b === void 0 ? false : _b, _c = _a.keepMounted, keepMounted = _c === void 0 ? false : _c, _d = _a.hideBackdrop, hideBackdrop = _d === void 0 ? false : _d, _e = _a.disableScrollLock, disableScrollLock = _e === void 0 ? false : _e, _f = _a.disableClickOutside, disableClickOutside = _f === void 0 ? false : _f, _g = _a.disableEscapeKeyDown, disableEscapeKeyDown = _g === void 0 ? false : _g, children = _a.children, onEnter = _a.onEnter, onEntered = _a.onEntered, onExit = _a.onExit, onExitedProp = _a.onExited, onClose = _a.onClose, backdropProps = _a.backdropProps, windowProps = _a.windowProps, transitionProps = _a.transitionProps, className = _a.className, ignoreClickOutsideRefs = _a.ignoreClickOutsideRefs, other = tslib_1.__rest(_a, ["open", "keepMounted", "hideBackdrop", "disableScrollLock", "disableClickOutside", "disableEscapeKeyDown", "children", "onEnter", "onEntered", "onExit", "onExited", "onClose", "backdropProps", "windowProps", "transitionProps", "className", "ignoreClickOutsideRefs"]);
|
|
21
21
|
var hasBackdrop = !hideBackdrop;
|
|
22
|
-
var hasScrollOnBody = (0, react_1.useRef)(null);
|
|
23
22
|
var modalInnerRef = (0, react_1.useRef)(null);
|
|
24
23
|
var focusedElement = (0, react_1.useRef)(null);
|
|
25
24
|
var isClickOutSide = (0, react_1.useRef)(null);
|
|
26
|
-
var
|
|
27
|
-
var
|
|
25
|
+
var _h = tslib_1.__read((0, react_1.useState)(false), 2), openState = _h[0], setOpenState = _h[1];
|
|
26
|
+
var _j = (0, index_1.useModalManager)(modalInnerRef, 1000, openState), isTop = _j.isTop, refsClickOutside = _j.refsClickOutside;
|
|
28
27
|
(0, useClickOutside_1.useClickOutside)({
|
|
29
|
-
refs: tslib_1.__spreadArray(
|
|
28
|
+
refs: tslib_1.__spreadArray(tslib_1.__spreadArray([
|
|
29
|
+
modalInnerRef
|
|
30
|
+
], tslib_1.__read(refsClickOutside), false), tslib_1.__read((ignoreClickOutsideRefs || [])), false),
|
|
30
31
|
handler: function () {
|
|
31
32
|
isClickOutSide.current = true;
|
|
32
33
|
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
33
|
-
}
|
|
34
|
+
},
|
|
35
|
+
active: !disableClickOutside
|
|
34
36
|
});
|
|
35
37
|
(0, react_1.useEffect)(function () {
|
|
36
38
|
var _a;
|
|
@@ -66,21 +68,11 @@ exports.Modal = (0, react_1.forwardRef)(function (_a, ref) {
|
|
|
66
68
|
}
|
|
67
69
|
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
68
70
|
},
|
|
69
|
-
active: isTop
|
|
71
|
+
active: isTop && !disableEscapeKeyDown
|
|
70
72
|
});
|
|
71
|
-
// Блокирует прокрутку основного окна приложения
|
|
72
|
-
(0, react_1.useEffect)(function () {
|
|
73
|
-
if (openState) {
|
|
74
|
-
hasScrollOnBody.current = document.body.classList.contains('no-scroll');
|
|
75
|
-
document.body.classList.add('no-scroll');
|
|
76
|
-
}
|
|
77
|
-
else if (!hasScrollOnBody.current) {
|
|
78
|
-
document.body.classList.remove('no-scroll');
|
|
79
|
-
}
|
|
80
|
-
}, [openState]);
|
|
81
73
|
return (react_1["default"].createElement(react_transition_group_1.CSSTransition, tslib_1.__assign({ classNames: (0, exports.cnModal)({ animation: true }), timeout: 300 }, transitionProps, { "in": openState, onEnter: onEnter, onEntered: onEntered, onExit: onExit, onExited: onExited, unmountOnExit: !keepMounted, appear: true }),
|
|
82
|
-
react_1["default"].createElement(Portal_1.Portal, tslib_1.__assign({}, other, { className: (0, exports.cnModal)({ hidden: keepMounted && !openState, hasBackdrop: hasBackdrop }, [className]), ref:
|
|
83
|
-
!hideBackdrop && (react_1["default"].createElement(Backdrop_1.Backdrop, tslib_1.__assign({ zIndex: -1 }, backdropProps, {
|
|
84
|
-
react_1["default"].createElement(
|
|
74
|
+
react_1["default"].createElement(Portal_1.Portal, tslib_1.__assign({}, other, { className: (0, exports.cnModal)({ hidden: keepMounted && !openState, hasBackdrop: hasBackdrop }, [className]), ref: ref }),
|
|
75
|
+
!hideBackdrop && (react_1["default"].createElement(Backdrop_1.Backdrop, tslib_1.__assign({ zIndex: -1, onClick: onClose }, backdropProps, { open: openState, className: backdropProps === null || backdropProps === void 0 ? void 0 : backdropProps.className }))),
|
|
76
|
+
react_1["default"].createElement(components_1.ModalConsumer, tslib_1.__assign({}, windowProps, { open: openState && !disableScrollLock, ref: (0, useMultiRef_1.useMultiRef)([modalInnerRef, trapRef, windowProps === null || windowProps === void 0 ? void 0 : windowProps.ref]) }), children))));
|
|
85
77
|
});
|
|
86
78
|
exports.Modal.displayName = 'Modal';
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
exports.__esModule = true;
|
|
3
|
+
exports.ModalConsumer = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var react_1 = tslib_1.__importStar(require("react"));
|
|
6
|
+
var useLockBodyScroll_1 = require("../../../hooks/useLockBodyScroll");
|
|
7
|
+
var Paper_1 = require("../../Paper");
|
|
8
|
+
var index_1 = require("../index");
|
|
9
|
+
exports.ModalConsumer = (0, react_1.forwardRef)(function (_a, ref) {
|
|
10
|
+
var children = _a.children, className = _a.className, open = _a.open, other = tslib_1.__rest(_a, ["children", "className", "open"]);
|
|
11
|
+
// Блокирует прокрутку основного окна приложения
|
|
12
|
+
(0, useLockBodyScroll_1.useLockBodyScroll)(open);
|
|
13
|
+
return (react_1["default"].createElement(Paper_1.Paper, tslib_1.__assign({ radius: "s", background: "main" }, other, { className: (0, index_1.cnModal)('Window', [className]), tabIndex: -1, ref: ref }), children));
|
|
14
|
+
});
|
|
15
|
+
exports.ModalConsumer.displayName = 'ModalConsumer';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ModalConsumer';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useLockBodyScroll';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useLockBodyScroll(active?: boolean): void;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
exports.__esModule = true;
|
|
3
|
+
exports.useLockBodyScroll = void 0;
|
|
4
|
+
var useIsomorphicEffect_1 = require("../useIsomorphicEffect");
|
|
5
|
+
function useLockBodyScroll(active) {
|
|
6
|
+
if (active === void 0) { active = false; }
|
|
7
|
+
(0, useIsomorphicEffect_1.useIsomorphicEffect)(function () {
|
|
8
|
+
if (!active) {
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
var originalStyle = window.getComputedStyle(document.body).overflow;
|
|
12
|
+
document.body.style.overflow = 'hidden';
|
|
13
|
+
return function () {
|
|
14
|
+
document.body.style.overflow = originalStyle;
|
|
15
|
+
};
|
|
16
|
+
}, [active]);
|
|
17
|
+
}
|
|
18
|
+
exports.useLockBodyScroll = useLockBodyScroll;
|
|
@@ -1,22 +1,18 @@
|
|
|
1
|
-
.no-scroll {
|
|
2
|
-
overflow: hidden;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
1
|
.Modal {
|
|
6
2
|
position: fixed;
|
|
7
3
|
z-index: var(--z-index-modal);
|
|
8
4
|
inset: 0;
|
|
9
5
|
}
|
|
10
6
|
|
|
11
|
-
.Modal:not(.Modal_hasBackdrop) {
|
|
7
|
+
.Modal:not(.Modal_hasBackdrop) {
|
|
12
8
|
pointer-events: none;
|
|
13
9
|
}
|
|
14
10
|
|
|
15
|
-
.Modal:not(.Modal_hasBackdrop) .Modal-Window {
|
|
11
|
+
.Modal:not(.Modal_hasBackdrop) .Modal-Window {
|
|
16
12
|
pointer-events: auto;
|
|
17
13
|
}
|
|
18
14
|
|
|
19
|
-
.Modal-Window {
|
|
15
|
+
.Modal-Window {
|
|
20
16
|
position: absolute;
|
|
21
17
|
inset-block-start: 50%;
|
|
22
18
|
inset-inline-start: 50%;
|
|
@@ -27,7 +23,7 @@
|
|
|
27
23
|
padding: var(--space-2xl);
|
|
28
24
|
}
|
|
29
25
|
|
|
30
|
-
.Modal_hidden {
|
|
26
|
+
.Modal_hidden {
|
|
31
27
|
visibility: hidden;
|
|
32
28
|
}
|
|
33
29
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import './Modal.css';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
import type { ReactNode } from 'react';
|
|
3
|
+
import type { ReactNode, RefObject } from 'react';
|
|
4
4
|
import { CSSTransitionProps } from 'react-transition-group/CSSTransition';
|
|
5
5
|
import { type BackdropProps } from '../Backdrop';
|
|
6
6
|
import { type PaperProps } from '../Paper';
|
|
@@ -30,6 +30,12 @@ export type ModalProps = {
|
|
|
30
30
|
hideBackdrop?: boolean;
|
|
31
31
|
/** Если {true} предотвращает размонтирование компонента при событии закрыть */
|
|
32
32
|
keepMounted?: boolean;
|
|
33
|
+
/** Если {true} отключает блокировку прокрутки основного экрана приложения */
|
|
34
|
+
disableScrollLock?: boolean;
|
|
35
|
+
/** Если {true} отключает закрытие окна при клике за его пределами */
|
|
36
|
+
disableClickOutside?: boolean;
|
|
37
|
+
/** Если {true} отключает закрытие окна при нажатии на клавишу ESC */
|
|
38
|
+
disableEscapeKeyDown?: boolean;
|
|
33
39
|
/** Свойства компонента Backdrop (подложка) */
|
|
34
40
|
backdropProps?: BackdropProps & {
|
|
35
41
|
'data-testid'?: string;
|
|
@@ -48,6 +54,8 @@ export type ModalProps = {
|
|
|
48
54
|
'data-testid'?: string;
|
|
49
55
|
/** Контейнер для монтирования всплывающего окна */
|
|
50
56
|
container?: PortalProps['container'];
|
|
57
|
+
/** Список ссылок на элементы при клике на которые Modal не будет закрываться (см. хук useClickOutside) */
|
|
58
|
+
ignoreClickOutsideRefs?: Array<RefObject<HTMLElement>>;
|
|
51
59
|
} & PortalProps;
|
|
52
60
|
export type ModalRef = PortalRef;
|
|
53
61
|
export declare const Modal: React.ForwardRefExoticComponent<{
|
|
@@ -74,6 +82,12 @@ export declare const Modal: React.ForwardRefExoticComponent<{
|
|
|
74
82
|
hideBackdrop?: boolean | undefined;
|
|
75
83
|
/** Если {true} предотвращает размонтирование компонента при событии закрыть */
|
|
76
84
|
keepMounted?: boolean | undefined;
|
|
85
|
+
/** Если {true} отключает блокировку прокрутки основного экрана приложения */
|
|
86
|
+
disableScrollLock?: boolean | undefined;
|
|
87
|
+
/** Если {true} отключает закрытие окна при клике за его пределами */
|
|
88
|
+
disableClickOutside?: boolean | undefined;
|
|
89
|
+
/** Если {true} отключает закрытие окна при нажатии на клавишу ESC */
|
|
90
|
+
disableEscapeKeyDown?: boolean | undefined;
|
|
77
91
|
/** Свойства компонента Backdrop (подложка) */
|
|
78
92
|
backdropProps?: (import("../Backdrop").BackdropBaseProps & {
|
|
79
93
|
as?: "div" | undefined;
|
|
@@ -100,6 +114,8 @@ export declare const Modal: React.ForwardRefExoticComponent<{
|
|
|
100
114
|
'data-testid'?: string | undefined;
|
|
101
115
|
/** Контейнер для монтирования всплывающего окна */
|
|
102
116
|
container?: PortalProps['container'];
|
|
117
|
+
/** Список ссылок на элементы при клике на которые Modal не будет закрываться (см. хук useClickOutside) */
|
|
118
|
+
ignoreClickOutsideRefs?: React.RefObject<HTMLElement>[] | undefined;
|
|
103
119
|
} & import("../Portal").PortalBaseProps & {
|
|
104
120
|
as?: "div" | undefined;
|
|
105
121
|
} & Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "container"> & React.RefAttributes<HTMLDivElement>>;
|
|
@@ -9,25 +9,27 @@ import { useMultiRef } from '../../hooks/useMultiRef';
|
|
|
9
9
|
import { cn } from '../../utils/classname';
|
|
10
10
|
import { isKey } from '../../utils/isKey';
|
|
11
11
|
import { Backdrop } from '../Backdrop';
|
|
12
|
-
import { Paper } from '../Paper';
|
|
13
12
|
import { Portal } from '../Portal';
|
|
13
|
+
import { ModalConsumer } from './components';
|
|
14
14
|
import { useModalManager } from './index';
|
|
15
15
|
export var cnModal = cn('Modal');
|
|
16
16
|
export var Modal = forwardRef(function (_a, ref) {
|
|
17
|
-
var _b = _a.open, open = _b === void 0 ? false : _b, _c = _a.keepMounted, keepMounted = _c === void 0 ? false : _c, _d = _a.hideBackdrop, hideBackdrop = _d === void 0 ? false : _d, children = _a.children, onEnter = _a.onEnter, onEntered = _a.onEntered, onExit = _a.onExit, onExitedProp = _a.onExited, onClose = _a.onClose, backdropProps = _a.backdropProps, windowProps = _a.windowProps, transitionProps = _a.transitionProps, className = _a.className, other = __rest(_a, ["open", "keepMounted", "hideBackdrop", "children", "onEnter", "onEntered", "onExit", "onExited", "onClose", "backdropProps", "windowProps", "transitionProps", "className"]);
|
|
17
|
+
var _b = _a.open, open = _b === void 0 ? false : _b, _c = _a.keepMounted, keepMounted = _c === void 0 ? false : _c, _d = _a.hideBackdrop, hideBackdrop = _d === void 0 ? false : _d, _e = _a.disableScrollLock, disableScrollLock = _e === void 0 ? false : _e, _f = _a.disableClickOutside, disableClickOutside = _f === void 0 ? false : _f, _g = _a.disableEscapeKeyDown, disableEscapeKeyDown = _g === void 0 ? false : _g, children = _a.children, onEnter = _a.onEnter, onEntered = _a.onEntered, onExit = _a.onExit, onExitedProp = _a.onExited, onClose = _a.onClose, backdropProps = _a.backdropProps, windowProps = _a.windowProps, transitionProps = _a.transitionProps, className = _a.className, ignoreClickOutsideRefs = _a.ignoreClickOutsideRefs, other = __rest(_a, ["open", "keepMounted", "hideBackdrop", "disableScrollLock", "disableClickOutside", "disableEscapeKeyDown", "children", "onEnter", "onEntered", "onExit", "onExited", "onClose", "backdropProps", "windowProps", "transitionProps", "className", "ignoreClickOutsideRefs"]);
|
|
18
18
|
var hasBackdrop = !hideBackdrop;
|
|
19
|
-
var hasScrollOnBody = useRef(null);
|
|
20
19
|
var modalInnerRef = useRef(null);
|
|
21
20
|
var focusedElement = useRef(null);
|
|
22
21
|
var isClickOutSide = useRef(null);
|
|
23
|
-
var
|
|
24
|
-
var
|
|
22
|
+
var _h = __read(useState(false), 2), openState = _h[0], setOpenState = _h[1];
|
|
23
|
+
var _j = useModalManager(modalInnerRef, 1000, openState), isTop = _j.isTop, refsClickOutside = _j.refsClickOutside;
|
|
25
24
|
useClickOutside({
|
|
26
|
-
refs: __spreadArray([
|
|
25
|
+
refs: __spreadArray(__spreadArray([
|
|
26
|
+
modalInnerRef
|
|
27
|
+
], __read(refsClickOutside), false), __read((ignoreClickOutsideRefs || [])), false),
|
|
27
28
|
handler: function () {
|
|
28
29
|
isClickOutSide.current = true;
|
|
29
30
|
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
30
|
-
}
|
|
31
|
+
},
|
|
32
|
+
active: !disableClickOutside
|
|
31
33
|
});
|
|
32
34
|
useEffect(function () {
|
|
33
35
|
var _a;
|
|
@@ -63,21 +65,11 @@ export var Modal = forwardRef(function (_a, ref) {
|
|
|
63
65
|
}
|
|
64
66
|
onClose === null || onClose === void 0 ? void 0 : onClose();
|
|
65
67
|
},
|
|
66
|
-
active: isTop
|
|
68
|
+
active: isTop && !disableEscapeKeyDown
|
|
67
69
|
});
|
|
68
|
-
// Блокирует прокрутку основного окна приложения
|
|
69
|
-
useEffect(function () {
|
|
70
|
-
if (openState) {
|
|
71
|
-
hasScrollOnBody.current = document.body.classList.contains('no-scroll');
|
|
72
|
-
document.body.classList.add('no-scroll');
|
|
73
|
-
}
|
|
74
|
-
else if (!hasScrollOnBody.current) {
|
|
75
|
-
document.body.classList.remove('no-scroll');
|
|
76
|
-
}
|
|
77
|
-
}, [openState]);
|
|
78
70
|
return (React.createElement(CSSTransition, __assign({ classNames: cnModal({ animation: true }), timeout: 300 }, transitionProps, { "in": openState, onEnter: onEnter, onEntered: onEntered, onExit: onExit, onExited: onExited, unmountOnExit: !keepMounted, appear: true }),
|
|
79
|
-
React.createElement(Portal, __assign({}, other, { className: cnModal({ hidden: keepMounted && !openState, hasBackdrop: hasBackdrop }, [className]), ref:
|
|
80
|
-
!hideBackdrop && (React.createElement(Backdrop, __assign({ zIndex: -1 }, backdropProps, {
|
|
81
|
-
React.createElement(
|
|
71
|
+
React.createElement(Portal, __assign({}, other, { className: cnModal({ hidden: keepMounted && !openState, hasBackdrop: hasBackdrop }, [className]), ref: ref }),
|
|
72
|
+
!hideBackdrop && (React.createElement(Backdrop, __assign({ zIndex: -1, onClick: onClose }, backdropProps, { open: openState, className: backdropProps === null || backdropProps === void 0 ? void 0 : backdropProps.className }))),
|
|
73
|
+
React.createElement(ModalConsumer, __assign({}, windowProps, { open: openState && !disableScrollLock, ref: useMultiRef([modalInnerRef, trapRef, windowProps === null || windowProps === void 0 ? void 0 : windowProps.ref]) }), children))));
|
|
82
74
|
});
|
|
83
75
|
Modal.displayName = 'Modal';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { __assign, __rest } from "tslib";
|
|
2
|
+
import React, { forwardRef } from 'react';
|
|
3
|
+
import { useLockBodyScroll } from '../../../hooks/useLockBodyScroll';
|
|
4
|
+
import { Paper } from '../../Paper';
|
|
5
|
+
import { cnModal } from '../index';
|
|
6
|
+
export var ModalConsumer = forwardRef(function (_a, ref) {
|
|
7
|
+
var children = _a.children, className = _a.className, open = _a.open, other = __rest(_a, ["children", "className", "open"]);
|
|
8
|
+
// Блокирует прокрутку основного окна приложения
|
|
9
|
+
useLockBodyScroll(open);
|
|
10
|
+
return (React.createElement(Paper, __assign({ radius: "s", background: "main" }, other, { className: cnModal('Window', [className]), tabIndex: -1, ref: ref }), children));
|
|
11
|
+
});
|
|
12
|
+
ModalConsumer.displayName = 'ModalConsumer';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ModalConsumer';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './ModalConsumer';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useLockBodyScroll';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './useLockBodyScroll';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function useLockBodyScroll(active?: boolean): void;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useIsomorphicEffect } from '../useIsomorphicEffect';
|
|
2
|
+
export function useLockBodyScroll(active) {
|
|
3
|
+
if (active === void 0) { active = false; }
|
|
4
|
+
useIsomorphicEffect(function () {
|
|
5
|
+
if (!active) {
|
|
6
|
+
return undefined;
|
|
7
|
+
}
|
|
8
|
+
var originalStyle = window.getComputedStyle(document.body).overflow;
|
|
9
|
+
document.body.style.overflow = 'hidden';
|
|
10
|
+
return function () {
|
|
11
|
+
document.body.style.overflow = originalStyle;
|
|
12
|
+
};
|
|
13
|
+
}, [active]);
|
|
14
|
+
}
|
package/package.json
CHANGED