content: import _extends from 'babel-runtime/helpers/extends';
  import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
  import _createClass from 'babel-runtime/helpers/createClass';
  import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';
  import _inherits from 'babel-runtime/helpers/inherits';
  import React from 'react';
  import ReactDOM from 'react-dom';
  import KeyCode from 'rc-util/es/KeyCode';
  import Animate from 'rc-animate';
  import LazyRenderBox from './LazyRenderBox';
  import getScrollBarSize from 'rc-util/lib/getScrollBarSize';
  import assign from 'object-assign';
  var uuid = 0;
  var openCount = 0;
  
  function noop() {}
  function getScroll(w, top) {
      var ret = w['page' + (top ? 'Y' : 'X') + 'Offset'];
      var method = 'scroll' + (top ? 'Top' : 'Left');
      if (typeof ret !== 'number') {
          var d = w.document;
          ret = d.documentElement[method];
          if (typeof ret !== 'number') {
              ret = d.body[method];
          }
      }
      return ret;
  }
  function setTransformOrigin(node, value) {
      var style = node.style;
      ['Webkit', 'Moz', 'Ms', 'ms'].forEach(function (prefix) {
          style[prefix + 'TransformOrigin'] = value;
      });
      style['transformOrigin'] = value;
  }
  function offset(el) {
      var rect = el.getBoundingClientRect();
      var pos = {
          left: rect.left,
          top: rect.top
      };
      var doc = el.ownerDocument;
      var w = doc.defaultView || doc.parentWindow;
      pos.left += getScroll(w);
      pos.top += getScroll(w, true);
      return pos;
  }
  
  var Dialog = function (_React$Component) {
      _inherits(Dialog, _React$Component);
  
      function Dialog() {
          _classCallCheck(this, Dialog);
  
          var _this = _possibleConstructorReturn(this, (Dialog.__proto__ || Object.getPrototypeOf(Dialog)).apply(this, arguments));
  
          _this.onAnimateLeave = function () {
                                      if (_this.refs.wrap) {
                  _this.refs.wrap.style.display = 'none';
              }
              _this.inTransition = false;
              _this.removeScrollingEffect();
              _this.props.afterClose();
          };
          _this.onMaskClick = function (e) {
                          if (Date.now() - _this.openTime < 300) {
                  return;
              }
              if (e.target === e.currentTarget) {
                  _this.close(e);
              }
          };
          _this.onKeyDown = function (e) {
              var props = _this.props;
              if (props.keyboard && e.keyCode === KeyCode.ESC) {
                  _this.close(e);
              }
                          if (props.visible) {
                  if (e.keyCode === KeyCode.TAB) {
                      var activeElement = document.activeElement;
                      var dialogRoot = _this.refs.wrap;
                      var sentinel = _this.refs.sentinel;
                      if (e.shiftKey) {
                          if (activeElement === dialogRoot) {
                              sentinel.focus();
                          }
                      } else if (activeElement === _this.refs.sentinel) {
                          dialogRoot.focus();
                      }
                  }
              }
          };
          _this.getDialogElement = function () {
              var props = _this.props;
              var closable = props.closable;
              var prefixCls = props.prefixCls;
              var dest = {};
              if (props.width !== undefined) {
                  dest.width = props.width;
              }
              if (props.height !== undefined) {
                  dest.height = props.height;
              }
              var footer = void 0;
              if (props.footer) {
                  footer = React.createElement("div", { className: prefixCls + '-footer', ref: "footer" }, props.footer);
              }
              var header = void 0;
              if (props.title) {
                  header = React.createElement("div", { className: prefixCls + '-header', ref: "header" }, React.createElement("div", { className: prefixCls + '-title', id: _this.titleId }, props.title));
              }
              var closer = void 0;
              if (closable) {
                  closer = React.createElement("button", { onClick: _this.close, "aria-label": "Close", className: prefixCls + '-close' }, React.createElement("span", { className: prefixCls + '-close-x' }));
              }
              var style = assign({}, props.style, dest);
              var transitionName = _this.getTransitionName();
              var dialogElement = React.createElement(LazyRenderBox, { key: "dialog-element", role: "document", ref: "dialog", style: style, className: prefixCls + ' ' + (props.className || ''), visible: props.visible }, React.createElement("div", { className: prefixCls + '-content' }, closer, header, React.createElement("div", _extends({ className: prefixCls + '-body', style: props.bodyStyle, ref: "body" }, props.bodyProps), props.children), footer), React.createElement("div", { tabIndex: 0, ref: "sentinel", style: { width: 0, height: 0, overflow: 'hidden' } }, "sentinel"));
              return React.createElement(Animate, { key: "dialog", showProp: "visible", onLeave: _this.onAnimateLeave, transitionName: transitionName, component: "", transitionAppear: true }, dialogElement);
          };
          _this.getZIndexStyle = function () {
              var style = {};
              var props = _this.props;
              if (props.zIndex !== undefined) {
                  style.zIndex = props.zIndex;
              }
              return style;
          };
          _this.getWrapStyle = function () {
              return assign({}, _this.getZIndexStyle(), _this.props.wrapStyle);
          };
          _this.getMaskStyle = function () {
              return assign({}, _this.getZIndexStyle(), _this.props.maskStyle);
          };
          _this.getMaskElement = function () {
              var props = _this.props;
              var maskElement = void 0;
              if (props.mask) {
                  var maskTransition = _this.getMaskTransitionName();
                  maskElement = React.createElement(LazyRenderBox, _extends({ style: _this.getMaskStyle(), key: "mask", className: props.prefixCls + '-mask', hiddenClassName: props.prefixCls + '-mask-hidden', visible: props.visible }, props.maskProps));
                  if (maskTransition) {
                      maskElement = React.createElement(Animate, { key: "mask", showProp: "visible", transitionAppear: true, component: "", transitionName: maskTransition }, maskElement);
                  }
              }
              return maskElement;
          };
          _this.getMaskTransitionName = function () {
              var props = _this.props;
              var transitionName = props.maskTransitionName;
              var animation = props.maskAnimation;
              if (!transitionName && animation) {
                  transitionName = props.prefixCls + '-' + animation;
              }
              return transitionName;
          };
          _this.getTransitionName = function () {
              var props = _this.props;
              var transitionName = props.transitionName;
              var animation = props.animation;
              if (!transitionName && animation) {
                  transitionName = props.prefixCls + '-' + animation;
              }
              return transitionName;
          };
          _this.getElement = function (part) {
              return _this.refs[part];
          };
          _this.setScrollbar = function () {
              if (_this.bodyIsOverflowing && _this.scrollbarWidth !== undefined) {
                  document.body.style.paddingRight = _this.scrollbarWidth + 'px';
              }
          };
          _this.addScrollingEffect = function () {
              openCount++;
              if (openCount !== 1) {
                  return;
              }
              _this.checkScrollbar();
              _this.setScrollbar();
              document.body.style.overflow = 'hidden';
                      };
          _this.removeScrollingEffect = function () {
              openCount--;
              if (openCount !== 0) {
                  return;
              }
              document.body.style.overflow = '';
              _this.resetScrollbar();
                      };
          _this.close = function (e) {
              _this.props.onClose(e);
          };
          _this.checkScrollbar = function () {
              var fullWindowWidth = window.innerWidth;
              if (!fullWindowWidth) {
                  var documentElementRect = document.documentElement.getBoundingClientRect();
                  fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left);
              }
              _this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth;
              if (_this.bodyIsOverflowing) {
                  _this.scrollbarWidth = getScrollBarSize();
              }
          };
          _this.resetScrollbar = function () {
              document.body.style.paddingRight = '';
          };
          _this.adjustDialog = function () {
              if (_this.refs.wrap && _this.scrollbarWidth !== undefined) {
                  var modalIsOverflowing = _this.refs.wrap.scrollHeight > document.documentElement.clientHeight;
                  _this.refs.wrap.style.paddingLeft = (!_this.bodyIsOverflowing && modalIsOverflowing ? _this.scrollbarWidth : '') + 'px';
                  _this.refs.wrap.style.paddingRight = (_this.bodyIsOverflowing && !modalIsOverflowing ? _this.scrollbarWidth : '') + 'px';
              }
          };
          _this.resetAdjustments = function () {
              if (_this.refs.wrap) {
                  _this.refs.wrap.style.paddingLeft = _this.refs.wrap.style.paddingLeft = '';
              }
          };
          return _this;
      }
  
      _createClass(Dialog, [{
          key: 'componentWillMount',
          value: function componentWillMount() {
              this.inTransition = false;
              this.titleId = 'rcDialogTitle' + uuid++;
          }
      }, {
          key: 'componentDidMount',
          value: function componentDidMount() {
              this.componentDidUpdate({});
          }
      }, {
          key: 'componentDidUpdate',
          value: function componentDidUpdate(prevProps) {
              var props = this.props;
              var mousePosition = this.props.mousePosition;
              if (props.visible) {
                                  if (!prevProps.visible) {
                      this.openTime = Date.now();
                      this.lastOutSideFocusNode = document.activeElement;
                      this.addScrollingEffect();
                      this.refs.wrap.focus();
                      var dialogNode = ReactDOM.findDOMNode(this.refs.dialog);
                      if (mousePosition) {
                          var elOffset = offset(dialogNode);
                          setTransformOrigin(dialogNode, mousePosition.x - elOffset.left + 'px ' + (mousePosition.y - elOffset.top) + 'px');
                      } else {
                          setTransformOrigin(dialogNode, '');
                      }
                  }
              } else if (prevProps.visible) {
                  this.inTransition = true;
                  if (props.mask && this.lastOutSideFocusNode) {
                      try {
                          this.lastOutSideFocusNode.focus();
                      } catch (e) {
                          this.lastOutSideFocusNode = null;
                      }
                      this.lastOutSideFocusNode = null;
                  }
              }
          }
      }, {
          key: 'componentWillUnmount',
          value: function componentWillUnmount() {
              if (this.props.visible || this.inTransition) {
                  this.removeScrollingEffect();
              }
          }
      }, {
          key: 'render',
          value: function render() {
              var props = this.props;
              var prefixCls = props.prefixCls,
                  maskClosable = props.maskClosable;
  
              var style = this.getWrapStyle();
                                      if (props.visible) {
                  style.display = null;
              }
              return React.createElement("div", null, this.getMaskElement(), React.createElement("div", _extends({ tabIndex: -1, onKeyDown: this.onKeyDown, className: prefixCls + '-wrap ' + (props.wrapClassName || ''), ref: "wrap", onClick: maskClosable ? this.onMaskClick : undefined, role: "dialog", "aria-labelledby": props.title ? this.titleId : null, style: style }, props.wrapProps), this.getDialogElement()));
          }
      }]);
  
      return Dialog;
  }(React.Component);
  
  export default Dialog;
  
  Dialog.defaultProps = {
      afterClose: noop,
      className: '',
      mask: true,
      visible: false,
      keyboard: true,
      closable: true,
      maskClosable: true,
      prefixCls: 'rc-dialog',
      onClose: noop
  };