Seamless integration between FormKit form handling and Nuxt UI components for Nuxt 4
FormKit Nuxt UI bridges the gap between FormKit's powerful form management and Nuxt UI's beautiful component library, providing a complete solution for building forms in Nuxt applications.
✨ 17 Input Components - Complete set of FormKit-wrapped Nuxt UI input components
nuxtUICheckbox- Single checkbox with label and descriptionnuxtUICheckboxGroup- Multiple checkbox selectionnuxtUIColorPicker- Color selection with multiple formatsnuxtUIInput- Text input with various types (text, email, password, etc.)nuxtUIInputDate- Date and time picker with range supportnuxtUIInputMenu- Dropdown menu with searchable optionsnuxtUIInputNumber- Number input with increment/decrement buttonsnuxtUIInputTags- Tag input with custom delimitersnuxtUIInputTime- Time picker with 12/24-hour formatnuxtUIListbox- Listbox for single/multiple selection with filtering (for use with transfer mode lucide icons must be installed additionally)nuxtUIPinInput- PIN/OTP entry componentnuxtUIRadioGroup- Radio button group for single selectionnuxtUISelect- Select dropdown with searchnuxtUISelectMenu- Advanced select with groupingnuxtUISlider- Range slider for numeric valuesnuxtUISwitch- Toggle switch for boolean statesnuxtUITextarea- Multi-line text input with autoresize
📊 6 Output Components - Display-only components for read-only data
nuxtUIOutputBoolean- Boolean display with custom iconsnuxtUIOutputDate- Formatted date/time displaynuxtUIOutputLink- URL display with navigationnuxtUIOutputList- List display with separators and badge stylesnuxtUIOutputNumber- Formatted number display (currency, percentage)nuxtUIOutputText- Styled text display with icons
🎯 Form Management - Powerful form utilities
FUDataEdit- Edit forms with schema-based configurationFUDataView- Read-only data display with schema supportFUDataDebug- Development tool for form debugging
🔧 Composables - Reusable form logic
useFormKitInput- Input component utilitiesuseFormKitOutput- Output component utilitiesuseFormKitRepeater- Repeatable form sectionsuseFormKitSchema- Schema-based form generation
🎨 Full Nuxt UI Integration - All components respect Nuxt UI theming
- Color modes (light/dark)
- Design tokens
- Accessibility features
- Responsive design
✅ TypeScript Support - Full type safety with IntelliSense ⚡ SSR Compatible - Works seamlessly with Nuxt's server-side rendering 🔄 Auto-imports - Components and composables auto-imported 📝 Validation - Built-in FormKit validation support
Install the module to your Nuxt application:
# Using pnpm (recommended)
pnpm add @sfxcode/nuxt-ui-formkit
# Using npm
npm install @sfxcode/nuxt-ui-formkit
# Using yarn
yarn add @sfxcode/nuxt-ui-formkitAdd the module to your nuxt.config.ts:
export default defineNuxtConfig({
modules: [
'@nuxt/ui',
'@sfxcode/nuxt-ui-formkit'
]
})That's it! You can now use FormKit Nuxt UI components in your Nuxt app ✨
<template>
<FormKit
type="form"
@submit="handleSubmit"
>
<FormKit
type="nuxtUIInput"
name="email"
label="Email Address"
placeholder="your.email@example.com"
validation="required|email"
/>
<FormKit
type="nuxtUIInput"
name="password"
input-type="password"
label="Password"
validation="required|length:8"
/>
<FormKit
type="nuxtUICheckbox"
name="terms"
label="I agree to the terms and conditions"
validation="accepted"
/>
<UButton type="submit">
Sign Up
</UButton>
</FormKit>
</template>
<script setup lang="ts">
const handleSubmit = (data: any) => {
console.log('Form submitted:', data)
}
</script><template>
<FUDataEdit
:data="formData"
:schema="userSchema"
@submit="handleSubmit"
/>
</template>
<script setup lang="ts">
const formData = ref({
name: '',
email: '',
age: 0,
subscribe: false
})
const userSchema = [
{
$formkit: 'nuxtUIInput',
name: 'name',
label: 'Full Name',
validation: 'required'
},
{
$formkit: 'nuxtUIInput',
name: 'email',
inputType: 'email',
label: 'Email',
validation: 'required|email'
},
{
$formkit: 'nuxtUIInputNumber',
name: 'age',
label: 'Age',
min: 0,
max: 120
},
{
$formkit: 'nuxtUISwitch',
name: 'subscribe',
label: 'Subscribe to newsletter'
}
]
const handleSubmit = (data: any) => {
console.log('Form submitted:', data)
}
</script><FormKit
type="nuxtUIInputNumber"
name="price"
label="Product Price"
:min="0"
:step="0.01"
:format-options="{
style: 'currency',
currency: 'USD'
}"
validation="required|min:0"
/><template>
<FUDataView
:data="userData"
:schema="displaySchema"
/>
</template>
<script setup lang="ts">
const userData = ref({
name: 'John Doe',
email: 'john@example.com',
price: 1234.56,
tags: ['Vue', 'Nuxt', 'TypeScript'],
isActive: true
})
const displaySchema = [
{
$formkit: 'nuxtUIOutputText',
name: 'name',
label: 'Name',
leadingIcon: 'i-heroicons-user'
},
{
$formkit: 'nuxtUIOutputLink',
name: 'email',
label: 'Email',
leadingIcon: 'i-heroicons-envelope'
},
{
$formkit: 'nuxtUIOutputNumber',
name: 'price',
label: 'Price',
formatOptions: {
style: 'currency',
currency: 'USD'
}
},
{
$formkit: 'nuxtUIOutputList',
name: 'tags',
label: 'Technologies',
listType: 'badge',
color: 'primary'
},
{
$formkit: 'nuxtUIOutputBoolean',
name: 'isActive',
label: 'Status',
trueValue: 'Active',
falseValue: 'Inactive'
}
]
</script>All components support their respective Nuxt UI component props plus FormKit-specific props like name, label, help, validation, etc.
Refer to the Nuxt UI documentation for component-specific props and the FormKit documentation for validation and form handling.
The playground includes comprehensive examples for all components:
- Checkbox
- CheckboxGroup
- ColorPicker
- Input
- InputDate
- InputMenu
- InputNumber
- InputTags
- InputTime
- Listbox
- PinInput
- RadioGroup
- Select
- SelectMenu
- Slider
- Switch
- Textarea
Local development setup
# Clone the repository
git clone https://github.com/sfxcode/nuxt-ui-formkit.git
cd nuxt-ui-formkit
# Install dependencies (using pnpm)
pnpm install
# Generate type stubs
pnpm dev:prepare
# Start development server with playground
pnpm dev
# Build the playground
pnpm dev:build
# Run ESLint
pnpm lint
# Run tests
pnpm test
pnpm test:watch
# Build the module
pnpm build
# Release new version
pnpm release- Nuxt 4.x
- Vue 3.x
- @nuxt/ui 4.3.0+
- @formkit/vue 1.x
- @formkit/nuxt 1.x
External Nuxt modules and applications can import FormKit definitions programmatically.
import { nuxtUIInputs, nuxtUIOutputs } from '@sfxcode/nuxt-ui-formkit/formkit'
// Use in FormKit config
export default defineFormKitConfig({
inputs: {
...nuxtUIInputs,
...nuxtUIOutputs,
},
})import {
nuxtUICheckboxDefinition,
nuxtUIInputDefinition,
nuxtUIListboxDefinition,
nuxtUISelectDefinition
} from '@sfxcode/nuxt-ui-formkit/definitions'
export default defineFormKitConfig({
inputs: {
nuxtUICheckbox: nuxtUICheckboxDefinition,
nuxtUIInput: nuxtUIInputDefinition,
nuxtUIListbox: nuxtUIListboxDefinition,
nuxtUISelect: nuxtUISelectDefinition,
},
})@sfxcode/nuxt-ui-formkit/formkit- All definitions + type augmentation@sfxcode/nuxt-ui-formkit/definitions- Definition objects only
For detailed usage examples, see EXTERNAL_USAGE.md.
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes using Conventional Commits (
git commit -m 'feat: add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
MIT License © 2024-present sfxcode
