Scramble In
fancy/scramble-inFreeComponent
A ui component.
Install it
npx shadcn@latest add https://www.fancycomponents.dev/r/scramble-in.jsonSource
1"use client"23import {4 forwardRef,5 useCallback,6 useEffect,7 useImperativeHandle,8 useState,9} from "react"1011interface ScrambleInProps {12 text: string13 scrambleSpeed?: number14 scrambledLetterCount?: number15 characters?: string16 className?: string17 scrambledClassName?: string18 autoStart?: boolean19 onStart?: () => void20 onComplete?: () => void21}2223export interface ScrambleInHandle {24 start: () => void25 reset: () => void26}2728const ScrambleIn = forwardRef<ScrambleInHandle, ScrambleInProps>(29 (30 {31 text,32 scrambleSpeed = 50,33 scrambledLetterCount = 2,34 characters = "abcdefghijklmnopqrstuvwxyz!@#$%^&*()_+",35 className = "",36 scrambledClassName = "",37 autoStart = true,38 onStart,39 onComplete,40 },41 ref42 ) => {43 const [displayText, setDisplayText] = useState("")44 const [isAnimating, setIsAnimating] = useState(false)45 const [visibleLetterCount, setVisibleLetterCount] = useState(0)46 const [scrambleOffset, setScrambleOffset] = useState(0)4748 const startAnimation = useCallback(() => {49 setIsAnimating(true)50 setVisibleLetterCount(0)51 setScrambleOffset(0)52 onStart?.()53 }, [onStart])5455 const reset = useCallback(() => {56 setIsAnimating(false)57 setVisibleLetterCount(0)58 setScrambleOffset(0)59 setDisplayText("")60 }, [])6162 useImperativeHandle(ref, () => ({63 start: startAnimation,64 reset,65 }))6667 useEffect(() => {68 if (autoStart) {69 startAnimation()70 }71 }, [autoStart, startAnimation])7273 useEffect(() => {74 let interval: NodeJS.Timeout7576 if (isAnimating) {77 interval = setInterval(() => {78 // Increase visible text length79 if (visibleLetterCount < text.length) {80 setVisibleLetterCount((prev) => prev + 1)81 }82 // Start sliding scrambled text out83 else if (scrambleOffset < scrambledLetterCount) {84 setScrambleOffset((prev) => prev + 1)85 }86 // Complete animation87 else {88 clearInterval(interval)89 setIsAnimating(false)90 onComplete?.()91 }9293 // Calculate how many scrambled letters we can show94 const remainingSpace = Math.max(0, text.length - visibleLetterCount)95 const currentScrambleCount = Math.min(96 remainingSpace,97 scrambledLetterCount98 )99100 // Generate scrambled text101// … truncated
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 |
