pnpm dlx dreamy add pin-inputPinInput 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>