'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _warning = require('warning'); var _warning2 = _interopRequireDefault(_warning); var _isWindow = require('dom-helpers/query/isWindow'); var _isWindow2 = _interopRequireDefault(_isWindow); var _ownerDocument = require('dom-helpers/ownerDocument'); var _ownerDocument2 = _interopRequireDefault(_ownerDocument); var _inDOM = require('dom-helpers/util/inDOM'); var _inDOM2 = _interopRequireDefault(_inDOM); var _scrollbarSize = require('dom-helpers/util/scrollbarSize'); var _scrollbarSize2 = _interopRequireDefault(_scrollbarSize); var _manageAriaHidden = require('../utils/manageAriaHidden'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } // Taken from https://github.com/react-bootstrap/react-overlays/blob/master/src/ModalManager.js function getPaddingRight(node) { return parseInt(node.style.paddingRight || 0, 10); } // Do we have a scroll bar? function bodyIsOverflowing(node) { var doc = (0, _ownerDocument2.default)(node); var win = (0, _isWindow2.default)(doc); // Takes in account potential non zero margin on the body. var style = window.getComputedStyle(doc.body); var marginLeft = parseInt(style.getPropertyValue('margin-left'), 10); var marginRight = parseInt(style.getPropertyValue('margin-right'), 10); return marginLeft + doc.body.clientWidth + marginRight < win.innerWidth; } // The container shouldn't be used on the server. var defaultContainer = _inDOM2.default ? window.document.body : {}; /** * State management helper for modals/layers. * Simplified, but inspired by react-overlay's ModalManager class * * @internal Used by the Modal to ensure proper focus management. */ function createModalManager() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, _ref$container = _ref.container, container = _ref$container === undefined ? defaultContainer : _ref$container, _ref$hideSiblingNodes = _ref.hideSiblingNodes, hideSiblingNodes = _ref$hideSiblingNodes === undefined ? true : _ref$hideSiblingNodes; process.env.NODE_ENV !== "production" ? (0, _warning2.default)(container !== null, '\nMaterial-UI: you are most likely evaluating the code before the\nbrowser has a chance to reach the .\nPlease move the import at the end of the .\n ') : void 0; var modals = []; var prevOverflow = void 0; var prevPaddings = []; function add(modal) { var modalIdx = modals.indexOf(modal); if (modalIdx !== -1) { return modalIdx; } modalIdx = modals.length; modals.push(modal); if (hideSiblingNodes) { (0, _manageAriaHidden.hideSiblings)(container, modal.mountNode); } if (modals.length === 1) { // Save our current overflow so we can revert // back to it when all modals are closed! prevOverflow = container.style.overflow; if (bodyIsOverflowing(container)) { prevPaddings = [getPaddingRight(container)]; var scrollbarSize = (0, _scrollbarSize2.default)(); container.style.paddingRight = prevPaddings[0] + scrollbarSize + 'px'; var fixedNodes = document.querySelectorAll('.mui-fixed'); for (var i = 0; i < fixedNodes.length; i += 1) { var paddingRight = getPaddingRight(fixedNodes[i]); prevPaddings.push(paddingRight); fixedNodes[i].style.paddingRight = paddingRight + scrollbarSize + 'px'; } } container.style.overflow = 'hidden'; } return modalIdx; } function remove(modal) { var modalIdx = modals.indexOf(modal); if (modalIdx === -1) { return modalIdx; } modals.splice(modalIdx, 1); if (modals.length === 0) { container.style.overflow = prevOverflow; container.style.paddingRight = prevPaddings[0]; var fixedNodes = document.querySelectorAll('.mui-fixed'); for (var i = 0; i < fixedNodes.length; i += 1) { fixedNodes[i].style.paddingRight = prevPaddings[i + 1] + 'px'; } prevOverflow = undefined; prevPaddings = []; if (hideSiblingNodes) { (0, _manageAriaHidden.showSiblings)(container, modal.mountNode); } } else if (hideSiblingNodes) { // otherwise make sure the next top modal is visible to a SR (0, _manageAriaHidden.ariaHidden)(false, modals[modals.length - 1].mountNode); } return modalIdx; } function isTopModal(modal) { return !!modals.length && modals[modals.length - 1] === modal; } var modalManager = { add: add, remove: remove, isTopModal: isTopModal }; return modalManager; } exports.default = createModalManager;