UNPKG

5.61 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5Object.defineProperty(exports, "__esModule", {
6 value: true
7});
8exports.default = void 0;
9
10var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
12var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
13
14var _react = _interopRequireDefault(require("react"));
15
16var _propTypes = _interopRequireDefault(require("prop-types"));
17
18var _reactTransitionGroup = require("react-transition-group");
19
20var _useTheme = _interopRequireDefault(require("../styles/useTheme"));
21
22var _utils = require("../transitions/utils");
23
24var _useForkRef = _interopRequireDefault(require("../utils/useForkRef"));
25
26function getScale(value) {
27 return "scale(".concat(value, ", ").concat(Math.pow(value, 2), ")");
28}
29
30var styles = {
31 entering: {
32 opacity: 1,
33 transform: getScale(1)
34 },
35 entered: {
36 opacity: 1,
37 transform: 'none'
38 }
39};
40/**
41 * The Grow transition is used by the [Tooltip](/components/tooltips/) and
42 * [Popover](/components/popover/) components.
43 * It uses [react-transition-group](https://github.com/reactjs/react-transition-group) internally.
44 */
45
46var Grow = _react.default.forwardRef(function Grow(props, ref) {
47 var children = props.children,
48 inProp = props.in,
49 onEnter = props.onEnter,
50 onExit = props.onExit,
51 style = props.style,
52 _props$timeout = props.timeout,
53 timeout = _props$timeout === void 0 ? 'auto' : _props$timeout,
54 other = (0, _objectWithoutProperties2.default)(props, ["children", "in", "onEnter", "onExit", "style", "timeout"]);
55
56 var timer = _react.default.useRef();
57
58 var autoTimeout = _react.default.useRef();
59
60 var handleRef = (0, _useForkRef.default)(children.ref, ref);
61 var theme = (0, _useTheme.default)();
62
63 var handleEnter = function handleEnter(node, isAppearing) {
64 (0, _utils.reflow)(node); // So the animation always start from the start.
65
66 var _getTransitionProps = (0, _utils.getTransitionProps)({
67 style: style,
68 timeout: timeout
69 }, {
70 mode: 'enter'
71 }),
72 transitionDuration = _getTransitionProps.duration,
73 delay = _getTransitionProps.delay;
74
75 var duration;
76
77 if (timeout === 'auto') {
78 duration = theme.transitions.getAutoHeightDuration(node.clientHeight);
79 autoTimeout.current = duration;
80 } else {
81 duration = transitionDuration;
82 }
83
84 node.style.transition = [theme.transitions.create('opacity', {
85 duration: duration,
86 delay: delay
87 }), theme.transitions.create('transform', {
88 duration: duration * 0.666,
89 delay: delay
90 })].join(',');
91
92 if (onEnter) {
93 onEnter(node, isAppearing);
94 }
95 };
96
97 var handleExit = function handleExit(node) {
98 var _getTransitionProps2 = (0, _utils.getTransitionProps)({
99 style: style,
100 timeout: timeout
101 }, {
102 mode: 'exit'
103 }),
104 transitionDuration = _getTransitionProps2.duration,
105 delay = _getTransitionProps2.delay;
106
107 var duration;
108
109 if (timeout === 'auto') {
110 duration = theme.transitions.getAutoHeightDuration(node.clientHeight);
111 autoTimeout.current = duration;
112 } else {
113 duration = transitionDuration;
114 }
115
116 node.style.transition = [theme.transitions.create('opacity', {
117 duration: duration,
118 delay: delay
119 }), theme.transitions.create('transform', {
120 duration: duration * 0.666,
121 delay: delay || duration * 0.333
122 })].join(',');
123 node.style.opacity = '0';
124 node.style.transform = getScale(0.75);
125
126 if (onExit) {
127 onExit(node);
128 }
129 };
130
131 var addEndListener = function addEndListener(_, next) {
132 if (timeout === 'auto') {
133 timer.current = setTimeout(next, autoTimeout.current || 0);
134 }
135 };
136
137 _react.default.useEffect(function () {
138 return function () {
139 clearTimeout(timer.current);
140 };
141 }, []);
142
143 return _react.default.createElement(_reactTransitionGroup.Transition, (0, _extends2.default)({
144 appear: true,
145 in: inProp,
146 onEnter: handleEnter,
147 onExit: handleExit,
148 addEndListener: addEndListener,
149 timeout: timeout === 'auto' ? null : timeout
150 }, other), function (state, childProps) {
151 return _react.default.cloneElement(children, (0, _extends2.default)({
152 style: (0, _extends2.default)({
153 opacity: 0,
154 transform: getScale(0.75),
155 visibility: state === 'exited' && !inProp ? 'hidden' : undefined
156 }, styles[state], {}, style, {}, children.props.style),
157 ref: handleRef
158 }, childProps));
159 });
160});
161
162process.env.NODE_ENV !== "production" ? Grow.propTypes = {
163 /**
164 * A single child content element.
165 */
166 children: _propTypes.default.element,
167
168 /**
169 * If `true`, show the component; triggers the enter or exit animation.
170 */
171 in: _propTypes.default.bool,
172
173 /**
174 * @ignore
175 */
176 onEnter: _propTypes.default.func,
177
178 /**
179 * @ignore
180 */
181 onExit: _propTypes.default.func,
182
183 /**
184 * @ignore
185 */
186 style: _propTypes.default.object,
187
188 /**
189 * The duration for the transition, in milliseconds.
190 * You may specify a single timeout for all transitions, or individually with an object.
191 *
192 * Set to 'auto' to automatically calculate transition time based on height.
193 */
194 timeout: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.shape({
195 enter: _propTypes.default.number,
196 exit: _propTypes.default.number
197 }), _propTypes.default.oneOf(['auto'])])
198} : void 0;
199Grow.muiSupportAuto = true;
200var _default = Grow;
201exports.default = _default;
\No newline at end of file