Headless, type-safe form management library. Use when building forms with validation, handling form state, working with array fields, or integrating forms in React, Vue, Angular, Solid, Svelte, or Lit.
View on GitHuberalmansouri/tanstack-claude-plugin
forms
skills/forms/SKILL.md
January 22, 2026
Select agents to install to:
npx add-skill https://github.com/eralmansouri/tanstack-claude-plugin/blob/main/skills/forms/SKILL.md -a claude-code --skill tanstack-formInstallation paths:
.claude/skills/tanstack-form/# TanStack Form
Headless, type-safe form management for React, Vue, Angular, Solid, Svelte, and Lit.
## Installation
```bash
npm install @tanstack/react-form # React
npm install @tanstack/vue-form # Vue
npm install @tanstack/angular-form # Angular
npm install @tanstack/solid-form # Solid
npm install @tanstack/svelte-form # Svelte
npm install @tanstack/lit-form # Lit
```
Requires TypeScript >=5.4 with `strict: true` in tsconfig.
## Quick Start (React)
```tsx
import { useForm } from '@tanstack/react-form'
function MyForm() {
const form = useForm({
defaultValues: { email: '', password: '' },
onSubmit: async ({ value }) => {
console.log(value)
},
})
return (
<form onSubmit={(e) => { e.preventDefault(); form.handleSubmit() }}>
<form.Field name="email">
{(field) => (
<input
value={field.state.value}
onChange={(e) => field.handleChange(e.target.value)}
onBlur={field.handleBlur}
/>
)}
</form.Field>
<form.Field name="password">
{(field) => (
<input
type="password"
value={field.state.value}
onChange={(e) => field.handleChange(e.target.value)}
onBlur={field.handleBlur}
/>
)}
</form.Field>
<button type="submit" disabled={!form.state.canSubmit}>Submit</button>
</form>
)
}
```
## Field Validation
```tsx
<form.Field
name="email"
validators={{
onChange: ({ value }) =>
!value.includes('@') ? 'Invalid email' : undefined,
onBlur: ({ value }) =>
!value ? 'Email is required' : undefined,
}}
>
{(field) => (
<>
<input
value={field.state.value}
onChange={(e) => field.handleChange(e.target.value)}
onBlur={field.handleBlur}
/>
{field.state.meta.errors.length > 0 && (
<span>{field.state.meta.errors.join(', ')}</span>
)}
</>
)}
</form.Field>
```
### ValidaIssues Found: