Letter Swap Forward Anim
fancy/letter-swap-forward-animFreeComponent
A ui component.
Install it
npx shadcn@latest add https://www.fancycomponents.dev/r/letter-swap-forward-anim.jsonSource
1"use client"23import { useState } from "react"4import { AnimationOptions, motion, stagger, useAnimate } from "motion/react"56interface TextProps {7 label: string8 reverse?: boolean9 transition?: AnimationOptions10 staggerDuration?: number11 staggerFrom?: "first" | "last" | "center" | number12 className?: string13 onClick?: () => void14}1516const LetterSwapForward = ({17 label,18 reverse = true,19 transition = {20 type: "spring",21 duration: 0.7,22 },23 staggerDuration = 0.03,24 staggerFrom = "first",25 className,26 onClick,27 ...props28}: TextProps) => {29 const [scope, animate] = useAnimate()30 const [blocked, setBlocked] = useState(false)3132 const hoverStart = () => {33 if (blocked) return3435 setBlocked(true)3637 // Function to merge user transition with stagger and delay38 const mergeTransition = (baseTransition: AnimationOptions) => ({39 ...baseTransition,40 delay: stagger(staggerDuration, {41 from: staggerFrom,42 }),43 })4445 animate(46 ".letter",47 { y: reverse ? "100%" : "-100%" },48 mergeTransition(transition)49 ).then(() => {50 animate(51 ".letter",52 {53 y: 0,54 },55 {56 duration: 0,57 }58 ).then(() => {59 setBlocked(false)60 })61 })6263 animate(64 ".letter-secondary",65 {66 top: "0%",67 },68 mergeTransition(transition)69 ).then(() => {70 animate(71 ".letter-secondary",72 {73 top: reverse ? "-100%" : "100%",74 },75 {76 duration: 0,77 }78 )79 })80 }8182 return (83 <span84 className={`flex justify-center items-center relative overflow-hidden ${className} `}85 onMouseEnter={hoverStart}86 onClick={onClick}87 ref={scope}88 {...props}89 >90 <span className="sr-only">{label}</span>9192 {label.split("").map((letter: string, i: number) => {93 return (94 <span95 className="whitespace-pre relative flex"96 key={i}97 aria-hidden={true}98 >99 <motion.span className={`relative letter`} style={{ top: 0 }}>100 {letter}101 </motion.span>102 <motion.span103 className="absolute letter-secondary "104 style={{ top: reverse ? "-100%" : "100%" }}105 >106 {letter}107 </motion.span>108 </span>109 )110 })}111 </span>112 )113}114115export default LetterSwapForward
What it pulls in
npm packages
Files it writes
More from fancy
All 158 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Animated Gradient With Svganimated-gradient-with-svg | fancy | Components | Free | no deps | |
| Basic Number Tickerbasic-number-ticker | fancy | Components | Free | 1 dep | |
| Box Carouselbox-carousel | fancy | Components | Free | 1 dep | |
| Breathing Textbreathing-text | fancy | Components | Free | 1 dep | |
| Circling Elementscircling-elements | fancy | Components | Free | 1 dep | |
| Css Boxcss-box | fancy | Components | Free | 1 dep | |
| Cursor Attractor And Gravitycursor-attractor-and-gravity | fancy | Components | Free | 5 deps | |
| Drag Elementsdrag-elements | fancy | Components | Free | 1 dep |
