{ "name": "tilt", "type": "registry:ui", "registryDependencies": [], "dependencies": [ "motion" ], "devDependencies": [], "tailwind": {}, "cssVars": { "light": {}, "dark": {} }, "files": [ { "path": "tilt.tsx", "content": "'use client';\n\nimport React, { useRef } from 'react';\nimport {\n motion,\n useMotionTemplate,\n useMotionValue,\n useSpring,\n useTransform,\n MotionStyle,\n SpringOptions,\n} from 'motion/react';\n\nexport type TiltProps = {\n children: React.ReactNode;\n className?: string;\n style?: MotionStyle;\n rotationFactor?: number;\n isRevese?: boolean;\n springOptions?: SpringOptions;\n};\n\nexport function Tilt({\n children,\n className,\n style,\n rotationFactor = 15,\n isRevese = false,\n springOptions,\n}: TiltProps) {\n const ref = useRef(null);\n\n const x = useMotionValue(0);\n const y = useMotionValue(0);\n\n const xSpring = useSpring(x, springOptions);\n const ySpring = useSpring(y, springOptions);\n\n const rotateX = useTransform(\n ySpring,\n [-0.5, 0.5],\n isRevese\n ? [rotationFactor, -rotationFactor]\n : [-rotationFactor, rotationFactor]\n );\n const rotateY = useTransform(\n xSpring,\n [-0.5, 0.5],\n isRevese\n ? [-rotationFactor, rotationFactor]\n : [rotationFactor, -rotationFactor]\n );\n\n const transform = useMotionTemplate`perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;\n\n const handleMouseMove = (e: React.MouseEvent) => {\n if (!ref.current) return;\n\n const rect = ref.current.getBoundingClientRect();\n const width = rect.width;\n const height = rect.height;\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n const xPos = mouseX / width - 0.5;\n const yPos = mouseY / height - 0.5;\n\n x.set(xPos);\n y.set(yPos);\n };\n\n const handleMouseLeave = () => {\n x.set(0);\n y.set(0);\n };\n\n return (\n \n {children}\n \n );\n}\n", "type": "registry:ui" } ] }