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.

175 lines (174 loc) 7.12 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; exports.__esModule = true; exports.default = void 0; var React = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _reactPopper = require("react-popper"); var _useClickOutside = _interopRequireDefault(require("../../hooks/useClickOutside")); var _keyMaps = _interopRequireDefault(require("../../common/keyMaps")); var _handleKeyDown = _interopRequireDefault(require("../../utils/handleKeyDown")); var _defaultTheme = _interopRequireDefault(require("../../defaultTheme")); var _mediaQuery = _interopRequireDefault(require("../../utils/mediaQuery")); var _Text = require("../../Text"); var _ListItem = require("../../List/ListItem"); var _Close = _interopRequireDefault(require("../../icons/Close")); var _rtl = require("../../utils/rtl"); var _resolveColor = _interopRequireDefault(require("./helpers/resolveColor")); var _resolvePlacement = _interopRequireDefault(require("./helpers/resolvePlacement")); var _consts = require("./consts"); var _useTheme = _interopRequireDefault(require("../../hooks/useTheme")); var _useMediaQuery = _interopRequireDefault(require("../../hooks/useMediaQuery")); const StyledArrow = _styledComponents.default.div.withConfig({ displayName: "Tooltip__StyledArrow", componentId: "sc-17dgmzi-0" })(["position:absolute;", ";&:before{content:\"\";background:", ";width:8px;height:8px;transform:translate(-50%,-50%) rotate(45deg);position:absolute;}"], _resolvePlacement.default, _resolveColor.default); const StyledFormFeedbackTooltip = _styledComponents.default.div.withConfig({ displayName: "Tooltip__StyledFormFeedbackTooltip", componentId: "sc-17dgmzi-1" })(["", ""], ({ theme, isHelp, shown, top, left, position, bottom, right: popperRight, transform }) => (0, _styledComponents.css)(["display:flex;justify-content:space-between;box-sizing:border-box;border-radius:", ";padding:", " ", ";padding-", ":", ";z-index:10;max-height:none;overflow:visible;width:min(", ",100vw);background:", ";visibility:", ";opacity:", ";transition:opacity ", " ease-in-out,visibility ", " ease-in-out;position:", ";top:", ";left:", ";bottom:", ";right:", ";transform:", ";img{max-width:100%;}", ";", ""], theme.orbit.borderRadiusLarge, theme.orbit.spaceXSmall, theme.orbit.spaceSmall, _rtl.right, isHelp && theme.orbit.spaceSmall, `calc(100% - ${_consts.SIDE_NUDGE * 2}px)`, _resolveColor.default, shown ? "visible" : "hidden", shown ? "1" : "0", theme.orbit.durationFast, theme.orbit.durationFast, position, top, left, bottom, popperRight, transform, _mediaQuery.default.largeMobile((0, _styledComponents.css)(["width:auto;"])), _mediaQuery.default.tablet((0, _styledComponents.css)(["border-radius:", ";"], theme.orbit.borderRadiusNormal)))); StyledArrow.defaultProps = { theme: _defaultTheme.default }; StyledFormFeedbackTooltip.defaultProps = { theme: _defaultTheme.default }; const StyledTooltipContent = _styledComponents.default.div.withConfig({ displayName: "Tooltip__StyledTooltipContent", componentId: "sc-17dgmzi-2" })(["", ""], ({ theme }) => (0, _styledComponents.css)(["display:flex;align-items:center;height:100%;font-family:", ";font-size:", ";font-weight:", ";line-height:", ";color:", ";& ", ",", ",a{color:", ";font-size:", ";font-weight:", ";&:hover,&:focus{color:", ";}}"], theme.orbit.fontFamily, theme.orbit.fontSizeTextNormal, theme.orbit.fontWeightNormal, theme.orbit.lineHeightTextSmall, theme.orbit.paletteWhite, _Text.StyledText, _ListItem.Item, theme.orbit.paletteWhite, theme.orbit.fontSizeTextNormal, theme.orbit.fontWeightNormal, theme.orbit.paletteWhite)); StyledTooltipContent.defaultProps = { theme: _defaultTheme.default }; const StyledCloseButton = _styledComponents.default.a.withConfig({ displayName: "Tooltip__StyledCloseButton", componentId: "sc-17dgmzi-3" })(["", ""], ({ theme }) => (0, _styledComponents.css)(["color:", ";cursor:pointer;margin:", ";display:flex;"], theme.orbit.paletteWhite, (0, _rtl.rtlSpacing)(`0 0 0 ${theme.orbit.spaceSmall}`))); StyledCloseButton.defaultProps = { theme: _defaultTheme.default }; const ErrorFormTooltip = ({ onShown, dataTest, helpClosable, children, shown, referenceElement, inlineLabel, isHelp = false, id }) => { const contentRef = React.useRef(null); const tooltipRef = React.useRef(null); const [arrowRef, setArrowRef] = React.useState(null); const { rtl } = (0, _useTheme.default)(); const { isDesktop } = (0, _useMediaQuery.default)(); const { styles, attributes: attrs, update } = (0, _reactPopper.usePopper)(referenceElement?.current, tooltipRef.current, { placement: rtl ? "top-end" : "top-start", modifiers: [{ name: "offset", options: { offset: [inlineLabel || isDesktop ? 0 : 4, 3] } }, { name: "flip", enabled: false }, { name: "arrow", options: { element: arrowRef } }, { name: "eventListeners", options: { scroll: false } }] }); const { popper } = styles; (0, _useClickOutside.default)(tooltipRef, () => { onShown(false); }); React.useEffect(() => { if (update) update(); }, [update, shown]); React.useEffect(() => { const link = tooltipRef.current?.querySelector("a"); const handleTab = ev => { if (isHelp) return; if (ev.keyCode === _keyMaps.default.TAB && link) { onShown(true); if (document.activeElement === link) { onShown(false); } } else { onShown(false); } }; window.addEventListener("keydown", handleTab); return () => { window.removeEventListener("keydown", handleTab); }; }, [onShown, isHelp, helpClosable]); return /*#__PURE__*/React.createElement(StyledFormFeedbackTooltip, { id: id, ref: tooltipRef, shown: shown, isHelp: isHelp, "data-test": dataTest, "aria-live": "polite", inlineLabel: inlineLabel, placement: attrs.popper && attrs.popper["data-popper-placement"], position: popper.position, top: popper.top, left: popper.left, right: popper.right, bottom: popper.bottom, transform: popper.transform }, /*#__PURE__*/React.createElement(StyledArrow, { isHelp: isHelp, ref: setArrowRef, inlineLabel: inlineLabel, placement: attrs.popper && attrs.popper["data-popper-placement"] }), /*#__PURE__*/React.createElement(StyledTooltipContent, { ref: contentRef }, children), isHelp && helpClosable && /*#__PURE__*/React.createElement(StyledCloseButton, { tabIndex: 0 // @ts-expect-error TODO , onKeyDown: (0, _handleKeyDown.default)(onShown), onClick: ev => { ev.preventDefault(); if (shown) onShown(false); } }, /*#__PURE__*/React.createElement(_Close.default, { ariaLabel: "close" }))); }; var _default = ErrorFormTooltip; exports.default = _default;