5.9 KiB
5.9 KiB
Components Reference
@mantine/core provides 120+ components. This reference covers key patterns.
Layout Components
Container, Stack, Group, Flex
import { Container, Stack, Group, Flex } from '@mantine/core';
<Container size="md">{/* Centers content, max-width */}</Container>
<Stack gap="md">{/* Vertical flex */}</Stack>
<Group gap="sm" justify="space-between">{/* Horizontal flex */}</Group>
<Flex direction="column" gap="md" align="center">{/* Generic flex */}</Flex>
Grid & SimpleGrid
import { Grid, SimpleGrid } from '@mantine/core';
// CSS Grid with responsive spans
<Grid>
<Grid.Col span={{ base: 12, sm: 6, lg: 4 }}>Responsive</Grid.Col>
</Grid>
// Equal-width columns
<SimpleGrid cols={{ base: 1, sm: 2, lg: 4 }}>{/* Items */}</SimpleGrid>
Button Variants
import { Button, ActionIcon } from '@mantine/core';
<Button variant="filled">Default</Button>
<Button variant="outline">Outline</Button>
<Button variant="light">Light</Button>
<Button variant="subtle">Subtle</Button>
<Button variant="white">White</Button>
<Button loading>Loading state</Button>
<Button leftSection={<IconPlus />}>With Icon</Button>
// Icon button
<ActionIcon variant="filled" color="blue"><IconSettings /></ActionIcon>
Inputs Pattern
All inputs follow consistent API:
import { TextInput, PasswordInput, Textarea, NumberInput, Select } from '@mantine/core';
// Common props: label, description, error, required, placeholder
<TextInput
label="Email"
description="We won't share it"
error="Invalid email"
required
withAsterisk
/>
<Select
label="Country"
data={['USA', 'Canada']}
searchable
clearable
/>
// Objects with value/label
<Select data={[{ value: 'us', label: 'United States' }]} />
Overlays Pattern
Modals, Drawers, Menus, Popovers all use similar pattern:
import { Modal, Drawer, Menu, Popover } from '@mantine/core';
import { useDisclosure } from '@mantine/hooks';
// Common pattern with useDisclosure
const [opened, { open, close }] = useDisclosure(false);
// Modal
<Modal opened={opened} onClose={close} title="Title">Content</Modal>
// Drawer
<Drawer opened={opened} onClose={close} position="left">Navigation</Drawer>
// Menu (dropdown)
<Menu>
<Menu.Target><Button>Toggle</Button></Menu.Target>
<Menu.Dropdown>
<Menu.Item leftSection={<IconSettings />}>Settings</Menu.Item>
<Menu.Divider />
<Menu.Item color="red">Delete</Menu.Item>
</Menu.Dropdown>
</Menu>
// Popover
<Popover width={200} withArrow>
<Popover.Target><Button>Info</Button></Popover.Target>
<Popover.Dropdown>Details here</Popover.Dropdown>
</Popover>
Feedback Components
import { Loader, Alert, Notification, Progress, Skeleton } from '@mantine/core';
<Loader type="bars" /> // oval, bars, dots
<Alert variant="light" color="blue" title="Info">Message</Alert>
<Notification title="Success" color="green" icon={<IconCheck />}>
Saved!
</Notification>
<Progress value={65} />
<Progress.Root size="xl">
<Progress.Section value={35} color="cyan"><Progress.Label>Docs</Progress.Label></Progress.Section>
</Progress.Root>
// Loading placeholders
<Skeleton height={50} circle />
<Skeleton height={8} radius="xl" />
Typography
import { Title, Text, Anchor, Highlight, Code } from '@mantine/core';
<Title order={1}>h1 heading</Title>
<Title order={2} c="dimmed">h2 dimmed</Title>
<Text size="sm" c="dimmed" fw={700}>Small bold dimmed</Text>
<Text truncate>Long text...</Text>
<Text lineClamp={2}>Multi-line truncate...</Text>
<Highlight highlight={['react', 'mantine']}>
Learn React with Mantine
</Highlight>
<Code>inline</Code>
<Code block>{`const x = 1;`}</Code>
Data Display
import { Badge, Card, Table, Avatar, Image, Tabs, Accordion } from '@mantine/core';
// Badge variants
<Badge>Default</Badge>
<Badge variant="dot" color="red">Dot</Badge>
// Card with sections
<Card shadow="sm" padding="lg" withBorder>
<Card.Section><Image src="/img.jpg" height={160} /></Card.Section>
<Text>Content</Text>
</Card>
// Table
<Table striped highlightOnHover withTableBorder>
<Table.Thead><Table.Tr><Table.Th>Name</Table.Th></Table.Tr></Table.Thead>
<Table.Tbody><Table.Tr><Table.Td>John</Table.Td></Table.Tr></Table.Tbody>
</Table>
// Tabs
<Tabs defaultValue="tab1">
<Tabs.List>
<Tabs.Tab value="tab1">First</Tabs.Tab>
<Tabs.Tab value="tab2">Second</Tabs.Tab>
</Tabs.List>
<Tabs.Panel value="tab1">Content 1</Tabs.Panel>
</Tabs>
// Accordion
<Accordion defaultValue="item-1">
<Accordion.Item value="item-1">
<Accordion.Control>Section 1</Accordion.Control>
<Accordion.Panel>Content</Accordion.Panel>
</Accordion.Item>
</Accordion>
Navigation
import { NavLink, Pagination, Stepper, Breadcrumbs } from '@mantine/core';
<NavLink href="#" label="Dashboard" leftSection={<IconHome />} active />
<NavLink label="Settings">
<NavLink label="General" />
<NavLink label="Security" />
</NavLink>
<Pagination total={10} value={page} onChange={setPage} />
<Stepper active={active}>
<Stepper.Step label="Step 1">Content 1</Stepper.Step>
<Stepper.Step label="Step 2">Content 2</Stepper.Step>
<Stepper.Completed>Done!</Stepper.Completed>
</Stepper>
Common Style Props
All components accept these props:
<Component
// Margin & Padding
m="md" mt="xs" p="sm" px="md"
// Colors
c="dimmed" bg="blue.1"
// Typography
fw={500} fz="sm"
// Dimensions
w={200} h="100%" maw={500}
// Responsive
p={{ base: 'xs', sm: 'md', lg: 'xl' }}
/>
Polymorphic Components
Render as different elements:
import { Button } from '@mantine/core';
import { Link } from 'react-router-dom';
<Button component={Link} to="/about">Link Button</Button>
<Button component="a" href="https://example.com">Anchor Button</Button>
Visibility Props
<Text hiddenFrom="sm">Hidden on sm+</Text>
<Text visibleFrom="md">Visible on md+</Text>
<Text lightHidden>Only in dark mode</Text>
<Text darkHidden>Only in light mode</Text>