You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					412 lines
				
				13 KiB
			
		
		
			
		
	
	
					412 lines
				
				13 KiB
			| 
											3 years ago
										 | import _extends from "@babel/runtime/helpers/esm/extends"; | ||
|  | import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose"; | ||
|  | import _inheritsLoose from "@babel/runtime/helpers/esm/inheritsLoose"; | ||
|  | import PropTypes from 'prop-types'; | ||
|  | import addOneClass from 'dom-helpers/addClass'; | ||
|  | import removeOneClass from 'dom-helpers/removeClass'; | ||
|  | import React from 'react'; | ||
|  | import Transition from './Transition'; | ||
|  | import { classNamesShape } from './utils/PropTypes'; | ||
|  | import { forceReflow } from './utils/reflow'; | ||
|  | 
 | ||
|  | var _addClass = function addClass(node, classes) { | ||
|  |   return node && classes && classes.split(' ').forEach(function (c) { | ||
|  |     return addOneClass(node, c); | ||
|  |   }); | ||
|  | }; | ||
|  | 
 | ||
|  | var removeClass = function removeClass(node, classes) { | ||
|  |   return node && classes && classes.split(' ').forEach(function (c) { | ||
|  |     return removeOneClass(node, c); | ||
|  |   }); | ||
|  | }; | ||
|  | /** | ||
|  |  * A transition component inspired by the excellent | ||
|  |  * [ng-animate](https://docs.angularjs.org/api/ngAnimate) library, you should
 | ||
|  |  * use it if you're using CSS transitions or animations. It's built upon the | ||
|  |  * [`Transition`](https://reactcommunity.org/react-transition-group/transition)
 | ||
|  |  * component, so it inherits all of its props. | ||
|  |  * | ||
|  |  * `CSSTransition` applies a pair of class names during the `appear`, `enter`, | ||
|  |  * and `exit` states of the transition. The first class is applied and then a | ||
|  |  * second `*-active` class in order to activate the CSS transition. After the | ||
|  |  * transition, matching `*-done` class names are applied to persist the | ||
|  |  * transition state. | ||
|  |  * | ||
|  |  * ```jsx
 | ||
|  |  * function App() { | ||
|  |  *   const [inProp, setInProp] = useState(false); | ||
|  |  *   return ( | ||
|  |  *     <div> | ||
|  |  *       <CSSTransition in={inProp} timeout={200} classNames="my-node"> | ||
|  |  *         <div> | ||
|  |  *           {"I'll receive my-node-* classes"} | ||
|  |  *         </div> | ||
|  |  *       </CSSTransition> | ||
|  |  *       <button type="button" onClick={() => setInProp(true)}> | ||
|  |  *         Click to Enter | ||
|  |  *       </button> | ||
|  |  *     </div> | ||
|  |  *   ); | ||
|  |  * } | ||
|  |  * ```
 | ||
|  |  * | ||
|  |  * When the `in` prop is set to `true`, the child component will first receive | ||
|  |  * the class `example-enter`, then the `example-enter-active` will be added in | ||
|  |  * the next tick. `CSSTransition` [forces a | ||
|  |  * reflow](https://github.com/reactjs/react-transition-group/blob/5007303e729a74be66a21c3e2205e4916821524b/src/CSSTransition.js#L208-L215)
 | ||
|  |  * between before adding the `example-enter-active`. This is an important trick | ||
|  |  * because it allows us to transition between `example-enter` and | ||
|  |  * `example-enter-active` even though they were added immediately one after | ||
|  |  * another. Most notably, this is what makes it possible for us to animate | ||
|  |  * _appearance_. | ||
|  |  * | ||
|  |  * ```css
 | ||
|  |  * .my-node-enter { | ||
|  |  *   opacity: 0; | ||
|  |  * } | ||
|  |  * .my-node-enter-active { | ||
|  |  *   opacity: 1; | ||
|  |  *   transition: opacity 200ms; | ||
|  |  * } | ||
|  |  * .my-node-exit { | ||
|  |  *   opacity: 1; | ||
|  |  * } | ||
|  |  * .my-node-exit-active { | ||
|  |  *   opacity: 0; | ||
|  |  *   transition: opacity 200ms; | ||
|  |  * } | ||
|  |  * ```
 | ||
|  |  * | ||
|  |  * `*-active` classes represent which styles you want to animate **to**, so it's | ||
|  |  * important to add `transition` declaration only to them, otherwise transitions | ||
|  |  * might not behave as intended! This might not be obvious when the transitions | ||
|  |  * are symmetrical, i.e. when `*-enter-active` is the same as `*-exit`, like in | ||
|  |  * the example above (minus `transition`), but it becomes apparent in more | ||
|  |  * complex transitions. | ||
|  |  * | ||
|  |  * **Note**: If you're using the | ||
|  |  * [`appear`](http://reactcommunity.org/react-transition-group/transition#Transition-prop-appear)
 | ||
|  |  * prop, make sure to define styles for `.appear-*` classes as well. | ||
|  |  */ | ||
|  | 
 | ||
|  | 
 | ||
|  | var CSSTransition = /*#__PURE__*/function (_React$Component) { | ||
|  |   _inheritsLoose(CSSTransition, _React$Component); | ||
|  | 
 | ||
|  |   function CSSTransition() { | ||
|  |     var _this; | ||
|  | 
 | ||
|  |     for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { | ||
|  |       args[_key] = arguments[_key]; | ||
|  |     } | ||
|  | 
 | ||
|  |     _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this; | ||
|  |     _this.appliedClasses = { | ||
|  |       appear: {}, | ||
|  |       enter: {}, | ||
|  |       exit: {} | ||
|  |     }; | ||
|  | 
 | ||
|  |     _this.onEnter = function (maybeNode, maybeAppearing) { | ||
|  |       var _this$resolveArgument = _this.resolveArguments(maybeNode, maybeAppearing), | ||
|  |           node = _this$resolveArgument[0], | ||
|  |           appearing = _this$resolveArgument[1]; | ||
|  | 
 | ||
|  |       _this.removeClasses(node, 'exit'); | ||
|  | 
 | ||
|  |       _this.addClass(node, appearing ? 'appear' : 'enter', 'base'); | ||
|  | 
 | ||
|  |       if (_this.props.onEnter) { | ||
|  |         _this.props.onEnter(maybeNode, maybeAppearing); | ||
|  |       } | ||
|  |     }; | ||
|  | 
 | ||
|  |     _this.onEntering = function (maybeNode, maybeAppearing) { | ||
|  |       var _this$resolveArgument2 = _this.resolveArguments(maybeNode, maybeAppearing), | ||
|  |           node = _this$resolveArgument2[0], | ||
|  |           appearing = _this$resolveArgument2[1]; | ||
|  | 
 | ||
|  |       var type = appearing ? 'appear' : 'enter'; | ||
|  | 
 | ||
|  |       _this.addClass(node, type, 'active'); | ||
|  | 
 | ||
|  |       if (_this.props.onEntering) { | ||
|  |         _this.props.onEntering(maybeNode, maybeAppearing); | ||
|  |       } | ||
|  |     }; | ||
|  | 
 | ||
|  |     _this.onEntered = function (maybeNode, maybeAppearing) { | ||
|  |       var _this$resolveArgument3 = _this.resolveArguments(maybeNode, maybeAppearing), | ||
|  |           node = _this$resolveArgument3[0], | ||
|  |           appearing = _this$resolveArgument3[1]; | ||
|  | 
 | ||
|  |       var type = appearing ? 'appear' : 'enter'; | ||
|  | 
 | ||
|  |       _this.removeClasses(node, type); | ||
|  | 
 | ||
|  |       _this.addClass(node, type, 'done'); | ||
|  | 
 | ||
|  |       if (_this.props.onEntered) { | ||
|  |         _this.props.onEntered(maybeNode, maybeAppearing); | ||
|  |       } | ||
|  |     }; | ||
|  | 
 | ||
|  |     _this.onExit = function (maybeNode) { | ||
|  |       var _this$resolveArgument4 = _this.resolveArguments(maybeNode), | ||
|  |           node = _this$resolveArgument4[0]; | ||
|  | 
 | ||
|  |       _this.removeClasses(node, 'appear'); | ||
|  | 
 | ||
|  |       _this.removeClasses(node, 'enter'); | ||
|  | 
 | ||
|  |       _this.addClass(node, 'exit', 'base'); | ||
|  | 
 | ||
|  |       if (_this.props.onExit) { | ||
|  |         _this.props.onExit(maybeNode); | ||
|  |       } | ||
|  |     }; | ||
|  | 
 | ||
|  |     _this.onExiting = function (maybeNode) { | ||
|  |       var _this$resolveArgument5 = _this.resolveArguments(maybeNode), | ||
|  |           node = _this$resolveArgument5[0]; | ||
|  | 
 | ||
|  |       _this.addClass(node, 'exit', 'active'); | ||
|  | 
 | ||
|  |       if (_this.props.onExiting) { | ||
|  |         _this.props.onExiting(maybeNode); | ||
|  |       } | ||
|  |     }; | ||
|  | 
 | ||
|  |     _this.onExited = function (maybeNode) { | ||
|  |       var _this$resolveArgument6 = _this.resolveArguments(maybeNode), | ||
|  |           node = _this$resolveArgument6[0]; | ||
|  | 
 | ||
|  |       _this.removeClasses(node, 'exit'); | ||
|  | 
 | ||
|  |       _this.addClass(node, 'exit', 'done'); | ||
|  | 
 | ||
|  |       if (_this.props.onExited) { | ||
|  |         _this.props.onExited(maybeNode); | ||
|  |       } | ||
|  |     }; | ||
|  | 
 | ||
|  |     _this.resolveArguments = function (maybeNode, maybeAppearing) { | ||
|  |       return _this.props.nodeRef ? [_this.props.nodeRef.current, maybeNode] // here `maybeNode` is actually `appearing`
 | ||
|  |       : [maybeNode, maybeAppearing]; | ||
|  |     }; | ||
|  | 
 | ||
|  |     _this.getClassNames = function (type) { | ||
|  |       var classNames = _this.props.classNames; | ||
|  |       var isStringClassNames = typeof classNames === 'string'; | ||
|  |       var prefix = isStringClassNames && classNames ? classNames + "-" : ''; | ||
|  |       var baseClassName = isStringClassNames ? "" + prefix + type : classNames[type]; | ||
|  |       var activeClassName = isStringClassNames ? baseClassName + "-active" : classNames[type + "Active"]; | ||
|  |       var doneClassName = isStringClassNames ? baseClassName + "-done" : classNames[type + "Done"]; | ||
|  |       return { | ||
|  |         baseClassName: baseClassName, | ||
|  |         activeClassName: activeClassName, | ||
|  |         doneClassName: doneClassName | ||
|  |       }; | ||
|  |     }; | ||
|  | 
 | ||
|  |     return _this; | ||
|  |   } | ||
|  | 
 | ||
|  |   var _proto = CSSTransition.prototype; | ||
|  | 
 | ||
|  |   _proto.addClass = function addClass(node, type, phase) { | ||
|  |     var className = this.getClassNames(type)[phase + "ClassName"]; | ||
|  | 
 | ||
|  |     var _this$getClassNames = this.getClassNames('enter'), | ||
|  |         doneClassName = _this$getClassNames.doneClassName; | ||
|  | 
 | ||
|  |     if (type === 'appear' && phase === 'done' && doneClassName) { | ||
|  |       className += " " + doneClassName; | ||
|  |     } // This is to force a repaint,
 | ||
|  |     // which is necessary in order to transition styles when adding a class name.
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     if (phase === 'active') { | ||
|  |       if (node) forceReflow(node); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (className) { | ||
|  |       this.appliedClasses[type][phase] = className; | ||
|  | 
 | ||
|  |       _addClass(node, className); | ||
|  |     } | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.removeClasses = function removeClasses(node, type) { | ||
|  |     var _this$appliedClasses$ = this.appliedClasses[type], | ||
|  |         baseClassName = _this$appliedClasses$.base, | ||
|  |         activeClassName = _this$appliedClasses$.active, | ||
|  |         doneClassName = _this$appliedClasses$.done; | ||
|  |     this.appliedClasses[type] = {}; | ||
|  | 
 | ||
|  |     if (baseClassName) { | ||
|  |       removeClass(node, baseClassName); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (activeClassName) { | ||
|  |       removeClass(node, activeClassName); | ||
|  |     } | ||
|  | 
 | ||
|  |     if (doneClassName) { | ||
|  |       removeClass(node, doneClassName); | ||
|  |     } | ||
|  |   }; | ||
|  | 
 | ||
|  |   _proto.render = function render() { | ||
|  |     var _this$props = this.props, | ||
|  |         _ = _this$props.classNames, | ||
|  |         props = _objectWithoutPropertiesLoose(_this$props, ["classNames"]); | ||
|  | 
 | ||
|  |     return /*#__PURE__*/React.createElement(Transition, _extends({}, props, { | ||
|  |       onEnter: this.onEnter, | ||
|  |       onEntered: this.onEntered, | ||
|  |       onEntering: this.onEntering, | ||
|  |       onExit: this.onExit, | ||
|  |       onExiting: this.onExiting, | ||
|  |       onExited: this.onExited | ||
|  |     })); | ||
|  |   }; | ||
|  | 
 | ||
|  |   return CSSTransition; | ||
|  | }(React.Component); | ||
|  | 
 | ||
|  | CSSTransition.defaultProps = { | ||
|  |   classNames: '' | ||
|  | }; | ||
|  | CSSTransition.propTypes = process.env.NODE_ENV !== "production" ? _extends({}, Transition.propTypes, { | ||
|  |   /** | ||
|  |    * The animation classNames applied to the component as it appears, enters, | ||
|  |    * exits or has finished the transition. A single name can be provided, which | ||
|  |    * will be suffixed for each stage, e.g. `classNames="fade"` applies: | ||
|  |    * | ||
|  |    * - `fade-appear`, `fade-appear-active`, `fade-appear-done` | ||
|  |    * - `fade-enter`, `fade-enter-active`, `fade-enter-done` | ||
|  |    * - `fade-exit`, `fade-exit-active`, `fade-exit-done` | ||
|  |    * | ||
|  |    * A few details to note about how these classes are applied: | ||
|  |    * | ||
|  |    * 1. They are _joined_ with the ones that are already defined on the child | ||
|  |    *    component, so if you want to add some base styles, you can use | ||
|  |    *    `className` without worrying that it will be overridden. | ||
|  |    * | ||
|  |    * 2. If the transition component mounts with `in={false}`, no classes are | ||
|  |    *    applied yet. You might be expecting `*-exit-done`, but if you think | ||
|  |    *    about it, a component cannot finish exiting if it hasn't entered yet. | ||
|  |    * | ||
|  |    * 2. `fade-appear-done` and `fade-enter-done` will _both_ be applied. This | ||
|  |    *    allows you to define different behavior for when appearing is done and | ||
|  |    *    when regular entering is done, using selectors like | ||
|  |    *    `.fade-enter-done:not(.fade-appear-done)`. For example, you could apply | ||
|  |    *    an epic entrance animation when element first appears in the DOM using | ||
|  |    *    [Animate.css](https://daneden.github.io/animate.css/). Otherwise you can
 | ||
|  |    *    simply use `fade-enter-done` for defining both cases. | ||
|  |    * | ||
|  |    * Each individual classNames can also be specified independently like: | ||
|  |    * | ||
|  |    * ```js
 | ||
|  |    * classNames={{ | ||
|  |    *  appear: 'my-appear', | ||
|  |    *  appearActive: 'my-active-appear', | ||
|  |    *  appearDone: 'my-done-appear', | ||
|  |    *  enter: 'my-enter', | ||
|  |    *  enterActive: 'my-active-enter', | ||
|  |    *  enterDone: 'my-done-enter', | ||
|  |    *  exit: 'my-exit', | ||
|  |    *  exitActive: 'my-active-exit', | ||
|  |    *  exitDone: 'my-done-exit', | ||
|  |    * }} | ||
|  |    * ```
 | ||
|  |    * | ||
|  |    * If you want to set these classes using CSS Modules: | ||
|  |    * | ||
|  |    * ```js
 | ||
|  |    * import styles from './styles.css'; | ||
|  |    * ```
 | ||
|  |    * | ||
|  |    * you might want to use camelCase in your CSS file, that way could simply | ||
|  |    * spread them instead of listing them one by one: | ||
|  |    * | ||
|  |    * ```js
 | ||
|  |    * classNames={{ ...styles }} | ||
|  |    * ```
 | ||
|  |    * | ||
|  |    * @type {string | { | ||
|  |    *  appear?: string, | ||
|  |    *  appearActive?: string, | ||
|  |    *  appearDone?: string, | ||
|  |    *  enter?: string, | ||
|  |    *  enterActive?: string, | ||
|  |    *  enterDone?: string, | ||
|  |    *  exit?: string, | ||
|  |    *  exitActive?: string, | ||
|  |    *  exitDone?: string, | ||
|  |    * }} | ||
|  |    */ | ||
|  |   classNames: classNamesShape, | ||
|  | 
 | ||
|  |   /** | ||
|  |    * A `<Transition>` callback fired immediately after the 'enter' or 'appear' class is | ||
|  |    * applied. | ||
|  |    * | ||
|  |    * **Note**: when `nodeRef` prop is passed, `node` is not passed. | ||
|  |    * | ||
|  |    * @type Function(node: HtmlElement, isAppearing: bool) | ||
|  |    */ | ||
|  |   onEnter: PropTypes.func, | ||
|  | 
 | ||
|  |   /** | ||
|  |    * A `<Transition>` callback fired immediately after the 'enter-active' or | ||
|  |    * 'appear-active' class is applied. | ||
|  |    * | ||
|  |    * **Note**: when `nodeRef` prop is passed, `node` is not passed. | ||
|  |    * | ||
|  |    * @type Function(node: HtmlElement, isAppearing: bool) | ||
|  |    */ | ||
|  |   onEntering: PropTypes.func, | ||
|  | 
 | ||
|  |   /** | ||
|  |    * A `<Transition>` callback fired immediately after the 'enter' or | ||
|  |    * 'appear' classes are **removed** and the `done` class is added to the DOM node. | ||
|  |    * | ||
|  |    * **Note**: when `nodeRef` prop is passed, `node` is not passed. | ||
|  |    * | ||
|  |    * @type Function(node: HtmlElement, isAppearing: bool) | ||
|  |    */ | ||
|  |   onEntered: PropTypes.func, | ||
|  | 
 | ||
|  |   /** | ||
|  |    * A `<Transition>` callback fired immediately after the 'exit' class is | ||
|  |    * applied. | ||
|  |    * | ||
|  |    * **Note**: when `nodeRef` prop is passed, `node` is not passed | ||
|  |    * | ||
|  |    * @type Function(node: HtmlElement) | ||
|  |    */ | ||
|  |   onExit: PropTypes.func, | ||
|  | 
 | ||
|  |   /** | ||
|  |    * A `<Transition>` callback fired immediately after the 'exit-active' is applied. | ||
|  |    * | ||
|  |    * **Note**: when `nodeRef` prop is passed, `node` is not passed | ||
|  |    * | ||
|  |    * @type Function(node: HtmlElement) | ||
|  |    */ | ||
|  |   onExiting: PropTypes.func, | ||
|  | 
 | ||
|  |   /** | ||
|  |    * A `<Transition>` callback fired immediately after the 'exit' classes | ||
|  |    * are **removed** and the `exit-done` class is added to the DOM node. | ||
|  |    * | ||
|  |    * **Note**: when `nodeRef` prop is passed, `node` is not passed | ||
|  |    * | ||
|  |    * @type Function(node: HtmlElement) | ||
|  |    */ | ||
|  |   onExited: PropTypes.func | ||
|  | }) : {}; | ||
|  | export default CSSTransition; |