stats.neumorphism-gauge-row · Gauge row

A stats pattern from Neumorphism, drawn alone below with this design's tokens and sample copy. Used in this design on: home page, section 3; about page, section 2. Give the section root data-pattern="stats.neumorphism-gauge-row". A guide only: DESIGN.md and tokens.json are the source of truth.

Rule
Header row, then four raised gauges in a row: a dial ring, the reading at step 6 and a caption, centred inside each gauge.
Slots
sectionLabel, title, body, stats[4..4]
Tokens
bg #E3E8EF · text #28303B · heading #161C25 · accent #3F5BD9 · accent2 #794EBA · Plus Jakarta Sans / Plus Jakarta Sans · radius 22px · space unit 4px (full list in design/tokens.json)

Pattern notes

  • Header row as above, then four raised gauges in a row (two per row on phones), everything centred: an accent dial ring (96 px), the reading at step 6 (700, tight), a muted caption and a mono note in the link colour.

By the numbers

Twelve years in numbers

Each engagement starts with a two-week audit: interviews with customers, sales and the people who build the product. The brief writes itself after that.

140+

launches shipped

Since 2014

12

years independent

2025

9 of 10

clients return

Audited

31%

average lift in demo requests

Last 12 months

Layout tree (as in design/layout.json)
{
  "pattern": "stats.neumorphism-gauge-row",
  "kind": "stats",
  "slots": [
    "sectionLabel",
    "title",
    "body",
    "stats[4..4]"
  ],
  "tree": {
    "el": "box",
    "gap": 10,
    "children": [
      {
        "el": "box",
        "dir": "row",
        "gap": 8,
        "align": "end",
        "justify": "between",
        "wrap": true,
        "children": [
          {
            "el": "box",
            "gap": 3,
            "children": [
              {
                "el": "text",
                "color": "link",
                "slot": "sectionLabel",
                "role": "label",
                "transform": "uppercase",
                "tracking": "wide"
              },
              {
                "el": "text",
                "slot": "title",
                "role": "h2",
                "step": 5,
                "weight": 700,
                "tracking": "tight",
                "leading": "tight",
                "maxCh": 18
              }
            ]
          },
          {
            "el": "text",
            "color": "textMuted",
            "slot": "body",
            "role": "body",
            "maxCh": 42
          }
        ]
      },
      {
        "el": "repeat",
        "slot": "stats",
        "min": 4,
        "max": 4,
        "layout": "grid",
        "cols": 4,
        "phoneCols": 2,
        "gap": 6,
        "of": {
          "el": "box",
          "bg": "surface",
          "gap": 4,
          "pad": [
            8,
            5
          ],
          "align": "center",
          "children": [
            {
              "el": "shape",
              "kind": "ring",
              "size": "md",
              "fill": "accent"
            },
            {
              "el": "text",
              "slot": "number",
              "role": "number",
              "step": 6,
              "align": "center",
              "weight": 700,
              "tracking": "tight"
            },
            {
              "el": "text",
              "color": "textMuted",
              "slot": "body",
              "role": "small",
              "align": "center",
              "maxCh": 22
            },
            {
              "el": "text",
              "color": "link",
              "slot": "meta",
              "role": "label",
              "align": "center",
              "font": "mono"
            }
          ]
        }
      }
    ]
  }
}
Component example: reference/stats.neumorphism-gauge-row.html
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<title>stats.neumorphism-gauge-row — Neumorphism</title>
<link rel="stylesheet" href="base.css">
<style>
  section { padding: var(--section) 0; }
  .head { display: flex; justify-content: space-between; align-items: end; gap: 32px; flex-wrap: wrap; margin-bottom: 40px; }
  .head h2 { font-size: var(--step-5); max-width: 18ch; margin-top: 12px; }
  .head p { max-width: 42ch; }
  .gauges { display: grid; grid-template-columns: repeat(4, 1fr); gap: 28px; }
  .gauge { display: flex; flex-direction: column; align-items: center; gap: 16px; text-align: center; padding: 32px 20px; }
  .gauge .ring { width: 96px; height: 96px; border-width: 10px; box-shadow: var(--raised-sm); }
  .gauge .num { font-size: var(--step-6); }
  @media (max-width: 860px) { .gauges { grid-template-columns: repeat(2, 1fr); gap: 20px; } .gauge .num { font-size: var(--step-4); } }
</style>
</head>
<body>
<section class="wrap">
  <div class="head"><div><span class="label">This winter</span><h2>Quiet numbers from 40,000 homes.</h2></div><p class="muted">Measured on the panel, sent once a day, never sold.</p></div>
  <div class="gauges">
    <div class="panel gauge"><span class="ring" aria-hidden="true"></span><span class="num">−23%</span><span class="small muted">gas used</span><span class="mono small" style="color:var(--link)">vs. 2025</span></div>
    <div class="panel gauge"><span class="ring" aria-hidden="true"></span><span class="num">0.4°</span><span class="small muted">average drift</span><span class="mono small" style="color:var(--link)">per day</span></div>
    <div class="panel gauge"><span class="ring" aria-hidden="true"></span><span class="num">11 h</span><span class="small muted">away mode</span><span class="mono small" style="color:var(--link)">weekly</span></div>
    <div class="panel gauge"><span class="ring" aria-hidden="true"></span><span class="num">£212</span><span class="small muted">saved</span><span class="mono small" style="color:var(--link)">per home</span></div>
  </div>
</section>
</body>
</html>

Other patterns in this design

Whole design · Spec bundle (JSON) · On the style page