Card
Card (카드)
Card 컴포넌트는 섹션으로 나눌 수 있는 카드 UI를 만드는 컴포넌트예요. Paper 컴포넌트를 감싸고 추가 스타일과 Card.Section 컴포넌트를 제공해요.
출처: 문서
본문
Card는 몇 가지 추가 스타일과 함께 Paper 컴포넌트를 감싸는 wrapper예요. 카드를 섹션으로 나눌 수 있게 해 주는 Card.Section 컴포넌트도 포함해요. 섹션이 필요 없다면 Paper 컴포넌트를 사용해도 돼요.
import { Card, Image, Text, Badge, Button, Group } from '@mantine/core';
function Demo() {
return (
<Card shadow="sm" padding="lg" withBorder>
<Card.Section>
<Image
src="https://raw.githubusercontent.com/mantinedev/mantine/master/.demo/images/bg-8.png"
height={160}
alt="Norway"
/>
</Card.Section>
<Group justify="space-between" mt="md" mb="xs">
<Text fw={500}>Norway Fjord Adventures</Text>
<Badge color="pink">On Sale</Badge>
</Group>
<Text size="sm" c="dimmed">
With Fjord Tours you can explore more of the magical fjord landscapes with tours and
activities on and around the fjords of Norway
</Text>
<Button color="blue" fullWidth mt="md">
Book classic tour now
</Button>
</Card>
);
}
가로 방향 (Horizontal orientation)
orientation="horizontal" prop을 설정하면 카드의 콘텐츠를 가로로 배치할 수 있어요.
import { Box, Card, Group, RingProgress, Text } from '@mantine/core';
const completed = 1887;
const total = 2334;
const stats = [
{ value: 447, label: 'Remaining' },
{ value: 76, label: 'In progress' },
];
function Demo() {
const items = stats.map((stat) => (
<div>
<Text>{stat.value}</Text>
<Text size="xs" c="dimmed">
{stat.label}
</Text>
</div>
));
return (
<Card padding="sm" withBorder orientation="horizontal">
<Card.Section inheritPadding px="xs" withBorder>
<RingProgress
roundCaps
thickness={6}
size={150}
sections={[{ value: (completed / total) * 100, color: 'blue' }]}
label={
<div>
<Text ta="center" fz="lg">
{((completed / total) * 100).toFixed(0)}%
</Text>
<Text ta="center" fz="xs" c="dimmed">
Completed
</Text>
</div>
}
/>
</Card.Section>
<Card.Section inheritPadding px="md">
<Text fz="xl">Project tasks</Text>
<Box mt="xs">
<Text>1887</Text>
<Text fz="xs" c="dimmed">
Completed
</Text>
</Box>
<Group mt="sm">{items}</Group>
</Card.Section>
</Card>
);
}
폴리모픽 컴포넌트
Card는 폴리모픽 컴포넌트라서 루트 요소를 바꿀 수 있어요.
import { Card, Image, Text } from '@mantine/core';
function Demo() {
return (
<Card
shadow="sm"
padding="xl"
component="a"
href="https://www.youtube.com/watch?v=dQw4w9WgXcQ"
target="_blank"
>
<Card.Section>
<Image
src="https://images.unsplash.com/photo-1579227114347-15d08fc37cae?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=2550&q=80"
h={160}
alt="No way!"
/>
</Card.Section>
<Text fw={500} size="lg" mt="md">
You've won a million dollars in cash!
</Text>
<Text mt="xs" c="dimmed" size="sm">
Please click anywhere on this card to claim your reward, this is not a fraud, trust us
</Text>
</Card>
);
}
Card.Section
Card.Section은 자식에서 Card의 패딩을 제거하면서 다른 요소는 가로 간격을 유지하게 해 주는 특수 컴포넌트예요. Card.Section은 다음과 같이 동작해요.
- 컴포넌트가 Card의 첫 번째 자식이면 위, 왼쪽, 오른쪽 마진이 음수예요
- Card의 마지막 자식이면 아래, 왼쪽, 오른쪽 마진이 음수예요
- 중간에 있으면 왼쪽과 오른쪽 마진만 음수예요
import { Card, Text } from '@mantine/core';
function Demo() {
return (
<Card padding="xl">
{/* top, right, left margins are negative – -1 * theme.spacing.xl */}
<Card.Section>First section</Card.Section>
{/* Content that is not inside Card.Section will have theme.spacing.xl spacing on all sides relative to Card */}
<Text>Some other content</Text>
{/* right, left margins are negative – -1 * theme.spacing.xl */}
<Card.Section>Middle section</Card.Section>
{/* bottom, right, left margins are negative – -1 * theme.spacing.xl */}
<Card.Section>Last section</Card.Section>
</Card>
);
}
주의: Card는 직접 자식을 매핑하는 방식에 의존하므로, Card.Section을 fragment나 다른 wrapper로 감싸면 안 돼요.
import { Card } from '@mantine/core';
function Demo() {
return (
<Card padding="xl">
<div>
<Card.Section>Won't work</Card.Section>
</div>
<>
<Card.Section>Won't work either</Card.Section>
</>
<Card.Section>Works fine</Card.Section>
</Card>
);
}
폴리모픽 Card.Section
Card.Section도 폴리모픽 컴포넌트라서 루트 요소를 바꿀 수 있어요.
import { Card, Image, Text, Badge, Button, Group } from '@mantine/core';
function Demo() {
return (
<Card shadow="sm" padding="lg" withBorder>
<Card.Section component="a" href="https://mantine.dev/">
<Image
src="https://raw.githubusercontent.com/mantinedev/mantine/master/.demo/images/bg-8.png"
height={160}
alt="Norway"
/>
</Card.Section>
<Group justify="space-between" mt="md" mb="xs">
<Text fw={500}>Norway Fjord Adventures</Text>
<Badge color="pink">On Sale</Badge>
</Group>
<Text size="sm" c="dimmed">
With Fjord Tours you can explore more of the magical fjord landscapes with tours and
activities on and around the fjords of Norway
</Text>
<Button color="blue" fullWidth mt="md">
Book classic tour now
</Button>
</Card>
);
}
withBorder와 inheritPadding prop
withBorderprop은 다른 콘텐츠·섹션과의 상대적 위치에 따라Card.Section에 위·아래 border를 추가해요inheritPaddingprop은Card컴포넌트에 설정된 것과 같은 왼쪽·오른쪽 패딩을Card.Section에 추가해요
import { ActionIcon, Card, Group, Image, Menu, SimpleGrid, Text } from '@mantine/core';
import { DotsThreeIcon, EyeIcon, FileZipIcon, TrashIcon } from '@phosphor-icons/react';
const images = [
'https://raw.githubusercontent.com/mantinedev/mantine/master/.demo/images/bg-1.png',
'https://raw.githubusercontent.com/mantinedev/mantine/master/.demo/images/bg-2.png',
'https://raw.githubusercontent.com/mantinedev/mantine/master/.demo/images/bg-3.png',
];
function Demo() {
return (
<Card withBorder shadow="sm">
<Card.Section withBorder inheritPadding py="xs">
<Group justify="space-between">
<Text fw={500}>Review pictures</Text>
<Menu withinPortal position="bottom-end" shadow="sm">
<Menu.Target>
<ActionIcon variant="subtle" color="gray">
<DotsThreeIcon size={16} />
</ActionIcon>
</Menu.Target>
<Menu.Dropdown>
<Menu.Item leftSection={<FileZipIcon size={14} />}>
Download zip
</Menu.Item>
<Menu.Item leftSection={<EyeIcon size={14} />}>
Preview all
</Menu.Item>
<Menu.Item
leftSection={<TrashIcon size={14} />}
color="red"
>
Delete all
</Menu.Item>
</Menu.Dropdown>
</Menu>
</Group>
</Card.Section>
<Text mt="sm" c="dimmed" size="sm">
<Text span inherit c="var(--mantine-color-anchor)">
200+ images uploaded
</Text>{' '}
since last visit, review them to select which one should be added to your gallery
</Text>
<Card.Section mt="sm">
<Image src="https://raw.githubusercontent.com/mantinedev/mantine/master/.demo/images/bg-4.png" />
</Card.Section>
<Card.Section inheritPadding mt="sm" pb="md">
<SimpleGrid cols={3}>
{images.map((image) => (
<Image src={image} key={image} radius="sm" />
))}
</SimpleGrid>
</Card.Section>
</Card>
);
}