7.0 KiB
Form Inputs
All input components extend a shared InputBase<T> class that provides consistent styling, htmx validation integration, and parameter unification. When placed inside an HtmxForm with a FormField, inputs automatically attach hx-post, hx-trigger="blur", and hx-target attributes for real-time per-field validation.
TextInput
A standard text input for strings. Supports all HTML input types (text, email, password, search, etc.).
<FormField Label="Full Name" For="name">
<TextInput Id="name" Name="name" Placeholder="Jane Doe" />
</FormField>
<FormField Label="Email" For="email">
<TextInput Id="email" Name="email" Type="email" Placeholder="jane@example.com" />
</FormField>
<FormField Label="Password" For="password">
<TextInput Id="password" Name="password" Type="password" Placeholder="••••••••" />
</FormField>
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
Type |
string |
"text" |
HTML input type |
Id |
string? |
— | Input element ID |
Name |
string? |
— | Form field name (submitted to the server) |
Value |
string? |
— | Current value |
Placeholder |
string? |
— | Placeholder text |
Disabled |
bool |
false |
Disables the input |
ReadOnly |
bool |
false |
Makes the input read-only |
Class |
string? |
— | Additional CSS classes |
NumberInput
A numeric input with built-in increment/decrement stepper buttons. Hides the browser's native spinner.
<FormField Label="Age" For="age">
<NumberInput Id="age" Name="age" Placeholder="25" Min="0" Max="150" />
</FormField>
<FormField Label="Quantity" For="quantity">
<NumberInput Id="quantity" Name="quantity" Value="1" Min="1" Max="99" Step="1" />
</FormField>
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
Min |
string? |
— | Minimum allowed value |
Max |
string? |
— | Maximum allowed value |
Step |
string? |
— | Step increment |
Value |
double? |
— | Current numeric value |
Inherits all parameters from InputBase<double?> (Id, Name, Placeholder, Disabled, ReadOnly, Class).
The stepper buttons are disabled when the value reaches Min or Max. They are hidden when Disabled or ReadOnly is true.
DateInput
A date picker that combines a hidden <input type="date"> with a popover calendar. Users select dates through the calendar UI — the native date picker chrome is hidden.
<FormField Label="Birth Date" For="birthdate">
<DateInput Id="birthdate" Name="birthdate" Placeholder="Select your birth date" />
</FormField>
How it works
- A hidden
<input type="date">holds the actual form value inyyyy-MM-ddformat - A styled button trigger shows the selected date (or placeholder)
- Clicking the trigger opens a
Popovercontaining aCalendarcomponent - Selecting a day updates the hidden input and closes the popover
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
Value |
DateOnly? |
— | Currently selected date |
Min |
string? |
— | Minimum date |
Max |
string? |
— | Maximum date |
Placeholder |
string? |
"Select date" |
Trigger button placeholder |
Inherits all parameters from InputBase<DateOnly?>.
TimeInput
A time picker that combines a hidden <input type="time"> with a popover time picker. Features scrollable hour/minute columns and AM/PM toggle.
<FormField Label="Preferred Time" For="preferredtime">
<TimeInput Id="preferredtime" Name="preferredtime" />
</FormField>
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
Value |
TimeOnly? |
— | Currently selected time |
Step |
string? |
— | Minute step interval |
Use12Hour |
bool |
true |
12-hour format with AM/PM |
Placeholder |
string? |
"Select time" |
Trigger button placeholder |
Inherits all parameters from InputBase<TimeOnly?>.
DateTimeInput
Combines a date picker and time picker side by side for selecting both date and time. Internally manages a hidden <input type="datetime-local"> plus two helper hidden inputs for the date and time parts.
<FormField Label="Appointment" For="appointment">
<DateTimeInput Id="appointment" Name="appointment" />
</FormField>
How it works
- A hidden
<input type="datetime-local">holds the combined value inyyyy-MM-ddTHH:mmformat - Two helper hidden inputs hold the date-part and time-part separately
- Two popover triggers (calendar + time picker) are displayed side by side
- The
forms.jsmodule automatically combines the date-part and time-part values into the main hidden input
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
Value |
DateTime? |
— | Currently selected date and time |
Min |
string? |
— | Minimum datetime |
Max |
string? |
— | Maximum datetime |
Step |
string? |
— | Minute step interval |
Placeholder |
string? |
"Select date" |
Date trigger placeholder |
Inherits all parameters from InputBase<DateTime?>.
FormField
Wraps an input with a label, description, and error placeholder. The error element is used by htmx to display server-side validation messages.
<FormField Label="Email" For="email" Description="We'll never share your email.">
<TextInput Id="email" Name="email" Type="email" />
</FormField>
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
Label |
string? |
— | Label text rendered as <label> |
For |
string? |
— | Links the label to the input, and identifies the field for validation errors |
Description |
string? |
— | Helper text below the input |
Error |
string? |
— | Pre-set error message (for server-rendered errors) |
Class |
string? |
— | Additional CSS classes on the wrapper |
LabelClass |
string? |
— | Additional CSS classes on the label |
How validation errors are displayed
FormField renders a <p data-field-error="fieldname"> element. When htmx receives a validation response, it swaps this element with the server's HTML fragment (which includes or hides the error message). This is the core mechanism for per-field validation.
InputBase
All input components inherit from InputBase<TValue>, which provides:
- Common parameters:
Id,Name,Value,Placeholder,Disabled,ReadOnly,Class - Computed CSS: A consistent input style using Tailwind classes
- htmx auto-wiring: When
ValidationEndpointandFieldNamecascading values are present (provided byHtmxFormandFormField), the input automatically gets:hx-postpointing to the validation endpointhx-trigger="blur"for on-blur validationhx-target="next [data-field-error]"to update the error elementhx-swap="outerHTML"for full element replacementhx-include="this"to send only this input's valuehx-vals='{"_field": "fieldname"}'to identify which field is being validated