@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.
Files changed (24) hide show
  1. package/__inner__/cjs/components/Modal/Modal.css +4 -8
  2. package/__inner__/cjs/components/Modal/Modal.d.ts +17 -1
  3. package/__inner__/cjs/components/Modal/Modal.js +13 -21
  4. package/__inner__/cjs/components/Modal/components/ModalConsumer.d.ts +5 -0
  5. package/__inner__/cjs/components/Modal/components/ModalConsumer.js +15 -0
  6. package/__inner__/cjs/components/Modal/components/index.d.ts +1 -0
  7. package/__inner__/cjs/components/Modal/components/index.js +4 -0
  8. package/__inner__/cjs/hooks/useLockBodyScroll/index.d.ts +1 -0
  9. package/__inner__/cjs/hooks/useLockBodyScroll/index.js +4 -0
  10. package/__inner__/cjs/hooks/useLockBodyScroll/useLockBodyScroll.d.ts +1 -0
  11. package/__inner__/cjs/hooks/useLockBodyScroll/useLockBodyScroll.js +18 -0
  12. package/__inner__/esm/components/Modal/Modal.css +4 -8
  13. package/__inner__/esm/components/Modal/Modal.d.ts +17 -1
  14. package/__inner__/esm/components/Modal/Modal.js +13 -21
  15. package/__inner__/esm/components/Modal/components/ModalConsumer.d.ts +5 -0
  16. package/__inner__/esm/components/Modal/components/ModalConsumer.js +12 -0
  17. package/__inner__/esm/components/Modal/components/index.d.ts +1 -0
  18. package/__inner__/esm/components/Modal/components/index.js +1 -0
  19. package/__inner__/esm/hooks/useLockBodyScroll/index.d.ts +1 -0
  20. package/__inner__/esm/hooks/useLockBodyScroll/index.js +1 -0
  21. package/__inner__/esm/hooks/useLockBodyScroll/useLockBodyScroll.d.ts +1 -0
  22. package/__inner__/esm/hooks/useLockBodyScroll/useLockBodyScroll.js +14 -0
  23. package/package.json +1 -1
  24. 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 _e = tslib_1.__read((0, react_1.useState)(false), 2), openState = _e[0], setOpenState = _e[1];
27
- var _f = (0, index_1.useModalManager)(modalInnerRef, 1000, openState), isTop = _f.isTop, refsClickOutside = _f.refsClickOutside;
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([modalInnerRef], tslib_1.__read(refsClickOutside), false),
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: (0, useMultiRef_1.useMultiRef)([modalInnerRef, ref]) }),
83
- !hideBackdrop && (react_1["default"].createElement(Backdrop_1.Backdrop, tslib_1.__assign({ zIndex: -1 }, backdropProps, { onClick: onClose, open: openState, className: backdropProps === null || backdropProps === void 0 ? void 0 : backdropProps.className }))),
84
- react_1["default"].createElement(Paper_1.Paper, tslib_1.__assign({ radius: "s", background: "main" }, windowProps, { className: (0, exports.cnModal)('Window', [windowProps === null || windowProps === void 0 ? void 0 : windowProps.className]), tabIndex: -1, ref: (0, useMultiRef_1.useMultiRef)([trapRef, windowProps === null || windowProps === void 0 ? void 0 : windowProps.ref]) }), children))));
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,5 @@
1
+ import { FC } from 'react';
2
+ import { PaperProps } from '../../Paper';
3
+ export declare const ModalConsumer: FC<PaperProps & {
4
+ open: boolean;
5
+ }>;
@@ -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,4 @@
1
+ "use strict";
2
+ exports.__esModule = true;
3
+ var tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./ModalConsumer"), exports);
@@ -0,0 +1 @@
1
+ export * from './useLockBodyScroll';
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ exports.__esModule = true;
3
+ var tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./useLockBodyScroll"), exports);
@@ -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 _e = __read(useState(false), 2), openState = _e[0], setOpenState = _e[1];
24
- var _f = useModalManager(modalInnerRef, 1000, openState), isTop = _f.isTop, refsClickOutside = _f.refsClickOutside;
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([modalInnerRef], __read(refsClickOutside), false),
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: useMultiRef([modalInnerRef, ref]) }),
80
- !hideBackdrop && (React.createElement(Backdrop, __assign({ zIndex: -1 }, backdropProps, { onClick: onClose, open: openState, className: backdropProps === null || backdropProps === void 0 ? void 0 : backdropProps.className }))),
81
- React.createElement(Paper, __assign({ radius: "s", background: "main" }, windowProps, { className: cnModal('Window', [windowProps === null || windowProps === void 0 ? void 0 : windowProps.className]), tabIndex: -1, ref: useMultiRef([trapRef, windowProps === null || windowProps === void 0 ? void 0 : windowProps.ref]) }), children))));
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,5 @@
1
+ import { FC } from 'react';
2
+ import { PaperProps } from '../../Paper';
3
+ export declare const ModalConsumer: FC<PaperProps & {
4
+ open: boolean;
5
+ }>;
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ozen-ui/kit",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "React component library",
5
5
  "files": [
6
6
  "*"
@@ -0,0 +1,5 @@
1
+ {
2
+ "main": "../__inner__/cjs/hooks/useLockBodyScroll/index.js",
3
+ "module": "../__inner__/esm/hooks/useLockBodyScroll/index.js",
4
+ "types": "../__inner__/esm/hooks/useLockBodyScroll/index.d.ts"
5
+ }