design token

Text Styles

Predefined typography compositions for consistent text rendering across all components and frameworks.

Predefined typography compositions that bundle font size, weight, letter spacing, and line height into a single textStyle property.

Headings

One scale for every title. The large steps are expressive (tight tracking + leading) and fluidheading.lg, heading.xl, and heading.2xl use a clamp() generated from the type scale, so they scale between 360px and 1280px viewports. The small steps (heading.xsheading.3xs) are compact semibold headers for cards, banners, and dense components.

scale · headings
heading.2xl Aa Bb 01 23
heading.xl Aa Bb 01 23
font sans size 2.8rem / 28px weight 600 leading 1.2 tracking -0.02em
heading.lg Aa Bb 01 23
font sans size 2.4rem / 24px weight 600 leading 1.25 tracking -0.02em
heading.md Aa Bb 01 23
font sans size 2.0rem / 20px weight 600 leading 1.3 tracking -0.01em
heading.sm Aa Bb 01 23
font sans size 1.6rem / 16px weight 600 leading 1.4 tracking -0.01em
heading.xs Aa Bb 01 23
heading.2xs Aa Bb 01 23
heading.3xs Aa Bb 01 23

Body

scale · body
lead Aa Bb 01 23
body.lg Aa Bb 01 23
font sans size 1.8rem / 18px weight 400 leading 1.55 tracking 0
body.md Aa Bb 01 23
font sans size 1.6rem / 16px weight 400 leading 1.55 tracking 0
body.sm Aa Bb 01 23
font sans size 1.4rem / 14px weight 400 leading 1.5 tracking 0

Labels

scale · labels
label.lg Aa Bb 01 23
font sans size 1.6rem / 16px weight 500 leading 1.4 tracking 0
label.md Aa Bb 01 23
font sans size 1.4rem / 14px weight 500 leading 1.4 tracking 0
label.sm Aa Bb 01 23
font sans size 1.2rem / 12px weight 500 leading 1.4 tracking 0.02em

Numeric

Big tabular figures for currency, counts, percentages, and KPIs. font-variant-numeric: tabular-nums keeps digits aligned and stops them jittering as values update.

scale · numeric
numeric.lg Aa Bb 01 23
numeric.md Aa Bb 01 23
numeric.sm Aa Bb 01 23

Control

Per-size typography for interactive labels (buttons, inputs, badges). These mirror the sizing pattern’s font scale and carry no weight of their own — each control keeps its own.

scale · control
control.xl Aa Bb 01 23
control.lg Aa Bb 01 23
control.md Aa Bb 01 23
control.sm Aa Bb 01 23
control.xs Aa Bb 01 23

Special

scale · special
caption Aa Bb 01 23
font sans size 1.2rem / 12px weight 400 leading 1.4 tracking 0.02em
eyebrow Aa Bb 01 23
code Aa Bb 01 23
font mono size 1.4rem / 14px weight 400 leading 1.5 tracking 0
kbd Aa Bb 01 23
quote Aa Bb 01 23

Usage

import { css } from "@pindoba/styled-system/css";

<h1 className={css({ textStyle: "heading.2xl" })}>Hero Heading</h1>
<h2 className={css({ textStyle: "heading.md" })}>Section Title</h2>
<p className={css({ textStyle: "body.md" })}>Paragraph text</p>
<strong className={css({ textStyle: "numeric.lg" })}>R$ 12,840.55</strong>
<label className={css({ textStyle: "label.md" })}>Form Label</label>
<code className={css({ textStyle: "code" })}>npm install</code>

Responsive text styles

heading.lg, heading.xl, and heading.2xl are already fluid (clamp()), so they scale automatically. For discrete per-breakpoint steps you can also vary the token at the usage site:

<h1
  className={css({
    textStyle: { base: "heading.md", md: "heading.lg", lg: "heading.2xl" },
  })}
>
  Responsive heading
</h1>

Best Practices

  • Use textStyle instead of setting fontSize, fontWeight, and lineHeight individually
  • Maintain hierarchy: heading > body > label > special
  • Reach for numeric.* for any prominent figure (currency, stats, counts) so digits stay tabular
  • The large headings are fluid out of the box; only reach for usage-site responsive steps when you need discrete jumps