@alfalab/core-components-popover 5.3.0 → 5.6.1

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.1](https://github.com/alfa-laboratory/core-components/compare/@alfalab/core-components-popover@5.6.0...@alfalab/core-components-popover@5.6.1) (2022-02-15)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **gallery:** update header button's tooltip position ([#979](https://github.com/alfa-laboratory/core-components/issues/979)) ([8e2acfc](https://github.com/alfa-laboratory/core-components/commit/8e2acfcb772cf4d8051c185a3f1caaaf507b5bc9))
12
+
13
+
14
+
15
+
16
+
17
+ # [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)
18
+
19
+
20
+ ### Features
21
+
22
+ * **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)
23
+
24
+
25
+
26
+
27
+
28
+ # [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)
29
+
30
+
31
+ ### Features
32
+
33
+ * **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)
34
+
35
+
36
+
37
+
38
+
39
+ # [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)
40
+
41
+
42
+ ### Features
43
+
44
+ * **tooltip:** update shadow and arrow size/position ([2d40988](https://github.com/alfa-laboratory/core-components/commit/2d40988f3c376c51907aa8a4845ba25c7c43a2f4))
45
+
46
+
47
+
48
+
49
+
6
50
  # [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)
7
51
 
8
52
 
@@ -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
  */
@@ -28,6 +32,10 @@ type PopoverProps = {
28
32
  * Запрещает поповеру менять свою позицию, если он не влезает в видимую область.
29
33
  */
30
34
  preventOverflow?: boolean;
35
+ /**
36
+ * Позволяет поповеру подствраивать свою высоту под границы экрана, если из-за величины контента он выходит за рамки видимой области экрана
37
+ */
38
+ availableHeight?: boolean;
31
39
  /**
32
40
  * Если `true`, будет отрисована стрелочка
33
41
  */
package/dist/Component.js CHANGED
@@ -6,7 +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');
9
10
  var mergeRefs = require('react-merge-refs');
11
+ var resizeObserver = require('resize-observer');
10
12
  var coreComponentsStack = require('@alfalab/core-components-stack');
11
13
  var coreComponentsPortal = require('@alfalab/core-components-portal');
12
14
 
@@ -14,6 +16,7 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
14
16
 
15
17
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
16
18
  var cn__default = /*#__PURE__*/_interopDefaultLegacy(cn);
19
+ var maxSize__default = /*#__PURE__*/_interopDefaultLegacy(maxSize);
17
20
  var mergeRefs__default = /*#__PURE__*/_interopDefaultLegacy(mergeRefs);
18
21
 
19
22
  /*! *****************************************************************************
@@ -43,7 +46,7 @@ var __assign = function () {
43
46
  return __assign.apply(this, arguments);
44
47
  };
45
48
 
46
- var styles = {"component":"popover__component_4qqzo","inner":"popover__inner_4qqzo","arrow":"popover__arrow_4qqzo","enter":"popover__enter_4qqzo","enterActive":"popover__enterActive_4qqzo","exit":"popover__exit_4qqzo","exitActive":"popover__exitActive_4qqzo"};
49
+ var styles = {"component":"popover__component_dvtgo","inner":"popover__inner_dvtgo","scrollableContent":"popover__scrollableContent_dvtgo","arrow":"popover__arrow_dvtgo","arrowShift":"popover__arrowShift_dvtgo","enter":"popover__enter_dvtgo","enterActive":"popover__enterActive_dvtgo","exit":"popover__exit_dvtgo","exitActive":"popover__exitActive_dvtgo"};
47
50
  require('./index.css')
48
51
 
49
52
  var DEFAULT_TRANSITION = {
@@ -55,11 +58,32 @@ var CSS_TRANSITION_CLASS_NAMES = {
55
58
  exit: styles.exit,
56
59
  exitActive: styles.exitActive,
57
60
  };
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
+ /**
76
+ * Минимальный размер anchorElement,
77
+ * при котором возможно смещение стрелочки относительно центра
78
+ */
79
+ var MIN_ARROW_SHIFT_SIZE = 75;
58
80
  var Popover = React.forwardRef(function (_a, ref) {
59
- 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, fallbackPlacements = _a.fallbackPlacements, _j = _a.preventOverflow, preventOverflow = _j === void 0 ? true : _j;
60
- var _k = React.useState(anchorElement), referenceElement = _k[0], setReferenceElement = _k[1];
61
- var _l = React.useState(null), popperElement = _l[0], setPopperElement = _l[1];
62
- var _m = React.useState(null), arrowElement = _m[0], setArrowElement = _m[1];
81
+ 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;
82
+ var _l = React.useState(anchorElement), referenceElement = _l[0], setReferenceElement = _l[1];
83
+ var _m = React.useState(null), popperElement = _m[0], setPopperElement = _m[1];
84
+ var _o = React.useState(null), arrowElement = _o[0], setArrowElement = _o[1];
85
+ var _p = React.useState(false), arrowShift = _p[0], setArrowShift = _p[1];
86
+ var updatePopperRef = React.useRef();
63
87
  var getModifiers = React.useCallback(function () {
64
88
  var modifiers = [{ name: 'offset', options: { offset: offset } }];
65
89
  if (withArrow) {
@@ -74,12 +98,32 @@ var Popover = React.forwardRef(function (_a, ref) {
74
98
  if (preventOverflow) {
75
99
  modifiers.push({ name: 'preventOverflow', options: { mainAxis: false } });
76
100
  }
101
+ if (availableHeight) {
102
+ modifiers.push(__assign(__assign({}, maxSize__default['default']), { options: {} }));
103
+ modifiers.push(__assign(__assign({}, availableHieghtModifier), { options: {} }));
104
+ }
77
105
  return modifiers;
78
- }, [offset, withArrow, preventFlip, fallbackPlacements, preventOverflow, arrowElement]);
79
- var _o = reactPopper.usePopper(referenceElement, popperElement, {
106
+ }, [
107
+ offset,
108
+ withArrow,
109
+ preventFlip,
110
+ fallbackPlacements,
111
+ preventOverflow,
112
+ availableHeight,
113
+ arrowElement,
114
+ ]);
115
+ var _q = reactPopper.usePopper(referenceElement, popperElement, {
80
116
  placement: position,
81
117
  modifiers: getModifiers(),
82
- }), popperStyles = _o.styles, attributes = _o.attributes, updatePopper = _o.update;
118
+ }), popperStyles = _q.styles, attributes = _q.attributes, updatePopper = _q.update;
119
+ if (updatePopper) {
120
+ updatePopperRef.current = updatePopper;
121
+ }
122
+ var updatePopoverWidth = React.useCallback(function () {
123
+ if (useAnchorWidth && updatePopperRef.current) {
124
+ updatePopperRef.current();
125
+ }
126
+ }, [useAnchorWidth]);
83
127
  React.useEffect(function () {
84
128
  setReferenceElement(anchorElement);
85
129
  }, [anchorElement]);
@@ -94,12 +138,39 @@ var Popover = React.forwardRef(function (_a, ref) {
94
138
  update.current = updatePopper;
95
139
  }
96
140
  });
141
+ React.useEffect(function () {
142
+ if (useAnchorWidth) {
143
+ var observer_1 = new resizeObserver.ResizeObserver(updatePopoverWidth);
144
+ if (anchorElement) {
145
+ observer_1.observe(anchorElement);
146
+ }
147
+ return function () {
148
+ observer_1.disconnect();
149
+ };
150
+ }
151
+ return function () { return ({}); };
152
+ }, [anchorElement, updatePopoverWidth, useAnchorWidth]);
153
+ /**
154
+ * По дизайну, если у тултипа позиционирование -start/-end, то стрелочка немного сдвигается вбок.
155
+ * Но если anchorElement слишком маленький, то стрелочка сдвигаться не должна.
156
+ */
157
+ React.useEffect(function () {
158
+ var shiftedPosition = position.includes('-start') || position.includes('-end');
159
+ if (shiftedPosition && referenceElement) {
160
+ var _a = referenceElement.getBoundingClientRect(), width = _a.width, height = _a.height;
161
+ var size = position.includes('left') || position.includes('right') ? height : width;
162
+ if (size >= MIN_ARROW_SHIFT_SIZE) {
163
+ setArrowShift(true);
164
+ }
165
+ }
166
+ }, [referenceElement, position]);
97
167
  var renderContent = function (computedZIndex, style) {
98
- return (React__default['default'].createElement("div", __assign({ ref: mergeRefs__default['default']([ref, setPopperElement]),
99
- // ref={setPopperElement}
100
- style: __assign({ zIndex: computedZIndex }, popperStyles.popper), "data-test-id": dataTestId, className: cn__default['default'](styles.component, className) }, attributes.popper),
168
+ var _a, _b;
169
+ return (React__default['default'].createElement("div", __assign({ ref: mergeRefs__default['default']([ref, setPopperElement]), 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, (_a = {},
170
+ _a[styles.arrowShift] = arrowShift,
171
+ _a)) }, attributes.popper),
101
172
  React__default['default'].createElement("div", { className: cn__default['default'](styles.inner, popperClassName), style: style },
102
- children,
173
+ React__default['default'].createElement("div", { className: cn__default['default']((_b = {}, _b[styles.scrollableContent] = availableHeight, _b)) }, children),
103
174
  withArrow && (React__default['default'].createElement("div", { ref: setArrowElement, style: popperStyles.arrow, className: cn__default['default'](styles.arrow, arrowClassName) })))));
104
175
  };
105
176
  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)))); }));
@@ -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
  */
@@ -28,6 +32,10 @@ type PopoverProps = {
28
32
  * Запрещает поповеру менять свою позицию, если он не влезает в видимую область.
29
33
  */
30
34
  preventOverflow?: boolean;
35
+ /**
36
+ * Позволяет поповеру подствраивать свою высоту под границы экрана, если из-за величины контента он выходит за рамки видимой области экрана
37
+ */
38
+ availableHeight?: boolean;
31
39
  /**
32
40
  * Если `true`, будет отрисована стрелочка
33
41
  */
@@ -6,7 +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');
9
10
  var mergeRefs = require('react-merge-refs');
11
+ var resizeObserver = require('resize-observer');
10
12
  var coreComponentsStack = require('@alfalab/core-components-stack/dist/cssm');
11
13
  var coreComponentsPortal = require('@alfalab/core-components-portal/dist/cssm');
12
14
  var styles = require('./index.module.css');
@@ -15,6 +17,7 @@ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'defau
15
17
 
16
18
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
17
19
  var cn__default = /*#__PURE__*/_interopDefaultLegacy(cn);
20
+ var maxSize__default = /*#__PURE__*/_interopDefaultLegacy(maxSize);
18
21
  var mergeRefs__default = /*#__PURE__*/_interopDefaultLegacy(mergeRefs);
19
22
  var styles__default = /*#__PURE__*/_interopDefaultLegacy(styles);
20
23
 
@@ -54,11 +57,32 @@ var CSS_TRANSITION_CLASS_NAMES = {
54
57
  exit: styles__default['default'].exit,
55
58
  exitActive: styles__default['default'].exitActive,
56
59
  };
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
+ /**
75
+ * Минимальный размер anchorElement,
76
+ * при котором возможно смещение стрелочки относительно центра
77
+ */
78
+ var MIN_ARROW_SHIFT_SIZE = 75;
57
79
  var Popover = React.forwardRef(function (_a, ref) {
58
- 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, fallbackPlacements = _a.fallbackPlacements, _j = _a.preventOverflow, preventOverflow = _j === void 0 ? true : _j;
59
- var _k = React.useState(anchorElement), referenceElement = _k[0], setReferenceElement = _k[1];
60
- var _l = React.useState(null), popperElement = _l[0], setPopperElement = _l[1];
61
- var _m = React.useState(null), arrowElement = _m[0], setArrowElement = _m[1];
80
+ 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;
81
+ var _l = React.useState(anchorElement), referenceElement = _l[0], setReferenceElement = _l[1];
82
+ var _m = React.useState(null), popperElement = _m[0], setPopperElement = _m[1];
83
+ var _o = React.useState(null), arrowElement = _o[0], setArrowElement = _o[1];
84
+ var _p = React.useState(false), arrowShift = _p[0], setArrowShift = _p[1];
85
+ var updatePopperRef = React.useRef();
62
86
  var getModifiers = React.useCallback(function () {
63
87
  var modifiers = [{ name: 'offset', options: { offset: offset } }];
64
88
  if (withArrow) {
@@ -73,12 +97,32 @@ var Popover = React.forwardRef(function (_a, ref) {
73
97
  if (preventOverflow) {
74
98
  modifiers.push({ name: 'preventOverflow', options: { mainAxis: false } });
75
99
  }
100
+ if (availableHeight) {
101
+ modifiers.push(__assign(__assign({}, maxSize__default['default']), { options: {} }));
102
+ modifiers.push(__assign(__assign({}, availableHieghtModifier), { options: {} }));
103
+ }
76
104
  return modifiers;
77
- }, [offset, withArrow, preventFlip, fallbackPlacements, preventOverflow, arrowElement]);
78
- var _o = reactPopper.usePopper(referenceElement, popperElement, {
105
+ }, [
106
+ offset,
107
+ withArrow,
108
+ preventFlip,
109
+ fallbackPlacements,
110
+ preventOverflow,
111
+ availableHeight,
112
+ arrowElement,
113
+ ]);
114
+ var _q = reactPopper.usePopper(referenceElement, popperElement, {
79
115
  placement: position,
80
116
  modifiers: getModifiers(),
81
- }), popperStyles = _o.styles, attributes = _o.attributes, updatePopper = _o.update;
117
+ }), popperStyles = _q.styles, attributes = _q.attributes, updatePopper = _q.update;
118
+ if (updatePopper) {
119
+ updatePopperRef.current = updatePopper;
120
+ }
121
+ var updatePopoverWidth = React.useCallback(function () {
122
+ if (useAnchorWidth && updatePopperRef.current) {
123
+ updatePopperRef.current();
124
+ }
125
+ }, [useAnchorWidth]);
82
126
  React.useEffect(function () {
83
127
  setReferenceElement(anchorElement);
84
128
  }, [anchorElement]);
@@ -93,12 +137,39 @@ var Popover = React.forwardRef(function (_a, ref) {
93
137
  update.current = updatePopper;
94
138
  }
95
139
  });
140
+ React.useEffect(function () {
141
+ if (useAnchorWidth) {
142
+ var observer_1 = new resizeObserver.ResizeObserver(updatePopoverWidth);
143
+ if (anchorElement) {
144
+ observer_1.observe(anchorElement);
145
+ }
146
+ return function () {
147
+ observer_1.disconnect();
148
+ };
149
+ }
150
+ return function () { return ({}); };
151
+ }, [anchorElement, updatePopoverWidth, useAnchorWidth]);
152
+ /**
153
+ * По дизайну, если у тултипа позиционирование -start/-end, то стрелочка немного сдвигается вбок.
154
+ * Но если anchorElement слишком маленький, то стрелочка сдвигаться не должна.
155
+ */
156
+ React.useEffect(function () {
157
+ var shiftedPosition = position.includes('-start') || position.includes('-end');
158
+ if (shiftedPosition && referenceElement) {
159
+ var _a = referenceElement.getBoundingClientRect(), width = _a.width, height = _a.height;
160
+ var size = position.includes('left') || position.includes('right') ? height : width;
161
+ if (size >= MIN_ARROW_SHIFT_SIZE) {
162
+ setArrowShift(true);
163
+ }
164
+ }
165
+ }, [referenceElement, position]);
96
166
  var renderContent = function (computedZIndex, style) {
97
- return (React__default['default'].createElement("div", __assign({ ref: mergeRefs__default['default']([ref, setPopperElement]),
98
- // ref={setPopperElement}
99
- style: __assign({ zIndex: computedZIndex }, popperStyles.popper), "data-test-id": dataTestId, className: cn__default['default'](styles__default['default'].component, className) }, attributes.popper),
167
+ var _a, _b;
168
+ return (React__default['default'].createElement("div", __assign({ ref: mergeRefs__default['default']([ref, setPopperElement]), 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, (_a = {},
169
+ _a[styles__default['default'].arrowShift] = arrowShift,
170
+ _a)) }, attributes.popper),
100
171
  React__default['default'].createElement("div", { className: cn__default['default'](styles__default['default'].inner, popperClassName), style: style },
101
- children,
172
+ React__default['default'].createElement("div", { className: cn__default['default']((_b = {}, _b[styles__default['default'].scrollableContent] = availableHeight, _b)) }, children),
102
173
  withArrow && (React__default['default'].createElement("div", { ref: setArrowElement, style: popperStyles.arrow, className: cn__default['default'](styles__default['default'].arrow, arrowClassName) })))));
103
174
  };
104
175
  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)))); }));
@@ -7,7 +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');
10
11
  require('react-merge-refs');
12
+ require('resize-observer');
11
13
  require('@alfalab/core-components-stack/dist/cssm');
12
14
  require('@alfalab/core-components-portal/dist/cssm');
13
15
  require('./index.module.css');
@@ -1,12 +1,9 @@
1
1
  :root {
2
2
  --color-light-bg-primary: #fff;
3
3
  --color-light-text-primary: #0b1f35;
4
-
5
- /* TODO: цвета добавлены руками. Обновить токены */
6
- --color-light-text-secondary-inverted-transparent: rgba(255, 255, 255, 0.7);
7
4
  }
8
5
  :root {
9
- --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);
10
7
 
11
8
  /* Hard */
12
9
 
@@ -24,21 +21,30 @@
24
21
  .inner {
25
22
  position: relative;
26
23
  background-color: var(--color-light-bg-primary);
27
- box-shadow: var(--shadow-l);
24
+ box-shadow: var(--shadow-m);
28
25
  border: 1px solid var(--popover-border-color);
29
26
  transition-property: opacity, transform;
30
27
  transition-timing-function: ease-in-out;
31
28
  box-sizing: border-box;
32
29
  will-change: transform;
33
30
  }
31
+ .scrollableContent {
32
+ position: relative;
33
+ z-index: 2;
34
+ overflow-y: auto;
35
+ }
36
+ .arrow {
37
+ z-index: 1;
38
+ }
34
39
  .arrow:after {
35
40
  content: '';
36
41
  display: block;
37
42
  position: absolute;
38
- width: 10px;
39
- height: 10px;
43
+ width: 12px;
44
+ height: 12px;
40
45
  background-color: var(--color-light-bg-primary);
41
46
  border: 1px solid var(--popover-border-color);
47
+ box-sizing: border-box;
42
48
  transform: rotate(45deg);
43
49
  }
44
50
  .component[data-popper-placement='left'] .arrow,
@@ -47,40 +53,64 @@
47
53
  right: 5px
48
54
  }
49
55
  .component[data-popper-placement='left'] .arrow:after, .component[data-popper-placement='left-start'] .arrow:after, .component[data-popper-placement='left-end'] .arrow:after {
50
- top: -4px;
56
+ top: -6px;
51
57
  border-bottom: none;
52
58
  border-left: none;
53
59
  }
60
+ .component[data-popper-placement='left-start'].arrowShift .arrow:after {
61
+ top: -7px;
62
+ }
63
+ .component[data-popper-placement='left-end'].arrowShift .arrow:after {
64
+ top: -5px;
65
+ }
54
66
  .component[data-popper-placement='right'] .arrow,
55
67
  .component[data-popper-placement='right-start'] .arrow,
56
68
  .component[data-popper-placement='right-end'] .arrow {
57
- left: -6px
69
+ left: -7px
58
70
  }
59
71
  .component[data-popper-placement='right'] .arrow:after, .component[data-popper-placement='right-start'] .arrow:after, .component[data-popper-placement='right-end'] .arrow:after {
60
- top: -4px;
72
+ top: -6px;
61
73
  border-top: none;
62
74
  border-right: none;
63
75
  }
76
+ .component[data-popper-placement='right-start'].arrowShift .arrow:after {
77
+ top: -7px;
78
+ }
79
+ .component[data-popper-placement='right-end'].arrowShift .arrow:after {
80
+ top: -5px;
81
+ }
64
82
  .component[data-popper-placement='top'] .arrow,
65
83
  .component[data-popper-placement='top-start'] .arrow,
66
84
  .component[data-popper-placement='top-end'] .arrow {
67
85
  bottom: 5px
68
86
  }
69
87
  .component[data-popper-placement='top'] .arrow:after, .component[data-popper-placement='top-start'] .arrow:after, .component[data-popper-placement='top-end'] .arrow:after {
70
- left: -4px;
88
+ left: -6px;
71
89
  border-top: none;
72
90
  border-left: none;
73
91
  }
92
+ .component[data-popper-placement='top-start'].arrowShift .arrow:after {
93
+ left: -17px;
94
+ }
95
+ .component[data-popper-placement='top-end'].arrowShift .arrow:after {
96
+ left: 5px;
97
+ }
74
98
  .component[data-popper-placement='bottom'] .arrow,
75
99
  .component[data-popper-placement='bottom-start'] .arrow,
76
100
  .component[data-popper-placement='bottom-end'] .arrow {
77
- top: -6px
101
+ top: -7px
78
102
  }
79
103
  .component[data-popper-placement='bottom'] .arrow:after, .component[data-popper-placement='bottom-start'] .arrow:after, .component[data-popper-placement='bottom-end'] .arrow:after {
80
- left: -4px;
104
+ left: -6px;
81
105
  border-bottom: none;
82
106
  border-right: none;
83
107
  }
108
+ .component[data-popper-placement='bottom-start'].arrowShift .arrow:after {
109
+ left: -17px;
110
+ }
111
+ .component[data-popper-placement='bottom-end'].arrowShift .arrow:after {
112
+ left: 5px;
113
+ }
84
114
  .enter .inner {
85
115
  opacity: 0;
86
116
  transform: scale(0.98);
@@ -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
  */
@@ -28,6 +32,10 @@ type PopoverProps = {
28
32
  * Запрещает поповеру менять свою позицию, если он не влезает в видимую область.
29
33
  */
30
34
  preventOverflow?: boolean;
35
+ /**
36
+ * Позволяет поповеру подствраивать свою высоту под границы экрана, если из-за величины контента он выходит за рамки видимой области экрана
37
+ */
38
+ availableHeight?: boolean;
31
39
  /**
32
40
  * Если `true`, будет отрисована стрелочка
33
41
  */