@pantheon-systems/design-toolkit-react
Version:
Pantheon's React Design Toolkit
97 lines (94 loc) • 3.94 kB
JavaScript
import _defineProperty from '@babel/runtime/helpers/defineProperty';
import _slicedToArray from '@babel/runtime/helpers/slicedToArray';
import _objectWithoutProperties from '@babel/runtime/helpers/objectWithoutProperties';
import { DialogOverlay, DialogContent } from '@reach/dialog';
import '@reach/dialog/styles.css';
import PropTypes from 'prop-types';
import { useState, useMemo } from 'react';
import { animated, useSpring, config } from 'react-spring';
import '../Buttons/index.js';
import ModalContext from './ModalContext.js';
import { jsx, jsxs } from 'react/jsx-runtime';
import CloseButton from '../Buttons/CloseButton.js';
var _excluded = ["ariaLabel", "children", "size"];
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
var sizesWidth = {
large: '49rem',
medium: '36rem',
small: '25rem'
};
var onDismissDefault = function onDismissDefault() {};
var AnimatedOverlay = animated(DialogOverlay);
var AnimatedContent = animated(DialogContent);
var Modal = function Modal(_ref) {
var ariaLabel = _ref.ariaLabel,
children = _ref.children,
size = _ref.size,
rest = _objectWithoutProperties(_ref, _excluded);
var isOpen = rest.isOpen,
onDismiss = rest.onDismiss;
var _useState = useState(false),
_useState2 = _slicedToArray(_useState, 2),
isScrollableHeight = _useState2[0],
setIsScrollableHeight = _useState2[1];
var opacityProps = useSpring({
config: {
duration: 500
},
opacity: isOpen ? 1 : 0
});
var transformProps = useSpring({
config: config.molasses,
transform: isOpen ? 'translateY(calc(-50% - 0rem))' : 'translateY(calc(-50% - 1rem))'
});
return /*#__PURE__*/jsx(AnimatedOverlay, _objectSpread(_objectSpread({
style: opacityProps
}, rest), {}, {
children: /*#__PURE__*/jsx(ModalContext.Provider, {
value: useMemo(function () {
return {
isScrollableHeight: isScrollableHeight,
setIsScrollableHeight: setIsScrollableHeight
};
}, [isScrollableHeight, setIsScrollableHeight]),
children: /*#__PURE__*/jsxs(AnimatedContent, {
"aria-label": ariaLabel,
style: _objectSpread(_objectSpread({
width: sizesWidth[size]
}, opacityProps), transformProps),
children: [onDismiss !== onDismissDefault && /*#__PURE__*/jsx(CloseButton, {
callback: onDismiss,
className: "absolute top-2 right-2"
}), children]
})
})
}));
};
Modal.defaultProps = {
isOpen: false,
onDismiss: onDismissDefault,
size: 'medium'
};
Modal.propTypes = {
/**
* ARIA label that describes the purpose or content of the modal
*/
ariaLabel: PropTypes.string.isRequired,
children: PropTypes.node.isRequired,
/**
* Is the modal open or closed?
*/
isOpen: PropTypes.bool,
/**
* Function to execute when dismissing the modal. Omit to remove the close button and click outside to dismiss functionality.
*/
onDismiss: PropTypes.func,
/**
* Size of the modal container
*/
size: PropTypes.oneOf(['small', 'medium', 'large'])
};
var Modal$1 = Modal;
export { Modal$1 as default };
//# sourceMappingURL=Modal.js.map