open-design/craft/typography-hierarchy-editorial.md
Vedank Vansia ee3ca5f4f0
refine typography-hierarchy craft docs — clarify edge cases and make lint measurable (#979)
* add typography-hierarchy and typography-hierarchy-editorial craft rules

Adds two layered craft files extending typography.md:

- typography-hierarchy.md: core hierarchy contract, vectors, failure modes,
  controlled violations, and lint checklist
- typography-hierarchy-editorial.md: editorial pacing, dramatic scale jumps,
  whitespace hierarchy, display tracking overrides, and editorial-specific lint

Both files are registered in craft/README.md with guidance on when to require them.
Includes a new editorial stack example showing the layered opt-in pattern.

Validation:
- pnpm guard: PASSED
- Universal craft knowledge (not brand-specific)
- Stable slugs: typography-hierarchy, typography-hierarchy-editorial
- No new dependencies or breaking changes

Passes craft additions lane per code-review-guidelines.md.

* wire typography base into editorial skills craft stack

All three editorial skills now require the complete layered stack:
  [typography, typography-hierarchy, typography-hierarchy-editorial, rtl-and-bidi]

The new hierarchy files (typography-hierarchy.md, typography-hierarchy-editorial.md)
explicitly extend typography.md and depend on its base contract (scale ranges,
tracking values, line-height guidance, weight system). Without typography in
requires[], the hierarchy rules arrive at runtime without their foundational
contracts, making them incomplete.

Skills updated:
- skills/blog-post/SKILL.md
- skills/docs-page/SKILL.md
- skills/digital-eguide/SKILL.md

This completes the craft injection for the editorial stack as documented in
craft/README.md and ensures both base typography and hierarchy extensions load
together at runtime.

* refine craft docs for clarity and edge cases

Address P2/P3 reviewer feedback:

- typography-hierarchy-editorial.md §4: Add script-aware exception for Arabic/Hebrew/Persian
  tracking (cursive joining breaks with negative letter-spacing; use scale/space instead)

- typography-hierarchy.md Controlled violations: Add concrete safeguards for 'information
  flow remains intact' (reading order, proximity grouping, single primary, quick scanability)

- typography-hierarchy-editorial.md §2 Whitespace: Qualify 'no divider' rule to allow
  separators for publication identity, not just space alone

- typography-hierarchy-editorial.md Anti-patterns: Add docs-page carve-out for 'UI chrome'
  (functional controls in code/API blocks are OK; decorative badges belong outside measure)

- typography-hierarchy-editorial.md Lint: Make checks measurable — display/deck ratio >=1.5x,
  section spacing ratio rules (one gap >=1.5x baseline, another <=1.2x), separator identity
  check, and explicit guidance markers for auditability

* address P1/P2/P3 reviewer feedback: RTL conflicts, script accuracy, tracking scope, measurability

P1 — RTL physical-direction conflicts:
  - typography-hierarchy-editorial.md: Change 'ragged right' to 'text-align: start with
    ragged inline-end' for RTL compatibility
  - Separators in RTL: Add note on logical directions (inline-start/inline-end)
  - skills/digital-eguide/SKILL.md: Replace 'cover left, spread right' with
    'inline-start/inline-end' and 'pinned right-side' with 'pinned to inline-end'

P2 — Script-group accuracy:
  - Split script groups correctly: Arabic/Persian/Urdu cursive-joining (letter-spacing 0);
    Hebrew is RTL but not cursive-joining

P2 — Tracking exception scope:
  - Extend script exception to pull-quote tracking row (was only on display)
  - Mark both as Latin-only with joining-script carve-out

P2 — Primary-count inconsistency:
  - Clarify 'one at a time per visual region' with explicit long-form pacing resets note

P3 — Measurable lint:
  - Replace vague 'meaningfully larger' with >=1.5x baseline rhythm OR one token scale step

P3 — Orphaned reference:
  - Fix cross-ref to 'typography.md §letter-spacing' (was §display tracking)

P3 — Markdown typo:
  - Fix backtick nesting in '1.6–1.7' line-height range

* fix: RTL logical 'ragged' wording; make digital-eguide pull-quote script-aware; align section-separators lint with prose

* fix(P2): include Persian/Urdu in pull-quote script exception; remove 'space' from section-separators lint

* fix: align pull-quote bullet indentation in digital-eguide SKILL.md

* fix: align digital-eguide pull-quote bullet nesting

* fix: use logical pull-quote alignment wording in editorial craft
2026-05-09 08:13:35 +08:00

182 lines
8.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Editorial typography hierarchy craft rules
Extends `typography.md` + `typography-hierarchy.md`. Defines hierarchy
behavior for editorial surfaces: long-form articles, magazine layouts,
digital guides, editorial landing pages, and blog posts.
> Opt in via `od.craft.requires: [typography, typography-hierarchy, typography-hierarchy-editorial]`.
---
## What "editorial" means here
Editorial hierarchy means the pacing is authored the way a print art director
paces a spread: entry point, tension, rest, disruption, resolution. The reader
is moved through content rather than given a uniform reading surface. SaaS
hierarchy is additive — elements stack and each gets its turn. Editorial
hierarchy is compositional — elements are weighted against each other and
some are deliberately suppressed so others can breathe.
---
## Editorial hierarchy principles
### 1. Dramatic scale jumps
Editorial type scales are not gradual. The gap between display and body
is large — often 35× — because the display element is not just a heading,
it is a visual event.
| Level | Typical range | Notes |
|---|---|---|
| Display / lede | 5696 px | (editorial override) May intentionally exceed the default `typography.md` display range |
| Deck / standfirst | 1824 px | Large jump down — intentional |
| Body | 1618 px | Close to deck is fine; they're in the same reading register |
| Pull quote | 2840 px | Disrupts body rhythm; treated as a visual break, not a heading |
| Caption / label | 1113 px | Minimal — never competes with body |
The gap between display and deck is the editorial signature. A small step
here reads as SaaS, not editorial.
### 2. Whitespace carries hierarchy
Editorial hierarchy is not announced by a heavy heading. It is created by
the space that surrounds an element. An article title in a moderate weight
surrounded by generous whitespace outranks a bold heading crammed against
its content.
Rules:
- Above-the-fold display element: minimum 2× the line-height in space above
and below before body begins.
- Pull quotes: full column margin on both sides, or break the grid entirely.
- Section breaks: use space as the default hierarchy signal. Separators (rules, dingbats,
folios, chapter marks) are allowed only when they reinforce publication identity or
distinguish unrelated content. For RTL layouts, mirror or adapt separators using
logical directions (inline-start, inline-end) rather than physical (left, right).
- Caption clusters: tighter internal spacing, larger gap from the body above.
### 3. Restrained bold
Editorial systems use weight sparingly. The display element is often set in
a light or regular weight — hierarchy is carried by scale and space, not mass.
Bold in editorial context means: this word/phrase matters beyond the sentence.
It is not used for section labels, UI chrome, or navigation. One to two bold
phrases per 400 words of body copy is a working upper bound.
If everything important is bold, nothing is.
### 4. Display tracking
Negative tracking at large sizes is mandatory for Latin display. At editorial display sizes
(56 px+), tracking should be `-0.02em` to `-0.05em` (editorial override;
see `typography.md` §letter-spacing for the default range). Light display
weights may go tighter within this range.
**Script-aware exception:** For Arabic, Persian, and Urdu (cursive-joining scripts),
keep tracking at `0` — negative letter-spacing breaks cursive joining (see `rtl-and-bidi`).
Hebrew uses logical spacing rules but is not cursive-joining; consult `rtl-and-bidi`
for right-to-left baseline adjustments. Hierarchy in these scripts is carried by size,
weight, and whitespace, not tracking.
---
### 5. Pull quotes as rhythm disruption
A pull quote is not a blockquote. It is a visual interrupt.
| Property | Behavior |
|---|---|
| Scale | 2840 px — above body, below display |
| Weight | Regular or light — never bold |
| Tracking | Slightly negative (`-0.01em`) or zero |
| Alignment | Break from body column — full width, or offset inline-start/inline-end |
| Spacing | Large above and below — equal to or greater than a section break |
| Color | May use `var(--accent)` as the only accent use on the page |
Pull quotes placed at regular intervals destroy their effect. One per
long-form article is usually correct. Two is a maximum.
### 6. Body measure and reading rhythm
Long-form body copy: 6070 ch line length. Tighter than the `typography.md`
max because editorial reading is sustained, not scanning.
Line height: `1.6``1.7` for serif body. Slightly more generous than the
universal rule because editorial bodies are set at a reading size, not a UI
size.
Do not justify. Use `text-align: start` with a ragged inline-end edge — the
natural setting for editorial body copy on screen.
### 7. Asymmetrical rhythm
Uniform section spacing reads as a template. Editorial pacing alternates
between compression and expansion:
- Dense section → spacious section → medium section.
- A tightly spaced image caption cluster immediately after a generous
body paragraph creates productive tension.
- The final section before a pull quote should tighten; after it, release.
---
## Editorial hierarchy table
| Element | Scale | Weight | Tracking | Leading | Spacing role |
|---|---|---|---|---|---|
| Display headline | 5696 px | Light or regular | `-0.02em` to `-0.05em` | `1.0``1.1` | Event — generous above/below |
| Deck / standfirst | 1824 px | Regular | `0` | `1.4``1.5` | Transitional — moderate gap below |
| Byline / dateline | 1214 px | Regular or medium | `0.02em``0.04em` | `1.5` | Recedes — tight gap below |
| Body | 1618 px | Regular | `0` | `1.6``1.7` | Baseline — rhythm carrier |
| Pull quote | 2840 px | Regular or light | `-0.01em` (Latin only; 0 for joining scripts) | `1.2``1.3` | Interrupt — large above/below |
| Image caption | 1213 px | Regular | `0.01em` | `1.5` | Recedes — tight cluster |
| Section label | 1112 px | Medium | `0.06em``0.1em` (if caps) | `1.5` | Wayfinding only |
---
## Anti-patterns
- **Bold display headline** — editorial display is usually light or regular.
Bold display reads as billboard advertising. If the design system's display
weight is heavy, either use the regular cut or revisit the choice.
- **Uniform section padding** — every section has the same gap. No pacing.
The page reads as a list of content blocks.
- **Pull quote styled as a callout box** — border-left, background tint,
or card treatment. A pull quote is typographic. It does not need a container.
- **Deck set at body size** — the gap between headline and deck must be large
enough to read as a scale event. 18 px minimum for a deck below a 56 px+
headline.
- **Heading for every section** — editorial long-form does not require
a heading at every content shift. Space and pacing are allowed to do the
work. (guidance)
- **Positive tracking on display** — wide-tracked display headlines read as
a branding exercise. Tighten them.
- **UI chrome in the reading column** — buttons, tags, chip badges interrupting
prose flow inside the body text column. Functional controls (inline code-copy,
API anchors, callout toggles) may live inside code and API blocks, but decorative
badges and UI chrome should live outside the reading measure to keep prose focus clear.
---
## Lint
- [ ] Display headline is light or regular weight unless the design system
specifies otherwise.
- [ ] Display tracking is within `-0.02em` to `-0.05em` at 56 px+ (Latin only;
0 for Arabic/Persian/Urdu joining scripts; see `rtl-and-bidi` for Hebrew). (guidance)
- [ ] Pull-quote tracking: `-0.01em` (Latin only; 0 for joining scripts). (guidance)
- [ ] Gap between display and deck: display/deck ratio ≥ 1.5× or absolute px delta
≥ 24 px to read as a scale event. (guidance)
- [ ] Body line height is `1.6``1.7`.
- [ ] Body measure is 6070 ch.
- [ ] Pull quote, if present, breaks the body column (full width or offset).
- [ ] No more than 2 pull quotes in a single article surface. (long-form only)
- [ ] Section spacing alternates — one gap ≥ 1.5× baseline rhythm while another
is ≤ 1.2×. (long-form only — guidance)
- [ ] Bold used ≤ 2 times per 400 words in body copy. (long-form only)
- [ ] `var(--accent)` used ≤ 2 times on the full editorial surface (see `color.md` §accent discipline).
- [ ] Section separators (rules, dingbats) are used only when they
reinforce publication identity or clearly mark unrelated-content boundaries;
they must not be used as a hierarchy fallback. (guidance)
- [ ] Pull quote has no background, border, or container treatment.