carbon-react 125.0.2 → 125.2.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/esm/__internal__/popover/popover.component.d.ts +2 -1
- package/esm/__internal__/popover/popover.component.js +4 -2
- package/esm/components/popover-container/popover-container.component.d.ts +3 -1
- package/esm/components/popover-container/popover-container.component.js +38 -17
- package/esm/components/popover-container/popover-container.style.d.ts +1 -0
- package/esm/components/popover-container/popover-container.style.js +31 -24
- package/lib/__internal__/popover/popover.component.d.ts +2 -1
- package/lib/__internal__/popover/popover.component.js +4 -2
- package/lib/components/popover-container/popover-container.component.d.ts +3 -1
- package/lib/components/popover-container/popover-container.component.js +38 -17
- package/lib/components/popover-container/popover-container.style.d.ts +1 -0
- package/lib/components/popover-container/popover-container.style.js +31 -24
- package/package.json +1 -1
|
@@ -12,6 +12,7 @@ export interface PopoverProps {
|
|
|
12
12
|
reference: CustomRefObject<HTMLElement>;
|
|
13
13
|
isOpen?: boolean;
|
|
14
14
|
animationFrame?: boolean;
|
|
15
|
+
popoverStrategy?: "absolute" | "fixed";
|
|
15
16
|
}
|
|
16
|
-
declare const Popover: ({ children, placement, disablePortal, reference, middleware, disableBackgroundUI, isOpen, animationFrame, }: PopoverProps) => React.JSX.Element;
|
|
17
|
+
declare const Popover: ({ children, placement, disablePortal, reference, middleware, disableBackgroundUI, isOpen, animationFrame, popoverStrategy, }: PopoverProps) => React.JSX.Element;
|
|
17
18
|
export default Popover;
|
|
@@ -17,7 +17,8 @@ const Popover = ({
|
|
|
17
17
|
middleware = defaultMiddleware,
|
|
18
18
|
disableBackgroundUI,
|
|
19
19
|
isOpen = true,
|
|
20
|
-
animationFrame
|
|
20
|
+
animationFrame,
|
|
21
|
+
popoverStrategy = "absolute"
|
|
21
22
|
}) => {
|
|
22
23
|
const elementDOM = useRef(null);
|
|
23
24
|
const {
|
|
@@ -46,7 +47,8 @@ const Popover = ({
|
|
|
46
47
|
floating: floatingReference,
|
|
47
48
|
placement,
|
|
48
49
|
middleware,
|
|
49
|
-
animationFrame
|
|
50
|
+
animationFrame,
|
|
51
|
+
strategy: popoverStrategy
|
|
50
52
|
});
|
|
51
53
|
useEffect(() => {
|
|
52
54
|
return () => {
|
|
@@ -55,6 +55,8 @@ export interface PopoverContainerProps extends PaddingProps {
|
|
|
55
55
|
closeButtonAriaLabel?: string;
|
|
56
56
|
/** Container aria label */
|
|
57
57
|
containerAriaLabel?: string;
|
|
58
|
+
/** Disables the animation for the component */
|
|
59
|
+
disableAnimation?: boolean;
|
|
58
60
|
}
|
|
59
|
-
export declare const PopoverContainer: ({ children, title, position, open, onOpen, onClose, renderOpenComponent, renderCloseComponent, shouldCoverButton, ariaDescribedBy, openButtonAriaLabel, closeButtonAriaLabel, containerAriaLabel, ...rest }: PopoverContainerProps) => React.JSX.Element;
|
|
61
|
+
export declare const PopoverContainer: ({ children, title, position, open, onOpen, onClose, renderOpenComponent, renderCloseComponent, shouldCoverButton, ariaDescribedBy, openButtonAriaLabel, closeButtonAriaLabel, containerAriaLabel, disableAnimation, ...rest }: PopoverContainerProps) => React.JSX.Element;
|
|
60
62
|
export default PopoverContainer;
|
|
@@ -3,6 +3,7 @@ import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
|
3
3
|
import PropTypes from "prop-types";
|
|
4
4
|
import { Transition } from "react-transition-group";
|
|
5
5
|
import { flip, offset } from "@floating-ui/dom";
|
|
6
|
+
import useMediaQuery from "../../hooks/useMediaQuery";
|
|
6
7
|
import { PopoverContainerWrapperStyle, PopoverContainerHeaderStyle, PopoverContainerContentStyle, PopoverContainerCloseIcon, PopoverContainerTitleStyle, PopoverContainerOpenIcon } from "./popover-container.style";
|
|
7
8
|
import Icon from "../icon";
|
|
8
9
|
import Popover from "../../__internal__/popover";
|
|
@@ -10,6 +11,8 @@ import createGuid from "../../__internal__/utils/helpers/guid";
|
|
|
10
11
|
import { filterStyledSystemPaddingProps } from "../../style/utils";
|
|
11
12
|
import useClickAwayListener from "../../hooks/__internal__/useClickAwayListener";
|
|
12
13
|
import Events from "../../__internal__/utils/helpers/events";
|
|
14
|
+
import FocusTrap from "../../__internal__/focus-trap";
|
|
15
|
+
import { ModalContext } from "../modal";
|
|
13
16
|
export const renderOpen = ({
|
|
14
17
|
tabIndex,
|
|
15
18
|
onClick,
|
|
@@ -67,6 +70,7 @@ export const PopoverContainer = ({
|
|
|
67
70
|
openButtonAriaLabel,
|
|
68
71
|
closeButtonAriaLabel = "close",
|
|
69
72
|
containerAriaLabel,
|
|
73
|
+
disableAnimation = false,
|
|
70
74
|
...rest
|
|
71
75
|
}) => {
|
|
72
76
|
const isControlled = open !== undefined;
|
|
@@ -78,19 +82,21 @@ export const PopoverContainer = ({
|
|
|
78
82
|
const popoverContentNodeRef = useRef(null);
|
|
79
83
|
const popoverContainerId = title ? `PopoverContainer_${guid.current}` : undefined;
|
|
80
84
|
const isOpen = isControlled ? open : isOpenInternal;
|
|
81
|
-
|
|
82
|
-
if (isOpen && closeButtonRef.current) setTimeout(() => closeButtonRef.current?.focus(), 0);
|
|
83
|
-
}, [isOpen]);
|
|
85
|
+
const reduceMotion = !useMediaQuery("screen and (prefers-reduced-motion: no-preference)");
|
|
84
86
|
const closePopover = useCallback(ev => {
|
|
85
|
-
if (!isControlled) setIsOpenInternal(
|
|
87
|
+
if (!isControlled) setIsOpenInternal(false);
|
|
86
88
|
if (onClose) onClose(ev);
|
|
87
|
-
if (isOpen && openButtonRef.current)
|
|
89
|
+
if (isOpen && openButtonRef.current) {
|
|
90
|
+
openButtonRef.current.focus();
|
|
91
|
+
}
|
|
88
92
|
}, [isControlled, isOpen, onClose]);
|
|
89
93
|
const handleEscKey = useCallback(ev => {
|
|
90
94
|
const eventIsFromSelectInput = Events.composedPath(ev).find(element => {
|
|
91
95
|
return element instanceof HTMLElement && element.getAttribute("data-element") === "input" && element.getAttribute("aria-expanded") === "true";
|
|
92
96
|
});
|
|
93
|
-
if (!eventIsFromSelectInput && Events.isEscKey(ev))
|
|
97
|
+
if (!eventIsFromSelectInput && Events.isEscKey(ev)) {
|
|
98
|
+
closePopover(ev);
|
|
99
|
+
}
|
|
94
100
|
}, [closePopover]);
|
|
95
101
|
useEffect(() => {
|
|
96
102
|
document.addEventListener("keydown", handleEscKey);
|
|
@@ -110,7 +116,7 @@ export const PopoverContainer = ({
|
|
|
110
116
|
closePopover(e);
|
|
111
117
|
};
|
|
112
118
|
const renderOpenComponentProps = {
|
|
113
|
-
tabIndex:
|
|
119
|
+
tabIndex: 0,
|
|
114
120
|
"aria-expanded": isOpen,
|
|
115
121
|
"aria-haspopup": "dialog",
|
|
116
122
|
isOpen,
|
|
@@ -132,12 +138,8 @@ export const PopoverContainer = ({
|
|
|
132
138
|
if (onClose && isOpen) onClose(e);
|
|
133
139
|
};
|
|
134
140
|
const handleClick = useClickAwayListener(handleClickAway, "mousedown");
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
onMouseDown: handleClick
|
|
138
|
-
}, /*#__PURE__*/React.createElement("div", {
|
|
139
|
-
ref: popoverReference
|
|
140
|
-
}, renderOpenComponent(renderOpenComponentProps)), /*#__PURE__*/React.createElement(Transition, {
|
|
141
|
+
const [isAnimationComplete, setIsAnimationComplete] = useState(false);
|
|
142
|
+
const popover = /*#__PURE__*/React.createElement(Transition, {
|
|
141
143
|
in: isOpen,
|
|
142
144
|
timeout: {
|
|
143
145
|
exit: 300
|
|
@@ -145,10 +147,14 @@ export const PopoverContainer = ({
|
|
|
145
147
|
appear: true,
|
|
146
148
|
mountOnEnter: true,
|
|
147
149
|
unmountOnExit: true,
|
|
148
|
-
nodeRef: popoverContentNodeRef
|
|
150
|
+
nodeRef: popoverContentNodeRef,
|
|
151
|
+
onEntered: shouldCoverButton ? /* istanbul ignore next */() => setIsAnimationComplete(true) : undefined,
|
|
152
|
+
onExiting: shouldCoverButton ? /* istanbul ignore next */() => setIsAnimationComplete(false) : undefined
|
|
149
153
|
}, state => isOpen && /*#__PURE__*/React.createElement(Popover, _extends({
|
|
154
|
+
disablePortal: true,
|
|
150
155
|
reference: popoverReference,
|
|
151
|
-
placement: position === "right" ? "bottom-start" : "bottom-end"
|
|
156
|
+
placement: position === "right" ? "bottom-start" : "bottom-end",
|
|
157
|
+
popoverStrategy: disableAnimation || reduceMotion ? "fixed" : "absolute"
|
|
152
158
|
}, shouldCoverButton && {
|
|
153
159
|
middleware: popoverMiddleware
|
|
154
160
|
}), /*#__PURE__*/React.createElement(PopoverContainerContentStyle, _extends({
|
|
@@ -159,10 +165,25 @@ export const PopoverContainer = ({
|
|
|
159
165
|
"aria-label": containerAriaLabel,
|
|
160
166
|
"aria-describedby": ariaDescribedBy,
|
|
161
167
|
p: "16px 24px",
|
|
162
|
-
ref: popoverContentNodeRef
|
|
168
|
+
ref: popoverContentNodeRef,
|
|
169
|
+
tabIndex: shouldCoverButton ? -1 : undefined,
|
|
170
|
+
disableAnimation: disableAnimation || reduceMotion
|
|
163
171
|
}, filterStyledSystemPaddingProps(rest)), /*#__PURE__*/React.createElement(PopoverContainerHeaderStyle, null, /*#__PURE__*/React.createElement(PopoverContainerTitleStyle, {
|
|
164
172
|
id: popoverContainerId,
|
|
165
173
|
"data-element": "popover-container-title"
|
|
166
|
-
}, title), renderCloseComponent(renderCloseComponentProps)), children)))
|
|
174
|
+
}, title), renderCloseComponent(renderCloseComponentProps)), children)));
|
|
175
|
+
return /*#__PURE__*/React.createElement(PopoverContainerWrapperStyle, {
|
|
176
|
+
"data-component": "popover-container",
|
|
177
|
+
onMouseDown: handleClick
|
|
178
|
+
}, /*#__PURE__*/React.createElement("div", {
|
|
179
|
+
ref: popoverReference
|
|
180
|
+
}, renderOpenComponent(renderOpenComponentProps)), shouldCoverButton ? /*#__PURE__*/React.createElement(ModalContext.Provider, {
|
|
181
|
+
value: {
|
|
182
|
+
isAnimationComplete
|
|
183
|
+
}
|
|
184
|
+
}, /*#__PURE__*/React.createElement(FocusTrap, {
|
|
185
|
+
wrapperRef: popoverContentNodeRef,
|
|
186
|
+
isOpen: isOpen
|
|
187
|
+
}, popover)) : popover);
|
|
167
188
|
};
|
|
168
189
|
export default PopoverContainer;
|
|
@@ -4,6 +4,7 @@ declare const PopoverContainerWrapperStyle: import("styled-components").StyledCo
|
|
|
4
4
|
declare const PopoverContainerHeaderStyle: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
5
5
|
declare type PopoverContainerContentStyleProps = {
|
|
6
6
|
animationState?: TransitionStatus;
|
|
7
|
+
disableAnimation?: boolean;
|
|
7
8
|
};
|
|
8
9
|
declare const PopoverContainerContentStyle: import("styled-components").StyledComponent<"div", any, PopoverContainerContentStyleProps, never>;
|
|
9
10
|
declare type AdditionalIconButtonProps = {
|
|
@@ -3,6 +3,33 @@ import { padding } from "styled-system";
|
|
|
3
3
|
import { baseTheme } from "../../style/themes";
|
|
4
4
|
import IconButton from "../icon-button";
|
|
5
5
|
import StyledIcon from "../icon/icon.style";
|
|
6
|
+
function animationToRender({
|
|
7
|
+
animationState,
|
|
8
|
+
disableAnimation
|
|
9
|
+
}) {
|
|
10
|
+
if (disableAnimation) return "opacity: 1;";
|
|
11
|
+
switch (animationState) {
|
|
12
|
+
case "entering":
|
|
13
|
+
return `
|
|
14
|
+
opacity: 0;
|
|
15
|
+
transform: translateY(-8px);
|
|
16
|
+
`;
|
|
17
|
+
case "entered":
|
|
18
|
+
return `
|
|
19
|
+
opacity: 1;
|
|
20
|
+
transform: translateY(0);
|
|
21
|
+
transition: all 0.3s cubic-bezier(0.25, 0.25, 0, 1.5);
|
|
22
|
+
`;
|
|
23
|
+
case "exiting":
|
|
24
|
+
return `
|
|
25
|
+
opacity: 0;
|
|
26
|
+
transform: translateY(-8px);
|
|
27
|
+
transition: all 0.3s cubic-bezier(0.25, 0.25, 0, 1.5);
|
|
28
|
+
`;
|
|
29
|
+
default:
|
|
30
|
+
return "opacity: 0;";
|
|
31
|
+
}
|
|
32
|
+
}
|
|
6
33
|
const PopoverContainerWrapperStyle = styled.div`
|
|
7
34
|
position: relative;
|
|
8
35
|
display: inline-block;
|
|
@@ -25,31 +52,11 @@ const PopoverContainerContentStyle = styled.div`
|
|
|
25
52
|
theme
|
|
26
53
|
}) => theme.zIndex.popover};
|
|
27
54
|
|
|
28
|
-
${
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
case "entering":
|
|
33
|
-
return `
|
|
34
|
-
opacity: 0;
|
|
35
|
-
transform: translateY(-8px);
|
|
36
|
-
`;
|
|
37
|
-
case "entered":
|
|
38
|
-
return `
|
|
39
|
-
opacity: 1;
|
|
40
|
-
transform: translateY(0);
|
|
41
|
-
transition: all 0.3s cubic-bezier(0.25, 0.25, 0, 1.5);
|
|
42
|
-
`;
|
|
43
|
-
case "exiting":
|
|
44
|
-
return `
|
|
45
|
-
opacity: 0;
|
|
46
|
-
transform: translateY(-8px);
|
|
47
|
-
transition: all 0.3s cubic-bezier(0.25, 0.25, 0, 1.5);
|
|
48
|
-
`;
|
|
49
|
-
default:
|
|
50
|
-
return "opacity: 0";
|
|
55
|
+
${animationToRender}
|
|
56
|
+
|
|
57
|
+
:focus {
|
|
58
|
+
outline: none;
|
|
51
59
|
}
|
|
52
|
-
}}
|
|
53
60
|
`;
|
|
54
61
|
const PopoverContainerOpenIcon = styled(IconButton)`
|
|
55
62
|
${StyledIcon} {
|
|
@@ -12,6 +12,7 @@ export interface PopoverProps {
|
|
|
12
12
|
reference: CustomRefObject<HTMLElement>;
|
|
13
13
|
isOpen?: boolean;
|
|
14
14
|
animationFrame?: boolean;
|
|
15
|
+
popoverStrategy?: "absolute" | "fixed";
|
|
15
16
|
}
|
|
16
|
-
declare const Popover: ({ children, placement, disablePortal, reference, middleware, disableBackgroundUI, isOpen, animationFrame, }: PopoverProps) => React.JSX.Element;
|
|
17
|
+
declare const Popover: ({ children, placement, disablePortal, reference, middleware, disableBackgroundUI, isOpen, animationFrame, popoverStrategy, }: PopoverProps) => React.JSX.Element;
|
|
17
18
|
export default Popover;
|
|
@@ -26,7 +26,8 @@ const Popover = ({
|
|
|
26
26
|
middleware = defaultMiddleware,
|
|
27
27
|
disableBackgroundUI,
|
|
28
28
|
isOpen = true,
|
|
29
|
-
animationFrame
|
|
29
|
+
animationFrame,
|
|
30
|
+
popoverStrategy = "absolute"
|
|
30
31
|
}) => {
|
|
31
32
|
const elementDOM = (0, _react.useRef)(null);
|
|
32
33
|
const {
|
|
@@ -55,7 +56,8 @@ const Popover = ({
|
|
|
55
56
|
floating: floatingReference,
|
|
56
57
|
placement,
|
|
57
58
|
middleware,
|
|
58
|
-
animationFrame
|
|
59
|
+
animationFrame,
|
|
60
|
+
strategy: popoverStrategy
|
|
59
61
|
});
|
|
60
62
|
(0, _react.useEffect)(() => {
|
|
61
63
|
return () => {
|
|
@@ -55,6 +55,8 @@ export interface PopoverContainerProps extends PaddingProps {
|
|
|
55
55
|
closeButtonAriaLabel?: string;
|
|
56
56
|
/** Container aria label */
|
|
57
57
|
containerAriaLabel?: string;
|
|
58
|
+
/** Disables the animation for the component */
|
|
59
|
+
disableAnimation?: boolean;
|
|
58
60
|
}
|
|
59
|
-
export declare const PopoverContainer: ({ children, title, position, open, onOpen, onClose, renderOpenComponent, renderCloseComponent, shouldCoverButton, ariaDescribedBy, openButtonAriaLabel, closeButtonAriaLabel, containerAriaLabel, ...rest }: PopoverContainerProps) => React.JSX.Element;
|
|
61
|
+
export declare const PopoverContainer: ({ children, title, position, open, onOpen, onClose, renderOpenComponent, renderCloseComponent, shouldCoverButton, ariaDescribedBy, openButtonAriaLabel, closeButtonAriaLabel, containerAriaLabel, disableAnimation, ...rest }: PopoverContainerProps) => React.JSX.Element;
|
|
60
62
|
export default PopoverContainer;
|
|
@@ -8,6 +8,7 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
8
8
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
9
9
|
var _reactTransitionGroup = require("react-transition-group");
|
|
10
10
|
var _dom = require("@floating-ui/dom");
|
|
11
|
+
var _useMediaQuery = _interopRequireDefault(require("../../hooks/useMediaQuery"));
|
|
11
12
|
var _popoverContainer = require("./popover-container.style");
|
|
12
13
|
var _icon = _interopRequireDefault(require("../icon"));
|
|
13
14
|
var _popover = _interopRequireDefault(require("../../__internal__/popover"));
|
|
@@ -15,6 +16,8 @@ var _guid = _interopRequireDefault(require("../../__internal__/utils/helpers/gui
|
|
|
15
16
|
var _utils = require("../../style/utils");
|
|
16
17
|
var _useClickAwayListener = _interopRequireDefault(require("../../hooks/__internal__/useClickAwayListener"));
|
|
17
18
|
var _events = _interopRequireDefault(require("../../__internal__/utils/helpers/events"));
|
|
19
|
+
var _focusTrap = _interopRequireDefault(require("../../__internal__/focus-trap"));
|
|
20
|
+
var _modal = require("../modal");
|
|
18
21
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
19
22
|
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
20
23
|
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
@@ -78,6 +81,7 @@ const PopoverContainer = ({
|
|
|
78
81
|
openButtonAriaLabel,
|
|
79
82
|
closeButtonAriaLabel = "close",
|
|
80
83
|
containerAriaLabel,
|
|
84
|
+
disableAnimation = false,
|
|
81
85
|
...rest
|
|
82
86
|
}) => {
|
|
83
87
|
const isControlled = open !== undefined;
|
|
@@ -89,19 +93,21 @@ const PopoverContainer = ({
|
|
|
89
93
|
const popoverContentNodeRef = (0, _react.useRef)(null);
|
|
90
94
|
const popoverContainerId = title ? `PopoverContainer_${guid.current}` : undefined;
|
|
91
95
|
const isOpen = isControlled ? open : isOpenInternal;
|
|
92
|
-
(0,
|
|
93
|
-
if (isOpen && closeButtonRef.current) setTimeout(() => closeButtonRef.current?.focus(), 0);
|
|
94
|
-
}, [isOpen]);
|
|
96
|
+
const reduceMotion = !(0, _useMediaQuery.default)("screen and (prefers-reduced-motion: no-preference)");
|
|
95
97
|
const closePopover = (0, _react.useCallback)(ev => {
|
|
96
|
-
if (!isControlled) setIsOpenInternal(
|
|
98
|
+
if (!isControlled) setIsOpenInternal(false);
|
|
97
99
|
if (onClose) onClose(ev);
|
|
98
|
-
if (isOpen && openButtonRef.current)
|
|
100
|
+
if (isOpen && openButtonRef.current) {
|
|
101
|
+
openButtonRef.current.focus();
|
|
102
|
+
}
|
|
99
103
|
}, [isControlled, isOpen, onClose]);
|
|
100
104
|
const handleEscKey = (0, _react.useCallback)(ev => {
|
|
101
105
|
const eventIsFromSelectInput = _events.default.composedPath(ev).find(element => {
|
|
102
106
|
return element instanceof HTMLElement && element.getAttribute("data-element") === "input" && element.getAttribute("aria-expanded") === "true";
|
|
103
107
|
});
|
|
104
|
-
if (!eventIsFromSelectInput && _events.default.isEscKey(ev))
|
|
108
|
+
if (!eventIsFromSelectInput && _events.default.isEscKey(ev)) {
|
|
109
|
+
closePopover(ev);
|
|
110
|
+
}
|
|
105
111
|
}, [closePopover]);
|
|
106
112
|
(0, _react.useEffect)(() => {
|
|
107
113
|
document.addEventListener("keydown", handleEscKey);
|
|
@@ -121,7 +127,7 @@ const PopoverContainer = ({
|
|
|
121
127
|
closePopover(e);
|
|
122
128
|
};
|
|
123
129
|
const renderOpenComponentProps = {
|
|
124
|
-
tabIndex:
|
|
130
|
+
tabIndex: 0,
|
|
125
131
|
"aria-expanded": isOpen,
|
|
126
132
|
"aria-haspopup": "dialog",
|
|
127
133
|
isOpen,
|
|
@@ -143,12 +149,8 @@ const PopoverContainer = ({
|
|
|
143
149
|
if (onClose && isOpen) onClose(e);
|
|
144
150
|
};
|
|
145
151
|
const handleClick = (0, _useClickAwayListener.default)(handleClickAway, "mousedown");
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
onMouseDown: handleClick
|
|
149
|
-
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
150
|
-
ref: popoverReference
|
|
151
|
-
}, renderOpenComponent(renderOpenComponentProps)), /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.Transition, {
|
|
152
|
+
const [isAnimationComplete, setIsAnimationComplete] = (0, _react.useState)(false);
|
|
153
|
+
const popover = /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.Transition, {
|
|
152
154
|
in: isOpen,
|
|
153
155
|
timeout: {
|
|
154
156
|
exit: 300
|
|
@@ -156,10 +158,14 @@ const PopoverContainer = ({
|
|
|
156
158
|
appear: true,
|
|
157
159
|
mountOnEnter: true,
|
|
158
160
|
unmountOnExit: true,
|
|
159
|
-
nodeRef: popoverContentNodeRef
|
|
161
|
+
nodeRef: popoverContentNodeRef,
|
|
162
|
+
onEntered: shouldCoverButton ? /* istanbul ignore next */() => setIsAnimationComplete(true) : undefined,
|
|
163
|
+
onExiting: shouldCoverButton ? /* istanbul ignore next */() => setIsAnimationComplete(false) : undefined
|
|
160
164
|
}, state => isOpen && /*#__PURE__*/_react.default.createElement(_popover.default, _extends({
|
|
165
|
+
disablePortal: true,
|
|
161
166
|
reference: popoverReference,
|
|
162
|
-
placement: position === "right" ? "bottom-start" : "bottom-end"
|
|
167
|
+
placement: position === "right" ? "bottom-start" : "bottom-end",
|
|
168
|
+
popoverStrategy: disableAnimation || reduceMotion ? "fixed" : "absolute"
|
|
163
169
|
}, shouldCoverButton && {
|
|
164
170
|
middleware: popoverMiddleware
|
|
165
171
|
}), /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerContentStyle, _extends({
|
|
@@ -170,11 +176,26 @@ const PopoverContainer = ({
|
|
|
170
176
|
"aria-label": containerAriaLabel,
|
|
171
177
|
"aria-describedby": ariaDescribedBy,
|
|
172
178
|
p: "16px 24px",
|
|
173
|
-
ref: popoverContentNodeRef
|
|
179
|
+
ref: popoverContentNodeRef,
|
|
180
|
+
tabIndex: shouldCoverButton ? -1 : undefined,
|
|
181
|
+
disableAnimation: disableAnimation || reduceMotion
|
|
174
182
|
}, (0, _utils.filterStyledSystemPaddingProps)(rest)), /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerHeaderStyle, null, /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerTitleStyle, {
|
|
175
183
|
id: popoverContainerId,
|
|
176
184
|
"data-element": "popover-container-title"
|
|
177
|
-
}, title), renderCloseComponent(renderCloseComponentProps)), children)))
|
|
185
|
+
}, title), renderCloseComponent(renderCloseComponentProps)), children)));
|
|
186
|
+
return /*#__PURE__*/_react.default.createElement(_popoverContainer.PopoverContainerWrapperStyle, {
|
|
187
|
+
"data-component": "popover-container",
|
|
188
|
+
onMouseDown: handleClick
|
|
189
|
+
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
190
|
+
ref: popoverReference
|
|
191
|
+
}, renderOpenComponent(renderOpenComponentProps)), shouldCoverButton ? /*#__PURE__*/_react.default.createElement(_modal.ModalContext.Provider, {
|
|
192
|
+
value: {
|
|
193
|
+
isAnimationComplete
|
|
194
|
+
}
|
|
195
|
+
}, /*#__PURE__*/_react.default.createElement(_focusTrap.default, {
|
|
196
|
+
wrapperRef: popoverContentNodeRef,
|
|
197
|
+
isOpen: isOpen
|
|
198
|
+
}, popover)) : popover);
|
|
178
199
|
};
|
|
179
200
|
exports.PopoverContainer = PopoverContainer;
|
|
180
201
|
var _default = exports.default = PopoverContainer;
|
|
@@ -4,6 +4,7 @@ declare const PopoverContainerWrapperStyle: import("styled-components").StyledCo
|
|
|
4
4
|
declare const PopoverContainerHeaderStyle: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
5
5
|
declare type PopoverContainerContentStyleProps = {
|
|
6
6
|
animationState?: TransitionStatus;
|
|
7
|
+
disableAnimation?: boolean;
|
|
7
8
|
};
|
|
8
9
|
declare const PopoverContainerContentStyle: import("styled-components").StyledComponent<"div", any, PopoverContainerContentStyleProps, never>;
|
|
9
10
|
declare type AdditionalIconButtonProps = {
|
|
@@ -10,6 +10,33 @@ var _themes = require("../../style/themes");
|
|
|
10
10
|
var _iconButton = _interopRequireDefault(require("../icon-button"));
|
|
11
11
|
var _icon = _interopRequireDefault(require("../icon/icon.style"));
|
|
12
12
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
function animationToRender({
|
|
14
|
+
animationState,
|
|
15
|
+
disableAnimation
|
|
16
|
+
}) {
|
|
17
|
+
if (disableAnimation) return "opacity: 1;";
|
|
18
|
+
switch (animationState) {
|
|
19
|
+
case "entering":
|
|
20
|
+
return `
|
|
21
|
+
opacity: 0;
|
|
22
|
+
transform: translateY(-8px);
|
|
23
|
+
`;
|
|
24
|
+
case "entered":
|
|
25
|
+
return `
|
|
26
|
+
opacity: 1;
|
|
27
|
+
transform: translateY(0);
|
|
28
|
+
transition: all 0.3s cubic-bezier(0.25, 0.25, 0, 1.5);
|
|
29
|
+
`;
|
|
30
|
+
case "exiting":
|
|
31
|
+
return `
|
|
32
|
+
opacity: 0;
|
|
33
|
+
transform: translateY(-8px);
|
|
34
|
+
transition: all 0.3s cubic-bezier(0.25, 0.25, 0, 1.5);
|
|
35
|
+
`;
|
|
36
|
+
default:
|
|
37
|
+
return "opacity: 0;";
|
|
38
|
+
}
|
|
39
|
+
}
|
|
13
40
|
const PopoverContainerWrapperStyle = exports.PopoverContainerWrapperStyle = _styledComponents.default.div`
|
|
14
41
|
position: relative;
|
|
15
42
|
display: inline-block;
|
|
@@ -32,31 +59,11 @@ const PopoverContainerContentStyle = exports.PopoverContainerContentStyle = _sty
|
|
|
32
59
|
theme
|
|
33
60
|
}) => theme.zIndex.popover};
|
|
34
61
|
|
|
35
|
-
${
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
case "entering":
|
|
40
|
-
return `
|
|
41
|
-
opacity: 0;
|
|
42
|
-
transform: translateY(-8px);
|
|
43
|
-
`;
|
|
44
|
-
case "entered":
|
|
45
|
-
return `
|
|
46
|
-
opacity: 1;
|
|
47
|
-
transform: translateY(0);
|
|
48
|
-
transition: all 0.3s cubic-bezier(0.25, 0.25, 0, 1.5);
|
|
49
|
-
`;
|
|
50
|
-
case "exiting":
|
|
51
|
-
return `
|
|
52
|
-
opacity: 0;
|
|
53
|
-
transform: translateY(-8px);
|
|
54
|
-
transition: all 0.3s cubic-bezier(0.25, 0.25, 0, 1.5);
|
|
55
|
-
`;
|
|
56
|
-
default:
|
|
57
|
-
return "opacity: 0";
|
|
62
|
+
${animationToRender}
|
|
63
|
+
|
|
64
|
+
:focus {
|
|
65
|
+
outline: none;
|
|
58
66
|
}
|
|
59
|
-
}}
|
|
60
67
|
`;
|
|
61
68
|
const PopoverContainerOpenIcon = exports.PopoverContainerOpenIcon = (0, _styledComponents.default)(_iconButton.default)`
|
|
62
69
|
${_icon.default} {
|