Components
Input OTP
Accessible one-time password component with copy-paste functionality.
php artisan blatui:add input-otp
<x-ui.input-otp :maxlength="6">
<x-ui.input-otp-group>
<x-ui.input-otp-slot :index="0" />
<x-ui.input-otp-slot :index="1" />
<x-ui.input-otp-slot :index="2" />
<x-ui.input-otp-slot :index="3" />
<x-ui.input-otp-slot :index="4" />
<x-ui.input-otp-slot :index="5" />
</x-ui.input-otp-group>
</x-ui.input-otp>
Alphanumeric
{{-- Accepts letters and digits (alphanumeric) instead of digits only. --}}
<x-ui.input-otp :maxlength="6" alphanumeric>
<x-ui.input-otp-group>
<x-ui.input-otp-slot :index="0" />
<x-ui.input-otp-slot :index="1" />
<x-ui.input-otp-slot :index="2" />
<x-ui.input-otp-slot :index="3" />
<x-ui.input-otp-slot :index="4" />
<x-ui.input-otp-slot :index="5" />
</x-ui.input-otp-group>
</x-ui.input-otp>
Disabled
<x-ui.input-otp :maxlength="6" disabled>
<x-ui.input-otp-group>
<x-ui.input-otp-slot :index="0" />
<x-ui.input-otp-slot :index="1" />
<x-ui.input-otp-slot :index="2" />
<x-ui.input-otp-slot :index="3" />
<x-ui.input-otp-slot :index="4" />
<x-ui.input-otp-slot :index="5" />
</x-ui.input-otp-group>
</x-ui.input-otp>
Four Digit
<x-ui.input-otp :maxlength="4">
<x-ui.input-otp-group>
<x-ui.input-otp-slot :index="0" />
<x-ui.input-otp-slot :index="1" />
<x-ui.input-otp-slot :index="2" />
<x-ui.input-otp-slot :index="3" />
</x-ui.input-otp-group>
</x-ui.input-otp>
With Separator
<x-ui.input-otp :maxlength="6">
<x-ui.input-otp-group>
<x-ui.input-otp-slot :index="0" />
<x-ui.input-otp-slot :index="1" />
<x-ui.input-otp-slot :index="2" />
</x-ui.input-otp-group>
<x-ui.input-otp-separator />
<x-ui.input-otp-group>
<x-ui.input-otp-slot :index="3" />
<x-ui.input-otp-slot :index="4" />
<x-ui.input-otp-slot :index="5" />
</x-ui.input-otp-group>
</x-ui.input-otp>
Using with Livewire
wire:model
The examples above are the frontend (Blade + Alpine) usage. Inside a Livewire component, bind
wire:model for two-way
state — same component, no wrappers.
Full Livewire guide →
app/Livewire/Demo.php
use Livewire\Component;
class Demo extends Component
{
public string $code = '';
public function render()
{
return view('livewire.demo');
}
}
resources/views/livewire/demo.blade.php
<x-ui.input-otp wire:model="code" />
API Reference
Props, slots and exposed methods for
<x-ui.input-otp>.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
name |
string
|
— | Name of the hidden input, so the entered code is submitted with the form. |
maxlength |
int
|
6
|
Total number of characters the code accepts. Should match the number of input-otp-slot children you render. |
value |
string
|
''
|
Initial code value. |
disabled |
bool
|
false
|
Disables the field and dims it. |
alphanumeric |
bool
|
false
|
Accept letters and digits (text inputmode). When false the field is numeric-only. |
ariaLabel |
string
|
'One-time password'
|
Accessible label announced for the code field. |
Slots
| Slot | Description |
|---|---|
default |
The visible slot cells. Compose with x-ui.input-otp-group wrapping x-ui.input-otp-slot (each given an :index), optionally split by x-ui.input-otp-separator. The real input is hidden and overlays these cells. |