6. Cards
Bounded containers that group related content. The most versatile primitive — and the most over-used. Every card costs a border, padding, and visual weight; reach for one only when grouping conveys meaning.
Gallery
Three configurations, all composed from the same five hooks: .card, .card-header, .card-body, .card-footer, .card-interactive.
Header for the title; body for the content; footer for actions or metadata. Each part is optional.
Body-only — no header or footer. For content cards where the surrounding context already provides the heading.
The entire card is the affordance — hover lifts it, click navigates. Use sparingly; only when the whole card points at one obvious action.
When to use each
Three composition decisions. Cards are about choices, not variants — most card abuse is using one when raw content would read more clearly.
Notifications
Manage how Titan tells you about runs, errors, and daily activity. Settings apply to your account only.
.card-interactive. Drift to avoid
Seven named anti-patterns. Cards are the easiest primitive to abuse precisely because they're so versatile.
- Don't wrap every paragraph in a cardPrinciple 5Cards aren't decoration. Each adds border, padding, and visual weight that competes with content. If a paragraph just continues the surrounding page, leave it as prose. Reach for a card only when grouping conveys meaning.
- Don't nest cards within cardsPrinciple 1A card inside a card means the inner content is wrapped in two layers of bordered scaffolding — borders, padding, and backgrounds compound. Flatten: either remove the inner card or remove the outer one. The hierarchy should come from spacing and headings, not stacked containers.
- Don't useUX
.card-interactivewithout a destinationHover state implies clickability. If the card hover-lifts but clicking does nothing — or only triggers an inner button's action — drop.card-interactive. A hover without a payoff is a broken affordance. - Don't mix card and non-card siblings at the same levelPrinciple 1Three sections on a page, two wrapped in cards and one not — the eye reads the unwrapped section as "different" even if the content is parallel. Pick one container pattern per level of hierarchy.
- Don't combine border + shadow + tinted backgroundPrinciple 1Pick one elevation mechanism. The canonical card uses border + surface color. Adding a shadow makes the card "lifted." Adding both shadow AND a colored background tint is three elevation signals stacked — read as visual noise.
- Don't duplicate the page section title in the card headerPrinciple 1If the page section is titled "Notifications" and contains one card titled "Notifications", drop the card header. The page title already names what this is. Saying it twice doesn't make it more findable; it makes the layout feel padded.
- Don't use a card as a fake buttonPrinciple 2If the entire card is meant to trigger one action with no other content, you don't want a card — you want a button. Use
.btn-secondaryor.btn-ghostsized appropriately. Cards are containers; buttons are actions.
Composition — workcell overview
Four cards arranged with intent. Three stat tiles up top (one interactive — it links to the runs list), one content card below it for recent activity. Each card earns its grouping; nothing is wrapped just because.
| Plate | Status | Owner | Updated |
|---|---|---|---|
| Plate-A03 | Ready | imad | 2 min ago |
| Plate-A04 | Running | df | 4 min ago |
| Plate-A05 | Stalled | imad | just now |
| Plate-B01 | Ready | jsmith | 12 min ago |