# InputOTP A one-time code in separate slots, with paste, SMS autofill and a pattern. ```ehtml Example import { InputOTP, REGEXP_ONLY_DIGITS } from "@elements/ui/input-otp"; verify(code)} /> ``` ## Parts | Part | What it is | |---|---| | `.input-otp` | The root. | | `.input-otp-input` | The real input, transparent over the slots. | | `.input-otp-group` | A run of joined slots. | | `.input-otp-slot` | One character. | | `.input-otp-separator` | Between groups. | | `.input-otp-caret` | The blinking caret in an empty active slot. | ## Attributes | Attribute | Type | Default | Description | |---|---|---|---| | `value` | `string` (two-way) | `""` | The code. | | `maxLength` | `number` | `6` | Number of slots. | | `groups` | `number[]` | `[]` | Slots per group, e.g. [3, 3]. A separator goes between groups. | | `pattern` | `string \| RegExp` | `""` | Every change must match. REGEXP_ONLY_DIGITS, REGEXP_ONLY_CHARS and REGEXP_ONLY_DIGITS_AND_CHARS are exported. | | `pasteTransformer` | `((pasted: string) => string) \| null` | `null` | Cleans pasted text first, e.g. removes dashes. | | `inputmode` | `"numeric" \| "text" \| "decimal" \| "tel" \| "email" \| "url" \| "search" \| "none"` | `"numeric"` | Which keyboard a phone shows. | | `autocomplete` | `string` | `"one-time-code"` | Lets the browser fill a code from an SMS. | | `placeholder` | `string` | `""` | One placeholder character per empty slot. | | `pushPasswordManagerStrategy` | `"increase-width" \| "none"` | `"increase-width"` | Keeps a password manager's badge off the last slot. | | `textAlign` | `"left" \| "center" \| "right"` | `"left"` | Where the hidden input's text sits, which is where a click-hold or long press lands (input-otp textAlign). | | `inputClass` | `string` | `""` | Classes added to the real input (input-otp className). | | `size` | `"sm" \| "md" \| "lg"` | `"md"` | Slot size from the control heights. | | `name` | `string` | `""` | Submits the code with its form. | | `disabled` | `boolean` | `false` | Not interactive. | | `readonly` | `boolean` | `false` | Focusable and submitted, but typing and paste do nothing. | | `required` | `boolean` | `false` | The form will not submit until every slot is filled. | | `invalid` | `boolean` | `false` | Danger borders on the slots. | | `class` | `string` | `""` | Extra classes on the root. | | `attrs` | `Record` | `{}` | Attributes for the input: id, aria-label, autofocus, data-\*. | | `onValueChange` | `(value: string) => void` | `() => {}` | Called with the new code on every change the user makes (input-otp onChange). | | `onComplete` | `(value: string) => void` | `() => {}` | Called once when the last slot fills. | ## Slots | Slot | Content | |---|---| | `separator` | Shown between groups. Default: a dash. | ## Keyboard | Keys | Action | |---|---| | `Type` | Fills the active slot and moves on. | | `Backspace` | Deletes the active slot's character. | | `ArrowLeft / ArrowRight` | Moves between slots. | | `Home / End` | Moves to the first slot, or the slot after the code. | | `Ctrl/Cmd + V` | Pastes a whole code. | ## Data attributes | Attribute | Values | On | |---|---|---| | `data-active` | present on the slot being edited | slot | | `data-filled` | present when the slot has a character | slot | | `data-placeholder` | present while a placeholder shows | slot | | `data-index` | the slot's index | slot | | `data-complete` | present when every slot is filled | root | | `data-disabled` | present when disabled | root | | `data-readonly` | present when read-only | root | | `data-invalid` | present when invalid | root | ## Accessibility - It is one text input, so a screen reader reads and edits the code as one field; the slots are drawing only (aria-hidden). - autocomplete="one-time-code" lets iOS and Android offer the code from an SMS, and a pasted code fills every slot. - Name it with a Field or aria-label through attrs. ## See also - [Slider](slider): Pick a value or a range by dragging thumbs along a track, with full keyboard support. - [NumberInput](number-input): A number field with stepper buttons, keyboard steps, formatting, wheel and scrub. - [PasswordInput](password-input): A password field with a button that shows and hides what was typed. - [TagsInput](tags-input): Type a list of tags into one field: add, edit, delete and paste them from the keyboard. - [ColorPicker](color-picker): Pick a color with an area, channel sliders, inputs, swatches and the eye dropper. - [FileUpload](file-upload): Drop, paste or browse for files; see them listed with previews, sizes, errors and progress.