@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
@@ -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">;
@@ -4,18 +4,28 @@ import React from 'react';
4
4
  import { useThemeProps } from '../../hooks/useThemeProps';
5
5
  import { cn } from '../../utils/classname';
6
6
  import { polymorphicComponentWithRef, } from '../../utils/polymorphicComponentWithRef';
7
+ import { Paper, } from '../Paper';
7
8
  export var cnCard = cn('Card');
8
9
  export var cardSizeVariant = ['s', 'm', 'l'];
9
10
  export var cardBorderWidthVariant = ['none', 's', 'm'];
10
11
  export var cardBorderVariant = ['solid', 'dashed'];
11
12
  export var cardBorderColorVariant = ['standard', 'selected'];
12
13
  export var cardBackgroundColorVariant = ['standard', 'selected'];
14
+ var matchBorderRadiusPaperToCard = {
15
+ s: 'xs',
16
+ m: 's',
17
+ l: 'l'
18
+ };
19
+ var matchBackgroundColorPaperToCard = {
20
+ selected: 'action-light',
21
+ standard: 'main'
22
+ };
13
23
  export var Card = polymorphicComponentWithRef(function (inProps, ref) {
14
24
  var props = useThemeProps({ props: inProps, name: 'Card' });
15
25
  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 = __rest(props, ["size", "disabled", "interactive", "borderWidth", "borderVariant", "borderColor", "backgroundColor", "as", "className", "children"]);
16
26
  var shouldBeInteractive = !disabled && interactive;
17
27
  var shouldShowBorder = borderWidth !== 'none';
18
- return (React.createElement(Tag, __assign({}, other, { ref: ref, "aria-disabled": disabled }, (shouldBeInteractive && { tabIndex: 0 }), { className: cnCard(__assign({ size: size, disabled: disabled, interactive: shouldBeInteractive, backgroundColor: backgroundColor, borderWidth: borderWidth }, (shouldShowBorder && {
28
+ return (React.createElement(Paper, __assign({ as: Tag, radius: matchBorderRadiusPaperToCard[size], background: matchBackgroundColorPaperToCard[backgroundColor] }, other, { ref: ref, "aria-disabled": disabled }, (shouldBeInteractive && { tabIndex: 0 }), { className: cnCard(__assign({ size: size, disabled: disabled, interactive: shouldBeInteractive, backgroundColor: backgroundColor, borderWidth: borderWidth }, (shouldShowBorder && {
19
29
  borderVariant: borderVariant,
20
30
  borderColor: borderColor
21
31
  })), [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>>;
@@ -5,10 +5,11 @@ import { useThemeProps } from '../../../../hooks/useThemeProps';
5
5
  import { cn } from '../../../../utils/classname';
6
6
  import { polymorphicComponentWithRef, } from '../../../../utils/polymorphicComponentWithRef';
7
7
  import { cnListItemButton, ListItemButton, } from '../../../List';
8
+ import { LIST_ITEM_BUTTON_DEFAULT_TAG } from '../../../List/constants';
8
9
  export var cnMenuItem = cn('MenuItem');
9
10
  export var MenuItem = polymorphicComponentWithRef(function (inProps, ref) {
10
11
  var props = useThemeProps({ props: inProps, name: 'MenuItem' });
11
- 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 = __rest(props, ["children", "selected", "value", "label", "autoFocus", "className"]);
12
+ 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 ? LIST_ITEM_BUTTON_DEFAULT_TAG : _b, other = __rest(props, ["children", "selected", "value", "label", "autoFocus", "className", "as"]);
12
13
  var innerRef = useRef(null);
13
14
  useEffect(function () {
14
15
  var _a;
@@ -16,6 +17,6 @@ export var MenuItem = polymorphicComponentWithRef(function (inProps, ref) {
16
17
  (_a = innerRef.current) === null || _a === void 0 ? void 0 : _a.focus();
17
18
  }
18
19
  }, [autoFocus]);
19
- return (React.createElement(ListItemButton, __assign({ role: "menuitem" }, other, { ref: useMultiRef([ref, innerRef]), className: cnListItemButton({ selected: selected }, [className, cnMenuItem()]), "data-value": value, "data-label": label }), children));
20
+ return (React.createElement(ListItemButton, __assign({ role: "menuitem", as: Tag }, other, { ref: useMultiRef([ref, innerRef]), className: cnListItemButton({ selected: selected }, [className, cnMenuItem()]), "data-value": value, "data-label": label }), children));
20
21
  });
21
22
  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>>;
@@ -10,23 +10,26 @@ import { cn } from '../../utils/classname';
10
10
  import { isKey } from '../../utils/isKey';
11
11
  import { Backdrop } from '../Backdrop';
12
12
  import { Portal } from '../Portal';
13
+ import { ModalConsumer } from './components';
13
14
  import { useModalManager } from './index';
14
15
  export var cnModal = cn('Modal');
15
16
  export var Modal = forwardRef(function (_a, ref) {
16
- var _b = _a.open, open = _b === void 0 ? false : _b, _c = _a.keepMounted, keepMounted = _c === void 0 ? false : _c, _d = _a.hideBackdrop, hideBackdrop = _d === void 0 ? false : _d, children = _a.children, onEnter = _a.onEnter, onEntered = _a.onEntered, onExit = _a.onExit, onExitedProp = _a.onExited, onClose = _a.onClose, backdropProps = _a.backdropProps, windowProps = _a.windowProps, transitionProps = _a.transitionProps, className = _a.className, other = __rest(_a, ["open", "keepMounted", "hideBackdrop", "children", "onEnter", "onEntered", "onExit", "onExited", "onClose", "backdropProps", "windowProps", "transitionProps", "className"]);
17
+ var _b = _a.open, open = _b === void 0 ? false : _b, _c = _a.keepMounted, keepMounted = _c === void 0 ? false : _c, _d = _a.hideBackdrop, hideBackdrop = _d === void 0 ? false : _d, _e = _a.disableScrollLock, disableScrollLock = _e === void 0 ? false : _e, _f = _a.disableClickOutside, disableClickOutside = _f === void 0 ? false : _f, _g = _a.disableEscapeKeyDown, disableEscapeKeyDown = _g === void 0 ? false : _g, children = _a.children, onEnter = _a.onEnter, onEntered = _a.onEntered, onExit = _a.onExit, onExitedProp = _a.onExited, onClose = _a.onClose, backdropProps = _a.backdropProps, windowProps = _a.windowProps, transitionProps = _a.transitionProps, className = _a.className, ignoreClickOutsideRefs = _a.ignoreClickOutsideRefs, other = __rest(_a, ["open", "keepMounted", "hideBackdrop", "disableScrollLock", "disableClickOutside", "disableEscapeKeyDown", "children", "onEnter", "onEntered", "onExit", "onExited", "onClose", "backdropProps", "windowProps", "transitionProps", "className", "ignoreClickOutsideRefs"]);
17
18
  var hasBackdrop = !hideBackdrop;
18
- var hasScrollOnBody = useRef(null);
19
19
  var modalInnerRef = useRef(null);
20
20
  var focusedElement = useRef(null);
21
21
  var isClickOutSide = useRef(null);
22
- var _e = __read(useState(false), 2), openState = _e[0], setOpenState = _e[1];
23
- var _f = useModalManager(modalInnerRef, 1000, openState), isTop = _f.isTop, refsClickOutside = _f.refsClickOutside;
22
+ var _h = __read(useState(false), 2), openState = _h[0], setOpenState = _h[1];
23
+ var _j = useModalManager(modalInnerRef, 1000, openState), isTop = _j.isTop, refsClickOutside = _j.refsClickOutside;
24
24
  useClickOutside({
25
- refs: __spreadArray([modalInnerRef], __read(refsClickOutside), false),
25
+ refs: __spreadArray(__spreadArray([
26
+ modalInnerRef
27
+ ], __read(refsClickOutside), false), __read((ignoreClickOutsideRefs || [])), false),
26
28
  handler: function () {
27
29
  isClickOutSide.current = true;
28
30
  onClose === null || onClose === void 0 ? void 0 : onClose();
29
- }
31
+ },
32
+ active: !disableClickOutside
30
33
  });
31
34
  useEffect(function () {
32
35
  var _a;
@@ -62,21 +65,11 @@ export var Modal = forwardRef(function (_a, ref) {
62
65
  }
63
66
  onClose === null || onClose === void 0 ? void 0 : onClose();
64
67
  },
65
- active: isTop
68
+ active: isTop && !disableEscapeKeyDown
66
69
  });
67
- // Блокирует прокрутку основного окна приложения
68
- useEffect(function () {
69
- if (openState) {
70
- hasScrollOnBody.current = document.body.classList.contains('no-scroll');
71
- document.body.classList.add('no-scroll');
72
- }
73
- else if (!hasScrollOnBody.current) {
74
- document.body.classList.remove('no-scroll');
75
- }
76
- }, [openState]);
77
70
  return (React.createElement(CSSTransition, __assign({ classNames: cnModal({ animation: true }), timeout: 300 }, transitionProps, { "in": openState, onEnter: onEnter, onEntered: onEntered, onExit: onExit, onExited: onExited, unmountOnExit: !keepMounted, appear: true }),
78
- React.createElement(Portal, __assign({}, other, { className: cnModal({ hidden: keepMounted && !openState, hasBackdrop: hasBackdrop }, [className]), ref: useMultiRef([modalInnerRef, ref]) }),
79
- !hideBackdrop && (React.createElement(Backdrop, __assign({ zIndex: -1 }, backdropProps, { onClick: onClose, open: openState, className: backdropProps === null || backdropProps === void 0 ? void 0 : backdropProps.className }))),
80
- React.createElement("div", __assign({}, windowProps, { className: cnModal('Window', [windowProps === null || windowProps === void 0 ? void 0 : windowProps.className]), tabIndex: -1, ref: useMultiRef([trapRef, windowProps === null || windowProps === void 0 ? void 0 : windowProps.ref]) }), children))));
71
+ React.createElement(Portal, __assign({}, other, { className: cnModal({ hidden: keepMounted && !openState, hasBackdrop: hasBackdrop }, [className]), ref: ref }),
72
+ !hideBackdrop && (React.createElement(Backdrop, __assign({ zIndex: -1, onClick: onClose }, backdropProps, { open: openState, className: backdropProps === null || backdropProps === void 0 ? void 0 : backdropProps.className }))),
73
+ React.createElement(ModalConsumer, __assign({}, windowProps, { open: openState && !disableScrollLock, ref: useMultiRef([modalInnerRef, trapRef, windowProps === null || windowProps === void 0 ? void 0 : windowProps.ref]) }), children))));
81
74
  });
82
75
  Modal.displayName = 'Modal';
@@ -0,0 +1,5 @@
1
+ import { FC } from 'react';
2
+ import { PaperProps } from '../../Paper';
3
+ export declare const ModalConsumer: FC<PaperProps & {
4
+ open: boolean;
5
+ }>;
@@ -0,0 +1,12 @@
1
+ import { __assign, __rest } from "tslib";
2
+ import React, { forwardRef } from 'react';
3
+ import { useLockBodyScroll } from '../../../hooks/useLockBodyScroll';
4
+ import { Paper } from '../../Paper';
5
+ import { cnModal } from '../index';
6
+ export var ModalConsumer = forwardRef(function (_a, ref) {
7
+ var children = _a.children, className = _a.className, open = _a.open, other = __rest(_a, ["children", "className", "open"]);
8
+ // Блокирует прокрутку основного окна приложения
9
+ useLockBodyScroll(open);
10
+ return (React.createElement(Paper, __assign({ radius: "s", background: "main" }, other, { className: cnModal('Window', [className]), tabIndex: -1, ref: ref }), children));
11
+ });
12
+ ModalConsumer.displayName = 'ModalConsumer';
@@ -0,0 +1 @@
1
+ export * from './ModalConsumer';
@@ -0,0 +1 @@
1
+ export * from './ModalConsumer';
@@ -0,0 +1,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">;
@@ -0,0 +1,22 @@
1
+ import { __assign, __rest } from "tslib";
2
+ import './Paper.css';
3
+ import React from 'react';
4
+ import { useThemeProps } from '../../hooks/useThemeProps';
5
+ import { cn } from '../../utils/classname';
6
+ import { polymorphicComponentWithRef, } from '../../utils/polymorphicComponentWithRef';
7
+ export var PAPER_DEFAULT_TAG = 'div';
8
+ export var paperRadiusVariant = ['xs', 's', 'l'];
9
+ export var paperBackgroundVariant = [
10
+ 'main',
11
+ 'main-inverse',
12
+ 'action-light',
13
+ 'accent',
14
+ ];
15
+ export var paperShadowVariant = ['m', 'l'];
16
+ export var cnPaper = cn('Paper');
17
+ export var Paper = polymorphicComponentWithRef(function (inProps, ref) {
18
+ var props = useThemeProps({ props: inProps, name: 'Paper' });
19
+ var _a = props.as, Tag = _a === void 0 ? PAPER_DEFAULT_TAG : _a, children = props.children, radius = props.radius, background = props.background, shadow = props.shadow, className = props.className, other = __rest(props, ["as", "children", "radius", "background", "shadow", "className"]);
20
+ return (React.createElement(Tag, __assign({}, other, { className: cnPaper({ radius: radius, background: background, shadow: shadow }, [className]), ref: ref }), children));
21
+ });
22
+ Paper.displayName = 'Paper';
@@ -0,0 +1 @@
1
+ export * from './Paper';
@@ -0,0 +1 @@
1
+ export * from './Paper';
@@ -1,7 +1,4 @@
1
1
  .Popover {
2
- box-shadow: var(--shadow-l);
3
- border-radius: var(--border-radius-xs);
4
- background-color: var(--color-background-main);
5
2
  z-index: var(--z-index-popover);
6
3
  inline-size: auto;
7
4
  box-sizing: border-box;
@@ -10,16 +7,9 @@
10
7
 
11
8
  .Popover-Arrow {
12
9
  display: flex;
10
+ color: var(--paper-background-color);
13
11
  }
14
12
 
15
- .Popover-Arrow_variant_light {
16
- color: var(--color-background-main);
17
- }
18
-
19
- .Popover-Arrow_variant_dark {
20
- color: var(--color-background-main-inverse);
21
- }
22
-
23
13
  .Popover[data-popper-placement^='top'] > .Popover-Arrow_size_xs {
24
14
  inset-block-end: -9px;
25
15
  }
@@ -1,5 +1,4 @@
1
- import React from 'react';
2
1
  import './Popover.css';
3
- import type { PopoverProps } from './types';
2
+ import type { PopoverBaseProps } from './types';
4
3
  export declare const cnPopover: import("@bem-react/classname").ClassNameFormatter;
5
- export declare const Popover: React.ForwardRefExoticComponent<Omit<PopoverProps, "ref"> & React.RefAttributes<HTMLDivElement>>;
4
+ export declare const Popover: import("../../utils/polymorphicComponentWithRef").PolymorphicComponentWithRef<PopoverBaseProps, import("../../utils/polymorphicComponentWithRef").PolymorphicComponentWithRef<import("../Paper").PaperBaseProps, "div">>;