On this page
A coherent interface does not require a different typeface for every level of importance. One capable family can cover navigation, forms, article previews, data, and prominent headings. The challenge is choosing a family with enough useful range, then creating hierarchy through disciplined differences rather than constantly introducing new letterforms.
Define what one family actually means
A single-family system uses related styles from one type family: regular, medium, bold, italic, and perhaps width or optical-size variants. A superfamily extends that idea across coordinated branches, commonly including sans, serif, and sometimes monospaced designs. Those branches can share a design concept without sharing identical metrics or interchangeable spacing.
Decide which constraint you mean before evaluating candidates. A product using one sans family everywhere is making a different choice from a publication using related serif and sans branches. Both can be coherent; the latter still needs explicit pairing decisions and role boundaries.
List your current text sizes and use the px-to-rem converter to express them against the actual root size. For example, 14px, 16px, and 24px become 0.875rem, 1rem, and 1.5rem at a 16px root. This exposes how much hierarchy you already have before adding font variation. Conversion preserves proportions; it does not establish which sizes are readable.
Evaluate the family against real interface work
Build a specimen from product strings rather than alphabet posters. Include account names, navigation labels, validation messages, timestamps, prices, and a paragraph. A candidate must work at the smallest important size, not merely in a large marketing headline. Start with body and control text before evaluating expressive display styles.
Inspect character distinction using strings containing capital I, lowercase l, and numeral 1, as well as O and zero. In account identifiers and technical products, ambiguity can matter more than a distinctive headline personality. Check punctuation, currency symbols, accents, and the languages the product actually supports.
Look for meaningful weight differences at small sizes. Regular and medium may be almost indistinguishable in one family, while semibold may feel too forceful in another. An advertised number of styles is not the same as useful typographic range. Test the exact files and instances you intend to use.
Evaluate numeral features for your tasks. Proportional figures often suit prose; tabular figures help changing values or columns remain visually steady. MDN's font-variant-numeric reference explains how to request these features. The font must contain the relevant glyph behavior for the request to change its appearance.
Build hierarchy from roles, not endless styles
Define a small set of roles: body, label, section title, page title, and supporting text. Each should have an identifiable purpose. Let size establish the main hierarchy, weight reinforce it, and spacing associate related content. Do not make every role differ in size, weight, tracking, and capitalization simultaneously.
For a modest interface, try 1rem body text with 1.5 leading, 0.875rem labels with 1.4 leading, and 1.5rem section titles with 1.25 leading. These are working defaults to inspect, not universal recommendations. A family with a small x-height may need larger nominal sizes to produce equivalent comfort.
Use weight contrast selectively. Semibold labels can support scanning, while regular paragraph text preserves an even texture. Reserve heavier weights for titles or genuine emphasis instead of letting every clickable element become bold. Excess emphasis flattens the hierarchy it was meant to create.
The design tokens introduction is useful for naming those roles consistently. Keep names semantic enough that a future font change does not require renaming every token. A role called section-title survives replacement more gracefully than a role named bold-24.
Implement the smallest useful typographic system
Use high-level CSS properties for ordinary family, weight, and numeral choices. The following example assumes that the chosen family and its intended weight range have already been declared. Replace the illustrative name with your actual family.
:root {
--font-ui: "Product Sans", system-ui, sans-serif;
--text-body: 1rem;
--text-label: 0.875rem;
--text-section: 1.5rem;
}
body {
font-family: var(--font-ui);
font-size: var(--text-body);
line-height: 1.5;
}
button, input, select, textarea {
font: inherit;
}
.field-label {
font-size: var(--text-label);
font-weight: 600;
line-height: 1.4;
}
.section-title {
font-size: var(--text-section);
font-weight: 700;
line-height: 1.25;
}
.numeric-value {
font-variant-numeric: lining-nums tabular-nums;
}The form control inheritance rule matters because native controls do not always match surrounding text by default. Inspect platform behavior rather than assuming your body font automatically reaches every control. Also verify that requested weights correspond to actual available styles instead of relying on synthetic bolding.
A variable family may offer width or optical-size axes, but use them intentionally. Width changes alter wrapping and perceived density. Optical sizing can adapt details for the rendered size when supported and enabled. MDN's font-optical-sizing documentation explains the automatic behavior; avoid inventing axis values without checking the font's documented range.
Know when a superfamily or exception helps
A related serif branch can create a different reading voice for long editorial sections while the sans handles controls. That is a reasoned expansion, not evidence that the original system failed. Compare the branches in context because matching nominal sizes may produce noticeably different apparent sizes and line heights.
Use the serif and sans pairing guide when assessing those relationships. Shared authorship or branding does not remove the need to inspect texture, proportions, and emphasis. A superfamily offers promising compatibility, not automatic harmony.
A monospaced exception is justified when alignment or literal code reading requires it. Tabular figures alone do not make all letters monospaced. Conversely, do not apply a monospace branch to every data label merely because it exists. The content's job should determine the style.
Before adding another family, identify the precise failure: unclear identifiers, missing script coverage, weak italics, or unsuitable long-form texture. MDN's font-family reference also explains fallback selection, which remains relevant even in a supposedly one-family product. Script coverage can require different fonts within the same visible sentence.
Review the system on a dense settings page and a sparse overview page. If both work without ad hoc exceptions, the family has enough range. If not, first simplify the role map and adjust proportions; add another family only when it solves a named problem.
Key takeaways
- Distinguish a single family from a coordinated multi-branch superfamily.
- Evaluate small interface text, numerals, punctuation, and language coverage first.
- Build hierarchy with a few purposeful size and weight relationships.
- Use available font features rather than assuming every style is supported.
- Add another family only to solve a specific reading or content requirement.
Reach designers & developers at work
Put your product next to the tools people use every day. One sponsor per placement, no tracking pixels.
Become a sponsor