PIN Input
Allows users to input a sequence of one-character alphanumeric inputs.
Overview
The PIN Input component provides a customizable solution for One-Time Password (OTP), Two-Factor Authentication (2FA), or Multi-Factor Authentication (MFA) input fields. Due to the lack of a native HTML element for these purposes, developers often resort to either basic input fields or custom implementations. This component offers a robust, accessible, and flexible alternative.
Credits
This component is derived from and would not have been possible without the work done by Guilherme Rodz with Input OTP.
Key Features
- Invisible Input Technique: Utilizes an invisible input element for seamless integration with form submissions and browser autofill functionality.
- Customizable Appearance: Allows for custom designs while maintaining core functionality.
- Accessibility: Ensures keyboard navigation and screen reader compatibility.
- Flexible Configuration: Supports various PIN lengths and input types (numeric, alphanumeric).
Architecture
- Root Container: A relatively positioned root element that encapsulates the entire component.
- Invisible Input: A hidden input field that manages the actual value and interacts with the browser's built-in features.
- Visual Cells: Customizable elements representing each character of the PIN, rendered as siblings to the invisible input.
This structure allows for a seamless user experience while providing developers with full control over the visual representation.
Structure
API Reference
The pin input container component.
Property | Type | Description |
---|---|---|
value $bindable | string | The value of the input. Default: undefined |
onValueChange | function | A callback function that is called when the value of the input changes. Default: undefined |
controlledValue | boolean | Whether or not the value is controlled or not. If Default: false |
disabled | boolean | Whether or not the pin input is disabled. Default: false |
textalign | enum | Where is the text located within the input. Affects click-holding or long-press behavior Default: 'left' |
maxlength | number | The maximum length of the pin input. Default: 6 |
onComplete | function | A callback function that is called when the input is completely filled. Default: undefined |
inputId | string | Optionally provide an ID to apply to the hidden input element. Default: undefined |
pushPasswordManagerStrategy | enum | Enabled by default, it's an optional strategy for detecting Password Managers in the page and then shifting their badges to the right side, outside the input. Default: undefined |
ref $bindable | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default: undefined |
children | Snippet | The children content to render. Default: undefined |
child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default: undefined |
Data Attribute | Value | Description |
---|---|---|
data-pin-input-root | '' | Present on the root element. |
A single cell of the pin input.
Property | Type | Description |
---|---|---|
cell | object | The cell object provided by the Default: undefined |
ref $bindable | HTMLDivElement | The underlying DOM element being rendered. You can bind to this to get a reference to the element. Default: undefined |
children | Snippet | The children content to render. Default: undefined |
child | Snippet | Use render delegation to render your own element. See delegation docs for more information. Default: undefined |
Data Attribute | Value | Description |
---|---|---|
data-active | '' | Present when the cell is active. |
data-inactive | '' | Present when the cell is inactive. |
data-pin-input-cell | '' | Present on the cell element. |