clerk-otp
eldoraui/clerk-otpFreeComponent
A clerk OTP component.
Live preview
live · rendered by the registry
Rendered by eldoraui on their own page — this is the component running, not a screenshot of it.Install it
npx shadcn@latest add https://eldoraui.site/r/clerk-otp.jsonSource
1"use client"23import { useEffect, useState } from "react"4import { motion } from "motion/react"56import { cn } from "@/lib/utils"78const generateRandomDigits = () => {9 return Array.from({ length: 6 }, () =>10 Math.floor(Math.random() * 10).toString()11 )12}1314type AnimatedOTPProps = {15 delay?: number16 cardTitle?: string17 cardDescription?: string18 whileHover?: boolean19}2021const AnimatedOTP = ({22 delay = 3500,23 cardTitle = "Multifactor Authentication",24 cardDescription = "Each user's self-serve multifactor settings are enforced automatically during sign-in.",25 whileHover = false,26}: AnimatedOTPProps) => {27 const [animationKey, setAnimationKey] = useState(0)28 const delayTime = Math.max(delay, 3500)29 useEffect(() => {30 const interval = setInterval(() => {31 setAnimationKey((prev) => prev + 1)32 }, delayTime)3334 return () => clearInterval(interval)35 }, [delayTime])3637 return (38 <OTPinput39 key={animationKey}40 cardTitle={cardTitle}41 cardDescription={cardDescription}42 whileHover={whileHover}43 />44 )45}4647export default AnimatedOTP4849const OTPinput = ({50 cardTitle,51 cardDescription,52 whileHover,53}: AnimatedOTPProps) => {54 const [activeIndex, setActiveIndex] = useState(0)55 const [fadeOut, setFadeOut] = useState(false)56 const [digits] = useState(() => generateRandomDigits())57 const [isCardHovered, setIsCardHovered] = useState(false)5859 useEffect(() => {60 if (activeIndex > digits.length - 1) return6162 const shouldAnimate = !whileHover || (whileHover && isCardHovered)6364 if (!shouldAnimate) return6566 const interval = setInterval(() => {67 setActiveIndex((prev) => prev + 1)68 }, 400)6970 if (activeIndex === digits.length - 1) {71 setTimeout(() => {72 setFadeOut(true)73 }, 450)74 }7576 return () => clearInterval(interval)77 }, [activeIndex, digits.length, whileHover, isCardHovered])7879 return (80 <motion.div81 initial={{ opacity: 1 }}82 onHoverStart={() => setIsCardHovered(true)}83 onHoverEnd={() => setIsCardHovered(false)}84 className={cn(85 "relative",86 "flex items-center justify-center",87 "h-[14rem] w-full max-w-[350px]",88 "rounded-md border bg-neutral-50 dark:bg-neutral-900",89 "shadow-[0_3px_10px_rgb(0,0,0,0.2)]"90 )}91 >92 <div className="absolute top-[25%] left-1/2 -translate-x-1/2">93 <div className="flex w-full items-center justify-center gap-3">94 {digits.map((digit, idx) => (95 <div96// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from eldoraui
All 115 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| animated-badgeanimated-badge | eldoraui | Components | Free | 2 deps | |
| animated-frameworksanimated-frameworks | eldoraui | Components | Free | 2 deps | |
| animated-grid-patternanimated-grid-pattern | eldoraui | Components | Free | 3 deps | |
| animated-listanimated-list | eldoraui | Components | Free | 1 dep | |
| animated-shiny-buttonanimated-shiny-button | eldoraui | Components | Free | 1 dep | |
| blur-in-textblur-in-text | eldoraui | Components | Free | 3 deps | |
| browserbrowser | eldoraui | Components | Free | 2 deps | |
| card-flip-hovercard-flip-hover | eldoraui | Components | Free | 1 dep |
