Files
gh-dieshen-claude-marketpla…/BEFORE_AFTER.md
2025-11-29 18:21:47 +08:00

6.7 KiB

Before & After: shadcn-aesthetic Transformation

This demonstrates the difference between old-school CSS and modern shadcn-aesthetic patterns.

Before (Old-School, Clunky)

.button {
  padding: 10px 20px;
  background: #007bff;
  color: white;
  border: 1px solid #0056b3;
  border-radius: 4px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
  transition: all 0.3s ease;
  font-size: 14px;
  cursor: pointer;
}

.button:hover {
  background: #0056b3;
  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
}

.button:focus {
  outline: none;
  border: 2px solid blue;
}

.card {
  padding: 15px;
  margin-bottom: 20px;
  background: white;
  border: 1px solid #ddd;
  border-radius: 5px;
  box-shadow: 0 3px 6px rgba(0, 0, 0, 0.15);
}

.input {
  padding: 8px 12px;
  border: 1px solid #ccc;
  border-radius: 3px;
  font-size: 14px;
}

.input:focus {
  border-color: #007bff;
  outline: none;
}

Problems:

  • Hard-coded colors (no theming)
  • Random pixel values (10px, 15px, 20px)
  • Heavy shadows
  • Slow transitions (300ms)
  • Poor focus states
  • No dark mode support
  • Inconsistent spacing

After (Modern shadcn-aesthetic)

:root {
  // Color system
  --background: 0 0% 100%;
  --foreground: 222.2 84% 4.9%;
  --primary: 222.2 47.4% 11.2%;
  --primary-foreground: 210 40% 98%;
  --border: 214.3 31.8% 91.4%;
  --input: 214.3 31.8% 91.4%;
  --ring: 222.2 84% 4.9%;
  
  // Spacing
  --spacing-2: 0.5rem;   // 8px
  --spacing-3: 0.75rem;  // 12px
  --spacing-4: 1rem;     // 16px
  
  // Shadows
  --shadow-sm: 0 1px 2px 0 rgb(0 0 0 / 0.05);
  --shadow-md: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
  
  // Other
  --radius: 0.5rem;
  --duration-150: 150ms;
  --ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
}

.dark {
  --background: 222.2 84% 4.9%;
  --foreground: 210 40% 98%;
  --primary: 210 40% 98%;
  --primary-foreground: 222.2 47.4% 11.2%;
  --border: 217.2 32.6% 17.5%;
  --input: 217.2 32.6% 17.5%;
  --ring: 212.7 26.8% 83.9%;
}

.button {
  // Layout
  display: inline-flex;
  align-items: center;
  justify-content: center;
  
  // Spacing
  padding: var(--spacing-2) var(--spacing-4);
  
  // Visual
  background-color: hsl(var(--primary));
  color: hsl(var(--primary-foreground));
  border: 1px solid transparent;
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
  
  // Typography
  font-size: 0.875rem;
  font-weight: 500;
  
  // Interaction
  cursor: pointer;
  transition: all var(--duration-150) var(--ease-in-out);
  
  &:hover {
    background-color: hsl(var(--primary) / 0.9);
    box-shadow: var(--shadow-md);
  }
  
  &:focus-visible {
    outline: 2px solid hsl(var(--ring));
    outline-offset: 2px;
  }
}

.card {
  // Spacing
  padding: var(--spacing-4);
  
  // Visual
  background-color: hsl(var(--background));
  color: hsl(var(--foreground));
  border: 1px solid hsl(var(--border));
  border-radius: calc(var(--radius) + 2px);
  box-shadow: var(--shadow-sm);
  
  // Interaction
  transition: box-shadow var(--duration-150) var(--ease-in-out);
  
  &:hover {
    box-shadow: var(--shadow-md);
  }
}

.input {
  // Layout
  display: flex;
  width: 100%;
  
  // Spacing
  padding: var(--spacing-2) var(--spacing-3);
  
  // Visual
  background-color: hsl(var(--background));
  color: hsl(var(--foreground));
  border: 1px solid hsl(var(--input));
  border-radius: var(--radius);
  box-shadow: var(--shadow-sm);
  
  // Typography
  font-size: 0.875rem;
  line-height: 1.5;
  
  // Interaction
  transition: all var(--duration-150) var(--ease-in-out);
  
  &::placeholder {
    color: hsl(var(--muted-foreground));
  }
  
  &:focus {
    outline: none;
    border-color: hsl(var(--ring));
    box-shadow: 0 0 0 2px hsl(var(--ring) / 0.2);
  }
}

Improvements:

  • CSS variables for complete theming
  • HSL colors with opacity support
  • Consistent spacing scale (4px base)
  • Subtle, layered shadows
  • Quick transitions (150ms)
  • Proper focus-visible states
  • Dark mode support (just add .dark class)
  • Modern layout primitives
  • Accessible by default

Visual Comparison

Light Mode

Old Button:     [Blue pill button with heavy shadow]
Modern Button:  [Refined button with subtle shadow, perfect spacing]

Old Card:       [Bulky white box with strong borders]
Modern Card:    [Clean card with subtle elevation, perfect proportions]

Old Input:      [Generic text field]
Modern Input:   [Refined input with smooth focus ring]

Dark Mode

Old:            [Doesn't exist or looks broken]
Modern:         [Perfect dark mode with proper contrast]

Real-World Impact

Vibe.UI Component Example

Before (Without Skill):

.vibe-button {
  padding: 10px 16px;
  background: #6366f1;
  color: white;
  border-radius: 6px;
  transition: all 0.2s;
}

After (With shadcn-aesthetic Skill):

.vibe-button {
  display: inline-flex;
  align-items: center;
  gap: var(--spacing-2);
  padding: var(--spacing-2) var(--spacing-4);
  background-color: hsl(var(--primary));
  color: hsl(var(--primary-foreground));
  border-radius: var(--radius);
  font-size: var(--text-sm);
  font-weight: var(--font-medium);
  box-shadow: var(--shadow-sm);
  transition: all var(--duration-150) var(--ease-in-out);
  
  &:hover {
    background-color: hsl(var(--primary) / 0.9);
    box-shadow: var(--shadow-md);
  }
  
  &:focus-visible {
    outline: 2px solid hsl(var(--ring));
    outline-offset: 2px;
  }
}

Result:

  • Professional appearance
  • Complete theme support
  • Perfect dark mode
  • Accessible by default
  • Consistent with the entire system

File Size Impact

Old CSS: ~2.5KB (but requires separate dark mode styles) Modern CSS: ~3KB (includes dark mode, accessibility, all states)

Net benefit: Smaller overall bundle, better functionality, easier maintenance.


Developer Experience

Old Way:

// What color should I use?
background: #007bff;  // ¯\_(ツ)_/¯

// How much padding?
padding: 12px;  // Looks about right?

// Dark mode?
// TODO: add dark mode styles (never happens)

Modern Way:

// Clear semantic variables
background-color: hsl(var(--primary));

// Consistent spacing scale
padding: var(--spacing-3);

// Dark mode works automatically
// Just add .dark class to <html>

Usage in Claude Code

Install the plugin:

/plugin marketplace add https://github.com/Dieshen/claude_marketplace.git
/plugin install shadcn-aesthetic@dieshen-plugins

Now when you ask Claude to create UI components, it automatically uses these modern patterns!

Example prompt: "Create a button component for Vibe.UI with primary, secondary, and outline variants"

Result: Claude generates modern, shadcn-style CSS with proper theming, spacing, and accessibility. 🎉