Skip to main content

Visual Design

When to use: After rendering verification passes. Before any design review. After completing initial layout.

The test: Squint at your screen from arm's length. Can you tell what's important, what's clickable, and where sections begin and end?


Contrast and Legibility

Every text element must be readable. No exceptions.

CheckThresholdHow to Measure
Body text contrast4.5:1 minimum against backgroundChrome DevTools color picker or axe DevTools
Large text contrast (18px+ bold or 24px+)3:1 minimumSame tools
UI component contrast (borders, icons)3:1 minimum against adjacent colorsDevTools contrast checker
Link distinctionUnderline OR 3:1 contrast against surrounding textVisual inspection + contrast tool
Placeholder text4.5:1 minimum (it's real content until the user types)DevTools computed color

Legibility Checklist

  • Body text 16px minimum on all viewports
  • No text on image backgrounds unless overlay provides 4.5:1 contrast
  • Light text on dark backgrounds uses 300+ weight (thin fonts disappear)
  • Maximum 2-3 font families across the entire site
  • Monospace reserved for code only

Typographic Scale

Consistent ratios create visual rhythm. Arbitrary sizes create noise.

ElementSize RangeWeightLine Height
H132-48pxBold (700)1.1-1.2
H224-32pxSemibold (600)1.2-1.3
H318-24pxMedium (500)1.3-1.4
Body16-18pxRegular (400)1.5-1.75
Small/Caption14pxRegular (400)1.4-1.5
CheckThresholdHow to Measure
Scale ratio consistentAll steps follow 1.2x, 1.25x, or 1.333x ratioDivide each heading size by the next smaller
One H1 per pageExactly 1DOM query: document.querySelectorAll('h1').length
Heading hierarchy unbrokenNo skipped levels (H1 to H3 without H2)DOM audit or axe DevTools
Line length (measure)45-75 characters per lineDevTools: set a ch unit counter or count manually
Paragraph spacingGreater than line-height, less than 2x line-heightDevTools: compare margin-bottom to line-height

Typography Checklist

  • Each heading level at least 4px larger than the next (H1 > H2 by 8px+, H2 > H3 by 4px+)
  • Body text line-height between 1.5 and 1.75
  • Line length between 45 and 75 characters on desktop
  • No orphaned headings (heading followed immediately by another heading)
  • Caption/small text used only for supplementary information, never primary content

Spacing and Rhythm

Spacing tells the truth about relationships. Related items close, unrelated items far.

CheckThresholdHow to Measure
Base unit definedSingle value (4px or 8px)Check design tokens or CSS variables
All spacing is a multiple of baseZero arbitrary values (17px, 23px)DevTools: audit margin/padding values
Proximity principleSpace within groups less than space between groupsCompare intra-group vs inter-group spacing
Section padding consistentSame vertical padding across all sectionsDevTools: compare padding-top/bottom per section
No dead zonesNo areas larger than 200px with zero content or interactionVisual scan at each breakpoint

Spacing Scale Reference

TokenValueUse
xs4pxIcon gaps, tight inline elements
sm8pxWithin related form elements
md16pxBetween elements in a group
lg24pxBetween groups
xl32pxBetween sub-sections
2xl48pxBetween sections
3xl64-96pxHero spacing, page-level divisions

Spacing Checklist

  • Consistent spacing scale used throughout (no magic numbers)
  • Related items grouped tighter than unrelated items
  • Section spacing larger than element spacing
  • Padding inside containers is consistent within repeated patterns
  • Touch targets have at least 8px clearance from adjacent targets

Visual Hierarchy

The eye must know where to go. One thing dominates, everything else supports it.

CheckThresholdHow to Measure
Primary focal pointExactly 1 per viewport-height of contentScreenshot at 25% zoom: one element clearly largest
Size progressionEach heading level 1.2x+ larger than the nextDevTools: divide each heading's computed font-size by the next
CTA color reservedPrimary action color appears on zero non-clickable elementsSearch rendered page for the CTA hex value
Section boundaries visibleSpacing between sections 2x+ spacing within sectionsDevTools: compare inter-section vs intra-section margins
Reading pattern respectedKey content on expected scan paths (top-left for F, diagonal for Z)5-second test: ask 3 people where their eyes went first

F-Pattern

Users scan: top horizontal, shorter horizontal below, vertical down left side.

  • Key information in top-left quadrant
  • Headlines left-aligned
  • First two paragraphs contain the most important information
  • Bullet points break walls of text

Z-Pattern

Users scan: top-left to top-right, diagonal to bottom-left, bottom-left to bottom-right.

  • Brand/logo top-left
  • Navigation top-right
  • Key visual/headline center
  • CTA bottom-right

Color Hierarchy

  • Maximum 3 colors plus neutrals
  • Primary color reserved for main CTA only
  • Secondary color for supporting actions
  • Neutral palette for everything else
  • Consistent color meaning (red = destructive, green = success) across all pages

Quick Diagnosis

SymptomLikely CauseFix
Everything looks the sameNo size hierarchyMake H1 at least 2x body size
Feels crampedInsufficient whitespaceDouble section spacing
Can't find the CTACompeting colorsReserve one color for actions only
Hard to scanNo visual anchorsAdd section headers, increase spacing
Feels chaoticInconsistent spacingAudit all values, apply spacing scale
Text hard to readLow contrast or long linesCheck contrast ratio, reduce line length
Sections blur togetherNo visual boundariesAdd spacing, background color changes, or dividers

Context