This component no longer exists. It was in ondo-ui’s manifest when we first indexed it and is not there now — the registry served its inventory on 2026-08-09 and this item was not on it. The install command below will fail. It is kept here because a tutorial somewhere still tells people to run it.
input-otp
ondo-ui/input-otpRemovedComponent
Accessible one-time password component with copy-paste functionality.
Install it
npx shadcn@latest add https://ui.ondo.dou.so/r/input-otp.jsonSource
1"use client"23import * as React from "react"4import { OTPInput, OTPInputContext } from "input-otp"56import { cn } from "@/lib/utils"7import { IconMinus } from "@tabler/icons-react"89function InputOTP({10 className,11 containerClassName,12 ...props13}: React.ComponentProps<typeof OTPInput> & {14 containerClassName?: string15}) {16 return (17 <OTPInput18 data-slot="input-otp"19 containerClassName={cn(20 "cn-input-otp flex items-center has-disabled:opacity-50",21 containerClassName22 )}23 spellCheck={false}24 className={cn("disabled:cursor-not-allowed", className)}25 {...props}26 />27 )28}2930function InputOTPGroup({ className, ...props }: React.ComponentProps<"div">) {31 return (32 <div33 data-slot="input-otp-group"34 className={cn(35 "flex items-center rounded-md has-aria-invalid:border-destructive has-aria-invalid:ring-3 has-aria-invalid:ring-destructive/20 dark:has-aria-invalid:ring-destructive/40",36 className37 )}38 {...props}39 />40 )41}4243function InputOTPSlot({44 index,45 className,46 ...props47}: React.ComponentProps<"div"> & {48 index: number49}) {50 const inputOTPContext = React.useContext(OTPInputContext)51 const { char, hasFakeCaret, isActive } = inputOTPContext?.slots[index] ?? {}5253 return (54 <div55 data-slot="input-otp-slot"56 data-active={isActive}57 className={cn(58 "relative flex size-9 items-center justify-center border-y border-r border-input text-sm shadow-xs transition-all outline-none first:rounded-l-md first:border-l last:rounded-r-md aria-invalid:border-destructive data-[active=true]:z-10 data-[active=true]:border-ring data-[active=true]:ring-3 data-[active=true]:ring-ring/50 data-[active=true]:aria-invalid:border-destructive data-[active=true]:aria-invalid:ring-destructive/20 dark:bg-input/30 dark:data-[active=true]:aria-invalid:ring-destructive/40",59 className60 )}61 {...props}62 >63 {char}64 {hasFakeCaret && (65 <div className="pointer-events-none absolute inset-0 flex items-center justify-center">66 <div className="h-4 w-px animate-caret-blink bg-foreground duration-1000" />67 </div>68 )}69 </div>70 )71}7273function InputOTPSeparator({ ...props }: React.ComponentProps<"div">) {74 return (75 <div76 data-slot="input-otp-separator"77 className="flex items-center [&_svg:not([class*='size-'])]:size-4"78 role="separator"79 {...props}80 >81 <IconMinus82 />83 </div>84 )85}8687// … truncated
What it pulls in
npm packages
Other registry items
