Primary Text
Headlines, primary copy, and any text that needs to feel certain.- class
- text-primary
- var
- --color-primary
- hex
- #FFFFFF
- class
- text-primary-light
- var
- --color-primary-light
- hex
- #050608
Text colors are designed for high legibility, long session comfort, and clear hierarchy. Towbook ships paired token sets for dark surfaces (the default) and light surfaces — each tuned for AA+ contrast in its own context.
Use the smallest number of text levels possible — too many shades make a layout feel busy.
Body copy sits a step quieter than headlines, but stays comfortable to read for long stretches.
Tertiary — captions and metadata.
Disabled — inactive elements only.
Body copy sits a step quieter than headlines, but stays comfortable to read for long stretches.
Tertiary — captions and metadata.
Disabled — inactive elements only.
Every level has a dark-surface and light-surface value. Pick the pair that matches the surface you're on — never mix.
The same content rendered on both surfaces. Notice how each token shifts to maintain the same perceived hierarchy.
Smith Towing · 4 services billed
Created Apr 28, 2026 · Due May 12
Smith Towing · 4 services billed
Created Apr 28, 2026 · Due May 12
Every token is exposed as a Tailwind utility class and a CSS custom property. Reach for the utility class first; drop to the variable only when you're outside Tailwind (vanilla CSS, inline styles, third-party widgets).
<!-- on dark surfaces --> <h1 class="text-primary">Heading</h1> <p class="text-secondary">Body copy</p> <small class="text-tertiary">Caption</small> <button class="text-disabled" disabled>Off</button> <!-- on light surfaces --> <h1 class="text-primary-light">Heading</h1> <p class="text-secondary-light">Body copy</p>
.invoice-total {
color: var(--color-primary);
}
.invoice-meta {
color: var(--color-tertiary);
}
/* Light surface variant */
.invoice-card.light .invoice-total {
color: var(--color-primary-light);
}
text-{level} — dark surface (default).text-{level}-light — light surface variant.primary, secondary, tertiary, disabled.text-[#FFF].text-disabled to body copy. It's intentionally below AA for small text.