Typography as a creative discipline: typeface selection criteria, type pairing (serif + sans, display + body), modular scale systems, line-height and tracking ratios, hierarchy construction, and web/mobile rendering considerations. The decisions behind design tokens, not the tokens themselves.
From clarcnpx claudepluginhub marvinrichter/clarc --plugin clarcThis skill uses the workspace's default tool permissions.
Designs and optimizes AI agent action spaces, tool definitions, observation formats, error recovery, and context for higher task completion rates.
Enables AI agents to execute x402 payments with per-task budgets, spending controls, and non-custodial wallets via MCP tools. Use when agents pay for APIs, services, or other agents.
Compares coding agents like Claude Code and Aider on custom YAML-defined codebase tasks using git worktrees, measuring pass rate, cost, time, and consistency.
font-display strategy for body vs. display fontsEvaluate every candidate font on five criteria before using it:
| Criterion | What to check |
|---|---|
| Personality | Does the tone match the brand? (geometric = technical, humanist = friendly, slab = authoritative) |
| Rendering quality | Does it look good at screen sizes (12-18px)? Test hinting at small sizes. |
| Weight range | Minimum 4 weights needed: Light/Regular/Medium/Bold. Variable font preferred. |
| Character set | Does it support all required languages (Latin Extended, Cyrillic, Arabic)? |
| License | Free for web use? Requires self-hosting? Commercial license required? |
| Classification | Characteristics | Use for |
|---|---|---|
| Geometric sans | Circle-based O, uniform stroke | Tech, modern, minimal |
| Humanist sans | Variable stroke, organic | UI text, long-form, accessibility |
| Transitional serif | High contrast, bracketed serifs | Premium, editorial |
| Slab serif | Low contrast, block serifs | Authoritative, data-heavy |
| Display | Decorative, expressive | Headlines only, large sizes |
Display and body must be from different classifications:
WORKS:
Geometric sans (display) + Humanist sans (body)
→ Space Grotesk + Inter
Serif (display) + Sans (body)
→ Playfair Display + Source Sans 3
Slab serif (display) + Clean sans (body)
→ Zilla Slab + Roboto
DOES NOT WORK:
Geometric sans + Geometric sans (both Inter-style: boring)
Two serifs (competing, no hierarchy)
Two display fonts (chaotic)
Despite contrasting in classification, paired fonts should share proportions:
A modular scale generates all text sizes from a base size and a ratio. It creates visual harmony — sizes feel related rather than arbitrary.
| Ratio | Name | Character |
|---|---|---|
| 1.067 | Minor Second | Tight, minimal — good for data-dense UIs |
| 1.125 | Major Second | Subtle, professional |
| 1.200 | Minor Third | Balanced — good default |
| 1.250 | Major Third | Clear hierarchy |
| 1.333 | Perfect Fourth | Strong contrast — editorial |
| 1.500 | Perfect Fifth | Very bold — display-heavy |
caption: 10.24px (16 × 1.25⁻²)
small: 12.80px (16 × 1.25⁻¹)
base: 16.00px (16 × 1.25⁰)
large: 20.00px (16 × 1.25¹)
h4: 25.00px (16 × 1.25²)
h3: 31.25px (16 × 1.25³)
h2: 39.06px (16 × 1.25⁴)
h1: 48.83px (16 × 1.25⁵)
display: 61.04px (16 × 1.25⁶)
:root {
--text-xs: 0.640rem; /* 10.24px */
--text-sm: 0.800rem; /* 12.80px */
--text-base: 1.000rem; /* 16.00px */
--text-lg: 1.250rem; /* 20.00px */
--text-xl: 1.563rem; /* 25.00px */
--text-2xl: 1.953rem; /* 31.25px */
--text-3xl: 2.441rem; /* 39.06px */
--text-4xl: 3.052rem; /* 48.83px */
--text-5xl: 3.815rem; /* 61.04px */
}
| Context | Line height | Why |
|---|---|---|
| Display / headlines | 1.1–1.2 | Tight — prevents gaps between lines at large sizes |
| Subheadings | 1.2–1.3 | — |
| Body text | 1.5–1.7 | Loose — aids readability at body sizes |
| Long-form (articles) | 1.6–1.8 | Maximum readability |
| UI labels, buttons | 1.0–1.2 | Single-line — no wrapping expected |
| Context | Tracking | Why |
|---|---|---|
| Headlines (32px+) | -0.02em to -0.04em | Tight — large letters feel too spaced at default |
| Body text | 0 (default) | Never adjust body letter spacing |
| ALL CAPS / small caps | +0.05em to +0.12em | All-caps needs extra air |
| UI labels (12-14px) | +0.01em | Tiny text benefits from extra tracking |
margin-bottomBuild hierarchy using these tools in priority order:
Avoid using all three at once — it creates noise. One or two tools per level is enough.
H1 — 3.052rem / line-height 1.15 / weight 700 / tracking -0.02em
H2 — 2.441rem / line-height 1.20 / weight 700 / tracking -0.01em
H3 — 1.953rem / line-height 1.25 / weight 600 / tracking 0
H4 — 1.563rem / line-height 1.30 / weight 600 / tracking 0
Body large — 1.125rem / line-height 1.60 / weight 400
Body — 1.000rem / line-height 1.60 / weight 400
Body small — 0.875rem / line-height 1.50 / weight 400
Caption — 0.750rem / line-height 1.40 / weight 400 / tracking +0.01em
Use variable fonts where possible — one file covers all weights, reducing HTTP requests:
@font-face {
font-family: 'Inter';
src: url('/fonts/Inter-Variable.woff2') format('woff2-variations');
font-weight: 100 900; /* entire weight axis */
font-display: swap;
}
Use font-display: swap for body text (FOUT — content always readable).
Use font-display: optional for decorative display fonts (skip if load is slow).
Define a fallback that matches the web font's character:
/* For sans-serif web font */
font-family: 'Inter', ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
/* For serif web font */
font-family: 'Playfair Display', ui-serif, Georgia, 'Times New Roman', serif;
/* Mono */
font-family: 'JetBrains Mono', ui-monospace, 'Cascadia Code', 'Fira Code', monospace;
+0.01em letter spacing for clarityfont-display: swap on body text fonts