design
Design Principles
Core philosophy: Every interface should look designed by a team that obsesses over 1-pixel differences. Not stripped, crafted. And designed for its specific context.
Design Direction (REQUIRED)
Before writing code, commit to a direction. Don't default. Think about what this specific product needs to feel like.
Think About Context
- What does this product do? A finance tool needs different energy than a creative tool.
- Who uses it? Power users want density. Occasional users want guidance.
- What's the emotional job? Trust? Efficiency? Delight? Focus?
- What would make this memorable? Every product has a chance to feel distinctive.
Choose a Personality
| Direction | Feel | When to Use |
|---|---|---|
| Precision & Density | Tight spacing, monochrome, info-forward | Power users who live in the tool. Linear, Raycast, terminal aesthetics. |
| Warmth & Approachability | Generous spacing, soft shadows, friendly | Products that want to feel human. Notion, Coda, collaborative tools. |
| Sophistication & Trust | Cool tones, layered depth, gravitas | Products handling money or sensitive data. Stripe, Mercury. |
| Boldness & Clarity | High contrast, dramatic negative space | Modern, decisive products. Vercel, minimal dashboards. |
| Utility & Function | Muted palette, functional density | Work matters more than chrome. GitHub, developer tools. |
| Data & Analysis | Chart-optimized, technical but accessible | Analytics, metrics, business intelligence. |
Pick one. Or blend two. But commit to a direction that fits the product.
Choose Foundation
Color foundation (don't default to warm):
- Warm (creams, warm grays): approachable, comfortable, human
- Cool (slate, blue-gray): professional, trustworthy, serious
- Pure neutrals (true grays): minimal, bold, technical
- Tinted (slight color cast): distinctive, memorable, branded
Light or dark? Dark feels technical, focused, premium. Light feels open, approachable, clean. Choose based on context.
Accent color: ONE that means something. Blue = trust. Green = growth. Orange = energy. Violet = creativity.
Choose Layout
- Dense grids for information-heavy interfaces where users scan and compare
- Generous spacing for focused tasks where users need to concentrate
- Sidebar nav for multi-section apps with many destinations
- Top nav for simpler tools with fewer sections
Choose Typography
- System fonts: fast, native, invisible (utility-focused products)
- Geometric sans (Geist, Inter): modern, clean, technical
- Humanist sans (SF Pro, Satoshi): warmer, more approachable
- Monospace influence: technical, developer-focused, data-heavy
Core Craft (Non-Negotiable)
The 4px Grid
All spacing uses 4px base: 4px (micro), 8px (tight), 12px (standard), 16px (comfortable), 24px (generous), 32px (major).
Symmetrical Padding
TLBR must match. If top is 16px, all sides are 16px. Exception: when content naturally creates visual balance.
Border Radius
Stick to 4px grid. Pick a system and commit:
- Sharp: 4px, 6px, 8px
- Soft: 8px, 12px
- Minimal: 2px, 4px, 6px
Depth Strategy
Match depth to design direction. Different products need different approaches:
- Borders-only (flat): Clean, technical. Linear, Raycast use almost no shadows.
- Subtle single shadow: Soft lift without complexity.
- Layered shadows: Rich, premium, dimensional. Stripe, Mercury.
- Surface color shifts: Background tints establish hierarchy without shadows.
The craft is in the choice, not the complexity. A flat interface with perfect spacing is more polished than shadow-heavy with sloppy details.
Typography Hierarchy
- Headlines: 600 weight, -0.02em tracking
- Body: 400-500 weight
- Labels: 500 weight, positive tracking for uppercase
- Scale: 11px, 12px, 13px, 14px (base), 16px, 18px, 24px, 32px
Use monospace for numbers, IDs, codes, timestamps. Use tabular-nums for columns.
Font pairing: Display font for headlines (one statement font) + neutral body font. Don't mix two display fonts.
Color for Meaning Only
Gray builds structure. Color only appears when it communicates: status, action, error, success. Four-level contrast hierarchy: foreground → secondary → muted → faint.
Card Layouts
Internal layouts should vary by content. A metric card doesn't have to look like a plan card doesn't have to look like a settings card. One might have a sparkline, another an avatar stack, another a progress ring.
Surface treatment stays consistent: same border weight, shadow depth, corner radius, padding scale.
Isolated Controls
Never use native form elements for styled UI. Native <select>, <input type="date"> render OS-native elements that cannot be styled. Build custom components.
Custom select triggers: display: inline-flex with white-space: nowrap to keep text and icons on same row.
Navigation Context
Screens need grounding:
- Navigation (sidebar or top)
- Location indicator (breadcrumbs, active state)
- User context (who's logged in)
When building sidebars, consider using same background as main content. Linear, Vercel use subtle border for separation rather than different backgrounds.
Dark Mode
- Borders over shadows: Shadows less visible on dark backgrounds
- Adjust semantic colors: Desaturate for dark backgrounds
- Same hierarchy, inverted values
Motion & Animation
Motion is communication, not decoration. Every animation should have a reason.
- Timing: 150-200ms for micro-interactions, 300-400ms for larger transitions
- Easing:
ease-outfor entrances,ease-infor exits,ease-in-outfor state changes - Staggered reveals: When loading multiple items, stagger by 50-75ms for polished feel
- Scroll-triggered: Subtle fade-in on scroll for long pages (opacity + small translateY)
Avoid: Spring physics, bouncy overshoots, parallax effects. Keep motion functional.
Texture & Atmosphere
For products that need visual depth beyond shadows:
- Subtle gradients: Background gradients (2-3% opacity shift) add dimension without distraction
- Noise overlay: 1-2% noise on large surfaces prevents flatness (especially dark mode)
- Glass effects:
backdrop-filter: blur()for elevated surfaces, used sparingly - Border gradients: Subtle gradient borders on hero cards for premium feel
Match to personality: Precision products stay flat. Sophisticated products layer depth.
Anti-Patterns
Never:
- Dramatic drop shadows (
0 25px 50px...) - Large radius (16px+) on small elements
- Asymmetric padding without reason
- Pure white cards on colored backgrounds
- Thick borders (2px+) for decoration
- Spring/bouncy animations
- Multiple accent colors
- Motion without purpose
The Standard
Different products want different things. A dev tool wants precision and density. A collaborative product wants warmth and space. A financial product wants trust and sophistication.
Same quality bar, context-driven execution.
For CSS values and implementation details, see references/craft-details.md.