Components
HeroUI v3 InputOTP — segmented one-time-password input: digit counts, patterns, disabled, controlled, validation, on-complete, form integration, variants and on-surface.
npx shadcn@latest add https://21st.dev/r/larsen66/heroui-input-otpLoading preview...
import { InputOTP } from "@/components/ui/heroui-input-otp"
import { Label, Link, Surface } from "@heroui/react"
export default function OnSurface() {
return (
// The docs render this on the page's light‑gray background (--background),
// which is what makes the white Surface card visible. The 21st preview page
// is white, so reproduce that backdrop here to match the original.
<div className="mx-auto flex w-full max-w-md justify-center rounded-3xl bg-[#f4f4f5] p-8">
<Surface className="flex w-full flex-col gap-2 rounded-3xl p-6">
<div className="flex flex-col gap-1">
<Label>Verify account</Label>
<p className="text-sm text-muted">We've sent a code to a****@gmail.com</p>
</div>
<InputOTP maxLength={6} variant="secondary">
<InputOTP.Group>
<InputOTP.Slot index={0} />
<InputOTP.Slot index={1} />
<InputOTP.Slot index={2} />
</InputOTP.Group>
<InputOTP.Separator />
<InputOTP.Group>
<InputOTP.Slot index={3} />
<InputOTP.Slot index={4} />
<InputOTP.Slot index={5} />
</InputOTP.Group>
</InputOTP>
<div className="flex items-center gap-[5px] px-1 pt-1">
<p className="text-sm text-muted">Didn't receive a code?</p>
<Link className="text-foreground underline" href="#">
Resend
</Link>
</div>
</Surface>
</div>
)
}
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...
Loading preview...