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.

159 lines (152 loc) 6.62 kB
import _slicedToArray from "@babel/runtime/helpers/esm/slicedToArray"; import * as React from "react"; import styled from "styled-components"; import useTheme from "../../../hooks/useTheme"; import resolveContainerPosition from "../helpers/resolveContainerPosition"; import resolveTooltipArrowAlign from "../helpers/resolveTooltipArrowAlign"; import resolveTooltipArrowPosition from "../helpers/resolveTooltipArrowPosition"; import { StyledText } from "../../../Text"; import { Item } from "../../../List/ListItem"; import tooltipSize from "../helpers/tooltipSize"; import resolveContainerAlign from "../helpers/resolveContainerAlign"; import tooltipArrowStyle from "../helpers/tooltipArrowStyle"; import tooltipPadding from "../helpers/tooltipPadding"; import defaultTheme from "../../../defaultTheme"; import { StyledTextLink } from "../../../TextLink"; import calculateTooltipPosition from "../helpers/calculateTooltipPosition"; import calculateTooltipAlign from "../helpers/calculateTooltipAlign"; import sortPositionsAndAligns from "../helpers/sortPositionsAndAligns"; import useDimensions from "../hooks/useDimensions"; import transition from "../../../utils/transition"; import FOCUSABLE_ELEMENT_SELECTORS from "../../../hooks/useFocusTrap/consts"; var StyledTooltip = styled.div.withConfig({ displayName: "TooltipContent__StyledTooltip", componentId: "bwx6p5-0" })(["width:100%;"]); var StyledTooltipWrapper = styled.div.withConfig({ displayName: "TooltipContent__StyledTooltipWrapper", componentId: "bwx6p5-1" })(["display:block;position:absolute;width:auto;max-width:", ";box-sizing:border-box;border-radius:", ";background-color:", ";box-shadow:", ";padding:", ";visibility:", ";opacity:", ";transition:", ";z-index:10012;overflow-y:scroll;overflow:visible;img{max-width:100%;}top:auto;right:auto;bottom:auto;left:auto;", ";", ";&::after{width:0;height:0;border-style:solid;content:\" \";display:block;position:absolute;", ";", ";", ";}"], tooltipSize, function (_ref) { var theme = _ref.theme; return theme.orbit.borderRadiusNormal; }, function (_ref2) { var theme = _ref2.theme; return theme.orbit.paletteInkNormal; }, function (_ref3) { var theme = _ref3.theme; return theme.orbit.boxShadowRaised; }, tooltipPadding, function (_ref4) { var shown = _ref4.shown; return shown ? "visible" : "hidden"; }, function (_ref5) { var shown = _ref5.shown; return shown ? "1" : "0"; }, transition(["opacity", "visibility"], "fast", "ease-in-out"), resolveContainerPosition, resolveContainerAlign, tooltipArrowStyle, resolveTooltipArrowPosition, resolveTooltipArrowAlign); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198 StyledTooltipWrapper.defaultProps = { theme: defaultTheme }; var StyledTooltipContent = styled.div.withConfig({ displayName: "TooltipContent__StyledTooltipContent", componentId: "bwx6p5-2" })(["font-family:", ";font-size:", ";font-weight:", ";line-height:", ";color:", ";margin-bottom:0;& ", ",", "{font-size:", ";font-weight:", ";color:", ";}& ", "{color:", ";}"], function (_ref6) { var theme = _ref6.theme; return theme.orbit.fontFamily; }, function (_ref7) { var theme = _ref7.theme; return theme.orbit.fontSizeTextSmall; }, function (_ref8) { var theme = _ref8.theme; return theme.orbit.fontWeightMedium; }, function (_ref9) { var theme = _ref9.theme; return theme.orbit.lineHeightTextNormal; }, function (_ref10) { var theme = _ref10.theme; return theme.orbit.paletteWhite; }, StyledText, Item, function (_ref11) { var theme = _ref11.theme; return theme.orbit.fontSizeTextSmall; }, function (_ref12) { var theme = _ref12.theme; return theme.orbit.fontWeightMedium; }, function (_ref13) { var theme = _ref13.theme; return theme.orbit.paletteWhite; }, StyledTextLink, function (_ref14) { var theme = _ref14.theme; return theme.orbit.paletteWhite; }); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198 StyledTooltipContent.defaultProps = { theme: defaultTheme }; var TooltipContent = function TooltipContent(_ref15) { var dataTest = _ref15.dataTest, shown = _ref15.shown, size = _ref15.size, tooltipId = _ref15.tooltipId, children = _ref15.children, onClose = _ref15.onClose, onCloseMobile = _ref15.onCloseMobile, onEnter = _ref15.onEnter, preferredPosition = _ref15.preferredPosition, preferredAlign = _ref15.preferredAlign, containerRef = _ref15.containerRef, parent = _ref15.parent; var theme = useTheme(); var tooltip = React.useRef(null); var content = React.useRef(null); var _React$useMemo = React.useMemo(function () { return sortPositionsAndAligns(preferredPosition, preferredAlign, theme); }, [preferredAlign, preferredPosition, theme]), _React$useMemo2 = _slicedToArray(_React$useMemo, 2), positions = _React$useMemo2[0], aligns = _React$useMemo2[1]; var dimensions = useDimensions({ containerRef: containerRef, tooltip: tooltip, content: content }, children, parent); var position = React.useMemo(function () { return calculateTooltipPosition(positions, dimensions); }, [dimensions, positions]); var align = React.useMemo(function () { return calculateTooltipAlign(position, aligns, dimensions); }, [aligns, dimensions, position]); var handleInnerClick = React.useCallback(function (ev) { if (tooltip.current) { var focusableElements = tooltip.current.querySelectorAll(FOCUSABLE_ELEMENT_SELECTORS); if (Object.values(focusableElements).some(function (v) { return v === ev.target; })) { onClose(); onCloseMobile(); } } }, [onClose, onCloseMobile]); return /*#__PURE__*/React.createElement(StyledTooltip, { role: "tooltip", id: tooltipId, "data-test": dataTest }, /*#__PURE__*/React.createElement(StyledTooltipWrapper, { shown: shown && position && align, size: size, align: align, position: position, ref: tooltip, containerTop: dimensions.containerTop, containerLeft: dimensions.containerLeft, containerHeight: dimensions.containerHeight, containerWidth: dimensions.containerWidth, tooltipHeight: dimensions.tooltipHeight, tooltipWidth: dimensions.tooltipWidth, contentHeight: dimensions.contentHeight, role: "tooltip", "aria-hidden": !shown, onMouseEnter: onEnter, onMouseLeave: onClose, onClick: handleInnerClick }, /*#__PURE__*/React.createElement(StyledTooltipContent, { ref: content }, children))); }; export default TooltipContent;