Skip to content
OpenPerf
Esc
↑↓navigate↵open⌘Jpreview
On this page

Typography

Manrope at 400, 500 and 600. One working size, 14px, with hierarchy from weight and colour.

const STYLES = [
  {
    name: "heading-xl",
    className: "text-heading-xl",
    spec: "24/30 · 600",
    sample: "TypeError",
    usage: "Detail page title. One per screen.",
  },
  {
    name: "heading-lg",
    className: "text-heading-lg",
    spec: "20/26 · 600",
    sample: "Create issue",
    usage: "Dialog titles and large stat values.",
  },
  {
    name: "heading-md",
    className: "text-heading-md",
    spec: "18/22 · 600",
    sample: "Stack trace",
    usage: "Drawer titles, trace and endpoint titles, and medium stat values.",
  },
  {
    name: "heading-sm",
    className: "text-heading-sm",
    spec: "16/20 · 600",
    sample: "Activity",
    usage: "Section titles.",
  },
  {
    name: "body-lg",
    className: "text-body-lg",
    spec: "16/24 · 400",
    sample: "Cannot read properties of undefined (reading 'organizationId')",
    usage: "Reading text: descriptions, empty states.",
  },
  {
    name: "body-md",
    className: "text-body-md",
    spec: "14/18 · 400–600",
    sample: "Cannot read properties of undefined",
    usage: "Default UI text: rows, nav, buttons, inputs, menus.",
  },
  {
    name: "body-sm",
    className: "text-body-sm",
    spec: "12/14 · 400–500",
    sample: "2m ago · 1.2k events",
    usage:
      "Secondary text: kbd hints, chart axes, filter counts, table and waterfall meta, stat notes.",
  },
];

export default function Typography() {
  return (
    <div className="flex flex-col divide-y divide-subtle bg-default font-sans text-default">
      {STYLES.map((style) => (
        <div className="flex items-baseline gap-6 py-4" key={style.name}>
          <div className="flex w-40 shrink-0 flex-col gap-0.5">
            <code className="text-body-md font-medium">{style.className}</code>
            <span className="text-body-md text-muted tabular-nums">{style.spec}</span>
          </div>
          <div className="flex min-w-0 flex-col gap-1">
            <div className="truncate">
              <span className={style.className}>{style.sample}</span>
            </div>
            <span className="text-body-md text-muted">{style.usage}</span>
          </div>
        </div>
      ))}
    </div>
  );
}
  • List screens have no heading: rows and meta share text-body-md.
  • text-body-sm is for secondary text that sits beside the working size: kbd hints, axes, counts and notes.
  • Emphasis is weight 500 for names and 600 for numbers that lead, not a larger size.
  • Columns of numbers use tabular-nums; single values keep proportional figures.
  • Sentence case everywhere, never uppercase labels.

Was this page helpful?