@ozen-ui/kit 0.14.0 → 0.16.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 (33) hide show
  1. package/__inner__/cjs/components/Modal/Modal.js +8 -2
  2. package/__inner__/cjs/components/Modal/components/ModalConsumer.d.ts +1 -3
  3. package/__inner__/cjs/components/Modal/components/ModalConsumer.js +1 -4
  4. package/__inner__/cjs/components/Snackbar/components/Snackbar/Snackbar.css +3 -0
  5. package/__inner__/cjs/components/ThemeProvider/ThemeProvider.css +3 -0
  6. package/__inner__/cjs/components/ThemeProvider/_color/Theme_color_bBusinessDefault.css +1 -0
  7. package/__inner__/cjs/components/ThemeProvider/_color/Theme_color_ozenDark.css +3 -2
  8. package/__inner__/cjs/components/ThemeProvider/_color/Theme_color_ozenDefault.css +2 -1
  9. package/__inner__/cjs/components/ThemeProvider/themes/helper.d.ts +1 -1
  10. package/__inner__/cjs/components/ThemeProvider/themes/helper.js +1 -0
  11. package/__inner__/cjs/hooks/useLockBodyScroll/useLockBodyScroll.d.ts +1 -0
  12. package/__inner__/cjs/hooks/useLockBodyScroll/useLockBodyScroll.js +49 -4
  13. package/__inner__/cjs/utils/getScrollBarSize/getScrollbarSize.d.ts +1 -0
  14. package/__inner__/cjs/utils/getScrollBarSize/getScrollbarSize.js +11 -0
  15. package/__inner__/cjs/utils/getScrollBarSize/index.d.ts +1 -0
  16. package/__inner__/cjs/utils/getScrollBarSize/index.js +4 -0
  17. package/__inner__/esm/components/Modal/Modal.js +8 -2
  18. package/__inner__/esm/components/Modal/components/ModalConsumer.d.ts +1 -3
  19. package/__inner__/esm/components/Modal/components/ModalConsumer.js +1 -4
  20. package/__inner__/esm/components/Snackbar/components/Snackbar/Snackbar.css +3 -0
  21. package/__inner__/esm/components/ThemeProvider/ThemeProvider.css +3 -0
  22. package/__inner__/esm/components/ThemeProvider/_color/Theme_color_bBusinessDefault.css +1 -0
  23. package/__inner__/esm/components/ThemeProvider/_color/Theme_color_ozenDark.css +3 -2
  24. package/__inner__/esm/components/ThemeProvider/_color/Theme_color_ozenDefault.css +2 -1
  25. package/__inner__/esm/components/ThemeProvider/themes/helper.d.ts +1 -1
  26. package/__inner__/esm/components/ThemeProvider/themes/helper.js +1 -0
  27. package/__inner__/esm/hooks/useLockBodyScroll/useLockBodyScroll.d.ts +1 -0
  28. package/__inner__/esm/hooks/useLockBodyScroll/useLockBodyScroll.js +48 -3
  29. package/__inner__/esm/utils/getScrollBarSize/getScrollbarSize.d.ts +1 -0
  30. package/__inner__/esm/utils/getScrollBarSize/getScrollbarSize.js +7 -0
  31. package/__inner__/esm/utils/getScrollBarSize/index.d.ts +1 -0
  32. package/__inner__/esm/utils/getScrollBarSize/index.js +1 -0
  33. 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, index_1.useModalManager)(modalInnerRef, 1000, openState), isTop = _j.isTop, refsClickOutside = _j.refsClickOutside;
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, { open: openState && !disableScrollLock, ref: (0, useMultiRef_1.useMultiRef)([modalInnerRef, trapRef, windowProps === null || windowProps === void 0 ? void 0 : windowProps.ref]) }), children))));
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';
@@ -1,5 +1,3 @@
1
1
  import type { FC } from 'react';
2
2
  import type { PaperProps } from '../../Paper';
3
- export declare const ModalConsumer: FC<PaperProps & {
4
- open: boolean;
5
- }>;
3
+ export declare const ModalConsumer: FC<PaperProps>;
@@ -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, open = _a.open, other = tslib_1.__rest(_a, ["children", "className", "open"]);
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,4 +1,7 @@
1
1
  /* stylelint-disable */
2
+ body {
3
+ --removed-body-scroll-bar-size: 0;
4
+ }
2
5
  .Theme {
3
6
  --shadow-outline-focused: var(--color-border-focused) 0 0 0
4
7
  var(--border-width-m);
@@ -123,6 +123,7 @@
123
123
  --color-accent-tertiary-hover: #585858;
124
124
  --color-accent-tertiary-pressed: #686868;
125
125
  --color-accent-disabled: #484848;
126
+ --color-accent-secondary-inverse: #808080;
126
127
  --color-accent-main-inverse: #fff;
127
128
  --color-additional-a1: #0b6abe;
128
129
  --color-additional-a2: #1899e9;
@@ -3,7 +3,7 @@
3
3
  --color-content-secondary: #949494;
4
4
  --color-content-primary: #f5f5f5;
5
5
  --color-content-tertiary: #707070;
6
- --color-content-disabled: #363636;
6
+ --color-content-disabled: #4e4e4e;
7
7
  --color-content-ghost-disabled: rgb(255 255 255 / 47%);
8
8
  --color-content-action: #43b741;
9
9
  --color-content-action-hover: #379535;
@@ -122,7 +122,8 @@
122
122
  --color-accent-tertiary-hover: #585858;
123
123
  --color-accent-tertiary-pressed: #686868;
124
124
  --color-accent-disable: #484848;
125
- --color-accent-main-inverse: #fff;
125
+ --color-accent-secondary-inverse: #808080;
126
+ --color-accent-main-inverse: #dcdcdc;
126
127
  --color-additional-a1: #0b6abe;
127
128
  --color-additional-a2: #1899e9;
128
129
  --color-additional-a3: #b3f1ff;
@@ -123,7 +123,8 @@
123
123
  --color-accent-tertiary-hover: #585858;
124
124
  --color-accent-tertiary-pressed: #686868;
125
125
  --color-accent-disabled: #484848;
126
- --color-accent-main-inverse: #fff;
126
+ --color-accent-secondary-inverse: #808080;
127
+ --color-accent-main-inverse: #dcdcdc;
127
128
  --color-additional-a1: #0b6abe;
128
129
  --color-additional-a2: #1899e9;
129
130
  --color-additional-a3: #b3f1ff;
@@ -1,4 +1,4 @@
1
- export declare const color: readonly ["--color-content-primary", "--color-content-secondary", "--color-additional-h3", "--color-content-tertiary", "--color-content-disabled", "--color-content-ghost-disabled", "--color-content-action", "--color-content-action-hover", "--color-content-action-pressed", "--color-content-action-dark", "--color-content-action-on", "--color-content-error", "--color-content-error-hover", "--color-content-error-pressed", "--color-content-error-dark", "--color-content-warning", "--color-content-warning-hover", "--color-content-warning-pressed", "--color-content-warning-dark", "--color-content-success", "--color-content-success-hover", "--color-content-success-pressed", "--color-content-success-dark", "--color-content-info", "--color-content-info-hover", "--color-content-info-pressed", "--color-content-info-dark", "--color-content-primary-inverse", "--color-content-accent-main", "--color-accent-main", "--color-content-accent-primary", "--color-accent-primary", "--color-content-accent-disabled", "--color-background-main", "--color-background-main-hover", "--color-background-main-pressed", "--color-background-primary", "--color-background-primary-hover", "--color-background-primary-pressed", "--color-background-secondary", "--color-background-secondary-hover", "--color-background-secondary-pressed", "--color-background-tertiary", "--color-background-tertiary-hover", "--color-background-tertiary-pressed", "--color-background-disabled", "--color-background-action", "--color-background-action-hover", "--color-background-action-pressed", "--color-background-action-active-disabled", "--color-background-action-light", "--color-background-action-light-hover", "--color-background-action-light-pressed", "--color-background-error", "--color-background-error-hover", "--color-background-error-pressed", "--color-background-error-light", "--color-background-error-light-hover", "--color-background-error-light-pressed", "--color-background-warning", "--color-background-warning-hover", "--color-background-warning-pressed", "--color-background-warning-light", "--color-background-warning-light-hover", "--color-background-warning-light-pressed", "--color-background-success", "--color-background-success-hover", "--color-background-success-pressed", "--color-background-success-light", "--color-background-success-light-hover", "--color-background-success-light-pressed", "--color-background-info", "--color-background-info-hover", "--color-background-info-pressed", "--color-background-info-light", "--color-background-info-light-hover", "--color-background-info-light-pressed", "--color-background-main-inverse", "--color-background-overlay", "--color-background-ghost", "--color-background-ghost-hover", "--color-background-ghost-pressed", "--color-background-ghost-disabled", "--color-background-accent-action-light-hover", "--color-background-accent-action-light-pressed", "--color-background-accent-error-light-hover", "--color-background-accent-error-light-pressed", "--color-background-accent-warning-light-hover", "--color-background-accent-warning-light-pressed", "--color-background-accent-success-light-hover", "--color-background-accent-success-light-pressed", "--color-background-accent-info-light-hover", "--color-background-accent-info-light-pressed", "--color-border-main", "--color-border-main-hover", "--color-border-main-pressed", "--color-border-secondary", "--color-border-secondary-hover", "--color-border-secondary-pressed", "--color-border-disabled", "--color-border-ghost-disabled", "--color-border-focused", "--color-border-action", "--color-border-action-hover", "--color-border-action-pressed", "--color-border-error", "--color-border-warning", "--color-border-success", "--color-border-info", "--color-border-main-on", "--color-border-accent-main", "--color-border-accent-disabled", "--color-border-accent-focused", "--color-accent-main-hover", "--color-accent-main-pressed", "--color-accent-primary-hover", "--color-accent-primary-pressed", "--color-accent-secondary", "--color-accent-secondary-hover", "--color-accent-secondary-pressed", "--color-accent-tertiary", "--color-accent-tertiary-hover", "--color-accent-tertiary-pressed", "--color-accent-disabled", "--color-accent-main-inverse", "--color-additional-a1", "--color-additional-a2", "--color-additional-a3", "--color-additional-b1", "--color-additional-b2", "--color-additional-b3", "--color-additional-c1", "--color-additional-c2", "--color-additional-c3", "--color-additional-d1", "--color-additional-d2", "--color-additional-d3", "--color-additional-e1", "--color-additional-e2", "--color-additional-e3", "--color-additional-f1", "--color-additional-f2", "--color-additional-f3", "--color-additional-g1", "--color-additional-g2", "--color-additional-g3", "--color-additional-h1", "--color-additional-h2"];
1
+ export declare const color: readonly ["--color-content-primary", "--color-content-secondary", "--color-additional-h3", "--color-content-tertiary", "--color-content-disabled", "--color-content-ghost-disabled", "--color-content-action", "--color-content-action-hover", "--color-content-action-pressed", "--color-content-action-dark", "--color-content-action-on", "--color-content-error", "--color-content-error-hover", "--color-content-error-pressed", "--color-content-error-dark", "--color-content-warning", "--color-content-warning-hover", "--color-content-warning-pressed", "--color-content-warning-dark", "--color-content-success", "--color-content-success-hover", "--color-content-success-pressed", "--color-content-success-dark", "--color-content-info", "--color-content-info-hover", "--color-content-info-pressed", "--color-content-info-dark", "--color-content-primary-inverse", "--color-content-accent-main", "--color-accent-main", "--color-content-accent-primary", "--color-accent-primary", "--color-content-accent-disabled", "--color-background-main", "--color-background-main-hover", "--color-background-main-pressed", "--color-background-primary", "--color-background-primary-hover", "--color-background-primary-pressed", "--color-background-secondary", "--color-background-secondary-hover", "--color-background-secondary-pressed", "--color-background-tertiary", "--color-background-tertiary-hover", "--color-background-tertiary-pressed", "--color-background-disabled", "--color-background-action", "--color-background-action-hover", "--color-background-action-pressed", "--color-background-action-active-disabled", "--color-background-action-light", "--color-background-action-light-hover", "--color-background-action-light-pressed", "--color-background-error", "--color-background-error-hover", "--color-background-error-pressed", "--color-background-error-light", "--color-background-error-light-hover", "--color-background-error-light-pressed", "--color-background-warning", "--color-background-warning-hover", "--color-background-warning-pressed", "--color-background-warning-light", "--color-background-warning-light-hover", "--color-background-warning-light-pressed", "--color-background-success", "--color-background-success-hover", "--color-background-success-pressed", "--color-background-success-light", "--color-background-success-light-hover", "--color-background-success-light-pressed", "--color-background-info", "--color-background-info-hover", "--color-background-info-pressed", "--color-background-info-light", "--color-background-info-light-hover", "--color-background-info-light-pressed", "--color-background-main-inverse", "--color-background-overlay", "--color-background-ghost", "--color-background-ghost-hover", "--color-background-ghost-pressed", "--color-background-ghost-disabled", "--color-background-accent-action-light-hover", "--color-background-accent-action-light-pressed", "--color-background-accent-error-light-hover", "--color-background-accent-error-light-pressed", "--color-background-accent-warning-light-hover", "--color-background-accent-warning-light-pressed", "--color-background-accent-success-light-hover", "--color-background-accent-success-light-pressed", "--color-background-accent-info-light-hover", "--color-background-accent-info-light-pressed", "--color-border-main", "--color-border-main-hover", "--color-border-main-pressed", "--color-border-secondary", "--color-border-secondary-hover", "--color-border-secondary-pressed", "--color-border-disabled", "--color-border-ghost-disabled", "--color-border-focused", "--color-border-action", "--color-border-action-hover", "--color-border-action-pressed", "--color-border-error", "--color-border-warning", "--color-border-success", "--color-border-info", "--color-border-main-on", "--color-border-accent-main", "--color-border-accent-disabled", "--color-border-accent-focused", "--color-accent-main-hover", "--color-accent-main-pressed", "--color-accent-primary-hover", "--color-accent-primary-pressed", "--color-accent-secondary", "--color-accent-secondary-hover", "--color-accent-secondary-pressed", "--color-accent-tertiary", "--color-accent-tertiary-hover", "--color-accent-tertiary-pressed", "--color-accent-disabled", "--color-accent-secondary-inverse", "--color-accent-main-inverse", "--color-additional-a1", "--color-additional-a2", "--color-additional-a3", "--color-additional-b1", "--color-additional-b2", "--color-additional-b3", "--color-additional-c1", "--color-additional-c2", "--color-additional-c3", "--color-additional-d1", "--color-additional-d2", "--color-additional-d3", "--color-additional-e1", "--color-additional-e2", "--color-additional-e3", "--color-additional-f1", "--color-additional-f2", "--color-additional-f3", "--color-additional-g1", "--color-additional-g2", "--color-additional-g3", "--color-additional-h1", "--color-additional-h2"];
2
2
  export declare const borderRadius: readonly ["--border-radius-l", "--border-radius-xl", "--border-radius-m", "--border-radius-s", "--border-radius-xs", "--border-radius-2xs"];
3
3
  export declare const borderWidth: readonly ["--border-width-s", "--border-width-m"];
4
4
  export declare const shadow: readonly ["--shadow-l", "--shadow-m", "--shadow-s"];
@@ -126,6 +126,7 @@ exports.color = [
126
126
  '--color-accent-tertiary-hover',
127
127
  '--color-accent-tertiary-pressed',
128
128
  '--color-accent-disabled',
129
+ '--color-accent-secondary-inverse',
129
130
  '--color-accent-main-inverse',
130
131
  '--color-additional-a1',
131
132
  '--color-additional-a2',
@@ -1 +1,2 @@
1
+ export declare const FIXED_CLASSNAME = "ScrollLock-fixed";
1
2
  export declare function useLockBodyScroll(active?: boolean): void;
@@ -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 originalStyle = window.getComputedStyle(document.body).overflow;
12
- document.body.style.overflow = 'hidden';
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
- document.body.style.overflow = originalStyle;
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';
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ tslib_1.__exportStar(require("./getScrollbarSize"), exports);
@@ -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 = useModalManager(modalInnerRef, 1000, openState), isTop = _j.isTop, refsClickOutside = _j.refsClickOutside;
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, { open: openState && !disableScrollLock, ref: useMultiRef([modalInnerRef, trapRef, windowProps === null || windowProps === void 0 ? void 0 : windowProps.ref]) }), children))));
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,5 +1,3 @@
1
1
  import type { FC } from 'react';
2
2
  import type { PaperProps } from '../../Paper';
3
- export declare const ModalConsumer: FC<PaperProps & {
4
- open: boolean;
5
- }>;
3
+ export declare const ModalConsumer: FC<PaperProps>;
@@ -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, open = _a.open, other = __rest(_a, ["children", "className", "open"]);
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,4 +1,7 @@
1
1
  /* stylelint-disable */
2
+ body {
3
+ --removed-body-scroll-bar-size: 0;
4
+ }
2
5
  .Theme {
3
6
  --shadow-outline-focused: var(--color-border-focused) 0 0 0
4
7
  var(--border-width-m);
@@ -123,6 +123,7 @@
123
123
  --color-accent-tertiary-hover: #585858;
124
124
  --color-accent-tertiary-pressed: #686868;
125
125
  --color-accent-disabled: #484848;
126
+ --color-accent-secondary-inverse: #808080;
126
127
  --color-accent-main-inverse: #fff;
127
128
  --color-additional-a1: #0b6abe;
128
129
  --color-additional-a2: #1899e9;
@@ -3,7 +3,7 @@
3
3
  --color-content-secondary: #949494;
4
4
  --color-content-primary: #f5f5f5;
5
5
  --color-content-tertiary: #707070;
6
- --color-content-disabled: #363636;
6
+ --color-content-disabled: #4e4e4e;
7
7
  --color-content-ghost-disabled: rgb(255 255 255 / 47%);
8
8
  --color-content-action: #43b741;
9
9
  --color-content-action-hover: #379535;
@@ -122,7 +122,8 @@
122
122
  --color-accent-tertiary-hover: #585858;
123
123
  --color-accent-tertiary-pressed: #686868;
124
124
  --color-accent-disable: #484848;
125
- --color-accent-main-inverse: #fff;
125
+ --color-accent-secondary-inverse: #808080;
126
+ --color-accent-main-inverse: #dcdcdc;
126
127
  --color-additional-a1: #0b6abe;
127
128
  --color-additional-a2: #1899e9;
128
129
  --color-additional-a3: #b3f1ff;
@@ -123,7 +123,8 @@
123
123
  --color-accent-tertiary-hover: #585858;
124
124
  --color-accent-tertiary-pressed: #686868;
125
125
  --color-accent-disabled: #484848;
126
- --color-accent-main-inverse: #fff;
126
+ --color-accent-secondary-inverse: #808080;
127
+ --color-accent-main-inverse: #dcdcdc;
127
128
  --color-additional-a1: #0b6abe;
128
129
  --color-additional-a2: #1899e9;
129
130
  --color-additional-a3: #b3f1ff;
@@ -1,4 +1,4 @@
1
- export declare const color: readonly ["--color-content-primary", "--color-content-secondary", "--color-additional-h3", "--color-content-tertiary", "--color-content-disabled", "--color-content-ghost-disabled", "--color-content-action", "--color-content-action-hover", "--color-content-action-pressed", "--color-content-action-dark", "--color-content-action-on", "--color-content-error", "--color-content-error-hover", "--color-content-error-pressed", "--color-content-error-dark", "--color-content-warning", "--color-content-warning-hover", "--color-content-warning-pressed", "--color-content-warning-dark", "--color-content-success", "--color-content-success-hover", "--color-content-success-pressed", "--color-content-success-dark", "--color-content-info", "--color-content-info-hover", "--color-content-info-pressed", "--color-content-info-dark", "--color-content-primary-inverse", "--color-content-accent-main", "--color-accent-main", "--color-content-accent-primary", "--color-accent-primary", "--color-content-accent-disabled", "--color-background-main", "--color-background-main-hover", "--color-background-main-pressed", "--color-background-primary", "--color-background-primary-hover", "--color-background-primary-pressed", "--color-background-secondary", "--color-background-secondary-hover", "--color-background-secondary-pressed", "--color-background-tertiary", "--color-background-tertiary-hover", "--color-background-tertiary-pressed", "--color-background-disabled", "--color-background-action", "--color-background-action-hover", "--color-background-action-pressed", "--color-background-action-active-disabled", "--color-background-action-light", "--color-background-action-light-hover", "--color-background-action-light-pressed", "--color-background-error", "--color-background-error-hover", "--color-background-error-pressed", "--color-background-error-light", "--color-background-error-light-hover", "--color-background-error-light-pressed", "--color-background-warning", "--color-background-warning-hover", "--color-background-warning-pressed", "--color-background-warning-light", "--color-background-warning-light-hover", "--color-background-warning-light-pressed", "--color-background-success", "--color-background-success-hover", "--color-background-success-pressed", "--color-background-success-light", "--color-background-success-light-hover", "--color-background-success-light-pressed", "--color-background-info", "--color-background-info-hover", "--color-background-info-pressed", "--color-background-info-light", "--color-background-info-light-hover", "--color-background-info-light-pressed", "--color-background-main-inverse", "--color-background-overlay", "--color-background-ghost", "--color-background-ghost-hover", "--color-background-ghost-pressed", "--color-background-ghost-disabled", "--color-background-accent-action-light-hover", "--color-background-accent-action-light-pressed", "--color-background-accent-error-light-hover", "--color-background-accent-error-light-pressed", "--color-background-accent-warning-light-hover", "--color-background-accent-warning-light-pressed", "--color-background-accent-success-light-hover", "--color-background-accent-success-light-pressed", "--color-background-accent-info-light-hover", "--color-background-accent-info-light-pressed", "--color-border-main", "--color-border-main-hover", "--color-border-main-pressed", "--color-border-secondary", "--color-border-secondary-hover", "--color-border-secondary-pressed", "--color-border-disabled", "--color-border-ghost-disabled", "--color-border-focused", "--color-border-action", "--color-border-action-hover", "--color-border-action-pressed", "--color-border-error", "--color-border-warning", "--color-border-success", "--color-border-info", "--color-border-main-on", "--color-border-accent-main", "--color-border-accent-disabled", "--color-border-accent-focused", "--color-accent-main-hover", "--color-accent-main-pressed", "--color-accent-primary-hover", "--color-accent-primary-pressed", "--color-accent-secondary", "--color-accent-secondary-hover", "--color-accent-secondary-pressed", "--color-accent-tertiary", "--color-accent-tertiary-hover", "--color-accent-tertiary-pressed", "--color-accent-disabled", "--color-accent-main-inverse", "--color-additional-a1", "--color-additional-a2", "--color-additional-a3", "--color-additional-b1", "--color-additional-b2", "--color-additional-b3", "--color-additional-c1", "--color-additional-c2", "--color-additional-c3", "--color-additional-d1", "--color-additional-d2", "--color-additional-d3", "--color-additional-e1", "--color-additional-e2", "--color-additional-e3", "--color-additional-f1", "--color-additional-f2", "--color-additional-f3", "--color-additional-g1", "--color-additional-g2", "--color-additional-g3", "--color-additional-h1", "--color-additional-h2"];
1
+ export declare const color: readonly ["--color-content-primary", "--color-content-secondary", "--color-additional-h3", "--color-content-tertiary", "--color-content-disabled", "--color-content-ghost-disabled", "--color-content-action", "--color-content-action-hover", "--color-content-action-pressed", "--color-content-action-dark", "--color-content-action-on", "--color-content-error", "--color-content-error-hover", "--color-content-error-pressed", "--color-content-error-dark", "--color-content-warning", "--color-content-warning-hover", "--color-content-warning-pressed", "--color-content-warning-dark", "--color-content-success", "--color-content-success-hover", "--color-content-success-pressed", "--color-content-success-dark", "--color-content-info", "--color-content-info-hover", "--color-content-info-pressed", "--color-content-info-dark", "--color-content-primary-inverse", "--color-content-accent-main", "--color-accent-main", "--color-content-accent-primary", "--color-accent-primary", "--color-content-accent-disabled", "--color-background-main", "--color-background-main-hover", "--color-background-main-pressed", "--color-background-primary", "--color-background-primary-hover", "--color-background-primary-pressed", "--color-background-secondary", "--color-background-secondary-hover", "--color-background-secondary-pressed", "--color-background-tertiary", "--color-background-tertiary-hover", "--color-background-tertiary-pressed", "--color-background-disabled", "--color-background-action", "--color-background-action-hover", "--color-background-action-pressed", "--color-background-action-active-disabled", "--color-background-action-light", "--color-background-action-light-hover", "--color-background-action-light-pressed", "--color-background-error", "--color-background-error-hover", "--color-background-error-pressed", "--color-background-error-light", "--color-background-error-light-hover", "--color-background-error-light-pressed", "--color-background-warning", "--color-background-warning-hover", "--color-background-warning-pressed", "--color-background-warning-light", "--color-background-warning-light-hover", "--color-background-warning-light-pressed", "--color-background-success", "--color-background-success-hover", "--color-background-success-pressed", "--color-background-success-light", "--color-background-success-light-hover", "--color-background-success-light-pressed", "--color-background-info", "--color-background-info-hover", "--color-background-info-pressed", "--color-background-info-light", "--color-background-info-light-hover", "--color-background-info-light-pressed", "--color-background-main-inverse", "--color-background-overlay", "--color-background-ghost", "--color-background-ghost-hover", "--color-background-ghost-pressed", "--color-background-ghost-disabled", "--color-background-accent-action-light-hover", "--color-background-accent-action-light-pressed", "--color-background-accent-error-light-hover", "--color-background-accent-error-light-pressed", "--color-background-accent-warning-light-hover", "--color-background-accent-warning-light-pressed", "--color-background-accent-success-light-hover", "--color-background-accent-success-light-pressed", "--color-background-accent-info-light-hover", "--color-background-accent-info-light-pressed", "--color-border-main", "--color-border-main-hover", "--color-border-main-pressed", "--color-border-secondary", "--color-border-secondary-hover", "--color-border-secondary-pressed", "--color-border-disabled", "--color-border-ghost-disabled", "--color-border-focused", "--color-border-action", "--color-border-action-hover", "--color-border-action-pressed", "--color-border-error", "--color-border-warning", "--color-border-success", "--color-border-info", "--color-border-main-on", "--color-border-accent-main", "--color-border-accent-disabled", "--color-border-accent-focused", "--color-accent-main-hover", "--color-accent-main-pressed", "--color-accent-primary-hover", "--color-accent-primary-pressed", "--color-accent-secondary", "--color-accent-secondary-hover", "--color-accent-secondary-pressed", "--color-accent-tertiary", "--color-accent-tertiary-hover", "--color-accent-tertiary-pressed", "--color-accent-disabled", "--color-accent-secondary-inverse", "--color-accent-main-inverse", "--color-additional-a1", "--color-additional-a2", "--color-additional-a3", "--color-additional-b1", "--color-additional-b2", "--color-additional-b3", "--color-additional-c1", "--color-additional-c2", "--color-additional-c3", "--color-additional-d1", "--color-additional-d2", "--color-additional-d3", "--color-additional-e1", "--color-additional-e2", "--color-additional-e3", "--color-additional-f1", "--color-additional-f2", "--color-additional-f3", "--color-additional-g1", "--color-additional-g2", "--color-additional-g3", "--color-additional-h1", "--color-additional-h2"];
2
2
  export declare const borderRadius: readonly ["--border-radius-l", "--border-radius-xl", "--border-radius-m", "--border-radius-s", "--border-radius-xs", "--border-radius-2xs"];
3
3
  export declare const borderWidth: readonly ["--border-width-s", "--border-width-m"];
4
4
  export declare const shadow: readonly ["--shadow-l", "--shadow-m", "--shadow-s"];
@@ -123,6 +123,7 @@ export var color = [
123
123
  '--color-accent-tertiary-hover',
124
124
  '--color-accent-tertiary-pressed',
125
125
  '--color-accent-disabled',
126
+ '--color-accent-secondary-inverse',
126
127
  '--color-accent-main-inverse',
127
128
  '--color-additional-a1',
128
129
  '--color-additional-a2',
@@ -1 +1,2 @@
1
+ export declare const FIXED_CLASSNAME = "ScrollLock-fixed";
1
2
  export declare function useLockBodyScroll(active?: boolean): void;
@@ -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 originalStyle = window.getComputedStyle(document.body).overflow;
9
- document.body.style.overflow = 'hidden';
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
- document.body.style.overflow = originalStyle;
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,7 @@
1
+ export var getScrollbarSize = function (el) {
2
+ if (el === void 0) { el = document.body; }
3
+ if (el === document.body) {
4
+ return window.innerWidth - el.offsetWidth;
5
+ }
6
+ return el.offsetWidth - el.scrollWidth;
7
+ };
@@ -0,0 +1 @@
1
+ export * from './getScrollbarSize';
@@ -0,0 +1 @@
1
+ export * from './getScrollbarSize';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ozen-ui/kit",
3
- "version": "0.14.0",
3
+ "version": "0.16.0",
4
4
  "description": "React component library",
5
5
  "files": [
6
6
  "*"