{"version":3,"sources":["webpack:///./node_modules/antd/es/button/index.js","webpack:///./node_modules/@ant-design/css-animation/es/Event.js","webpack:///./node_modules/antd/es/button/style/css.js","webpack:///./node_modules/antd/es/_util/wave.js","webpack:///./node_modules/antd/es/_util/unreachableException.js","webpack:///./node_modules/antd/es/button/button-group.js","webpack:///./node_modules/antd/es/_util/raf.js","webpack:///./node_modules/antd/es/button/LoadingIcon.js","webpack:///./node_modules/antd/es/button/button.js"],"names":["START_EVENT_NAME_MAP","transitionstart","transition","WebkitTransition","MozTransition","OTransition","msTransition","animationstart","animation","WebkitAnimation","MozAnimation","OAnimation","msAnimation","END_EVENT_NAME_MAP","transitionend","animationend","startEvents","endEvents","addEventListener","node","eventName","eventListener","removeEventListener","window","document","style","createElement","process","EVENT_NAME_MAP","events","baseEventName","hasOwnProperty","baseEvents","styleName","push","detectEvents","TransitionEvents","addStartEventListener","length","forEach","startEvent","setTimeout","removeStartEventListener","addEndEventListener","endEvent","removeEndEventListener","styleForPesudo","UnreachableException","value","this","Error","concat","JSON","stringify","__rest","s","e","t","p","Object","prototype","call","indexOf","getOwnPropertySymbols","i","propertyIsEnumerable","props","_ref","_classNames","getPrefixCls","direction","customizePrefixCls","prefixCls","size","className","others","sizeCls","undefined","console","warn","classes","id","ids","wrapperRaf","callback","delayFrames","arguments","myId","restFrames","internalCallback","isHidden","element","offsetParent","isNotGrey","color","match","cancel","pid","_React$Component","Wave","_super","_this","apply","animationStart","destroyed","onClick","waveColor","insertExtraNode","extraNode","context","attributeName","getAttributeName","setAttribute","test","csp","nonce","borderColor","innerHTML","body","contains","appendChild","onTransitionStart","onTransitionEnd","target","resetEffect","animationName","bindAnimationEvent","getAttribute","tagName","getComputedStyle","getPropertyValue","clickWaveTimeoutId","animationStartId","renderWave","children","key","nodeType","instance","clearTimeout","Element","removeChild","contextType","getCollapsedWidth","width","opacity","transform","getRealWidth","scrollWidth","LoadingIcon","visible","loading","existIcon","CSSMotion","motionName","removeOnLeave","onAppearStart","onAppearActive","onEnterStart","onEnterActive","onLeaveStart","onLeaveActive","_ref2","ref","rxTwoCNChar","isTwoCNChar","bind","isUnborderedButtonType","type","spaceChildren","needInserted","isPrevChildPure","childList","child","isCurrentChildPure","lastIndex","lastChild","map","SPACE","split","join","insertSpace","convertLegacyProps","danger","loadingOrDelay","shape","customizeSize","icon","ghost","block","rest","SizeContext","_React$useState","_React$useState2","innerLoading","setLoading","_React$useState3","_React$useState4","hasTwoCNChar","setHasTwoCNChar","_React$useContext","autoInsertSpaceInButton","buttonRef","delayTimeoutRef","isNeedInserted","count","delay","current","buttonText","textContent","fixTwoCNChar","handleClick","devWarning","autoInsertSpace","iconType","iconNode","kids","linkButtonRestProps","href","_a","htmlType","otherProps","buttonNode","Button","displayName","defaultProps","Group","__ANT_BUTTON"],"mappings":"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","file":"e4e130b3661e65331f30f24eedf6cfe1a041075a-1d69030254230b84dbad.js","sourcesContent":["import Button from './button';\nexport default Button;","var START_EVENT_NAME_MAP = {\n  transitionstart: {\n    transition: 'transitionstart',\n    WebkitTransition: 'webkitTransitionStart',\n    MozTransition: 'mozTransitionStart',\n    OTransition: 'oTransitionStart',\n    msTransition: 'MSTransitionStart'\n  },\n  animationstart: {\n    animation: 'animationstart',\n    WebkitAnimation: 'webkitAnimationStart',\n    MozAnimation: 'mozAnimationStart',\n    OAnimation: 'oAnimationStart',\n    msAnimation: 'MSAnimationStart'\n  }\n};\nvar END_EVENT_NAME_MAP = {\n  transitionend: {\n    transition: 'transitionend',\n    WebkitTransition: 'webkitTransitionEnd',\n    MozTransition: 'mozTransitionEnd',\n    OTransition: 'oTransitionEnd',\n    msTransition: 'MSTransitionEnd'\n  },\n  animationend: {\n    animation: 'animationend',\n    WebkitAnimation: 'webkitAnimationEnd',\n    MozAnimation: 'mozAnimationEnd',\n    OAnimation: 'oAnimationEnd',\n    msAnimation: 'MSAnimationEnd'\n  }\n};\nvar startEvents = [];\nvar endEvents = [];\n\nfunction detectEvents() {\n  var testEl = document.createElement('div');\n  var style = testEl.style;\n\n  if (!('AnimationEvent' in window)) {\n    delete START_EVENT_NAME_MAP.animationstart.animation;\n    delete END_EVENT_NAME_MAP.animationend.animation;\n  }\n\n  if (!('TransitionEvent' in window)) {\n    delete START_EVENT_NAME_MAP.transitionstart.transition;\n    delete END_EVENT_NAME_MAP.transitionend.transition;\n  }\n\n  function process(EVENT_NAME_MAP, events) {\n    for (var baseEventName in EVENT_NAME_MAP) {\n      if (EVENT_NAME_MAP.hasOwnProperty(baseEventName)) {\n        var baseEvents = EVENT_NAME_MAP[baseEventName];\n\n        for (var styleName in baseEvents) {\n          if (styleName in style) {\n            events.push(baseEvents[styleName]);\n            break;\n          }\n        }\n      }\n    }\n  }\n\n  process(START_EVENT_NAME_MAP, startEvents);\n  process(END_EVENT_NAME_MAP, endEvents);\n}\n\nif (typeof window !== 'undefined' && typeof document !== 'undefined') {\n  detectEvents();\n}\n\nfunction addEventListener(node, eventName, eventListener) {\n  node.addEventListener(eventName, eventListener, false);\n}\n\nfunction removeEventListener(node, eventName, eventListener) {\n  node.removeEventListener(eventName, eventListener, false);\n}\n\nvar TransitionEvents = {\n  // Start events\n  startEvents: startEvents,\n  addStartEventListener: function addStartEventListener(node, eventListener) {\n    if (startEvents.length === 0) {\n      window.setTimeout(eventListener, 0);\n      return;\n    }\n\n    startEvents.forEach(function (startEvent) {\n      addEventListener(node, startEvent, eventListener);\n    });\n  },\n  removeStartEventListener: function removeStartEventListener(node, eventListener) {\n    if (startEvents.length === 0) {\n      return;\n    }\n\n    startEvents.forEach(function (startEvent) {\n      removeEventListener(node, startEvent, eventListener);\n    });\n  },\n  // End events\n  endEvents: endEvents,\n  addEndEventListener: function addEndEventListener(node, eventListener) {\n    if (endEvents.length === 0) {\n      window.setTimeout(eventListener, 0);\n      return;\n    }\n\n    endEvents.forEach(function (endEvent) {\n      addEventListener(node, endEvent, eventListener);\n    });\n  },\n  removeEndEventListener: function removeEndEventListener(node, eventListener) {\n    if (endEvents.length === 0) {\n      return;\n    }\n\n    endEvents.forEach(function (endEvent) {\n      removeEventListener(node, endEvent, eventListener);\n    });\n  }\n};\nexport default TransitionEvents;","import '../../style/index.css';\nimport './index.css';","import _classCallCheck from \"@babel/runtime/helpers/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/createClass\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/assertThisInitialized\";\nimport _inherits from \"@babel/runtime/helpers/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/createSuper\";\nimport * as React from 'react';\nimport { findDOMNode } from 'react-dom';\nimport TransitionEvents from \"@ant-design/css-animation/es/Event\";\nimport raf from './raf';\nimport { ConfigConsumer, ConfigContext } from '../config-provider';\nvar styleForPesudo; // Where el is the DOM element you'd like to test for visibility\n\nfunction isHidden(element) {\n  if (process.env.NODE_ENV === 'test') {\n    return false;\n  }\n\n  return !element || element.offsetParent === null;\n}\n\nfunction isNotGrey(color) {\n  // eslint-disable-next-line no-useless-escape\n  var match = (color || '').match(/rgba?\\((\\d*), (\\d*), (\\d*)(, [\\d.]*)?\\)/);\n\n  if (match && match[1] && match[2] && match[3]) {\n    return !(match[1] === match[2] && match[2] === match[3]);\n  }\n\n  return true;\n}\n\nvar Wave = /*#__PURE__*/function (_React$Component) {\n  _inherits(Wave, _React$Component);\n\n  var _super = _createSuper(Wave);\n\n  function Wave() {\n    var _this;\n\n    _classCallCheck(this, Wave);\n\n    _this = _super.apply(this, arguments);\n    _this.animationStart = false;\n    _this.destroyed = false;\n\n    _this.onClick = function (node, waveColor) {\n      if (!node || isHidden(node) || node.className.indexOf('-leave') >= 0) {\n        return;\n      }\n\n      var insertExtraNode = _this.props.insertExtraNode;\n      _this.extraNode = document.createElement('div');\n\n      var _assertThisInitialize = _assertThisInitialized(_this),\n          extraNode = _assertThisInitialize.extraNode;\n\n      var getPrefixCls = _this.context.getPrefixCls;\n      extraNode.className = \"\".concat(getPrefixCls(''), \"-click-animating-node\");\n\n      var attributeName = _this.getAttributeName();\n\n      node.setAttribute(attributeName, 'true'); // Not white or transparnt or grey\n\n      styleForPesudo = styleForPesudo || document.createElement('style');\n\n      if (waveColor && waveColor !== '#ffffff' && waveColor !== 'rgb(255, 255, 255)' && isNotGrey(waveColor) && !/rgba\\((?:\\d*, ){3}0\\)/.test(waveColor) && // any transparent rgba color\n      waveColor !== 'transparent') {\n        // Add nonce if CSP exist\n        if (_this.csp && _this.csp.nonce) {\n          styleForPesudo.nonce = _this.csp.nonce;\n        }\n\n        extraNode.style.borderColor = waveColor;\n        styleForPesudo.innerHTML = \"\\n      [\".concat(getPrefixCls(''), \"-click-animating-without-extra-node='true']::after, .\").concat(getPrefixCls(''), \"-click-animating-node {\\n        --antd-wave-shadow-color: \").concat(waveColor, \";\\n      }\");\n\n        if (!document.body.contains(styleForPesudo)) {\n          document.body.appendChild(styleForPesudo);\n        }\n      }\n\n      if (insertExtraNode) {\n        node.appendChild(extraNode);\n      }\n\n      TransitionEvents.addStartEventListener(node, _this.onTransitionStart);\n      TransitionEvents.addEndEventListener(node, _this.onTransitionEnd);\n    };\n\n    _this.onTransitionStart = function (e) {\n      if (_this.destroyed) {\n        return;\n      }\n\n      var node = findDOMNode(_assertThisInitialized(_this));\n\n      if (!e || e.target !== node || _this.animationStart) {\n        return;\n      }\n\n      _this.resetEffect(node);\n    };\n\n    _this.onTransitionEnd = function (e) {\n      if (!e || e.animationName !== 'fadeEffect') {\n        return;\n      }\n\n      _this.resetEffect(e.target);\n    };\n\n    _this.bindAnimationEvent = function (node) {\n      if (!node || !node.getAttribute || node.getAttribute('disabled') || node.className.indexOf('disabled') >= 0) {\n        return;\n      }\n\n      var onClick = function onClick(e) {\n        // Fix radio button click twice\n        if (e.target.tagName === 'INPUT' || isHidden(e.target)) {\n          return;\n        }\n\n        _this.resetEffect(node); // Get wave color from target\n\n\n        var waveColor = getComputedStyle(node).getPropertyValue('border-top-color') || // Firefox Compatible\n        getComputedStyle(node).getPropertyValue('border-color') || getComputedStyle(node).getPropertyValue('background-color');\n        _this.clickWaveTimeoutId = window.setTimeout(function () {\n          return _this.onClick(node, waveColor);\n        }, 0);\n        raf.cancel(_this.animationStartId);\n        _this.animationStart = true; // Render to trigger transition event cost 3 frames. Let's delay 10 frames to reset this.\n\n        _this.animationStartId = raf(function () {\n          _this.animationStart = false;\n        }, 10);\n      };\n\n      node.addEventListener('click', onClick, true);\n      return {\n        cancel: function cancel() {\n          node.removeEventListener('click', onClick, true);\n        }\n      };\n    };\n\n    _this.renderWave = function (_ref) {\n      var csp = _ref.csp;\n      var children = _this.props.children;\n      _this.csp = csp;\n      return children;\n    };\n\n    return _this;\n  }\n\n  _createClass(Wave, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      var node = findDOMNode(this);\n\n      if (!node || node.nodeType !== 1) {\n        return;\n      }\n\n      this.instance = this.bindAnimationEvent(node);\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      if (this.instance) {\n        this.instance.cancel();\n      }\n\n      if (this.clickWaveTimeoutId) {\n        clearTimeout(this.clickWaveTimeoutId);\n      }\n\n      this.destroyed = true;\n    }\n  }, {\n    key: \"getAttributeName\",\n    value: function getAttributeName() {\n      var getPrefixCls = this.context.getPrefixCls;\n      var insertExtraNode = this.props.insertExtraNode;\n      return insertExtraNode ? \"\".concat(getPrefixCls(''), \"-click-animating\") : \"\".concat(getPrefixCls(''), \"-click-animating-without-extra-node\");\n    }\n  }, {\n    key: \"resetEffect\",\n    value: function resetEffect(node) {\n      if (!node || node === this.extraNode || !(node instanceof Element)) {\n        return;\n      }\n\n      var insertExtraNode = this.props.insertExtraNode;\n      var attributeName = this.getAttributeName();\n      node.setAttribute(attributeName, 'false'); // edge has bug on `removeAttribute` #14466\n\n      if (styleForPesudo) {\n        styleForPesudo.innerHTML = '';\n      }\n\n      if (insertExtraNode && this.extraNode && node.contains(this.extraNode)) {\n        node.removeChild(this.extraNode);\n      }\n\n      TransitionEvents.removeStartEventListener(node, this.onTransitionStart);\n      TransitionEvents.removeEndEventListener(node, this.onTransitionEnd);\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      return /*#__PURE__*/React.createElement(ConfigConsumer, null, this.renderWave);\n    }\n  }]);\n\n  return Wave;\n}(React.Component);\n\nexport { Wave as default };\nWave.contextType = ConfigContext;","import _classCallCheck from \"@babel/runtime/helpers/classCallCheck\";\n\nvar UnreachableException = function UnreachableException(value) {\n  _classCallCheck(this, UnreachableException);\n\n  return new Error(\"unreachable case: \".concat(JSON.stringify(value)));\n};\n\nexport { UnreachableException as default };","import _extends from \"@babel/runtime/helpers/extends\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\n\nvar __rest = this && this.__rest || function (s, e) {\n  var t = {};\n\n  for (var p in s) {\n    if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n  }\n\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n    if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n  }\n  return t;\n};\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport { ConfigConsumer } from '../config-provider';\nimport UnreachableException from '../_util/unreachableException';\n\nvar ButtonGroup = function ButtonGroup(props) {\n  return /*#__PURE__*/React.createElement(ConfigConsumer, null, function (_ref) {\n    var _classNames;\n\n    var getPrefixCls = _ref.getPrefixCls,\n        direction = _ref.direction;\n\n    var customizePrefixCls = props.prefixCls,\n        size = props.size,\n        className = props.className,\n        others = __rest(props, [\"prefixCls\", \"size\", \"className\"]);\n\n    var prefixCls = getPrefixCls('btn-group', customizePrefixCls); // large => lg\n    // small => sm\n\n    var sizeCls = '';\n\n    switch (size) {\n      case 'large':\n        sizeCls = 'lg';\n        break;\n\n      case 'small':\n        sizeCls = 'sm';\n        break;\n\n      case 'middle':\n      case undefined:\n        break;\n\n      default:\n        // eslint-disable-next-line no-console\n        console.warn(new UnreachableException(size));\n    }\n\n    var classes = classNames(prefixCls, (_classNames = {}, _defineProperty(_classNames, \"\".concat(prefixCls, \"-\").concat(sizeCls), sizeCls), _defineProperty(_classNames, \"\".concat(prefixCls, \"-rtl\"), direction === 'rtl'), _classNames), className);\n    return /*#__PURE__*/React.createElement(\"div\", _extends({}, others, {\n      className: classes\n    }));\n  });\n};\n\nexport default ButtonGroup;","import raf from 'raf';\nvar id = 0;\nvar ids = {}; // Support call raf with delay specified frame\n\nexport default function wrapperRaf(callback) {\n  var delayFrames = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n  var myId = id++;\n  var restFrames = delayFrames;\n\n  function internalCallback() {\n    restFrames -= 1;\n\n    if (restFrames <= 0) {\n      callback();\n      delete ids[myId];\n    } else {\n      ids[myId] = raf(internalCallback);\n    }\n  }\n\n  ids[myId] = raf(internalCallback);\n  return myId;\n}\n\nwrapperRaf.cancel = function cancel(pid) {\n  if (pid === undefined) return;\n  raf.cancel(ids[pid]);\n  delete ids[pid];\n};\n\nwrapperRaf.ids = ids; // export this for test usage","import * as React from 'react';\nimport classNames from 'classnames';\nimport CSSMotion from \"rc-animate/es/CSSMotion\";\nimport LoadingOutlined from '@ant-design/icons/LoadingOutlined';\n\nvar getCollapsedWidth = function getCollapsedWidth() {\n  return {\n    width: 0,\n    opacity: 0,\n    transform: 'scale(0)'\n  };\n};\n\nvar getRealWidth = function getRealWidth(node) {\n  return {\n    width: node.scrollWidth,\n    opacity: 1,\n    transform: 'scale(1)'\n  };\n};\n\nexport default function LoadingIcon(_ref) {\n  var prefixCls = _ref.prefixCls,\n      loading = _ref.loading,\n      existIcon = _ref.existIcon;\n  var visible = !!loading;\n\n  if (existIcon) {\n    return /*#__PURE__*/React.createElement(\"span\", {\n      className: \"\".concat(prefixCls, \"-loading-icon\")\n    }, /*#__PURE__*/React.createElement(LoadingOutlined, null));\n  }\n\n  return /*#__PURE__*/React.createElement(CSSMotion, {\n    visible: visible // We do not really use this motionName\n    ,\n    motionName: \"\".concat(prefixCls, \"-loading-icon-motion\"),\n    removeOnLeave: true,\n    onAppearStart: getCollapsedWidth,\n    onAppearActive: getRealWidth,\n    onEnterStart: getCollapsedWidth,\n    onEnterActive: getRealWidth,\n    onLeaveStart: getRealWidth,\n    onLeaveActive: getCollapsedWidth\n  }, function (_ref2, ref) {\n    var className = _ref2.className,\n        style = _ref2.style;\n    return /*#__PURE__*/React.createElement(\"span\", {\n      className: \"\".concat(prefixCls, \"-loading-icon\"),\n      style: style,\n      ref: ref\n    }, /*#__PURE__*/React.createElement(LoadingOutlined, {\n      className: classNames(className)\n    }));\n  });\n}","import _extends from \"@babel/runtime/helpers/extends\";\nimport _defineProperty from \"@babel/runtime/helpers/defineProperty\";\nimport _slicedToArray from \"@babel/runtime/helpers/slicedToArray\";\nimport _typeof from \"@babel/runtime/helpers/typeof\";\n\nvar __rest = this && this.__rest || function (s, e) {\n  var t = {};\n\n  for (var p in s) {\n    if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p];\n  }\n\n  if (s != null && typeof Object.getOwnPropertySymbols === \"function\") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n    if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]];\n  }\n  return t;\n};\n/* eslint-disable react/button-has-type */\n\n\nimport * as React from 'react';\nimport classNames from 'classnames';\nimport omit from 'omit.js';\nimport Group from './button-group';\nimport { ConfigContext } from '../config-provider';\nimport Wave from '../_util/wave';\nimport { tuple } from '../_util/type';\nimport devWarning from '../_util/devWarning';\nimport SizeContext from '../config-provider/SizeContext';\nimport LoadingIcon from './LoadingIcon';\nimport { cloneElement } from '../_util/reactNode';\nvar rxTwoCNChar = /^[\\u4e00-\\u9fa5]{2}$/;\nvar isTwoCNChar = rxTwoCNChar.test.bind(rxTwoCNChar);\n\nfunction isString(str) {\n  return typeof str === 'string';\n}\n\nfunction isUnborderedButtonType(type) {\n  return type === 'text' || type === 'link';\n} // Insert one space between two chinese characters automatically.\n\n\nfunction insertSpace(child, needInserted) {\n  // Check the child if is undefined or null.\n  if (child == null) {\n    return;\n  }\n\n  var SPACE = needInserted ? ' ' : ''; // strictNullChecks oops.\n\n  if (typeof child !== 'string' && typeof child !== 'number' && isString(child.type) && isTwoCNChar(child.props.children)) {\n    return cloneElement(child, {\n      children: child.props.children.split('').join(SPACE)\n    });\n  }\n\n  if (typeof child === 'string') {\n    if (isTwoCNChar(child)) {\n      child = child.split('').join(SPACE);\n    }\n\n    return /*#__PURE__*/React.createElement(\"span\", null, child);\n  }\n\n  return child;\n}\n\nfunction spaceChildren(children, needInserted) {\n  var isPrevChildPure = false;\n  var childList = [];\n  React.Children.forEach(children, function (child) {\n    var type = _typeof(child);\n\n    var isCurrentChildPure = type === 'string' || type === 'number';\n\n    if (isPrevChildPure && isCurrentChildPure) {\n      var lastIndex = childList.length - 1;\n      var lastChild = childList[lastIndex];\n      childList[lastIndex] = \"\".concat(lastChild).concat(child);\n    } else {\n      childList.push(child);\n    }\n\n    isPrevChildPure = isCurrentChildPure;\n  }); // Pass to React.Children.map to auto fill key\n\n  return React.Children.map(childList, function (child) {\n    return insertSpace(child, needInserted);\n  });\n}\n\nvar ButtonTypes = tuple('default', 'primary', 'ghost', 'dashed', 'link', 'text');\nvar ButtonShapes = tuple('circle', 'circle-outline', 'round');\nvar ButtonHTMLTypes = tuple('submit', 'button', 'reset');\nexport function convertLegacyProps(type) {\n  if (type === 'danger') {\n    return {\n      danger: true\n    };\n  }\n\n  return {\n    type: type\n  };\n}\n\nvar InternalButton = function InternalButton(props, ref) {\n  var _classNames;\n\n  var loading = props.loading,\n      customizePrefixCls = props.prefixCls,\n      type = props.type,\n      danger = props.danger,\n      shape = props.shape,\n      customizeSize = props.size,\n      className = props.className,\n      children = props.children,\n      icon = props.icon,\n      ghost = props.ghost,\n      block = props.block,\n      rest = __rest(props, [\"loading\", \"prefixCls\", \"type\", \"danger\", \"shape\", \"size\", \"className\", \"children\", \"icon\", \"ghost\", \"block\"]);\n\n  var size = React.useContext(SizeContext);\n\n  var _React$useState = React.useState(!!loading),\n      _React$useState2 = _slicedToArray(_React$useState, 2),\n      innerLoading = _React$useState2[0],\n      setLoading = _React$useState2[1];\n\n  var _React$useState3 = React.useState(false),\n      _React$useState4 = _slicedToArray(_React$useState3, 2),\n      hasTwoCNChar = _React$useState4[0],\n      setHasTwoCNChar = _React$useState4[1];\n\n  var _React$useContext = React.useContext(ConfigContext),\n      getPrefixCls = _React$useContext.getPrefixCls,\n      autoInsertSpaceInButton = _React$useContext.autoInsertSpaceInButton,\n      direction = _React$useContext.direction;\n\n  var buttonRef = ref || /*#__PURE__*/React.createRef();\n  var delayTimeoutRef = React.useRef();\n\n  var isNeedInserted = function isNeedInserted() {\n    return React.Children.count(children) === 1 && !icon && !isUnborderedButtonType(type);\n  };\n\n  var fixTwoCNChar = function fixTwoCNChar() {\n    // Fix for HOC usage like <FormatMessage />\n    if (!buttonRef || !buttonRef.current || autoInsertSpaceInButton === false) {\n      return;\n    }\n\n    var buttonText = buttonRef.current.textContent;\n\n    if (isNeedInserted() && isTwoCNChar(buttonText)) {\n      if (!hasTwoCNChar) {\n        setHasTwoCNChar(true);\n      }\n    } else if (hasTwoCNChar) {\n      setHasTwoCNChar(false);\n    }\n  }; // =============== Update Loading ===============\n\n\n  var loadingOrDelay;\n\n  if (_typeof(loading) === 'object' && loading.delay) {\n    loadingOrDelay = loading.delay || true;\n  } else {\n    loadingOrDelay = !!loading;\n  }\n\n  React.useEffect(function () {\n    clearTimeout(delayTimeoutRef.current);\n\n    if (typeof loadingOrDelay === 'number') {\n      delayTimeoutRef.current = window.setTimeout(function () {\n        setLoading(loadingOrDelay);\n      }, loadingOrDelay);\n    } else {\n      setLoading(loadingOrDelay);\n    }\n  }, [loadingOrDelay]);\n  React.useEffect(function () {\n    fixTwoCNChar();\n  }, [buttonRef]);\n\n  var handleClick = function handleClick(e) {\n    var onClick = props.onClick;\n\n    if (innerLoading) {\n      return;\n    }\n\n    if (onClick) {\n      onClick(e);\n    }\n  };\n\n  devWarning(!(typeof icon === 'string' && icon.length > 2), 'Button', \"`icon` is using ReactNode instead of string naming in v4. Please check `\".concat(icon, \"` at https://ant.design/components/icon\"));\n  devWarning(!(ghost && isUnborderedButtonType(type)), 'Button', \"`link` or `text` button can't be a `ghost` button.\");\n  var prefixCls = getPrefixCls('btn', customizePrefixCls);\n  var autoInsertSpace = autoInsertSpaceInButton !== false; // large => lg\n  // small => sm\n\n  var sizeCls = '';\n\n  switch (customizeSize || size) {\n    case 'large':\n      sizeCls = 'lg';\n      break;\n\n    case 'small':\n      sizeCls = 'sm';\n      break;\n\n    default:\n      break;\n  }\n\n  var iconType = innerLoading ? 'loading' : icon;\n  var classes = classNames(prefixCls, className, (_classNames = {}, _defineProperty(_classNames, \"\".concat(prefixCls, \"-\").concat(type), type), _defineProperty(_classNames, \"\".concat(prefixCls, \"-\").concat(shape), shape), _defineProperty(_classNames, \"\".concat(prefixCls, \"-\").concat(sizeCls), sizeCls), _defineProperty(_classNames, \"\".concat(prefixCls, \"-icon-only\"), !children && children !== 0 && iconType), _defineProperty(_classNames, \"\".concat(prefixCls, \"-background-ghost\"), ghost && !isUnborderedButtonType(type)), _defineProperty(_classNames, \"\".concat(prefixCls, \"-loading\"), innerLoading), _defineProperty(_classNames, \"\".concat(prefixCls, \"-two-chinese-chars\"), hasTwoCNChar && autoInsertSpace), _defineProperty(_classNames, \"\".concat(prefixCls, \"-block\"), block), _defineProperty(_classNames, \"\".concat(prefixCls, \"-dangerous\"), !!danger), _defineProperty(_classNames, \"\".concat(prefixCls, \"-rtl\"), direction === 'rtl'), _classNames));\n  var iconNode = icon && !innerLoading ? icon : /*#__PURE__*/React.createElement(LoadingIcon, {\n    existIcon: !!icon,\n    prefixCls: prefixCls,\n    loading: !!innerLoading\n  });\n  var kids = children || children === 0 ? spaceChildren(children, isNeedInserted() && autoInsertSpace) : null;\n  var linkButtonRestProps = omit(rest, ['htmlType', 'loading']);\n\n  if (linkButtonRestProps.href !== undefined) {\n    return /*#__PURE__*/React.createElement(\"a\", _extends({}, linkButtonRestProps, {\n      className: classes,\n      onClick: handleClick,\n      ref: buttonRef\n    }), iconNode, kids);\n  } // React does not recognize the `htmlType` prop on a DOM element. Here we pick it out of `rest`.\n\n\n  var _a = rest,\n      htmlType = _a.htmlType,\n      otherProps = __rest(_a, [\"htmlType\"]);\n\n  var buttonNode = /*#__PURE__*/React.createElement(\"button\", _extends({}, omit(otherProps, ['loading']), {\n    type: htmlType,\n    className: classes,\n    onClick: handleClick,\n    ref: buttonRef\n  }), iconNode, kids);\n\n  if (isUnborderedButtonType(type)) {\n    return buttonNode;\n  }\n\n  return /*#__PURE__*/React.createElement(Wave, null, buttonNode);\n};\n\nvar Button = /*#__PURE__*/React.forwardRef(InternalButton);\nButton.displayName = 'Button';\nButton.defaultProps = {\n  loading: false,\n  ghost: false,\n  block: false,\n  htmlType: 'button'\n};\nButton.Group = Group;\nButton.__ANT_BUTTON = true;\nexport default Button;"],"sourceRoot":""}