Inputs

Inputs collect text and structured values in forms, one shared anatomy of label, box, and hint spanning the single-line Input, its date, number, payment, tags, PIN, and file relatives, and the multiline TextArea.

Demo

Pick the component, then change the props and copy the result. The Input field’s type select carries the sheet’s full Type axis, mapping each name to its kit recipe: the composed types preview InputGroup with its addons, and the copied snippet carries the whole recipe, imports included. Controls that do not exist on the selected type leave the rail.

This is a hint text to help user.
Component
type
size
icon
import { Mail01 } from "@untitledui/icons"; import { Input } from "@/components/base/input/input"; <Input size="lg" label="Email" placeholder="olivia@untitledui.com" hint="This is a hint text to help user." icon={Mail01} />

The field fills its container

An Input is w-full: the demo bounds it at 320px for presentation, but the copied snippet carries no wrapper, so in your layout the field stretches to whatever holds it. Width is your container’s job, not a prop.

The family

One shared anatomy, label above box above hint, from four source directories: the core field and its composition parts, the structured relatives, and the form plumbing.

The components in this family, with their descriptions and import paths
ComponentDescriptionImport from
InputThe standard text field: label, placeholder, hint, icon, and shortcut in one prop-driven component.@/​components/​base/​input/​input
TextFieldReact Aria TextField wrapper that provides size and styling context to InputBase children.@/​components/​base/​input/​input
InputBaseThe bare input box: use inside TextField, InputGroup, or other field compositions.@/​components/​base/​input/​input
LabelField label with required indicator and optional tooltip.@/​components/​base/​input/​label
HintTextHelper or error text below a field, wired to it as description or error message.@/​components/​base/​input/​hint-text
InputGroupComposes an input with prefix text and leading or trailing addons.@/​components/​base/​input/​input-group
InputFileReady-made upload field: a read-only box and a button that both open the system file picker.@/​components/​base/​input/​input-file
InputDateDate field made of focusable calendar-aware segments.@/​components/​base/​input/​input-date
InputNumberNumeric field with stepper buttons, vertical or horizontal.@/​components/​base/​input/​input-number
PaymentInputCard-number field that formats digits and detects the card brand.@/​components/​base/​input/​input-payment
InputTagsMulti-value tag input; Enter commits the typed value.@/​components/​base/​input/​input-tags
InputTagsOuterInputTags variant rendering its tags below the box; the hint yields to the tag list.@/​components/​base/​input/​input-tags-outer
PinInputCompound one-time-code input: Root, Label, Group, Slot, Separator, Description.@/​components/​base/​input/​pin-input
TextAreaMultiline text field with label and hint, in 2 sizes.@/​components/​base/​textarea/​textarea
FormReact Aria Form wrapper: Enter submits, native validation surfaces.@/​components/​base/​form/​form
FileTriggerOpens the system file picker from any pressable child.@/​components/​base/​file-upload-trigger/​file-upload-trigger

This family is form-library agnostic

The directories used to carry hook-form.tsx, an upstream bridge to react-hook-form (HookForm and FormField) that nothing in the template consumed. The file and the dependency were both removed on 2026-08-17, the dependency because the pieces a real setup needs beside it — a schema library and a resolver — were never installed either, so it prepared nothing.

Pick a form approach when you build one

Every field here takes plain props: value, onChange, label, hint, isInvalid. That suits a server action posting a native form, react-hook-form with a schema, or both together, and nothing in the kit assumes one. Install the whole set at once when you choose, so the next reader finds a deliberate setup rather than an orphaned dependency.

Sizes

The 3 sizes. Box heights measure 36, 40, and 44px in the browser, matching the Figma sheet’s geometry exactly. The hint drops from text-sm to text-xs at sm; md and lg share their text scale and differ by padding.

Variants by size
smmdlg

Hover and focus states are live. Interact with any cell.

The code default is md, on five of the members

The upstream JSDoc claims sm is the default while the code destructures size = "md" in input.tsx, input-date.tsx, input-tags.tsx, input-tags-outer.tsx, and input-number.tsx. This page documents the code. The rest of the family is not affected: InputFile genuinely defaults to sm and its JSDoc agrees, and TextArea makes no @default claim at all.

The core field

What one Input can carry, all real props at md: a leading icon, a keyboard-shortcut badge, a help tooltip, a password visibility toggle, and the required indicator. The search form has no label, so the kit names it from the placeholder; treat that as the exception, not the pattern.

label and placeholder
icon
shortcut
tooltip
type password
isRequired

Compositions

The Figma sheet’s Examples frame, rebuilt cell for cell with kit parts. Each caption names the sheet’s variant, then the recipe that produces it: the dropdown and button addons come from NativeSelect and Button composed through InputGroup, rather than being input types of their own.

Input field

This is a hint text to help user.
Default: Input with icon and tooltip
This is a hint text to help user.
Leading dropdown: InputGroup and NativeSelect

$

This is a hint text to help user.
Leading text and trailing dropdown: prefix and NativeSelect
https://
This is a hint text to help user.
Leading text: InputGroup.Prefix addon
This is a hint text to help user.
Payment input: PaymentInput
Design
Marketing
This is a hint text to help user.
Tags inner: InputTags
Design
Marketing
Tags outer: InputTagsOuter
Date and time: InputDate with granularity
This is a hint text to help user.
Number counter horizontal: InputNumber
This is a hint text to help user.
Number counter vertical: InputNumber
4
6
8
0
This is a hint text to help user.
OTP: PinInput compact tier
SVG, PNG, JPG or GIF (max. 800×400px).
File upload: InputFile
This is a hint text to help user.
Trailing button: InputGroup and Button
Must be at least 8 characters.
Password: type password with a composed success hint

The success hint is composed, not built in

HintText knows two slots, description and error message. The sheet’s green check state has no kit prop, so the password cell above passes a composed node to hint, which is the honest way to reproduce it until a ruling adds one.

Textarea input field

This is a hint text to help user.
Default: TextArea with a label tooltip

Verification code input field

0
0
0
0
This is a hint text to help user.
Digits 4: PinInput display tier
0
0
0
0
0
0
This is a hint text to help user.
Digits 6: PinInput.Separator between groups

Structured fields

The rest of the family, all live. Each one keeps the label, hint, sizes, and state treatments of the core field and specializes the box: segments for dates, steppers for numbers, brand detection for cards, removable tags, code slots, a multiline surface, and a picker trigger.

https://
Shown on your public profile.
InputGroup, prefix addon
Start date
mmddyyyy
Segments, not freeform text.
InputDate
InputNumber, vertical steppers
InputNumber, horizontal steppers
The brand icon follows the number.
PaymentInput
design
docs
Enter commits the typed value.
InputTags
0
0
0
0
Enter the 4-digit code we sent to your phone.
PinInput
Write a short introduction.
TextArea
FileTrigger, any pressable child

States

Every treatment below is a real prop on a live field: isRequired, isDisabled, and isInvalid are the states the kit exposes. With a hint present, an invalid field renders that hint as its error message, recolored and wired to the input.

rest
isRequired
isDisabled
isInvalid
Use the name@company.com format.
isInvalid with hint

Focus cannot be forced from outside

The kit paints its focus ring from live focus, inside a render prop, and exports no style object to re-apply, so a static focus specimen would mean hand-copying styles this site refuses to do. Tab into any field above instead: focus is a 2px brand ring, or a 2px error ring when the field is invalid, measured in the browser.