UNPKG

@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
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;