You may set the type of string using a set of methods. Some, such as email(), also provide validation:
use Filament\Forms\Components\TextInput;TextInput::make('text') ->email() // or ->numeric() // or ->integer() // or ->password() // or ->tel() // or ->url()
You may instead use the type() method to pass another HTML input type:
use Filament\Forms\Components\TextInput;TextInput::make('backgroundColor') ->type('color')
The individual type methods also allow you to pass in a boolean value to control if the field should be that or not:
use Filament\Forms\Components\TextInput;TextInput::make('text') ->email(FeatureFlag::active()) // or ->numeric(FeatureFlag::active()) // or ->integer(FeatureFlag::active()) // or ->password(FeatureFlag::active()) // or ->tel(FeatureFlag::active()) // or ->url(FeatureFlag::active())
Datalists provide autocomplete options to users when they use a text input. However, these are purely recommendations, and the user is still able to type any value into the input. If you’re looking to strictly limit users to a set of predefined options, check out the select field.
When using password(), you can also make the input revealable(), so that the user can see a plain text version of the password they’re typing by clicking a button:
use Filament\Forms\Components\TextInput;TextInput::make('password') ->password() ->revealable()
Optionally, you may pass a boolean value to control if the input should be revealable or not:
use Filament\Forms\Components\TextInput;TextInput::make('password') ->password() ->revealable(FeatureFlag::active())
You may make the text copyable, such that clicking on a button next to the input copies the text to the clipboard, and optionally specify a custom confirmation message and duration in milliseconds:
use Filament\Forms\Components\TextInput;TextInput::make('apiKey') ->label('API key') ->copyable(copyMessage: 'Copied!', copyMessageDuration: 1500)
Optionally, you may pass a boolean value to control if the text should be copyable or not:
use Filament\Forms\Components\TextInput;TextInput::make('apiKey') ->label('API key') ->copyable(FeatureFlag::active())
This feature only works when SSL is enabled for the app.
Input masking is the practice of defining a format that the input value must conform to.In Filament, you may use the mask() method to configure an Alpine.js mask:
use Filament\Forms\Components\TextInput;TextInput::make('birthday') ->mask('99/99/9999') ->placeholder('MM/DD/YYYY')
To use a dynamic mask, wrap the JavaScript in a RawJs object:
Alpine.js will send the entire masked value to the server, so you may need to strip certain characters from the state before validating the field and saving it. You can do this with the stripCharacters() method, passing in a character or an array of characters to remove from the masked value:
use Filament\Forms\Components\TextInput;use Filament\Support\RawJs;TextInput::make('amount') ->mask(RawJs::make('$money($input)')) ->stripCharacters(',') ->numeric()
You can automatically trim whitespace from the beginning and end of the input value using the trim() method:
use Filament\Forms\Components\TextInput;TextInput::make('name') ->trim()
You may want to enable trimming globally for all text inputs, similar to Laravel’s TrimStrings middleware. You can do this in a service provider using the configureUsing() method:
use Filament\Forms\Components\TextInput;TextInput::configureUsing(function (TextInput $component): void { $component->trim();});
Not to be confused with disabling the field, you may make the field “read-only” using the readOnly() method:
use Filament\Forms\Components\TextInput;TextInput::make('name') ->readOnly()
There are a few differences, compared to disabled():
When using readOnly(), the field will still be sent to the server when the form is submitted. It can be mutated with the browser console, or via JavaScript. You can use saved(false) to prevent this.
There are no styling changes, such as less opacity, when using readOnly().
The field is still focusable when using readOnly().
Optionally, you may pass a boolean value to control if the field should be read-only or not:
use Filament\Forms\Components\TextInput;TextInput::make('name') ->readOnly(FeatureFlag::active())
When using a tel() field, the value will be validated using: /^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\.\/0-9]*$/.If you wish to change that, then you can use the telRegex() method:
use Filament\Forms\Components\TextInput;TextInput::make('phone') ->tel() ->telRegex('/^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\.\/0-9]*$/')
Alternatively, to customize the telRegex() across all fields, use a service provider:
use Filament\Forms\Components\TextInput;TextInput::configureUsing(function (TextInput $component): void { $component->telRegex('/^[+]*[(]{0,1}[0-9]{1,4}[)]{0,1}[-\s\.\/0-9]*$/');});