UNPKG

baseui

Version:

A React Component library implementing the Base design language

142 lines (139 loc) • 6.56 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _reactFocusLock = _interopRequireDefault(require("react-focus-lock")); var _layer = require("../layer"); var _index = require("../styles/index"); var _overrides = require("../helpers/overrides"); var _buttonDock = require("../button-dock"); var _button = require("../button"); var _icon = require("../icon"); var _styledComponents = require("./styled-components"); var _constants = require("./constants"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } /* Copyright (c) Uber Technologies, Inc. This source code is licensed under the MIT license found in the LICENSE file in the root directory of this source tree. */ function renderArtwork(artwork) { if ( /*#__PURE__*/(0, _react.isValidElement)(artwork)) { return artwork; } else if (typeof artwork === 'function') { const ArtworkComponent = artwork; return /*#__PURE__*/_react.default.createElement(ArtworkComponent, null); } return null; } const DefaultDismissButton = props => { const overrides = { ...props.overrides, BaseButton: { ...props.overrides?.BaseButton, style: { position: 'absolute', top: '16px', right: '8px', // this will be tokenized in the future backgroundColor: 'rgba(255, 255, 255, 0.6)', zIndex: 1, ...props.overrides?.BaseButton?.style } } }; return /*#__PURE__*/_react.default.createElement(_button.Button, _extends({ kind: _button.KIND.secondary, shape: _button.SHAPE.circle }, props, { overrides: overrides }), /*#__PURE__*/_react.default.createElement(_icon.Delete, { size: 36 })); }; const DefaultButtonDock = props => { const [, theme] = (0, _index.useStyletron)(); const overrides = { Root: { style: { paddingRight: theme.sizing.scale800, paddingLeft: theme.sizing.scale800, marginBottom: theme.sizing.scale800 } } }; return /*#__PURE__*/_react.default.createElement(_buttonDock.ButtonDock, _extends({ overrides: overrides }, props)); }; const Dialog = ({ artwork, buttonDock, children, onDismiss, showDismissButton = true, hasOverlay = true, heading, isOpen, overrides = {}, placement = _constants.PLACEMENT.center, numHeadingLines = 2, size = _constants.SIZE.xSmall, autoFocus = true }) => { const [Root, rootProps] = (0, _overrides.getOverrides)(overrides.Root, _styledComponents.StyledRoot); const [ScrollContainer, scrollContainerProps] = (0, _overrides.getOverrides)(overrides.ScrollContainer, _styledComponents.StyledScrollContainer); const [Heading, headingProps] = (0, _overrides.getOverrides)(overrides.Heading, _styledComponents.StyledHeading); const [Overlay, overlayProps] = (0, _overrides.getOverrides)(overrides.Overlay, _styledComponents.StyledOverlay); const [Body, bodyProps] = (0, _overrides.getOverrides)(overrides.Body, _styledComponents.StyledBody); const [ButtonDock, buttonDockProps] = (0, _overrides.getOverrides)(overrides.ButtonDock, DefaultButtonDock); const [DismissButton, dismissButtonProps] = (0, _overrides.getOverrides)(overrides.DismissButton, DefaultDismissButton); const overlayRef = (0, _react.useRef)(null); // prevents background scrolling when the dialog is open and has an overlay const originalOverflowRef = (0, _react.useRef)(typeof document !== 'undefined' ? document?.body?.style?.overflow : ''); (0, _react.useEffect)(() => { const originalOverflow = originalOverflowRef.current; if (isOpen && hasOverlay) { document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = originalOverflow; } return () => { document.body.style.overflow = originalOverflow; }; }, [isOpen, hasOverlay]); function handleOutsideClick(e) { if (e.target && e.target instanceof HTMLElement && e.target.contains(overlayRef.current) && onDismiss) { onDismiss(); } } function handleEscape() { onDismiss && onDismiss(); } return isOpen ? /*#__PURE__*/_react.default.createElement(_layer.Layer, { onDocumentClick: handleOutsideClick, onEscape: handleEscape }, hasOverlay && /*#__PURE__*/_react.default.createElement(Overlay, _extends({ ref: overlayRef }, overlayProps)), /*#__PURE__*/_react.default.createElement(_reactFocusLock.default, { returnFocus: true, autoFocus: autoFocus }, /*#__PURE__*/_react.default.createElement(Root, _extends({ $size: size, $placement: placement, role: "dialog", "aria-labelledby": "dialog-title" }, rootProps), onDismiss && showDismissButton && /*#__PURE__*/_react.default.createElement(DismissButton, _extends({ onClick: () => onDismiss() }, dismissButtonProps)), /*#__PURE__*/_react.default.createElement(ScrollContainer, _extends({}, scrollContainerProps, { tabIndex: 0 }), renderArtwork(artwork), /*#__PURE__*/_react.default.createElement(Heading, _extends({ $numHeadingLines: numHeadingLines, id: "dialog-title" }, headingProps), heading), /*#__PURE__*/_react.default.createElement(Body, bodyProps, children)), buttonDock && /*#__PURE__*/_react.default.createElement(ButtonDock, _extends({}, buttonDock, buttonDockProps))))) : null; }; var _default = exports.default = Dialog;