framer-motion
Version:
An open source and production-ready motion library for React on the web
51 lines (46 loc) • 1.49 kB
text/typescript
import { useEffect } from "react"
import { isAnimationControls } from "../../animation/animation-controls"
import { createAnimationState } from "../../render/utils/animation-state"
import { makeRenderlessComponent } from "../utils/make-renderless-component"
import { FeatureProps, MotionFeature } from "./types"
const AnimationState = makeRenderlessComponent((props: FeatureProps) => {
const { visualElement, animate } = props
/**
* We dynamically generate the AnimationState manager as it contains a reference
* to the underlying animation library. We only want to load that if we load this,
* so people can optionally code split it out using the `m` component.
*/
visualElement.animationState ||= createAnimationState(visualElement)
/**
* Subscribe any provided AnimationControls to the component's VisualElement
*/
if (isAnimationControls(animate)) {
useEffect(() => animate.subscribe(visualElement), [animate])
}
})
/**
* @public
*/
export const Animation: MotionFeature = {
key: "animation",
shouldRender: () => true,
getComponent: ({
animate,
whileHover,
whileFocus,
whileTap,
whileDrag,
exit,
variants,
}) => {
return animate ||
whileHover ||
whileFocus ||
whileTap ||
whileDrag ||
exit ||
variants
? AnimationState
: undefined
},
}