Tilt
motion-primitives/tiltFreeComponent
A component that applies 3D tilt effects to elements based on cursor position.
Install it
npx shadcn@latest add https://raw.githubusercontent.com/ibelick/motion-primitives/HEAD/public/c/tilt.jsonSource
1'use client';23import React, { useRef } from 'react';4import {5 motion,6 useMotionTemplate,7 useMotionValue,8 useSpring,9 useTransform,10 MotionStyle,11 SpringOptions,12} from 'motion/react';1314export type TiltProps = {15 children: React.ReactNode;16 className?: string;17 style?: MotionStyle;18 rotationFactor?: number;19 isRevese?: boolean;20 springOptions?: SpringOptions;21};2223export function Tilt({24 children,25 className,26 style,27 rotationFactor = 15,28 isRevese = false,29 springOptions,30}: TiltProps) {31 const ref = useRef<HTMLDivElement>(null);3233 const x = useMotionValue(0);34 const y = useMotionValue(0);3536 const xSpring = useSpring(x, springOptions);37 const ySpring = useSpring(y, springOptions);3839 const rotateX = useTransform(40 ySpring,41 [-0.5, 0.5],42 isRevese43 ? [rotationFactor, -rotationFactor]44 : [-rotationFactor, rotationFactor]45 );46 const rotateY = useTransform(47 xSpring,48 [-0.5, 0.5],49 isRevese50 ? [-rotationFactor, rotationFactor]51 : [rotationFactor, -rotationFactor]52 );5354 const transform = useMotionTemplate`perspective(1000px) rotateX(${rotateX}deg) rotateY(${rotateY}deg)`;5556 const handleMouseMove = (e: React.MouseEvent<HTMLDivElement>) => {57 if (!ref.current) return;5859 const rect = ref.current.getBoundingClientRect();60 const width = rect.width;61 const height = rect.height;62 const mouseX = e.clientX - rect.left;63 const mouseY = e.clientY - rect.top;6465 const xPos = mouseX / width - 0.5;66 const yPos = mouseY / height - 0.5;6768 x.set(xPos);69 y.set(yPos);70 };7172 const handleMouseLeave = () => {73 x.set(0);74 y.set(0);75 };7677 return (78 <motion.div79 ref={ref}80 className={className}81 style={{82 transformStyle: 'preserve-3d',83 ...style,84 transform,85 }}86 onMouseMove={handleMouseMove}87 onMouseLeave={handleMouseLeave}88 >89 {children}90 </motion.div>91 );92}
What it pulls in
npm packages
Files it writes
More from motion-primitives
All 33 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Accordionaccordion | motion-primitives | Components | Free | 1 dep | |
| Animated Backgroundanimated-background | motion-primitives | Components | Free | 1 dep | |
| Animated Groupanimated-group | motion-primitives | Components | Free | 1 dep | |
| Animated Numberanimated-number | motion-primitives | Components | Free | 1 dep | |
| Border Trailborder-trail | motion-primitives | Components | Free | 1 dep | |
| Carouselcarousel | motion-primitives | Components | Free | 1 dep | |
| Cursorcursor | motion-primitives | Components | Free | 1 dep | |
| Dialogdialog | motion-primitives | Components | Free | 1 dep · 2 files |
