- Docs/
- Components/
- card-hover
Fast Performance
Optimize your app for lightning-fast speed and responsiveness. Our cutting-edge techniques ensure smooth user experiences.
Secure & Reliable
Ensure your data is protected with our advanced security measures. We implement industry-standard protocols to keep your information safe.
Mobile Friendly
Create responsive designs that work seamlessly across all devices. From smartphones to desktops, your app will look great everywhere.
Clean Code
Write maintainable and efficient code with our best practices. Our team follows strict coding standards to ensure long-term sustainability.
User-Centric Design
Design intuitive interfaces that prioritize user experience. We focus on creating interfaces that are both beautiful and easy to use.
Cloud Integration
Seamlessly integrate with popular cloud services and platforms. Leverage the power of the cloud to enhance your application's capabilities.
npm i framer-motion clsx tailwind-merge lucid-react
import { clsx } from "clsx" import { twMerge } from "tailwind-merge" export function cn(...inputs) { return twMerge(clsx(inputs)) }
"use client"; import { useState } from "react"; import { AnimatePresence, motion } from "framer-motion"; import { cn } from "@/lib/utils"; export default function CardHoverEffect({ items, containerClassName, itemClassName, hoveredItemClassName, IconComponent, }) { const [hoveredIdx, setHoveredIdx] = useState(null); return ( <div className={cn("grid md:grid-cols-3", containerClassName)}> {items.map((item, idx) => { const { title, description, icon } = item; const Icon = icon || IconComponent; return ( <div key={idx} className={cn("relative flex flex-col gap-3 p-4", itemClassName)} onMouseEnter={()=> setHoveredIdx(idx)} onMouseLeave={()=> setHoveredIdx(null)} > <AnimatePresence> {hoveredIdx === idx && ( <motion.span className={cn( "absolute inset-0 z-0 block h-full w-full rounded-xl bg-neutral-900", hoveredItemClassName )} layoutId="cardHoverEffect" initial={{ opacity: 0 }} animate={{ opacity: 1, transition: { duration: 0.15 }, }} exit={{ opacity: 0, transition: { duration: 0.15, delay: 0.2 }, }} /> )} </AnimatePresence> <div className="z-[1] space-y-3"> <div className="flex items-center space-x-3"> {Icon && <Icon className="w-6 h-6 text-neutral-500" />} <h1 className="font-medium text-white">{title}</h1> </div> <p className="text-neutral-400 text-sm">{description}</p> </div> </div> ); })} </div> ); }