@ozen-ui/kit 0.6.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 (103) hide show
  1. package/Paper/package.json +5 -0
  2. package/__inner__/cjs/components/Alert/Alert.css +0 -5
  3. package/__inner__/cjs/components/Alert/Alert.js +3 -2
  4. package/__inner__/cjs/components/Breadcrumbs/Breadcrumbs.css +4 -0
  5. package/__inner__/cjs/components/Card/Card.css +9 -21
  6. package/__inner__/cjs/components/Card/Card.d.ts +3 -4
  7. package/__inner__/cjs/components/Card/Card.js +11 -1
  8. package/__inner__/cjs/components/Dialog/Dialog.css +0 -2
  9. package/__inner__/cjs/components/Dialog/Dialog.d.ts +21 -1
  10. package/__inner__/cjs/components/Drawer/Drawer.css +0 -1
  11. package/__inner__/cjs/components/Drawer/Drawer.d.ts +23 -1
  12. package/__inner__/cjs/components/Menu/components/MenuItem/MenuItem.js +3 -2
  13. package/__inner__/cjs/components/Modal/Modal.css +8 -11
  14. package/__inner__/cjs/components/Modal/Modal.d.ts +74 -5
  15. package/__inner__/cjs/components/Modal/Modal.js +13 -20
  16. package/__inner__/cjs/components/Modal/components/ModalConsumer.d.ts +5 -0
  17. package/__inner__/cjs/components/Modal/components/ModalConsumer.js +15 -0
  18. package/__inner__/cjs/components/Modal/components/index.d.ts +1 -0
  19. package/__inner__/cjs/components/Modal/components/index.js +4 -0
  20. package/__inner__/cjs/components/Paper/Paper.css +44 -0
  21. package/__inner__/cjs/components/Paper/Paper.d.ts +19 -0
  22. package/__inner__/cjs/components/Paper/Paper.js +25 -0
  23. package/__inner__/cjs/components/Paper/index.d.ts +1 -0
  24. package/__inner__/cjs/components/Paper/index.js +4 -0
  25. package/__inner__/cjs/components/Popover/Popover.css +1 -11
  26. package/__inner__/cjs/components/Popover/Popover.d.ts +2 -3
  27. package/__inner__/cjs/components/Popover/Popover.js +4 -3
  28. package/__inner__/cjs/components/Popover/components/PopoverArrow.js +2 -2
  29. package/__inner__/cjs/components/Popover/components/types.d.ts +0 -3
  30. package/__inner__/cjs/components/Popover/components/types.js +1 -2
  31. package/__inner__/cjs/components/Popover/constants.d.ts +1 -0
  32. package/__inner__/cjs/components/Popover/constants.js +3 -1
  33. package/__inner__/cjs/components/Popover/types.d.ts +8 -4
  34. package/__inner__/cjs/components/Portal/Portal.d.ts +8 -8
  35. package/__inner__/cjs/components/Portal/Portal.js +7 -6
  36. package/__inner__/cjs/components/Snackbar/SnackbarProvider.d.ts +4 -1
  37. package/__inner__/cjs/components/Snackbar/components/Snackbar/Snackbar.d.ts +6 -1
  38. package/__inner__/cjs/components/ThemeProvider/ThemeProvider.d.ts +2 -1
  39. package/__inner__/cjs/components/ThemeProvider/types.d.ts +2 -0
  40. package/__inner__/cjs/components/Tooltip/Tooltip.css +11 -16
  41. package/__inner__/cjs/components/Tooltip/Tooltip.js +1 -2
  42. package/__inner__/cjs/components/Tooltip/constants.d.ts +1 -0
  43. package/__inner__/cjs/components/Tooltip/constants.js +3 -1
  44. package/__inner__/cjs/components/Tooltip/types.d.ts +3 -2
  45. package/__inner__/cjs/components/Typography/Typography.css +36 -0
  46. package/__inner__/cjs/components/Typography/Typography.d.ts +1 -1
  47. package/__inner__/cjs/components/Typography/Typography.js +12 -0
  48. package/__inner__/cjs/hooks/useLockBodyScroll/index.d.ts +1 -0
  49. package/__inner__/cjs/hooks/useLockBodyScroll/index.js +4 -0
  50. package/__inner__/cjs/hooks/useLockBodyScroll/useLockBodyScroll.d.ts +1 -0
  51. package/__inner__/cjs/hooks/useLockBodyScroll/useLockBodyScroll.js +18 -0
  52. package/__inner__/esm/components/Alert/Alert.css +0 -5
  53. package/__inner__/esm/components/Alert/Alert.js +3 -2
  54. package/__inner__/esm/components/Breadcrumbs/Breadcrumbs.css +4 -0
  55. package/__inner__/esm/components/Card/Card.css +9 -21
  56. package/__inner__/esm/components/Card/Card.d.ts +3 -4
  57. package/__inner__/esm/components/Card/Card.js +11 -1
  58. package/__inner__/esm/components/Dialog/Dialog.css +0 -2
  59. package/__inner__/esm/components/Dialog/Dialog.d.ts +21 -1
  60. package/__inner__/esm/components/Drawer/Drawer.css +0 -1
  61. package/__inner__/esm/components/Drawer/Drawer.d.ts +23 -1
  62. package/__inner__/esm/components/Menu/components/MenuItem/MenuItem.js +3 -2
  63. package/__inner__/esm/components/Modal/Modal.css +8 -11
  64. package/__inner__/esm/components/Modal/Modal.d.ts +74 -5
  65. package/__inner__/esm/components/Modal/Modal.js +13 -20
  66. package/__inner__/esm/components/Modal/components/ModalConsumer.d.ts +5 -0
  67. package/__inner__/esm/components/Modal/components/ModalConsumer.js +12 -0
  68. package/__inner__/esm/components/Modal/components/index.d.ts +1 -0
  69. package/__inner__/esm/components/Modal/components/index.js +1 -0
  70. package/__inner__/esm/components/Paper/Paper.css +44 -0
  71. package/__inner__/esm/components/Paper/Paper.d.ts +19 -0
  72. package/__inner__/esm/components/Paper/Paper.js +22 -0
  73. package/__inner__/esm/components/Paper/index.d.ts +1 -0
  74. package/__inner__/esm/components/Paper/index.js +1 -0
  75. package/__inner__/esm/components/Popover/Popover.css +1 -11
  76. package/__inner__/esm/components/Popover/Popover.d.ts +2 -3
  77. package/__inner__/esm/components/Popover/Popover.js +6 -5
  78. package/__inner__/esm/components/Popover/components/PopoverArrow.js +2 -2
  79. package/__inner__/esm/components/Popover/components/types.d.ts +0 -3
  80. package/__inner__/esm/components/Popover/components/types.js +0 -1
  81. package/__inner__/esm/components/Popover/constants.d.ts +1 -0
  82. package/__inner__/esm/components/Popover/constants.js +2 -0
  83. package/__inner__/esm/components/Popover/types.d.ts +8 -4
  84. package/__inner__/esm/components/Portal/Portal.d.ts +8 -8
  85. package/__inner__/esm/components/Portal/Portal.js +7 -6
  86. package/__inner__/esm/components/Snackbar/SnackbarProvider.d.ts +4 -1
  87. package/__inner__/esm/components/Snackbar/components/Snackbar/Snackbar.d.ts +6 -1
  88. package/__inner__/esm/components/ThemeProvider/ThemeProvider.d.ts +2 -1
  89. package/__inner__/esm/components/ThemeProvider/types.d.ts +2 -0
  90. package/__inner__/esm/components/Tooltip/Tooltip.css +11 -16
  91. package/__inner__/esm/components/Tooltip/Tooltip.js +3 -4
  92. package/__inner__/esm/components/Tooltip/constants.d.ts +1 -0
  93. package/__inner__/esm/components/Tooltip/constants.js +2 -0
  94. package/__inner__/esm/components/Tooltip/types.d.ts +3 -2
  95. package/__inner__/esm/components/Typography/Typography.css +36 -0
  96. package/__inner__/esm/components/Typography/Typography.d.ts +1 -1
  97. package/__inner__/esm/components/Typography/Typography.js +12 -0
  98. package/__inner__/esm/hooks/useLockBodyScroll/index.d.ts +1 -0
  99. package/__inner__/esm/hooks/useLockBodyScroll/index.js +1 -0
  100. package/__inner__/esm/hooks/useLockBodyScroll/useLockBodyScroll.d.ts +1 -0
  101. package/__inner__/esm/hooks/useLockBodyScroll/useLockBodyScroll.js +14 -0
  102. package/package.json +1 -1
  103. package/useLockBodyScroll/package.json +5 -0
@@ -0,0 +1,5 @@
1
+ {
2
+ "main": "../__inner__/cjs/components/Paper/index.js",
3
+ "module": "../__inner__/esm/components/Paper/index.js",
4
+ "types": "../__inner__/esm/components/Paper/index.d.ts"
5
+ }
@@ -1,7 +1,6 @@
1
1
  /* stylelint-disable */
2
2
  .Alert {
3
3
  position: relative;
4
- border-radius: var(--border-radius-xs);
5
4
  display: flex;
6
5
  -moz-column-gap: var(--space-s);
7
6
  column-gap: var(--space-s);
@@ -11,8 +10,6 @@
11
10
  box-sizing: border-box;
12
11
  border-inline-start: 4px solid var(--alert-border-color);
13
12
  padding: 16px;
14
- box-shadow: var(--shadow-m);
15
- background-color: var(--alert-background-color);
16
13
 
17
14
  font: var(--typography-text-xs-font);
18
15
 
@@ -21,14 +18,12 @@
21
18
  text-transform: var(--typography-text-xs-text_transform, none);
22
19
  }
23
20
  .Alert_color_light {
24
- --alert-background-color: var(--color-background-main);
25
21
  --alert-title-text-color: var(--color-content-primary);
26
22
  --alert-body-text-color: var(--color-content-secondary);
27
23
  --alert-icon-color: var(--color-content-primary);
28
24
  --alert-close-button-color: var(--color-background-main-inverse);
29
25
  }
30
26
  .Alert_color_dark {
31
- --alert-background-color: var(--color-background-main-inverse);
32
27
  --alert-title-text-color: var(--color-content-primary-inverse);
33
28
  --alert-body-text-color: var(--color-content-tertiary);
34
29
  --alert-icon-color: var(--color-content-primary-inverse);
@@ -8,6 +8,7 @@ var icons_1 = require("@ozen-ui/icons");
8
8
  var useThemeProps_1 = require("../../hooks/useThemeProps");
9
9
  var classname_1 = require("../../utils/classname");
10
10
  var IconButton_1 = require("../IconButton");
11
+ var Paper_1 = require("../Paper");
11
12
  var constants_1 = require("./constants");
12
13
  exports.cnAlert = (0, classname_1.cn)('Alert');
13
14
  exports.alertStatusVariant = [
@@ -43,9 +44,9 @@ exports.Alert = (0, react_1.forwardRef)(function (inProps, ref) {
43
44
  }
44
45
  return react_1["default"].cloneElement(actionProp, actionProps);
45
46
  }, [actionProp]);
46
- return (react_1["default"].createElement("div", tslib_1.__assign({ className: (0, exports.cnAlert)({ status: status, hasCloseButton: !!onClose, color: color }, [
47
+ return (react_1["default"].createElement(Paper_1.Paper, tslib_1.__assign({ role: "alert", radius: "xs", shadow: "m", background: color === 'light' ? 'main' : 'main-inverse', className: (0, exports.cnAlert)({ status: status, hasCloseButton: !!onClose, color: color }, [
47
48
  className,
48
- ]), role: "alert" }, otherProps, { ref: ref }),
49
+ ]) }, otherProps, { ref: ref }),
49
50
  showIcon && (react_1["default"].createElement("div", { className: (0, exports.cnAlert)('Icon') }, matchStatusToIcon[status])),
50
51
  react_1["default"].createElement("div", { className: (0, exports.cnAlert)('Content') },
51
52
  react_1["default"].createElement("div", { className: (0, exports.cnAlert)('Title') }, title),
@@ -12,3 +12,7 @@
12
12
  display: flex;
13
13
  align-items: center;
14
14
  }
15
+
16
+ .Breadcrumbs-Item .Button-Label {
17
+ color: var(--color-content-secondary);
18
+ }
@@ -1,26 +1,21 @@
1
1
  .Card {
2
2
  position: relative;
3
- background-color: var(--card-background-color);
4
3
  padding: var(--card-padding);
5
4
  cursor: var(--card-cursor-style);
6
- border-radius: var(--card-border-radius);
7
5
  transition: var(--transition-default);
8
6
  box-sizing: border-box;
9
7
  }
10
8
 
11
9
  .Card_size_s {
12
10
  --card-padding: var(--space-l);
13
- --card-border-radius: var(--border-radius-xs);
14
11
  }
15
12
 
16
13
  .Card_size_m {
17
14
  --card-padding: var(--space-xl);
18
- --card-border-radius: var(--border-radius-m);
19
15
  }
20
16
 
21
17
  .Card_size_l {
22
18
  --card-padding: var(--space-2xl);
23
- --card-border-radius: var(--border-radius-l);
24
19
  }
25
20
 
26
21
  .Card_interactive {
@@ -32,8 +27,9 @@
32
27
  position: absolute;
33
28
  inset: 0;
34
29
  pointer-events: none;
35
- border: var(--card-border-width) var(--card-border-style) var(--card-border-color);
36
- border-radius: var(--card-border-radius);
30
+ border: var(--card-border-width) var(--card-border-style)
31
+ var(--card-border-color);
32
+ border-radius: var(--paper-border-radius);
37
33
  transition: var(--transition-default);
38
34
  }
39
35
 
@@ -61,14 +57,6 @@
61
57
  --card-border-style: dashed;
62
58
  }
63
59
 
64
- .Card_backgroundColor_standard {
65
- --card-background-color: var(--color-background-main);
66
- }
67
-
68
- .Card_backgroundColor_selected {
69
- --card-background-color: var(--color-background-action-light);
70
- }
71
-
72
60
  .Card_interactive.Card_borderColor_standard:hover {
73
61
  --card-border-color: var(--color-border-secondary-hover);
74
62
  }
@@ -85,12 +73,6 @@
85
73
  --card-border-color: var(--color-border-action-pressed);
86
74
  }
87
75
 
88
- .Card_disabled {
89
- --card-background-color: var(--color-background-disabled);
90
- --card-border-color: var(--color-border-disabled);
91
- pointer-events: none;
92
- }
93
-
94
76
  .Card:focus {
95
77
  outline: 0;
96
78
  box-shadow: var(--shadow-outline-focused);
@@ -99,3 +81,9 @@
99
81
  .Card:focus:not(:focus-visible) {
100
82
  box-shadow: none;
101
83
  }
84
+
85
+ .Card[aria-disabled='true'] {
86
+ --card-border-color: var(--color-border-disabled);
87
+ background-color: var(--color-background-disabled);
88
+ pointer-events: none;
89
+ }
@@ -1,7 +1,6 @@
1
1
  import './Card.css';
2
- import { ElementType } from 'react';
3
- import type { ReactNode } from 'react';
4
- import { type PolymorphicComponentPropsWithoutRef } from '../../utils/polymorphicComponentWithRef';
2
+ import type { ReactNode, ElementType } from 'react';
3
+ import { type PolymorphicComponentPropsWithRef } from '../../utils/polymorphicComponentWithRef';
5
4
  export declare const cnCard: import("@bem-react/classname").ClassNameFormatter;
6
5
  export declare const cardSizeVariant: readonly ["s", "m", "l"];
7
6
  export declare const cardBorderWidthVariant: readonly ["none", "s", "m"];
@@ -34,5 +33,5 @@ export type CardBaseProps = {
34
33
  className?: string;
35
34
  'data-testid'?: string;
36
35
  };
37
- export type CardProps<As extends ElementType = 'div'> = PolymorphicComponentPropsWithoutRef<CardBaseProps, As>;
36
+ export type CardProps<As extends ElementType = 'div'> = PolymorphicComponentPropsWithRef<CardBaseProps, As>;
38
37
  export declare const Card: import("../../utils/polymorphicComponentWithRef").PolymorphicComponentWithRef<CardBaseProps, "div">;
@@ -7,18 +7,28 @@ var react_1 = tslib_1.__importDefault(require("react"));
7
7
  var useThemeProps_1 = require("../../hooks/useThemeProps");
8
8
  var classname_1 = require("../../utils/classname");
9
9
  var polymorphicComponentWithRef_1 = require("../../utils/polymorphicComponentWithRef");
10
+ var Paper_1 = require("../Paper");
10
11
  exports.cnCard = (0, classname_1.cn)('Card');
11
12
  exports.cardSizeVariant = ['s', 'm', 'l'];
12
13
  exports.cardBorderWidthVariant = ['none', 's', 'm'];
13
14
  exports.cardBorderVariant = ['solid', 'dashed'];
14
15
  exports.cardBorderColorVariant = ['standard', 'selected'];
15
16
  exports.cardBackgroundColorVariant = ['standard', 'selected'];
17
+ var matchBorderRadiusPaperToCard = {
18
+ s: 'xs',
19
+ m: 's',
20
+ l: 'l'
21
+ };
22
+ var matchBackgroundColorPaperToCard = {
23
+ selected: 'action-light',
24
+ standard: 'main'
25
+ };
16
26
  exports.Card = (0, polymorphicComponentWithRef_1.polymorphicComponentWithRef)(function (inProps, ref) {
17
27
  var props = (0, useThemeProps_1.useThemeProps)({ props: inProps, name: 'Card' });
18
28
  var _a = props.size, size = _a === void 0 ? 'm' : _a, _b = props.disabled, disabled = _b === void 0 ? false : _b, _c = props.interactive, interactive = _c === void 0 ? false : _c, _d = props.borderWidth, borderWidth = _d === void 0 ? 's' : _d, _e = props.borderVariant, borderVariant = _e === void 0 ? 'solid' : _e, _f = props.borderColor, borderColor = _f === void 0 ? 'standard' : _f, _g = props.backgroundColor, backgroundColor = _g === void 0 ? 'standard' : _g, _h = props.as, Tag = _h === void 0 ? 'div' : _h, className = props.className, children = props.children, other = tslib_1.__rest(props, ["size", "disabled", "interactive", "borderWidth", "borderVariant", "borderColor", "backgroundColor", "as", "className", "children"]);
19
29
  var shouldBeInteractive = !disabled && interactive;
20
30
  var shouldShowBorder = borderWidth !== 'none';
21
- return (react_1["default"].createElement(Tag, tslib_1.__assign({}, other, { ref: ref, "aria-disabled": disabled }, (shouldBeInteractive && { tabIndex: 0 }), { className: (0, exports.cnCard)(tslib_1.__assign({ size: size, disabled: disabled, interactive: shouldBeInteractive, backgroundColor: backgroundColor, borderWidth: borderWidth }, (shouldShowBorder && {
31
+ return (react_1["default"].createElement(Paper_1.Paper, tslib_1.__assign({ as: Tag, radius: matchBorderRadiusPaperToCard[size], background: matchBackgroundColorPaperToCard[backgroundColor] }, other, { ref: ref, "aria-disabled": disabled }, (shouldBeInteractive && { tabIndex: 0 }), { className: (0, exports.cnCard)(tslib_1.__assign({ size: size, disabled: disabled, interactive: shouldBeInteractive, backgroundColor: backgroundColor, borderWidth: borderWidth }, (shouldShowBorder && {
22
32
  borderVariant: borderVariant,
23
33
  borderColor: borderColor
24
34
  })), [className]) }), children));
@@ -13,8 +13,6 @@
13
13
  max-inline-size: var(--modal-width);
14
14
  /* stylelint-disable-next-line plugin/use-logical-units */
15
15
  max-block-size: calc(100vh - 64px);
16
- border-radius: var(--border-radius-m);
17
- box-shadow: var(--shadow-l);
18
16
  }
19
17
  .Dialog-InnerContainer {
20
18
  display: flex;
@@ -28,4 +28,24 @@ export type DialogProps = {
28
28
  /** Кастомный класс контейнера диалогового окна */
29
29
  className?: string;
30
30
  } & Omit<ModalProps, 'open' | 'onClose' | 'children' | 'className'>;
31
- export declare const Dialog: React.ForwardRefExoticComponent<Omit<DialogProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
31
+ export declare const Dialog: React.ForwardRefExoticComponent<{
32
+ /** Признак по которому компонент будет представлен */
33
+ open: boolean;
34
+ /** Содержимое диалогового окна */
35
+ children: React.ReactNode;
36
+ /** Устанавливает размер типографики и отступов в диалоговом окне */
37
+ size?: "s" | "l" | undefined;
38
+ /** Вариант диалогового окна */
39
+ variant?: "small" | "medium" | "large" | "fullsize" | undefined;
40
+ /** Функция обратного вызова которая будет вызвана когда компонент запрашивает
41
+ * закрытие (нажатие на клавишу {ESC}, клик по подложке Backdrop) */
42
+ onClose?: (() => void) | undefined;
43
+ /** Свойства кнопки закрытия диалогового окна */
44
+ closeButtonProps?: (Omit<IconButtonProps<"button">, "icon"> & {
45
+ 'data-testid'?: string | undefined;
46
+ }) | undefined;
47
+ /** Признак по которому кнопка закрытия диалогового окна будет скрыта */
48
+ hideCloseButton?: boolean | undefined;
49
+ /** Кастомный класс контейнера диалогового окна */
50
+ className?: string | undefined;
51
+ } & Omit<ModalProps, "className" | "children" | "open" | "onClose"> & React.RefAttributes<HTMLDivElement>>;
@@ -15,7 +15,6 @@
15
15
  border: none;
16
16
  inset-block-start: auto;
17
17
  inset-inline-start: auto;
18
- box-shadow: var(--shadow-m);
19
18
  transform: none;
20
19
  padding: 0;
21
20
  outline: none;
@@ -32,4 +32,26 @@ export type DrawerProps = {
32
32
  /** Кастомный класс контейнера шторки */
33
33
  className?: string;
34
34
  } & Omit<ModalProps, 'open' | 'onClose' | 'children' | 'className'>;
35
- export declare const Drawer: React.ForwardRefExoticComponent<Omit<DrawerProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
35
+ export declare const Drawer: React.ForwardRefExoticComponent<{
36
+ /** Признак по которому компонент будет представлен */
37
+ open?: boolean | undefined;
38
+ /** Вариант представления шторки */
39
+ variant?: "medium" | "large" | "little" | undefined;
40
+ /** Устанавливает размер типографики и отступов в шторке */
41
+ size?: "s" | "l" | undefined;
42
+ /** Функция обратного вызова которая будет вызвана когда компонент запрашивает
43
+ * закрытие (нажатие на клавишу {ESC}, клик по подложке Backdrop) */
44
+ onClose?: (() => void) | undefined;
45
+ /** Содержимое шторки */
46
+ children?: React.ReactNode;
47
+ /** Расположение шторки */
48
+ placement?: "left" | "right" | undefined;
49
+ /** Признак по которому кнопка закрытия шторки будет скрыта */
50
+ hideCloseButton?: boolean | undefined;
51
+ /** Свойства кнопки закрытия шторки */
52
+ closeButtonProps?: (Omit<IconButtonProps<"button">, "icon"> & {
53
+ 'data-testid'?: string | undefined;
54
+ }) | undefined;
55
+ /** Кастомный класс контейнера шторки */
56
+ className?: string | undefined;
57
+ } & Omit<ModalProps, "className" | "children" | "open" | "onClose"> & React.RefAttributes<HTMLDivElement>>;
@@ -8,10 +8,11 @@ var useThemeProps_1 = require("../../../../hooks/useThemeProps");
8
8
  var classname_1 = require("../../../../utils/classname");
9
9
  var polymorphicComponentWithRef_1 = require("../../../../utils/polymorphicComponentWithRef");
10
10
  var List_1 = require("../../../List");
11
+ var constants_1 = require("../../../List/constants");
11
12
  exports.cnMenuItem = (0, classname_1.cn)('MenuItem');
12
13
  exports.MenuItem = (0, polymorphicComponentWithRef_1.polymorphicComponentWithRef)(function (inProps, ref) {
13
14
  var props = (0, useThemeProps_1.useThemeProps)({ props: inProps, name: 'MenuItem' });
14
- var children = props.children, selected = props.selected, value = props.value, label = props.label, _a = props.autoFocus, autoFocus = _a === void 0 ? false : _a, className = props.className, other = tslib_1.__rest(props, ["children", "selected", "value", "label", "autoFocus", "className"]);
15
+ var children = props.children, selected = props.selected, value = props.value, label = props.label, _a = props.autoFocus, autoFocus = _a === void 0 ? false : _a, className = props.className, _b = props.as, Tag = _b === void 0 ? constants_1.LIST_ITEM_BUTTON_DEFAULT_TAG : _b, other = tslib_1.__rest(props, ["children", "selected", "value", "label", "autoFocus", "className", "as"]);
15
16
  var innerRef = (0, react_1.useRef)(null);
16
17
  (0, react_1.useEffect)(function () {
17
18
  var _a;
@@ -19,6 +20,6 @@ exports.MenuItem = (0, polymorphicComponentWithRef_1.polymorphicComponentWithRef
19
20
  (_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
20
21
  }
21
22
  }, [autoFocus]);
22
- return (react_1["default"].createElement(List_1.ListItemButton, tslib_1.__assign({ role: "menuitem" }, other, { ref: (0, useMultiRef_1.useMultiRef)([ref, innerRef]), className: (0, List_1.cnListItemButton)({ selected: selected }, [className, (0, exports.cnMenuItem)()]), "data-value": value, "data-label": label }), children));
23
+ return (react_1["default"].createElement(List_1.ListItemButton, tslib_1.__assign({ role: "menuitem", as: Tag }, other, { ref: (0, useMultiRef_1.useMultiRef)([ref, innerRef]), className: (0, List_1.cnListItemButton)({ selected: selected }, [className, (0, exports.cnMenuItem)()]), "data-value": value, "data-label": label }), children));
23
24
  });
24
25
  exports.MenuItem.displayName = 'MenuItem';
@@ -1,34 +1,29 @@
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%;
23
19
  transform: translate(-50%, -50%);
24
20
  inline-size: 400px;
25
- background-color: var(--color-background-main);
26
21
  box-sizing: border-box;
27
22
  border: 2px solid black;
28
23
  padding: var(--space-2xl);
29
24
  }
30
25
 
31
- .Modal_hidden {
26
+ .Modal_hidden {
32
27
  visibility: hidden;
33
28
  }
34
29
 
@@ -39,7 +34,8 @@
39
34
 
40
35
  .Modal_animation-enter-active .Modal-Window, .Modal_animation-appear-active .Modal-Window {
41
36
  opacity: 1;
42
- transition: opacity var(--transition-slow),
37
+ transition:
38
+ opacity var(--transition-slow),
43
39
  transform var(--transition-slow);
44
40
  transform: translate(-50%, -50%) translateY(0);
45
41
  }
@@ -58,7 +54,8 @@
58
54
  .Modal_animation-exit-active .Modal-Window {
59
55
  opacity: 0;
60
56
  visibility: visible;
61
- transition: opacity var(--transition-slow),
57
+ transition:
58
+ opacity var(--transition-slow),
62
59
  transform var(--transition-slow);
63
60
  transform: translate(-50%, -50%) translateY(100px);
64
61
  }
@@ -1,9 +1,10 @@
1
1
  import './Modal.css';
2
2
  import React from 'react';
3
- import type { ReactNode, ComponentPropsWithRef } from 'react';
3
+ import type { ReactNode, RefObject } from 'react';
4
4
  import { CSSTransitionProps } from 'react-transition-group/CSSTransition';
5
- import { BackdropProps } from '../Backdrop';
6
- import { PortalProps, PortalRef } from '../Portal';
5
+ import { type BackdropProps } from '../Backdrop';
6
+ import { type PaperProps } from '../Paper';
7
+ import { type PortalProps, type PortalRef } from '../Portal';
7
8
  export declare const cnModal: import("@bem-react/classname").ClassNameFormatter;
8
9
  export type ModalProps = {
9
10
  /** Признак по которому компонент будет представлен */
@@ -29,6 +30,12 @@ export type ModalProps = {
29
30
  hideBackdrop?: boolean;
30
31
  /** Если {true} предотвращает размонтирование компонента при событии закрыть */
31
32
  keepMounted?: boolean;
33
+ /** Если {true} отключает блокировку прокрутки основного экрана приложения */
34
+ disableScrollLock?: boolean;
35
+ /** Если {true} отключает закрытие окна при клике за его пределами */
36
+ disableClickOutside?: boolean;
37
+ /** Если {true} отключает закрытие окна при нажатии на клавишу ESC */
38
+ disableEscapeKeyDown?: boolean;
32
39
  /** Свойства компонента Backdrop (подложка) */
33
40
  backdropProps?: BackdropProps & {
34
41
  'data-testid'?: string;
@@ -38,7 +45,7 @@ export type ModalProps = {
38
45
  'data-testid'?: string;
39
46
  };
40
47
  /** Свойства окна с контентом */
41
- windowProps?: ComponentPropsWithRef<'div'> & {
48
+ windowProps?: PaperProps & {
42
49
  'data-testid'?: string;
43
50
  };
44
51
  /** Кастомный класс контейнера модального окна */
@@ -47,6 +54,68 @@ export type ModalProps = {
47
54
  'data-testid'?: string;
48
55
  /** Контейнер для монтирования всплывающего окна */
49
56
  container?: PortalProps['container'];
57
+ /** Список ссылок на элементы при клике на которые Modal не будет закрываться (см. хук useClickOutside) */
58
+ ignoreClickOutsideRefs?: Array<RefObject<HTMLElement>>;
50
59
  } & PortalProps;
51
60
  export type ModalRef = PortalRef;
52
- export declare const Modal: React.ForwardRefExoticComponent<Omit<ModalProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
61
+ export declare const Modal: React.ForwardRefExoticComponent<{
62
+ /** Признак по которому компонент будет представлен */
63
+ open?: boolean | undefined;
64
+ /** Содержимое модального окна */
65
+ children: ReactNode;
66
+ /** Функция обратного вызова которая будет вызвана до начала
67
+ * перехода компонента в состояние представлен */
68
+ onEnter?: (() => void) | undefined;
69
+ /** Функция обратного вызова которая будет вызвана после завершения
70
+ * перехода компонента в состояние представлен */
71
+ onEntered?: (() => void) | undefined;
72
+ /** Функция обратного вызова которая будет вызвана до начала
73
+ * перехода компонента в состояние не представлен */
74
+ onExit?: (() => void) | undefined;
75
+ /** Функция обратного вызова которая будет вызвана после
76
+ * завершения перехода в состояние не представлен */
77
+ onExited?: (() => void) | undefined;
78
+ /** Функция обратного вызова которая будет вызвана когда компонент запрашивает
79
+ * закрытие (нажатие на клавишу {ESC}, клик по подложке Backdrop) */
80
+ onClose?: (() => void) | undefined;
81
+ /** Если {true} скрывает подложку */
82
+ hideBackdrop?: boolean | undefined;
83
+ /** Если {true} предотвращает размонтирование компонента при событии закрыть */
84
+ keepMounted?: boolean | undefined;
85
+ /** Если {true} отключает блокировку прокрутки основного экрана приложения */
86
+ disableScrollLock?: boolean | undefined;
87
+ /** Если {true} отключает закрытие окна при клике за его пределами */
88
+ disableClickOutside?: boolean | undefined;
89
+ /** Если {true} отключает закрытие окна при нажатии на клавишу ESC */
90
+ disableEscapeKeyDown?: boolean | undefined;
91
+ /** Свойства компонента Backdrop (подложка) */
92
+ backdropProps?: (import("../Backdrop").BackdropBaseProps & {
93
+ as?: "div" | undefined;
94
+ } & Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
95
+ ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject<HTMLDivElement> | null | undefined;
96
+ }, keyof import("../Backdrop").BackdropBaseProps> & {
97
+ 'data-testid'?: string | undefined;
98
+ }) | undefined;
99
+ /** Свойства по управлению анимацией перехода */
100
+ transitionProps?: (Partial<CSSTransitionProps<undefined>> & {
101
+ 'data-testid'?: string | undefined;
102
+ }) | undefined;
103
+ /** Свойства окна с контентом */
104
+ windowProps?: (import("../Paper").PaperBaseProps & {
105
+ as?: "div" | undefined;
106
+ } & Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
107
+ ref?: ((instance: HTMLDivElement | null) => void) | React.RefObject<HTMLDivElement> | null | undefined;
108
+ }, keyof import("../Paper").PaperBaseProps> & {
109
+ 'data-testid'?: string | undefined;
110
+ }) | undefined;
111
+ /** Кастомный класс контейнера модального окна */
112
+ className?: string | undefined;
113
+ /** Идентификатор компонента для тестов */
114
+ 'data-testid'?: string | undefined;
115
+ /** Контейнер для монтирования всплывающего окна */
116
+ container?: PortalProps['container'];
117
+ /** Список ссылок на элементы при клике на которые Modal не будет закрываться (см. хук useClickOutside) */
118
+ ignoreClickOutsideRefs?: React.RefObject<HTMLElement>[] | undefined;
119
+ } & import("../Portal").PortalBaseProps & {
120
+ as?: "div" | undefined;
121
+ } & Omit<Omit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref">, "container"> & React.RefAttributes<HTMLDivElement>>;
@@ -13,23 +13,26 @@ var classname_1 = require("../../utils/classname");
13
13
  var isKey_1 = require("../../utils/isKey");
14
14
  var Backdrop_1 = require("../Backdrop");
15
15
  var Portal_1 = require("../Portal");
16
+ var components_1 = require("./components");
16
17
  var index_1 = require("./index");
17
18
  exports.cnModal = (0, classname_1.cn)('Modal');
18
19
  exports.Modal = (0, react_1.forwardRef)(function (_a, ref) {
19
- 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"]);
20
21
  var hasBackdrop = !hideBackdrop;
21
- var hasScrollOnBody = (0, react_1.useRef)(null);
22
22
  var modalInnerRef = (0, react_1.useRef)(null);
23
23
  var focusedElement = (0, react_1.useRef)(null);
24
24
  var isClickOutSide = (0, react_1.useRef)(null);
25
- var _e = tslib_1.__read((0, react_1.useState)(false), 2), openState = _e[0], setOpenState = _e[1];
26
- 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;
27
27
  (0, useClickOutside_1.useClickOutside)({
28
- 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),
29
31
  handler: function () {
30
32
  isClickOutSide.current = true;
31
33
  onClose === null || onClose === void 0 ? void 0 : onClose();
32
- }
34
+ },
35
+ active: !disableClickOutside
33
36
  });
34
37
  (0, react_1.useEffect)(function () {
35
38
  var _a;
@@ -65,21 +68,11 @@ exports.Modal = (0, react_1.forwardRef)(function (_a, ref) {
65
68
  }
66
69
  onClose === null || onClose === void 0 ? void 0 : onClose();
67
70
  },
68
- active: isTop
71
+ active: isTop && !disableEscapeKeyDown
69
72
  });
70
- // Блокирует прокрутку основного окна приложения
71
- (0, react_1.useEffect)(function () {
72
- if (openState) {
73
- hasScrollOnBody.current = document.body.classList.contains('no-scroll');
74
- document.body.classList.add('no-scroll');
75
- }
76
- else if (!hasScrollOnBody.current) {
77
- document.body.classList.remove('no-scroll');
78
- }
79
- }, [openState]);
80
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 }),
81
- 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]) }),
82
- !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 }))),
83
- react_1["default"].createElement("div", tslib_1.__assign({}, 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))));
84
77
  });
85
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,44 @@
1
+ .Paper {
2
+ --paper-background-color: none;
3
+ --paper-border-radius: none;
4
+ --paper-box-shadow: none;
5
+ background-color: var(--paper-background-color);
6
+ border-radius: var(--paper-border-radius);
7
+ box-shadow: var(--paper-box-shadow);
8
+ }
9
+
10
+ .Paper_radius_xs {
11
+ --paper-border-radius: var(--border-radius-xs);
12
+ }
13
+
14
+ .Paper_radius_s {
15
+ --paper-border-radius: var(--border-radius-m);
16
+ }
17
+
18
+ .Paper_radius_l {
19
+ --paper-border-radius: var(--border-radius-l);
20
+ }
21
+
22
+ .Paper_background_main {
23
+ --paper-background-color: var(--color-background-main);
24
+ }
25
+
26
+ .Paper_background_main-inverse {
27
+ --paper-background-color: var(--color-background-main-inverse);
28
+ }
29
+
30
+ .Paper_background_action-light {
31
+ --paper-background-color: var(--color-background-action-light);
32
+ }
33
+
34
+ .Paper_background_accent {
35
+ --paper-background-color: var(--color-accent-main);
36
+ }
37
+
38
+ .Paper_shadow_m {
39
+ --paper-box-shadow: var(--shadow-m);
40
+ }
41
+
42
+ .Paper_shadow_l {
43
+ --paper-box-shadow: var(--shadow-l);
44
+ }
@@ -0,0 +1,19 @@
1
+ import './Paper.css';
2
+ import { type ComponentRef, type ElementType } from 'react';
3
+ import { type PolymorphicComponentPropsWithRef } from '../../utils/polymorphicComponentWithRef';
4
+ export declare const PAPER_DEFAULT_TAG = "div";
5
+ export declare const paperRadiusVariant: readonly ["xs", "s", "l"];
6
+ export type PaperRadiusVariant = (typeof paperRadiusVariant)[number];
7
+ export declare const paperBackgroundVariant: readonly ["main", "main-inverse", "action-light", "accent"];
8
+ export type PaperBackgroundVariant = (typeof paperBackgroundVariant)[number];
9
+ export declare const paperShadowVariant: readonly ["m", "l"];
10
+ export type PaperShadowVariant = (typeof paperShadowVariant)[number];
11
+ export type PaperBaseProps = {
12
+ radius?: PaperRadiusVariant;
13
+ background?: PaperBackgroundVariant;
14
+ shadow?: PaperShadowVariant;
15
+ };
16
+ export type PaperProps<As extends ElementType = typeof PAPER_DEFAULT_TAG> = PolymorphicComponentPropsWithRef<PaperBaseProps, As>;
17
+ export type PaperRef = ComponentRef<typeof PAPER_DEFAULT_TAG>;
18
+ export declare const cnPaper: import("@bem-react/classname").ClassNameFormatter;
19
+ export declare const Paper: import("../../utils/polymorphicComponentWithRef").PolymorphicComponentWithRef<PaperBaseProps, "div">;