@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 +44 -0
- package/dist/Component.d.ts +24 -2
- package/dist/Component.js +74 -14
- package/dist/cssm/Component.d.ts +24 -2
- package/dist/cssm/Component.js +73 -13
- package/dist/cssm/index.js +3 -0
- package/dist/cssm/index.module.css +43 -10
- package/dist/esm/Component.d.ts +24 -2
- package/dist/esm/Component.js +73 -15
- package/dist/esm/index.css +67 -34
- package/dist/esm/index.js +3 -0
- package/dist/index.css +67 -34
- package/dist/index.js +3 -0
- package/dist/modern/Component.d.ts +24 -2
- package/dist/modern/Component.js +67 -9
- package/dist/modern/index.css +67 -34
- package/dist/modern/index.js +3 -0
- package/package.json +7 -4
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
|
|
package/dist/Component.d.ts
CHANGED
|
@@ -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.
|
|
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":"
|
|
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
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
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
|
+
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
|
-
}, [
|
|
71
|
-
|
|
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 =
|
|
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
|
-
}
|
|
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:
|
|
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;
|
package/dist/cssm/Component.d.ts
CHANGED
|
@@ -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.
|
|
100
|
+
declare const Popover: React.ForwardRefExoticComponent<PopoverProps & React.RefAttributes<HTMLDivElement>>;
|
|
79
101
|
export { Position, PopoverProps, Popover };
|
package/dist/cssm/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/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
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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
|
+
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
|
-
}, [
|
|
70
|
-
|
|
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 =
|
|
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
|
-
}
|
|
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:
|
|
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;
|
package/dist/cssm/index.js
CHANGED
|
@@ -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-
|
|
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-
|
|
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:
|
|
36
|
-
height:
|
|
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: -
|
|
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: -
|
|
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: -
|
|
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: -
|
|
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: -
|
|
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: -
|
|
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);
|
package/dist/esm/Component.d.ts
CHANGED
|
@@ -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.
|
|
100
|
+
declare const Popover: React.ForwardRefExoticComponent<PopoverProps & React.RefAttributes<HTMLDivElement>>;
|
|
79
101
|
export { Position, PopoverProps, Popover };
|