framer-motion
Version:
An open source and production-ready motion library for React on the web
29 lines (25 loc) • 1.05 kB
text/typescript
import { createElement } from "react"
import { MotionProps } from "../../motion/types"
import { VisualElement } from "../types"
import { useHTMLProps } from "./utils/use-html-props"
import { filterProps } from "./utils/filter-props"
import { isSVGComponent } from "./utils/is-svg-component"
import { useSVGProps } from "./utils/use-svg-props"
export function useRender<Props>(
Component: string | React.ComponentType<Props>,
props: MotionProps,
visualElement: VisualElement
) {
// Only filter props from components we control, ie `motion.div`. If this
// is a custom component pass along everything provided to it.
const forwardedProps =
typeof Component === "string" ? filterProps(props) : props
// Generate props to visually render this component
const useProps = isSVGComponent(Component) ? useSVGProps : useHTMLProps
const visualProps = useProps(visualElement, props)
return createElement<any>(Component, {
...forwardedProps,
ref: visualElement.ref,
...visualProps,
})
}