Home >Web Front-end >JS Tutorial >Animated Video Tooltip using typescript and framer-motion
Video Tooltip is an animated component that activates when users hover over an avatar.
This component displays a short video of the person introducing themselves or providing additional context, adding a personal and interactive touch.
It's particularly useful for creating memorable user experiences, offering quick insights about team members, speakers, or influencers without requiring extra clicks.
video-tooltip.tsx
import { useState, useCallback, useMemo } from "react"; import { motion, useTransform, AnimatePresence, useMotionValue, useSpring } from "framer-motion"; import { cn } from "@/lib/utils"; interface TooltipItem { id: number; name: string; designation: string; image: string; video: string; text: string; } interface VideoTooltipProps { items: TooltipItem[]; className?: string; } export const VideoTooltip = ({ items, className = "" }: VideoTooltipProps) => { const [hoveredIndex, setHoveredIndex] = useState<number | null>(null); const [showText, setShowText] = useState(false); const springConfig = useMemo( () => ({ stiffness: 100, damping: 5, }), [] ); // Motion setup const x = useMotionValue(0); const translateX = useSpring(useTransform(x, [-100, 100], [-50, 50]), springConfig); // Optimize event handler with useCallback const handleMouseMove = useCallback( (event: React.MouseEvent<HTMLElement>) => { const halfWidth = event.currentTarget.offsetWidth / 2; x.set(event.nativeEvent.offsetX - halfWidth); }, [x] ); return ( <div className={cn("flex items-center gap-2", className)}> {items.map((item) => ( <div className="-mr-4 relative group" key={item.name} onMouseEnter={() => setHoveredIndex(item.id)} onMouseLeave={() => setHoveredIndex(null)}> <AnimatePresence mode="popLayout"> {hoveredIndex === item.id && ( <motion.div initial={{ opacity: 0, y: 20, scale: 0.6 }} animate={{ opacity: 1, y: 0, scale: 1, transition: { stiffness: 260, damping: 10, duration: 0.3, }, width: showText ? "300px" : "96px", height: showText ? "auto" : "96px", }} exit={{ opacity: 0, y: 20, scale: 0.6 }} > <script> // Detect dark theme var iframe = document.getElementById('tweet-1876277735032848773-256'); if (document.body.className.includes('dark-theme')) { iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1876277735032848773&theme=dark" } </script>
The above is the detailed content of Animated Video Tooltip using typescript and framer-motion. For more information, please follow other related articles on the PHP Chinese website!