Card
Molecule
A content surface, used three ways: a stat card (a single metric, a big number and a delta), a section card (a labeled surface with an optional eyebrow, header and footer), and the generic card that brings its own structure. It is the Canvas v4 panel: the card fill under a hairline at the card corner (16 px on the web, 12 natively), the small shadow at rest and the large one raised; flat drops the shadow and steps the fill up a surface, sunken drops the shadow and sinks the fill to the well beneath the page (surface-sunken, the hand-off's --bg2 tiles, stages and panels set into a card) under the hairline, and outlined drops the shadow and keeps the card fill under the hairline (the hand-off's page cards; a platform whose card control draws an outline instead of a shadow draws both the same), and heroShadow is the medium shadow (the hand-off's --sh-md, its section hero's stage), between the resting card and the raised one. Precedence is raised, flat, sunken, outlined, heroShadow. On Android sunken is the Material 3 filled card: the well's fill with no outline. A pressable card lifts 2 px on hover and takes the raised shadow. selected draws the primary border with a ring of the accent's soft wash around it.
Playground
Every control sets a real prop of CardProps. The JSX below updates as you go.
Web
iOS
Android
JSX · CardProps
Variants
16 examples from src/molecules/card/card.md, each rendered live from its own JSX.
States
Hover, focus and press are pinned so they can be compared side by side; the rest are real props.
Anatomy
1
Surface
2
Eyebrow
3
Title
4
Description
5
Badge
6
Footer
Dimmed parts appear only in some states or variants.
Props
92 props on CardProps, grouped as they are declared in source. Required props are marked *.
Accessibility and keyboard
Keyboard
Enter
Activates
Space
Activates
Tab
Moves focus on
Semantics
Roles
button
link
progressbar
text
States
busy
ARIA on web
aria-busy
aria-hidden
Below the platform minimum, the touch area grows to 44 pt on iOS and 48 dp on Android without moving the layout.
From the docs
Gap-free content densities preserve dense application layouts: dense (12), snug (18), cozy (20), relaxed (22×24), spacious (28), insetContent (14), rail (12×14), summary (14×16), metric (14×18), request (18/22/18/20), and menu (12 vertical). roomy sits between relaxed and spacious and keeps a rhythm: a 24 px inset with 20 px between flat children, the Canvas v4 section page's showcase card, the same on every platform. Precedence follows that order, then the page steps (panel, guide,
Platform skins
The playground's props on each platform: same tree, native shapes, type and touch sizes.
Usage
Corners (pick one; the smaller step wins): the card corner by default, smallCorners for the tile corner (12), and the three steps the hand-off's component page frames with, calloutCorners (14: a note under a table, a compact link tile), largeCorners (18: a card framing a section of a page) and stageCorners (20: a staging frame, a figure and its legend), and the two its section pages frame with, showcaseCorners (20: a section page's showcase card) and heroCorners (24: the section hero's stage). The web skin draws each from its row; the native skins keep their own card corner on every step but the tile.
A card with content is padded by default, and a padded surface also spaces its flat children (the card owns the vertical rhythm, so a stack of Typography lines needs no layout wrapper); pass flush to opt out of both, the inset and the spacing, for edge-to-edge content (a table, a nav bar) or when you compose the self-padding CardHeader/CardContent.
The section props (eyebrow / badge / title / description / icon / actions / footer) render self-padding sections, so a sectioned card needs no padded: a tracked mono eyebrow with a badge opposite, the 20 px title in the display face over its muted description, the body, and a footer under a hairline in the subtle ink. They compose with a string body OR with raw children, so a panel can carry a titled header above a table or a form; children win when both are passed. For a cover image, CardMedia is the full-bleed top slot: it spans the card edge to edge, its top corners follow the card's corner, and its bottom edge stays flat; compose it with flush and let CardContent pad the text below.
Tokens
Read from the playground render. Values follow the scheme and the ion hue.
--f-dp
--fd
--fm
--ft
--ion-tx
--ln
--ln2
--sf
--sf3
--sh-sm
--tx2
--tx3