⚠️ Work in Progress: This project is under active development. APIs, components, and features may change without notice. While the core functionality is stable, expect breaking changes in minor versions until v1.0.0 is released. Use with caution in production environments.
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.
✨ 16 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 formatnuxtUIPinInput- 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
- 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,
nuxtUISelectDefinition
} from '@sfxcode/nuxt-ui-formkit/definitions'
export default defineFormKitConfig({
inputs: {
nuxtUICheckbox: nuxtUICheckboxDefinition,
nuxtUIInput: nuxtUIInputDefinition,
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
