@ozen-ui/kit 0.14.0 → 0.15.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.js +8 -2
- package/__inner__/cjs/components/Modal/components/ModalConsumer.d.ts +1 -3
- package/__inner__/cjs/components/Modal/components/ModalConsumer.js +1 -4
- package/__inner__/cjs/components/Snackbar/components/Snackbar/Snackbar.css +3 -0
- package/__inner__/cjs/components/ThemeProvider/ThemeProvider.css +3 -0
- package/__inner__/cjs/hooks/useLockBodyScroll/useLockBodyScroll.d.ts +1 -0
- package/__inner__/cjs/hooks/useLockBodyScroll/useLockBodyScroll.js +49 -4
- package/__inner__/cjs/utils/getScrollBarSize/getScrollbarSize.d.ts +1 -0
- package/__inner__/cjs/utils/getScrollBarSize/getScrollbarSize.js +11 -0
- package/__inner__/cjs/utils/getScrollBarSize/index.d.ts +1 -0
- package/__inner__/cjs/utils/getScrollBarSize/index.js +4 -0
- package/__inner__/esm/components/Modal/Modal.js +8 -2
- package/__inner__/esm/components/Modal/components/ModalConsumer.d.ts +1 -3
- package/__inner__/esm/components/Modal/components/ModalConsumer.js +1 -4
- package/__inner__/esm/components/Snackbar/components/Snackbar/Snackbar.css +3 -0
- package/__inner__/esm/components/ThemeProvider/ThemeProvider.css +3 -0
- package/__inner__/esm/hooks/useLockBodyScroll/useLockBodyScroll.d.ts +1 -0
- package/__inner__/esm/hooks/useLockBodyScroll/useLockBodyScroll.js +48 -3
- package/__inner__/esm/utils/getScrollBarSize/getScrollbarSize.d.ts +1 -0
- package/__inner__/esm/utils/getScrollBarSize/getScrollbarSize.js +7 -0
- package/__inner__/esm/utils/getScrollBarSize/index.d.ts +1 -0
- package/__inner__/esm/utils/getScrollBarSize/index.js +1 -0
- package/package.json +1 -1
|
@@ -8,6 +8,7 @@ var react_transition_group_1 = require("react-transition-group");
|
|
|
8
8
|
var useClickOutside_1 = require("../../hooks/useClickOutside");
|
|
9
9
|
var useEventListener_1 = require("../../hooks/useEventListener");
|
|
10
10
|
var useFocusTrap_1 = require("../../hooks/useFocusTrap");
|
|
11
|
+
var useLockBodyScroll_1 = require("../../hooks/useLockBodyScroll");
|
|
11
12
|
var useMultiRef_1 = require("../../hooks/useMultiRef");
|
|
12
13
|
var classname_1 = require("../../utils/classname");
|
|
13
14
|
var isKey_1 = require("../../utils/isKey");
|
|
@@ -23,7 +24,8 @@ exports.Modal = (0, react_1.forwardRef)(function (_a, ref) {
|
|
|
23
24
|
var focusedElement = (0, react_1.useRef)(null);
|
|
24
25
|
var isClickOutSide = (0, react_1.useRef)(null);
|
|
25
26
|
var _h = tslib_1.__read((0, react_1.useState)(false), 2), openState = _h[0], setOpenState = _h[1];
|
|
26
|
-
var _j = (0,
|
|
27
|
+
var _j = tslib_1.__read((0, react_1.useState)(false), 2), opened = _j[0], setOpened = _j[1];
|
|
28
|
+
var _k = (0, index_1.useModalManager)(modalInnerRef, 1000, openState), isTop = _k.isTop, refsClickOutside = _k.refsClickOutside;
|
|
27
29
|
(0, useClickOutside_1.useClickOutside)({
|
|
28
30
|
refs: tslib_1.__spreadArray(tslib_1.__spreadArray([
|
|
29
31
|
modalInnerRef
|
|
@@ -34,10 +36,13 @@ exports.Modal = (0, react_1.forwardRef)(function (_a, ref) {
|
|
|
34
36
|
},
|
|
35
37
|
active: !disableClickOutside,
|
|
36
38
|
});
|
|
39
|
+
// Блокирует прокрутку основного окна приложения
|
|
40
|
+
(0, useLockBodyScroll_1.useLockBodyScroll)(opened && !disableScrollLock);
|
|
37
41
|
(0, react_1.useEffect)(function () {
|
|
38
42
|
var _a;
|
|
39
43
|
// Сохраняем фокус активного элемента до момента открытия всплывающего окна
|
|
40
44
|
if (open) {
|
|
45
|
+
setOpened(true);
|
|
41
46
|
isClickOutSide.current = null;
|
|
42
47
|
focusedElement.current =
|
|
43
48
|
document.activeElement;
|
|
@@ -57,6 +62,7 @@ exports.Modal = (0, react_1.forwardRef)(function (_a, ref) {
|
|
|
57
62
|
document.activeElement === document.body)) {
|
|
58
63
|
(_b = focusedElement.current) === null || _b === void 0 ? void 0 : _b.focus();
|
|
59
64
|
}
|
|
65
|
+
setOpened(false);
|
|
60
66
|
onExitedProp === null || onExitedProp === void 0 ? void 0 : onExitedProp();
|
|
61
67
|
}, [onExitedProp]);
|
|
62
68
|
// Нажатие клавиши {ESC}
|
|
@@ -73,6 +79,6 @@ exports.Modal = (0, react_1.forwardRef)(function (_a, ref) {
|
|
|
73
79
|
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 }),
|
|
74
80
|
react_1.default.createElement(Portal_1.Portal, tslib_1.__assign({}, other, { className: (0, exports.cnModal)({ hidden: keepMounted && !openState, hasBackdrop: hasBackdrop }, [className]), ref: ref }),
|
|
75
81
|
!hideBackdrop && (react_1.default.createElement(Backdrop_1.Backdrop, tslib_1.__assign({ zIndex: -1 }, 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, {
|
|
82
|
+
react_1.default.createElement(components_1.ModalConsumer, tslib_1.__assign({}, windowProps, { ref: (0, useMultiRef_1.useMultiRef)([modalInnerRef, trapRef, windowProps === null || windowProps === void 0 ? void 0 : windowProps.ref]) }), children))));
|
|
77
83
|
});
|
|
78
84
|
exports.Modal.displayName = 'Modal';
|
|
@@ -3,13 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ModalConsumer = void 0;
|
|
4
4
|
var tslib_1 = require("tslib");
|
|
5
5
|
var react_1 = tslib_1.__importStar(require("react"));
|
|
6
|
-
var useLockBodyScroll_1 = require("../../../hooks/useLockBodyScroll");
|
|
7
6
|
var Paper_1 = require("../../Paper");
|
|
8
7
|
var index_1 = require("../index");
|
|
9
8
|
exports.ModalConsumer = (0, react_1.forwardRef)(function (_a, ref) {
|
|
10
|
-
var children = _a.children, className = _a.className,
|
|
11
|
-
// Блокирует прокрутку основного окна приложения
|
|
12
|
-
(0, useLockBodyScroll_1.useLockBodyScroll)(open);
|
|
9
|
+
var children = _a.children, className = _a.className, other = tslib_1.__rest(_a, ["children", "className"]);
|
|
13
10
|
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
11
|
});
|
|
15
12
|
exports.ModalConsumer.displayName = 'ModalConsumer';
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
z-index: var(--z-index-snackbar);
|
|
9
9
|
margin: var(--space-m);
|
|
10
10
|
gap: var(--space-s);
|
|
11
|
+
|
|
12
|
+
/* workaround for a removed scroll bar on the body */
|
|
13
|
+
border-inline-end: var(--removed-body-scroll-bar-size) solid transparent;
|
|
11
14
|
}
|
|
12
15
|
|
|
13
16
|
.Snackbar_anchorHorizontal_left {
|
|
@@ -1,17 +1,62 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useLockBodyScroll = void 0;
|
|
3
|
+
exports.useLockBodyScroll = exports.FIXED_CLASSNAME = void 0;
|
|
4
|
+
var getScrollBarSize_1 = require("../../utils/getScrollBarSize");
|
|
4
5
|
var useIsomorphicEffect_1 = require("../useIsomorphicEffect");
|
|
6
|
+
exports.FIXED_CLASSNAME = 'ScrollLock-fixed';
|
|
7
|
+
var getPaddingRight = function (el) {
|
|
8
|
+
return parseInt(window.getComputedStyle(el).paddingRight, 10) || 0;
|
|
9
|
+
};
|
|
5
10
|
function useLockBodyScroll(active) {
|
|
6
11
|
if (active === void 0) { active = false; }
|
|
7
12
|
(0, useIsomorphicEffect_1.useIsomorphicEffect)(function () {
|
|
8
13
|
if (!active) {
|
|
9
14
|
return undefined;
|
|
10
15
|
}
|
|
11
|
-
var
|
|
12
|
-
|
|
16
|
+
var restoreStyle = [];
|
|
17
|
+
// Вычисляем все фиксированные элементы
|
|
18
|
+
var fixedBlocks = document.querySelectorAll(".".concat(exports.FIXED_CLASSNAME));
|
|
19
|
+
// Получаем ширину полосы прокрутки
|
|
20
|
+
var paddingOffset = (0, getScrollBarSize_1.getScrollbarSize)();
|
|
21
|
+
restoreStyle.push({
|
|
22
|
+
el: document.body,
|
|
23
|
+
value: document.body.style.overflow,
|
|
24
|
+
property: 'overflow',
|
|
25
|
+
});
|
|
26
|
+
// Блокируем полосу прокрутки
|
|
27
|
+
document.body.style.setProperty('overflow', 'hidden');
|
|
28
|
+
// Если прокрутки у body нет, то ничего не делаем
|
|
29
|
+
if (paddingOffset) {
|
|
30
|
+
// Получаем текущий отступ справа у элемента body
|
|
31
|
+
var originalPaddingRight = getPaddingRight(document.body);
|
|
32
|
+
restoreStyle.push({
|
|
33
|
+
el: document.body,
|
|
34
|
+
value: document.body.style.paddingRight,
|
|
35
|
+
property: 'padding-right',
|
|
36
|
+
});
|
|
37
|
+
// Назначаем body отступ равный ширине полосы прокрутки (учитываем текущий отступ body)
|
|
38
|
+
document.body.style.setProperty('padding-right', "".concat(originalPaddingRight + paddingOffset, "px"));
|
|
39
|
+
restoreStyle.push({
|
|
40
|
+
el: document.body,
|
|
41
|
+
value: '',
|
|
42
|
+
property: '--removed-body-scroll-bar-size',
|
|
43
|
+
});
|
|
44
|
+
document.body.style.setProperty('--removed-body-scroll-bar-size', "".concat(paddingOffset, "px"));
|
|
45
|
+
[].forEach.call(fixedBlocks, function (el) {
|
|
46
|
+
var originalPaddingRight = getPaddingRight(el);
|
|
47
|
+
restoreStyle.push({
|
|
48
|
+
el: el,
|
|
49
|
+
value: el.style.paddingRight,
|
|
50
|
+
property: 'padding-right',
|
|
51
|
+
});
|
|
52
|
+
el.style.setProperty('padding-right', "".concat(originalPaddingRight + paddingOffset, "px"));
|
|
53
|
+
});
|
|
54
|
+
}
|
|
13
55
|
return function () {
|
|
14
|
-
|
|
56
|
+
restoreStyle.forEach(function (_a) {
|
|
57
|
+
var el = _a.el, value = _a.value, property = _a.property;
|
|
58
|
+
el.style.setProperty(property, value || '');
|
|
59
|
+
});
|
|
15
60
|
};
|
|
16
61
|
}, [active]);
|
|
17
62
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getScrollbarSize: (el?: HTMLElement) => number;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getScrollbarSize = void 0;
|
|
4
|
+
var getScrollbarSize = function (el) {
|
|
5
|
+
if (el === void 0) { el = document.body; }
|
|
6
|
+
if (el === document.body) {
|
|
7
|
+
return window.innerWidth - el.offsetWidth;
|
|
8
|
+
}
|
|
9
|
+
return el.offsetWidth - el.scrollWidth;
|
|
10
|
+
};
|
|
11
|
+
exports.getScrollbarSize = getScrollbarSize;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './getScrollbarSize';
|
|
@@ -5,6 +5,7 @@ import { CSSTransition } from 'react-transition-group';
|
|
|
5
5
|
import { useClickOutside } from '../../hooks/useClickOutside';
|
|
6
6
|
import { useEventListener } from '../../hooks/useEventListener';
|
|
7
7
|
import { useFocusTrap } from '../../hooks/useFocusTrap';
|
|
8
|
+
import { useLockBodyScroll } from '../../hooks/useLockBodyScroll';
|
|
8
9
|
import { useMultiRef } from '../../hooks/useMultiRef';
|
|
9
10
|
import { cn } from '../../utils/classname';
|
|
10
11
|
import { isKey } from '../../utils/isKey';
|
|
@@ -20,7 +21,8 @@ export var Modal = forwardRef(function (_a, ref) {
|
|
|
20
21
|
var focusedElement = useRef(null);
|
|
21
22
|
var isClickOutSide = useRef(null);
|
|
22
23
|
var _h = __read(useState(false), 2), openState = _h[0], setOpenState = _h[1];
|
|
23
|
-
var _j =
|
|
24
|
+
var _j = __read(useState(false), 2), opened = _j[0], setOpened = _j[1];
|
|
25
|
+
var _k = useModalManager(modalInnerRef, 1000, openState), isTop = _k.isTop, refsClickOutside = _k.refsClickOutside;
|
|
24
26
|
useClickOutside({
|
|
25
27
|
refs: __spreadArray(__spreadArray([
|
|
26
28
|
modalInnerRef
|
|
@@ -31,10 +33,13 @@ export var Modal = forwardRef(function (_a, ref) {
|
|
|
31
33
|
},
|
|
32
34
|
active: !disableClickOutside,
|
|
33
35
|
});
|
|
36
|
+
// Блокирует прокрутку основного окна приложения
|
|
37
|
+
useLockBodyScroll(opened && !disableScrollLock);
|
|
34
38
|
useEffect(function () {
|
|
35
39
|
var _a;
|
|
36
40
|
// Сохраняем фокус активного элемента до момента открытия всплывающего окна
|
|
37
41
|
if (open) {
|
|
42
|
+
setOpened(true);
|
|
38
43
|
isClickOutSide.current = null;
|
|
39
44
|
focusedElement.current =
|
|
40
45
|
document.activeElement;
|
|
@@ -54,6 +59,7 @@ export var Modal = forwardRef(function (_a, ref) {
|
|
|
54
59
|
document.activeElement === document.body)) {
|
|
55
60
|
(_b = focusedElement.current) === null || _b === void 0 ? void 0 : _b.focus();
|
|
56
61
|
}
|
|
62
|
+
setOpened(false);
|
|
57
63
|
onExitedProp === null || onExitedProp === void 0 ? void 0 : onExitedProp();
|
|
58
64
|
}, [onExitedProp]);
|
|
59
65
|
// Нажатие клавиши {ESC}
|
|
@@ -70,6 +76,6 @@ export var Modal = forwardRef(function (_a, ref) {
|
|
|
70
76
|
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 }),
|
|
71
77
|
React.createElement(Portal, __assign({}, other, { className: cnModal({ hidden: keepMounted && !openState, hasBackdrop: hasBackdrop }, [className]), ref: ref }),
|
|
72
78
|
!hideBackdrop && (React.createElement(Backdrop, __assign({ zIndex: -1 }, backdropProps, { open: openState, className: backdropProps === null || backdropProps === void 0 ? void 0 : backdropProps.className }))),
|
|
73
|
-
React.createElement(ModalConsumer, __assign({}, windowProps, {
|
|
79
|
+
React.createElement(ModalConsumer, __assign({}, windowProps, { ref: useMultiRef([modalInnerRef, trapRef, windowProps === null || windowProps === void 0 ? void 0 : windowProps.ref]) }), children))));
|
|
74
80
|
});
|
|
75
81
|
Modal.displayName = 'Modal';
|
|
@@ -1,12 +1,9 @@
|
|
|
1
1
|
import { __assign, __rest } from "tslib";
|
|
2
2
|
import React, { forwardRef } from 'react';
|
|
3
|
-
import { useLockBodyScroll } from '../../../hooks/useLockBodyScroll';
|
|
4
3
|
import { Paper } from '../../Paper';
|
|
5
4
|
import { cnModal } from '../index';
|
|
6
5
|
export var ModalConsumer = forwardRef(function (_a, ref) {
|
|
7
|
-
var children = _a.children, className = _a.className,
|
|
8
|
-
// Блокирует прокрутку основного окна приложения
|
|
9
|
-
useLockBodyScroll(open);
|
|
6
|
+
var children = _a.children, className = _a.className, other = __rest(_a, ["children", "className"]);
|
|
10
7
|
return (React.createElement(Paper, __assign({ radius: "s", background: "main" }, other, { className: cnModal('Window', [className]), tabIndex: -1, ref: ref }), children));
|
|
11
8
|
});
|
|
12
9
|
ModalConsumer.displayName = 'ModalConsumer';
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
z-index: var(--z-index-snackbar);
|
|
9
9
|
margin: var(--space-m);
|
|
10
10
|
gap: var(--space-s);
|
|
11
|
+
|
|
12
|
+
/* workaround for a removed scroll bar on the body */
|
|
13
|
+
border-inline-end: var(--removed-body-scroll-bar-size) solid transparent;
|
|
11
14
|
}
|
|
12
15
|
|
|
13
16
|
.Snackbar_anchorHorizontal_left {
|
|
@@ -1,14 +1,59 @@
|
|
|
1
|
+
import { getScrollbarSize } from '../../utils/getScrollBarSize';
|
|
1
2
|
import { useIsomorphicEffect } from '../useIsomorphicEffect';
|
|
3
|
+
export var FIXED_CLASSNAME = 'ScrollLock-fixed';
|
|
4
|
+
var getPaddingRight = function (el) {
|
|
5
|
+
return parseInt(window.getComputedStyle(el).paddingRight, 10) || 0;
|
|
6
|
+
};
|
|
2
7
|
export function useLockBodyScroll(active) {
|
|
3
8
|
if (active === void 0) { active = false; }
|
|
4
9
|
useIsomorphicEffect(function () {
|
|
5
10
|
if (!active) {
|
|
6
11
|
return undefined;
|
|
7
12
|
}
|
|
8
|
-
var
|
|
9
|
-
|
|
13
|
+
var restoreStyle = [];
|
|
14
|
+
// Вычисляем все фиксированные элементы
|
|
15
|
+
var fixedBlocks = document.querySelectorAll(".".concat(FIXED_CLASSNAME));
|
|
16
|
+
// Получаем ширину полосы прокрутки
|
|
17
|
+
var paddingOffset = getScrollbarSize();
|
|
18
|
+
restoreStyle.push({
|
|
19
|
+
el: document.body,
|
|
20
|
+
value: document.body.style.overflow,
|
|
21
|
+
property: 'overflow',
|
|
22
|
+
});
|
|
23
|
+
// Блокируем полосу прокрутки
|
|
24
|
+
document.body.style.setProperty('overflow', 'hidden');
|
|
25
|
+
// Если прокрутки у body нет, то ничего не делаем
|
|
26
|
+
if (paddingOffset) {
|
|
27
|
+
// Получаем текущий отступ справа у элемента body
|
|
28
|
+
var originalPaddingRight = getPaddingRight(document.body);
|
|
29
|
+
restoreStyle.push({
|
|
30
|
+
el: document.body,
|
|
31
|
+
value: document.body.style.paddingRight,
|
|
32
|
+
property: 'padding-right',
|
|
33
|
+
});
|
|
34
|
+
// Назначаем body отступ равный ширине полосы прокрутки (учитываем текущий отступ body)
|
|
35
|
+
document.body.style.setProperty('padding-right', "".concat(originalPaddingRight + paddingOffset, "px"));
|
|
36
|
+
restoreStyle.push({
|
|
37
|
+
el: document.body,
|
|
38
|
+
value: '',
|
|
39
|
+
property: '--removed-body-scroll-bar-size',
|
|
40
|
+
});
|
|
41
|
+
document.body.style.setProperty('--removed-body-scroll-bar-size', "".concat(paddingOffset, "px"));
|
|
42
|
+
[].forEach.call(fixedBlocks, function (el) {
|
|
43
|
+
var originalPaddingRight = getPaddingRight(el);
|
|
44
|
+
restoreStyle.push({
|
|
45
|
+
el: el,
|
|
46
|
+
value: el.style.paddingRight,
|
|
47
|
+
property: 'padding-right',
|
|
48
|
+
});
|
|
49
|
+
el.style.setProperty('padding-right', "".concat(originalPaddingRight + paddingOffset, "px"));
|
|
50
|
+
});
|
|
51
|
+
}
|
|
10
52
|
return function () {
|
|
11
|
-
|
|
53
|
+
restoreStyle.forEach(function (_a) {
|
|
54
|
+
var el = _a.el, value = _a.value, property = _a.property;
|
|
55
|
+
el.style.setProperty(property, value || '');
|
|
56
|
+
});
|
|
12
57
|
};
|
|
13
58
|
}, [active]);
|
|
14
59
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const getScrollbarSize: (el?: HTMLElement) => number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './getScrollbarSize';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './getScrollbarSize';
|