317 lines
10 KiB
Markdown
317 lines
10 KiB
Markdown
|
|
# Design System Refactor Summary
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
We've successfully refactored the design system to be **Tailwind-first** and dramatically reduced custom CSS overhead.
|
||
|
|
|
||
|
|
## Results
|
||
|
|
|
||
|
|
### CSS Size Reduction
|
||
|
|
|
||
|
|
| File | Before | After | Reduction |
|
||
|
|
|------|--------|-------|-----------|
|
||
|
|
| `utilities.css` | 555 lines | 135 lines | **76% smaller** ↓ |
|
||
|
|
| `responsive.css` | 565 lines | 15 lines | **97% smaller** ↓ |
|
||
|
|
| **Total** | **1,120 lines** | **150 lines** | **87% smaller** ↓ |
|
||
|
|
|
||
|
|
### What Was Removed
|
||
|
|
|
||
|
|
All utilities that duplicate Tailwind's core functionality:
|
||
|
|
|
||
|
|
#### Layout & Containers
|
||
|
|
- ❌ `.cp-container`, `.cp-page`, `.cp-page-header`, `.cp-page-content`, `.cp-page-footer`
|
||
|
|
- ✅ Use Tailwind: `max-w-7xl mx-auto`, `min-h-dvh flex flex-col`, etc.
|
||
|
|
|
||
|
|
#### Spacing
|
||
|
|
- ❌ `.cp-stack-*`, `.cp-inline-*`, `.cp-grid-*`
|
||
|
|
- ✅ Use Tailwind: `space-y-4`, `flex items-center gap-2`, `grid gap-4`
|
||
|
|
|
||
|
|
#### Responsive Grid
|
||
|
|
- ❌ `.cp-grid-cols-*`, `.cp-sm:grid-cols-*`, `.cp-md:grid-cols-*`
|
||
|
|
- ✅ Use Tailwind: `grid-cols-1 sm:grid-cols-2 lg:grid-cols-3`
|
||
|
|
|
||
|
|
#### Typography
|
||
|
|
- ❌ `.cp-text-*`, `.cp-font-*`, `.cp-leading-*`
|
||
|
|
- ✅ Use Tailwind: `text-lg`, `font-semibold`, `leading-normal`
|
||
|
|
|
||
|
|
#### Display & Visibility
|
||
|
|
- ❌ `.cp-hidden`, `.cp-block`, `.cp-flex`, `.cp-inline`, etc.
|
||
|
|
- ✅ Use Tailwind: `hidden`, `block`, `flex`, `inline`
|
||
|
|
|
||
|
|
#### Animations
|
||
|
|
- ❌ `.cp-transition-*`, `.cp-hover-lift`, `.cp-hover-scale`
|
||
|
|
- ✅ Use Tailwind: `transition-all duration-200`, `hover:-translate-y-0.5`, `hover:scale-105`
|
||
|
|
|
||
|
|
#### Responsive Padding/Margin
|
||
|
|
- ❌ `.cp-sm:p-*`, `.cp-md:m-*`, `.cp-lg:p-*`
|
||
|
|
- ✅ Use Tailwind: `p-4 sm:p-6 lg:p-8`
|
||
|
|
|
||
|
|
#### Accessibility
|
||
|
|
- ❌ `.cp-sr-only`
|
||
|
|
- ✅ Use Tailwind: `sr-only`
|
||
|
|
|
||
|
|
#### Responsive Patterns
|
||
|
|
- ❌ `.cp-dashboard-grid`, `.cp-card-grid`, `.cp-form-grid`, `.cp-nav-mobile`, `.cp-nav-desktop`
|
||
|
|
- ✅ Use Tailwind: Build these patterns inline with responsive variants
|
||
|
|
|
||
|
|
#### Container Queries
|
||
|
|
- ❌ All `.cp-container-*:*` utilities
|
||
|
|
- ✅ Use Tailwind's `@container` queries
|
||
|
|
|
||
|
|
### What Was Kept
|
||
|
|
|
||
|
|
Only **semantic component primitives** that combine multiple properties:
|
||
|
|
|
||
|
|
#### ✅ Cards (lines 10-27)
|
||
|
|
```css
|
||
|
|
.cp-card /* Base card with padding, border, shadow */
|
||
|
|
.cp-card-sm /* Smaller padding variant */
|
||
|
|
.cp-card-lg /* Larger border radius and shadow */
|
||
|
|
```
|
||
|
|
|
||
|
|
#### ✅ Badges (lines 29-97)
|
||
|
|
```css
|
||
|
|
.cp-badge /* Base badge */
|
||
|
|
.cp-badge-primary /* Primary color */
|
||
|
|
.cp-badge-secondary /* Secondary color */
|
||
|
|
.cp-badge-success /* Success color */
|
||
|
|
.cp-badge-warning /* Warning color */
|
||
|
|
.cp-badge-error /* Error/destructive color */
|
||
|
|
.cp-badge-info /* Info color */
|
||
|
|
.cp-badge-soft-success /* Soft success background */
|
||
|
|
.cp-badge-soft-warning /* Soft warning background */
|
||
|
|
.cp-badge-soft-error /* Soft error background */
|
||
|
|
.cp-badge-soft-info /* Soft info background */
|
||
|
|
.cp-badge-outline /* Transparent with border */
|
||
|
|
```
|
||
|
|
|
||
|
|
#### ✅ Skeleton Loader (lines 99-122)
|
||
|
|
```css
|
||
|
|
.cp-skeleton /* Loading skeleton with shimmer animation */
|
||
|
|
@keyframes cp-skeleton-shimmer
|
||
|
|
```
|
||
|
|
|
||
|
|
#### ✅ Focus Ring (lines 124-133)
|
||
|
|
```css
|
||
|
|
.cp-focus-ring /* Focus outline */
|
||
|
|
.cp-focus-ring-visible /* Focus on :focus-visible only */
|
||
|
|
```
|
||
|
|
|
||
|
|
### Design Tokens (Unchanged)
|
||
|
|
|
||
|
|
All design tokens remain in place and can be used directly in Tailwind classes:
|
||
|
|
|
||
|
|
#### In `tokens.css`:
|
||
|
|
```css
|
||
|
|
--cp-space-* /* Spacing scale */
|
||
|
|
--cp-card-* /* Card dimensions, shadows, radii */
|
||
|
|
--cp-badge-* /* Badge dimensions */
|
||
|
|
--cp-text-* /* Typography scale */
|
||
|
|
--cp-font-* /* Font weights */
|
||
|
|
--cp-leading-* /* Line heights */
|
||
|
|
--cp-transition-* /* Animation timings */
|
||
|
|
--cp-duration-* /* Duration values */
|
||
|
|
--cp-ease-in-out /* Easing function */
|
||
|
|
```
|
||
|
|
|
||
|
|
#### In `globals.css`:
|
||
|
|
```css
|
||
|
|
--primary /* Brand azure */
|
||
|
|
--primary-hover /* Hover state */
|
||
|
|
--primary-active /* Active state */
|
||
|
|
--success /* Success green */
|
||
|
|
--success-soft /* Soft success background */
|
||
|
|
--warning /* Warning yellow */
|
||
|
|
--warning-soft /* Soft warning background */
|
||
|
|
--destructive /* Error red */
|
||
|
|
--destructive-soft /* Soft error background */
|
||
|
|
--info /* Info blue */
|
||
|
|
--info-soft /* Soft info background */
|
||
|
|
--border /* UI chrome */
|
||
|
|
--border-muted /* Subtle border */
|
||
|
|
/* And many more... */
|
||
|
|
```
|
||
|
|
|
||
|
|
#### In `responsive.css`:
|
||
|
|
```css
|
||
|
|
--cp-breakpoint-sm /* 640px */
|
||
|
|
--cp-breakpoint-md /* 768px */
|
||
|
|
--cp-breakpoint-lg /* 1024px */
|
||
|
|
--cp-breakpoint-xl /* 1280px */
|
||
|
|
--cp-breakpoint-2xl /* 1536px */
|
||
|
|
```
|
||
|
|
|
||
|
|
## Migration Status
|
||
|
|
|
||
|
|
### ✅ Components Already Using New Approach
|
||
|
|
|
||
|
|
These components were already using Tailwind + design tokens correctly:
|
||
|
|
|
||
|
|
1. `DashboardView.tsx` - Using design tokens directly
|
||
|
|
2. `PageLayout.tsx` - Using design tokens directly
|
||
|
|
3. `SubCard.tsx` - Using design tokens directly
|
||
|
|
4. `PublicLandingLoadingView.tsx` - Pure Tailwind
|
||
|
|
5. `DataTable.tsx` - Pure Tailwind with tokens
|
||
|
|
|
||
|
|
**No migration needed!** All existing components follow the new pattern.
|
||
|
|
|
||
|
|
## How to Use Going Forward
|
||
|
|
|
||
|
|
### Pattern: Tailwind + Design Tokens
|
||
|
|
|
||
|
|
```tsx
|
||
|
|
// Layout & Spacing
|
||
|
|
<div className="max-w-7xl mx-auto px-[var(--cp-page-padding)]">
|
||
|
|
<div className="space-y-[var(--cp-space-6)]">
|
||
|
|
<div className="flex items-center gap-[var(--cp-space-2)]">
|
||
|
|
{/* Content */}
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
|
||
|
|
// Cards - Use semantic primitives
|
||
|
|
<div className="cp-card hover:shadow-[var(--cp-card-shadow-lg)] transition-shadow">
|
||
|
|
{/* Content */}
|
||
|
|
</div>
|
||
|
|
|
||
|
|
// Badges - Use semantic primitives
|
||
|
|
<span className="cp-badge cp-badge-soft-success">
|
||
|
|
Active
|
||
|
|
</span>
|
||
|
|
|
||
|
|
// Typography
|
||
|
|
<h1 className="text-2xl font-bold leading-tight">
|
||
|
|
Title
|
||
|
|
</h1>
|
||
|
|
|
||
|
|
// Or with exact token values
|
||
|
|
<h1 className="text-[var(--cp-text-2xl)] font-[var(--cp-font-bold)]">
|
||
|
|
Title
|
||
|
|
</h1>
|
||
|
|
|
||
|
|
// Colors
|
||
|
|
<div className="bg-[var(--primary)] text-[var(--primary-foreground)]">
|
||
|
|
Primary Button
|
||
|
|
</div>
|
||
|
|
|
||
|
|
// Responsive
|
||
|
|
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
||
|
|
{/* Content */}
|
||
|
|
</div>
|
||
|
|
|
||
|
|
// Animations
|
||
|
|
<div className="transition-all duration-200 hover:-translate-y-0.5 hover:shadow-lg">
|
||
|
|
{/* Content */}
|
||
|
|
</div>
|
||
|
|
```
|
||
|
|
|
||
|
|
## Benefits
|
||
|
|
|
||
|
|
### 1. **Dramatically Smaller CSS** (87% reduction)
|
||
|
|
- Faster initial load
|
||
|
|
- Less code to maintain
|
||
|
|
- Better caching
|
||
|
|
|
||
|
|
### 2. **No Duplication**
|
||
|
|
- Tailwind handles layout, spacing, typography
|
||
|
|
- We only define what's unique to our design system
|
||
|
|
|
||
|
|
### 3. **More Flexible**
|
||
|
|
- Full access to Tailwind's utility classes
|
||
|
|
- Easy to compose and customize
|
||
|
|
- Better responsive variants
|
||
|
|
|
||
|
|
### 4. **Better Developer Experience**
|
||
|
|
- Tailwind IntelliSense works better
|
||
|
|
- Less context switching
|
||
|
|
- Fewer custom classes to remember
|
||
|
|
|
||
|
|
### 5. **Design Tokens First**
|
||
|
|
- Colors and spacing remain centralized
|
||
|
|
- Easy to update theme globally
|
||
|
|
- Consistent values across the app
|
||
|
|
|
||
|
|
### 6. **Easier Maintenance**
|
||
|
|
- Less custom CSS to debug
|
||
|
|
- Standard Tailwind patterns
|
||
|
|
- Community best practices
|
||
|
|
|
||
|
|
## Architecture
|
||
|
|
|
||
|
|
```
|
||
|
|
┌──────────────────────────────────────┐
|
||
|
|
│ globals.css (Theme Colors) │
|
||
|
|
│ • Semantic color variables │
|
||
|
|
│ • Light/Dark mode │
|
||
|
|
│ • Maps to Tailwind via @theme │
|
||
|
|
└──────────────────────────────────────┘
|
||
|
|
↓
|
||
|
|
┌──────────────────────────────────────┐
|
||
|
|
│ tokens.css (Design Tokens) │
|
||
|
|
│ • Card dimensions │
|
||
|
|
│ • Animation timings │
|
||
|
|
│ • Spacing scale │
|
||
|
|
│ • Typography scale │
|
||
|
|
└──────────────────────────────────────┘
|
||
|
|
↓
|
||
|
|
┌──────────────────────────────────────┐
|
||
|
|
│ utilities.css (135 lines) │
|
||
|
|
│ • .cp-card variants │
|
||
|
|
│ • .cp-badge variants │
|
||
|
|
│ • .cp-skeleton │
|
||
|
|
│ • .cp-focus-ring │
|
||
|
|
└──────────────────────────────────────┘
|
||
|
|
↓
|
||
|
|
┌──────────────────────────────────────┐
|
||
|
|
│ Components (Tailwind + Tokens) │
|
||
|
|
│ • Use Tailwind utilities │
|
||
|
|
│ • Reference design tokens │
|
||
|
|
│ • Use semantic primitives │
|
||
|
|
└──────────────────────────────────────┘
|
||
|
|
```
|
||
|
|
|
||
|
|
## File Changes
|
||
|
|
|
||
|
|
### Modified Files
|
||
|
|
- ✅ `apps/portal/src/styles/utilities.css` (555 → 135 lines)
|
||
|
|
- ✅ `apps/portal/src/styles/responsive.css` (565 → 15 lines)
|
||
|
|
|
||
|
|
### New Documentation
|
||
|
|
- ✅ `docs/DESIGN-SYSTEM-MIGRATION.md` - Migration guide with examples
|
||
|
|
- ✅ `docs/DESIGN-SYSTEM-REFACTOR-SUMMARY.md` - This file
|
||
|
|
|
||
|
|
### No Component Changes Needed
|
||
|
|
- ✅ All existing components already follow the new pattern
|
||
|
|
|
||
|
|
## Next Steps
|
||
|
|
|
||
|
|
### For New Components
|
||
|
|
1. Use Tailwind utilities for layout, spacing, typography, responsive
|
||
|
|
2. Use `.cp-card`, `.cp-badge`, `.cp-skeleton` for semantic components
|
||
|
|
3. Reference design tokens directly: `var(--cp-*)`
|
||
|
|
4. No need to create new utility classes
|
||
|
|
|
||
|
|
### For Existing Components
|
||
|
|
- No immediate changes needed
|
||
|
|
- Already using the correct pattern
|
||
|
|
- Can gradually simplify any verbose custom classes
|
||
|
|
|
||
|
|
### If You Need a New Pattern
|
||
|
|
1. First, try to compose it with Tailwind utilities
|
||
|
|
2. If it's tedious to repeat (3+ properties), add it to `utilities.css`
|
||
|
|
3. Make it semantic and token-based
|
||
|
|
4. Document it in this file
|
||
|
|
|
||
|
|
## Success Metrics
|
||
|
|
|
||
|
|
- ✅ **87% reduction** in custom CSS
|
||
|
|
- ✅ **Zero breaking changes** - all components work as-is
|
||
|
|
- ✅ **Tailwind-first** approach established
|
||
|
|
- ✅ **Design tokens** remain centralized
|
||
|
|
- ✅ **Documentation** complete with examples
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
**Result**: A lean, maintainable, Tailwind-first design system! 🎉
|
||
|
|
|