mirror of
https://github.com/nexu-io/open-design.git
synced 2026-06-01 03:14:35 +07:00
* 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
182 lines
8.5 KiB
Markdown
182 lines
8.5 KiB
Markdown
# 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 3–5× — because the display element is not just a heading,
|
||
it is a visual event.
|
||
|
||
| Level | Typical range | Notes |
|
||
|---|---|---|
|
||
| Display / lede | 56–96 px | (editorial override) May intentionally exceed the default `typography.md` display range |
|
||
| Deck / standfirst | 18–24 px | Large jump down — intentional |
|
||
| Body | 16–18 px | Close to deck is fine; they're in the same reading register |
|
||
| Pull quote | 28–40 px | Disrupts body rhythm; treated as a visual break, not a heading |
|
||
| Caption / label | 11–13 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 | 28–40 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: 60–70 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 | 56–96 px | Light or regular | `-0.02em` to `-0.05em` | `1.0`–`1.1` | Event — generous above/below |
|
||
| Deck / standfirst | 18–24 px | Regular | `0` | `1.4`–`1.5` | Transitional — moderate gap below |
|
||
| Byline / dateline | 12–14 px | Regular or medium | `0.02em`–`0.04em` | `1.5` | Recedes — tight gap below |
|
||
| Body | 16–18 px | Regular | `0` | `1.6`–`1.7` | Baseline — rhythm carrier |
|
||
| Pull quote | 28–40 px | Regular or light | `-0.01em` (Latin only; 0 for joining scripts) | `1.2`–`1.3` | Interrupt — large above/below |
|
||
| Image caption | 12–13 px | Regular | `0.01em` | `1.5` | Recedes — tight cluster |
|
||
| Section label | 11–12 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 60–70 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.
|