Typography Expert
Master typographer specializing in font pairing, typographic hierarchy, OpenType features, variable fonts, and performance-optimized web typography.
When to Use This Skill
✅ Use for:
- •Font pairing recommendations for brand identity
- •Typographic hierarchy for design systems
- •Performance-optimized web font implementation
- •Variable font integration with CSS custom properties
- •Type scale calculations (modular, fluid, responsive)
- •Font loading strategies (FOUT/FOIT/FOFT prevention)
- •OpenType feature implementation (ligatures, small caps, numerals)
- •Accessibility compliance for typography (WCAG contrast, sizing)
- •Dark mode typography compensation
- •Multilingual typography support (RTL, CJK, diacritics)
❌ Do NOT use for:
- •Logo design or wordmark creation → use design-system-creator
- •Icon font implementation → use web-design-expert
- •General CSS styling unrelated to type → not a typography issue
- •Image-based or rasterized typography → different domain
- •Brand strategy or naming → this is visual implementation only
- •Motion graphics with text → use native-app-designer
Core Expertise
Font Selection Psychology
Serif vs Sans-Serif Decision Tree:
IF formal/traditional/authoritative needed → Serif (Garamond, Minion, Crimson) IF modern/clean/technical needed → Sans-Serif (Inter, Helvetica, Roboto) IF humanist/friendly/approachable → Humanist Sans (Gill Sans, Fira Sans, Source Sans) IF geometric/structured/tech-forward → Geometric Sans (Futura, Avenir, Poppins) IF editorial/long-form reading → Transitional Serif (Georgia, Charter, Lora)
Pairing Rules (Expert Knowledge):
- •Contrast, not conflict - Pair fonts with distinct personalities but compatible x-heights
- •Same designer rule - Fonts from same designer/foundry often pair well (Baskerville + Franklin Gothic)
- •Historical compatibility - Fonts from same era share design DNA (Didot + Bodoni: both Didone)
- •Superfamily shortcut - Use superfamily (Alegreya + Alegreya Sans) for guaranteed harmony
Type Scale Systems
Modular Scale Ratios:
| Ratio | Name | Use Case |
|---|---|---|
| 1.067 | Minor Second | Dense UIs, small screens |
| 1.125 | Major Second | General web content |
| 1.200 | Minor Third | Most common, balanced hierarchy |
| 1.250 | Major Third | Marketing, headlines |
| 1.333 | Perfect Fourth | Bold statements, hero sections |
| 1.414 | Augmented Fourth | Editorial, dramatic hierarchy |
| 1.618 | Golden Ratio | Classical, use sparingly (too large for most UI) |
Fluid Typography Formula (2024 Best Practice):
/* Base: 16px at 320px viewport, 20px at 1200px viewport */ font-size: clamp(1rem, 0.875rem + 0.5vw, 1.25rem); /* Heading: 32px at 320px, 64px at 1200px */ font-size: clamp(2rem, 1rem + 3.6vw, 4rem);
Variable Fonts
Axis Control (Expert Knowledge):
| Axis | Tag | Range | Use Case |
|---|---|---|---|
| Weight | wght | 100-900 | Adjust weight without loading multiple files |
| Width | wdth | 75-125 | Responsive text that adapts to container |
| Slant | slnt | -12-0 | Oblique without separate italic file |
| Optical Size | opsz | 8-144 | Auto-adjust stroke contrast for size |
| Grade | GRAD | -200-150 | Adjust weight without reflowing (dark mode) |
Critical: Dark Mode Compensation
/* Text appears lighter on dark backgrounds - compensate with grade or weight */
@media (prefers-color-scheme: dark) {
body {
/* If variable font supports grade: */
font-variation-settings: "GRAD" 50;
/* Or bump weight slightly: */
font-weight: 450; /* Instead of 400 */
}
}
Performance Optimization
Font Loading Priority:
- •Critical CSS first - Inline @font-face for above-fold fonts
- •Preload primary -
<link rel="preload" as="font" crossorigin> - •font-display: swap - Show fallback immediately, swap when loaded
- •Subset aggressively - Latin Extended covers most Western languages at ~30KB vs ~150KB full
Budget Guidelines:
| Performance Tier | Total Font Budget | Files |
|---|---|---|
| Fast (Core Web Vitals) | Under 100KB | 2-3 WOFF2 |
| Balanced | 100-200KB | 4-5 WOFF2 |
| Rich Typography | 200-400KB | 6-8 WOFF2 |
System Font Stack (Zero Budget):
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
"Helvetica Neue", Arial, sans-serif, "Apple Color Emoji",
"Segoe UI Emoji";
Common Anti-Patterns
Anti-Pattern: Too Many Typefaces
What it looks like: 4+ different font families on one page Why it's wrong: Creates visual chaos, destroys hierarchy, massive performance hit What to do instead: Maximum 2 families (heading + body), use weight/style variations
Anti-Pattern: Ignoring x-Height Matching
What it looks like: Body text and fallback system font have visibly different sizes at same px
Why it's wrong: CLS (Cumulative Layout Shift) when web font loads
What to do instead: Use size-adjust in @font-face to match fallback x-height
@font-face {
font-family: "Inter";
src: url("inter.woff2") format("woff2");
size-adjust: 107%; /* Matches Arial x-height */
}
Anti-Pattern: Weight Jumps Too Large
What it looks like: Using 400 for body and 700 for headings (300-point jump) Why it's wrong: Creates harsh hierarchy, especially at large sizes What to do instead: Use closer weights: 400/600 or 350/500 for subtle hierarchy
Anti-Pattern: Line Height as Unitless Number Everywhere
What it looks like: line-height: 1.5 applied globally
Why it's wrong: Headings need tighter line-height (1.1-1.2), body needs looser (1.5-1.7)
What to do instead: Set line-height per type level
Anti-Pattern: Fixed Font Sizes
What it looks like: font-size: 16px hardcoded
Why it's wrong: Breaks user preferences, accessibility issues, no responsive scaling
What to do instead: Use rem units with clamp() for fluid sizing
Anti-Pattern: Loading Full Character Sets
What it looks like: Loading 800KB font file with Cyrillic, Greek, Vietnamese Why it's wrong: 90%+ of file unused for English-only sites What to do instead: Subset to Latin or Latin Extended (~30KB)
OpenType Features
Features Worth Enabling:
/* Proper numerals for tabular data */ font-feature-settings: "tnum" 1; /* Tabular numerals */ /* Proper fractions */ font-feature-settings: "frac" 1; /* 1/2 → ½ */ /* Small caps for abbreviations */ font-feature-settings: "smcp" 1, "c2sc" 1; /* Stylistic alternates for brand */ font-feature-settings: "ss01" 1; /* Check font for available sets */
Modern CSS Alternative:
font-variant-numeric: tabular-nums; font-variant-numeric: diagonal-fractions; font-variant-caps: small-caps;
Vertical Rhythm & Baseline Grid
Expert Approach:
- •Set base line-height (e.g., 1.5 × 16px = 24px)
- •All spacing (margin, padding) as multiples of 24px
- •Headings snap to baseline (line-height: 48px for h1 at 36px)
:root {
--baseline: 1.5rem; /* 24px */
}
h1 {
font-size: 2.25rem;
line-height: calc(var(--baseline) * 2); /* 48px */
margin-bottom: var(--baseline);
}
p {
line-height: var(--baseline);
margin-bottom: var(--baseline);
}
Responsive Typography Breakpoints
Decision Tree:
Mobile (< 640px): - Base: 16px - Scale: 1.125 (Major Second) - Tighter hierarchy Tablet (640-1024px): - Base: 17px - Scale: 1.2 (Minor Third) - Standard hierarchy Desktop (> 1024px): - Base: 18-20px - Scale: 1.25 (Major Third) - Expanded hierarchy Large Display (> 1440px): - Consider max-width on prose (65-75ch) - Don't keep scaling indefinitely
Accessibility Requirements
WCAG 2.1 AA Compliance:
- •Minimum contrast: 4.5:1 for body text, 3:1 for large text (24px+ or 18.5px+ bold)
- •Resizing: Text must be resizable to 200% without loss of content
- •Line spacing: At least 1.5× font size
- •Paragraph spacing: At least 2× font size
- •Letter spacing: User must be able to override to 0.12× font size
- •Word spacing: User must be able to override to 0.16× font size
Integration with Other Skills
Works well with:
- •design-system-creator - Typography tokens for design systems
- •vibe-matcher - Font selection based on brand vibe
- •web-design-expert - Implement typography in layouts
- •vaporwave-glassomorphic-ui-designer - Retro-futuristic type treatments
Evolution Timeline
Pre-2015: Web-Safe Fonts Era
Limited to Arial, Georgia, Times New Roman. "Modern" meant using Helvetica.
2015-2019: Google Fonts Explosion
Everyone used Open Sans, Roboto, Montserrat. Performance secondary to variety.
2020-2022: Variable Fonts Adoption
Single file, multiple weights/widths. Inter became the new default.
2023-Present: Performance-First Typography
Core Web Vitals pressure. Subsetting, font-display, CLS prevention mandatory. System font stacks gaining popularity for zero-load-time.
Watch For
LLMs may suggest deprecated approaches:
- •
@importfor fonts (blocks rendering) - •Non-variable font families with 8+ weights
- •Font Awesome for icons (use SVG sprites instead)
Quick Reference
Ideal Line Length: 45-75 characters (65ch is sweet spot)
Heading Sizes (Minor Third Scale):
- •h1: 2.986rem
- •h2: 2.488rem
- •h3: 2.074rem
- •h4: 1.728rem
- •h5: 1.44rem
- •h6: 1.2rem
- •body: 1rem
Safe Google Font Pairings:
- •Inter + Merriweather (Modern + Traditional)
- •Poppins + Lora (Friendly + Elegant)
- •Space Grotesk + Source Serif (Tech + Editorial)
- •DM Sans + DM Serif Display (Same designer harmony)
Typography is invisible when it works, but unforgettable when it doesn't.