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