mantine-form
Skill9.3k starsChanged 5 days agoApache-2.0View on GitHub
Build forms using @mantine/form. Use this skill when: (1) setting up a form with useForm, (2) adding validation rules, schema validation (zod, valibot, arktype) or async validation, (3) working with nested object or array fields, (4) sharing form state across components with createFormContext, (5) choosing between controlled and uncontrolled mode, (6) reading form values during render with form.useWatchValue, (7) using the standalone useField hook, or (8) any task involving useForm, getInputProps, onSubmit, insertListItem, or form validation.
1 other project uses a version of this.
Trending
Quiet since July.thin dataabout the whole repository
Most recently taken up by
- mantinedev/skillsword for word, first seen Oct 4, 2026
Who's talking about RostislavDugin/postgresus
- @its-me-rhk.bsky.social“🗄️ Postgresus — Alat open-source untuk monitoring & backup database PostgreSQL dengan antarmuka web. ⚡ …”Bluesky · Oct 30, 2025 · 3 likes
- Dokploy/templates“Postgresus template seems outdated – project renamed to Databasus”GitHub · Jan 19, 2026 · 1 reactions
- truenas/apps“[App Request]: Postgresus / Databasus”GitHub · Dec 19, 2025 · 1 reactions
- @mariuskimmina.com“"Postgresus" is just peak project naming (and it also seems really awesome) github.com/RostislavDug...”Bluesky · Dec 6, 2025 · 1 likes
- @harungecit.dev“PostgreSQL kullanıyorsan ama yedekleme & izleme seni yoruyorsa: 💡 Postgresus tam sana göre! 🕒 Otomatik …”Bluesky · Oct 30, 2025 · 1 likes
The biggest 5 of 10 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 10
Talked about on GitHub and Bluesky (10 times).
On GitHub · 7
- Jan 19, 2026Postgresus template seems outdated – project renamed to Databasus — Dokploy/templates1 reaction
- Dec 19, 2025[App Request]: Postgresus / Databasus — truenas/apps1 reaction
- Jul 14, 2026fix: add Databasus template (Postgresus was renamed upstream) — Dokploy/templates0 reactions · 1 comment
- Dec 11, 2025Redirect to https://postgresus.com/storages/google-oauth instead of my hosted Postgresus domain — databasus/databasus0 reactions · 2 comments
- Dec 7, 2025Email Notifier Password can't be empty when creating — databasus/databasus0 reactions · 2 comments
2 more on GitHub
- Nov 17, 2025Databasus — community-scripts/DevScripts0 reactions · 6 comments
- Sep 14, 2025Update PostgreSQL badge in README — pgmq/pgmq0 reactions
On Bluesky · 3
- Oct 30, 2025🗄️ Postgresus — Alat open-source untuk monitoring & backup database PostgreSQL dengan antarmuka web. ⚡ Fitur utama: jadwal backup,… — @its-me-rhk.bsky.social3 likes and reposts
- Dec 6, 2025"Postgresus" is just peak project naming (and it also seems really awesome) github.com/RostislavDug... — @mariuskimmina.com1 likes and repost
- Oct 30, 2025PostgreSQL kullanıyorsan ama yedekleme & izleme seni yoruyorsa: 💡 Postgresus tam sana göre! 🕒 Otomatik yedekler ☁️ S3, Drive, NAS desteği… — @harungecit.dev1 likes and repost
Other versions1 project uses a version of this.
Word for word · 1
- mantinedev/skills★ 63100% same
Edited · 0
None found.
Wrote their own version · 0
None found.
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository25 other files it gives its agents.
- AGENTS.mdAGENTS.md
- backend/AGENTS.mdAGENTS.md
- frontend/AGENTS.mdAGENTS.md
- website/AGENTS.mdAGENTS.md
- backend/CLAUDE.mdCLAUDE.md
- CLAUDE.mdCLAUDE.md
- frontend/CLAUDE.mdCLAUDE.md
- website/CLAUDE.mdCLAUDE.md
- api-designSkill
- client-tool-bundlesSkill
- feature-sliced-designSkill
- frontend-designSkill
- frontend-localizationSkill
- git-commitsSkill
- how-to-communicateSkill
- mantine-comboboxSkill
- mantine-custom-componentsSkill
- openspec-apply-changeSkill
- openspec-archive-changeSkill
- openspec-exploreSkill
- openspec-proposeSkill
- openspec-sync-specsSkill
- openspec-update-changeSkill
- run-appSkill
- testingSkill
The file
We split this skill into the rules it gives an agent
2 rules. About 0 are common, 1 is distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 186
If the references do not cover what you need, do not guess:
- Very specific: line 188
If the Mantine MCP server (@mantine/mcp-server) is connected, use search_docs and get_item_doc
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Mantine Form Skill
Written for Mantine 9.x.
Core Workflow
1. Set up the form
Uncontrolled mode is the recommended mode for all forms. The default is 'controlled', so set it explicitly.
const form = useForm({
mode: 'uncontrolled',
initialValues: {
email: '',
age: 0,
},
validate: {
email: isEmail('Invalid email'),
age: isInRange({ min: 18 }, 'Must be at least 18'),
},
});2. Wire inputs with getInputProps
In uncontrolled mode every input needs key={form.key('path')}. Without it the input does not
update after form.setFieldValue, form.setValues or form.reset.
<TextInput label="Email" key={form.key('email')} {...form.getInputProps('email')} />
<NumberInput label="Age" key={form.key('age')} {...form.getInputProps('age')} />Checkboxes and switches need { type: 'checkbox' }:
<Checkbox
label="I agree"
key={form.key('agreed')}
{...form.getInputProps('agreed', { type: 'checkbox' })}
/>Select, NumberInput, Radio.Group, Checkbox.Group and other Mantine inputs with a value /
onChange pair work with plain getInputProps and a key:
<Radio.Group label="Delivery" key={form.key('delivery')} {...form.getInputProps('delivery')}>
<Radio value="standard" label="Standard" />
<Radio value="express" label="Express" />
</Radio.Group>For standalone radios without Radio.Group, use form.getInputProps('color', { type: 'radio', value: 'red' })
and add key={form.key('color')} to each radio.
Components without an error prop (Slider, RangeSlider, Rating, SegmentedControl, Chip.Group)
need { withError: false }, and you render the error yourself:
<Slider key={form.key('stock')} {...form.getInputProps('stock', { withError: false })} />
{form.errors.stock && <Text c="red" size="sm">{form.errors.stock}</Text>}3. Handle submission
<form onSubmit={form.onSubmit((values) => console.log(values))}>
...
<Button type="submit">Submit</Button>
</form>onSubmit only calls the handler when validation passes. If the handler returns a promise,
form.submitting is true until it settles. To handle failures:
form.onSubmit(
(values, event) => save(values),
(errors, values, event) => console.log('Validation failed', errors) // { 'user.email': 'Invalid email' }
);Validation
Rules object (most common)
validate: {
name: isNotEmpty('Required'),
email: isEmail('Invalid email'),
password: hasLength({ min: 8 }, 'Min 8 chars'),
confirmPassword: matchesField('password', 'Passwords do not match'),
}Schema (zod, valibot, arktype and other Standard Schema libraries)
import { z } from 'zod/v4';
import { schemaResolver, useForm } from '@mantine/form';
const schema = z.object({
email: z.email({ error: 'Invalid email' }),
age: z.number().min(18, { error: 'Must be at least 18' }),
});
const form = useForm({
mode: 'uncontrolled',
initialValues: { email: '', age: 0 },
validate: schemaResolver(schema, { sync: true }),
});schemaResolver is built in: no resolver package is needed. Pass { sync: true } for
synchronous schemas so that form.validate() returns a plain result instead of a Promise.
Function (for cross-field logic)
validate: (values) => ({
endDate: values.endDate < values.startDate ? 'End must be after start' : null,
});When to validate
By default fields are validated on submit only.
validateInputOnChange: true, // also validate every field when it changes
validateInputOnChange: ['email'], // only the listed fields
validateInputOnBlur: ['email'], // same options, on blur
validateInputOnBlur: [`members.${FORM_INDEX}.email`], // list items, FORM_INDEX is exported from @mantine/formWith validation on blur, an error that appears when the user presses the submit button shifts the layout, and the click can miss the button. Keep the submit button in a place that does not move when errors appear (for example a footer with fixed position), or validate on change instead.
Modes
'uncontrolled' (recommended) | 'controlled' (default) | |
| Values storage | Ref | React state |
form.values | Not updated, use form.getValues() | Updated on every change |
| Re-renders on value change | No | Yes |
| Input props | defaultValue + onChange | value + onChange |
key={form.key(path)} on inputs | Required | Not needed |
What rerenders in uncontrolled mode
- Typing in an input does not rerender the form.
form.getValues()during render is not updated by typing. To show or hide part of the form based on a value, useform.useWatchValue(path). Nested paths work:form.useWatchValue('members.0.role').setFieldValue,setValues,insertListItem,removeListItem,reorderListItem,resetandinitializedo rerender, so rendering a list fromform.getValues().items.map(...)is correct.form.errors,form.isDirty(),form.isDirty('path'),form.isTouched(),form.submittingandform.validatingcan be used during render in both modes: the form rerenders when they change.
const shipsInternationally = form.useWatchValue('shipsInternationally');References
For anything beyond a basic form, read both references before writing code:
references/patterns.md— read for: reusing one form for different records (edit dialogs), focusing the first invalid field, more than one submit button, changing a value while the user types, nested objects, array fields, lists inside lists andformRootRule, async validation (rules and async schemas), conditional fields, conditional validation, multi-step forms, loading initial values from a server, saving and setting a new baseline, controlling a form from outside its component, custom inputs, form context across components,transformValues, standaloneuseField, server errors after submissionreferences/api.md— read for everything else. It is the only place that lists everyuseFormoption and return member (watch,onValuesChange,enhanceGetInputProps,resetField,clearFieldError,touchTriggerand others), plususeField,createFormContext,createFormActions,schemaResolver, built-in validators and types
Looking things up
If the references do not cover what you need, do not guess:
- If the Mantine MCP server (
@mantine/mcp-server) is connected, usesearch_docsandget_item_doc - Otherwise fetch
https://mantine.dev/llms.txtand open the linked form pages
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

