Task: Card (Base) Component
Type: Component
Milestone: M0.5 — Shared Component Library
Estimate: S
Component Type
Props Interface
interface CardProps {
children: ReactNode;
variant?: 'default' | 'danger' | 'warning' | 'success' | 'info';
padding?: 'none' | 'sm' | 'md' | 'lg';
className?: string;
testId?: string;
}
Variants / States
| Variant / State |
Description |
default |
Neutral border, --bg-primary background |
danger |
--bg-danger background, --border-danger border |
warning |
--bg-warning background, --border-warning border |
success |
--bg-success background, --border-success border |
info |
--bg-info background, --border-info border |
padding="none" |
No padding — caller controls spacing completely |
padding="sm" |
Compact — dense lists, mobile |
padding="md" |
Default — desktop queue, panels |
padding="lg" |
Spacious — analytics panels, standalone sections |
Acceptance Criteria
Notes
- This is the base — it is a styled box and nothing more. No slots, no click behaviour, no expand logic. Those belong in
ListCard.
MetricCard, AnalyticsPanel, ContentPreviewBox compose this directly
ListCard extends this — validate the className forwarding works before ListCard ticket starts
Task: Card (Base) Component
Type: Component
Milestone: M0.5 — Shared Component Library
Estimate: S
Component Type
Props Interface
Variants / States
default--bg-primarybackgrounddanger--bg-dangerbackground,--border-dangerborderwarning--bg-warningbackground,--border-warningbordersuccess--bg-successbackground,--border-successborderinfo--bg-infobackground,--border-infoborderpadding="none"padding="sm"padding="md"padding="lg"Acceptance Criteria
classNamefor layout overrides (margin, grid placement) by parentNotes
ListCard.MetricCard,AnalyticsPanel,ContentPreviewBoxcompose this directlyListCardextends this — validate theclassNameforwarding works beforeListCardticket starts