@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 +44 -0
- package/dist/Component.d.ts +8 -0
- package/dist/Component.js +83 -12
- package/dist/cssm/Component.d.ts +8 -0
- package/dist/cssm/Component.js +82 -11
- package/dist/cssm/index.js +2 -0
- package/dist/cssm/index.module.css +43 -13
- package/dist/esm/Component.d.ts +8 -0
- package/dist/esm/Component.js +83 -13
- package/dist/esm/index.css +67 -37
- package/dist/esm/index.js +2 -0
- package/dist/index.css +67 -37
- package/dist/index.js +2 -0
- package/dist/modern/Component.d.ts +8 -0
- package/dist/modern/Component.js +78 -9
- package/dist/modern/index.css +67 -37
- package/dist/modern/index.js +2 -0
- package/package.json +5 -3
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
|
|
package/dist/Component.d.ts
CHANGED
|
@@ -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":"
|
|
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
|
|
61
|
-
var
|
|
62
|
-
var
|
|
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
|
-
}, [
|
|
79
|
-
|
|
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 =
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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)))); }));
|
package/dist/cssm/Component.d.ts
CHANGED
|
@@ -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/cssm/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/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
|
|
60
|
-
var
|
|
61
|
-
var
|
|
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
|
-
}, [
|
|
78
|
-
|
|
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 =
|
|
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
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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)))); }));
|
package/dist/cssm/index.js
CHANGED
|
@@ -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-
|
|
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-
|
|
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:
|
|
39
|
-
height:
|
|
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: -
|
|
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: -
|
|
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: -
|
|
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: -
|
|
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: -
|
|
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: -
|
|
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);
|
package/dist/esm/Component.d.ts
CHANGED
|
@@ -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
|
*/
|