Skip to content

Card

A themed container built on Surface with opinionated content defaults. Minimum padding is sm (8px) — a card with no padding isn’t a card, it’s a plain view.

When to use: Any contained content block that visually separates from the page background — profile cards, summary cards, feature tiles, list group containers.

When not to use: When you don’t need a visible container — use a bare View. For settings/preference rows — use SettingsGroup. For full-screen layout — use a template.

import { Card } from '@/components';
<Card padding="md" border>
<Heading level={3}>Account Summary</Heading>
<Text color="secondary">Balance: $1,240.00</Text>
</Card>
PropTypeDefaultDescription
padding'sm' | 'md' | 'lg' | 'xl''md'Internal padding (minimum 'sm')
borderbooleanfalseAdds thin border in theme.colors.border
isElevatedbooleanfalseAdds theme.shadow.md
onPress() => voidMakes the card pressable
accessibilityLabelstringRequired when onPress is set
childrenReactNodeCard content
testIDstringFor testing
ValueSpacing
sm8px
md16px
lg24px
xl32px
<Card
padding="md"
border
onPress={() => router.push(`/invoices/${invoice.id}`)}
accessibilityLabel={`Invoice ${invoice.number}${invoice.amount}`}
>
<Text variant="label" weight="semibold">{invoice.number}</Text>
<Text color="secondary">{invoice.amount}</Text>
</Card>

Do: Use accessibilityLabel whenever onPress is set.

<Card onPress={open} accessibilityLabel="View account details">...</Card>

Don’t: Use padding 'none' — it was removed in Session 5.3 (ADR). Minimum is 'sm'.

  • Surface — lower-level container without content defaults
  • SettingsGroup — card-style container for settings rows