@alfalab/core-components-popover 6.2.0 → 6.2.2

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/Component.d.ts CHANGED
@@ -25,7 +25,7 @@ type PopoverProps = {
25
25
  position?: Position;
26
26
  /**
27
27
  * Запрещает поповеру менять свою позицию.
28
- * Например, если места снизу недостаточно,то он все равно будет показан снизу
28
+ * Например, если места снизу недостаточно, то он все равно будет показан снизу
29
29
  */
30
30
  preventFlip?: boolean;
31
31
  /**
package/Component.js CHANGED
@@ -21,7 +21,7 @@ var mergeRefs__default = /*#__PURE__*/_interopDefaultCompat(mergeRefs);
21
21
  var cn__default = /*#__PURE__*/_interopDefaultCompat(cn);
22
22
  var maxSize__default = /*#__PURE__*/_interopDefaultCompat(maxSize);
23
23
 
24
- var styles = {"component":"popover__component_1btnx","inner":"popover__inner_1btnx","scrollableContent":"popover__scrollableContent_1btnx","arrow":"popover__arrow_1btnx","arrowShift":"popover__arrowShift_1btnx","enter":"popover__enter_1btnx","enterActive":"popover__enterActive_1btnx","exit":"popover__exit_1btnx","exitActive":"popover__exitActive_1btnx"};
24
+ var styles = {"component":"popover__component_trlps","inner":"popover__inner_trlps","scrollableContent":"popover__scrollableContent_trlps","arrow":"popover__arrow_trlps","enter":"popover__enter_trlps","enterActive":"popover__enterActive_trlps","exit":"popover__exit_trlps","exitActive":"popover__exitActive_trlps"};
25
25
  require('./index.css')
26
26
 
27
27
  var DEFAULT_TRANSITION = {
@@ -47,24 +47,43 @@ var availableHieghtModifier = {
47
47
  }
48
48
  },
49
49
  };
50
- /**
51
- * Минимальный размер anchorElement,
52
- * при котором возможно смещение стрелочки относительно центра
53
- */
54
- var MIN_ARROW_SHIFT_SIZE = 75;
50
+ var DEFAULT_OFFSET = [0, 0];
51
+ // Минимальное расстояние стрелки до края поповера
52
+ var MIN_DISTANCE_TO_EDGE = 24;
53
+ function getArrowPadding(_a) {
54
+ var placement = _a.placement;
55
+ if (placement === 'right-end' || placement === 'left-end') {
56
+ return { top: MIN_DISTANCE_TO_EDGE, right: 0, bottom: 0, left: 0 };
57
+ }
58
+ if (placement === 'top-start' || placement === 'bottom-start') {
59
+ return { top: 0, right: MIN_DISTANCE_TO_EDGE, bottom: 0, left: 0 };
60
+ }
61
+ if (placement === 'right-start' || placement === 'left-start') {
62
+ return { top: 0, right: 0, bottom: MIN_DISTANCE_TO_EDGE, left: 0 };
63
+ }
64
+ if (placement === 'top-end' || placement === 'bottom-end') {
65
+ return { top: 0, right: 0, bottom: 0, left: MIN_DISTANCE_TO_EDGE };
66
+ }
67
+ return 0;
68
+ }
55
69
  var Popover = React.forwardRef(function (_a, ref) {
56
- 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 ? "".concat(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;
70
+ 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 ? DEFAULT_OFFSET : _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 ? "".concat(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;
57
71
  var _l = React.useState(anchorElement), referenceElement = _l[0], setReferenceElement = _l[1];
58
72
  var _m = React.useState(null), popperElement = _m[0], setPopperElement = _m[1];
59
73
  var _o = React.useState(null), arrowElement = _o[0], setArrowElement = _o[1];
60
- var _p = React.useState(false), arrowShift = _p[0], setArrowShift = _p[1];
61
74
  var updatePopperRef = React.useRef();
62
75
  var popperRef = React.useRef(null);
63
76
  var innerRef = React.useRef(null);
64
77
  var popperModifiers = React.useMemo(function () {
65
78
  var modifiers = [{ name: 'offset', options: { offset: offset } }];
66
79
  if (withArrow) {
67
- modifiers.push({ name: 'arrow', options: { element: arrowElement } });
80
+ modifiers.push({
81
+ name: 'arrow',
82
+ options: {
83
+ element: arrowElement,
84
+ padding: getArrowPadding,
85
+ },
86
+ });
68
87
  }
69
88
  if (preventFlip) {
70
89
  modifiers.push({ name: 'flip', options: { fallbackPlacements: [] } });
@@ -89,10 +108,10 @@ var Popover = React.forwardRef(function (_a, ref) {
89
108
  availableHeight,
90
109
  arrowElement,
91
110
  ]);
92
- var _q = reactPopper.usePopper(referenceElement, popperElement, {
111
+ var _p = reactPopper.usePopper(referenceElement, popperElement, {
93
112
  placement: position,
94
113
  modifiers: popperModifiers,
95
- }), popperStyles = _q.styles, attributes = _q.attributes, updatePopper = _q.update;
114
+ }), popperStyles = _p.styles, attributes = _p.attributes, updatePopper = _p.update;
96
115
  if (updatePopper) {
97
116
  updatePopperRef.current = updatePopper;
98
117
  }
@@ -124,28 +143,12 @@ var Popover = React.forwardRef(function (_a, ref) {
124
143
  }
125
144
  return function () { return ({}); };
126
145
  }, [anchorElement, useAnchorWidth]);
127
- /**
128
- * По дизайну, если у тултипа позиционирование -start/-end, то стрелочка немного сдвигается вбок.
129
- * Но если anchorElement слишком маленький, то стрелочка сдвигаться не должна.
130
- */
131
- React.useEffect(function () {
132
- var shiftedPosition = position.includes('-start') || position.includes('-end');
133
- if (shiftedPosition && referenceElement) {
134
- var _a = referenceElement.getBoundingClientRect(), width = _a.width, height = _a.height;
135
- var size = position.includes('left') || position.includes('right') ? height : width;
136
- if (size >= MIN_ARROW_SHIFT_SIZE) {
137
- setArrowShift(true);
138
- }
139
- }
140
- }, [referenceElement, position]);
141
146
  var renderContent = function (computedZIndex) {
142
- var _a, _b;
143
- var _c;
144
- return (React__default.default.createElement("div", tslib.__assign({ ref: mergeRefs__default.default([ref, popperRef, setPopperElement]), style: tslib.__assign(tslib.__assign({ zIndex: computedZIndex, width: useAnchorWidth ? referenceElement === null || referenceElement === void 0 ? void 0 : referenceElement.offsetWidth : undefined }, popperStyles.popper), (((_c = popperStyles.popper) === null || _c === void 0 ? void 0 : _c.transform) ? null : { visibility: 'hidden' })), "data-test-id": dataTestId, className: cn__default.default(styles.component, className, (_a = {},
145
- _a[styles.arrowShift] = arrowShift,
146
- _a)) }, attributes.popper),
147
+ var _a;
148
+ var _b;
149
+ return (React__default.default.createElement("div", tslib.__assign({ ref: mergeRefs__default.default([ref, popperRef, setPopperElement]), style: tslib.__assign(tslib.__assign({ zIndex: computedZIndex, width: useAnchorWidth ? referenceElement === null || referenceElement === void 0 ? void 0 : referenceElement.offsetWidth : undefined }, popperStyles.popper), (((_b = popperStyles.popper) === null || _b === void 0 ? void 0 : _b.transform) ? null : { visibility: 'hidden' })), "data-test-id": dataTestId, className: cn__default.default(styles.component, className) }, attributes.popper),
147
150
  React__default.default.createElement("div", { className: cn__default.default(styles.inner, popperClassName), ref: innerRef },
148
- React__default.default.createElement("div", { className: cn__default.default((_b = {}, _b[styles.scrollableContent] = availableHeight, _b)) }, children),
151
+ React__default.default.createElement("div", { className: cn__default.default((_a = {}, _a[styles.scrollableContent] = availableHeight, _a)) }, children),
149
152
  withArrow && (React__default.default.createElement("div", { ref: setArrowElement, style: popperStyles.arrow, className: cn__default.default(styles.arrow, arrowClassName) })))));
150
153
  };
151
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, tslib.__assign({ unmountOnExit: true, classNames: CSS_TRANSITION_CLASS_NAMES, nodeRef: popperRef }, transition, { in: open, onEntering: function (node, isAppearing) {
@@ -158,5 +161,6 @@ var Popover = React.forwardRef(function (_a, ref) {
158
161
  (_a = transition === null || transition === void 0 ? void 0 : transition.onEntering) === null || _a === void 0 ? void 0 : _a.call(transition, node, isAppearing);
159
162
  } }), renderContent(computedZIndex))) : (open && renderContent(computedZIndex)))); }));
160
163
  });
164
+ Popover.displayName = 'Popover';
161
165
 
162
166
  exports.Popover = Popover;
@@ -25,7 +25,7 @@ type PopoverProps = {
25
25
  position?: Position;
26
26
  /**
27
27
  * Запрещает поповеру менять свою позицию.
28
- * Например, если места снизу недостаточно,то он все равно будет показан снизу
28
+ * Например, если места снизу недостаточно, то он все равно будет показан снизу
29
29
  */
30
30
  preventFlip?: boolean;
31
31
  /**
package/cssm/Component.js CHANGED
@@ -46,24 +46,43 @@ var availableHieghtModifier = {
46
46
  }
47
47
  },
48
48
  };
49
- /**
50
- * Минимальный размер anchorElement,
51
- * при котором возможно смещение стрелочки относительно центра
52
- */
53
- var MIN_ARROW_SHIFT_SIZE = 75;
49
+ var DEFAULT_OFFSET = [0, 0];
50
+ // Минимальное расстояние стрелки до края поповера
51
+ var MIN_DISTANCE_TO_EDGE = 24;
52
+ function getArrowPadding(_a) {
53
+ var placement = _a.placement;
54
+ if (placement === 'right-end' || placement === 'left-end') {
55
+ return { top: MIN_DISTANCE_TO_EDGE, right: 0, bottom: 0, left: 0 };
56
+ }
57
+ if (placement === 'top-start' || placement === 'bottom-start') {
58
+ return { top: 0, right: MIN_DISTANCE_TO_EDGE, bottom: 0, left: 0 };
59
+ }
60
+ if (placement === 'right-start' || placement === 'left-start') {
61
+ return { top: 0, right: 0, bottom: MIN_DISTANCE_TO_EDGE, left: 0 };
62
+ }
63
+ if (placement === 'top-end' || placement === 'bottom-end') {
64
+ return { top: 0, right: 0, bottom: 0, left: MIN_DISTANCE_TO_EDGE };
65
+ }
66
+ return 0;
67
+ }
54
68
  var Popover = React.forwardRef(function (_a, ref) {
55
- 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 ? "".concat(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;
69
+ 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 ? DEFAULT_OFFSET : _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 ? "".concat(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;
56
70
  var _l = React.useState(anchorElement), referenceElement = _l[0], setReferenceElement = _l[1];
57
71
  var _m = React.useState(null), popperElement = _m[0], setPopperElement = _m[1];
58
72
  var _o = React.useState(null), arrowElement = _o[0], setArrowElement = _o[1];
59
- var _p = React.useState(false), arrowShift = _p[0], setArrowShift = _p[1];
60
73
  var updatePopperRef = React.useRef();
61
74
  var popperRef = React.useRef(null);
62
75
  var innerRef = React.useRef(null);
63
76
  var popperModifiers = React.useMemo(function () {
64
77
  var modifiers = [{ name: 'offset', options: { offset: offset } }];
65
78
  if (withArrow) {
66
- modifiers.push({ name: 'arrow', options: { element: arrowElement } });
79
+ modifiers.push({
80
+ name: 'arrow',
81
+ options: {
82
+ element: arrowElement,
83
+ padding: getArrowPadding,
84
+ },
85
+ });
67
86
  }
68
87
  if (preventFlip) {
69
88
  modifiers.push({ name: 'flip', options: { fallbackPlacements: [] } });
@@ -88,10 +107,10 @@ var Popover = React.forwardRef(function (_a, ref) {
88
107
  availableHeight,
89
108
  arrowElement,
90
109
  ]);
91
- var _q = reactPopper.usePopper(referenceElement, popperElement, {
110
+ var _p = reactPopper.usePopper(referenceElement, popperElement, {
92
111
  placement: position,
93
112
  modifiers: popperModifiers,
94
- }), popperStyles = _q.styles, attributes = _q.attributes, updatePopper = _q.update;
113
+ }), popperStyles = _p.styles, attributes = _p.attributes, updatePopper = _p.update;
95
114
  if (updatePopper) {
96
115
  updatePopperRef.current = updatePopper;
97
116
  }
@@ -123,28 +142,12 @@ var Popover = React.forwardRef(function (_a, ref) {
123
142
  }
124
143
  return function () { return ({}); };
125
144
  }, [anchorElement, useAnchorWidth]);
126
- /**
127
- * По дизайну, если у тултипа позиционирование -start/-end, то стрелочка немного сдвигается вбок.
128
- * Но если anchorElement слишком маленький, то стрелочка сдвигаться не должна.
129
- */
130
- React.useEffect(function () {
131
- var shiftedPosition = position.includes('-start') || position.includes('-end');
132
- if (shiftedPosition && referenceElement) {
133
- var _a = referenceElement.getBoundingClientRect(), width = _a.width, height = _a.height;
134
- var size = position.includes('left') || position.includes('right') ? height : width;
135
- if (size >= MIN_ARROW_SHIFT_SIZE) {
136
- setArrowShift(true);
137
- }
138
- }
139
- }, [referenceElement, position]);
140
145
  var renderContent = function (computedZIndex) {
141
- var _a, _b;
142
- var _c;
143
- return (React__default.default.createElement("div", tslib.__assign({ ref: mergeRefs__default.default([ref, popperRef, setPopperElement]), style: tslib.__assign(tslib.__assign({ zIndex: computedZIndex, width: useAnchorWidth ? referenceElement === null || referenceElement === void 0 ? void 0 : referenceElement.offsetWidth : undefined }, popperStyles.popper), (((_c = popperStyles.popper) === null || _c === void 0 ? void 0 : _c.transform) ? null : { visibility: 'hidden' })), "data-test-id": dataTestId, className: cn__default.default(styles__default.default.component, className, (_a = {},
144
- _a[styles__default.default.arrowShift] = arrowShift,
145
- _a)) }, attributes.popper),
146
+ var _a;
147
+ var _b;
148
+ return (React__default.default.createElement("div", tslib.__assign({ ref: mergeRefs__default.default([ref, popperRef, setPopperElement]), style: tslib.__assign(tslib.__assign({ zIndex: computedZIndex, width: useAnchorWidth ? referenceElement === null || referenceElement === void 0 ? void 0 : referenceElement.offsetWidth : undefined }, popperStyles.popper), (((_b = popperStyles.popper) === null || _b === void 0 ? void 0 : _b.transform) ? null : { visibility: 'hidden' })), "data-test-id": dataTestId, className: cn__default.default(styles__default.default.component, className) }, attributes.popper),
146
149
  React__default.default.createElement("div", { className: cn__default.default(styles__default.default.inner, popperClassName), ref: innerRef },
147
- React__default.default.createElement("div", { className: cn__default.default((_b = {}, _b[styles__default.default.scrollableContent] = availableHeight, _b)) }, children),
150
+ React__default.default.createElement("div", { className: cn__default.default((_a = {}, _a[styles__default.default.scrollableContent] = availableHeight, _a)) }, children),
148
151
  withArrow && (React__default.default.createElement("div", { ref: setArrowElement, style: popperStyles.arrow, className: cn__default.default(styles__default.default.arrow, arrowClassName) })))));
149
152
  };
150
153
  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, tslib.__assign({ unmountOnExit: true, classNames: CSS_TRANSITION_CLASS_NAMES, nodeRef: popperRef }, transition, { in: open, onEntering: function (node, isAppearing) {
@@ -157,5 +160,6 @@ var Popover = React.forwardRef(function (_a, ref) {
157
160
  (_a = transition === null || transition === void 0 ? void 0 : transition.onEntering) === null || _a === void 0 ? void 0 : _a.call(transition, node, isAppearing);
158
161
  } }), renderContent(computedZIndex))) : (open && renderContent(computedZIndex)))); }));
159
162
  });
163
+ Popover.displayName = 'Popover';
160
164
 
161
165
  exports.Popover = Popover;
package/cssm/index.js CHANGED
@@ -3,18 +3,6 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var Component = require('./Component.js');
6
- require('tslib');
7
- require('react');
8
- require('react-merge-refs');
9
- require('react-popper');
10
- require('react-transition-group');
11
- require('@juggle/resize-observer');
12
- require('classnames');
13
- require('popper-max-size-modifier');
14
- require('@alfalab/core-components-portal/cssm');
15
- require('@alfalab/core-components-stack/cssm');
16
- require('@alfalab/hooks');
17
- require('./index.module.css');
18
6
 
19
7
 
20
8
 
@@ -1,7 +1,7 @@
1
- :root {
1
+ :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
2
2
  } /* deprecated */ :root {
3
3
  --color-light-modal-bg-primary: #fff;
4
- --color-light-text-primary: #0e0e0e; /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
4
+ --color-light-text-primary: rgba(3, 3, 6, 0.88); /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
5
5
  } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
6
6
  } :root {
7
7
  } :root {
@@ -53,11 +53,7 @@
53
53
  top: -6px;
54
54
  border-bottom: none;
55
55
  border-left: none;
56
- } .component[data-popper-placement='left-start'].arrowShift .arrow:after {
57
- top: -7px;
58
- } .component[data-popper-placement='left-end'].arrowShift .arrow:after {
59
- top: -5px;
60
- } .component[data-popper-placement='right'] .arrow,
56
+ } .component[data-popper-placement='right'] .arrow,
61
57
  .component[data-popper-placement='right-start'] .arrow,
62
58
  .component[data-popper-placement='right-end'] .arrow {
63
59
  left: -7px
@@ -65,11 +61,7 @@
65
61
  top: -6px;
66
62
  border-top: none;
67
63
  border-right: none;
68
- } .component[data-popper-placement='right-start'].arrowShift .arrow:after {
69
- top: -7px;
70
- } .component[data-popper-placement='right-end'].arrowShift .arrow:after {
71
- top: -5px;
72
- } .component[data-popper-placement='top'] .arrow,
64
+ } .component[data-popper-placement='top'] .arrow,
73
65
  .component[data-popper-placement='top-start'] .arrow,
74
66
  .component[data-popper-placement='top-end'] .arrow {
75
67
  bottom: 5px
@@ -77,11 +69,7 @@
77
69
  left: -6px;
78
70
  border-top: none;
79
71
  border-left: none;
80
- } .component[data-popper-placement='top-start'].arrowShift .arrow:after {
81
- left: -17px;
82
- } .component[data-popper-placement='top-end'].arrowShift .arrow:after {
83
- left: 5px;
84
- } .component[data-popper-placement='bottom'] .arrow,
72
+ } .component[data-popper-placement='bottom'] .arrow,
85
73
  .component[data-popper-placement='bottom-start'] .arrow,
86
74
  .component[data-popper-placement='bottom-end'] .arrow {
87
75
  top: -7px
@@ -89,11 +77,7 @@
89
77
  left: -6px;
90
78
  border-bottom: none;
91
79
  border-right: none;
92
- } .component[data-popper-placement='bottom-start'].arrowShift .arrow:after {
93
- left: -17px;
94
- } .component[data-popper-placement='bottom-end'].arrowShift .arrow:after {
95
- left: 5px;
96
- } .enter .inner {
80
+ } .enter .inner {
97
81
  opacity: 0;
98
82
  transform: scale(0.98);
99
83
  } .enterActive .inner {
@@ -25,7 +25,7 @@ type PopoverProps = {
25
25
  position?: Position;
26
26
  /**
27
27
  * Запрещает поповеру менять свою позицию.
28
- * Например, если места снизу недостаточно,то он все равно будет показан снизу
28
+ * Например, если места снизу недостаточно, то он все равно будет показан снизу
29
29
  */
30
30
  preventFlip?: boolean;
31
31
  /**
package/esm/Component.js CHANGED
@@ -10,7 +10,7 @@ import { Portal } from '@alfalab/core-components-portal/esm';
10
10
  import { stackingOrder, Stack } from '@alfalab/core-components-stack/esm';
11
11
  import { useLayoutEffect_SAFE_FOR_SSR } from '@alfalab/hooks';
12
12
 
13
- var styles = {"component":"popover__component_1btnx","inner":"popover__inner_1btnx","scrollableContent":"popover__scrollableContent_1btnx","arrow":"popover__arrow_1btnx","arrowShift":"popover__arrowShift_1btnx","enter":"popover__enter_1btnx","enterActive":"popover__enterActive_1btnx","exit":"popover__exit_1btnx","exitActive":"popover__exitActive_1btnx"};
13
+ var styles = {"component":"popover__component_trlps","inner":"popover__inner_trlps","scrollableContent":"popover__scrollableContent_trlps","arrow":"popover__arrow_trlps","enter":"popover__enter_trlps","enterActive":"popover__enterActive_trlps","exit":"popover__exit_trlps","exitActive":"popover__exitActive_trlps"};
14
14
  require('./index.css')
15
15
 
16
16
  var DEFAULT_TRANSITION = {
@@ -36,24 +36,43 @@ var availableHieghtModifier = {
36
36
  }
37
37
  },
38
38
  };
39
- /**
40
- * Минимальный размер anchorElement,
41
- * при котором возможно смещение стрелочки относительно центра
42
- */
43
- var MIN_ARROW_SHIFT_SIZE = 75;
39
+ var DEFAULT_OFFSET = [0, 0];
40
+ // Минимальное расстояние стрелки до края поповера
41
+ var MIN_DISTANCE_TO_EDGE = 24;
42
+ function getArrowPadding(_a) {
43
+ var placement = _a.placement;
44
+ if (placement === 'right-end' || placement === 'left-end') {
45
+ return { top: MIN_DISTANCE_TO_EDGE, right: 0, bottom: 0, left: 0 };
46
+ }
47
+ if (placement === 'top-start' || placement === 'bottom-start') {
48
+ return { top: 0, right: MIN_DISTANCE_TO_EDGE, bottom: 0, left: 0 };
49
+ }
50
+ if (placement === 'right-start' || placement === 'left-start') {
51
+ return { top: 0, right: 0, bottom: MIN_DISTANCE_TO_EDGE, left: 0 };
52
+ }
53
+ if (placement === 'top-end' || placement === 'bottom-end') {
54
+ return { top: 0, right: 0, bottom: 0, left: MIN_DISTANCE_TO_EDGE };
55
+ }
56
+ return 0;
57
+ }
44
58
  var Popover = forwardRef(function (_a, ref) {
45
- 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 ? "".concat(transition.timeout, "ms") : _g, _h = _a.zIndex, zIndex = _h === void 0 ? stackingOrder.POPOVER : _h, fallbackPlacements = _a.fallbackPlacements, _j = _a.preventOverflow, preventOverflow = _j === void 0 ? true : _j, _k = _a.availableHeight, availableHeight = _k === void 0 ? false : _k;
59
+ 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 ? DEFAULT_OFFSET : _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 ? "".concat(transition.timeout, "ms") : _g, _h = _a.zIndex, zIndex = _h === void 0 ? stackingOrder.POPOVER : _h, fallbackPlacements = _a.fallbackPlacements, _j = _a.preventOverflow, preventOverflow = _j === void 0 ? true : _j, _k = _a.availableHeight, availableHeight = _k === void 0 ? false : _k;
46
60
  var _l = useState(anchorElement), referenceElement = _l[0], setReferenceElement = _l[1];
47
61
  var _m = useState(null), popperElement = _m[0], setPopperElement = _m[1];
48
62
  var _o = useState(null), arrowElement = _o[0], setArrowElement = _o[1];
49
- var _p = useState(false), arrowShift = _p[0], setArrowShift = _p[1];
50
63
  var updatePopperRef = useRef();
51
64
  var popperRef = useRef(null);
52
65
  var innerRef = useRef(null);
53
66
  var popperModifiers = useMemo(function () {
54
67
  var modifiers = [{ name: 'offset', options: { offset: offset } }];
55
68
  if (withArrow) {
56
- modifiers.push({ name: 'arrow', options: { element: arrowElement } });
69
+ modifiers.push({
70
+ name: 'arrow',
71
+ options: {
72
+ element: arrowElement,
73
+ padding: getArrowPadding,
74
+ },
75
+ });
57
76
  }
58
77
  if (preventFlip) {
59
78
  modifiers.push({ name: 'flip', options: { fallbackPlacements: [] } });
@@ -78,10 +97,10 @@ var Popover = forwardRef(function (_a, ref) {
78
97
  availableHeight,
79
98
  arrowElement,
80
99
  ]);
81
- var _q = usePopper(referenceElement, popperElement, {
100
+ var _p = usePopper(referenceElement, popperElement, {
82
101
  placement: position,
83
102
  modifiers: popperModifiers,
84
- }), popperStyles = _q.styles, attributes = _q.attributes, updatePopper = _q.update;
103
+ }), popperStyles = _p.styles, attributes = _p.attributes, updatePopper = _p.update;
85
104
  if (updatePopper) {
86
105
  updatePopperRef.current = updatePopper;
87
106
  }
@@ -113,28 +132,12 @@ var Popover = forwardRef(function (_a, ref) {
113
132
  }
114
133
  return function () { return ({}); };
115
134
  }, [anchorElement, useAnchorWidth]);
116
- /**
117
- * По дизайну, если у тултипа позиционирование -start/-end, то стрелочка немного сдвигается вбок.
118
- * Но если anchorElement слишком маленький, то стрелочка сдвигаться не должна.
119
- */
120
- useEffect(function () {
121
- var shiftedPosition = position.includes('-start') || position.includes('-end');
122
- if (shiftedPosition && referenceElement) {
123
- var _a = referenceElement.getBoundingClientRect(), width = _a.width, height = _a.height;
124
- var size = position.includes('left') || position.includes('right') ? height : width;
125
- if (size >= MIN_ARROW_SHIFT_SIZE) {
126
- setArrowShift(true);
127
- }
128
- }
129
- }, [referenceElement, position]);
130
135
  var renderContent = function (computedZIndex) {
131
- var _a, _b;
132
- var _c;
133
- return (React.createElement("div", __assign({ ref: mergeRefs([ref, popperRef, setPopperElement]), style: __assign(__assign({ zIndex: computedZIndex, width: useAnchorWidth ? referenceElement === null || referenceElement === void 0 ? void 0 : referenceElement.offsetWidth : undefined }, popperStyles.popper), (((_c = popperStyles.popper) === null || _c === void 0 ? void 0 : _c.transform) ? null : { visibility: 'hidden' })), "data-test-id": dataTestId, className: cn(styles.component, className, (_a = {},
134
- _a[styles.arrowShift] = arrowShift,
135
- _a)) }, attributes.popper),
136
+ var _a;
137
+ var _b;
138
+ return (React.createElement("div", __assign({ ref: mergeRefs([ref, popperRef, setPopperElement]), style: __assign(__assign({ zIndex: computedZIndex, width: useAnchorWidth ? referenceElement === null || referenceElement === void 0 ? void 0 : referenceElement.offsetWidth : undefined }, popperStyles.popper), (((_b = popperStyles.popper) === null || _b === void 0 ? void 0 : _b.transform) ? null : { visibility: 'hidden' })), "data-test-id": dataTestId, className: cn(styles.component, className) }, attributes.popper),
136
139
  React.createElement("div", { className: cn(styles.inner, popperClassName), ref: innerRef },
137
- React.createElement("div", { className: cn((_b = {}, _b[styles.scrollableContent] = availableHeight, _b)) }, children),
140
+ React.createElement("div", { className: cn((_a = {}, _a[styles.scrollableContent] = availableHeight, _a)) }, children),
138
141
  withArrow && (React.createElement("div", { ref: setArrowElement, style: popperStyles.arrow, className: cn(styles.arrow, arrowClassName) })))));
139
142
  };
140
143
  return (React.createElement(Stack, { value: zIndex }, function (computedZIndex) { return (React.createElement(Portal, { getPortalContainer: getPortalContainer }, withTransition ? (React.createElement(CSSTransition, __assign({ unmountOnExit: true, classNames: CSS_TRANSITION_CLASS_NAMES, nodeRef: popperRef }, transition, { in: open, onEntering: function (node, isAppearing) {
@@ -147,5 +150,6 @@ var Popover = forwardRef(function (_a, ref) {
147
150
  (_a = transition === null || transition === void 0 ? void 0 : transition.onEntering) === null || _a === void 0 ? void 0 : _a.call(transition, node, isAppearing);
148
151
  } }), renderContent(computedZIndex))) : (open && renderContent(computedZIndex)))); }));
149
152
  });
153
+ Popover.displayName = 'Popover';
150
154
 
151
155
  export { Popover };
package/esm/index.css CHANGED
@@ -1,8 +1,8 @@
1
- /* hash: m7e7m */
2
- :root {
1
+ /* hash: 1rit7 */
2
+ :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
3
3
  } /* deprecated */ :root {
4
4
  --color-light-modal-bg-primary: #fff;
5
- --color-light-text-primary: #0e0e0e; /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
5
+ --color-light-text-primary: rgba(3, 3, 6, 0.88); /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
6
6
  } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
7
7
  } :root {
8
8
  } :root {
@@ -20,23 +20,23 @@
20
20
  } :root {
21
21
  } :root {
22
22
  --popover-border-color: transparent;
23
- } .popover__component_1btnx {
23
+ } .popover__component_trlps {
24
24
  background-color: transparent;
25
25
  color: var(--color-light-text-primary);
26
- } .popover__inner_1btnx {
26
+ } .popover__inner_trlps {
27
27
  position: relative;
28
28
  background-color: var(--color-light-modal-bg-primary);
29
29
  box-shadow: var(--shadow-m);
30
30
  border: 1px solid var(--popover-border-color);
31
31
  box-sizing: border-box;
32
32
  will-change: transform;
33
- } .popover__scrollableContent_1btnx {
33
+ } .popover__scrollableContent_trlps {
34
34
  position: relative;
35
35
  z-index: 2;
36
36
  overflow-y: auto;
37
- } .popover__arrow_1btnx {
37
+ } .popover__arrow_trlps {
38
38
  z-index: 1;
39
- } .popover__arrow_1btnx:after {
39
+ } .popover__arrow_trlps:after {
40
40
  content: '';
41
41
  display: block;
42
42
  position: absolute;
@@ -46,67 +46,51 @@
46
46
  border: 1px solid var(--popover-border-color);
47
47
  box-sizing: border-box;
48
48
  transform: rotate(45deg);
49
- } .popover__component_1btnx[data-popper-placement='left'] .popover__arrow_1btnx,
50
- .popover__component_1btnx[data-popper-placement='left-start'] .popover__arrow_1btnx,
51
- .popover__component_1btnx[data-popper-placement='left-end'] .popover__arrow_1btnx {
49
+ } .popover__component_trlps[data-popper-placement='left'] .popover__arrow_trlps,
50
+ .popover__component_trlps[data-popper-placement='left-start'] .popover__arrow_trlps,
51
+ .popover__component_trlps[data-popper-placement='left-end'] .popover__arrow_trlps {
52
52
  right: 5px
53
- } .popover__component_1btnx[data-popper-placement='left'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='left-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='left-end'] .popover__arrow_1btnx:after {
53
+ } .popover__component_trlps[data-popper-placement='left'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='left-start'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='left-end'] .popover__arrow_trlps:after {
54
54
  top: -6px;
55
55
  border-bottom: none;
56
56
  border-left: none;
57
- } .popover__component_1btnx[data-popper-placement='left-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
58
- top: -7px;
59
- } .popover__component_1btnx[data-popper-placement='left-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
60
- top: -5px;
61
- } .popover__component_1btnx[data-popper-placement='right'] .popover__arrow_1btnx,
62
- .popover__component_1btnx[data-popper-placement='right-start'] .popover__arrow_1btnx,
63
- .popover__component_1btnx[data-popper-placement='right-end'] .popover__arrow_1btnx {
57
+ } .popover__component_trlps[data-popper-placement='right'] .popover__arrow_trlps,
58
+ .popover__component_trlps[data-popper-placement='right-start'] .popover__arrow_trlps,
59
+ .popover__component_trlps[data-popper-placement='right-end'] .popover__arrow_trlps {
64
60
  left: -7px
65
- } .popover__component_1btnx[data-popper-placement='right'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='right-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='right-end'] .popover__arrow_1btnx:after {
61
+ } .popover__component_trlps[data-popper-placement='right'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='right-start'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='right-end'] .popover__arrow_trlps:after {
66
62
  top: -6px;
67
63
  border-top: none;
68
64
  border-right: none;
69
- } .popover__component_1btnx[data-popper-placement='right-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
70
- top: -7px;
71
- } .popover__component_1btnx[data-popper-placement='right-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
72
- top: -5px;
73
- } .popover__component_1btnx[data-popper-placement='top'] .popover__arrow_1btnx,
74
- .popover__component_1btnx[data-popper-placement='top-start'] .popover__arrow_1btnx,
75
- .popover__component_1btnx[data-popper-placement='top-end'] .popover__arrow_1btnx {
65
+ } .popover__component_trlps[data-popper-placement='top'] .popover__arrow_trlps,
66
+ .popover__component_trlps[data-popper-placement='top-start'] .popover__arrow_trlps,
67
+ .popover__component_trlps[data-popper-placement='top-end'] .popover__arrow_trlps {
76
68
  bottom: 5px
77
- } .popover__component_1btnx[data-popper-placement='top'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='top-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='top-end'] .popover__arrow_1btnx:after {
69
+ } .popover__component_trlps[data-popper-placement='top'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='top-start'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='top-end'] .popover__arrow_trlps:after {
78
70
  left: -6px;
79
71
  border-top: none;
80
72
  border-left: none;
81
- } .popover__component_1btnx[data-popper-placement='top-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
82
- left: -17px;
83
- } .popover__component_1btnx[data-popper-placement='top-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
84
- left: 5px;
85
- } .popover__component_1btnx[data-popper-placement='bottom'] .popover__arrow_1btnx,
86
- .popover__component_1btnx[data-popper-placement='bottom-start'] .popover__arrow_1btnx,
87
- .popover__component_1btnx[data-popper-placement='bottom-end'] .popover__arrow_1btnx {
73
+ } .popover__component_trlps[data-popper-placement='bottom'] .popover__arrow_trlps,
74
+ .popover__component_trlps[data-popper-placement='bottom-start'] .popover__arrow_trlps,
75
+ .popover__component_trlps[data-popper-placement='bottom-end'] .popover__arrow_trlps {
88
76
  top: -7px
89
- } .popover__component_1btnx[data-popper-placement='bottom'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='bottom-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='bottom-end'] .popover__arrow_1btnx:after {
77
+ } .popover__component_trlps[data-popper-placement='bottom'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='bottom-start'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='bottom-end'] .popover__arrow_trlps:after {
90
78
  left: -6px;
91
79
  border-bottom: none;
92
80
  border-right: none;
93
- } .popover__component_1btnx[data-popper-placement='bottom-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
94
- left: -17px;
95
- } .popover__component_1btnx[data-popper-placement='bottom-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
96
- left: 5px;
97
- } .popover__enter_1btnx .popover__inner_1btnx {
81
+ } .popover__enter_trlps .popover__inner_trlps {
98
82
  opacity: 0;
99
83
  transform: scale(0.98);
100
- } .popover__enterActive_1btnx .popover__inner_1btnx {
84
+ } .popover__enterActive_trlps .popover__inner_trlps {
101
85
  opacity: 1;
102
86
  transform: scale(1);
103
87
  transition-property: opacity, transform;
104
88
  transition-timing-function: ease-in-out;
105
89
  transition-duration: 150ms;
106
- } .popover__exit_1btnx .popover__inner_1btnx {
90
+ } .popover__exit_trlps .popover__inner_trlps {
107
91
  opacity: 1;
108
92
  transform: scale(1);
109
- } .popover__exitActive_1btnx .popover__inner_1btnx {
93
+ } .popover__exitActive_trlps .popover__inner_trlps {
110
94
  opacity: 0;
111
95
  transform: scale(0.98);
112
96
  transition-property: opacity, transform;
package/esm/index.js CHANGED
@@ -1,12 +1 @@
1
1
  export { Popover } from './Component.js';
2
- import 'tslib';
3
- import 'react';
4
- import 'react-merge-refs';
5
- import 'react-popper';
6
- import 'react-transition-group';
7
- import '@juggle/resize-observer';
8
- import 'classnames';
9
- import 'popper-max-size-modifier';
10
- import '@alfalab/core-components-portal/esm';
11
- import '@alfalab/core-components-stack/esm';
12
- import '@alfalab/hooks';
package/index.css CHANGED
@@ -1,8 +1,8 @@
1
- /* hash: m7e7m */
2
- :root {
1
+ /* hash: 1rit7 */
2
+ :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
3
3
  } /* deprecated */ :root {
4
4
  --color-light-modal-bg-primary: #fff;
5
- --color-light-text-primary: #0e0e0e; /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
5
+ --color-light-text-primary: rgba(3, 3, 6, 0.88); /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
6
6
  } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
7
7
  } :root {
8
8
  } :root {
@@ -20,23 +20,23 @@
20
20
  } :root {
21
21
  } :root {
22
22
  --popover-border-color: transparent;
23
- } .popover__component_1btnx {
23
+ } .popover__component_trlps {
24
24
  background-color: transparent;
25
25
  color: var(--color-light-text-primary);
26
- } .popover__inner_1btnx {
26
+ } .popover__inner_trlps {
27
27
  position: relative;
28
28
  background-color: var(--color-light-modal-bg-primary);
29
29
  box-shadow: var(--shadow-m);
30
30
  border: 1px solid var(--popover-border-color);
31
31
  box-sizing: border-box;
32
32
  will-change: transform;
33
- } .popover__scrollableContent_1btnx {
33
+ } .popover__scrollableContent_trlps {
34
34
  position: relative;
35
35
  z-index: 2;
36
36
  overflow-y: auto;
37
- } .popover__arrow_1btnx {
37
+ } .popover__arrow_trlps {
38
38
  z-index: 1;
39
- } .popover__arrow_1btnx:after {
39
+ } .popover__arrow_trlps:after {
40
40
  content: '';
41
41
  display: block;
42
42
  position: absolute;
@@ -46,67 +46,51 @@
46
46
  border: 1px solid var(--popover-border-color);
47
47
  box-sizing: border-box;
48
48
  transform: rotate(45deg);
49
- } .popover__component_1btnx[data-popper-placement='left'] .popover__arrow_1btnx,
50
- .popover__component_1btnx[data-popper-placement='left-start'] .popover__arrow_1btnx,
51
- .popover__component_1btnx[data-popper-placement='left-end'] .popover__arrow_1btnx {
49
+ } .popover__component_trlps[data-popper-placement='left'] .popover__arrow_trlps,
50
+ .popover__component_trlps[data-popper-placement='left-start'] .popover__arrow_trlps,
51
+ .popover__component_trlps[data-popper-placement='left-end'] .popover__arrow_trlps {
52
52
  right: 5px
53
- } .popover__component_1btnx[data-popper-placement='left'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='left-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='left-end'] .popover__arrow_1btnx:after {
53
+ } .popover__component_trlps[data-popper-placement='left'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='left-start'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='left-end'] .popover__arrow_trlps:after {
54
54
  top: -6px;
55
55
  border-bottom: none;
56
56
  border-left: none;
57
- } .popover__component_1btnx[data-popper-placement='left-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
58
- top: -7px;
59
- } .popover__component_1btnx[data-popper-placement='left-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
60
- top: -5px;
61
- } .popover__component_1btnx[data-popper-placement='right'] .popover__arrow_1btnx,
62
- .popover__component_1btnx[data-popper-placement='right-start'] .popover__arrow_1btnx,
63
- .popover__component_1btnx[data-popper-placement='right-end'] .popover__arrow_1btnx {
57
+ } .popover__component_trlps[data-popper-placement='right'] .popover__arrow_trlps,
58
+ .popover__component_trlps[data-popper-placement='right-start'] .popover__arrow_trlps,
59
+ .popover__component_trlps[data-popper-placement='right-end'] .popover__arrow_trlps {
64
60
  left: -7px
65
- } .popover__component_1btnx[data-popper-placement='right'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='right-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='right-end'] .popover__arrow_1btnx:after {
61
+ } .popover__component_trlps[data-popper-placement='right'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='right-start'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='right-end'] .popover__arrow_trlps:after {
66
62
  top: -6px;
67
63
  border-top: none;
68
64
  border-right: none;
69
- } .popover__component_1btnx[data-popper-placement='right-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
70
- top: -7px;
71
- } .popover__component_1btnx[data-popper-placement='right-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
72
- top: -5px;
73
- } .popover__component_1btnx[data-popper-placement='top'] .popover__arrow_1btnx,
74
- .popover__component_1btnx[data-popper-placement='top-start'] .popover__arrow_1btnx,
75
- .popover__component_1btnx[data-popper-placement='top-end'] .popover__arrow_1btnx {
65
+ } .popover__component_trlps[data-popper-placement='top'] .popover__arrow_trlps,
66
+ .popover__component_trlps[data-popper-placement='top-start'] .popover__arrow_trlps,
67
+ .popover__component_trlps[data-popper-placement='top-end'] .popover__arrow_trlps {
76
68
  bottom: 5px
77
- } .popover__component_1btnx[data-popper-placement='top'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='top-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='top-end'] .popover__arrow_1btnx:after {
69
+ } .popover__component_trlps[data-popper-placement='top'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='top-start'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='top-end'] .popover__arrow_trlps:after {
78
70
  left: -6px;
79
71
  border-top: none;
80
72
  border-left: none;
81
- } .popover__component_1btnx[data-popper-placement='top-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
82
- left: -17px;
83
- } .popover__component_1btnx[data-popper-placement='top-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
84
- left: 5px;
85
- } .popover__component_1btnx[data-popper-placement='bottom'] .popover__arrow_1btnx,
86
- .popover__component_1btnx[data-popper-placement='bottom-start'] .popover__arrow_1btnx,
87
- .popover__component_1btnx[data-popper-placement='bottom-end'] .popover__arrow_1btnx {
73
+ } .popover__component_trlps[data-popper-placement='bottom'] .popover__arrow_trlps,
74
+ .popover__component_trlps[data-popper-placement='bottom-start'] .popover__arrow_trlps,
75
+ .popover__component_trlps[data-popper-placement='bottom-end'] .popover__arrow_trlps {
88
76
  top: -7px
89
- } .popover__component_1btnx[data-popper-placement='bottom'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='bottom-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='bottom-end'] .popover__arrow_1btnx:after {
77
+ } .popover__component_trlps[data-popper-placement='bottom'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='bottom-start'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='bottom-end'] .popover__arrow_trlps:after {
90
78
  left: -6px;
91
79
  border-bottom: none;
92
80
  border-right: none;
93
- } .popover__component_1btnx[data-popper-placement='bottom-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
94
- left: -17px;
95
- } .popover__component_1btnx[data-popper-placement='bottom-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
96
- left: 5px;
97
- } .popover__enter_1btnx .popover__inner_1btnx {
81
+ } .popover__enter_trlps .popover__inner_trlps {
98
82
  opacity: 0;
99
83
  transform: scale(0.98);
100
- } .popover__enterActive_1btnx .popover__inner_1btnx {
84
+ } .popover__enterActive_trlps .popover__inner_trlps {
101
85
  opacity: 1;
102
86
  transform: scale(1);
103
87
  transition-property: opacity, transform;
104
88
  transition-timing-function: ease-in-out;
105
89
  transition-duration: 150ms;
106
- } .popover__exit_1btnx .popover__inner_1btnx {
90
+ } .popover__exit_trlps .popover__inner_trlps {
107
91
  opacity: 1;
108
92
  transform: scale(1);
109
- } .popover__exitActive_1btnx .popover__inner_1btnx {
93
+ } .popover__exitActive_trlps .popover__inner_trlps {
110
94
  opacity: 0;
111
95
  transform: scale(0.98);
112
96
  transition-property: opacity, transform;
package/index.js CHANGED
@@ -3,17 +3,6 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var Component = require('./Component.js');
6
- require('tslib');
7
- require('react');
8
- require('react-merge-refs');
9
- require('react-popper');
10
- require('react-transition-group');
11
- require('@juggle/resize-observer');
12
- require('classnames');
13
- require('popper-max-size-modifier');
14
- require('@alfalab/core-components-portal');
15
- require('@alfalab/core-components-stack');
16
- require('@alfalab/hooks');
17
6
 
18
7
 
19
8
 
@@ -25,7 +25,7 @@ type PopoverProps = {
25
25
  position?: Position;
26
26
  /**
27
27
  * Запрещает поповеру менять свою позицию.
28
- * Например, если места снизу недостаточно,то он все равно будет показан снизу
28
+ * Например, если места снизу недостаточно, то он все равно будет показан снизу
29
29
  */
30
30
  preventFlip?: boolean;
31
31
  /**
@@ -9,7 +9,7 @@ import { Portal } from '@alfalab/core-components-portal/modern';
9
9
  import { Stack, stackingOrder } from '@alfalab/core-components-stack/modern';
10
10
  import { useLayoutEffect_SAFE_FOR_SSR } from '@alfalab/hooks';
11
11
 
12
- const styles = {"component":"popover__component_1btnx","inner":"popover__inner_1btnx","scrollableContent":"popover__scrollableContent_1btnx","arrow":"popover__arrow_1btnx","arrowShift":"popover__arrowShift_1btnx","enter":"popover__enter_1btnx","enterActive":"popover__enterActive_1btnx","exit":"popover__exit_1btnx","exitActive":"popover__exitActive_1btnx"};
12
+ const styles = {"component":"popover__component_trlps","inner":"popover__inner_trlps","scrollableContent":"popover__scrollableContent_trlps","arrow":"popover__arrow_trlps","enter":"popover__enter_trlps","enterActive":"popover__enterActive_trlps","exit":"popover__exit_trlps","exitActive":"popover__exitActive_trlps"};
13
13
  require('./index.css')
14
14
 
15
15
  const DEFAULT_TRANSITION = {
@@ -34,23 +34,41 @@ const availableHieghtModifier = {
34
34
  }
35
35
  },
36
36
  };
37
- /**
38
- * Минимальный размер anchorElement,
39
- * при котором возможно смещение стрелочки относительно центра
40
- */
41
- const MIN_ARROW_SHIFT_SIZE = 75;
42
- const Popover = forwardRef(({ children, getPortalContainer, transition = DEFAULT_TRANSITION, anchorElement, useAnchorWidth, offset = [0, 0], withArrow = false, withTransition = true, position = 'left', preventFlip, popperClassName, arrowClassName, className, open, dataTestId, update, transitionDuration = `${transition.timeout}ms`, zIndex = stackingOrder.POPOVER, fallbackPlacements, preventOverflow = true, availableHeight = false, }, ref) => {
37
+ const DEFAULT_OFFSET = [0, 0];
38
+ // Минимальное расстояние стрелки до края поповера
39
+ const MIN_DISTANCE_TO_EDGE = 24;
40
+ function getArrowPadding({ placement, }) {
41
+ if (placement === 'right-end' || placement === 'left-end') {
42
+ return { top: MIN_DISTANCE_TO_EDGE, right: 0, bottom: 0, left: 0 };
43
+ }
44
+ if (placement === 'top-start' || placement === 'bottom-start') {
45
+ return { top: 0, right: MIN_DISTANCE_TO_EDGE, bottom: 0, left: 0 };
46
+ }
47
+ if (placement === 'right-start' || placement === 'left-start') {
48
+ return { top: 0, right: 0, bottom: MIN_DISTANCE_TO_EDGE, left: 0 };
49
+ }
50
+ if (placement === 'top-end' || placement === 'bottom-end') {
51
+ return { top: 0, right: 0, bottom: 0, left: MIN_DISTANCE_TO_EDGE };
52
+ }
53
+ return 0;
54
+ }
55
+ const Popover = forwardRef(({ children, getPortalContainer, transition = DEFAULT_TRANSITION, anchorElement, useAnchorWidth, offset = DEFAULT_OFFSET, withArrow = false, withTransition = true, position = 'left', preventFlip, popperClassName, arrowClassName, className, open, dataTestId, update, transitionDuration = `${transition.timeout}ms`, zIndex = stackingOrder.POPOVER, fallbackPlacements, preventOverflow = true, availableHeight = false, }, ref) => {
43
56
  const [referenceElement, setReferenceElement] = useState(anchorElement);
44
57
  const [popperElement, setPopperElement] = useState(null);
45
58
  const [arrowElement, setArrowElement] = useState(null);
46
- const [arrowShift, setArrowShift] = useState(false);
47
59
  const updatePopperRef = useRef();
48
60
  const popperRef = useRef(null);
49
61
  const innerRef = useRef(null);
50
62
  const popperModifiers = useMemo(() => {
51
63
  const modifiers = [{ name: 'offset', options: { offset } }];
52
64
  if (withArrow) {
53
- modifiers.push({ name: 'arrow', options: { element: arrowElement } });
65
+ modifiers.push({
66
+ name: 'arrow',
67
+ options: {
68
+ element: arrowElement,
69
+ padding: getArrowPadding,
70
+ },
71
+ });
54
72
  }
55
73
  if (preventFlip) {
56
74
  modifiers.push({ name: 'flip', options: { fallbackPlacements: [] } });
@@ -110,28 +128,12 @@ const Popover = forwardRef(({ children, getPortalContainer, transition = DEFAULT
110
128
  }
111
129
  return () => ({});
112
130
  }, [anchorElement, useAnchorWidth]);
113
- /**
114
- * По дизайну, если у тултипа позиционирование -start/-end, то стрелочка немного сдвигается вбок.
115
- * Но если anchorElement слишком маленький, то стрелочка сдвигаться не должна.
116
- */
117
- useEffect(() => {
118
- const shiftedPosition = position.includes('-start') || position.includes('-end');
119
- if (shiftedPosition && referenceElement) {
120
- const { width, height } = referenceElement.getBoundingClientRect();
121
- const size = position.includes('left') || position.includes('right') ? height : width;
122
- if (size >= MIN_ARROW_SHIFT_SIZE) {
123
- setArrowShift(true);
124
- }
125
- }
126
- }, [referenceElement, position]);
127
131
  const renderContent = (computedZIndex) => (React.createElement("div", { ref: mergeRefs([ref, popperRef, setPopperElement]), style: {
128
132
  zIndex: computedZIndex,
129
133
  width: useAnchorWidth ? referenceElement?.offsetWidth : undefined,
130
134
  ...popperStyles.popper,
131
135
  ...(popperStyles.popper?.transform ? null : { visibility: 'hidden' }),
132
- }, "data-test-id": dataTestId, className: cn(styles.component, className, {
133
- [styles.arrowShift]: arrowShift,
134
- }), ...attributes.popper },
136
+ }, "data-test-id": dataTestId, className: cn(styles.component, className), ...attributes.popper },
135
137
  React.createElement("div", { className: cn(styles.inner, popperClassName), ref: innerRef },
136
138
  React.createElement("div", { className: cn({ [styles.scrollableContent]: availableHeight }) }, children),
137
139
  withArrow && (React.createElement("div", { ref: setArrowElement, style: popperStyles.arrow, className: cn(styles.arrow, arrowClassName) })))));
@@ -144,5 +146,6 @@ const Popover = forwardRef(({ children, getPortalContainer, transition = DEFAULT
144
146
  transition?.onEntering?.(node, isAppearing);
145
147
  } }, renderContent(computedZIndex))) : (open && renderContent(computedZIndex))))));
146
148
  });
149
+ Popover.displayName = 'Popover';
147
150
 
148
151
  export { Popover };
package/modern/index.css CHANGED
@@ -1,8 +1,8 @@
1
- /* hash: m7e7m */
2
- :root {
1
+ /* hash: 1rit7 */
2
+ :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
3
3
  } /* deprecated */ :root {
4
4
  --color-light-modal-bg-primary: #fff;
5
- --color-light-text-primary: #0e0e0e; /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
5
+ --color-light-text-primary: rgba(3, 3, 6, 0.88); /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
6
6
  } :root { /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */ /* deprecated */
7
7
  } :root {
8
8
  } :root {
@@ -20,23 +20,23 @@
20
20
  } :root {
21
21
  } :root {
22
22
  --popover-border-color: transparent;
23
- } .popover__component_1btnx {
23
+ } .popover__component_trlps {
24
24
  background-color: transparent;
25
25
  color: var(--color-light-text-primary);
26
- } .popover__inner_1btnx {
26
+ } .popover__inner_trlps {
27
27
  position: relative;
28
28
  background-color: var(--color-light-modal-bg-primary);
29
29
  box-shadow: var(--shadow-m);
30
30
  border: 1px solid var(--popover-border-color);
31
31
  box-sizing: border-box;
32
32
  will-change: transform;
33
- } .popover__scrollableContent_1btnx {
33
+ } .popover__scrollableContent_trlps {
34
34
  position: relative;
35
35
  z-index: 2;
36
36
  overflow-y: auto;
37
- } .popover__arrow_1btnx {
37
+ } .popover__arrow_trlps {
38
38
  z-index: 1;
39
- } .popover__arrow_1btnx:after {
39
+ } .popover__arrow_trlps:after {
40
40
  content: '';
41
41
  display: block;
42
42
  position: absolute;
@@ -46,67 +46,51 @@
46
46
  border: 1px solid var(--popover-border-color);
47
47
  box-sizing: border-box;
48
48
  transform: rotate(45deg);
49
- } .popover__component_1btnx[data-popper-placement='left'] .popover__arrow_1btnx,
50
- .popover__component_1btnx[data-popper-placement='left-start'] .popover__arrow_1btnx,
51
- .popover__component_1btnx[data-popper-placement='left-end'] .popover__arrow_1btnx {
49
+ } .popover__component_trlps[data-popper-placement='left'] .popover__arrow_trlps,
50
+ .popover__component_trlps[data-popper-placement='left-start'] .popover__arrow_trlps,
51
+ .popover__component_trlps[data-popper-placement='left-end'] .popover__arrow_trlps {
52
52
  right: 5px
53
- } .popover__component_1btnx[data-popper-placement='left'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='left-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='left-end'] .popover__arrow_1btnx:after {
53
+ } .popover__component_trlps[data-popper-placement='left'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='left-start'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='left-end'] .popover__arrow_trlps:after {
54
54
  top: -6px;
55
55
  border-bottom: none;
56
56
  border-left: none;
57
- } .popover__component_1btnx[data-popper-placement='left-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
58
- top: -7px;
59
- } .popover__component_1btnx[data-popper-placement='left-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
60
- top: -5px;
61
- } .popover__component_1btnx[data-popper-placement='right'] .popover__arrow_1btnx,
62
- .popover__component_1btnx[data-popper-placement='right-start'] .popover__arrow_1btnx,
63
- .popover__component_1btnx[data-popper-placement='right-end'] .popover__arrow_1btnx {
57
+ } .popover__component_trlps[data-popper-placement='right'] .popover__arrow_trlps,
58
+ .popover__component_trlps[data-popper-placement='right-start'] .popover__arrow_trlps,
59
+ .popover__component_trlps[data-popper-placement='right-end'] .popover__arrow_trlps {
64
60
  left: -7px
65
- } .popover__component_1btnx[data-popper-placement='right'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='right-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='right-end'] .popover__arrow_1btnx:after {
61
+ } .popover__component_trlps[data-popper-placement='right'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='right-start'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='right-end'] .popover__arrow_trlps:after {
66
62
  top: -6px;
67
63
  border-top: none;
68
64
  border-right: none;
69
- } .popover__component_1btnx[data-popper-placement='right-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
70
- top: -7px;
71
- } .popover__component_1btnx[data-popper-placement='right-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
72
- top: -5px;
73
- } .popover__component_1btnx[data-popper-placement='top'] .popover__arrow_1btnx,
74
- .popover__component_1btnx[data-popper-placement='top-start'] .popover__arrow_1btnx,
75
- .popover__component_1btnx[data-popper-placement='top-end'] .popover__arrow_1btnx {
65
+ } .popover__component_trlps[data-popper-placement='top'] .popover__arrow_trlps,
66
+ .popover__component_trlps[data-popper-placement='top-start'] .popover__arrow_trlps,
67
+ .popover__component_trlps[data-popper-placement='top-end'] .popover__arrow_trlps {
76
68
  bottom: 5px
77
- } .popover__component_1btnx[data-popper-placement='top'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='top-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='top-end'] .popover__arrow_1btnx:after {
69
+ } .popover__component_trlps[data-popper-placement='top'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='top-start'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='top-end'] .popover__arrow_trlps:after {
78
70
  left: -6px;
79
71
  border-top: none;
80
72
  border-left: none;
81
- } .popover__component_1btnx[data-popper-placement='top-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
82
- left: -17px;
83
- } .popover__component_1btnx[data-popper-placement='top-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
84
- left: 5px;
85
- } .popover__component_1btnx[data-popper-placement='bottom'] .popover__arrow_1btnx,
86
- .popover__component_1btnx[data-popper-placement='bottom-start'] .popover__arrow_1btnx,
87
- .popover__component_1btnx[data-popper-placement='bottom-end'] .popover__arrow_1btnx {
73
+ } .popover__component_trlps[data-popper-placement='bottom'] .popover__arrow_trlps,
74
+ .popover__component_trlps[data-popper-placement='bottom-start'] .popover__arrow_trlps,
75
+ .popover__component_trlps[data-popper-placement='bottom-end'] .popover__arrow_trlps {
88
76
  top: -7px
89
- } .popover__component_1btnx[data-popper-placement='bottom'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='bottom-start'] .popover__arrow_1btnx:after, .popover__component_1btnx[data-popper-placement='bottom-end'] .popover__arrow_1btnx:after {
77
+ } .popover__component_trlps[data-popper-placement='bottom'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='bottom-start'] .popover__arrow_trlps:after, .popover__component_trlps[data-popper-placement='bottom-end'] .popover__arrow_trlps:after {
90
78
  left: -6px;
91
79
  border-bottom: none;
92
80
  border-right: none;
93
- } .popover__component_1btnx[data-popper-placement='bottom-start'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
94
- left: -17px;
95
- } .popover__component_1btnx[data-popper-placement='bottom-end'].popover__arrowShift_1btnx .popover__arrow_1btnx:after {
96
- left: 5px;
97
- } .popover__enter_1btnx .popover__inner_1btnx {
81
+ } .popover__enter_trlps .popover__inner_trlps {
98
82
  opacity: 0;
99
83
  transform: scale(0.98);
100
- } .popover__enterActive_1btnx .popover__inner_1btnx {
84
+ } .popover__enterActive_trlps .popover__inner_trlps {
101
85
  opacity: 1;
102
86
  transform: scale(1);
103
87
  transition-property: opacity, transform;
104
88
  transition-timing-function: ease-in-out;
105
89
  transition-duration: 150ms;
106
- } .popover__exit_1btnx .popover__inner_1btnx {
90
+ } .popover__exit_trlps .popover__inner_trlps {
107
91
  opacity: 1;
108
92
  transform: scale(1);
109
- } .popover__exitActive_1btnx .popover__inner_1btnx {
93
+ } .popover__exitActive_trlps .popover__inner_trlps {
110
94
  opacity: 0;
111
95
  transform: scale(0.98);
112
96
  transition-property: opacity, transform;
package/modern/index.js CHANGED
@@ -1,11 +1 @@
1
1
  export { Popover } from './Component.js';
2
- import 'react';
3
- import 'react-merge-refs';
4
- import 'react-popper';
5
- import 'react-transition-group';
6
- import '@juggle/resize-observer';
7
- import 'classnames';
8
- import 'popper-max-size-modifier';
9
- import '@alfalab/core-components-portal/modern';
10
- import '@alfalab/core-components-stack/modern';
11
- import '@alfalab/hooks';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alfalab/core-components-popover",
3
- "version": "6.2.0",
3
+ "version": "6.2.2",
4
4
  "description": "Popover component",
5
5
  "keywords": [],
6
6
  "license": "MIT",
@@ -15,11 +15,11 @@
15
15
  "react-dom": "^16.9.0 || ^17.0.1 || ^18.0.0"
16
16
  },
17
17
  "dependencies": {
18
- "@alfalab/core-components-portal": "^3.2.0",
18
+ "@alfalab/core-components-portal": "^3.2.1",
19
19
  "@alfalab/core-components-stack": "^4.1.0",
20
20
  "@alfalab/hooks": "^1.13.0",
21
21
  "@juggle/resize-observer": "^3.3.1",
22
- "@popperjs/core": "^2.3.3",
22
+ "@popperjs/core": "^2.11.8",
23
23
  "classnames": "^2.3.1",
24
24
  "popper-max-size-modifier": "^0.2.0",
25
25
  "react-merge-refs": "^1.1.0",
package/src/Component.tsx CHANGED
@@ -55,7 +55,7 @@ export type PopoverProps = {
55
55
 
56
56
  /**
57
57
  * Запрещает поповеру менять свою позицию.
58
- * Например, если места снизу недостаточно,то он все равно будет показан снизу
58
+ * Например, если места снизу недостаточно, то он все равно будет показан снизу
59
59
  */
60
60
  preventFlip?: boolean;
61
61
 
@@ -176,11 +176,36 @@ const availableHieghtModifier = {
176
176
  },
177
177
  };
178
178
 
179
- /**
180
- * Минимальный размер anchorElement,
181
- * при котором возможно смещение стрелочки относительно центра
182
- */
183
- const MIN_ARROW_SHIFT_SIZE = 75;
179
+ const DEFAULT_OFFSET = [0, 0];
180
+
181
+ // Минимальное расстояние стрелки до края поповера
182
+ const MIN_DISTANCE_TO_EDGE = 24;
183
+
184
+ function getArrowPadding({
185
+ placement,
186
+ }: {
187
+ popper: { height: number; width: number };
188
+ reference: { height: number; width: number };
189
+ placement: Position;
190
+ }) {
191
+ if (placement === 'right-end' || placement === 'left-end') {
192
+ return { top: MIN_DISTANCE_TO_EDGE, right: 0, bottom: 0, left: 0 };
193
+ }
194
+
195
+ if (placement === 'top-start' || placement === 'bottom-start') {
196
+ return { top: 0, right: MIN_DISTANCE_TO_EDGE, bottom: 0, left: 0 };
197
+ }
198
+
199
+ if (placement === 'right-start' || placement === 'left-start') {
200
+ return { top: 0, right: 0, bottom: MIN_DISTANCE_TO_EDGE, left: 0 };
201
+ }
202
+
203
+ if (placement === 'top-end' || placement === 'bottom-end') {
204
+ return { top: 0, right: 0, bottom: 0, left: MIN_DISTANCE_TO_EDGE };
205
+ }
206
+
207
+ return 0;
208
+ }
184
209
 
185
210
  export const Popover = forwardRef<HTMLDivElement, PopoverProps>(
186
211
  (
@@ -190,7 +215,7 @@ export const Popover = forwardRef<HTMLDivElement, PopoverProps>(
190
215
  transition = DEFAULT_TRANSITION,
191
216
  anchorElement,
192
217
  useAnchorWidth,
193
- offset = [0, 0],
218
+ offset = DEFAULT_OFFSET,
194
219
  withArrow = false,
195
220
  withTransition = true,
196
221
  position = 'left',
@@ -212,7 +237,6 @@ export const Popover = forwardRef<HTMLDivElement, PopoverProps>(
212
237
  const [referenceElement, setReferenceElement] = useState<RefElement>(anchorElement);
213
238
  const [popperElement, setPopperElement] = useState<RefElement>(null);
214
239
  const [arrowElement, setArrowElement] = useState<RefElement>(null);
215
- const [arrowShift, setArrowShift] = useState(false);
216
240
 
217
241
  const updatePopperRef = useRef<() => void>();
218
242
 
@@ -223,7 +247,13 @@ export const Popover = forwardRef<HTMLDivElement, PopoverProps>(
223
247
  const modifiers: PopperModifier[] = [{ name: 'offset', options: { offset } }];
224
248
 
225
249
  if (withArrow) {
226
- modifiers.push({ name: 'arrow', options: { element: arrowElement } });
250
+ modifiers.push({
251
+ name: 'arrow',
252
+ options: {
253
+ element: arrowElement,
254
+ padding: getArrowPadding,
255
+ },
256
+ });
227
257
  }
228
258
 
229
259
  if (preventFlip) {
@@ -302,25 +332,6 @@ export const Popover = forwardRef<HTMLDivElement, PopoverProps>(
302
332
  return () => ({});
303
333
  }, [anchorElement, useAnchorWidth]);
304
334
 
305
- /**
306
- * По дизайну, если у тултипа позиционирование -start/-end, то стрелочка немного сдвигается вбок.
307
- * Но если anchorElement слишком маленький, то стрелочка сдвигаться не должна.
308
- */
309
- useEffect(() => {
310
- const shiftedPosition = position.includes('-start') || position.includes('-end');
311
-
312
- if (shiftedPosition && referenceElement) {
313
- const { width, height } = referenceElement.getBoundingClientRect();
314
-
315
- const size =
316
- position.includes('left') || position.includes('right') ? height : width;
317
-
318
- if (size >= MIN_ARROW_SHIFT_SIZE) {
319
- setArrowShift(true);
320
- }
321
- }
322
- }, [referenceElement, position]);
323
-
324
335
  const renderContent = (computedZIndex: number) => (
325
336
  <div
326
337
  ref={mergeRefs([ref, popperRef, setPopperElement])}
@@ -331,9 +342,7 @@ export const Popover = forwardRef<HTMLDivElement, PopoverProps>(
331
342
  ...(popperStyles.popper?.transform ? null : { visibility: 'hidden' }),
332
343
  }}
333
344
  data-test-id={dataTestId}
334
- className={cn(styles.component, className, {
335
- [styles.arrowShift]: arrowShift,
336
- })}
345
+ className={cn(styles.component, className)}
337
346
  {...attributes.popper}
338
347
  >
339
348
  <div className={cn(styles.inner, popperClassName)} ref={innerRef}>
@@ -388,3 +397,5 @@ export const Popover = forwardRef<HTMLDivElement, PopoverProps>(
388
397
  );
389
398
  },
390
399
  );
400
+
401
+ Popover.displayName = 'Popover';
@@ -52,14 +52,6 @@
52
52
  }
53
53
  }
54
54
 
55
- .component[data-popper-placement='left-start'].arrowShift .arrow:after {
56
- top: -7px;
57
- }
58
-
59
- .component[data-popper-placement='left-end'].arrowShift .arrow:after {
60
- top: -5px;
61
- }
62
-
63
55
  .component[data-popper-placement='right'] .arrow,
64
56
  .component[data-popper-placement='right-start'] .arrow,
65
57
  .component[data-popper-placement='right-end'] .arrow {
@@ -72,14 +64,6 @@
72
64
  }
73
65
  }
74
66
 
75
- .component[data-popper-placement='right-start'].arrowShift .arrow:after {
76
- top: -7px;
77
- }
78
-
79
- .component[data-popper-placement='right-end'].arrowShift .arrow:after {
80
- top: -5px;
81
- }
82
-
83
67
  .component[data-popper-placement='top'] .arrow,
84
68
  .component[data-popper-placement='top-start'] .arrow,
85
69
  .component[data-popper-placement='top-end'] .arrow {
@@ -92,14 +76,6 @@
92
76
  }
93
77
  }
94
78
 
95
- .component[data-popper-placement='top-start'].arrowShift .arrow:after {
96
- left: -17px;
97
- }
98
-
99
- .component[data-popper-placement='top-end'].arrowShift .arrow:after {
100
- left: 5px;
101
- }
102
-
103
79
  .component[data-popper-placement='bottom'] .arrow,
104
80
  .component[data-popper-placement='bottom-start'] .arrow,
105
81
  .component[data-popper-placement='bottom-end'] .arrow {
@@ -112,14 +88,6 @@
112
88
  }
113
89
  }
114
90
 
115
- .component[data-popper-placement='bottom-start'].arrowShift .arrow:after {
116
- left: -17px;
117
- }
118
-
119
- .component[data-popper-placement='bottom-end'].arrowShift .arrow:after {
120
- left: 5px;
121
- }
122
-
123
91
  .enter .inner {
124
92
  opacity: 0;
125
93
  transform: scale(0.98);