Typography System
Type scale, font pairing, responsive text, and prose styling with Tailwind
You are a typography engineer who builds type systems that are readable, hierarchical, and consistent across every screen size. You define type scales that create clear visual hierarchy, pair fonts that complement each other, and use Tailwind's prose plugin for long-form content. Good typography is invisible — bad typography is the first thing users notice. ## Key Points - Use `antialiased` on the body for smoother font rendering on macOS and iOS. - Set `max-w-prose` (65ch) on long-form text blocks for optimal line length readability. - Use `tracking-tight` (-0.01em to -0.025em) on headings larger than 24px to prevent them from looking loose. - Load fonts with `font-display: swap` (Next.js does this automatically) to avoid invisible text during load. - Use `leading-relaxed` (1.625) for body text and `leading-tight` (1.25) for headings. - Define font sizes with line-height in Tailwind config to ensure they're always paired. - **More than 2-3 font families**: Each font adds load time and visual complexity. One sans-serif + one monospace covers 95% of use cases. - **Font size below 12px**: Text smaller than 12px is illegible on most screens and fails accessibility. Use 12px minimum for UI labels, 14px minimum for body. - **No line-height on headings**: Default line-height on large headings creates excessive gap between lines. Use `leading-tight` or `leading-none` for display text. - **Justify-aligned body text**: Justified text creates uneven word spacing that reduces readability, especially on narrow containers. Use `text-left` for body copy. - **Using font-weight as the only hierarchy signal**: Size, weight, color, and spacing work together to create hierarchy. Relying only on bold/normal makes pages feel flat.
skilldb get tailwind-design-system-skills/typography-systemFull skill: 174 linesTypography System
You are a typography engineer who builds type systems that are readable, hierarchical, and consistent across every screen size. You define type scales that create clear visual hierarchy, pair fonts that complement each other, and use Tailwind's prose plugin for long-form content. Good typography is invisible — bad typography is the first thing users notice.
Core Philosophy
Scale Creates Hierarchy
A well-defined type scale (using a modular ratio like 1.25) ensures every heading, body, and caption size has a clear relationship. Random font sizes create visual chaos.
Readability Over Aesthetics
Line length under 75 characters, line height at 1.5-1.75 for body text, and sufficient contrast. These rules aren't negotiable — they're how human eyes work.
System Fonts as a Strong Default
System font stacks load instantly and feel native. Custom fonts add personality but cost performance. Use them intentionally, not by default.
Techniques
1. Type Scale with CSS Variables
:root {
--font-sans: "Inter", ui-sans-serif, system-ui, -apple-system, sans-serif;
--font-mono: "JetBrains Mono", ui-monospace, "Cascadia Code", monospace;
--text-xs: 0.75rem; /* 12px */
--text-sm: 0.875rem; /* 14px */
--text-base: 1rem; /* 16px */
--text-lg: 1.125rem; /* 18px */
--text-xl: 1.25rem; /* 20px */
--text-2xl: 1.5rem; /* 24px */
--text-3xl: 1.875rem; /* 30px */
--text-4xl: 2.25rem; /* 36px */
}
2. Tailwind Font Config
// tailwind.config.ts
export default {
theme: {
extend: {
fontFamily: {
sans: ["var(--font-sans)"],
mono: ["var(--font-mono)"],
},
fontSize: {
// Custom sizes with built-in line-height
"display-lg": ["3.5rem", { lineHeight: "1.1", letterSpacing: "-0.02em", fontWeight: "700" }],
"display-sm": ["2.25rem", { lineHeight: "1.2", letterSpacing: "-0.01em", fontWeight: "700" }],
"heading": ["1.5rem", { lineHeight: "1.3", fontWeight: "600" }],
"body": ["0.9375rem", { lineHeight: "1.6" }],
"caption": ["0.8125rem", { lineHeight: "1.4" }],
},
},
},
} satisfies Config;
3. Heading Component with Consistent Sizing
const headingStyles = {
h1: "text-3xl sm:text-4xl font-bold tracking-tight text-foreground",
h2: "text-2xl sm:text-3xl font-semibold tracking-tight text-foreground",
h3: "text-xl font-semibold text-foreground",
h4: "text-lg font-semibold text-foreground",
} as const;
function Heading({ as: Tag = "h2", children, className }: HeadingProps) {
return <Tag className={cn(headingStyles[Tag], className)}>{children}</Tag>;
}
// Usage
<Heading as="h1">Dashboard Overview</Heading>
4. Responsive Text Utility
// Scale headings down on mobile
<h1 className="text-2xl sm:text-3xl lg:text-4xl font-bold tracking-tight">
Welcome back, {user.name}
</h1>
// Body text stays readable at all sizes
<p className="text-sm sm:text-base text-muted-foreground leading-relaxed max-w-prose">
{description}
</p>
5. Prose Styling with @tailwindcss/typography
// Install: npm install @tailwindcss/typography
// Add to tailwind.config.ts plugins: [require('@tailwindcss/typography')]
<article className="prose prose-gray dark:prose-invert prose-headings:tracking-tight prose-a:text-primary prose-code:before:content-none prose-code:after:content-none max-w-none">
<div dangerouslySetInnerHTML={{ __html: markdownContent }} />
</article>
6. Font Loading with Next.js
// app/layout.tsx
import { Inter, JetBrains_Mono } from "next/font/google";
const inter = Inter({ subsets: ["latin"], variable: "--font-sans" });
const jetbrainsMono = JetBrains_Mono({ subsets: ["latin"], variable: "--font-mono" });
export default function RootLayout({ children }: { children: React.ReactNode }) {
return (
<html className={`${inter.variable} ${jetbrainsMono.variable}`}>
<body className="font-sans antialiased">{children}</body>
</html>
);
}
7. Text Truncation Patterns
// Single line truncation
<p className="truncate">{longText}</p>
// Multi-line clamp
<p className="line-clamp-3 text-sm text-muted-foreground">{description}</p>
// Truncate with tooltip for full text
<Tooltip content={fullText}>
<p className="truncate max-w-[200px] text-sm">{fullText}</p>
</Tooltip>
8. Code and Monospace Typography
// Inline code
<code className="rounded bg-muted px-1.5 py-0.5 text-sm font-mono text-foreground">
npm install
</code>
// Code block
<pre className="rounded-lg bg-gray-950 p-4 overflow-x-auto">
<code className="text-sm font-mono text-gray-300 leading-relaxed">
{codeString}
</code>
</pre>
9. Tabular Numbers for Data
// Use tabular-nums for aligned numbers in tables and stats
<td className="tabular-nums text-right font-medium">{formatCurrency(amount)}</td>
<div className="text-3xl font-bold tabular-nums tracking-tight">
{animatedCount.toLocaleString()}
</div>
Best Practices
- Use
antialiasedon the body for smoother font rendering on macOS and iOS. - Set
max-w-prose(65ch) on long-form text blocks for optimal line length readability. - Use
tracking-tight(-0.01em to -0.025em) on headings larger than 24px to prevent them from looking loose. - Load fonts with
font-display: swap(Next.js does this automatically) to avoid invisible text during load. - Use
leading-relaxed(1.625) for body text andleading-tight(1.25) for headings. - Define font sizes with line-height in Tailwind config to ensure they're always paired.
Anti-Patterns
- More than 2-3 font families: Each font adds load time and visual complexity. One sans-serif + one monospace covers 95% of use cases.
- Font size below 12px: Text smaller than 12px is illegible on most screens and fails accessibility. Use 12px minimum for UI labels, 14px minimum for body.
- No line-height on headings: Default line-height on large headings creates excessive gap between lines. Use
leading-tightorleading-nonefor display text. - Justify-aligned body text: Justified text creates uneven word spacing that reduces readability, especially on narrow containers. Use
text-leftfor body copy. - Using font-weight as the only hierarchy signal: Size, weight, color, and spacing work together to create hierarchy. Relying only on bold/normal makes pages feel flat.
Install this skill directly: skilldb add tailwind-design-system-skills
Related Skills
Accessibility Patterns
Focus styles, screen reader support, ARIA, and keyboard navigation with Tailwind
Animation & Motion Design
Transitions, keyframe animations, and spring-like animations with Tailwind
Design Token Color System
Design token color system with semantic colors, dark mode, and CSS variables in Tailwind
Component Variants with Tailwind
Building component variants with CVA/class-variance-authority and Tailwind
Dark Mode Implementation
Dark mode implementation with Tailwind dark:, CSS variables, and system preference detection
Responsive Design Patterns
Mobile-first responsive design, breakpoint strategy, and container queries with Tailwind