.agents/skills/mantine-form/SKILL.md
Build forms using @mantine/form in the mantine-9 repository. Use this skill when: (1) setting up a form with useForm, (2) adding validation rules or async validation, (3) working with nested object or array fields, (4) sharing form state across components with createFormContext, (5) using uncontrolled mode for performance, (6) using the standalone useField hook, or (7) any task involving useForm, getInputProps, onSubmit, insertListItem, or form validation.
npx skillsauth add usebondery/bondery mantine-formInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
const form = useForm({
mode: 'controlled', // or 'uncontrolled' for large forms
initialValues: {
email: '',
age: 0,
},
validate: {
email: isEmail('Invalid email'),
age: isInRange({ min: 18 }, 'Must be at least 18'),
},
});
<TextInput {...form.getInputProps('email')} label="Email" />
<NumberInput {...form.getInputProps('age')} label="Age" />
For checkboxes pass { type: 'checkbox' }:
<Checkbox {...form.getInputProps('agreed', { type: 'checkbox' })} label="I agree" />
<form onSubmit={form.onSubmit((values) => console.log(values))}>
...
<Button type="submit">Submit</Button>
</form>
onSubmit only calls the handler when validation passes. To handle failures:
form.onSubmit(
(values) => save(values),
(errors) => console.log('Validation failed', errors)
)
validate: {
name: isNotEmpty('Required'),
email: isEmail('Invalid email'),
password: hasLength({ min: 8 }, 'Min 8 chars'),
confirmPassword: matchesField('password', 'Passwords do not match'),
}
validate: (values) => ({
endDate: values.endDate < values.startDate ? 'End must be after start' : null,
})
validateInputOnChange: true, // validate all fields on every change
validateInputOnChange: ['email'], // validate specific fields only
validateInputOnBlur: true, // validate on blur instead
| Mode | State storage | Re-renders | Input props |
|---|---|---|---|
| 'controlled' (default) | React state | On every change | value + onChange |
| 'uncontrolled' | Refs | None | defaultValue + onChange |
In uncontrolled mode, use form.key('fieldPath') as the React key prop when you need to force a re-render of an input.
references/api.md — Full API: useForm options, complete return value, useField, createFormContext, createFormActions, all built-in validators, key typesreferences/patterns.md — Code examples: nested objects, array fields, async validation, form context across components, transformValues, useField standalonedevelopment
Review UI code for Web Interface Guidelines compliance. Use when asked to "review my UI", "check accessibility", "audit design", "review UX", or "check my site against best practices".
development
React and Next.js performance optimization guidelines from Vercel Engineering. This skill should be used when writing, reviewing, or refactoring React/Next.js code to ensure optimal performance patterns. Triggers on tasks involving React components, Next.js pages, data fetching, bundle optimization, or performance improvements.
data-ai
Postgres performance optimization and best practices from Supabase. Use this skill when writing, reviewing, or optimizing Postgres queries, schema designs, or database configurations.
development
When the user wants to audit, review, or diagnose SEO issues on their site. Also use when the user mentions "SEO audit," "technical SEO," "why am I not ranking," "SEO issues," "on-page SEO," "meta tags review," or "SEO health check." For building pages at scale to target keywords, see programmatic-seo. For adding structured data, see schema-markup.