Hero Ui

HeroUI Input OTP

Forms 4

About

HeroUI v3 InputOTP — segmented one-time-password input: digit counts, patterns, disabled, controlled, validation, on-complete, form integration, variants and on-surface.

Built with React and Tailwind. Copy the prompt and paste it into Claude Code, Cursor or Lovable: your agent adds HeroUI Input OTP to your project and fits it to your theme.

Code

How HeroUI Input OTP is used: the demo's code. The component's own source comes with a free account.

Usage.tsx

"use client"

import { InputOTP } from "@/components/ui/heroui-input-otp"
import { Button, Description, Form, Label } from "@heroui/react"
import React from "react"

export default function WithValidation() {
  const [value, setValue] = React.useState("")
  const [isInvalid, setIsInvalid] = React.useState(false)

  const onSubmit = (e: React.FormEvent<HTMLFormElement>) => {
    e.preventDefault()
    const formData = new FormData(e.currentTarget)
    const code = formData.get("code")

    if (code !== "123456") {
      setIsInvalid(true)

      return
    }

    setIsInvalid(false)
    setValue("")

    alert("Code verified successfully!")
  }

  const handleChange = (val: string) => {
    setValue(val)
    setIsInvalid(false)
  }

  return (
    <div className="flex w-[280px] flex-col gap-2">
      <Form className="flex flex-col gap-2" onSubmit={onSubmit}>
        <Label>Verify account</Label>
        <Description>Hint: The code is 123456</Description>
        <InputOTP
          aria-describedby={isInvalid ? "code-error" : undefined}
          isInvalid={isInvalid}
          maxLength={6}
          name="code"
          value={value}
          onChange={handleChange}
        >
          <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>
        <span className="field-error" data-visible={isInvalid} id="code-error">
          Invalid code. Please try again.
        </span>
        <Button isDisabled={value.length !== 6} type="submit">
          Submit
        </Button>
      </Form>
    </div>
  )
}

Dependencies

More by Hero Ui

View all
  • DatePicker

    DatePicker

    466
  • Chip

    Chip

    440
  •  The Pagination

    The Pagination

    361
  • HeroUI Color Picker

    HeroUI Color Picker

    105
  • Skeleton

    Skeleton

    104
  • HeroUI Table

    HeroUI Table

    98
  • HeroUI Disclosure Group

    HeroUI Disclosure Group

    94
  • HeroUI AlertDialog

    HeroUI AlertDialog

    79

More in Forms

View all
  • Login 1

    Login 1

    52
  • Premium Auth

    Premium Auth

    492
  • Contact Card

    Contact Card

    1K
  • Login 2

    Login 2

    7
  • Form

    Form

    136
  • Authentication Card

    Authentication Card

    45
  • Login Form

    Login Form

    6
  • Card Studio

    Card Studio

    41