UNPKG

8.59 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
5var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
7Object.defineProperty(exports, "__esModule", {
8 value: true
9});
10exports.default = void 0;
11
12var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
14var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
16var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
17
18var React = _interopRequireWildcard(require("react"));
19
20var _propTypes = _interopRequireDefault(require("prop-types"));
21
22var _reactTransitionGroup = require("react-transition-group");
23
24var _useTheme = _interopRequireDefault(require("../styles/useTheme"));
25
26var _utils = require("../transitions/utils");
27
28var _useForkRef = _interopRequireDefault(require("../utils/useForkRef"));
29
30function getScale(value) {
31 return "scale(".concat(value, ", ").concat(Math.pow(value, 2), ")");
32}
33
34var styles = {
35 entering: {
36 opacity: 1,
37 transform: getScale(1)
38 },
39 entered: {
40 opacity: 1,
41 transform: 'none'
42 }
43};
44/**
45 * The Grow transition is used by the [Tooltip](/components/tooltips/) and
46 * [Popover](/components/popover/) components.
47 * It uses [react-transition-group](https://github.com/reactjs/react-transition-group) internally.
48 */
49
50var Grow = /*#__PURE__*/React.forwardRef(function Grow(props, ref) {
51 var children = props.children,
52 _props$disableStrictM = props.disableStrictModeCompat,
53 disableStrictModeCompat = _props$disableStrictM === void 0 ? false : _props$disableStrictM,
54 inProp = props.in,
55 onEnter = props.onEnter,
56 onEntered = props.onEntered,
57 onEntering = props.onEntering,
58 onExit = props.onExit,
59 onExited = props.onExited,
60 onExiting = props.onExiting,
61 style = props.style,
62 _props$timeout = props.timeout,
63 timeout = _props$timeout === void 0 ? 'auto' : _props$timeout,
64 _props$TransitionComp = props.TransitionComponent,
65 TransitionComponent = _props$TransitionComp === void 0 ? _reactTransitionGroup.Transition : _props$TransitionComp,
66 other = (0, _objectWithoutProperties2.default)(props, ["children", "disableStrictModeCompat", "in", "onEnter", "onEntered", "onEntering", "onExit", "onExited", "onExiting", "style", "timeout", "TransitionComponent"]);
67 var timer = React.useRef();
68 var autoTimeout = React.useRef();
69 var theme = (0, _useTheme.default)();
70 var enableStrictModeCompat = theme.unstable_strictMode && !disableStrictModeCompat;
71 var nodeRef = React.useRef(null);
72 var foreignRef = (0, _useForkRef.default)(children.ref, ref);
73 var handleRef = (0, _useForkRef.default)(enableStrictModeCompat ? nodeRef : undefined, foreignRef);
74
75 var normalizedTransitionCallback = function normalizedTransitionCallback(callback) {
76 return function (nodeOrAppearing, maybeAppearing) {
77 if (callback) {
78 var _ref = enableStrictModeCompat ? [nodeRef.current, nodeOrAppearing] : [nodeOrAppearing, maybeAppearing],
79 _ref2 = (0, _slicedToArray2.default)(_ref, 2),
80 node = _ref2[0],
81 isAppearing = _ref2[1]; // onEnterXxx and onExitXxx callbacks have a different arguments.length value.
82
83
84 if (isAppearing === undefined) {
85 callback(node);
86 } else {
87 callback(node, isAppearing);
88 }
89 }
90 };
91 };
92
93 var handleEntering = normalizedTransitionCallback(onEntering);
94 var handleEnter = normalizedTransitionCallback(function (node, isAppearing) {
95 (0, _utils.reflow)(node); // So the animation always start from the start.
96
97 var _getTransitionProps = (0, _utils.getTransitionProps)({
98 style: style,
99 timeout: timeout
100 }, {
101 mode: 'enter'
102 }),
103 transitionDuration = _getTransitionProps.duration,
104 delay = _getTransitionProps.delay;
105
106 var duration;
107
108 if (timeout === 'auto') {
109 duration = theme.transitions.getAutoHeightDuration(node.clientHeight);
110 autoTimeout.current = duration;
111 } else {
112 duration = transitionDuration;
113 }
114
115 node.style.transition = [theme.transitions.create('opacity', {
116 duration: duration,
117 delay: delay
118 }), theme.transitions.create('transform', {
119 duration: duration * 0.666,
120 delay: delay
121 })].join(',');
122
123 if (onEnter) {
124 onEnter(node, isAppearing);
125 }
126 });
127 var handleEntered = normalizedTransitionCallback(onEntered);
128 var handleExiting = normalizedTransitionCallback(onExiting);
129 var handleExit = normalizedTransitionCallback(function (node) {
130 var _getTransitionProps2 = (0, _utils.getTransitionProps)({
131 style: style,
132 timeout: timeout
133 }, {
134 mode: 'exit'
135 }),
136 transitionDuration = _getTransitionProps2.duration,
137 delay = _getTransitionProps2.delay;
138
139 var duration;
140
141 if (timeout === 'auto') {
142 duration = theme.transitions.getAutoHeightDuration(node.clientHeight);
143 autoTimeout.current = duration;
144 } else {
145 duration = transitionDuration;
146 }
147
148 node.style.transition = [theme.transitions.create('opacity', {
149 duration: duration,
150 delay: delay
151 }), theme.transitions.create('transform', {
152 duration: duration * 0.666,
153 delay: delay || duration * 0.333
154 })].join(',');
155 node.style.opacity = '0';
156 node.style.transform = getScale(0.75);
157
158 if (onExit) {
159 onExit(node);
160 }
161 });
162 var handleExited = normalizedTransitionCallback(onExited);
163
164 var addEndListener = function addEndListener(nodeOrNext, maybeNext) {
165 var next = enableStrictModeCompat ? nodeOrNext : maybeNext;
166
167 if (timeout === 'auto') {
168 timer.current = setTimeout(next, autoTimeout.current || 0);
169 }
170 };
171
172 React.useEffect(function () {
173 return function () {
174 clearTimeout(timer.current);
175 };
176 }, []);
177 return /*#__PURE__*/React.createElement(TransitionComponent, (0, _extends2.default)({
178 appear: true,
179 in: inProp,
180 nodeRef: enableStrictModeCompat ? nodeRef : undefined,
181 onEnter: handleEnter,
182 onEntered: handleEntered,
183 onEntering: handleEntering,
184 onExit: handleExit,
185 onExited: handleExited,
186 onExiting: handleExiting,
187 addEndListener: addEndListener,
188 timeout: timeout === 'auto' ? null : timeout
189 }, other), function (state, childProps) {
190 return /*#__PURE__*/React.cloneElement(children, (0, _extends2.default)({
191 style: (0, _extends2.default)({
192 opacity: 0,
193 transform: getScale(0.75),
194 visibility: state === 'exited' && !inProp ? 'hidden' : undefined
195 }, styles[state], style, children.props.style),
196 ref: handleRef
197 }, childProps));
198 });
199});
200process.env.NODE_ENV !== "production" ? Grow.propTypes = {
201 // ----------------------------- Warning --------------------------------
202 // | These PropTypes are generated from the TypeScript type definitions |
203 // | To update them edit the d.ts file and run "yarn proptypes" |
204 // ----------------------------------------------------------------------
205
206 /**
207 * A single child content element.
208 */
209 children: _propTypes.default.element,
210
211 /**
212 * Enable this prop if you encounter 'Function components cannot be given refs',
213 * use `unstable_createStrictModeTheme`,
214 * and can't forward the ref in the child component.
215 */
216 disableStrictModeCompat: _propTypes.default.bool,
217
218 /**
219 * If `true`, show the component; triggers the enter or exit animation.
220 */
221 in: _propTypes.default.bool,
222
223 /**
224 * @ignore
225 */
226 onEnter: _propTypes.default.func,
227
228 /**
229 * @ignore
230 */
231 onEntered: _propTypes.default.func,
232
233 /**
234 * @ignore
235 */
236 onEntering: _propTypes.default.func,
237
238 /**
239 * @ignore
240 */
241 onExit: _propTypes.default.func,
242
243 /**
244 * @ignore
245 */
246 onExited: _propTypes.default.func,
247
248 /**
249 * @ignore
250 */
251 onExiting: _propTypes.default.func,
252
253 /**
254 * @ignore
255 */
256 style: _propTypes.default.object,
257
258 /**
259 * The duration for the transition, in milliseconds.
260 * You may specify a single timeout for all transitions, or individually with an object.
261 *
262 * Set to 'auto' to automatically calculate transition time based on height.
263 */
264 timeout: _propTypes.default.oneOfType([_propTypes.default.oneOf(['auto']), _propTypes.default.number, _propTypes.default.shape({
265 appear: _propTypes.default.number,
266 enter: _propTypes.default.number,
267 exit: _propTypes.default.number
268 })])
269} : void 0;
270Grow.muiSupportAuto = true;
271var _default = Grow;
272exports.default = _default;
\No newline at end of file