@atlaskit/motion
Version:
A set of utilities to apply motion in your application.
75 lines (74 loc) • 3.09 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _durations = require("../utils/durations");
var _isReducedMotion = require("../utils/is-reduced-motion");
var _useElementRef3 = require("../utils/use-element-ref");
var _useLayoutEffect = require("../utils/use-layout-effect");
var _useRequestAnimationFrame = require("../utils/use-request-animation-frame");
var _useSetTimeout = require("../utils/use-set-timeout");
var _exitingPersistence = require("./exiting-persistence");
/**
* __ShrinkOut__
*
* Will shrink an element down to nothing when exiting.
* Works best with flex children as collapsing margins can come with undesired behaviour.
*
* - [Examples](https://atlaskit.atlassian.com/packages/design-system/motion/docs/entering-motion)
*/
var ShrinkOut = function ShrinkOut(_ref) {
var children = _ref.children,
_ref$duration = _ref.duration,
duration = _ref$duration === void 0 ? 'small' : _ref$duration,
onFinish = _ref.onFinish;
var _useElementRef = (0, _useElementRef3.useElementRef)(),
_useElementRef2 = (0, _slicedToArray2.default)(_useElementRef, 2),
element = _useElementRef2[0],
setElementRef = _useElementRef2[1];
var exiting = (0, _exitingPersistence.useExitingPersistence)();
var requestAnimationFrame = (0, _useRequestAnimationFrame.useRequestAnimationFrame)();
var setTimeout = (0, _useSetTimeout.useSetTimeout)();
var direction = exiting.isExiting ? 'exiting' : 'entering';
(0, _useLayoutEffect.useLayoutEffect)(function () {
if (exiting.isExiting && element) {
if ((0, _isReducedMotion.isReducedMotion)()) {
exiting.onFinish && exiting.onFinish();
onFinish && onFinish('exiting');
return;
}
var newStyles = {
// We fix both width and height because when changing box sizing to border-box.
width: "".concat(element.offsetWidth, "px"),
height: "".concat(element.offsetHeight, "px"),
boxSizing: 'border-box',
willChange: 'width,margin'
};
Object.assign(element.style, newStyles);
requestAnimationFrame(function () {
requestAnimationFrame(function () {
var newStyles = {
width: '0px',
margin: '0px',
// We animate margin down to zero so it doesn't take any space.
transitionTimingFunction: 'cubic-bezier(0.8,0,0,0.8)',
transitionDuration: _durations.durations[duration] + 'ms',
transitionProperty: 'width,margin'
};
Object.assign(element.style, newStyles);
setTimeout(function () {
exiting.onFinish && exiting.onFinish();
onFinish && onFinish('exiting');
}, _durations.durations[duration]);
});
});
}
});
return children({
ref: setElementRef
}, direction);
};
var _default = exports.default = ShrinkOut;