mantine
Build React applications with the Mantine UI component library. Use when a user asks to use Mantine components, configure themes, implement forms with validation, add notifications, or build responsive layouts with Mantine hooks.
Usage
Getting Started
- Install the skill using the command above
- Open your AI coding agent (Claude Code, Codex, Gemini CLI, or Cursor)
- Reference the skill in your prompt
- The AI will use the skill's capabilities automatically
Example Prompts
- "Review the open pull requests and summarize what needs attention"
- "Generate a changelog from the last 20 commits on the main branch"
Documentation
Overview
You are an expert in Mantine, the React component library with 100+ customizable components, 50+ hooks, and a CSS-in-JS styling solution. You help developers build polished UIs with form handling, notifications, modals, rich text editing, date pickers, and responsive layouts — all with excellent TypeScript support and accessibility.
Instructions
Setup
npm install @mantine/core @mantine/hooks @mantine/form @mantine/notifications
npm install @mantine/dates dayjs # Date components
npm install @mantine/tiptap @tiptap/react # Rich text editor
Theme and Provider
// src/App.tsx — Mantine theme configuration
import { MantineProvider, createTheme } from "@mantine/core";
import { Notifications } from "@mantine/notifications";
import "@mantine/core/styles.css";
import "@mantine/notifications/styles.css";
const theme = createTheme({
primaryColor: "indigo",
fontFamily: "Inter, system-ui, sans-serif",
defaultRadius: "md",
colors: {
brand: ["#f0f0ff", "#d6d6ff", "#b3b3ff", "#8080ff", "#4d4dff", "#1a1aff", "#0000e6", "#0000b3", "#000080", "#00004d"],
},
components: {
Button: { defaultProps: { variant: "filled" } },
TextInput: { defaultProps: { size: "md" } },
},
});
function App() {
return (
<MantineProvider theme={theme} defaultColorScheme="auto">
<Notifications position="top-right" />
<Router />
</MantineProvider>
);
}
Components
// Dashboard layout with Mantine components
import {
AppShell, Navbar, Header, Group, Text, Badge, Card,
SimpleGrid, Stack, Button, ActionIcon, Menu, Avatar,
Progress, Table, Tabs, Tooltip, ThemeIcon,
} from "@mantine/core";
import { useDisclosure } from "@mantine/hooks";
import { notifications } from "@mantine/notifications";
import { IconBell, IconSettings, IconLogout } from "@tabler/icons-react";
function Dashboard() {
const [navOpen, { toggle }] = useDisclosure(true);
return (
<AppShell
navbar={{ width: 260, breakpoint: "sm", collapsed: { mobile: !navOpen } }}
header={{ height: 60 }}
padding="md"
>
<AppShell.Header>
<Group h="100%" px="md" justify="space-between">
<Text size="xl" fw={700}>Dashboard</Text>
<Group>
<ActionIcon variant="subtle" size="lg">
<IconBell size={20} />
</ActionIcon>
<Menu>
<Menu.Target>
<Avatar src={null} alt="User" radius="xl" size="md" />
</Menu.Target>
<Menu.Dropdown>
<Menu.Item leftSection={<IconSettings size={14} />}>Settings</Menu.Item>
<Menu.Divider />
<Menu.Item color="red" leftSection={<IconLogout size={14} />}>Logout</Menu.Item>
</Menu.Dropdown>
</Menu>
</Group>
</Group>
</AppShell.Header>
<AppShell.Main>
<SimpleGrid cols={{ base: 1, sm: 2, lg: 4 }} spacing="md">
<StatsCard title="Revenue" value="$45,200" change="+12%" />
<StatsCard title="Users" value="1,234" change="+5%" />
<StatsCard title="Orders" value="892" change="+18%" />
<StatsCard title="Churn" value="2.1%" change="-0.3%" positive />
</SimpleGrid>
</AppShell.Main>
</AppShell>
);
}
Form Handling
// Mantine form with validation
import { useForm } from "@mantine/form";
import { TextInput, PasswordInput, Select, Checkbox, Button, Stack } from "@mantine/core";
function SignupForm() {
const form = useForm({
initialValues: { name: "", email: "", password: "", role: "", terms: false },
validate: {
name: (v) => (v.length < 2 ? "Name too short" : null),
email: (v) => (/^\S+@\S+$/.test(v) ? null : "Invalid email"),
password: (v) => (v.length < 8 ? "At least 8 characters" : null),
role: (v) => (v ? null : "Select a role"),
terms: (v) => (v ? null : "You must accept terms"),
},
});
return (
<form onSubmit={form.onSubmit((values) => console.log(values))}>
<Stack gap="sm">
<TextInput label="Name" placeholder="Your name" {...form.getInputProps("name")} />
<TextInput label="Email" placeholder="you@example.com" {...form.getInputProps("email")} />
<PasswordInput label="Password" {...form.getInputProps("password")} />
<Select
label="Role"
data={["Developer", "Designer", "Product Manager", "Other"]}
{...form.getInputProps("role")}
/>
<Checkbox label="I accept terms" {...form.getInputProps("terms", { type: "checkbox" })} />
<Button type="submit">Create Account</Button>
</Stack>
</form>
);
}
Hooks
// Mantine provides 50+ utility hooks
import {
useDisclosure, useToggle, useDebouncedValue, useLocalStorage,
useClipboard, useMediaQuery, useHotkeys, useIdle, useNetwork,
useDocumentTitle, useIntersection, useScrollIntoView,
} from "@mantine/hooks";
// Debounced search
const [search, setSearch] = useState("");
const [debounced] = useDebouncedValue(search, 300);
// Clipboard
const clipboard = useClipboard({ timeout: 2000 });
clipboard.copy("Hello!"); // clipboard.copied is true for 2 seconds
// Responsive
const isMobile = useMediaQuery("(max-width: 768px)");
// Keyboard shortcuts
useHotkeys([
["mod+K", () => openSearch()],
["mod+S", () => saveDocument()],
]);
// Local storage with type safety
const [colorScheme, setColorScheme] = useLocalStorage<"light" | "dark">({
key: "color-scheme",
defaultValue: "light",
});
Examples
Example 1: User asks to set up mantine
User: "Help me set up mantine for my project"
The agent should:
- Check system requirements and prerequisites
- Install or configure mantine
- Set up initial project structure
- Verify the setup works correctly
Example 2: User asks to build a feature with mantine
User: "Create a dashboard using mantine"
The agent should:
- Scaffold the component or configuration
- Connect to the appropriate data source
- Implement the requested feature
- Test and validate the output
Guidelines
- Use the form library —
@mantine/formhandles validation, touched state, and nested fields; don't build your own - Theme over inline styles — Configure component defaults in the theme; avoid prop-based styling on every instance
- Hooks for logic — Mantine's hooks library (
useDisclosure,useDebouncedValue,useLocalStorage) reduces boilerplate - AppShell for layouts — Use
AppShellfor dashboard layouts with navbar, header, aside; handles responsive collapsing - Notifications system — Use
@mantine/notificationsfor toast messages; supports queue, auto-close, and custom components - CSS modules — Mantine v7 uses CSS modules by default; import component styles and extend with your own
- Dark mode built-in — Use
defaultColorScheme="auto"for system preference detection; all components adapt - Tabler icons — Use
@tabler/icons-react(free, MIT) — Mantine is designed to work with Tabler's icon set
Information
- Version
- 1.0.0
- Author
- terminal-skills
- Category
- Development
- License
- Apache-2.0