@alfalab/core-components-popover 5.2.0 → 5.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,50 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [5.6.0](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-popover@5.5.0...@alfalab/core-components-popover@5.6.0) (2021-12-01)
7
+
8
+
9
+ ### Features
10
+
11
+ * **popover:** add availableHieght prop, update related snapshots ([43b4ebd](https://github.com/alfa-laboratory/core-components/commit/43b4ebd6ba092f22d0dfc845f3f0113b390317dc)), closes [#758](https://github.com/alfa-laboratory/core-components/issues/758)
12
+
13
+
14
+
15
+
16
+
17
+ # [5.5.0](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-popover@5.4.0...@alfalab/core-components-popover@5.5.0) (2021-09-14)
18
+
19
+
20
+ ### Features
21
+
22
+ * **popover:** add useAnchorWidth prop ([#826](https://github.com/alfa-laboratory/core-components/issues/826)) ([8df55c4](https://github.com/alfa-laboratory/core-components/commit/8df55c4c496467c363c5c09c14d1bd08a9709ebf)), closes [#787](https://github.com/alfa-laboratory/core-components/issues/787)
23
+
24
+
25
+
26
+
27
+
28
+ # [5.4.0](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-popover@5.3.0...@alfalab/core-components-popover@5.4.0) (2021-09-06)
29
+
30
+
31
+ ### Features
32
+
33
+ * **tooltip:** update shadow and arrow size/position ([2d40988](https://github.com/alfa-laboratory/core-components/commit/2d40988f3c376c51907aa8a4845ba25c7c43a2f4))
34
+
35
+
36
+
37
+
38
+
39
+ # [5.3.0](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-popover@5.2.0...@alfalab/core-components-popover@5.3.0) (2021-08-23)
40
+
41
+
42
+ ### Features
43
+
44
+ * **tooltip:** add TooltipResponsive, add `fallbackPlacements` prop ([#780](https://github.com/alfa-laboratory/core-components/issues/780)) ([61d780c](https://github.com/alfa-laboratory/core-components/commit/61d780c750bd9c0331d275f1b12b0512bb3d2049))
45
+
46
+
47
+
48
+
49
+
6
50
  # [5.2.0](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-popover@5.1.0...@alfalab/core-components-popover@5.2.0) (2021-08-04)
7
51
 
8
52
 
@@ -1,7 +1,7 @@
1
1
  /// <reference types="react-transition-group" />
2
2
  /// <reference types="react" />
3
3
  import React from 'react';
4
- import { CSSProperties, MutableRefObject } from "react";
4
+ import { CSSProperties, MutableRefObject, ReactNode } from "react";
5
5
  import { CSSTransitionProps } from 'react-transition-group/CSSTransition';
6
6
  import { BasePlacement, VariationPlacement } from '@popperjs/core';
7
7
  type RefElement = HTMLElement | null;
@@ -15,6 +15,10 @@ type PopoverProps = {
15
15
  * Элемент, относительного которого появляется поповер
16
16
  */
17
17
  anchorElement: RefElement;
18
+ /**
19
+ * Использовать ширину родительского элемента
20
+ */
21
+ useAnchorWidth?: boolean;
18
22
  /**
19
23
  * Позиционирование поповера
20
24
  */
@@ -24,6 +28,14 @@ type PopoverProps = {
24
28
  * Например, если места снизу недостаточно,то он все равно будет показан снизу
25
29
  */
26
30
  preventFlip?: boolean;
31
+ /**
32
+ * Запрещает поповеру менять свою позицию, если он не влезает в видимую область.
33
+ */
34
+ preventOverflow?: boolean;
35
+ /**
36
+ * Позволяет поповеру подствраивать свою высоту под границы экрана, если из-за величины контента он выходит за рамки видимой области экрана
37
+ */
38
+ availableHeight?: boolean;
27
39
  /**
28
40
  * Если `true`, будет отрисована стрелочка
29
41
  */
@@ -74,6 +86,16 @@ type PopoverProps = {
74
86
  * z-index компонента
75
87
  */
76
88
  zIndex?: number;
89
+ /**
90
+ * Если поповер не помещается в переданной позиции (position), он попробует открыться в другой позиции,
91
+ * по очереди для каждой позиции из этого списка.
92
+ * Если не передавать, то поповер открывается в противоположном направлении от переданного position.
93
+ */
94
+ fallbackPlacements?: Position[];
95
+ /**
96
+ * Контент
97
+ */
98
+ children?: ReactNode;
77
99
  };
78
- declare const Popover: React.FC<PopoverProps>;
100
+ declare const Popover: React.ForwardRefExoticComponent<PopoverProps & React.RefAttributes<HTMLDivElement>>;
79
101
  export { Position, PopoverProps, Popover };
package/dist/Component.js CHANGED
@@ -6,6 +6,9 @@ var React = require('react');
6
6
  var cn = require('classnames');
7
7
  var reactTransitionGroup = require('react-transition-group');
8
8
  var reactPopper = require('react-popper');
9
+ var maxSize = require('popper-max-size-modifier');
10
+ var mergeRefs = require('react-merge-refs');
11
+ var resizeObserver = require('resize-observer');
9
12
  var coreComponentsStack = require('@alfalab/core-components-stack');
10
13
  var coreComponentsPortal = require('@alfalab/core-components-portal');
11
14
 
@@ -13,6 +16,8 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
13
16
 
14
17
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
15
18
  var cn__default = /*#__PURE__*/_interopDefaultLegacy(cn);
19
+ var maxSize__default = /*#__PURE__*/_interopDefaultLegacy(maxSize);
20
+ var mergeRefs__default = /*#__PURE__*/_interopDefaultLegacy(mergeRefs);
16
21
 
17
22
  /*! *****************************************************************************
18
23
  Copyright (c) Microsoft Corporation.
@@ -41,7 +46,7 @@ var __assign = function () {
41
46
  return __assign.apply(this, arguments);
42
47
  };
43
48
 
44
- var styles = {"component":"popover__component_1wjdh","inner":"popover__inner_1wjdh","arrow":"popover__arrow_1wjdh","enter":"popover__enter_1wjdh","enterActive":"popover__enterActive_1wjdh","exit":"popover__exit_1wjdh","exitActive":"popover__exitActive_1wjdh"};
49
+ var styles = {"component":"popover__component_bivb4","inner":"popover__inner_bivb4","scrollableContent":"popover__scrollableContent_bivb4","arrow":"popover__arrow_bivb4","enter":"popover__enter_bivb4","enterActive":"popover__enterActive_bivb4","exit":"popover__exit_bivb4","exitActive":"popover__exitActive_bivb4"};
45
50
  require('./index.css')
46
51
 
47
52
  var DEFAULT_TRANSITION = {
@@ -53,11 +58,26 @@ var CSS_TRANSITION_CLASS_NAMES = {
53
58
  exit: styles.exit,
54
59
  exitActive: styles.exitActive,
55
60
  };
56
- var Popover = function (_a) {
57
- var children = _a.children, getPortalContainer = _a.getPortalContainer, _b = _a.transition, transition = _b === void 0 ? DEFAULT_TRANSITION : _b, anchorElement = _a.anchorElement, _c = _a.offset, offset = _c === void 0 ? [0, 0] : _c, _d = _a.withArrow, withArrow = _d === void 0 ? false : _d, _e = _a.withTransition, withTransition = _e === void 0 ? true : _e, _f = _a.position, position = _f === void 0 ? 'left' : _f, preventFlip = _a.preventFlip, popperClassName = _a.popperClassName, arrowClassName = _a.arrowClassName, className = _a.className, open = _a.open, dataTestId = _a.dataTestId, update = _a.update, _g = _a.transitionDuration, transitionDuration = _g === void 0 ? transition.timeout + "ms" : _g, _h = _a.zIndex, zIndex = _h === void 0 ? coreComponentsStack.stackingOrder.POPOVER : _h;
58
- var _j = React.useState(anchorElement), referenceElement = _j[0], setReferenceElement = _j[1];
59
- var _k = React.useState(null), popperElement = _k[0], setPopperElement = _k[1];
60
- var _l = React.useState(null), arrowElement = _l[0], setArrowElement = _l[1];
61
+ var availableHieghtModifier = {
62
+ name: 'availableHeight',
63
+ enabled: true,
64
+ phase: 'beforeWrite',
65
+ requires: ['maxSize'],
66
+ fn: function (_a) {
67
+ var _b = _a.state, modifiersData = _b.modifiersData, popper = _b.elements.popper;
68
+ var height = modifiersData.maxSize.height;
69
+ var content = popper.querySelector("." + styles.scrollableContent);
70
+ if (content && !content.style.maxHeight) {
71
+ content.style.maxHeight = height + "px";
72
+ }
73
+ },
74
+ };
75
+ var Popover = React.forwardRef(function (_a, ref) {
76
+ var children = _a.children, getPortalContainer = _a.getPortalContainer, _b = _a.transition, transition = _b === void 0 ? DEFAULT_TRANSITION : _b, anchorElement = _a.anchorElement, useAnchorWidth = _a.useAnchorWidth, _c = _a.offset, offset = _c === void 0 ? [0, 0] : _c, _d = _a.withArrow, withArrow = _d === void 0 ? false : _d, _e = _a.withTransition, withTransition = _e === void 0 ? true : _e, _f = _a.position, position = _f === void 0 ? 'left' : _f, preventFlip = _a.preventFlip, popperClassName = _a.popperClassName, arrowClassName = _a.arrowClassName, className = _a.className, open = _a.open, dataTestId = _a.dataTestId, update = _a.update, _g = _a.transitionDuration, transitionDuration = _g === void 0 ? transition.timeout + "ms" : _g, _h = _a.zIndex, zIndex = _h === void 0 ? coreComponentsStack.stackingOrder.POPOVER : _h, fallbackPlacements = _a.fallbackPlacements, _j = _a.preventOverflow, preventOverflow = _j === void 0 ? true : _j, _k = _a.availableHeight, availableHeight = _k === void 0 ? false : _k;
77
+ var _l = React.useState(anchorElement), referenceElement = _l[0], setReferenceElement = _l[1];
78
+ var _m = React.useState(null), popperElement = _m[0], setPopperElement = _m[1];
79
+ var _o = React.useState(null), arrowElement = _o[0], setArrowElement = _o[1];
80
+ var updatePopperRef = React.useRef();
61
81
  var getModifiers = React.useCallback(function () {
62
82
  var modifiers = [{ name: 'offset', options: { offset: offset } }];
63
83
  if (withArrow) {
@@ -66,12 +86,38 @@ var Popover = function (_a) {
66
86
  if (preventFlip) {
67
87
  modifiers.push({ name: 'flip', options: { fallbackPlacements: [] } });
68
88
  }
89
+ if (fallbackPlacements) {
90
+ modifiers.push({ name: 'flip', options: { fallbackPlacements: fallbackPlacements } });
91
+ }
92
+ if (preventOverflow) {
93
+ modifiers.push({ name: 'preventOverflow', options: { mainAxis: false } });
94
+ }
95
+ if (availableHeight) {
96
+ modifiers.push(__assign(__assign({}, maxSize__default['default']), { options: {} }));
97
+ modifiers.push(__assign(__assign({}, availableHieghtModifier), { options: {} }));
98
+ }
69
99
  return modifiers;
70
- }, [offset, withArrow, preventFlip, arrowElement]);
71
- var _m = reactPopper.usePopper(referenceElement, popperElement, {
100
+ }, [
101
+ offset,
102
+ withArrow,
103
+ preventFlip,
104
+ fallbackPlacements,
105
+ preventOverflow,
106
+ availableHeight,
107
+ arrowElement,
108
+ ]);
109
+ var _p = reactPopper.usePopper(referenceElement, popperElement, {
72
110
  placement: position,
73
111
  modifiers: getModifiers(),
74
- }), popperStyles = _m.styles, attributes = _m.attributes, updatePopper = _m.update;
112
+ }), popperStyles = _p.styles, attributes = _p.attributes, updatePopper = _p.update;
113
+ if (updatePopper) {
114
+ updatePopperRef.current = updatePopper;
115
+ }
116
+ var updatePopoverWidth = React.useCallback(function () {
117
+ if (useAnchorWidth && updatePopperRef.current) {
118
+ updatePopperRef.current();
119
+ }
120
+ }, [useAnchorWidth]);
75
121
  React.useEffect(function () {
76
122
  setReferenceElement(anchorElement);
77
123
  }, [anchorElement]);
@@ -81,18 +127,32 @@ var Popover = function (_a) {
81
127
  }
82
128
  }, [updatePopper, arrowElement, children]);
83
129
  React.useEffect(function () {
84
- if (update && updatePopper) {
130
+ if (update && !update.current && updatePopper) {
85
131
  // eslint-disable-next-line no-param-reassign
86
132
  update.current = updatePopper;
87
133
  }
88
- }, [updatePopper, update]);
134
+ });
135
+ React.useEffect(function () {
136
+ if (useAnchorWidth) {
137
+ var observer_1 = new resizeObserver.ResizeObserver(updatePopoverWidth);
138
+ if (anchorElement) {
139
+ observer_1.observe(anchorElement);
140
+ }
141
+ return function () {
142
+ observer_1.disconnect();
143
+ };
144
+ }
145
+ return function () { return ({}); };
146
+ }, [anchorElement, updatePopoverWidth, useAnchorWidth]);
89
147
  var renderContent = function (computedZIndex, style) {
90
- return (React__default['default'].createElement("div", __assign({ ref: setPopperElement, style: __assign({ zIndex: computedZIndex }, popperStyles.popper), "data-test-id": dataTestId, className: cn__default['default'](styles.component, className) }, attributes.popper),
148
+ return (React__default['default'].createElement("div", __assign({ ref: mergeRefs__default['default']([ref, setPopperElement]),
149
+ // ref={setPopperElement}
150
+ style: __assign({ zIndex: computedZIndex, width: useAnchorWidth ? referenceElement === null || referenceElement === void 0 ? void 0 : referenceElement.offsetWidth : undefined }, popperStyles.popper), "data-test-id": dataTestId, className: cn__default['default'](styles.component, className) }, attributes.popper),
91
151
  React__default['default'].createElement("div", { className: cn__default['default'](styles.inner, popperClassName), style: style },
92
- children,
152
+ React__default['default'].createElement("div", { className: cn__default['default'](availableHeight ? styles.scrollableContent : '') }, children),
93
153
  withArrow && (React__default['default'].createElement("div", { ref: setArrowElement, style: popperStyles.arrow, className: cn__default['default'](styles.arrow, arrowClassName) })))));
94
154
  };
95
155
  return (React__default['default'].createElement(coreComponentsStack.Stack, { value: zIndex }, function (computedZIndex) { return (React__default['default'].createElement(coreComponentsPortal.Portal, { getPortalContainer: getPortalContainer }, withTransition ? (React__default['default'].createElement(reactTransitionGroup.CSSTransition, __assign({ unmountOnExit: true, classNames: CSS_TRANSITION_CLASS_NAMES }, transition, { in: open }), renderContent(computedZIndex, { transitionDuration: transitionDuration }))) : (open && renderContent(computedZIndex)))); }));
96
- };
156
+ });
97
157
 
98
158
  exports.Popover = Popover;
@@ -1,7 +1,7 @@
1
1
  /// <reference types="react-transition-group" />
2
2
  /// <reference types="react" />
3
3
  import React from 'react';
4
- import { CSSProperties, MutableRefObject } from "react";
4
+ import { CSSProperties, MutableRefObject, ReactNode } from "react";
5
5
  import { CSSTransitionProps } from 'react-transition-group/CSSTransition';
6
6
  import { BasePlacement, VariationPlacement } from '@popperjs/core';
7
7
  type RefElement = HTMLElement | null;
@@ -15,6 +15,10 @@ type PopoverProps = {
15
15
  * Элемент, относительного которого появляется поповер
16
16
  */
17
17
  anchorElement: RefElement;
18
+ /**
19
+ * Использовать ширину родительского элемента
20
+ */
21
+ useAnchorWidth?: boolean;
18
22
  /**
19
23
  * Позиционирование поповера
20
24
  */
@@ -24,6 +28,14 @@ type PopoverProps = {
24
28
  * Например, если места снизу недостаточно,то он все равно будет показан снизу
25
29
  */
26
30
  preventFlip?: boolean;
31
+ /**
32
+ * Запрещает поповеру менять свою позицию, если он не влезает в видимую область.
33
+ */
34
+ preventOverflow?: boolean;
35
+ /**
36
+ * Позволяет поповеру подствраивать свою высоту под границы экрана, если из-за величины контента он выходит за рамки видимой области экрана
37
+ */
38
+ availableHeight?: boolean;
27
39
  /**
28
40
  * Если `true`, будет отрисована стрелочка
29
41
  */
@@ -74,6 +86,16 @@ type PopoverProps = {
74
86
  * z-index компонента
75
87
  */
76
88
  zIndex?: number;
89
+ /**
90
+ * Если поповер не помещается в переданной позиции (position), он попробует открыться в другой позиции,
91
+ * по очереди для каждой позиции из этого списка.
92
+ * Если не передавать, то поповер открывается в противоположном направлении от переданного position.
93
+ */
94
+ fallbackPlacements?: Position[];
95
+ /**
96
+ * Контент
97
+ */
98
+ children?: ReactNode;
77
99
  };
78
- declare const Popover: React.FC<PopoverProps>;
100
+ declare const Popover: React.ForwardRefExoticComponent<PopoverProps & React.RefAttributes<HTMLDivElement>>;
79
101
  export { Position, PopoverProps, Popover };
@@ -6,6 +6,9 @@ var React = require('react');
6
6
  var cn = require('classnames');
7
7
  var reactTransitionGroup = require('react-transition-group');
8
8
  var reactPopper = require('react-popper');
9
+ var maxSize = require('popper-max-size-modifier');
10
+ var mergeRefs = require('react-merge-refs');
11
+ var resizeObserver = require('resize-observer');
9
12
  var coreComponentsStack = require('@alfalab/core-components-stack/dist/cssm');
10
13
  var coreComponentsPortal = require('@alfalab/core-components-portal/dist/cssm');
11
14
  var styles = require('./index.module.css');
@@ -14,6 +17,8 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
14
17
 
15
18
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
16
19
  var cn__default = /*#__PURE__*/_interopDefaultLegacy(cn);
20
+ var maxSize__default = /*#__PURE__*/_interopDefaultLegacy(maxSize);
21
+ var mergeRefs__default = /*#__PURE__*/_interopDefaultLegacy(mergeRefs);
17
22
  var styles__default = /*#__PURE__*/_interopDefaultLegacy(styles);
18
23
 
19
24
  /*! *****************************************************************************
@@ -52,11 +57,26 @@ var CSS_TRANSITION_CLASS_NAMES = {
52
57
  exit: styles__default['default'].exit,
53
58
  exitActive: styles__default['default'].exitActive,
54
59
  };
55
- var Popover = function (_a) {
56
- var children = _a.children, getPortalContainer = _a.getPortalContainer, _b = _a.transition, transition = _b === void 0 ? DEFAULT_TRANSITION : _b, anchorElement = _a.anchorElement, _c = _a.offset, offset = _c === void 0 ? [0, 0] : _c, _d = _a.withArrow, withArrow = _d === void 0 ? false : _d, _e = _a.withTransition, withTransition = _e === void 0 ? true : _e, _f = _a.position, position = _f === void 0 ? 'left' : _f, preventFlip = _a.preventFlip, popperClassName = _a.popperClassName, arrowClassName = _a.arrowClassName, className = _a.className, open = _a.open, dataTestId = _a.dataTestId, update = _a.update, _g = _a.transitionDuration, transitionDuration = _g === void 0 ? transition.timeout + "ms" : _g, _h = _a.zIndex, zIndex = _h === void 0 ? coreComponentsStack.stackingOrder.POPOVER : _h;
57
- var _j = React.useState(anchorElement), referenceElement = _j[0], setReferenceElement = _j[1];
58
- var _k = React.useState(null), popperElement = _k[0], setPopperElement = _k[1];
59
- var _l = React.useState(null), arrowElement = _l[0], setArrowElement = _l[1];
60
+ var availableHieghtModifier = {
61
+ name: 'availableHeight',
62
+ enabled: true,
63
+ phase: 'beforeWrite',
64
+ requires: ['maxSize'],
65
+ fn: function (_a) {
66
+ var _b = _a.state, modifiersData = _b.modifiersData, popper = _b.elements.popper;
67
+ var height = modifiersData.maxSize.height;
68
+ var content = popper.querySelector("." + styles__default['default'].scrollableContent);
69
+ if (content && !content.style.maxHeight) {
70
+ content.style.maxHeight = height + "px";
71
+ }
72
+ },
73
+ };
74
+ var Popover = React.forwardRef(function (_a, ref) {
75
+ var children = _a.children, getPortalContainer = _a.getPortalContainer, _b = _a.transition, transition = _b === void 0 ? DEFAULT_TRANSITION : _b, anchorElement = _a.anchorElement, useAnchorWidth = _a.useAnchorWidth, _c = _a.offset, offset = _c === void 0 ? [0, 0] : _c, _d = _a.withArrow, withArrow = _d === void 0 ? false : _d, _e = _a.withTransition, withTransition = _e === void 0 ? true : _e, _f = _a.position, position = _f === void 0 ? 'left' : _f, preventFlip = _a.preventFlip, popperClassName = _a.popperClassName, arrowClassName = _a.arrowClassName, className = _a.className, open = _a.open, dataTestId = _a.dataTestId, update = _a.update, _g = _a.transitionDuration, transitionDuration = _g === void 0 ? transition.timeout + "ms" : _g, _h = _a.zIndex, zIndex = _h === void 0 ? coreComponentsStack.stackingOrder.POPOVER : _h, fallbackPlacements = _a.fallbackPlacements, _j = _a.preventOverflow, preventOverflow = _j === void 0 ? true : _j, _k = _a.availableHeight, availableHeight = _k === void 0 ? false : _k;
76
+ var _l = React.useState(anchorElement), referenceElement = _l[0], setReferenceElement = _l[1];
77
+ var _m = React.useState(null), popperElement = _m[0], setPopperElement = _m[1];
78
+ var _o = React.useState(null), arrowElement = _o[0], setArrowElement = _o[1];
79
+ var updatePopperRef = React.useRef();
60
80
  var getModifiers = React.useCallback(function () {
61
81
  var modifiers = [{ name: 'offset', options: { offset: offset } }];
62
82
  if (withArrow) {
@@ -65,12 +85,38 @@ var Popover = function (_a) {
65
85
  if (preventFlip) {
66
86
  modifiers.push({ name: 'flip', options: { fallbackPlacements: [] } });
67
87
  }
88
+ if (fallbackPlacements) {
89
+ modifiers.push({ name: 'flip', options: { fallbackPlacements: fallbackPlacements } });
90
+ }
91
+ if (preventOverflow) {
92
+ modifiers.push({ name: 'preventOverflow', options: { mainAxis: false } });
93
+ }
94
+ if (availableHeight) {
95
+ modifiers.push(__assign(__assign({}, maxSize__default['default']), { options: {} }));
96
+ modifiers.push(__assign(__assign({}, availableHieghtModifier), { options: {} }));
97
+ }
68
98
  return modifiers;
69
- }, [offset, withArrow, preventFlip, arrowElement]);
70
- var _m = reactPopper.usePopper(referenceElement, popperElement, {
99
+ }, [
100
+ offset,
101
+ withArrow,
102
+ preventFlip,
103
+ fallbackPlacements,
104
+ preventOverflow,
105
+ availableHeight,
106
+ arrowElement,
107
+ ]);
108
+ var _p = reactPopper.usePopper(referenceElement, popperElement, {
71
109
  placement: position,
72
110
  modifiers: getModifiers(),
73
- }), popperStyles = _m.styles, attributes = _m.attributes, updatePopper = _m.update;
111
+ }), popperStyles = _p.styles, attributes = _p.attributes, updatePopper = _p.update;
112
+ if (updatePopper) {
113
+ updatePopperRef.current = updatePopper;
114
+ }
115
+ var updatePopoverWidth = React.useCallback(function () {
116
+ if (useAnchorWidth && updatePopperRef.current) {
117
+ updatePopperRef.current();
118
+ }
119
+ }, [useAnchorWidth]);
74
120
  React.useEffect(function () {
75
121
  setReferenceElement(anchorElement);
76
122
  }, [anchorElement]);
@@ -80,18 +126,32 @@ var Popover = function (_a) {
80
126
  }
81
127
  }, [updatePopper, arrowElement, children]);
82
128
  React.useEffect(function () {
83
- if (update && updatePopper) {
129
+ if (update && !update.current && updatePopper) {
84
130
  // eslint-disable-next-line no-param-reassign
85
131
  update.current = updatePopper;
86
132
  }
87
- }, [updatePopper, update]);
133
+ });
134
+ React.useEffect(function () {
135
+ if (useAnchorWidth) {
136
+ var observer_1 = new resizeObserver.ResizeObserver(updatePopoverWidth);
137
+ if (anchorElement) {
138
+ observer_1.observe(anchorElement);
139
+ }
140
+ return function () {
141
+ observer_1.disconnect();
142
+ };
143
+ }
144
+ return function () { return ({}); };
145
+ }, [anchorElement, updatePopoverWidth, useAnchorWidth]);
88
146
  var renderContent = function (computedZIndex, style) {
89
- return (React__default['default'].createElement("div", __assign({ ref: setPopperElement, style: __assign({ zIndex: computedZIndex }, popperStyles.popper), "data-test-id": dataTestId, className: cn__default['default'](styles__default['default'].component, className) }, attributes.popper),
147
+ return (React__default['default'].createElement("div", __assign({ ref: mergeRefs__default['default']([ref, setPopperElement]),
148
+ // ref={setPopperElement}
149
+ style: __assign({ zIndex: computedZIndex, width: useAnchorWidth ? referenceElement === null || referenceElement === void 0 ? void 0 : referenceElement.offsetWidth : undefined }, popperStyles.popper), "data-test-id": dataTestId, className: cn__default['default'](styles__default['default'].component, className) }, attributes.popper),
90
150
  React__default['default'].createElement("div", { className: cn__default['default'](styles__default['default'].inner, popperClassName), style: style },
91
- children,
151
+ React__default['default'].createElement("div", { className: cn__default['default'](availableHeight ? styles__default['default'].scrollableContent : '') }, children),
92
152
  withArrow && (React__default['default'].createElement("div", { ref: setArrowElement, style: popperStyles.arrow, className: cn__default['default'](styles__default['default'].arrow, arrowClassName) })))));
93
153
  };
94
154
  return (React__default['default'].createElement(coreComponentsStack.Stack, { value: zIndex }, function (computedZIndex) { return (React__default['default'].createElement(coreComponentsPortal.Portal, { getPortalContainer: getPortalContainer }, withTransition ? (React__default['default'].createElement(reactTransitionGroup.CSSTransition, __assign({ unmountOnExit: true, classNames: CSS_TRANSITION_CLASS_NAMES }, transition, { in: open }), renderContent(computedZIndex, { transitionDuration: transitionDuration }))) : (open && renderContent(computedZIndex)))); }));
95
- };
155
+ });
96
156
 
97
157
  exports.Popover = Popover;
@@ -7,6 +7,9 @@ require('react');
7
7
  require('classnames');
8
8
  require('react-transition-group');
9
9
  require('react-popper');
10
+ require('popper-max-size-modifier');
11
+ require('react-merge-refs');
12
+ require('resize-observer');
10
13
  require('@alfalab/core-components-stack/dist/cssm');
11
14
  require('@alfalab/core-components-portal/dist/cssm');
12
15
  require('./index.module.css');
@@ -3,7 +3,7 @@
3
3
  --color-light-text-primary: #0b1f35;
4
4
  }
5
5
  :root {
6
- --shadow-l: 0 0 24px rgba(11, 31, 53, 0.12), 0 12px 24px rgba(11, 31, 53, 0.24);
6
+ --shadow-m: 0 0 16px rgba(11, 31, 53, 0.08), 0 8px 16px rgba(11, 31, 53, 0.16);
7
7
 
8
8
  /* Hard */
9
9
 
@@ -21,21 +21,30 @@
21
21
  .inner {
22
22
  position: relative;
23
23
  background-color: var(--color-light-bg-primary);
24
- box-shadow: var(--shadow-l);
24
+ box-shadow: var(--shadow-m);
25
25
  border: 1px solid var(--popover-border-color);
26
26
  transition-property: opacity, transform;
27
27
  transition-timing-function: ease-in-out;
28
28
  box-sizing: border-box;
29
29
  will-change: transform;
30
30
  }
31
+ .scrollableContent {
32
+ position: relative;
33
+ z-index: 2;
34
+ overflow-y: auto;
35
+ }
36
+ .arrow {
37
+ z-index: 1;
38
+ }
31
39
  .arrow:after {
32
40
  content: '';
33
41
  display: block;
34
42
  position: absolute;
35
- width: 10px;
36
- height: 10px;
43
+ width: 12px;
44
+ height: 12px;
37
45
  background-color: var(--color-light-bg-primary);
38
46
  border: 1px solid var(--popover-border-color);
47
+ box-sizing: border-box;
39
48
  transform: rotate(45deg);
40
49
  }
41
50
  .component[data-popper-placement='left'] .arrow,
@@ -44,40 +53,64 @@
44
53
  right: 5px
45
54
  }
46
55
  .component[data-popper-placement='left'] .arrow:after, .component[data-popper-placement='left-start'] .arrow:after, .component[data-popper-placement='left-end'] .arrow:after {
47
- top: -4px;
56
+ top: -6px;
48
57
  border-bottom: none;
49
58
  border-left: none;
50
59
  }
60
+ .component[data-popper-placement='left-start'] .arrow:after {
61
+ top: -7px;
62
+ }
63
+ .component[data-popper-placement='left-end'] .arrow:after {
64
+ top: -5px;
65
+ }
51
66
  .component[data-popper-placement='right'] .arrow,
52
67
  .component[data-popper-placement='right-start'] .arrow,
53
68
  .component[data-popper-placement='right-end'] .arrow {
54
- left: -6px
69
+ left: -7px
55
70
  }
56
71
  .component[data-popper-placement='right'] .arrow:after, .component[data-popper-placement='right-start'] .arrow:after, .component[data-popper-placement='right-end'] .arrow:after {
57
- top: -4px;
72
+ top: -6px;
58
73
  border-top: none;
59
74
  border-right: none;
60
75
  }
76
+ .component[data-popper-placement='right-start'] .arrow:after {
77
+ top: -7px;
78
+ }
79
+ .component[data-popper-placement='right-end'] .arrow:after {
80
+ top: -5px;
81
+ }
61
82
  .component[data-popper-placement='top'] .arrow,
62
83
  .component[data-popper-placement='top-start'] .arrow,
63
84
  .component[data-popper-placement='top-end'] .arrow {
64
85
  bottom: 5px
65
86
  }
66
87
  .component[data-popper-placement='top'] .arrow:after, .component[data-popper-placement='top-start'] .arrow:after, .component[data-popper-placement='top-end'] .arrow:after {
67
- left: -4px;
88
+ left: -6px;
68
89
  border-top: none;
69
90
  border-left: none;
70
91
  }
92
+ .component[data-popper-placement='top-start'] .arrow:after {
93
+ left: -17px;
94
+ }
95
+ .component[data-popper-placement='top-end'] .arrow:after {
96
+ left: 5px;
97
+ }
71
98
  .component[data-popper-placement='bottom'] .arrow,
72
99
  .component[data-popper-placement='bottom-start'] .arrow,
73
100
  .component[data-popper-placement='bottom-end'] .arrow {
74
- top: -6px
101
+ top: -7px
75
102
  }
76
103
  .component[data-popper-placement='bottom'] .arrow:after, .component[data-popper-placement='bottom-start'] .arrow:after, .component[data-popper-placement='bottom-end'] .arrow:after {
77
- left: -4px;
104
+ left: -6px;
78
105
  border-bottom: none;
79
106
  border-right: none;
80
107
  }
108
+ .component[data-popper-placement='bottom-start'] .arrow:after {
109
+ left: -17px;
110
+ }
111
+ .component[data-popper-placement='bottom-end'] .arrow:after {
112
+ left: 5px;
113
+ }
81
114
  .enter .inner {
82
115
  opacity: 0;
83
116
  transform: scale(0.98);
@@ -1,7 +1,7 @@
1
1
  /// <reference types="react-transition-group" />
2
2
  /// <reference types="react" />
3
3
  import React from 'react';
4
- import { CSSProperties, MutableRefObject } from "react";
4
+ import { CSSProperties, MutableRefObject, ReactNode } from "react";
5
5
  import { CSSTransitionProps } from 'react-transition-group/CSSTransition';
6
6
  import { BasePlacement, VariationPlacement } from '@popperjs/core';
7
7
  type RefElement = HTMLElement | null;
@@ -15,6 +15,10 @@ type PopoverProps = {
15
15
  * Элемент, относительного которого появляется поповер
16
16
  */
17
17
  anchorElement: RefElement;
18
+ /**
19
+ * Использовать ширину родительского элемента
20
+ */
21
+ useAnchorWidth?: boolean;
18
22
  /**
19
23
  * Позиционирование поповера
20
24
  */
@@ -24,6 +28,14 @@ type PopoverProps = {
24
28
  * Например, если места снизу недостаточно,то он все равно будет показан снизу
25
29
  */
26
30
  preventFlip?: boolean;
31
+ /**
32
+ * Запрещает поповеру менять свою позицию, если он не влезает в видимую область.
33
+ */
34
+ preventOverflow?: boolean;
35
+ /**
36
+ * Позволяет поповеру подствраивать свою высоту под границы экрана, если из-за величины контента он выходит за рамки видимой области экрана
37
+ */
38
+ availableHeight?: boolean;
27
39
  /**
28
40
  * Если `true`, будет отрисована стрелочка
29
41
  */
@@ -74,6 +86,16 @@ type PopoverProps = {
74
86
  * z-index компонента
75
87
  */
76
88
  zIndex?: number;
89
+ /**
90
+ * Если поповер не помещается в переданной позиции (position), он попробует открыться в другой позиции,
91
+ * по очереди для каждой позиции из этого списка.
92
+ * Если не передавать, то поповер открывается в противоположном направлении от переданного position.
93
+ */
94
+ fallbackPlacements?: Position[];
95
+ /**
96
+ * Контент
97
+ */
98
+ children?: ReactNode;
77
99
  };
78
- declare const Popover: React.FC<PopoverProps>;
100
+ declare const Popover: React.ForwardRefExoticComponent<PopoverProps & React.RefAttributes<HTMLDivElement>>;
79
101
  export { Position, PopoverProps, Popover };