UI Design Expert
Core UI Design Principles
When designing user interfaces, always follow these principles:
- •Visual Hierarchy: Guide attention through size, weight, color, contrast
- •Consistency: Use systematic patterns for predictability
- •White Space: Breathing room improves comprehension
- •Contrast: Ensure readability and focus
- •Alignment: Create order and visual connections
- •Repetition: Reinforce brand and structure
Design System Foundation
Design Tokens (Variables)
Purpose: Single source of truth for design decisions
Token Categories:
/* Color Tokens */ --color-primary: #0066cc; --color-secondary: #6c757d; --color-success: #28a745; --color-warning: #ffc107; --color-danger: #dc3545; --color-text: #212529; --color-background: #ffffff; /* Spacing Scale (8px base) */ --space-2: 0.125rem; /* 2px */ --space-4: 0.25rem; /* 4px */ --space-8: 0.5rem; /* 8px */ --space-12: 0.75rem; /* 12px */ --space-16: 1rem; /* 16px */ --space-24: 1.5rem; /* 24px */ --space-32: 2rem; /* 32px */ --space-48: 3rem; /* 48px */ --space-64: 4rem; /* 64px */ /* Typography Scale (Modular 1.25 ratio) */ --font-size-xs: 0.75rem; /* 12px */ --font-size-sm: 0.875rem; /* 14px */ --font-size-base: 1rem; /* 16px */ --font-size-lg: 1.25rem; /* 20px */ --font-size-xl: 1.5rem; /* 24px */ --font-size-2xl: 2rem; /* 32px */ --font-size-3xl: 2.5rem; /* 40px */ --font-size-4xl: 3rem; /* 48px */ --font-size-display: clamp(5rem, 10vw + 3rem, 8rem); /* 80-128px */ /* Font Weights */ --font-weight-normal: 400; --font-weight-medium: 500; --font-weight-semibold: 600; --font-weight-bold: 700; /* Line Heights */ --line-height-tight: 1.2; --line-height-normal: 1.5; --line-height-relaxed: 1.75; /* Border Radius */ --radius-sm: 0.25rem; /* 4px */ --radius-md: 0.5rem; /* 8px */ --radius-lg: 1rem; /* 16px */ --radius-full: 9999px; /* Circle */ /* Shadows */ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1); --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1); --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.1); /* Z-Index Scale */ --z-dropdown: 1000; --z-sticky: 1020; --z-fixed: 1030; --z-modal-backdrop: 1040; --z-modal: 1050; --z-popover: 1060; --z-tooltip: 1070;
Color System
Color Theory for UI
60-30-10 Rule:
- •60%: Dominant color (backgrounds, large areas)
- •30%: Secondary color (sections, panels)
- •10%: Accent color (CTAs, highlights)
Semantic Color Palette
Primary (Brand): ├── primary-50: #e6f2ff (lightest - backgrounds) ├── primary-100: #b3d9ff ├── primary-200: #80c0ff ├── primary-300: #4da7ff ├── primary-400: #1a8eff ├── primary-500: #0066cc ← Base ├── primary-600: #0052a3 ├── primary-700: #003d7a ├── primary-800: #002952 └── primary-900: #001429 (darkest - text on light bg) Success (Green): ├── Positive actions ├── Confirmation states └── Valid inputs Warning (Yellow/Orange): ├── Caution states ├── Important notices └── Pending actions Danger (Red): ├── Destructive actions ├── Error states └── Invalid inputs Neutral (Gray): ├── Text hierarchy ├── Borders └── Disabled states
Color Accessibility (WCAG)
Contrast Ratios:
- •AA Standard: 4.5:1 for normal text, 3:1 for large text (18px+)
- •AAA Enhanced: 7:1 for normal text, 4.5:1 for large text
Test Colors:
# Use WebAIM Contrast Checker https://webaim.org/resources/contrastchecker/ # Or test in code npm install wcag-color
Example:
✅ PASS: #0066cc text on #ffffff background (7.5:1) ❌ FAIL: #80c0ff text on #ffffff background (2.1:1)
Dark Mode Strategy
Approach: Invert semantic colors, not direct colors
/* Light Mode */
:root {
--color-background: #ffffff;
--color-surface: #f8f9fa;
--color-text: #212529;
--color-text-secondary: #6c757d;
--color-border: #dee2e6;
}
/* Dark Mode */
[data-theme="dark"] {
--color-background: #1a1a1a;
--color-surface: #2d2d2d;
--color-text: #f8f9fa;
--color-text-secondary: #adb5bd;
--color-border: #495057;
/* Reduce saturation for less eye strain */
--color-primary: #4da7ff; /* Lighter than light mode */
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.5); /* Deeper shadows */
}
Typography
Type Scale (Modular Scale)
Formula: base × ratio^n
Common Ratios:
- •1.125 (Major Second): Subtle, dense
- •1.25 (Major Third): Balanced ← Recommended
- •1.333 (Perfect Fourth): Dynamic
- •1.5 (Perfect Fifth): Dramatic
Digitaltableteur Scale (1.25 ratio):
Display: 80-128px (clamp) H1: 48px H2: 40px H3: 32px H4: 24px H5: 20px Body: 16px Small: 14px Caption: 12px
Font Pairing
Recommended Combinations:
- •
Serif + Sans-Serif (Classic)
- •Headings: Playfair Display (serif)
- •Body: Inter (sans-serif)
- •
Geometric + Humanist (Modern)
- •Headings: Montserrat (geometric)
- •Body: Open Sans (humanist)
- •
Monospace + Sans (Technical)
- •Code: Fira Code (monospace)
- •UI: Roboto (sans-serif)
Digitaltableteur Stack:
--font-title: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-body: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-mono: 'Fira Code', 'Courier New', monospace;
Typographic Hierarchy
/* Display (Hero Headlines) */
.display {
font-size: var(--font-size-display);
line-height: var(--line-height-tight);
font-weight: var(--font-weight-bold);
letter-spacing: -0.02em; /* Tighter for large sizes */
}
/* H1 (Page Title) */
h1 {
font-size: var(--font-size-4xl);
line-height: var(--line-height-tight);
font-weight: var(--font-weight-bold);
}
/* H2 (Section Title) */
h2 {
font-size: var(--font-size-3xl);
line-height: var(--line-height-normal);
font-weight: var(--font-weight-semibold);
}
/* Body (Paragraph) */
p {
font-size: var(--font-size-base);
line-height: var(--line-height-relaxed);
font-weight: var(--font-weight-normal);
max-width: 65ch; /* Optimal reading width */
}
/* Small (Caption, Meta) */
small {
font-size: var(--font-size-sm);
line-height: var(--line-height-normal);
color: var(--color-text-secondary);
}
Readability Guidelines
- •Line Length: 45-75 characters (optimal: 65ch)
- •Line Height: 1.5× font size for body text
- •Paragraph Spacing: 1.5× line height
- •Letter Spacing: -0.02em for large text, 0em for body
Layout & Spacing
Grid System
12-Column Grid (flexible):
.container {
max-width: 1200px;
margin-inline: auto;
padding-inline: var(--space-16);
}
.grid {
display: grid;
grid-template-columns: repeat(12, 1fr);
gap: var(--space-24);
}
/* 3-column layout */
.col-4 {
grid-column: span 4;
}
/* Responsive */
@media (max-width: 768px) {
.grid {
grid-template-columns: 1fr;
}
.col-4 {
grid-column: span 1;
}
}
Spacing System (8px Base)
Concept: All spacing uses multiples of 8px for visual consistency
2px: Micro (icon padding) 4px: Tiny (inline spacing) 8px: Small (tight elements) 12px: Compact (related items) 16px: Base (default spacing) 24px: Medium (section padding) 32px: Large (cards, panels) 48px: XL (major sections) 64px: XXL (hero sections)
Application:
/* Component Internal Spacing */
.card {
padding: var(--space-24); /* 24px */
}
/* Component External Spacing */
.card + .card {
margin-block-start: var(--space-16); /* 16px gap */
}
/* Section Spacing */
.section {
padding-block: var(--space-64); /* 64px top/bottom */
}
Whitespace Principles
Law of Proximity: Related items closer, unrelated farther
Bad Example: ┌─────────────┐ │ Title │ ← 8px gap │ Subtitle │ ← 8px gap │ Author │ ← 8px gap (too uniform) │ Date │ └─────────────┘ Good Example: ┌─────────────┐ │ Title │ ← 4px gap (related) │ Subtitle │ ← 24px gap (separate group) │ Author │ ← 4px gap (related) │ Date │ └─────────────┘
Component Visual Design
Button Anatomy
┌────────────────────────────┐ │ [Icon] Label [Icon] │ ← Text: 14-16px, weight: 500-600 │ ↑ ↑ ↑ │ │ 8px 12px 8px │ ← Spacing └────────────────────────────┘ ↑ ↑ 12px padding 12px padding Height: 40-48px (min 44px for touch) Border-radius: 8px
Button Hierarchy:
/* Primary (High emphasis) */
.btn-primary {
background-color: var(--color-primary);
color: white;
font-weight: 600;
box-shadow: var(--shadow-sm);
}
.btn-primary:hover {
background-color: var(--color-primary-600);
box-shadow: var(--shadow-md);
transform: translateY(-1px);
}
/* Secondary (Medium emphasis) */
.btn-secondary {
background-color: transparent;
color: var(--color-primary);
border: 2px solid var(--color-primary);
}
/* Tertiary (Low emphasis) */
.btn-tertiary {
background-color: transparent;
color: var(--color-primary);
text-decoration: underline;
}
Card Design
.card {
/* Structure */
background-color: var(--color-surface);
border-radius: var(--radius-lg);
padding: var(--space-24);
/* Depth */
box-shadow: var(--shadow-md);
/* Interaction */
transition:
transform 0.3s cubic-bezier(0.34, 1.56, 0.64, 1),
box-shadow 0.3s ease;
}
.card:hover {
transform: scale(1.02);
box-shadow: var(--shadow-xl);
}
/* Card Anatomy */
.card-header {
margin-block-end: var(--space-16);
}
.card-title {
font-size: var(--font-size-xl);
font-weight: var(--font-weight-semibold);
color: var(--color-text);
}
.card-content {
font-size: var(--font-size-base);
line-height: var(--line-height-relaxed);
color: var(--color-text-secondary);
}
.card-footer {
margin-block-start: var(--space-24);
padding-block-start: var(--space-16);
border-block-start: 1px solid var(--color-border);
}
Form Input Design
.input {
/* Size */
min-height: 48px;
padding: 12px 16px;
/* Typography */
font-size: var(--font-size-base);
line-height: 1.5;
/* Visual */
background-color: var(--color-background);
border: 2px solid var(--color-border);
border-radius: var(--radius-md);
/* Interaction */
transition: all 0.2s ease;
}
.input:focus {
outline: none;
border-color: var(--color-primary);
box-shadow: 0 0 0 4px rgba(0, 102, 204, 0.1); /* Focus ring */
}
.input:invalid {
border-color: var(--color-danger);
}
.input:disabled {
background-color: var(--color-surface);
color: var(--color-text-secondary);
cursor: not-allowed;
}
/* Label */
.label {
display: block;
font-size: var(--font-size-sm);
font-weight: var(--font-weight-medium);
color: var(--color-text);
margin-block-end: var(--space-8);
}
/* Helper Text */
.help-text {
font-size: var(--font-size-sm);
color: var(--color-text-secondary);
margin-block-start: var(--space-4);
}
/* Error Message */
.error-message {
font-size: var(--font-size-sm);
color: var(--color-danger);
margin-block-start: var(--space-4);
display: flex;
align-items: center;
gap: var(--space-4);
}
Iconography
Icon System Guidelines
Size Scale:
16px: Inline with text 20px: Buttons, inputs 24px: Navigation, cards 32px: Feature highlights 48px: Empty states, placeholders
Style:
- •Stroke width: 2px (consistent across set)
- •Corner radius: 2px (rounded, friendly)
- •Grid: 24×24px with 2px padding
Usage:
import { MagnifyingGlass, User, XCircle } from '@phosphor-icons/react';
// Default size (24px)
<MagnifyingGlass />
// Custom size
<MagnifyingGlass size={32} weight="bold" />
// With color
<User color="var(--color-primary)" />
Accessibility:
// Decorative icon (hidden from screen readers) <MagnifyingGlass aria-hidden="true" /> // Functional icon (needs label) <button aria-label="Search"> <MagnifyingGlass /> </button>
Animation & Motion
Animation Principles
- •Purposeful: Motion guides attention or provides feedback
- •Subtle: Enhance, don't distract (200-400ms)
- •Natural: Use easing curves, not linear
- •Respectful: Honor
prefers-reduced-motion
Easing Functions
/* Material Design Easing */
--ease-standard: cubic-bezier(0.4, 0.0, 0.2, 1); /* Default */
--ease-decelerate: cubic-bezier(0.0, 0.0, 0.2, 1); /* Enter screen */
--ease-accelerate: cubic-bezier(0.4, 0.0, 1, 1); /* Exit screen */
/* Elastic (playful) */
--ease-elastic: cubic-bezier(0.34, 1.56, 0.64, 1);
/* Usage */
.button {
transition: transform 0.3s var(--ease-standard);
}
.button:hover {
transform: scale(1.05);
}
Common Animations
Fade In:
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.fade-in {
animation: fadeIn 0.3s var(--ease-standard);
}
Slide Up:
@keyframes slideUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.slide-up {
animation: slideUp 0.4s var(--ease-decelerate);
}
Gradient Flow (Digitaltableteur):
@keyframes gradient-move {
0%, 100% {
background-position: 0% 50%;
}
50% {
background-position: 100% 50%;
}
}
.gradient-text {
background: linear-gradient(120deg, #667eea, #764ba2, #f093fb);
background-size: 200% 200%;
animation: gradient-move 4s ease-in-out infinite;
background-clip: text;
-webkit-text-fill-color: transparent;
}
Reduced Motion
/* Respect user preference */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
}
}
Responsive Design
Breakpoints
/* Mobile First Approach */
/* Small (mobile) - default, no media query */
.container {
padding: var(--space-16);
}
/* Medium (tablet) - 768px+ */
@media (min-width: 768px) {
.container {
padding: var(--space-24);
}
}
/* Large (desktop) - 1024px+ */
@media (min-width: 1024px) {
.container {
padding: var(--space-32);
max-width: 1200px;
}
}
/* Extra Large (wide desktop) - 1440px+ */
@media (min-width: 1440px) {
.container {
max-width: 1400px;
}
}
Fluid Typography
/* Scales smoothly between breakpoints */
h1 {
font-size: clamp(2rem, 5vw + 1rem, 4rem);
/* Min: 32px, Ideal: 5vw+16px, Max: 64px */
}
p {
font-size: clamp(1rem, 1vw + 0.75rem, 1.25rem);
/* Min: 16px, Ideal: 1vw+12px, Max: 20px */
}
Design-to-Dev Handoff (Figma)
Figma Best Practices
Layer Naming:
✅ Good: button-primary-large ❌ Bad: Rectangle 23
Component Organization:
Components/
├── Foundations/
│ ├── Colors
│ ├── Typography
│ └── Spacing
├── Atoms/
│ ├── Button
│ ├── Input
│ └── Icon
├── Molecules/
│ ├── Card
│ └── Form Field
└── Organisms/
├── Header
└── Footer
Auto Layout (Flexbox equivalent):
- •Use for all components
- •Set spacing, padding explicitly
- •Configure resizing behavior
Variants (Component states):
Button: ├── Variant: Primary, Secondary, Tertiary ├── Size: Small, Medium, Large ├── State: Default, Hover, Active, Disabled └── Icon: Left, Right, None
Handoff Checklist
- • All text layers use shared text styles
- • All colors reference design tokens (not hex values)
- • Spacing uses 8px grid
- • Components use Auto Layout
- • All states documented (hover, active, disabled)
- • Responsive behavior specified
- • Accessibility notes added (alt text, ARIA labels)
- • Interactive prototype for complex flows
- • Developer mode enabled (CSS code snippets)
Visual Hierarchy Techniques
Size & Scale
Largest: Display Headlines (guide attention immediately) ↓ Large: Page Titles (establish context) ↓ Medium: Section Headings (organize content) ↓ Base: Body Text (readable, comfortable) ↓ Small: Captions, Meta (supporting info)
Weight & Contrast
Boldest: CTAs, Primary Actions (demand action) ↓ Bold: Headings (structure) ↓ Semibold: Subheadings, Labels (clarity) ↓ Regular: Body (readability) ↓ Light: De-emphasized Text (background info)
Color Emphasis
High Contrast: Black on White (critical info) Medium Contrast: Gray on White (secondary info) Low Contrast: Light Gray on White (tertiary info) Accent Color: Brand Color (CTAs, highlights)
Brand Application (Digitaltableteur)
Brand Colors
--accent-pink: #ff006e; --accent-purple: #8338ec; --accent-cyan: #00d9ff; --accent-teal: #06ffa5; --accent-yellow: #ffbe0b; --accent-violet: #7209b7; /* Gradient (Signature) */ --home-gradient: linear-gradient(120deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
Section Accent Pattern
// Rotate accent colors for visual rhythm
<section className={styles.sectionAccentPink}>
{/* Content */}
</section>
<section className={styles.sectionAccentCyan}>
{/* Content */}
</section>
<section className={styles.sectionAccentYellow}>
{/* Content */}
</section>
Gradient Text (CTAs)
.gradientText {
background: var(--home-gradient);
background-size: 200% 200%;
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: gradient-move 4s ease-in-out infinite;
}
Micro-Interactions (Visual Feedback)
Button States
.button {
/* Idle */
background-color: var(--color-primary);
transform: scale(1);
transition: all 0.2s ease;
}
.button:hover {
/* Hover */
background-color: var(--color-primary-600);
transform: scale(1.05);
box-shadow: var(--shadow-lg);
}
.button:active {
/* Active (pressed) */
transform: scale(0.98);
box-shadow: var(--shadow-sm);
}
.button:focus-visible {
/* Focus (keyboard) */
outline: 4px solid rgba(0, 102, 204, 0.3);
outline-offset: 2px;
}
.button:disabled {
/* Disabled */
background-color: var(--color-surface);
color: var(--color-text-secondary);
cursor: not-allowed;
transform: scale(1);
}
Loading States
// Skeleton loader
<div className={styles.skeleton} />
/* CSS */
.skeleton {
background: linear-gradient(
90deg,
var(--color-surface) 0%,
var(--color-border) 50%,
var(--color-surface) 100%
);
background-size: 200% 100%;
animation: loading 1.5s ease-in-out infinite;
}
@keyframes loading {
0% {
background-position: 200% 0;
}
100% {
background-position: -200% 0;
}
}
When to Use This Skill
Activate this skill when:
- •Designing UI components or patterns
- •Creating design systems or style guides
- •Choosing colors, typography, or spacing
- •Building visual hierarchies
- •Designing for accessibility (color contrast)
- •Creating design tokens or CSS variables
- •Working with Figma or design tools
- •Defining animation and motion
- •Designing responsive layouts
- •Creating brand application guidelines
- •Designing micro-interactions
- •Conducting design QA or reviews
- •Handing off designs to developers
Remember: Consistency and accessibility are non-negotiable. Always test designs with real users and assistive technologies.