@astral/ui 4.84.0 → 4.85.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 (74) hide show
  1. package/components/HintPopover/HintPopover.d.ts +6 -0
  2. package/components/HintPopover/HintPopover.js +23 -0
  3. package/components/HintPopover/constants.d.ts +4 -0
  4. package/components/HintPopover/constants.js +5 -0
  5. package/components/HintPopover/index.d.ts +2 -0
  6. package/components/HintPopover/index.js +1 -0
  7. package/components/HintPopover/public.d.ts +2 -0
  8. package/components/HintPopover/public.js +1 -0
  9. package/components/HintPopover/styles.d.ts +38 -0
  10. package/components/HintPopover/styles.js +69 -0
  11. package/components/HintPopover/types.d.ts +24 -0
  12. package/components/HintPopover/types.js +1 -0
  13. package/components/NewPopover/NewPopover.d.ts +1 -1
  14. package/components/NewPopover/NewPopover.js +5 -4
  15. package/components/NewPopover/constants.d.ts +11 -0
  16. package/components/NewPopover/constants.js +11 -0
  17. package/components/NewPopover/styles.js +35 -30
  18. package/components/NewPopover/types.d.ts +5 -0
  19. package/components/NewPopover/useLogic/useLogic.d.ts +4 -3
  20. package/components/NewPopover/useLogic/useLogic.js +17 -8
  21. package/components/NewPopover/useLogic/utils/getArrowPadding/getArrowPadding.d.ts +14 -0
  22. package/components/NewPopover/useLogic/utils/getArrowPadding/getArrowPadding.js +12 -0
  23. package/components/NewPopover/useLogic/utils/getArrowPadding/index.d.ts +1 -0
  24. package/components/NewPopover/useLogic/utils/getArrowPadding/index.js +1 -0
  25. package/components/NewPopover/useLogic/utils/getPopoverCssVars/getPopoverCssVars.d.ts +2 -0
  26. package/components/NewPopover/useLogic/utils/getPopoverCssVars/getPopoverCssVars.js +6 -0
  27. package/components/NewPopover/useLogic/utils/getPopoverCssVars/index.d.ts +1 -0
  28. package/components/NewPopover/useLogic/utils/getPopoverCssVars/index.js +1 -0
  29. package/components/NewPopover/useLogic/utils/resolveAnchorNode/resolveAnchorNode.d.ts +6 -0
  30. package/components/NewPopover/useLogic/utils/resolveAnchorNode/resolveAnchorNode.js +8 -0
  31. package/components/Onboarding/ui/StepStrategy/steps/HighlightStep/HighlightStep.js +3 -4
  32. package/components/Onboarding/ui/StepStrategy/steps/HighlightStep/styles.d.ts +6 -22
  33. package/components/Onboarding/ui/StepStrategy/steps/HighlightStep/styles.js +2 -45
  34. package/node/components/HintPopover/HintPopover.d.ts +6 -0
  35. package/node/components/HintPopover/HintPopover.js +27 -0
  36. package/node/components/HintPopover/constants.d.ts +4 -0
  37. package/node/components/HintPopover/constants.js +8 -0
  38. package/node/components/HintPopover/index.d.ts +2 -0
  39. package/node/components/HintPopover/index.js +5 -0
  40. package/node/components/HintPopover/public.d.ts +2 -0
  41. package/node/components/HintPopover/public.js +5 -0
  42. package/node/components/HintPopover/styles.d.ts +38 -0
  43. package/node/components/HintPopover/styles.js +72 -0
  44. package/node/components/HintPopover/types.d.ts +24 -0
  45. package/node/components/HintPopover/types.js +2 -0
  46. package/node/components/NewPopover/NewPopover.d.ts +1 -1
  47. package/node/components/NewPopover/NewPopover.js +5 -4
  48. package/node/components/NewPopover/constants.d.ts +11 -0
  49. package/node/components/NewPopover/constants.js +12 -1
  50. package/node/components/NewPopover/styles.js +34 -29
  51. package/node/components/NewPopover/types.d.ts +5 -0
  52. package/node/components/NewPopover/useLogic/useLogic.d.ts +4 -3
  53. package/node/components/NewPopover/useLogic/useLogic.js +18 -9
  54. package/node/components/NewPopover/useLogic/utils/getArrowPadding/getArrowPadding.d.ts +14 -0
  55. package/node/components/NewPopover/useLogic/utils/getArrowPadding/getArrowPadding.js +16 -0
  56. package/node/components/NewPopover/useLogic/utils/getArrowPadding/index.d.ts +1 -0
  57. package/node/components/NewPopover/useLogic/utils/getArrowPadding/index.js +17 -0
  58. package/node/components/NewPopover/useLogic/utils/getPopoverCssVars/getPopoverCssVars.d.ts +2 -0
  59. package/node/components/NewPopover/useLogic/utils/getPopoverCssVars/getPopoverCssVars.js +10 -0
  60. package/node/components/NewPopover/useLogic/utils/getPopoverCssVars/index.d.ts +1 -0
  61. package/node/components/NewPopover/useLogic/utils/getPopoverCssVars/index.js +5 -0
  62. package/node/components/NewPopover/useLogic/utils/resolveAnchorNode/resolveAnchorNode.d.ts +6 -0
  63. package/node/components/NewPopover/{utils → useLogic/utils/resolveAnchorNode}/resolveAnchorNode.js +2 -2
  64. package/node/components/Onboarding/ui/StepStrategy/steps/HighlightStep/HighlightStep.js +1 -2
  65. package/node/components/Onboarding/ui/StepStrategy/steps/HighlightStep/styles.d.ts +6 -22
  66. package/node/components/Onboarding/ui/StepStrategy/steps/HighlightStep/styles.js +3 -46
  67. package/package.json +1 -1
  68. package/components/NewPopover/utils/resolveAnchorNode.d.ts +0 -6
  69. package/components/NewPopover/utils/resolveAnchorNode.js +0 -8
  70. package/node/components/NewPopover/utils/resolveAnchorNode.d.ts +0 -6
  71. /package/components/NewPopover/{utils → useLogic/utils/resolveAnchorNode}/index.d.ts +0 -0
  72. /package/components/NewPopover/{utils → useLogic/utils/resolveAnchorNode}/index.js +0 -0
  73. /package/node/components/NewPopover/{utils → useLogic/utils/resolveAnchorNode}/index.d.ts +0 -0
  74. /package/node/components/NewPopover/{utils → useLogic/utils/resolveAnchorNode}/index.js +0 -0
@@ -1,56 +1,13 @@
1
- import { IconButton } from '../../../../../IconButton';
2
- import { NewPopover } from '../../../../../NewPopover';
1
+ import { HintPopover } from '../../../../../HintPopover';
3
2
  import { popoverClassnames } from '../../../../../NewPopover/constants';
4
3
  import { styled } from '../../../../../styled';
5
4
  import { ONBOARDING_Z_INDEX_OFFSET } from '../../../../constants';
6
- /**
7
- * Popover шага, z-index над overlay, быстрое закрытие.
8
- */
9
- export const StepPopover = styled(NewPopover) `
5
+ export const StepPopover = styled(HintPopover) `
10
6
  && {
11
7
  z-index: ${({ theme }) => theme.zIndex.tooltip + ONBOARDING_Z_INDEX_OFFSET.popover};
12
8
  }
13
-
14
- .${popoverClassnames.innerContainer} {
15
- border-radius: calc(${({ theme }) => theme.shape.medium} * 2);
16
- }
17
9
 
18
10
  .${popoverClassnames.animatedWrapper}:not(.${popoverClassnames.animatedWrapperOpen}) {
19
11
  animation-duration: ${({ theme }) => theme.transitions.duration.shortest}ms;
20
12
  }
21
13
  `;
22
- export const PopoverBody = styled.div `
23
- position: relative;
24
-
25
- width: 400px;
26
- padding: ${({ theme }) => theme.spacing(6)};
27
-
28
- border-radius: calc(${({ theme }) => theme.shape.medium} * 2);
29
-
30
- /* Фокус-трап ставит фокус на контейнер, браузерную рамку убираем. */
31
- &:focus {
32
- outline: none;
33
- }
34
- `;
35
- export const CloseButton = styled(IconButton) `
36
- position: absolute;
37
- top: ${({ theme }) => theme.spacing(6)};
38
- right: ${({ theme }) => theme.spacing(6)};
39
- `;
40
- export const Content = styled.div `
41
- display: flex;
42
- flex-direction: column;
43
- gap: ${({ theme }) => theme.spacing(4)};
44
-
45
- margin-bottom: ${({ theme }) => theme.spacing(6)};
46
-
47
- &:last-child {
48
- margin-bottom: 0;
49
- }
50
-
51
- /* Резерв справа под крестик — только у верхнего элемента (заголовок, а если
52
- его нет — текст) */
53
- & > *:first-of-type {
54
- padding-right: ${({ theme }) => theme.spacing(10)};
55
- }
56
- `;
@@ -0,0 +1,6 @@
1
+ import { type HintPopoverProps } from './types';
2
+ /**
3
+ * Поповер-подсказка, привязанная к элементу: подсвечивает возможность интерфейса.
4
+ * Отличие от `NewPopover`: увеличенное скругление, всегда со стрелкой и не сворачивается в BottomDrawer на mobile.
5
+ */
6
+ export declare const HintPopover: ({ variant, title, action, onClose, contentRef, children, className, ...restProps }: HintPopoverProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HintPopover = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const CrossOutlineMd_1 = require("../../icons/CrossOutlineMd");
6
+ const useViewportType_1 = require("../useViewportType");
7
+ const classNames_1 = require("../utils/classNames");
8
+ const cva_1 = require("../utils/cva");
9
+ const constants_1 = require("./constants");
10
+ const styles_1 = require("./styles");
11
+ const hintPopoverCva = (0, cva_1.cva)(constants_1.hintPopoverClassnames.root, {
12
+ variants: {
13
+ variant: {
14
+ light: '',
15
+ dark: constants_1.hintPopoverClassnames.dark,
16
+ },
17
+ },
18
+ });
19
+ /**
20
+ * Поповер-подсказка, привязанная к элементу: подсвечивает возможность интерфейса.
21
+ * Отличие от `NewPopover`: увеличенное скругление, всегда со стрелкой и не сворачивается в BottomDrawer на mobile.
22
+ */
23
+ const HintPopover = ({ variant = 'dark', title, action, onClose, contentRef, children, className, ...restProps }) => {
24
+ const { isMobile } = (0, useViewportType_1.useViewportType)();
25
+ return ((0, jsx_runtime_1.jsx)(styles_1.StyledHintPopover, { ...restProps, className: (0, classNames_1.classNames)(className, hintPopoverCva({ variant })), hasArrow: true, disableMobileDrawer: true, onClose: onClose, children: (0, jsx_runtime_1.jsxs)(styles_1.Body, { ref: contentRef, tabIndex: -1, children: [(0, jsx_runtime_1.jsx)(styles_1.CloseButton, { variant: "text", onClick: onClose, "aria-label": "\u0417\u0430\u043A\u0440\u044B\u0442\u044C", children: (0, jsx_runtime_1.jsx)(CrossOutlineMd_1.CrossOutlineMd, {}) }), title && ((0, jsx_runtime_1.jsx)(styles_1.Title, { component: "div", variant: isMobile ? 'h5' : 'h4', children: title })), children, action && (0, jsx_runtime_1.jsx)(styles_1.ActionRow, { children: action })] }) }));
26
+ };
27
+ exports.HintPopover = HintPopover;
@@ -0,0 +1,4 @@
1
+ export declare const hintPopoverClassnames: {
2
+ root: string;
3
+ dark: string;
4
+ };
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hintPopoverClassnames = void 0;
4
+ const createUIKitClassname_1 = require("../utils/createUIKitClassname");
5
+ exports.hintPopoverClassnames = {
6
+ root: (0, createUIKitClassname_1.createUIKitClassname)('hint-popover'),
7
+ dark: (0, createUIKitClassname_1.createUIKitClassname)('hint-popover_dark'),
8
+ };
@@ -0,0 +1,2 @@
1
+ export { HintPopover } from './HintPopover';
2
+ export type { HintPopoverProps, HintPopoverVariant } from './types';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HintPopover = void 0;
4
+ var HintPopover_1 = require("./HintPopover");
5
+ Object.defineProperty(exports, "HintPopover", { enumerable: true, get: function () { return HintPopover_1.HintPopover; } });
@@ -0,0 +1,2 @@
1
+ export { HintPopover } from './HintPopover';
2
+ export type { HintPopoverProps, HintPopoverVariant } from './types';
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HintPopover = void 0;
4
+ var HintPopover_1 = require("./HintPopover");
5
+ Object.defineProperty(exports, "HintPopover", { enumerable: true, get: function () { return HintPopover_1.HintPopover; } });
@@ -0,0 +1,38 @@
1
+ /// <reference types="react" />
2
+ /**
3
+ * styled-обёртка над NewPopover: переопределяет его CSS-переменные — всегда
4
+ * увеличенный радиус, а для `dark` ещё тёмную подложку и текст (цвет стрелки
5
+ * подтянется из подложки сам).
6
+ */
7
+ export declare const StyledHintPopover: import("@emotion/styled/dist/declarations/src/types").StyledComponent<import("../NewPopover").NewPopoverProps & {
8
+ theme?: import("@emotion/react").Theme | undefined;
9
+ }, {}, {}>;
10
+ export declare const Body: import("@emotion/styled/dist/declarations/src/types").StyledComponent<{
11
+ theme?: import("@emotion/react").Theme | undefined;
12
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
13
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
14
+ export declare const Title: import("@emotion/styled/dist/declarations/src/types").StyledComponent<import("../Typography/types").TypographyPropsBase & {
15
+ color?: import("../Typography").TypographyColor | undefined;
16
+ variant?: import("../Typography").TypographyVariant | undefined;
17
+ colorIntensity?: import("../Typography").Intensity | undefined;
18
+ component?: import("../Typography/types").ComponentProp | undefined;
19
+ isUpperCase?: boolean | undefined;
20
+ withoutCalt?: boolean | undefined;
21
+ isTabularNums?: boolean | undefined;
22
+ } & import("react").HTMLAttributes<HTMLParagraphElement> & import("react").RefAttributes<HTMLSpanElement> & {
23
+ theme?: import("@emotion/react").Theme | undefined;
24
+ }, {}, {}>;
25
+ export declare const ActionRow: import("@emotion/styled/dist/declarations/src/types").StyledComponent<{
26
+ theme?: import("@emotion/react").Theme | undefined;
27
+ as?: import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements> | undefined;
28
+ }, import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {}>;
29
+ export declare const CloseButton: import("@emotion/styled/dist/declarations/src/types").StyledComponent<Omit<import("..").WithoutEmotionSpecific<import("@mui/material").ButtonProps>, "color" | "component" | "size" | "variant" | "centerRipple" | "disableRipple" | "disableTouchRipple" | "focusRipple" | "TouchRippleProps" | "touchRippleRef" | "disableFocusRipple"> & {
30
+ variant?: "light" | "link" | "text" | "contained" | "outlined" | undefined;
31
+ loading?: boolean | undefined;
32
+ color?: "primary" | "success" | "warning" | "error" | "grey" | undefined;
33
+ component?: import("react").ElementType | undefined;
34
+ selected?: boolean | undefined;
35
+ size?: "large" | "medium" | undefined;
36
+ } & Omit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, ""> & import("react").RefAttributes<HTMLButtonElement> & {
37
+ theme?: import("@emotion/react").Theme | undefined;
38
+ }, {}, {}>;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CloseButton = exports.ActionRow = exports.Title = exports.Body = exports.StyledHintPopover = void 0;
4
+ const IconButton_1 = require("../IconButton");
5
+ const NewPopover_1 = require("../NewPopover");
6
+ const styled_1 = require("../styled");
7
+ const Typography_1 = require("../Typography");
8
+ const constants_1 = require("./constants");
9
+ /**
10
+ * styled-обёртка над NewPopover: переопределяет его CSS-переменные — всегда
11
+ * увеличенный радиус, а для `dark` ещё тёмную подложку и текст (цвет стрелки
12
+ * подтянется из подложки сам).
13
+ */
14
+ exports.StyledHintPopover = (0, styled_1.styled)(NewPopover_1.NewPopover) `
15
+ --popover-radius: calc(${({ theme }) => theme.shape.medium} * 2);
16
+
17
+ &.${constants_1.hintPopoverClassnames.dark} {
18
+ --popover-surface-color: ${({ theme }) => theme.palette.grey[900]};
19
+ --popover-text-color: ${({ theme }) => theme.palette.common.white};
20
+ }
21
+ `;
22
+ exports.Body = styled_1.styled.div `
23
+ position: relative;
24
+
25
+ display: flex;
26
+ flex-direction: column;
27
+
28
+ width: min(400px, calc(100vw - ${({ theme }) => theme.spacing(8)}));
29
+ padding: ${({ theme }) => theme.spacing(6)};
30
+
31
+ ${({ theme }) => theme.breakpoints.down('sm')} {
32
+ padding: ${({ theme }) => theme.spacing(4)};
33
+ }
34
+
35
+ /* Крестик висит абсолютом в углу и идёт первым в DOM, поэтому следующий за ним
36
+ верхний элемент (заголовок, а без него — контент) резервирует место справа,
37
+ чтобы текст под крестик не залез. */
38
+ & > button + * {
39
+ padding-right: ${({ theme }) => theme.spacing(10)};
40
+ }
41
+
42
+ /* Тело — программная цель фокуса (tabIndex=-1) у потребителя; рамку убираем. */
43
+ &:focus {
44
+ outline: none;
45
+ }
46
+ `;
47
+ exports.Title = (0, styled_1.styled)(Typography_1.Typography) `
48
+ margin-bottom: ${({ theme }) => theme.spacing(4)};
49
+
50
+ ${({ theme }) => theme.breakpoints.down('sm')} {
51
+ margin-bottom: ${({ theme }) => theme.spacing(1)};
52
+ }
53
+ `;
54
+ exports.ActionRow = styled_1.styled.div `
55
+ margin-top: ${({ theme }) => theme.spacing(6)};
56
+
57
+ ${({ theme }) => theme.breakpoints.down('sm')} {
58
+ margin-top: ${({ theme }) => theme.spacing(4)};
59
+ }
60
+ `;
61
+ exports.CloseButton = (0, styled_1.styled)(IconButton_1.IconButton) `
62
+ position: absolute;
63
+ top: ${({ theme }) => theme.spacing(4)};
64
+ right: ${({ theme }) => theme.spacing(4)};
65
+
66
+ color: inherit;
67
+
68
+ ${({ theme }) => theme.breakpoints.down('sm')} {
69
+ top: ${({ theme }) => theme.spacing(2)};
70
+ right: ${({ theme }) => theme.spacing(2)};
71
+ }
72
+ `;
@@ -0,0 +1,24 @@
1
+ import { type ReactNode, type Ref } from 'react';
2
+ import { type NewPopoverProps } from '../NewPopover';
3
+ /** Цвет подложки highlight-popover. */
4
+ export type HintPopoverVariant = 'light' | 'dark';
5
+ /** Параметры HintPopover */
6
+ export type HintPopoverProps = Omit<NewPopoverProps, 'hasArrow' | 'disableMobileDrawer' | 'title'> & {
7
+ /**
8
+ * Цвет подложки.
9
+ * @default 'dark'
10
+ */
11
+ variant?: HintPopoverVariant;
12
+ /**
13
+ * Заголовок.
14
+ */
15
+ title?: ReactNode;
16
+ /**
17
+ * Слот действий под контентом.
18
+ */
19
+ action?: ReactNode;
20
+ /**
21
+ * Ref на узел контента — для фокус-трапа/определения кликов у потребителя.
22
+ */
23
+ contentRef?: Ref<HTMLDivElement>;
24
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,2 +1,2 @@
1
1
  import { type NewPopoverProps } from './types';
2
- export declare const NewPopover: ({ children, onClose, isOpen, title, className, style, placement, anchorEl, disablePortal, disableAutoFocus, hasArrow, }: NewPopoverProps) => import("react/jsx-runtime").JSX.Element;
2
+ export declare const NewPopover: ({ children, onClose, isOpen, title, className, style, placement, anchorEl, disablePortal, disableAutoFocus, hasArrow, disableMobileDrawer, }: NewPopoverProps) => import("react/jsx-runtime").JSX.Element;
@@ -18,19 +18,20 @@ const animatedWrapperCva = (0, cva_1.cva)(constants_1.popoverClassnames.animated
18
18
  },
19
19
  },
20
20
  });
21
- const NewPopover = ({ children, onClose, isOpen, title, className, style, placement = 'bottom', anchorEl, disablePortal, disableAutoFocus, hasArrow, }) => {
22
- const { isMobile, isOpened, shouldRender, handleAnimationEnd, handleClose, setContainerRef, setArrowElement, mergedModifiers, } = (0, useLogic_1.useLogic)({
21
+ const NewPopover = ({ children, onClose, isOpen, title, className, style, placement = 'bottom', anchorEl, disablePortal, disableAutoFocus, hasArrow, disableMobileDrawer, }) => {
22
+ const { shouldRenderDrawer, isOpened, shouldRender, handleAnimationEnd, handleClose, setContainerRef, setArrowElement, mergedModifiers, animatedWrapperStyle, } = (0, useLogic_1.useLogic)({
23
23
  isOpen,
24
24
  anchorEl,
25
25
  onClose,
26
26
  disableAutoFocus,
27
27
  hasArrow,
28
+ disableMobileDrawer,
28
29
  });
29
- if (isMobile) {
30
+ if (shouldRenderDrawer) {
30
31
  return ((0, jsx_runtime_1.jsx)(BottomDrawer_1.BottomDrawer, { title: title, onClose: handleClose, open: isOpened, className: className, style: style, ModalProps: {
31
32
  disableAutoFocus,
32
33
  }, children: children }));
33
34
  }
34
- return ((0, jsx_runtime_1.jsx)(styles_1.StyledMuiPopper, { className: (0, classNames_1.classNames)(constants_1.popoverClassnames.root, className), style: style, open: shouldRender, placement: placement, anchorEl: anchorEl, disablePortal: disablePortal, modifiers: mergedModifiers, children: (0, jsx_runtime_1.jsxs)(styles_1.AnimatedWrapper, { className: animatedWrapperCva({ isOpen: isOpened, hasArrow }), onAnimationEnd: handleAnimationEnd, children: [hasArrow && ((0, jsx_runtime_1.jsx)(styles_1.PopoverArrow, { ref: setArrowElement, className: constants_1.popoverClassnames.arrow })), (0, jsx_runtime_1.jsx)(styles_1.InnerContainer, { ref: setContainerRef, tabIndex: -1, className: constants_1.popoverClassnames.innerContainer, children: children })] }) }));
35
+ return ((0, jsx_runtime_1.jsx)(styles_1.StyledMuiPopper, { className: (0, classNames_1.classNames)(constants_1.popoverClassnames.root, className), style: style, open: shouldRender, placement: placement, anchorEl: anchorEl, disablePortal: disablePortal, modifiers: mergedModifiers, children: (0, jsx_runtime_1.jsxs)(styles_1.AnimatedWrapper, { className: animatedWrapperCva({ isOpen: isOpened, hasArrow }), style: animatedWrapperStyle, onAnimationEnd: handleAnimationEnd, children: [hasArrow && ((0, jsx_runtime_1.jsx)(styles_1.PopoverArrow, { ref: setArrowElement, className: constants_1.popoverClassnames.arrow })), (0, jsx_runtime_1.jsx)(styles_1.InnerContainer, { ref: setContainerRef, tabIndex: -1, className: constants_1.popoverClassnames.innerContainer, children: children })] }) }));
35
36
  };
36
37
  exports.NewPopover = NewPopover;
@@ -7,6 +7,17 @@ export declare const popoverClassnames: {
7
7
  animatedWrapperHasArrow: string;
8
8
  arrow: string;
9
9
  };
10
+ /** Основание и высота стрелки (px). */
11
+ export declare const ARROW_BASE = 23;
12
+ export declare const ARROW_HEIGHT = 16;
13
+ /** Отступ стрелки от углов (px). */
14
+ export declare const ARROW_PADDING = 24;
15
+ /**
16
+ * Мин. отступ стрелки от угла (px)
17
+ */
18
+ export declare const ARROW_MIN_PADDING = 16;
19
+ /** Мин. «ход» стрелки вдоль кромки (px). */
20
+ export declare const ARROW_MIN_TRACK = 16;
10
21
  /**
11
22
  * Базовые модификаторы Popper.js. У MUI Popper (popper.js)
12
23
  */
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DEFAULT_MODIFIERS = exports.popoverClassnames = void 0;
3
+ exports.DEFAULT_MODIFIERS = exports.ARROW_MIN_TRACK = exports.ARROW_MIN_PADDING = exports.ARROW_PADDING = exports.ARROW_HEIGHT = exports.ARROW_BASE = exports.popoverClassnames = void 0;
4
4
  const createUIKitClassname_1 = require("../utils/createUIKitClassname");
5
5
  exports.popoverClassnames = {
6
6
  root: (0, createUIKitClassname_1.createUIKitClassname)('popover'),
@@ -10,6 +10,17 @@ exports.popoverClassnames = {
10
10
  animatedWrapperHasArrow: (0, createUIKitClassname_1.createUIKitClassname)('popover__animated-wrapper_has-arrow'),
11
11
  arrow: (0, createUIKitClassname_1.createUIKitClassname)('popover__arrow'),
12
12
  };
13
+ /** Основание и высота стрелки (px). */
14
+ exports.ARROW_BASE = 23;
15
+ exports.ARROW_HEIGHT = 16;
16
+ /** Отступ стрелки от углов (px). */
17
+ exports.ARROW_PADDING = 24;
18
+ /**
19
+ * Мин. отступ стрелки от угла (px)
20
+ */
21
+ exports.ARROW_MIN_PADDING = 16;
22
+ /** Мин. «ход» стрелки вдоль кромки (px). */
23
+ exports.ARROW_MIN_TRACK = 16;
13
24
  /**
14
25
  * Базовые модификаторы Popper.js. У MUI Popper (popper.js)
15
26
  */
@@ -9,11 +9,13 @@ const styled_1 = require("../styled");
9
9
  const constants_1 = require("./constants");
10
10
  exports.StyledMuiPopper = (0, styled_1.styled)(Popper_1.default) `
11
11
  &.${constants_1.popoverClassnames.root} {
12
+ --arrow-base: ${constants_1.ARROW_BASE}px;
13
+ --arrow-height: ${constants_1.ARROW_HEIGHT}px;
14
+
12
15
  z-index: ${({ theme }) => theme.zIndex.tooltip};
13
16
  }
14
17
 
15
- /* Anchor ушёл за скролл/вьюпорт — popper вешает reference-hidden.
16
- Стрелка иначе тянется к пропавшему anchor и торчит криво — прячем её. */
18
+ /* Anchor ушёл за скролл/вьюпорт — прячем стрелку. */
17
19
  &[data-popper-reference-hidden] .${constants_1.popoverClassnames.arrow} {
18
20
  visibility: hidden;
19
21
  }
@@ -42,7 +44,6 @@ exports.StyledMuiPopper = (0, styled_1.styled)(Popper_1.default) `
42
44
  margin-left: ${({ theme }) => theme.spacing(2)};
43
45
  }
44
46
 
45
- /* Со стрелкой отступ больше */
46
47
  &&[data-popper-placement*='top']
47
48
  .${constants_1.popoverClassnames.animatedWrapperHasArrow} {
48
49
  margin-bottom: ${({ theme }) => theme.spacing(4)};
@@ -64,54 +65,52 @@ exports.StyledMuiPopper = (0, styled_1.styled)(Popper_1.default) `
64
65
  }
65
66
 
66
67
  &&[data-popper-placement*='bottom'] .${constants_1.popoverClassnames.arrow} {
67
- top: -16px;
68
+ top: calc(var(--arrow-height) * -1);
68
69
 
69
- width: 23px;
70
- height: 16px;
70
+ width: var(--arrow-base);
71
+ height: var(--arrow-height);
71
72
 
72
73
  &::before {
73
- border-color: transparent transparent
74
- ${({ theme }) => theme.palette.background.paper};
75
- border-width: 0 11.5px 16px;
74
+ border-color: transparent transparent var(--popover-surface-color, ${({ theme }) => theme.palette.background.paper});
75
+ border-width: 0 calc(var(--arrow-base) / 2) var(--arrow-height);
76
76
  }
77
77
  }
78
78
 
79
79
  &&[data-popper-placement*='top'] .${constants_1.popoverClassnames.arrow} {
80
- bottom: -16px;
80
+ bottom: calc(var(--arrow-height) * -1);
81
81
 
82
- width: 23px;
83
- height: 16px;
82
+ width: var(--arrow-base);
83
+ height: var(--arrow-height);
84
84
 
85
85
  &::before {
86
- border-color: ${({ theme }) => theme.palette.background.paper} transparent
87
- transparent;
88
- border-width: 16px 11.5px 0;
86
+ border-color: var(--popover-surface-color, ${({ theme }) => theme.palette.background.paper}) transparent transparent;
87
+ border-width: var(--arrow-height) calc(var(--arrow-base) / 2) 0;
89
88
  }
90
89
  }
91
90
 
92
91
  &&[data-popper-placement*='right'] .${constants_1.popoverClassnames.arrow} {
93
- left: -16px;
92
+ left: calc(var(--arrow-height) * -1);
94
93
 
95
- width: 16px;
96
- height: 23px;
94
+ width: var(--arrow-height);
95
+ height: var(--arrow-base);
97
96
 
98
97
  &::before {
99
- border-color: transparent ${({ theme }) => theme.palette.background.paper}
100
- transparent transparent;
101
- border-width: 11.5px 16px 11.5px 0;
98
+ border-color: transparent var(--popover-surface-color, ${({ theme }) => theme.palette.background.paper}) transparent
99
+ transparent;
100
+ border-width: calc(var(--arrow-base) / 2) var(--arrow-height) calc(var(--arrow-base) / 2) 0;
102
101
  }
103
102
  }
104
103
 
105
104
  &&[data-popper-placement*='left'] .${constants_1.popoverClassnames.arrow} {
106
- right: -16px;
105
+ right: calc(var(--arrow-height) * -1);
107
106
 
108
- width: 16px;
109
- height: 23px;
107
+ width: var(--arrow-height);
108
+ height: var(--arrow-base);
110
109
 
111
110
  &::before {
112
111
  border-color: transparent transparent transparent
113
- ${({ theme }) => theme.palette.background.paper};
114
- border-width: 11.5px 0 11.5px 16px;
112
+ var(--popover-surface-color, ${({ theme }) => theme.palette.background.paper});
113
+ border-width: calc(var(--arrow-base) / 2) 0 calc(var(--arrow-base) / 2) var(--arrow-height);
115
114
  }
116
115
  }
117
116
  `;
@@ -132,6 +131,8 @@ exports.PopoverArrow = styled_1.styled.span `
132
131
  `;
133
132
  exports.AnimatedWrapper = styled_1.styled.div `
134
133
  position: relative;
134
+
135
+ filter: var(--drop-shadow);
135
136
 
136
137
  animation: popover-grow-out
137
138
  ${({ theme }) => theme.transitions.duration.leavingScreen}ms
@@ -175,8 +176,12 @@ exports.InnerContainer = styled_1.styled.div `
175
176
  &.${constants_1.popoverClassnames.innerContainer} {
176
177
  overflow: hidden;
177
178
 
178
- background: ${({ theme }) => theme.palette.background.paper};
179
- border-radius: ${({ theme }) => theme.shape.medium};
180
- box-shadow: ${({ theme }) => theme.elevation[200]};
179
+ color: var(--popover-text-color, ${({ theme }) => theme.palette.text.primary});
180
+
181
+ background: var(
182
+ --popover-surface-color,
183
+ ${({ theme }) => theme.palette.background.paper}
184
+ );
185
+ border-radius: var(--popover-radius, ${({ theme }) => theme.shape.medium});
181
186
  }
182
187
  `;
@@ -62,5 +62,10 @@ export type NewPopoverProps = {
62
62
  * @default false
63
63
  */
64
64
  hasArrow?: boolean;
65
+ /**
66
+ * Отключить BottomDrawer на mobile.
67
+ * @default false
68
+ */
69
+ disableMobileDrawer?: boolean;
65
70
  };
66
71
  export {};
@@ -1,8 +1,8 @@
1
1
  /// <reference types="react" />
2
2
  import { type NewPopoverModifier, type NewPopoverProps } from '../types';
3
- type UseLogicParams = Pick<NewPopoverProps, 'isOpen' | 'anchorEl' | 'onClose' | 'disableAutoFocus' | 'hasArrow'>;
4
- export declare const useLogic: ({ isOpen, anchorEl, onClose, disableAutoFocus, hasArrow, }: UseLogicParams) => {
5
- isMobile: boolean;
3
+ type UseLogicParams = Pick<NewPopoverProps, 'isOpen' | 'anchorEl' | 'onClose' | 'disableAutoFocus' | 'hasArrow' | 'disableMobileDrawer'>;
4
+ export declare const useLogic: ({ isOpen, anchorEl, onClose, disableAutoFocus, hasArrow, disableMobileDrawer, }: UseLogicParams) => {
5
+ shouldRenderDrawer: boolean;
6
6
  isOpened: boolean;
7
7
  shouldRender: boolean;
8
8
  handleAnimationEnd: () => void;
@@ -11,5 +11,6 @@ export declare const useLogic: ({ isOpen, anchorEl, onClose, disableAutoFocus, h
11
11
  arrowElement: HTMLSpanElement | null;
12
12
  setArrowElement: import("react").Dispatch<import("react").SetStateAction<HTMLSpanElement | null>>;
13
13
  mergedModifiers: NewPopoverModifier[];
14
+ animatedWrapperStyle: import("react").CSSProperties;
14
15
  };
15
16
  export {};
@@ -8,8 +8,10 @@ const useFocusTrapEffect_1 = require("../../useFocusTrapEffect");
8
8
  const usePopoverAnimation_1 = require("../../usePopoverAnimation");
9
9
  const useViewportType_1 = require("../../useViewportType");
10
10
  const constants_1 = require("../constants");
11
- const utils_1 = require("../utils");
12
- const useLogic = ({ isOpen, anchorEl, onClose, disableAutoFocus, hasArrow, }) => {
11
+ const getArrowPadding_1 = require("./utils/getArrowPadding");
12
+ const getPopoverCssVars_1 = require("./utils/getPopoverCssVars");
13
+ const resolveAnchorNode_1 = require("./utils/resolveAnchorNode");
14
+ const useLogic = ({ isOpen, anchorEl, onClose, disableAutoFocus, hasArrow, disableMobileDrawer, }) => {
13
15
  const containerRef = (0, react_1.useRef)(null);
14
16
  const [isContainerMounted, setIsContainerMounted] = (0, react_1.useState)(false);
15
17
  const [arrowElement, setArrowElement] = (0, react_1.useState)(null);
@@ -21,8 +23,10 @@ const useLogic = ({ isOpen, anchorEl, onClose, disableAutoFocus, hasArrow, }) =>
21
23
  const isControlled = isOpen !== undefined;
22
24
  const { isMobile } = (0, useViewportType_1.useViewportType)();
23
25
  const { shouldRender, handleAnimationEnd } = (0, usePopoverAnimation_1.usePopoverAnimation)(isOpened);
24
- const isEffectActive = !isMobile && isOpened && isContainerMounted;
25
- const anchorNode = (0, react_1.useMemo)(() => (0, utils_1.resolveAnchorNode)(anchorEl), [anchorEl]);
26
+ const animatedWrapperStyle = (0, getPopoverCssVars_1.getPopoverCssVars)();
27
+ const shouldRenderDrawer = isMobile && !disableMobileDrawer;
28
+ const isPopoverActive = !shouldRenderDrawer && isOpened && isContainerMounted;
29
+ const anchorNode = (0, react_1.useMemo)(() => (0, resolveAnchorNode_1.resolveAnchorNode)(anchorEl), [anchorEl]);
26
30
  const excludeNodes = (0, react_1.useMemo)(() => [anchorNode], [anchorNode]);
27
31
  const handleClose = (event) => {
28
32
  onClose?.(event);
@@ -30,18 +34,18 @@ const useLogic = ({ isOpen, anchorEl, onClose, disableAutoFocus, hasArrow, }) =>
30
34
  (0, useClickAwayEffect_1.useClickAwayEffect)({
31
35
  ref: containerRef,
32
36
  onClickAway: handleClose,
33
- isActive: isEffectActive && !isControlled,
37
+ isActive: isPopoverActive && !isControlled,
34
38
  preventBubbling: true,
35
39
  excludeNodes,
36
40
  });
37
41
  (0, useEscapeClickEffect_1.useEscapeClickEffect)({
38
42
  onEscape: handleClose,
39
- isActive: isEffectActive,
43
+ isActive: isPopoverActive,
40
44
  preventBubbling: true,
41
45
  });
42
46
  (0, useFocusTrapEffect_1.useFocusTrapEffect)({
43
47
  ref: containerRef,
44
- isActive: isEffectActive && !disableAutoFocus,
48
+ isActive: isPopoverActive && !disableAutoFocus,
45
49
  returnFocusOnDeactivate: true,
46
50
  escapeDeactivates: false,
47
51
  clickOutsideDeactivates: false,
@@ -54,11 +58,15 @@ const useLogic = ({ isOpen, anchorEl, onClose, disableAutoFocus, hasArrow, }) =>
54
58
  }
55
59
  return [
56
60
  ...constants_1.DEFAULT_MODIFIERS,
57
- { name: 'arrow', enabled: true, options: { element: arrowElement } },
61
+ {
62
+ name: 'arrow',
63
+ enabled: true,
64
+ options: { element: arrowElement, padding: getArrowPadding_1.getArrowPadding },
65
+ },
58
66
  ];
59
67
  }, [hasArrow, arrowElement]);
60
68
  return {
61
- isMobile,
69
+ shouldRenderDrawer,
62
70
  isOpened,
63
71
  shouldRender,
64
72
  handleAnimationEnd,
@@ -67,6 +75,7 @@ const useLogic = ({ isOpen, anchorEl, onClose, disableAutoFocus, hasArrow, }) =>
67
75
  arrowElement,
68
76
  setArrowElement,
69
77
  mergedModifiers,
78
+ animatedWrapperStyle,
70
79
  };
71
80
  };
72
81
  exports.useLogic = useLogic;
@@ -0,0 +1,14 @@
1
+ import { type NewPopoverPlacement } from '../../../types';
2
+ type ArrowPaddingArgs = {
3
+ /** Прямоугольник поповера от Popper (нужны только габариты). */
4
+ popper: {
5
+ width: number;
6
+ height: number;
7
+ };
8
+ placement: NewPopoverPlacement;
9
+ };
10
+ /**
11
+ * Фиксированный padding отобразил бы стрелку на скруглённый угол
12
+ */
13
+ export declare const getArrowPadding: ({ popper, placement }: ArrowPaddingArgs) => number;
14
+ export {};
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getArrowPadding = void 0;
4
+ const constants_1 = require("../../../constants");
5
+ /**
6
+ * Фиксированный padding отобразил бы стрелку на скруглённый угол
7
+ */
8
+ const getArrowPadding = ({ popper, placement }) => {
9
+ const isVertical = placement.startsWith('left') || placement.startsWith('right');
10
+ const side = isVertical ? popper.height : popper.width;
11
+ const free = Math.max(0, side - constants_1.ARROW_BASE);
12
+ const centerPadding = free / 2;
13
+ const desiredPadding = Math.min(constants_1.ARROW_PADDING, Math.max(constants_1.ARROW_MIN_PADDING, (free - constants_1.ARROW_MIN_TRACK) / 2));
14
+ return Math.min(centerPadding, desiredPadding);
15
+ };
16
+ exports.getArrowPadding = getArrowPadding;
@@ -0,0 +1 @@
1
+ export * from './getArrowPadding';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./getArrowPadding"), exports);
@@ -0,0 +1,2 @@
1
+ import type { CSSProperties } from 'react';
2
+ export declare const getPopoverCssVars: () => CSSProperties;