EduFlow
UI Design with Figma
0%

Section 1 · Foundations

Type Scale and Color with Contrast

18 min4 min readFill in the blanks

Lesson at a glance

Define a small type scale with a job for every size, build a color palette from roles instead of favourites, and check every text and control pair against WCAG contrast ratios.

  1. 1A type scale with jobs
  2. 2Color from roles, not favourites
  3. 3Contrast: the numbers that matter

No video here — just the real thing: a written lesson, runnable examples, a quiz and practice.

Open the text styles of a file that grew without a plan and you will find 13 px, 14 px, 14.5 px, 15 px and 16 px body text, each used once or twice. Nobody chose them; they drifted in. The result is a screen where hierarchy feels slightly off everywhere, and nobody can say why.

A type scale and a role-based palette are how you stop the drift. You decide the sizes and colors once, give each a job, and then every screen picks from the list.

A type scale with jobs

A type scale is a short list of text sizes, each paired with a line height and weight. For a phone app, it helps to start near the platform’s defaults because people’s eyes are already tuned to them. Steady’s scale borrows most of its sizes from Apple’s default text styles, rounds line heights to multiples of 4, and uses 13 px (Apple’s footnote size) for captions:

Role Size / line height Weight Used for
Large title 34 / 40 Bold Screen title on the Today screen
Title 28 / 36 Semibold Habit detail title
Headline 17 / 24 Semibold Habit names, button labels
Body 17 / 24 Regular Descriptions, form input
Subhead 15 / 20 Regular Progress line, secondary info
Caption 13 / 16 Regular Single-line streak counts, tab labels

Notice what the table does. Each step is big enough to read as a different rank. Headline and Body share a size and differ only in weight, which is how you rank text without adding another size. Line heights are about 1.4× for running text and tighter for big titles, because large text with loose line height falls apart into separate lines.

Six sample lines from largest to smallest: Large title 34, Title 28, Headline 17 semibold, Body 17 regular, Subhead 15 and Caption 13, each labelled with its size. Today Large title 34/40 Read 20 pages Title 28/36 Drink water Headline 17/24 semibold Two glasses before lunch Body 17/24 regular 3 of 5 done Subhead 15/20 12-day streak Caption 13/16
Steady’s type scale: size and weight both carry rank

Two or three weights are enough: Regular, Semibold and Bold here. Each extra weight is one more thing to keep consistent, and readers cannot tell Medium from Semibold at a glance anyway.

In Figma you save each row as a text style (Lesson 3.3 compares styles with variables). Name styles by role, Headline or Caption, not by value like 17 Semibold, so you can adjust a size later without the name lying.

Color from roles, not favourites

Picking colors you like produces a mood board. Picking colors for roles produces a usable palette. Start from the jobs color does on a screen:

  • Text: primary text (near-black, #1A1A1A) and secondary text (grey, #6B7280).
  • Surfaces: the page (#FFFFFF) and raised areas like cards or sheets.
  • Borders and dividers: light grey (#E5E7EB).
  • Primary action: Steady’s teal (#0F766E). It appears on check buttons and the main button, and almost nowhere else.
  • Status: green for success and red for errors, used only for those meanings.

Restraint is the point. If teal only appears on things you can tap, people learn “teal means tap” within seconds. Paint headings, icons and borders teal too and that lesson becomes impossible to learn.

Contrast: the numbers that matter

Contrast ratio compares the relative luminance of two colors, from 1:1 (identical) to 21:1 (black on white). The Web Content Accessibility Guidelines (WCAG) 2.2 set the thresholds most teams design to, level AA:

  • 4.5:1 for normal text.
  • 3:1 for large text: at least 24 px regular, or about 18.66 px bold (18 pt and 14 pt).
  • 3:1 for the visible parts of controls and meaningful graphics, such as a checkbox outline or a progress ring against its background.

Level AAA raises normal text to 7:1. Teams usually aim for AA everywhere and AAA for long reading text.

Steady’s colors measured against white: primary text #1A1A1A gives 17.40:1, secondary grey #6B7280 gives 4.83:1 (passes, narrowly), and teal #0F766E gives 5.47:1, so a white label on a teal button passes too.

Figma has a contrast checker built into the color picker. At the time of writing, you select a text layer, open its fill color, click Check color contrast, and Figma shows the ratio against what sits behind the layer, with AA and AAA marks and a one-click fix to the nearest passing color. Use it as you pick colors, not as an audit at the end.

You now have rules for rank (type), meaning (color) and legibility (contrast). Next you put them on the canvas: frames, groups, layers and constraints, the raw material of every Figma screen.

Key takeaways

  • A type scale is a short, fixed list of sizes and line heights, each with a named job; you pick from the list instead of inventing sizes.
  • Two or three font weights are enough for a whole app; more weights add noise, not hierarchy.
  • Build color from roles (text, surface, border, primary action, success, danger) and use the accent sparingly so it keeps its meaning.
  • WCAG AA needs 4.5:1 for normal text, 3:1 for large text, and 3:1 for the visible boundaries of controls and meaningful graphics.
  • Check contrast while you design with Figma’s color picker, not after a stakeholder complains.

Further reading

Check your understanding

4 questions

Question 1 of 4

Steady’s primary button is a bright teal, #14B8A6, with a white 17 px label. The contrast ratio is 2.49:1. What should you do?

Question 2 of 4

Why does a type scale use a small fixed set of sizes instead of whatever looks right on each screen?

Question 3 of 4

The empty text field in the New habit sheet shows hint text in

Question 4 of 4

Which palette plan best supports a clear hierarchy on the Today screen?

Practice

Fill in the blanks

Fill in the contrast thresholds

Sofia keeps a contrast checklist pinned beside every screen she designs. Complete Steady’s copy with the WCAG 2.2 minimum ratios and the large-text size. Type numbers only (for example 4.5).

Steady contrast checklist (WCAG 2.2, level AA) Habit name, 17 px semibold, on white needs at least :1 Large title, 34 px bold, on white needs at least :1 Checkbox outline against the row surface needs at least :1 Long-form help text if we aim for AAA needs at least :1 Large text starts at px regular (18 pt).