What is a Design System?
A design system is a collection of reusable components, guided by clear standards, that can be assembled to build any number of applications.
Design Tokens
:root {
/* Colors */
--color-primary-50: #eff6ff;
--color-primary-500: #3b82f6;
--color-primary-900: #1e3a8a;
--color-gray-50: #f9fafb;
--color-gray-500: #6b7280;
--color-gray-900: #111827;
/* Semantic colors */
--color-success: #10b981;
--color-warning: #f59e0b;
--color-error: #ef4444;
/* Typography */
--font-sans: 'Inter', system-ui, sans-serif;
--font-mono: 'Fira Code', monospace;
--text-xs: 0.75rem;
--text-sm: 0.875rem;
--text-base: 1rem;
--text-lg: 1.125rem;
--text-xl: 1.25rem;
--text-2xl: 1.5rem;
/* Spacing */
--space-1: 0.25rem;
--space-2: 0.5rem;
--space-4: 1rem;
--space-8: 2rem;
--space-16: 4rem;
/* 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);
--shadow-lg: 0 10px 15px -3px rgb(0 0 0 / 0.1);
/* Border radius */
--radius-sm: 0.25rem;
--radius-md: 0.375rem;
--radius-lg: 0.5rem;
--radius-full: 9999px;
}Dark Mode with Custom Properties
:root {
--bg-primary: var(--color-gray-50);
--bg-secondary: white;
--text-primary: var(--color-gray-900);
--text-secondary: var(--color-gray-500);
--border-color: var(--color-gray-200);
}
[data-theme='dark'] {
--bg-primary: var(--color-gray-900);
--bg-secondary: var(--color-gray-800);
--text-primary: var(--color-gray-50);
--text-secondary: var(--color-gray-400);
--border-color: var(--color-gray-700);
}
/* Usage */
.card {
background: var(--bg-secondary);
color: var(--text-primary);
border: 1px solid var(--border-color);
}Component Variants
/* Button component with variants */
.button {
/* Base styles */
display: inline-flex;
align-items: center;
justify-content: center;
font-weight: 500;
border-radius: var(--radius-md);
transition: all 0.15s ease;
/* Size variants */
&.button--sm {
padding: var(--space-1) var(--space-2);
font-size: var(--text-sm);
}
&.button--md {
padding: var(--space-2) var(--space-4);
font-size: var(--text-base);
}
&.button--lg {
padding: var(--space-4) var(--space-8);
font-size: var(--text-lg);
}
/* Color variants */
&.button--primary {
background: var(--color-primary-500);
color: white;
&:hover {
background: var(--color-primary-600);
}
}
&.button--secondary {
background: var(--bg-secondary);
color: var(--text-primary);
border: 1px solid var(--border-color);
&:hover {
background: var(--color-gray-100);
}
}
&.button--ghost {
background: transparent;
color: var(--color-primary-500);
&:hover {
background: var(--color-primary-50);
}
}
}Container Queries
/* Card that adapts to its container */
.card-container {
container-type: inline-size;
container-name: card;
}
.card {
display: grid;
gap: var(--space-4);
padding: var(--space-4);
}
/* Switch to horizontal layout in larger containers */
@container card (min-width: 400px) {
.card {
grid-template-columns: 150px 1fr;
}
.card__image {
aspect-ratio: 1;
}
}
@container card (min-width: 600px) {
.card {
grid-template-columns: 200px 1fr;
padding: var(--space-8);
}
}Modern Layout Patterns
/* Auto-fit grid */
.grid-auto {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 300px), 1fr));
gap: var(--space-4);
}
/* Holy grail layout with subgrid */
.layout {
display: grid;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
/* Stack pattern */
.stack {
display: flex;
flex-direction: column;
gap: var(--space-4);
}
/* Cluster pattern */
.cluster {
display: flex;
flex-wrap: wrap;
gap: var(--space-2);
}
/* Center pattern */
.center {
display: grid;
place-items: center;
}Animation Tokens
:root {
--duration-fast: 150ms;
--duration-normal: 300ms;
--duration-slow: 500ms;
--ease-in: cubic-bezier(0.4, 0, 1, 1);
--ease-out: cubic-bezier(0, 0, 0.2, 1);
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
--ease-spring: cubic-bezier(0.175, 0.885, 0.32, 1.275);
}
.fade-in {
animation: fadeIn var(--duration-normal) var(--ease-out);
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
.slide-up {
animation: slideUp var(--duration-normal) var(--ease-spring);
}
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(20px);
}
}Conclusion
A good design system provides consistency, speeds up development, and makes maintenance easier. Start with tokens, build components, and document everything.