224 lines
7.0 KiB
Markdown
224 lines
7.0 KiB
Markdown
# Design Tokens
|
|
|
|
This document defines the design tokens used throughout the Flyer Crawler application, including color palettes, usage guidelines, and semantic mappings.
|
|
|
|
## Color Palette
|
|
|
|
### Brand Colors
|
|
|
|
The Flyer Crawler brand uses a **teal** color palette that evokes freshness, value, and the grocery shopping experience.
|
|
|
|
| Token | Value | Tailwind | RGB | Usage |
|
|
| --------------------- | --------- | -------- | ------------- | ---------------------------------------- |
|
|
| `brand-primary` | `#0d9488` | teal-600 | 13, 148, 136 | Main brand color, primary call-to-action |
|
|
| `brand-secondary` | `#14b8a6` | teal-500 | 20, 184, 166 | Supporting actions, primary buttons |
|
|
| `brand-light` | `#ccfbf1` | teal-100 | 204, 251, 241 | Backgrounds, highlights (light mode) |
|
|
| `brand-dark` | `#115e59` | teal-800 | 17, 94, 89 | Hover states, backgrounds (dark mode) |
|
|
| `brand-primary-light` | `#99f6e4` | teal-200 | 153, 246, 228 | Subtle backgrounds, light accents |
|
|
| `brand-primary-dark` | `#134e4a` | teal-900 | 19, 78, 74 | Deep backgrounds, strong emphasis (dark) |
|
|
|
|
### Color Usage Examples
|
|
|
|
```jsx
|
|
// Primary color for icons and emphasis
|
|
<TagIcon className="text-brand-primary" />
|
|
|
|
// Secondary color for primary action buttons
|
|
<button className="bg-brand-secondary hover:bg-brand-dark">
|
|
Add to List
|
|
</button>
|
|
|
|
// Light backgrounds for selected/highlighted items
|
|
<div className="bg-brand-light dark:bg-brand-dark/30">
|
|
Selected Flyer
|
|
</div>
|
|
|
|
// Focus rings on form inputs
|
|
<input className="focus:ring-brand-primary focus:border-brand-primary" />
|
|
```
|
|
|
|
## Semantic Color Mappings
|
|
|
|
### Primary (`brand-primary`)
|
|
|
|
**Purpose**: Main brand color for visual identity and key interactive elements
|
|
|
|
**Use Cases**:
|
|
|
|
- Icons representing key features (shopping cart, tags, deals)
|
|
- Hover states on links and interactive text
|
|
- Focus indicators on form elements
|
|
- Progress bars and loading indicators
|
|
- Selected state indicators
|
|
|
|
**Example Usage**:
|
|
|
|
```jsx
|
|
className = 'text-brand-primary hover:text-brand-dark';
|
|
```
|
|
|
|
### Secondary (`brand-secondary`)
|
|
|
|
**Purpose**: Supporting actions and primary buttons that drive user engagement
|
|
|
|
**Use Cases**:
|
|
|
|
- Primary action buttons (Add, Submit, Save)
|
|
- Call-to-action elements that require user attention
|
|
- Active state for toggles and switches
|
|
|
|
**Example Usage**:
|
|
|
|
```jsx
|
|
className = 'bg-brand-secondary hover:bg-brand-dark';
|
|
```
|
|
|
|
### Light (`brand-light`)
|
|
|
|
**Purpose**: Subtle backgrounds and highlights in light mode
|
|
|
|
**Use Cases**:
|
|
|
|
- Selected item backgrounds
|
|
- Highlighted sections
|
|
- Drag-and-drop target areas
|
|
- Subtle emphasis backgrounds
|
|
|
|
**Example Usage**:
|
|
|
|
```jsx
|
|
className = 'bg-brand-light dark:bg-brand-dark/20';
|
|
```
|
|
|
|
### Dark (`brand-dark`)
|
|
|
|
**Purpose**: Hover states and backgrounds in dark mode
|
|
|
|
**Use Cases**:
|
|
|
|
- Button hover states
|
|
- Dark mode backgrounds for highlighted sections
|
|
- Strong emphasis in dark theme
|
|
|
|
**Example Usage**:
|
|
|
|
```jsx
|
|
className = 'hover:bg-brand-dark dark:bg-brand-dark/30';
|
|
```
|
|
|
|
## Dark Mode Variants
|
|
|
|
All brand colors have dark mode variants defined using Tailwind's `dark:` prefix.
|
|
|
|
### Dark Mode Mapping Table
|
|
|
|
| Light Mode Class | Dark Mode Class | Purpose |
|
|
| ----------------------- | ----------------------------- | ------------------------------------ |
|
|
| `text-brand-primary` | `dark:text-brand-light` | Text readability on dark backgrounds |
|
|
| `bg-brand-light` | `dark:bg-brand-dark/20` | Subtle backgrounds |
|
|
| `bg-brand-primary` | `dark:bg-brand-primary` | Brand color maintained in both modes |
|
|
| `hover:text-brand-dark` | `dark:hover:text-brand-light` | Interactive text hover |
|
|
| `border-brand-primary` | `dark:border-brand-primary` | Borders maintained in both modes |
|
|
|
|
### Dark Mode Best Practices
|
|
|
|
1. **Contrast**: Ensure sufficient contrast (WCAG AA: 4.5:1 for text, 3:1 for UI)
|
|
2. **Consistency**: Use `brand-primary` for icons in both modes (it works well on both backgrounds)
|
|
3. **Backgrounds**: Use lighter opacity variants for dark mode backgrounds (e.g., `/20`, `/30`)
|
|
4. **Text**: Swap `brand-dark` ↔ `brand-light` for text elements between modes
|
|
|
|
## Accessibility
|
|
|
|
### Color Contrast Ratios
|
|
|
|
All color combinations meet WCAG 2.1 Level AA standards:
|
|
|
|
| Foreground | Background | Contrast Ratio | Pass Level |
|
|
| --------------- | ----------------- | -------------- | ---------- |
|
|
| `brand-primary` | white | 4.51:1 | AA |
|
|
| `brand-dark` | white | 7.82:1 | AAA |
|
|
| white | `brand-primary` | 4.51:1 | AA |
|
|
| white | `brand-secondary` | 3.98:1 | AA Large |
|
|
| white | `brand-dark` | 7.82:1 | AAA |
|
|
| `brand-light` | `brand-dark` | 13.4:1 | AAA |
|
|
|
|
### Focus Indicators
|
|
|
|
All interactive elements MUST have visible focus indicators using `focus:ring-2`:
|
|
|
|
```jsx
|
|
className = 'focus:ring-2 focus:ring-brand-primary focus:ring-offset-2';
|
|
```
|
|
|
|
### Color Blindness Considerations
|
|
|
|
The teal color palette is accessible for most forms of color blindness:
|
|
|
|
- **Deuteranopia** (green-weak): Teal appears as blue/cyan
|
|
- **Protanopia** (red-weak): Teal appears as blue
|
|
- **Tritanopia** (blue-weak): Teal appears as green
|
|
|
|
The brand colors are always used alongside text labels and icons, never relying solely on color to convey information.
|
|
|
|
## Implementation Notes
|
|
|
|
### Tailwind Config
|
|
|
|
Brand colors are defined in `tailwind.config.js`:
|
|
|
|
```javascript
|
|
theme: {
|
|
extend: {
|
|
colors: {
|
|
brand: {
|
|
primary: '#0d9488',
|
|
secondary: '#14b8a6',
|
|
light: '#ccfbf1',
|
|
dark: '#115e59',
|
|
'primary-light': '#99f6e4',
|
|
'primary-dark': '#134e4a',
|
|
},
|
|
},
|
|
},
|
|
}
|
|
```
|
|
|
|
### Usage in Components
|
|
|
|
Import and use brand colors with Tailwind utility classes:
|
|
|
|
```jsx
|
|
// Text colors
|
|
<span className="text-brand-primary dark:text-brand-light">Price</span>
|
|
|
|
// Background colors
|
|
<div className="bg-brand-secondary hover:bg-brand-dark">Button</div>
|
|
|
|
// Border colors
|
|
<div className="border-2 border-brand-primary">Card</div>
|
|
|
|
// Opacity variants
|
|
<div className="bg-brand-light/50 dark:bg-brand-dark/20">Overlay</div>
|
|
```
|
|
|
|
## Future Considerations
|
|
|
|
### Potential Extensions
|
|
|
|
- **Success**: Consider adding semantic success color (green) for completed actions
|
|
- **Warning**: Consider adding semantic warning color (amber) for alerts
|
|
- **Error**: Consider adding semantic error color (red) for errors (already using red-\* palette)
|
|
|
|
### Color Palette Expansion
|
|
|
|
If the brand evolves, consider these complementary colors:
|
|
|
|
- **Accent**: Warm coral/orange for limited-time deals
|
|
- **Neutral**: Gray scale for backgrounds and borders (already using Tailwind's gray palette)
|
|
|
|
## References
|
|
|
|
- [Tailwind CSS Color Palette](https://tailwindcss.com/docs/customizing-colors)
|
|
- [WCAG 2.1 Contrast Guidelines](https://www.w3.org/WAI/WCAG21/Understanding/contrast-minimum.html)
|
|
- [WebAIM Contrast Checker](https://webaim.org/resources/contrastchecker/)
|