Input Components
Comprehensive list of all FormKit-wrapped Nuxt UI input components with schema-based examples.
Overview
Nuxt UI FormKit provides fully-featured input components. All examples below show schema-based usage - the recommended approach for building forms.
Schema-First
All components are designed to work seamlessly in schemas. Template usage is also supported but schemas are the recommended pattern.
Text Inputs
nuxtUIInput
Text input component supporting various input types (text, email, password, url, tel, number, search).
📖 Nuxt UI reference: Input
Schema Example:
const schema = [
{
$formkit: 'nuxtUIInput',
name: 'email',
label: 'Email Address',
inputType: 'email',
placeholder: 'your.email@example.com',
leadingIcon: 'i-lucide-mail',
validation: 'required|email'
}
]2
3
4
5
6
7
8
9
10
11
Full Example:
<template>
<FUDataEdit :data="data" :schema="schema" />
</template>
<script setup lang="ts">
const data = ref({ email: '' })
const schema = [
{
$formkit: 'nuxtUIInput',
name: 'email',
label: 'Email Address',
inputType: 'email',
placeholder: 'your.email@example.com',
leadingIcon: 'i-lucide-mail',
trailingIcon: 'i-lucide-check',
size: 'lg',
validation: 'required|email'
}
]
</script>2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Key Props:
inputType- HTML input type (text, email, password, url, tel, search)placeholder- Placeholder textleadingIcon- Icon before inputtrailingIcon- Icon after inputsize- Input size (xs, sm, md, lg, xl)
nuxtUITextarea
Multi-line text input with auto-resize functionality.
📖 Nuxt UI reference: Textarea
Schema Example:
const schema = [
{
$formkit: 'nuxtUITextarea',
name: 'message',
label: 'Message',
rows: 4,
autoresize: true,
placeholder: 'Enter your message...',
validation: 'required|length:10'
}
]2
3
4
5
6
7
8
9
10
11
nuxtUIInputNumber
Number input with increment/decrement buttons and formatting options.
📖 Nuxt UI reference: InputNumber
Schema Example:
const schema = [
{
$formkit: 'nuxtUIInputNumber',
name: 'price',
label: 'Price',
min: 0,
step: 0.01,
formatOptions: {
style: 'currency',
currency: 'USD'
},
validation: 'required|min:0'
}
]2
3
4
5
6
7
8
9
10
11
12
13
14
Key Props:
locale- BCP 47 locale used for number formatting (e.g.'de-DE')readonly- Render as read-only
Selection Components
nuxtUISelect
Dropdown select with search functionality.
📖 Nuxt UI reference: Select
Schema Example:
const schema = [
{
$formkit: 'nuxtUISelect',
name: 'country',
label: 'Country',
options: ['USA', 'UK', 'Canada', 'Australia'],
placeholder: 'Select a country',
validation: 'required'
}
]2
3
4
5
6
7
8
9
10
With Objects:
const schema = [
{
$formkit: 'nuxtUISelect',
name: 'role',
label: 'User Role',
options: [
{ label: 'Administrator', value: 'admin' },
{ label: 'Editor', value: 'editor' },
{ label: 'Viewer', value: 'viewer' }
]
}
]2
3
4
5
6
7
8
9
10
11
12
Key Props:
content- Positioning/behavior config for the dropdown content
nuxtUISelectMenu
Advanced select with grouping and multiple selection support.
📖 Nuxt UI reference: SelectMenu
Schema Example:
const schema = [
{
$formkit: 'nuxtUISelectMenu',
name: 'technologies',
label: 'Technologies',
multiple: true,
options: [
{
label: 'Frontend',
children: [
{ label: 'Vue', value: 'vue' },
{ label: 'React', value: 'react' },
{ label: 'Svelte', value: 'svelte' }
]
},
{
label: 'Backend',
children: [
{ label: 'Node.js', value: 'node' },
{ label: 'Python', value: 'python' },
{ label: 'Go', value: 'go' }
]
}
]
}
]2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Key Props:
size- Component sizecontent- Positioning/behavior config for the dropdown contentby- Key or comparator used to match the selected value
nuxtUIListbox
Listbox for single/multiple selection with filtering, plus a two-pane "transfer" mode for moving items between an available and a selected list.
📖 Nuxt UI reference: Listbox
Schema Example:
const schema = [
{
$formkit: 'nuxtUIListbox',
name: 'skills',
label: 'Skills',
multiple: true,
options: ['TypeScript', 'Vue', 'Nuxt', 'FormKit', 'TailwindCSS']
}
]2
3
4
5
6
7
8
9
Key Props:
options- Array of strings or{ label, value, description, icon, avatar, chip, disabled }objects (or nested arrays of these for grouped/labeled sections)multiple- Allow selecting more than one itemfilter- Show a search input to filter items (true, or an object ofUInputprops)by/valueKey- Key or comparator used to match the selected value againstoptionscolor- Component color
With Transfer Mode:
Set displayMode: 'transfer' to render a two-pane UI instead: an "available" list on the left and a "selected" list on the right, with v-model bound to the array of items on the right.
const schema = [
{
$formkit: 'nuxtUIListbox',
name: 'teamMembers',
label: 'Project Team',
displayMode: 'transfer',
options: employees,
filter: true,
transferLeftHeaderText: 'Available',
transferRightHeaderText: 'Selected',
transferAll: true,
transferSortIcons: true,
transferItemDraggable: true
}
]2
3
4
5
6
7
8
9
10
11
12
13
14
15
Items can be moved between the two panes either with the arrow buttons or by dragging — in either direction — and reordered within the "selected" pane by dragging or with the optional up/down icons. A precise insertion-line indicator (not a whole-row highlight) shows exactly where a dragged item will land.
Transfer Mode Props:
displayMode-'single'(default) or'transfer'transferLeftHeaderText/transferRightHeaderText- Optional header labels above each panetransferHeaderClass- CSS classes applied to both header labels (defaults to'text-sm font-medium text-highlighted')transferAll- Show "transfer all" / "remove all" buttons (the double-chevron buttons) in addition to the single-item transfer buttonstransferSortIcons- Show up/down chevron buttons on each item in the "selected" pane for reordering without dragging (off by default)transferItemDraggable- Make the whole row draggable, not just its grip handle (off by default — the grip handle is always draggable)
TIP
All the single-mode props above (options, multiple, filter, by/valueKey, orientation, virtualize, etc.) are also forwarded to both panes in transfer mode, except color, which currently only applies to single-select mode.
nuxtUIInputMenu
Dropdown menu with searchable options.
📖 Nuxt UI reference: InputMenu
Schema Example:
const schema = [
{
$formkit: 'nuxtUIInputMenu',
name: 'framework',
label: 'Framework',
options: ['Nuxt', 'Next.js', 'SvelteKit', 'Remix', 'Astro'],
placeholder: 'Search frameworks...'
}
]2
3
4
5
6
7
8
9
Key Props:
mode-'combobox'(default) or'autocomplete'content- Positioning/behavior config for the dropdown contentby- Key or comparator used to match the selected valueopen- Controlled open state of the menu
nuxtUITree
Hierarchical selection input for nested data — categories, org charts, file trees, permission trees.
📖 Nuxt UI reference: Tree
Schema Example:
const schema = [
{
$formkit: 'nuxtUITree',
name: 'category',
label: 'Category',
options: [
{
label: 'Electronics',
icon: 'i-lucide-cpu',
defaultExpanded: true,
children: [
{ label: 'Laptops' },
{ label: 'Phones' },
],
},
{
label: 'Clothing',
icon: 'i-lucide-shirt',
children: [
{ label: 'Men' },
{ label: 'Women' },
],
},
],
},
]2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
INFO
The field's value is the selected item only — whatever shape you gave that item in options (e.g. { label: 'Laptops' } above). Expanding/collapsing nodes is separate, uncontrolled UI state that never becomes part of the field's value, the same way FUSelectMenu's open/defaultOpen are plain display props rather than part of modelValue. Selecting a node and toggling its expanded state are also independent interactions — clicking a row does both at once, but keyboard ArrowLeft/ArrowRight toggles expand without changing the selection.
Key Props:
options- Array of{ label, icon, children, defaultExpanded, disabled, ... }objects;childrennests recursively to any depthmultiple- Allow selecting more than one item (the value becomes an array)labelKey- Key used to read each item's label (defaults to'label')nested- Render children inside their parent (true, default) vs. a flattened single-level listvirtualize- Enable virtualization for large trees (true, or{ overscan, estimateSize })expandedIcon/collapsedIcon/trailingIcon- Icons shown next to expandable parent nodesselectionBehavior-'toggle'or'replace'selection behavior
Boolean Inputs
nuxtUICheckbox
Single checkbox with label and description.
📖 Nuxt UI reference: Checkbox
Schema Example:
const schema = [
{
$formkit: 'nuxtUICheckbox',
name: 'terms',
label: 'I agree to the terms and conditions',
description: 'You must accept to continue',
validation: 'accepted'
}
]2
3
4
5
6
7
8
9
Key Props:
trueValue/falseValue- Custom values emitted for the checked / unchecked states
nuxtUICheckboxGroup
Multiple checkbox selection.
📖 Nuxt UI reference: CheckboxGroup
Schema Example:
const schema = [
{
$formkit: 'nuxtUICheckboxGroup',
name: 'interests',
label: 'Interests',
options: [
{ label: 'Technology', value: 'tech', description: 'Software and hardware' },
{ label: 'Design', value: 'design', description: 'UI/UX and graphics' },
{ label: 'Business', value: 'business', description: 'Strategy and growth' }
]
}
]2
3
4
5
6
7
8
9
10
11
12
Key Props:
name- Shared form control name for the group
nuxtUIRadioGroup
Radio button group for single selection.
📖 Nuxt UI reference: RadioGroup
Schema Example:
const schema = [
{
$formkit: 'nuxtUIRadioGroup',
name: 'plan',
label: 'Select Plan',
options: [
{
label: 'Free',
value: 'free',
description: 'Basic features for getting started'
},
{
label: 'Pro',
value: 'pro',
description: 'Advanced features for professionals'
},
{
label: 'Enterprise',
value: 'enterprise',
description: 'Full features with dedicated support'
}
],
validation: 'required'
}
]2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
nuxtUISwitch
Toggle switch for boolean values.
📖 Nuxt UI reference: Switch
Schema Example:
const schema = [
{
$formkit: 'nuxtUISwitch',
name: 'newsletter',
label: 'Subscribe to newsletter',
help: 'Get product updates and announcements'
}
]2
3
4
5
6
7
8
Key Props:
trueValue/falseValue- Custom values emitted for the on / off states
Specialized Inputs
nuxtUIInputDate
Date and time picker with range support.
📖 Nuxt UI reference: InputDate
Schema Example:
const schema = [
{
$formkit: 'nuxtUIInputDate',
name: 'eventDate',
label: 'Event Date',
enableTimePicker: false,
placeholder: 'Select date',
validation: 'required'
}
]2
3
4
5
6
7
8
9
10
With Time:
const schema = [
{
$formkit: 'nuxtUIInputDate',
name: 'appointment',
label: 'Appointment',
enableTimePicker: true,
placeholder: 'Select date and time'
}
]2
3
4
5
6
7
8
9
Working with JS Date or ISO strings:
By default the form value is a native @internationalized/date CalendarDate / CalendarDateTime / ZonedDateTime — the type UInputDate itself uses. If your form data instead holds a JS Date or an ISO 8601 string, set valueType to convert at the boundary in both directions. defaultValue, placeholder, defaultPlaceholder, minValue and maxValue accept the same types and are converted the same way.
const schema = [
{
$formkit: 'nuxtUIInputDate',
name: 'eventDate',
label: 'Event Date',
valueType: 'date', // 'calendar' (default) | 'date' | 'iso'
defaultValue: new Date(2026, 6, 5)
},
{
$formkit: 'nuxtUIInputDate',
name: 'isoDate',
label: 'ISO Date',
valueType: 'iso',
defaultValue: '2026-07-05'
}
]2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Key Props:
valueType-'calendar'(default),'date', or'iso'— the shape of the value read from and written to the formtimeZone- Timezone used when converting to/from'date'/'iso'; defaults to the local timezone
nuxtUIInputTime
Time picker with 12/24-hour format.
📖 Nuxt UI reference: InputTime
Schema Example:
const schema = [
{
$formkit: 'nuxtUIInputTime',
name: 'meetingTime',
label: 'Meeting Time',
placeholder: 'Select time'
}
]2
3
4
5
6
7
8
nuxtUIColorPicker
Color selection with multiple format support (hex, rgb, hsl).
📖 Nuxt UI reference: ColorPicker
Schema Example:
const schema = [
{
$formkit: 'nuxtUIColorPicker',
name: 'themeColor',
label: 'Theme Color',
mode: 'hex'
}
]2
3
4
5
6
7
8
nuxtUIInputTags
Tag input component with a custom delimiter.
📖 Nuxt UI reference: InputTags
Schema Example:
const schema = [
{
$formkit: 'nuxtUIInputTags',
name: 'tags',
label: 'Tags',
placeholder: 'Add tags...',
delimiter: ',',
help: 'Press comma to add a tag'
}
]2
3
4
5
6
7
8
9
10
Key Props:
delimiter- Character orRegExpused to split tags (e.g.',')
nuxtUIPinInput
PIN/OTP entry component.
📖 Nuxt UI reference: PinInput
Schema Example:
const schema = [
{
$formkit: 'nuxtUIPinInput',
name: 'pin',
label: 'Enter PIN',
length: 6,
type: 'number',
validation: 'required|length:6'
}
]2
3
4
5
6
7
8
9
10
Key Props:
type-'text'(default) or'number'separator- Insert a separator between inputs (index or list of indexes)
nuxtUIInputRating
Star-based rating input for numeric values.
📖 Nuxt UI reference: InputRating
Schema Example:
const schema = [
{
$formkit: 'nuxtUIInputRating',
name: 'satisfaction',
label: 'Satisfaction',
length: 5,
validation: 'required'
}
]2
3
4
5
6
7
8
9
Key Props:
length- Number of rating items to render (default5)step- Granularity of each rating item (1,0.5,0.25, or0.1)icon/emptyIcon- Custom icons for filled/empty statesclearable- Clicking the current value resets it to0hoverable- Preview the value under the pointer on hoverreadonly- Non-interactive display mode
nuxtUISlider
Range slider for numeric values.
📖 Nuxt UI reference: Slider
Schema Example:
const schema = [
{
$formkit: 'nuxtUISlider',
name: 'volume',
label: 'Volume',
min: 0,
max: 100,
step: 1
}
]2
3
4
5
6
7
8
9
10
nuxtUICalendar
Bare date-grid picker with day, month, and year views, supporting range and multiple selection.
📖 Nuxt UI reference: Calendar
Schema Example:
const schema = [
{
$formkit: 'nuxtUICalendar',
name: 'appointmentDate',
label: 'Appointment Date',
validation: 'required'
}
]2
3
4
5
6
7
8
With Range:
const schema = [
{
$formkit: 'nuxtUICalendar',
name: 'vacationRange',
label: 'Vacation Dates',
range: true
}
]2
3
4
5
6
7
8
Working with JS Date or ISO strings:
By default the form value is a native @internationalized/date DateValue (or { start, end } / an array of those for range/multiple mode) — the type UCalendar itself uses. Set valueType to convert to/from a JS Date or an ISO 8601 string at the boundary, in both directions. Works the same for single, range, and multiple selection.
const schema = [
{
$formkit: 'nuxtUICalendar',
name: 'appointmentDate',
label: 'Appointment Date',
valueType: 'date', // 'calendar' (default) | 'date' | 'iso'
defaultValue: new Date(2026, 6, 5)
}
]2
3
4
5
6
7
8
9
Key Props:
type-'date'(default),'month', or'year'picker viewrange- Enable selecting a start/end date rangemultiple- Enable selecting multiple individual datescolor- Theme color for the selected date(s)size-'xs' | 'sm' | 'md' | 'lg' | 'xl'- controls cell/font size, not the overall footprintvalueType-'calendar'(default),'date', or'iso'— the shape of the value read from and written to the formtimeZone- Timezone used when converting to/from'date'/'iso'; defaults to the local timezone
TIP
The calendar grid fills its container by default (matching Nuxt UI's own UCalendar). Add a width class via class on the schema entry (e.g. class: 'w-1/2') to control how much space it takes up.
nuxtUIFileUpload
Drag/drop and click-to-browse file input with previews.
📖 Nuxt UI reference: FileUpload
Schema Example:
const schema = [
{
$formkit: 'nuxtUIFileUpload',
name: 'attachment',
label: 'Attachment',
accept: 'image/*',
validation: 'required'
}
]2
3
4
5
6
7
8
9
With Multiple Files:
const schema = [
{
$formkit: 'nuxtUIFileUpload',
name: 'documents',
label: 'Documents',
multiple: true,
layout: 'grid'
}
]2
3
4
5
6
7
8
9
Key Props:
multiple- Allow selecting more than one fileaccept- Comma-separated MIME types or extensions (e.g.'image/png,.pdf')layout-'list'(default) or'grid'— only applies whenvariantis'area'position-'outside'(default) or'inside'— file list position relative to the dropzonevariant-'area'(default) or'button'—'button'only works whenmultipleisfalse
nuxtUIEditor
Tiptap-based rich text editor with a built-in formatting toolbar.
📖 Nuxt UI reference: Editor
Schema Example:
const schema = [
{
$formkit: 'nuxtUIEditor',
name: 'body',
label: 'Post Body',
contentType: 'html',
validation: 'required'
}
]2
3
4
5
6
7
8
9
With Markdown:
const schema = [
{
$formkit: 'nuxtUIEditor',
name: 'notes',
label: 'Notes',
contentType: 'markdown'
}
]2
3
4
5
6
7
8
With Custom Toolbar Items:
const schema = [
{
$formkit: 'nuxtUIEditor',
name: 'summary',
label: 'Summary',
toolbarItems: [
[{ kind: 'undo', icon: 'i-lucide-undo' }, { kind: 'redo', icon: 'i-lucide-redo' }],
[{ kind: 'mark', mark: 'bold', icon: 'i-lucide-bold' }, { kind: 'mark', mark: 'italic', icon: 'i-lucide-italic' }]
]
}
]2
3
4
5
6
7
8
9
10
11
Key Props:
contentType-'html','markdown', or'json'— auto-inferred from the value when unsetplaceholder- Placeholder text shown in empty paragraphs, or an object with amode: 'firstLine' | 'everyLine'markdown- Options for markdown parsing/serializationimage- Enable/configure the image extension (falseto disable)mention- Enable/configure the mention extension (falseto disable)extensions- Array of additional Tiptap extensions (e.g.Underline,Emoji) to register alongside the defaultstoolbar- Set tofalseto hide the built-in formatting toolbar entirelytoolbarItems- Override the default toolbar item groups (undo/redo, headings, marks, lists/blocks) — see Nuxt UI'sEditorToolbarItemfor the fullkindlisteditorHandlers- Custom handler overrides for toolbar item behavior (renamed from Nuxt UI'shandlersprop to avoid colliding with FormKit's owncontext.handlers)
WARNING
Unlike every other input, nuxtUIEditor has no color, variant, size, or disabled prop — it's a Tiptap options wrapper, not a themed Nuxt UI form control. FormKit's disabled state is mapped to Tiptap's editable option instead (the editor becomes read-only rather than visually "disabled").
Complete Form Example
Here's a comprehensive example using multiple input types:
<template>
<FUDataEdit
:data="profileData"
:schema="profileSchema"
@data-saved="saveProfile"
/>
</template>
<script setup lang="ts">
const profileData = ref({
name: '',
email: '',
phone: '',
bio: '',
age: 25,
country: '',
role: '',
skills: [],
plan: 'free',
notifications: true,
newsletter: false
})
const profileSchema = [
{
$el: 'h3',
children: 'Personal Information',
attrs: { class: 'text-xl font-bold mb-4' }
},
{
$formkit: 'nuxtUIInput',
name: 'name',
label: 'Full Name',
validation: 'required'
},
{
$formkit: 'nuxtUIInput',
name: 'email',
inputType: 'email',
label: 'Email',
validation: 'required|email'
},
{
$formkit: 'nuxtUIInput',
name: 'phone',
inputType: 'tel',
label: 'Phone'
},
{
$formkit: 'nuxtUITextarea',
name: 'bio',
label: 'Bio',
rows: 3
},
{
$el: 'h3',
children: 'Additional Details',
attrs: { class: 'text-xl font-bold mt-6 mb-4' }
},
{
$formkit: 'nuxtUIInputNumber',
name: 'age',
label: 'Age',
min: 13,
max: 120
},
{
$formkit: 'nuxtUISelect',
name: 'country',
label: 'Country',
options: ['USA', 'UK', 'Canada', 'Australia']
},
{
$formkit: 'nuxtUISelectMenu',
name: 'skills',
label: 'Skills',
multiple: true,
options: ['Vue', 'Nuxt', 'TypeScript', 'FormKit']
},
{
$formkit: 'nuxtUIRadioGroup',
name: 'plan',
label: 'Plan',
options: [
{ label: 'Free', value: 'free' },
{ label: 'Pro', value: 'pro' }
]
},
{
$el: 'h3',
children: 'Preferences',
attrs: { class: 'text-xl font-bold mt-6 mb-4' }
},
{
$formkit: 'nuxtUISwitch',
name: 'notifications',
label: 'Enable notifications'
},
{
$formkit: 'nuxtUICheckbox',
name: 'newsletter',
label: 'Subscribe to newsletter'
}
]
const saveProfile = async (data: any) => {
await $fetch('/api/profile', { method: 'PUT', body: data })
}
</script>2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
Template Usage (Alternative)
While schemas are recommended, template-based usage is also supported:
<FormKit
type="nuxtUIInput"
name="email"
label="Email"
input-type="email"
validation="required|email"
/>2
3
4
5
6
7
Recommendation
Use schemas for better maintainability and type safety. Use templates only for simple forms or when you need fine-grained layout control.
Common Props
All input components support:
name(required) - Field name for form datalabel- Field label texthelp- Help text below fieldplaceholder- Placeholder textvalidation- Validation rulesdisabled- Disable the inputsize- Component size
Next Steps
👁️ Output Components
Display-only components with schemas
View Output Components →
🔄 Repeater
Dynamic repeatable sections in schemas
Learn About Repeaters →
💡 Examples
Real-world schema-based forms
Browse Examples →