Pin Input
The PinInput
component is similar to the Input component,
but it is optimized for entering sequences of digits.
The most common application is for entering OTP or security codes.
Import#
import { PinInput, PinInputField } from "@chakra-ui/react"
- PinInput: The component that provides context to all the pin-input fields.
- PinInputField: The text field that user types in - must be a direct child
of
PinInput
.
Usage#
Each input collects one value (number or alphanumeric) at a time. When a value is entered, focus is moved automatically to the next input, until all fields are filled.
Allowing Alphanumeric values#
By default, the pin input accepts only number values. To add support for
alphanumeric values, pass the type
prop and set its value to either
alphanumeric
or number
.
Using fields as a one time password (OTP)#
Use the otp
prop on PinInput
to set autocomplete="one-time-code"
for all
children PinInputField
components.
Masking the pin input's value#
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 PinInput
to achieve this.
Changing the size of the PinInput#
The PinInput
component comes in four sizes. The default is md
.
xs
(24px
)sm
(32px
)md
(40px
)lg
(48px
)
Adding a defaultValue#
You can set the defaultValue
of the PinInput if you wish:
Or even a partial defaultValue:
Changing the placeholder#
To customize the default input placeholder (○
), pass the placeholder
prop
and set it to your desired placeholder.
Disable focus management#
By default, PinInput
moves focus automatically to the next input once a field
is filled. It also transfers focus to a previous input when Delete is
pressed with focus on an empty input.
To disable this behavior, set manageFocus
to false
AutoFill and Copy + Paste#
Try copying & pasting 1234
into any of the inputs in the example above.
By default, you can only change one input at a time, but if one of the input
field receives a longer string by pasting into it, PinInput
attempts to
validate the string and fill the other inputs.
Props#
Name | Type | Description | Default |
---|---|---|---|
autoFocus | boolean | If `true`, the pin input receives focus on mount | - |
children | ReactNode | The children of the pin input component | - |
colorScheme | "blue" | "cyan" | "gray" | "green" | "orange" | "pink" | "purple" | "red" | "teal" | "yellow" | "whiteAlpha" | "blackAlpha" | "linkedin" | "facebook" | "messenger" | "whatsapp" | "twitter" | "telegram" | Color Schemes for PinInput are not implemented in the default theme. You can extend the theme to implement them. | - |
defaultValue | string | The default value of the pin input | - |
errorBorderColor | string | The border color when the input is invalid. Use color keys in `theme.colors` @example errorBorderColor = "red.500" | - |
focusBorderColor | string | The border color when the input is focused. Use color keys in `theme.colors` @example focusBorderColor = "blue.500" | - |
id | string | The top-level id string that will be applied to the input fields. The index of the input will be appended to this top-level id. @example if id="foo", the first input will have `foo-0` | - |
isDisabled | boolean | If `true`, the pin input component is put in the disabled state | - |
isInvalid | boolean | If `true`, the pin input component is put in the invalid state | - |
manageFocus | boolean | If `true`, focus will move automatically to the next input once filled | true |
mask | boolean | If `true`, the input's value will be masked just like `type=password` | - |
onChange | ((value: string) => void) | Function called on input change | - |
onComplete | ((value: string) => void) | Function called when all inputs have valid values | - |
otp | boolean | If `true`, the pin input component signals to its fields that they should use `autocomplete="one-time-code"`. | - |
placeholder | string | The placeholder for the pin input | - |
size | "sm" | "md" | "lg" | "xs" | "md" | |
type | "number" | "alphanumeric" | The type of values the pin-input should allow | - |
value | string | The value of the the pin input. This is the value that will be returned when the pin input is filled | - |
variant | "outline" | "unstyled" | "filled" | "flushed" | "outline" |
PinInputField#
PinInputField composes Input
so you can pass all Input
props.
Name | Type | Description | Default |
---|---|---|---|
colorScheme | "blue" | "cyan" | "gray" | "green" | "orange" | "pink" | "purple" | "red" | "teal" | "yellow" | "whiteAlpha" | "blackAlpha" | "linkedin" | "facebook" | "messenger" | "whatsapp" | "twitter" | "telegram" | Color Schemes for Input are not implemented in the default theme. You can extend the theme to implement them. | - |
errorBorderColor | string | The border color when the input is invalid. Use color keys in `theme.colors` @example errorBorderColor = "red.500" | - |
focusBorderColor | string | The border color when the input is focused. Use color keys in `theme.colors` @example focusBorderColor = "blue.500" | - |
isDisabled | boolean | If `true`, the form control will be disabled. This has 2 side effects: - The `FormLabel` will have `data-disabled` attribute - The form element (e.g, Input) will be disabled | - |
isFullWidth | boolean | If `true`, the input element will span the full width of its parent @deprecated This component defaults to 100% width, please use the props `maxWidth` or `width` to configure | - |
isInvalid | boolean | If `true`, the form control will be invalid. This has 2 side effects: - The `FormLabel` and `FormErrorIcon` will have `data-invalid` set to `true` - The form element (e.g, Input) will have `aria-invalid` set to `true` | - |
isReadOnly | boolean | If `true`, the form control will be readonly | - |
isRequired | boolean | If `true`, the form control will be required. This has 2 side effects: - The `FormLabel` will show a required indicator - The form element (e.g, Input) will have `aria-required` set to `true` | - |
size | "sm" | "md" | "lg" | "xs" | "md" | |
variant | "outline" | "unstyled" | "filled" | "flushed" | "outline" |