typography by petekp/agent-skills
npx skills add https://github.com/petekp/agent-skills --skill typography面向用户界面的专业排版,基于大师们的原则。
"排版的存在是为了尊重内容。" — Robert Bringhurst
如需特定主题的详细指导,请查阅以下参考资料:
| 主题 | 何时阅读 |
|---|---|
| masters.md | 寻求权威依据、做出细致判断、理解"为什么" |
| variable-fonts.md | 使用可变字体、流畅的字重、性能优化 |
| font-loading.md | FOIT/FOUT 问题、预加载、核心 Web 指标、自托管 |
| opentype-features.md | 连字、等宽数字、风格集、带斜杠的零 |
| fluid-typography.md | clamp()、text-wrap、截断、垂直节奏、字体平滑 |
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| Tailwind 排版工具、prose 插件、自定义 |
| internationalization.md | RTL 语言、阿拉伯语/希伯来语、中日韩文字、双向文本 |
## 字体系统
### 比例
- 基准:[尺寸,例如 16px]
- 比例:[例如,小三度 1.200]
- 理由:[为何选择此比例]
### 层级
| 层级 | 尺寸 | 字重 | 行高 | 字间距 | 用途 |
|-------|------|--------|-------------|----------------|-----|
| 展示 | ... | ... | ... | ... | 英雄区、营销文案 |
| H1 | ... | ... | ... | ... | 页面标题 |
| H2 | ... | ... | ... | ... | 章节标题 |
| 正文 | ... | ... | ... | ... | 段落 |
| 小号 | ... | ... | ... | ... | 说明文字、标签 |
### 字体
- 主要字体:[字体] — [理由]
- 次要字体:[字体,如适用]
- 等宽字体:[字体,如适用]
### 实现
[可直接使用的 CSS/Tailwind 代码]
## 排版审核
### 问题
| 元素 | 问题 | 建议 |
|---------|---------|----------------|
| ... | ... | ... |
### 快速改进
- [立即改进项 1]
- [立即改进项 2]
正文文本最重要的排版考量:
max-w-prose(约 65ch)使用多个维度建立层级:
| 维度 | 低对比度 | 高对比度 |
|---|---|---|
| 尺寸 | 14px → 16px | 16px → 48px |
| 字重 | 400 → 500 | 400 → 700 |
| 颜色 | Gray-600 → Gray-900 | Gray-400 → Black |
| 大小写 | 正常 | 大写 |
"每个设计使用一种字体。避免斜体和粗体——依靠尺寸的渐变来代替。" — Massimo Vignelli
"在新的计算机时代,字体的泛滥代表了视觉污染的新水平。" — Massimo Vignelli
| 名称 | 比例 | 特点 |
|---|---|---|
| 小二度 | 1.067 | 微妙、保守 |
| 大二度 | 1.125 | 温和、专业 |
| 小三度 | 1.200 | 平衡、通用 |
| 大三度 | 1.250 | 大胆、有冲击力 |
| 纯四度 | 1.333 | 强烈的层级感 |
| 黄金比例 | 1.618 | 戏剧性、适合编辑内容 |
--text-xs: 12px; /* 0.75rem */
--text-sm: 14px; /* 0.875rem */
--text-base: 16px; /* 1rem */
--text-lg: 18px; /* 1.125rem — 不在纯比例中 */
--text-xl: 20px; /* 1.25rem */
--text-2xl: 24px; /* 1.5rem */
--text-3xl: 30px; /* 1.875rem */
--text-4xl: 36px; /* 2.25rem */
--text-5xl: 48px; /* 3rem */
| 场景 | 行高 | 理由 |
|---|---|---|
| 正文文本 | 1.5-1.7 | 为可读性留出充足空间 |
| 标题 | 1.1-1.3 | 更紧凑,尤其是大尺寸时 |
| UI 标签 | 1.2-1.4 | 紧凑但清晰易读 |
| 按钮 | 1.0-1.25 | 单行,紧凑 |
"眼睛不是阅读字母,而是阅读字母之间的空间。" — Adrian Frutiger
| 场景 | 字距调整 | CSS |
|---|---|---|
| 正文文本 | 默认或 +0.01em | tracking-normal |
| 全大写 | +0.05em 到 +0.1em | tracking-wide / tracking-wider |
| 大标题 | -0.01em 到 -0.02em | tracking-tight |
| 小文本 (<14px) | +0.01em 到 +0.02em | tracking-wide |
全大写规则: 始终增加字距。保持简短(1-3 个词)。
/* 无衬线体(现代) */
font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
/* 衬线体 */
font-family: ui-serif, Georgia, Cambria, "Times New Roman", serif;
/* 等宽字体 */
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
| 类别 | 字体 | 使用场景 |
|---|---|---|
| 无衬线体 | Inter, Source Sans 3, Work Sans, DM Sans | UI、正文文本 |
| 衬线体 | Source Serif 4, Lora, Merriweather, Literata | 编辑内容、长篇 |
| 等宽字体 | JetBrains Mono, Fira Code, Source Code Pro | 代码、数据 |
| 展示字体 | Fraunces, Epilogue, Outfit | 标题 |
"父亲不应该偏爱他的任何一个女儿。" — Hermann Zapf(关于他的字体)
/* 标题的平衡行长(≤6 行) */
h1, h2, h3, blockquote, figcaption {
text-wrap: balance;
}
/* 防止正文文本出现孤行 */
p, li {
text-wrap: pretty;
}
注意: 不要在带边框的容器内使用 balance —— 会造成视觉不平衡。
/* 字体在断点之间平滑缩放 */
h1 {
font-size: clamp(2rem, 1rem + 4vw, 4rem);
line-height: clamp(1.1, 1.3 - 0.1vw, 1.3);
}
body {
font-size: clamp(1rem, 0.95rem + 0.25vw, 1.125rem);
}
完整比例请参阅 fluid-typography.md。
/* 单行 */
.truncate {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* 多行(2 行) */
.line-clamp-2 {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
文本在深色背景上看起来更粗。略微减少字重:
@media (prefers-color-scheme: dark) {
body {
font-weight: 350; /* 替代 400 */
}
h1, h2, h3 {
font-weight: 600; /* 替代 700 */
}
}
在深色背景上应用抗锯齿以抵消感知的粗体效果:
.dark-bg {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
使用花引号,而非直引号:
| 类型 | 字符 | 用途 |
|---|---|---|
| 连字符 | - | 单词断字、复合词 |
| 短破折号 | – | 范围(2020–2024)、关系 |
| 长破折号 | — | 插入语陈述 |
| 类型 | 使用场景 | CSS |
|---|---|---|
| 等宽数字 | 表格、价格、对齐 | font-variant-numeric: tabular-nums |
| 比例数字 | 正文文本 | font-variant-numeric: proportional-nums |
| 旧式数字 | 编辑内容 | font-variant-numeric: oldstyle-nums |
| 带斜杠的零 | 代码、数据 | font-feature-settings: "zero" 1 |
完整参考请参阅 opentype-features.md。
| 元素 | 最小值 | 推荐值 |
|---|---|---|
| 正文文本 | 16px | 16-18px |
| 次要文本 | 14px | 14-16px |
| 法律/说明文字 | 12px | 12px + 增加字距 |
| 对比度比率 | 4.5:1 | 7:1 |
/* 使用相对单位,以便用户缩放 */
body {
font-size: 1rem; /* 不是 16px */
}
/* 尊重减少动画的偏好 */
@media (prefers-reduced-motion: reduce) {
* {
transition: none !important;
}
}
:root {
--font-sans: Inter, ui-sans-serif, system-ui, sans-serif;
--font-mono: 'JetBrains Mono', ui-monospace, monospace;
}
body {
font-family: var(--font-sans);
font-size: clamp(1rem, 0.95rem + 0.25vw, 1.125rem);
line-height: 1.6;
font-feature-settings: "kern" 1, "liga" 1, "calt" 1;
}
h1, h2, h3 {
line-height: 1.2;
text-wrap: balance;
letter-spacing: -0.02em;
}
p {
text-wrap: pretty;
max-width: 65ch;
}
code {
font-family: var(--font-mono);
font-variant-numeric: tabular-nums slashed-zero;
}
@media (prefers-color-scheme: dark) {
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
}
<article class="
prose prose-gray lg:prose-lg
prose-headings:text-balance
prose-p:text-pretty
dark:prose-invert
max-w-prose mx-auto
">
<!-- 内容 -->
</article>
完整模式请参阅 tailwind-integration.md。
每周安装次数
149
仓库
GitHub 星标数
2
首次出现
2026年1月22日
安全审计
安装于
opencode140
gemini-cli136
codex134
github-copilot128
cursor121
claude-code108
Professional typography for user interfaces, grounded in principles from the masters.
"Typography exists to honor content." — Robert Bringhurst
For detailed guidance on specific topics, consult these references:
| Topic | When to Read |
|---|---|
| masters.md | Seeking authoritative backing, making nuanced judgments, understanding "why" |
| variable-fonts.md | Using variable fonts, fluid weight, performance optimization |
| font-loading.md | FOIT/FOUT issues, preloading, Core Web Vitals, self-hosting |
| opentype-features.md | Ligatures, tabular numbers, stylistic sets, slashed zero |
| fluid-typography.md | clamp(), text-wrap, truncation, vertical rhythm, font smoothing |
| tailwind-integration.md | Tailwind typography utilities, prose plugin, customization |
| internationalization.md | RTL languages, Arabic/Hebrew, CJK, bidirectional text |
## Type System
### Scale
- Base: [size, e.g., 16px]
- Ratio: [e.g., Minor Third 1.200]
- Rationale: [why this ratio]
### Hierarchy
| Level | Size | Weight | Line Height | Letter Spacing | Use |
|-------|------|--------|-------------|----------------|-----|
| Display | ... | ... | ... | ... | Hero, marketing |
| H1 | ... | ... | ... | ... | Page titles |
| H2 | ... | ... | ... | ... | Section heads |
| Body | ... | ... | ... | ... | Paragraphs |
| Small | ... | ... | ... | ... | Captions, labels |
### Fonts
- Primary: [font] — [rationale]
- Secondary: [font, if applicable]
- Mono: [font, if applicable]
### Implementation
[Ready-to-use CSS/Tailwind]
## Typography Audit
### Issues
| Element | Problem | Recommendation |
|---------|---------|----------------|
| ... | ... | ... |
### Quick Wins
- [Immediate improvement 1]
- [Immediate improvement 2]
The most important typographic considerations for body text:
max-w-prose (~65ch)Establish hierarchy using multiple dimensions:
| Dimension | Low Contrast | High Contrast |
|---|---|---|
| Size | 14px → 16px | 16px → 48px |
| Weight | 400 → 500 | 400 → 700 |
| Color | Gray-600 → Gray-900 | Gray-400 → Black |
| Case | Normal | UPPERCASE |
"Use one typeface per design. Avoid italics and bold—rely on gradations of scale instead." — Massimo Vignelli
"In the new computer age, the proliferation of typefaces represents a new level of visual pollution." — Massimo Vignelli
| Name | Ratio | Character |
|---|---|---|
| Minor Second | 1.067 | Subtle, conservative |
| Major Second | 1.125 | Gentle, professional |
| Minor Third | 1.200 | Balanced, versatile |
| Major Third | 1.250 | Bold, impactful |
| Perfect Fourth | 1.333 | Strong hierarchy |
| Golden Ratio | 1.618 | Dramatic, editorial |
--text-xs: 12px; /* 0.75rem */
--text-sm: 14px; /* 0.875rem */
--text-base: 16px; /* 1rem */
--text-lg: 18px; /* 1.125rem — not in pure scale */
--text-xl: 20px; /* 1.25rem */
--text-2xl: 24px; /* 1.5rem */
--text-3xl: 30px; /* 1.875rem */
--text-4xl: 36px; /* 2.25rem */
--text-5xl: 48px; /* 3rem */
| Context | Line Height | Rationale |
|---|---|---|
| Body text | 1.5-1.7 | Generous for readability |
| Headings | 1.1-1.3 | Tighter, especially large sizes |
| UI labels | 1.2-1.4 | Compact but legible |
| Buttons | 1.0-1.25 | Single line, tight |
"The eye does not read letters, but the space between them." — Adrian Frutiger
| Context | Tracking | CSS |
|---|---|---|
| Body text | Default or +0.01em | tracking-normal |
| All caps | +0.05em to +0.1em | tracking-wide / tracking-wider |
| Large headings | -0.01em to -0.02em | tracking-tight |
| Small text (<14px) | +0.01em to +0.02em | tracking-wide |
All-caps rule: Always add tracking. Keep short (1-3 words).
/* Sans-serif (modern) */
font-family: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";
/* Serif */
font-family: ui-serif, Georgia, Cambria, "Times New Roman", serif;
/* Monospace */
font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
| Category | Fonts | Use Case |
|---|---|---|
| Sans-serif | Inter, Source Sans 3, Work Sans, DM Sans | UI, body text |
| Serif | Source Serif 4, Lora, Merriweather, Literata | Editorial, long-form |
| Monospace | JetBrains Mono, Fira Code, Source Code Pro | Code, data |
| Display | Fraunces, Epilogue, Outfit | Headlines |
"A father should not have a favorite among his daughters." — Hermann Zapf (on his typefaces)
/* Balanced line lengths for headings (≤6 lines) */
h1, h2, h3, blockquote, figcaption {
text-wrap: balance;
}
/* Prevent orphans in body text */
p, li {
text-wrap: pretty;
}
Caveat: Don't use balance inside bordered containers—creates visual imbalance.
/* Font scales smoothly between breakpoints */
h1 {
font-size: clamp(2rem, 1rem + 4vw, 4rem);
line-height: clamp(1.1, 1.3 - 0.1vw, 1.3);
}
body {
font-size: clamp(1rem, 0.95rem + 0.25vw, 1.125rem);
}
See fluid-typography.md for complete scale.
/* Single line */
.truncate {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Multi-line (2 lines) */
.line-clamp-2 {
display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
}
Text appears heavier on dark backgrounds. Reduce weight slightly:
@media (prefers-color-scheme: dark) {
body {
font-weight: 350; /* Instead of 400 */
}
h1, h2, h3 {
font-weight: 600; /* Instead of 700 */
}
}
Apply antialiasing on dark backgrounds to counter perceived boldness:
.dark-bg {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
Use curly quotes, not straight:
| Type | Character | Use |
|---|---|---|
| Hyphen | - | Word breaks, compounds |
| En dash | – | Ranges (2020–2024), relationships |
| Em dash | — | Parenthetical statements |
| Type | Use Case | CSS |
|---|---|---|
| Tabular | Tables, prices, alignment | font-variant-numeric: tabular-nums |
| Proportional | Body text | font-variant-numeric: proportional-nums |
| Old-style | Editorial content | font-variant-numeric: oldstyle-nums |
| Slashed zero | Code, data | font-feature-settings: "zero" 1 |
See opentype-features.md for complete reference.
| Element | Minimum | Preferred |
|---|---|---|
| Body text | 16px | 16-18px |
| Secondary text | 14px | 14-16px |
| Legal/caption | 12px | 12px + increased tracking |
| Contrast ratio | 4.5:1 | 7:1 |
/* Use relative units so users can scale */
body {
font-size: 1rem; /* Not 16px */
}
/* Respect reduced motion */
@media (prefers-reduced-motion: reduce) {
* {
transition: none !important;
}
}
:root {
--font-sans: Inter, ui-sans-serif, system-ui, sans-serif;
--font-mono: 'JetBrains Mono', ui-monospace, monospace;
}
body {
font-family: var(--font-sans);
font-size: clamp(1rem, 0.95rem + 0.25vw, 1.125rem);
line-height: 1.6;
font-feature-settings: "kern" 1, "liga" 1, "calt" 1;
}
h1, h2, h3 {
line-height: 1.2;
text-wrap: balance;
letter-spacing: -0.02em;
}
p {
text-wrap: pretty;
max-width: 65ch;
}
code {
font-family: var(--font-mono);
font-variant-numeric: tabular-nums slashed-zero;
}
@media (prefers-color-scheme: dark) {
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
}
<article class="
prose prose-gray lg:prose-lg
prose-headings:text-balance
prose-p:text-pretty
dark:prose-invert
max-w-prose mx-auto
">
<!-- Content -->
</article>
See tailwind-integration.md for complete patterns.
Weekly Installs
149
Repository
GitHub Stars
2
First Seen
Jan 22, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
opencode140
gemini-cli136
codex134
github-copilot128
cursor121
claude-code108
agentation - AI智能体可视化UI反馈工具,连接人眼与代码的桥梁
5,400 周安装