Pin Input

Pin Input can be used to collect a pin code from authenticator app.

Source
Theme Source
pnpm dlx dreamy add pin-input

PinInput is a wrapper component for PinInputField that provides a context for the pin input.

<PinInput.Root>
  <PinInput.Field />
  <PinInput.Field />
  <PinInput.Field />
</PinInput.Root>
export function ControlledPinInput() {
    const [pin, setPin] = useState("2137");
 
    return (
        <PinInput.Root
            value={pin}
            onChange={setPin}
        >
            <PinInput.Field />
            <PinInput.Field />
            <PinInput.Field />
            <PinInput.Field />
        </PinInput.Root>
    );
}
<VStack w="full">
  <PinInput.Root variant="outline">
    <PinInput.Field />
    <PinInput.Field />
    <PinInput.Field />
  </PinInput.Root>
 
  <PinInput.Root variant="filled">
    <PinInput.Field />
    <PinInput.Field />
    <PinInput.Field />
  </PinInput.Root>
 
  <PinInput.Root variant="flushed">
    <PinInput.Field />
    <PinInput.Field />
    <PinInput.Field />
  </PinInput.Root>
</VStack>

Pass isInvalid prop to the PinInput to show the error state.

<PinInput.Root isInvalid>
	<PinInput.Field />
	<PinInput.Field />
	<PinInput.Field />
</PinInput.Root>

Pass isDisabled prop to the PinInput to show the disabled state.

<PinInput.Root isDisabled>
	<PinInput.Field />
	<PinInput.Field />
	<PinInput.Field />
</PinInput.Root>

Pass onChange prop to the PinInput to get the value when the pin input is changed.

<PinInput.Root onChange={(pin) => toast({ title: `Pin: ${pin}` })}>
	<PinInput.Field />
	<PinInput.Field />
	<PinInput.Field />
</PinInput.Root>

Pass onComplete prop to the PinInput to get the complete value when the pin input is filled.

<PinInput.Root onComplete={(pin) => toast({ title: `Pin: ${pin}` })}>
	<PinInput.Field />
	<PinInput.Field />
	<PinInput.Field />
	<PinInput.Field />
</PinInput.Root>

Pass otp prop to the PinInput to make the pin input an One Time Password input.

<PinInput.Root otp>
	<PinInput.Field />
	<PinInput.Field />
	<PinInput.Field />
</PinInput.Root>

Pass mask prop to the PinInput to mask the input.

<PinInput.Root mask>
	<PinInput.Field />
	<PinInput.Field />
	<PinInput.Field />
</PinInput.Root>

The type of the pin inputs value. "alphanumeric" | "number".

<PinInput.Root type="alphanumeric">
  <PinInput.Field />
  <PinInput.Field />
  <PinInput.Field />
</PinInput.Root>

Set manageFocus to false to disable the moving focus to the next input when the current input is filled.

<PinInput.Root manageFocus={false}>
	<PinInput.Field />
	<PinInput.Field />
	<PinInput.Field />
</PinInput.Root>

Use autoFocus to focus the first input when the pin input is mounted. Refresh the page to see the effect.

<PinInput.Root autoFocus>
	<PinInput.Field />
	<PinInput.Field />
	<PinInput.Field />
</PinInput.Root>

You can enter custom content between the fields to split them.


<PinInput.Root>
	<PinInput.Field />
	<PinInput.Field />
	<PinInput.Field />
  
    <Divider orientation="vertical" mx={2} h={8} />
 
	<PinInput.Field />
	<PinInput.Field />  
	<PinInput.Field />  
</PinInput.Root>