Skip to content

Stat tile

A stat tile shows one figure, such as the offers accepted this month, with a plain label above it and its change below. A row of them opens a report.

The tile

  • Offers accepted48+12% on last month
  • Placement fees245,000 EUR
  • No show rate14%+3.0 points on last month
  • Average time to hireFewer than 5 placements

When to use it

Use tiles for the few figures a report exists to show, such as placements this month or the interview no show rate. Put them first, in one row.

When the story is a trend or a comparison, use a chart. A tile holds one value and its change.

Anatomy

The label names the figure in plain words. The value is the largest text on the tile and uses tabular digits. The change line says how much it moved and against what.

Offers accepted48+12% on last month
Twice its size. The tinted band is the padding.
Surface
16 px radius, 16 px padding, no border
--surface-1
Label
12 px, weight 500
--text-muted
Label to value
6 px
Value
weight 700, tabular, letter spacing minus 0.02 em, line height 1
--text
Change
12 px, weight 500
Gap between tiles
12 px
--space-3

Long values

The value steps down in size as it gets longer and wraps before it would be cut off, since a truncated number is a wrong number. It breaks between groups of digits or before the currency code, and the code counts toward its length.

Travel costs3,450 EUR
Placement fees186,400 EUR
Wages of placed workers14,862,000 EUR
At the width of a tile on a phone.
Up to 9 characters
28 px
Up to 13 characters
22 px
Longer
18 px, wrapping

The change line

Write the change as a signed figure and its comparison, such as +12% on last month. The sign gives the direction and the color adds a judgment: green for good news, red for bad, gray when there is nothing to judge. A change under 1 percent is left out.

  • Offers accepted48+12% on last month
  • No show rate14%+3.0 points on last month
  • Open positions126+4 on last week
Light
  • Offers accepted48+12% on last month
  • No show rate14%+3.0 points on last month
  • Open positions126+4 on last week
Dark
Good news
success ink
--success-ink
Bad news
error ink
--error-ink
No judgment
quiet ink
--text-muted
Left out
under 1 percent of change

Missing and loading

When a figure cannot be shown, the tile says why in the value's place, in quiet text at the smallest value size. A rate waits for 5 observations before it prints.

While the data loads, a skeleton the size of the tile holds its place.

  • Average time to hireFewer than 5 placements
  • Placement fees245,000 EUR

Tiles in a row

Tiles sit in two columns on a phone and four from 1024 px. A set of three or six tiles takes three or six columns instead, so no row ends with a gap. When labels wrap to different heights, the values in a row still share one line.

  • Offers accepted48+12% on last month
  • Placement fees245,000 EUR
  • No show rate14%+3.0 points on last month
  • Interviews booked312
  • Average placement fee across every market5,100 EUR
  • Candidates placed87+9.0% on last quarter
On a phone, 375 px wide.
  • Offers accepted48+12% on last month
  • Placement fees245,000 EUR
  • No show rate14%+3.0 points on last month
  • Interviews booked312
  • Average placement fee across every market5,100 EUR
  • Candidates placed87+9.0% on last quarter
In a window 1280 px wide.

In a printed report

On paper the tile drops its surface and keeps its type: a label, a large figure, the unit and year, and the change in plain ink. Whether a change in a market is good depends on who reads it, so paper stays neutral.

Work permits issued in 2025: 4,280, up 310 on 2024.Key numbers, 2025Work permits issued4,2802025+310 on 2024Source: Werklist, example figures
Label
7.5 pt
--text
Figure
26 pt, weight 700
--text
Unit and year
7.5 pt
--text-muted
Change
7.5 pt
--text

Accessibility

Screen readers meet a tile as one group named by its label, then hear the value and the change as a sentence, with the sign read aloud.

A tile that opens a detail view, such as the list of this month's placements, is a link with the focus ring and a 44 px target.

Permitted and not permitted

Permitted

  • Say what the change is compared with

    On last month, or on the same week last year.

  • Let a long value step down and wrap

    The whole figure stays readable.

Not permitted

  • Put the change in a colored pill

    Signed text is enough, and a tint under colored ink makes it harder to read.

  • Shorten a value to make it fit

    Step the size down. A shortened value hides the real figure.

  • Add an icon beside the label

    The label already names the figure.

NextJob card

Stat tile

One figure with its label and, when it helps, its signed change against a named comparison.

  • Kind: component
  • Page: https://design.werklist.com/components/stat-tile
  • Version: 2.1.2

When to use it

  • The few figures a report exists to show, in one row at the top
  • The key numbers page of a printed report

When not to use it

  • A trend or a comparison: use a chart
  • More than one value per tile
  • Icons, progress rings, sparklines or a counting animation inside a tile

Anatomy

  • Surface: 16 px radius, 16 px padding, no border (--surface-1)
  • Label: 12 px, weight 500, sentence case, up to two lines (--text-muted)
  • Label to value: 6 px
  • Value: weight 700, tabular, letter spacing minus 0.02 em, line height 1. 28 px up to 9 characters, 22 px up to 13, 18 px beyond. It wraps between groups of digits or before the currency code and is never cut short (--text)
  • Change: 12 px, weight 500, a signed figure and its comparison (--success-ink)
  • Row: 2 columns, 4 from 1024 px, or 3 or 6 columns for a set of 3 or 6 tiles, 12 px apart (--space-3)

Variants

  • Screen: Reports in WerkOS and pages on werklist.com
  • Paper: The key numbers page of a printed report. No surface. Label 7.5 pt, figure 26 pt weight 700, unit and year 7.5 pt, change 7.5 pt in plain ink

Sizes

  • Up to 9 characters: type 28 px
  • Up to 13 characters: type 22 px
  • Longer: type 18 px, wrapping

States

  • Good change: change line in the success ink (--success-ink)
  • Bad change: change line in the error ink (--error-ink)
  • Neutral change: change line in the quiet ink (--text-muted)
  • Small change: under 1 percent the change line is left out
  • Missing: the reason in words in place of the value, 18 px, in muted ink. A rate needs 5 observations before it prints (--text-muted)
  • Loading: a skeleton block the size of the tile
  • Link: when the tile opens a detail view: focus ring, 44 px target, hover fill (--focus-ring)

Keyboard

  • Tab: Reaches the tile only when it is a link
  • Enter: Opens the detail view of a linked tile

Accessibility

  • A group named by the label
  • Value and change read as one sentence, sign included
  • The missing reason is visible text
  • Not focusable unless it is a link

Content

  • Labels are plain nouns in sentence case: Offers accepted, Placement fees, No show rate
  • The change names its comparison: +12% on last month
  • Money prints its currency code after the figure: 245,000 EUR
  • A long value steps down in size and wraps. It is never shortened to fit

Tokens

  • --surface-1
  • --radius-2xl
  • --space-4
  • --space-3
  • --text
  • --text-muted
  • --success-ink
  • --error-ink
  • --focus-ring

JSON

{
  "title": "Stat tile",
  "path": "/components/stat-tile",
  "url": "https://design.werklist.com/components/stat-tile",
  "text": "https://design.werklist.com/agent/components/stat-tile",
  "summary": "One figure with its label and, when it helps, how it changed.",
  "version": "2.1.2",
  "kind": "component",
  "name": "Stat tile",
  "purpose": "One figure with its label and, when it helps, its signed change against a named comparison.",
  "use": [
    "The few figures a report exists to show, in one row at the top",
    "The key numbers page of a printed report"
  ],
  "avoid": [
    "A trend or a comparison: use a chart",
    "More than one value per tile",
    "Icons, progress rings, sparklines or a counting animation inside a tile"
  ],
  "anatomy": [
    {
      "part": "Surface",
      "measure": "16 px radius, 16 px padding, no border",
      "token": "--surface-1"
    },
    {
      "part": "Label",
      "measure": "12 px, weight 500, sentence case, up to two lines",
      "token": "--text-muted"
    },
    {
      "part": "Label to value",
      "measure": "6 px"
    },
    {
      "part": "Value",
      "measure": "weight 700, tabular, letter spacing minus 0.02 em, line height 1. 28 px up to 9 characters, 22 px up to 13, 18 px beyond. It wraps between groups of digits or before the currency code and is never cut short",
      "token": "--text"
    },
    {
      "part": "Change",
      "measure": "12 px, weight 500, a signed figure and its comparison",
      "token": "--success-ink"
    },
    {
      "part": "Row",
      "measure": "2 columns, 4 from 1024 px, or 3 or 6 columns for a set of 3 or 6 tiles, 12 px apart",
      "token": "--space-3"
    }
  ],
  "variants": [
    {
      "name": "Screen",
      "use": "Reports in WerkOS and pages on werklist.com"
    },
    {
      "name": "Paper",
      "use": "The key numbers page of a printed report. No surface. Label 7.5 pt, figure 26 pt weight 700, unit and year 7.5 pt, change 7.5 pt in plain ink"
    }
  ],
  "sizes": [
    {
      "name": "Up to 9 characters",
      "type": "28 px"
    },
    {
      "name": "Up to 13 characters",
      "type": "22 px"
    },
    {
      "name": "Longer",
      "type": "18 px, wrapping"
    }
  ],
  "states": [
    {
      "name": "Good change",
      "change": "change line in the success ink",
      "tokens": [
        "--success-ink"
      ]
    },
    {
      "name": "Bad change",
      "change": "change line in the error ink",
      "tokens": [
        "--error-ink"
      ]
    },
    {
      "name": "Neutral change",
      "change": "change line in the quiet ink",
      "tokens": [
        "--text-muted"
      ]
    },
    {
      "name": "Small change",
      "change": "under 1 percent the change line is left out"
    },
    {
      "name": "Missing",
      "change": "the reason in words in place of the value, 18 px, in muted ink. A rate needs 5 observations before it prints",
      "tokens": [
        "--text-muted"
      ]
    },
    {
      "name": "Loading",
      "change": "a skeleton block the size of the tile"
    },
    {
      "name": "Link",
      "change": "when the tile opens a detail view: focus ring, 44 px target, hover fill",
      "tokens": [
        "--focus-ring"
      ]
    }
  ],
  "keys": [
    {
      "key": "Tab",
      "action": "Reaches the tile only when it is a link"
    },
    {
      "key": "Enter",
      "action": "Opens the detail view of a linked tile"
    }
  ],
  "accessibility": [
    "A group named by the label",
    "Value and change read as one sentence, sign included",
    "The missing reason is visible text",
    "Not focusable unless it is a link"
  ],
  "content": [
    "Labels are plain nouns in sentence case: Offers accepted, Placement fees, No show rate",
    "The change names its comparison: +12% on last month",
    "Money prints its currency code after the figure: 245,000 EUR",
    "A long value steps down in size and wraps. It is never shortened to fit"
  ],
  "tokens": [
    "--surface-1",
    "--radius-2xl",
    "--space-4",
    "--space-3",
    "--text",
    "--text-muted",
    "--success-ink",
    "--error-ink",
    "--focus-ring"
  ]
}

Raw file: https://design.werklist.com/agent/components/stat-tile