@kiwicom/orbit-components
Version:
Orbit-components is a React component library which provides developers with the easiest possible way of building Kiwi.com’s products.
141 lines (135 loc) • 5.31 kB
JavaScript
import _objectSpread from "@babel/runtime/helpers/esm/objectSpread2";
import * as React from "react";
import styled, { css } from "styled-components";
import { usePopper } from "react-popper";
import { PLACEMENTS } from "../../../common/consts";
import tooltipSize from "../helpers/tooltipSize";
import { StyledText } from "../../../Text";
import { Item } from "../../../List/ListItem";
import resolveBackgroundColor from "../helpers/resolveBackgroundColor";
import { resolveArrowStyle, resolveArrowPlacement } from "../helpers/resolveArrow";
import tooltipPadding from "../helpers/tooltipPadding";
import defaultTheme from "../../../defaultTheme";
import { StyledTextLink } from "../../../TextLink";
import transition from "../../../utils/transition";
import FOCUSABLE_ELEMENT_SELECTORS from "../../../hooks/useFocusTrap/consts";
const StyledTooltip = styled.div.withConfig({
displayName: "TooltipContent__StyledTooltip",
componentId: "sc-1eptatj-0"
})(["width:100%;"]);
const StyledTooltipArrow = styled.div.withConfig({
displayName: "TooltipContent__StyledTooltipArrow",
componentId: "sc-1eptatj-1"
})(["", ""], ({
transform,
position
}) => css(["position:", ";transform:", ";", ";&:after{position:absolute;content:\"\";width:0;height:0;border-style:solid;", ";}"], position, transform, resolveArrowPlacement, resolveArrowStyle)); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198
StyledTooltipArrow.defaultProps = {
theme: defaultTheme
};
const StyledTooltipWrapper = styled.div.withConfig({
displayName: "TooltipContent__StyledTooltipWrapper",
componentId: "sc-1eptatj-2"
})(["", ""], ({
theme,
shown,
popper
}) => css(["display:block;", ";width:auto;max-width:", ";box-sizing:border-box;padding:", ";border-radius:", ";background:", ";box-shadow:", ";visibility:", ";opacity:", ";transition:", ";z-index:10012;overflow-y:scroll;overflow:visible;img{max-width:100%;}"], popper, tooltipSize, tooltipPadding, theme.orbit.borderRadiusNormal, resolveBackgroundColor, theme.orbit.boxShadowRaised, shown ? "visible" : "hidden", shown ? "1" : "0", transition(["opacity", "visibility"], "fast", "ease-in-out"))); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198
StyledTooltipWrapper.defaultProps = {
theme: defaultTheme
};
const StyledTooltipContent = styled.div.withConfig({
displayName: "TooltipContent__StyledTooltipContent",
componentId: "sc-1eptatj-3"
})(["", ""], ({
theme
}) => css(["font-family:", ";font-size:", ";font-weight:", ";line-height:", ";color:", ";margin-bottom:0;& ", ",", "{font-size:", ";font-weight:", ";color:", ";}& ", "{color:", ";}"], theme.orbit.fontFamily, theme.orbit.fontSizeTextSmall, theme.orbit.fontWeightMedium, theme.orbit.lineHeightTextNormal, theme.orbit.paletteWhite, StyledText, Item, theme.orbit.fontSizeTextSmall, theme.orbit.fontWeightMedium, theme.orbit.paletteWhite, StyledTextLink, theme.orbit.paletteWhite)); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198
StyledTooltipContent.defaultProps = {
theme: defaultTheme
};
const TooltipContent = ({
dataTest,
shown,
size,
tooltipId,
error,
help,
children,
onClose,
onCloseMobile,
onEnter,
placement = PLACEMENTS.AUTO,
noFlip,
offset = [0, 5],
referenceElement
}) => {
const [tooltip, setTooltipRef] = React.useState(null);
const [arrowRef, setArrowRef] = React.useState(null);
const [contentHeight, setContentHeight] = React.useState(0);
const content = React.useRef(null);
const {
styles,
attributes: attrs,
update
} = usePopper(referenceElement, tooltip, {
placement,
modifiers: [{
name: "arrow",
options: {
element: arrowRef
}
}, {
name: "offset",
options: {
offset
}
}, {
name: "flip",
enabled: !noFlip
}]
});
React.useEffect(() => {
if (update) update();
if (content.current) setContentHeight(content.current.clientHeight);
}, [update, setContentHeight]);
const {
popper,
arrow
} = styles;
const handleInnerClick = React.useCallback(ev => {
if (tooltip) {
const focusableElements = tooltip.querySelectorAll(FOCUSABLE_ELEMENT_SELECTORS);
if (Object.values(focusableElements).some(v => v === ev.target)) {
onClose();
onCloseMobile();
}
}
}, [onClose, onCloseMobile, tooltip]);
return /*#__PURE__*/React.createElement(StyledTooltip, {
role: "tooltip",
id: tooltipId,
"data-test": dataTest
}, /*#__PURE__*/React.createElement(StyledTooltipWrapper, {
shown: shown,
size: size,
ref: setTooltipRef,
error: error,
help: help,
role: "tooltip",
"aria-hidden": !shown,
onMouseEnter: onEnter,
onMouseLeave: onClose,
contentHeight: contentHeight,
onClick: handleInnerClick,
popper: _objectSpread({}, popper)
}, /*#__PURE__*/React.createElement(StyledTooltipContent, {
ref: content
}, children), /*#__PURE__*/React.createElement(StyledTooltipArrow, {
ref: setArrowRef,
position: arrow.position,
transform: arrow.transform,
contentHeight: contentHeight,
placement: attrs.popper && attrs.popper["data-popper-placement"]
})));
};
export default TooltipContent;