Tilt Effect
Tilt Effect é um componente para React e Tailwind CSS, da biblioteca Bund UI, com licença MIT. Copia e cola no teu projeto.
Bund UI
MIT
other
O que é
Tilt Effect é um componente para React e Tailwind CSS, da biblioteca Bund UI, com licença MIT. Copia e cola no teu projeto.
Como usar
Abre o componente no catálogo, carrega em copiar, e cola no teu projeto. O prompt copiado leva o código e as regras para o teu agente o reproduzir sem alterar nada.
Cinco cópias grátis por mês. Sem cartão.
Precisa de
npm i motion
Licença
Este componente vem de Bund UI e é redistribuído sob a licença MIT, que permite uso comercial. O aviso de copyright viaja com o código.
Tilt Effect
import Image from "next/image";
import { TiltEffect } from "./tilt-effect";
import { Card, CardContent } from "@/components/ui/card";
import { Badge } from "@/components/ui/badge";
export default function TiltEffectExample() {
return (
<TiltEffect>
<Card className="overflow-hidden rounded-md pt-0 shadow-none md:w-[280px]">
<Image
src="/images/products/list1.png"
alt=""
width={200}
height={200}
className="aspect-square size-full w-full object-cover transition-all duration-200 ease-linear"
unoptimized
/>
<CardContent className="space-y-1">
<div className="text-lg font-semibold">T-shirt</div>
<Badge variant="outline">Best Sellers</Badge>
</CardContent>
</Card>
</TiltEffect>
);
}
"use client";
import React, { useState, useRef, useEffect } from "react";
import { motion, useMotionValue, useSpring, useTransform } from "motion/react";
export type TiltEffectProps = {
children: React.ReactNode;
tiltFactor?: number;
perspective?: number;
transitionDuration?: number;
};
export const TiltEffect: React.FC<TiltEffectProps> = ({
children,
tiltFactor = 12,
perspective = 1000,
transitionDuration = 0.5
}) => {
const ref = useRef<HTMLDivElement>(null);
const [elementSize, setElementSize] = useState({ width: 0, height: 0 });
const x = useMotionValue(0);
const y = useMotionValue(0);
const springConfig = { damping: 30, stiffness: 400, mass: 0.5 };
const xSpring = useSpring(x, springConfig);
const ySpring = useSpring(y, springConfig);
const rotateX = useTransform(
ySpring,
[-elementSize.height / 2, elementSize.height / 2],
[tiltFactor, -tiltFactor]
);
const rotateY = useTransform(
xSpring,
[-elementSize.width / 2, elementSize.width / 2],
[-tiltFactor, tiltFactor]
);
useEffect(() => {
const updateSize = () => {
if (ref.current) {
setElementSize({
width: ref.current.offsetWidth,
height: ref.current.offsetHeight
});
}
};
updateSize();
window.addEventListener("resize", updateSize);
return () => window.removeEventListener("resize", updateSize);
}, []);
const handleMouseMove = (event: React.MouseEvent<HTMLDivElement>) => {
if (!ref.current) return;
const rect = ref.current.getBoundingClientRect();
const mouseX = event.clientX - rect.left;
const mouseY = event.clientY - rect.top;
const centerX = elementSize.width / 2;
const centerY = elementSize.height / 2;
x.set(mouseX - centerX);
y.set(mouseY - centerY);
};
const handleMouseLeave = () => {
x.set(0);
y.set(0);
};
return (
<motion.div
ref={ref}
style={{
perspective,
transformStyle: "preserve-3d"
}}
onMouseMove={handleMouseMove}
onMouseLeave={handleMouseLeave}>
<motion.div
style={{
rotateX,
rotateY
}}
transition={{
duration: transitionDuration,
type: "spring",
...springConfig
}}>
{children}
</motion.div>
</motion.div>
);
};