# CardStat Component Documentation
## Overview
The CardStat component is a statistics card that displays prominent numerical data with a descriptive label and optional call-to-action buttons. Following the XRPL Brand Design System (BDS), it supports four color variants and responsive layouts to showcase key metrics and statistics effectively.
## Features
- **Four Color Variants**: Lilac (default), Green, Light Gray, and Dark Gray
- **Flexible Content**: Large statistic text with descriptive label
- **Optional CTAs**: Support for 0, 1, or 2 buttons (Primary and/or Secondary)
- **Responsive Design**: Adaptive sizing and typography across breakpoints
- **Theme Support**: Automatic light/dark mode adaptation
- **Accessible**: Semantic HTML with proper button accessibility
## Props API
```typescript
interface ButtonConfig {
/** Button label text */
label: string;
/** Click handler for button */
onClick?: () => void;
/** Link href for button */
href?: string;
}
interface CardStatProps {
/** The main statistic to display (e.g., "6 Million+") */
statistic: string;
/** Descriptive label for the statistic */
label: string;
/** Background color variant */
variant?: 'lilac' | 'green' | 'light-gray' | 'dark-gray';
/** Primary button configuration */
primaryButton?: ButtonConfig;
/** Secondary button configuration */
secondaryButton?: ButtonConfig;
/** Additional CSS classes */
className?: string;
}
```
### Default Values
- `variant`: `'lilac'`
- `primaryButton`: `undefined` (no button)
- `secondaryButton`: `undefined` (no button)
- `className`: `''`
## Color Variants
### Lilac (Default)
A purple/lavender background that provides a soft, friendly appearance.
**Best For:**
- User-focused statistics (active wallets, users)
- Community metrics
- Engagement statistics
**Usage:**
```tsx
```
### Green
XRPL brand green background that reinforces brand identity.
**Best For:**
- Financial metrics (transaction volume, value moved)
- Growth statistics
- Positive indicators
**Usage:**
```tsx
```
### Light Gray
Light gray background for technology and reliability metrics.
**Best For:**
- Technical statistics (uptime, performance)
- Infrastructure metrics
- Stability indicators
**Usage:**
```tsx
```
### Dark Gray
Neutral dark gray background for general-purpose statistics.
**Best For:**
- Neutral metrics
- Secondary information
- Supporting statistics
**Usage:**
```tsx
```
## Button Configurations
### No Buttons
Display statistics without call-to-action buttons for informational purposes.
```tsx
```
### Single Button (Primary)
Include one primary button for a main call-to-action.
```tsx
```
### Two Buttons (Primary + Secondary)
Include both primary and secondary buttons for multiple actions.
```tsx
```
## How It Works
### Component Structure
The CardStat component uses BEM (Block Element Modifier) naming convention with the `bds` namespace:
- `.bds-card-stat` - Base card class
- `.bds-card-stat--lilac` - Lilac variant modifier
- `.bds-card-stat--green` - Green variant modifier
- `.bds-card-stat--light-gray` - Light gray variant modifier
- `.bds-card-stat--dark-gray` - Dark gray variant modifier
- `.bds-card-stat__content` - Inner content wrapper
- `.bds-card-stat__text` - Text section container
- `.bds-card-stat__statistic` - Large statistic text
- `.bds-card-stat__label` - Descriptive label text
- `.bds-card-stat__buttons` - Button container
- `.bds-card-stat__button-link` - Link wrapper for buttons
### Layout
The card uses flexbox for vertical layout:
1. **Content wrapper** (`.bds-card-stat__content`): Main container with padding
2. **Text section** (`.bds-card-stat__text`): Contains statistic and label
3. **Buttons section** (`.bds-card-stat__buttons`): Optional CTA buttons
The layout automatically adjusts spacing between sections using flexbox `justify-content: space-between`.
### Responsive Behavior
The component adapts to different screen sizes:
**Base (Mobile, <576px):**
- Padding: 8px
- Min height: 200px
- Statistic: 64px font size
- Label: 16px font size
**MD (Tablet, ≥576px):**
- Padding: 12px
- Min height: 208px
- Same typography as mobile
**LG+ (Desktop, ≥992px):**
- Padding: 16px
- Min height: 298px
- Statistic: 72px font size
- Label: 18px font size
### Button Integration
Buttons use the existing BDS Button component with `color="black"` variant to ensure proper contrast on colored backgrounds. Buttons can be either:
- **Links** (`href` provided): Wrapped in an anchor tag for navigation
- **Actions** (`onClick` provided): Rendered as interactive buttons
## Typography
### Statistic Text
- **Font**: Booton, sans-serif
- **Weight**: 228 (Light)
- **Size**: 64px (mobile), 72px (desktop)
- **Line Height**: 70.4px (mobile), 79.2px (desktop)
- **Letter Spacing**: -4.5px (mobile), -5px (desktop)
### Label Text
- **Font**: Booton, sans-serif
- **Weight**: 400 (Regular)
- **Size**: 16px (mobile), 18px (desktop)
- **Line Height**: 23.2px (mobile), 26.1px (desktop)
- **Letter Spacing**: 0px (mobile), -0.5px (desktop)
## Spacing & Layout
- **Border Radius**: 8px
- **Button Gap**: 8px between buttons
- **Text Gap**: 4px between statistic and label
- **Min Heights**: 200px (mobile), 208px (tablet), 298px (desktop)
## Usage Examples
### Basic Usage
```tsx
import { CardStat } from 'shared/components/CardStat';
// Simple statistic card
// With color variant
```
### With Buttons
```tsx
// Single button (Light Gray variant)
// Two buttons (Dark Gray variant)
```
### In PageGrid Layout
```tsx
import { CardStat } from 'shared/components/CardStat';
import { PageGrid, PageGridRow, PageGridCol } from 'shared/components/PageGrid/page-grid';
```
### With Click Handlers
```tsx
const handleLearnMore = () => {
console.log('Learn more clicked');
};
```
## Accessibility
### Semantic HTML
- Uses `
` elements with proper structure
- Button components handle their own accessibility
- Text content is readable by screen readers
### Keyboard Navigation
- Buttons are fully keyboard accessible (Tab, Enter, Space)
- Links are keyboard navigable (Tab, Enter)
- Focus indicators provided by Button component
### Color Contrast
All variants meet WCAG AA standards:
- **Black text on colored backgrounds**: Sufficient contrast
- **Buttons**: Use black variant with proper contrast on all backgrounds
- **Dark mode dark gray**: Switches to white text for proper contrast
## Best Practices
1. **Keep statistics concise** - Use abbreviations (M for million, K for thousand)
2. **Use descriptive labels** - Make it clear what the statistic represents
3. **Choose appropriate variants** - Match color to the type of metric
4. **Limit button usage** - Use buttons only when actionable context is needed
5. **Consider grid layouts** - Use PageGrid for consistent spacing and alignment
6. **Test responsiveness** - Verify cards adapt properly at all breakpoints
## When to Use
Use CardStat to:
- **Highlight key metrics** - Show important numbers prominently
- **Dashboard sections** - Create stat-focused areas on landing pages
- **About pages** - Showcase company or product statistics
- **Feature sections** - Emphasize quantitative benefits
- **Report summaries** - Display high-level data points
## When NOT to Use
Avoid CardStat when:
- **Complex data** - Use charts or tables for detailed information
- **Multiple related metrics** - Consider data visualization components
- **Non-numeric content** - Use regular cards for text-heavy content
- **Real-time updates** - Consider dedicated dashboard components
## Design Tokens
The component uses design tokens from the XRPL Brand Design System:
### Colors
- `$bds-card-stat-lilac-bg`: `#D9CAFF`
- `$bds-card-stat-green-bg`: `$green-300` (#EAFCF1)
- `$bds-card-stat-light-gray-bg`: `#CAD4DF` (light gray)
- `$bds-card-stat-dark-gray-bg`: `#8A919A` (dark gray)
- Text: `#141414` (neutral black)
### Spacing
- Border radius: `8px`
- Button gap: `8px`
- Text gap: `4px`
- Content padding: `8px` (mobile), `12px` (tablet), `16px` (desktop)
### Motion
- Transition duration: `150ms`
- Timing function: `cubic-bezier(0.98, 0.12, 0.12, 0.98)`
## Theme Support
The component automatically adapts for light and dark modes:
### Light Mode (Default)
- All color variants use their defined light backgrounds
- Black text on colored backgrounds
### Dark Mode
- **Dark Gray variant**: Switches to darker gray background (`$gray-400`) with white text
- **Other variants**: Maintain colored backgrounds with black text
## Showcase
See the interactive showcase at `/about/cardstat-showcase` for live examples of all variants, button configurations, and responsive behavior in PageGrid layouts.
## File Structure
```
shared/components/CardStat/
├── CardStat.tsx # Component implementation
├── CardStat.scss # Component styles
├── CardStat.md # This documentation
└── index.ts # Exports
```
## Related Components
- **Button** - Used for CTA buttons within cards
- **PageGrid** - For laying out multiple cards in responsive grids
- **Divider** - Can be used to separate card sections if needed