Pin Input
For pin or verification codes with auto-focus transfer and masking options.
Anatomy
To set up the pin input correctly, you'll need to understand its anatomy and how we name its parts.
Each part includes a
data-partattribute to help identify them in the DOM.
Examples
Learn how to use the PinInput component in your project. Let's take a look at the most basic example:
Example not foundExample not foundExample not foundExample not foundSetting a default value
To set the initial value of the pin input, set the defaultValue prop.
Example not foundExample not foundExample not foundExample not foundChanging the placeholder
To customize the default pin input placeholder ○ for each input, pass the placeholder prop and set it to your desired
value.
Example not foundExample not foundExample not foundExample not foundBlur on complete
By default, the last input maintains focus when filled, and we invoke the onValueComplete callback. To blur the last
input when the user completes the input, set the prop blurOnComplete to true.
Example not foundExample not foundExample not foundExample not foundUsing OTP mode
To trigger smartphone OTP auto-suggestion, it is recommended to set the autocomplete attribute to "one-time-code". The
pin input component provides support for this automatically when you set the otp prop to true.
Example not foundExample not foundExample not foundExample not foundSecuring the text input
When collecting private or sensitive information using the pin input, you might need to mask the value entered, similar
to <input type="password"/>. Pass the mask prop to true.
Example not foundExample not foundExample not foundExample not foundListening for changes
The pin input component invokes several callback functions when the user enters:
onValueChange— Callback invoked when the value is changed.onValueComplete— Callback invoked when all fields have been completed (by typing or pasting).onValueInvalid— Callback invoked when an invalid value is entered into the input. An invalid value is any value that doesn't match the specified "type".
Using the Field Component
The Field component helps manage form-related state and accessibility attributes of a pin input. It includes handling
ARIA labels, helper text, and error text to ensure proper accessibility.
Example not foundExample not foundExample not foundExample not foundUsing the Root Provider
The RootProvider component provides a context for the pin-input. It accepts the value of the usePin-input hook. You
can leverage it to access the component state and methods from outside the pin-input.
Example not foundExample not foundExample not foundExample not foundIf you're using the
RootProvidercomponent, you don't need to use theRootcomponent.
API Reference
Props
Root
| Prop | Default | Type |
|---|---|---|
asChild | booleanUse the provided child element as the default rendered element, combining their props and behavior. For more details, read our Composition guide. | |
autoFocus | booleanWhether to auto-focus the first input. | |
blurOnComplete | booleanWhether to blur the input when the value is complete | |
count | numberThe number of inputs to render to improve SSR aria attributes. This will be required in next major version. | |
defaultValue | string[]The initial value of the the pin input when rendered. Use when you don't need to control the value of the pin input. | |
disabled | booleanWhether the inputs are disabled | |
form | stringThe associate form of the underlying input element. | |
id | stringThe unique identifier of the machine. | |
ids | Partial<{
root: string
hiddenInput: string
label: string
control: string
input: (id: string) => string
}>The ids of the elements in the pin input. Useful for composition. | |
invalid | booleanWhether the pin input is in the invalid state | |
mask | booleanIf `true`, the input's value will be masked just like `type=password` | |
name | stringThe name of the input element. Useful for form submission. | |
onValueChange | (details: ValueChangeDetails) => voidFunction called on input change | |
onValueComplete | (details: ValueChangeDetails) => voidFunction called when all inputs have valid values | |
onValueInvalid | (details: ValueInvalidDetails) => voidFunction called when an invalid value is entered | |
otp | booleanIf `true`, the pin input component signals to its fields that they should use `autocomplete="one-time-code"`. | |
pattern | stringThe regular expression that the user-entered input value is checked against. | |
placeholder | '○' | stringThe placeholder text for the input |
readOnly | booleanWhether the pin input is in the valid state | |
required | booleanWhether the pin input is required | |
selectOnFocus | booleanWhether to select input value when input is focused | |
translations | IntlTranslationsSpecifies the localized strings that identifies the accessibility elements and their states | |
type | 'numeric' | 'numeric' | 'alphanumeric' | 'alphabetic'The type of value the pin-input should allow |
value | string[]The controlled value of the the pin input. |
| Data Attribute | Value |
|---|---|
[data-scope] | pin-input |
[data-part] | root |
[data-invalid] | Present when invalid |
[data-disabled] | Present when disabled |
[data-complete] | Present when the pin-input value is complete |
[data-readonly] | Present when read-only |
Control
| Prop | Default | Type |
|---|---|---|
asChild | booleanUse the provided child element as the default rendered element, combining their props and behavior. For more details, read our Composition guide. |
HiddenInput
| Prop | Default | Type |
|---|---|---|
asChild | booleanUse the provided child element as the default rendered element, combining their props and behavior. For more details, read our Composition guide. |
Input
| Prop | Default | Type |
|---|---|---|
index | number | |
asChild | booleanUse the provided child element as the default rendered element, combining their props and behavior. For more details, read our Composition guide. |
| Data Attribute | Value |
|---|---|
[data-scope] | pin-input |
[data-part] | input |
[data-disabled] | Present when disabled |
[data-complete] | Present when the input value is complete |
[data-index] | The index of the item |
[data-invalid] | Present when invalid |
Label
| Prop | Default | Type |
|---|---|---|
asChild | booleanUse the provided child element as the default rendered element, combining their props and behavior. For more details, read our Composition guide. |
| Data Attribute | Value |
|---|---|
[data-scope] | pin-input |
[data-part] | label |
[data-invalid] | Present when invalid |
[data-disabled] | Present when disabled |
[data-complete] | Present when the label value is complete |
[data-required] | Present when required |
[data-readonly] | Present when read-only |
RootProvider
| Prop | Default | Type |
|---|---|---|
value | UsePinInputReturn | |
asChild | booleanUse the provided child element as the default rendered element, combining their props and behavior. For more details, read our Composition guide. |
Context
These are the properties available when using UpinUinput.Context, useUpinUinputContext hook or useUpinUinput hook.
API
| Property | Type |
|---|---|
value | string[]The value of the input as an array of strings. |
valueAsString | stringThe value of the input as a string. |
complete | booleanWhether all inputs are filled. |
count | numberThe number of inputs to render |
items | number[]The array of input values. |
setValue | (value: string[]) => voidFunction to set the value of the inputs. |
clearValue | VoidFunctionFunction to clear the value of the inputs. |
setValueAtIndex | (index: number, value: string) => voidFunction to set the value of the input at a specific index. |
focus | VoidFunctionFunction to focus the pin-input. This will focus the first input. |
Accessibility
Keyboard Support
| Key | Description |
|---|---|
ArrowLeft | Moves focus to the previous input |
ArrowRight | Moves focus to the next input |
Backspace | Deletes the value in the current input and moves focus to the previous input |
Delete | Deletes the value in the current input |
Control + V | Pastes the value into the input fields |