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.

229 lines (189 loc) 9.06 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var React = _interopRequireWildcard(require("react")); var _styledComponents = _interopRequireWildcard(require("styled-components")); var _orbitDesignTokens = require("@kiwicom/orbit-design-tokens"); var _keyMaps = _interopRequireDefault(require("../common/keyMaps")); var _useFocusTrap = _interopRequireDefault(require("../hooks/useFocusTrap")); var _useLockScrolling = _interopRequireDefault(require("../hooks/useLockScrolling")); var _transition = _interopRequireDefault(require("../utils/transition")); var _mediaQuery = _interopRequireDefault(require("../utils/mediaQuery")); var _defaultTheme = _interopRequireDefault(require("../defaultTheme")); var _DrawerClose = _interopRequireDefault(require("./components/DrawerClose")); var _consts = _interopRequireDefault(require("./consts")); var _getPosition = _interopRequireDefault(require("./helpers/getPosition")); var _getTransitionAnimation = _interopRequireDefault(require("./helpers/getTransitionAnimation")); var _useTheme = _interopRequireDefault(require("../hooks/useTheme")); var _Stack = _interopRequireDefault(require("../Stack")); var _useStateWithTimeout = _interopRequireDefault(require("../hooks/useStateWithTimeout")); var _Heading = _interopRequireDefault(require("../Heading")); var _rtl = require("../utils/rtl"); const _excluded = ["theme", "width", "position", "shown", "suppressed"], _excluded2 = ["theme", "type", "hasTopPadding", "noPadding", "hasClose"]; const getPadding = ({ noPadding, theme, hasTopPadding }) => { const padding = space => !hasTopPadding ? (0, _rtl.rtlSpacing)(`0 ${space} ${space}`) : space; return !noPadding && (0, _styledComponents.css)(["padding:", ";", ";"], padding(theme.orbit.spaceMedium), _mediaQuery.default.largeMobile((0, _styledComponents.css)(["padding:", "};"], padding(theme.orbit.spaceXLarge)))); }; const StyledDrawer = _styledComponents.default.div.withConfig({ displayName: "Drawer__StyledDrawer", componentId: "sc-svgki0-0" })(["", ""], ({ theme, overlayShown, shown }) => (0, _styledComponents.css)(["display:flex;visibility:", ";position:fixed;top:0;left:0;right:0;bottom:0;width:100%;height:100%;background-color:", ";z-index:", ";transition:", ";"], overlayShown ? "visible" : "hidden", shown ? (0, _orbitDesignTokens.convertHexToRgba)(theme.orbit.paletteInkNormal, 50) : "transparent", theme.orbit.zIndexDrawer, (0, _transition.default)(["background-color"], "fast", "ease-in-out"))); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198 StyledDrawer.defaultProps = { theme: _defaultTheme.default }; const StyledDrawerSide = (0, _styledComponents.default)( /*#__PURE__*/React.forwardRef((_ref, ref) => { let { theme, width, position, shown, suppressed } = _ref, props = (0, _objectWithoutProperties2.default)(_ref, _excluded); return /*#__PURE__*/React.createElement("aside", (0, _extends2.default)({ ref: ref }, props)); })).withConfig({ displayName: "Drawer__StyledDrawerSide", componentId: "sc-svgki0-1" })(["", ""], ({ theme, suppressed, width }) => (0, _styledComponents.css)(["display:block;position:absolute;box-sizing:border-box;top:0;bottom:0;height:100%;font-family:", ";overflow-y:auto;box-shadow:", ";background:", ";transition:", ";width:100%;", ";", ";", ";"], theme.orbit.fontFamily, theme.orbit.boxShadowRaised, suppressed ? theme.orbit.paletteCloudLight : theme.orbit.paletteWhite, (0, _transition.default)(["transform"], "normal", "ease-in-out"), _mediaQuery.default.largeMobile((0, _styledComponents.css)(["max-width:", ";"], width)), _getPosition.default, _getTransitionAnimation.default)); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198 StyledDrawerSide.defaultProps = { theme: _defaultTheme.default }; const StyledDrawerContent = (0, _styledComponents.default)((_ref2) => { let { theme, type, hasTopPadding, noPadding, hasClose } = _ref2, props = (0, _objectWithoutProperties2.default)(_ref2, _excluded2); return /*#__PURE__*/React.createElement("div", props); }).withConfig({ displayName: "Drawer__StyledDrawerContent", componentId: "sc-svgki0-2" })(["", ""], ({ theme, noPadding, hasClose }) => (0, _styledComponents.css)(["", ";margin-bottom:", ";margin-top:", ";"], getPadding, noPadding && theme.orbit.spaceLarge, !hasClose && noPadding && theme.orbit.spaceLarge)); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198 StyledDrawerContent.defaultProps = { theme: _defaultTheme.default }; const StyledDrawerHeader = _styledComponents.default.div.withConfig({ displayName: "Drawer__StyledDrawerHeader", componentId: "sc-svgki0-3" })(["", ""], ({ theme, fixedHeader, suppressed, bordered, noPadding, onlyIcon }) => (0, _styledComponents.css)(["display:flex;", " justify-content:", ";align-items:center;background:", ";height:64px;box-sizing:border-box;border-bottom:", ";", ";"], fixedHeader && (0, _styledComponents.css)(["position:sticky;top:0;z-index:", ";"], theme.orbit.zIndexSticky), onlyIcon ? "flex-end" : "space-between", suppressed && !bordered ? theme.orbit.paletteCloudLight : theme.orbit.paletteWhite, bordered && `1px solid ${theme.orbit.paletteCloudNormal}`, !noPadding && (0, _styledComponents.css)(["padding:0 ", ";", ";"], theme.orbit.spaceMedium, _mediaQuery.default.largeMobile((0, _styledComponents.css)(["padding:", ";"], (0, _rtl.rtlSpacing)(`0 ${theme.orbit.spaceLarge} 0 ${theme.orbit.spaceXLarge}`)))))); // $FlowFixMe: https://github.com/flow-typed/flow-typed/issues/3653#issuecomment-568539198 StyledDrawerHeader.defaultProps = { theme: _defaultTheme.default }; const Drawer = ({ children, onClose, lockScrolling = true, fixedHeader, shown = true, width = "320px", position = _consts.default.RIGHT, dataTest, noPadding, suppressed, title, actions }) => { const theme = (0, _useTheme.default)(); const overlayRef = React.useRef(null); const closeButtonRef = React.useRef(null); const scrollableRef = React.useRef(null); const timeoutLength = React.useMemo(() => parseFloat(theme.orbit.durationNormal) * 1000, [theme.orbit.durationNormal]); const [overlayShown, setOverlayShown, setOverlayShownWithTimeout] = (0, _useStateWithTimeout.default)(shown, timeoutLength); const handleOnClose = React.useCallback(ev => { if (onClose && ev.target === overlayRef.current) { onClose(); } }, [onClose]); (0, _useFocusTrap.default)(scrollableRef); (0, _useLockScrolling.default)(scrollableRef, lockScrolling && overlayShown); React.useEffect(() => { var _closeButtonRef$curre; (_closeButtonRef$curre = closeButtonRef.current) === null || _closeButtonRef$curre === void 0 ? void 0 : _closeButtonRef$curre.focus(); if (overlayShown !== shown) { if (shown) { setOverlayShown(true); } else if (!shown) { setOverlayShownWithTimeout(false); } } const handleKeyDown = ev => { if (ev.keyCode === _keyMaps.default.ESC && onClose) { onClose(); } }; window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); }, [overlayShown, setOverlayShown, setOverlayShownWithTimeout, shown, onClose]); return /*#__PURE__*/React.createElement(StyledDrawer, { role: "button", overlayShown: overlayShown, shown: shown, onClick: handleOnClose, "data-test": dataTest, "aria-hidden": !shown, ref: overlayRef }, /*#__PURE__*/React.createElement(StyledDrawerSide, { ref: scrollableRef, shown: shown, width: width, position: position, role: "navigation", suppressed: suppressed }, (title || actions || onClose) && /*#__PURE__*/React.createElement(StyledDrawerHeader, { onlyIcon: !title && !actions, bordered: title || actions, suppressed: suppressed, fixedHeader: fixedHeader }, title && /*#__PURE__*/React.createElement(_Heading.default, { type: "title2" }, title), actions && /*#__PURE__*/React.createElement(_Stack.default, { spacing: "none", justify: "end", flex: true, shrink: true }, actions), onClose && /*#__PURE__*/React.createElement(_DrawerClose.default, { onClick: onClose, ref: closeButtonRef })), /*#__PURE__*/React.createElement(StyledDrawerContent, { noPadding: noPadding, hasClose: !!onClose, hasTopPadding: title || actions }, children))); }; var _default = Drawer; exports.default = _default;