Tokens
Semantic and core design tokens for the next generation of Thumbtack’s UI.
Need v1 tokens?
The previous generation of tokens is still available. See the Tokens v1 documentation.
Semantic tokens
Semantic tokens describe intent — what a color is for rather than what it looks like. Each token pairs a light and a dark value and switches automatically with the active theme.
Background
| Token name | Light | Dark | ||
|---|---|---|---|---|
$tp-background-alert-lowvar(--tp-background-alert-low) |
|
| ||
$tp-background-alert-mediumvar(--tp-background-alert-medium) |
|
| ||
$tp-background-alert-medium-hovervar(--tp-background-alert-medium-hover) |
|
| ||
$tp-background-alert-medium-pressedvar(--tp-background-alert-medium-pressed) |
|
| ||
$tp-background-alert-strongvar(--tp-background-alert-strong) |
|
| ||
$tp-background-neutral-defaultvar(--tp-background-neutral-default) |
|
| ||
$tp-background-neutral-lowvar(--tp-background-neutral-low) |
|
| ||
$tp-background-neutral-low-hovervar(--tp-background-neutral-low-hover) |
|
| ||
$tp-background-neutral-low-pressedvar(--tp-background-neutral-low-pressed) |
|
| ||
$tp-background-neutral-mediumvar(--tp-background-neutral-medium) |
|
| ||
$tp-background-neutral-strongvar(--tp-background-neutral-strong) |
|
| ||
$tp-background-neutral-heavyvar(--tp-background-neutral-heavy) |
|
| ||
$tp-background-neutral-default-hovervar(--tp-background-neutral-default-hover) |
|
| ||
$tp-background-neutral-default-activevar(--tp-background-neutral-default-active) |
|
| ||
$tp-background-neutral-strong-activevar(--tp-background-neutral-strong-active) |
|
| ||
$tp-background-neutral-default-pressedvar(--tp-background-neutral-default-pressed) |
|
| ||
$tp-background-disabled-lowvar(--tp-background-disabled-low) |
|
| ||
$tp-background-disabled-mediumvar(--tp-background-disabled-medium) |
|
| ||
$tp-background-caution-lowvar(--tp-background-caution-low) |
|
| ||
$tp-background-caution-low-hovervar(--tp-background-caution-low-hover) |
|
| ||
$tp-background-caution-low-pressedvar(--tp-background-caution-low-pressed) |
|
| ||
$tp-background-neutral-inversevar(--tp-background-neutral-inverse) |
|
| ||
$tp-background-neutral-inverse-hovervar(--tp-background-neutral-inverse-hover) |
|
| ||
$tp-background-brand-lowvar(--tp-background-brand-low) |
|
| ||
$tp-background-brand-low-hovervar(--tp-background-brand-low-hover) |
|
| ||
$tp-background-brand-mediumvar(--tp-background-brand-medium) |
|
| ||
$tp-background-brand-medium-activevar(--tp-background-brand-medium-active) |
|
| ||
$tp-background-brand-strongvar(--tp-background-brand-strong) |
|
| ||
$tp-background-brand-strong-hovervar(--tp-background-brand-strong-hover) |
|
| ||
$tp-background-brand-strong-pressedvar(--tp-background-brand-strong-pressed) |
|
| ||
$tp-background-info-lowvar(--tp-background-info-low) |
|
| ||
$tp-background-info-mediumvar(--tp-background-info-medium) |
|
| ||
$tp-background-info-strongvar(--tp-background-info-strong) |
|
| ||
$tp-background-success-lowvar(--tp-background-success-low) |
|
| ||
$tp-background-success-mediumvar(--tp-background-success-medium) |
|
| ||
$tp-background-success-strongvar(--tp-background-success-strong) |
|
| ||
$tp-background-warning-lowvar(--tp-background-warning-low) |
|
| ||
$tp-background-warning-mediumvar(--tp-background-warning-medium) |
|
| ||
$tp-background-warning-strongvar(--tp-background-warning-strong) |
|
| ||
$tp-background-ratings-defaultvar(--tp-background-ratings-default) |
|
| ||
$tp-background-ratings-default-activevar(--tp-background-ratings-default-active) |
|
|
Border
| Token name | Light | Dark | ||
|---|---|---|---|---|
$tp-border-neutral-defaultvar(--tp-border-neutral-default) |
|
| ||
$tp-border-neutral-default-activevar(--tp-border-neutral-default-active) |
|
| ||
$tp-border-neutral-default-pressedvar(--tp-border-neutral-default-pressed) |
|
| ||
$tp-border-neutral-low-activevar(--tp-border-neutral-low-active) |
|
| ||
$tp-border-neutral-mediumvar(--tp-border-neutral-medium) |
|
| ||
$tp-border-neutral-strongvar(--tp-border-neutral-strong) |
|
| ||
$tp-border-neutral-inversevar(--tp-border-neutral-inverse) |
|
| ||
$tp-border-neutral-default-disabledvar(--tp-border-neutral-default-disabled) |
|
| ||
$tp-border-neutral-medium-disabledvar(--tp-border-neutral-medium-disabled) |
|
| ||
$tp-border-neutral-strong-activevar(--tp-border-neutral-strong-active) |
|
| ||
$tp-border-ratings-defaultvar(--tp-border-ratings-default) |
|
| ||
$tp-border-alert-defaultvar(--tp-border-alert-default) |
|
| ||
$tp-border-alert-default-pressedvar(--tp-border-alert-default-pressed) |
|
| ||
$tp-border-alert-strong-pressedvar(--tp-border-alert-strong-pressed) |
|
| ||
$tp-border-disabled-defaultvar(--tp-border-disabled-default) |
|
| ||
$tp-border-disabled-mediumvar(--tp-border-disabled-medium) |
|
|
Text
| Token name | Light | Dark | ||
|---|---|---|---|---|
$tp-text-neutral-defaultvar(--tp-text-neutral-default) |
|
| ||
$tp-text-neutral-mediumvar(--tp-text-neutral-medium) |
|
| ||
$tp-text-neutral-inversevar(--tp-text-neutral-inverse) |
|
| ||
$tp-text-on-brand-strongvar(--tp-text-on-brand-strong) |
|
| ||
$tp-text-on-brand-defaultvar(--tp-text-on-brand-default) |
|
| ||
$tp-text-alert-mediumvar(--tp-text-alert-medium) |
|
| ||
$tp-text-alert-strongvar(--tp-text-alert-strong) |
|
| ||
$tp-text-brand-mediumvar(--tp-text-brand-medium) |
|
| ||
$tp-text-brand-strongvar(--tp-text-brand-strong) |
|
| ||
$tp-text-info-mediumvar(--tp-text-info-medium) |
|
| ||
$tp-text-info-strongvar(--tp-text-info-strong) |
|
| ||
$tp-text-success-mediumvar(--tp-text-success-medium) |
|
| ||
$tp-text-success-strongvar(--tp-text-success-strong) |
|
| ||
$tp-text-warning-mediumvar(--tp-text-warning-medium) |
|
| ||
$tp-text-warning-strongvar(--tp-text-warning-strong) |
|
| ||
$tp-text-disabledvar(--tp-text-disabled) |
|
|
Icon
| Token name | Light | Dark | ||
|---|---|---|---|---|
$tp-icon-neutral-defaultvar(--tp-icon-neutral-default) |
|
| ||
$tp-icon-neutral-mediumvar(--tp-icon-neutral-medium) |
|
| ||
$tp-icon-neutral-lowvar(--tp-icon-neutral-low) |
|
| ||
$tp-icon-neutral-inversevar(--tp-icon-neutral-inverse) |
|
| ||
$tp-icon-info-defaultvar(--tp-icon-info-default) |
|
| ||
$tp-icon-info-lowvar(--tp-icon-info-low) |
|
| ||
$tp-icon-info-strongvar(--tp-icon-info-strong) |
|
| ||
$tp-icon-brand-defaultvar(--tp-icon-brand-default) |
|
| ||
$tp-icon-brand-lowvar(--tp-icon-brand-low) |
|
| ||
$tp-icon-brand-strongvar(--tp-icon-brand-strong) |
|
| ||
$tp-icon-success-defaultvar(--tp-icon-success-default) |
|
| ||
$tp-icon-success-lowvar(--tp-icon-success-low) |
|
| ||
$tp-icon-success-strongvar(--tp-icon-success-strong) |
|
| ||
$tp-icon-warning-defaultvar(--tp-icon-warning-default) |
|
| ||
$tp-icon-warning-lowvar(--tp-icon-warning-low) |
|
| ||
$tp-icon-warning-strongvar(--tp-icon-warning-strong) |
|
| ||
$tp-icon-alert-defaultvar(--tp-icon-alert-default) |
|
| ||
$tp-icon-alert-lowvar(--tp-icon-alert-low) |
|
| ||
$tp-icon-alert-strongvar(--tp-icon-alert-strong) |
|
| ||
$tp-icon-on-brand-strongvar(--tp-icon-on-brand-strong) |
|
| ||
$tp-icon-disabledvar(--tp-icon-disabled) |
|
|
Data
| Token name | Light | Dark | ||
|---|---|---|---|---|
$tp-data-info-mediumvar(--tp-data-info-medium) |
|
| ||
$tp-data-info-lowvar(--tp-data-info-low) |
|
| ||
$tp-data-info-strongvar(--tp-data-info-strong) |
|
|
Heading
| Token name | Light | Dark | ||
|---|---|---|---|---|
$tp-heading-neutral-defaultvar(--tp-heading-neutral-default) |
|
| ||
$tp-heading-neutral-mediumvar(--tp-heading-neutral-medium) |
|
| ||
$tp-heading-neutral-lowvar(--tp-heading-neutral-low) |
|
| ||
$tp-heading-neutral-inversevar(--tp-heading-neutral-inverse) |
|
|
Link
| Token name | Light | Dark | ||
|---|---|---|---|---|
$tp-link-brand-defaultvar(--tp-link-brand-default) |
|
| ||
$tp-link-neutral-defaultvar(--tp-link-neutral-default) |
|
| ||
$tp-link-neutral-default-hovervar(--tp-link-neutral-default-hover) |
|
| ||
$tp-link-neutral-lowvar(--tp-link-neutral-low) |
|
| ||
$tp-link-neutral-inversevar(--tp-link-neutral-inverse) |
|
| ||
$tp-link-alert-defaultvar(--tp-link-alert-default) |
|
| ||
$tp-link-on-brand-strongvar(--tp-link-on-brand-strong) |
|
|
Core tokens
Core tokens are the raw primitives — color scales, spacing, typography, and motion values — that semantic tokens reference. Reach for a semantic token first and use a core token when no semantic role fits.
Breakpoint
| Token name | Value |
|---|---|
$tp-v2-breakpoint__smallValue | 481 |
$tp-v2-breakpoint__small | 481px |
$tp-v2-breakpoint__largeValue | 1025 |
$tp-v2-breakpoint__large | 1025px |
$tp-v2-breakpoint__mediumValue | 700 |
$tp-v2-breakpoint__medium | 700px |
$tp-v2-breakpoint__splitViewMediumValue | 1060 |
$tp-v2-breakpoint__splitViewMedium | 1060px |
$tp-v2-breakpoint__splitViewSmallValue | 769 |
$tp-v2-breakpoint__splitViewSmall | 769px |
Color
| Token name | Value | |
|---|---|---|
$tp-v2-color__system-white |
| |
$tp-v2-color__system-black |
| |
$tp-v2-color__gray-50 |
| |
$tp-v2-color__gray-100 |
| |
$tp-v2-color__gray-200 |
| |
$tp-v2-color__gray-300 |
| |
$tp-v2-color__gray-400 |
| |
$tp-v2-color__gray-500 |
| |
$tp-v2-color__gray-600 |
| |
$tp-v2-color__gray-700 |
| |
$tp-v2-color__gray-800 |
| |
$tp-v2-color__gray-900 |
| |
$tp-v2-color__gray-950 |
| |
$tp-v2-color__blue-50 |
| |
$tp-v2-color__blue-100 |
| |
$tp-v2-color__blue-200 |
| |
$tp-v2-color__blue-300 |
| |
$tp-v2-color__blue-400 |
| |
$tp-v2-color__blue-500 |
| |
$tp-v2-color__blue-600 |
| |
$tp-v2-color__blue-700 |
| |
$tp-v2-color__blue-800 |
| |
$tp-v2-color__blue-900 |
| |
$tp-v2-color__blue-950 |
| |
$tp-v2-color__indigo-50 |
| |
$tp-v2-color__indigo-100 |
| |
$tp-v2-color__indigo-200 |
| |
$tp-v2-color__indigo-300 |
| |
$tp-v2-color__indigo-400 |
| |
$tp-v2-color__indigo-500 |
| |
$tp-v2-color__indigo-600 |
| |
$tp-v2-color__indigo-700 |
| |
$tp-v2-color__indigo-800 |
| |
$tp-v2-color__indigo-900 |
| |
$tp-v2-color__indigo-950 |
| |
$tp-v2-color__purple-50 |
| |
$tp-v2-color__purple-100 |
| |
$tp-v2-color__purple-200 |
| |
$tp-v2-color__purple-300 |
| |
$tp-v2-color__purple-400 |
| |
$tp-v2-color__purple-500 |
| |
$tp-v2-color__purple-600 |
| |
$tp-v2-color__purple-700 |
| |
$tp-v2-color__purple-800 |
| |
$tp-v2-color__purple-900 |
| |
$tp-v2-color__purple-950 |
| |
$tp-v2-color__green-50 |
| |
$tp-v2-color__green-100 |
| |
$tp-v2-color__green-200 |
| |
$tp-v2-color__green-300 |
| |
$tp-v2-color__green-400 |
| |
$tp-v2-color__green-500 |
| |
$tp-v2-color__green-600 |
| |
$tp-v2-color__green-700 |
| |
$tp-v2-color__green-800 |
| |
$tp-v2-color__green-900 |
| |
$tp-v2-color__green-950 |
| |
$tp-v2-color__red-50 |
| |
$tp-v2-color__red-100 |
| |
$tp-v2-color__red-200 |
| |
$tp-v2-color__red-300 |
| |
$tp-v2-color__red-400 |
| |
$tp-v2-color__red-500 |
| |
$tp-v2-color__red-600 |
| |
$tp-v2-color__red-700 |
| |
$tp-v2-color__red-800 |
| |
$tp-v2-color__red-900 |
| |
$tp-v2-color__red-950 |
| |
$tp-v2-color__yellow-50 |
| |
$tp-v2-color__yellow-100 |
| |
$tp-v2-color__yellow-200 |
| |
$tp-v2-color__yellow-300 |
| |
$tp-v2-color__yellow-400 |
| |
$tp-v2-color__yellow-500 |
| |
$tp-v2-color__yellow-600 |
| |
$tp-v2-color__yellow-700 |
| |
$tp-v2-color__yellow-800 |
| |
$tp-v2-color__yellow-900 |
| |
$tp-v2-color__yellow-950 |
|
Corner radius
| Token name | Value |
|---|---|
$tp-v2-corner-radius__none | 0 |
$tp-v2-corner-radius__xsmall | 4px |
$tp-v2-corner-radius__small | 6px |
$tp-v2-corner-radius__medium | 8px |
$tp-v2-corner-radius__large | 12px |
$tp-v2-corner-radius__xlarge | 16px |
$tp-v2-corner-radius__xxlarge | 24px |
$tp-v2-corner-radius__sides | 9999px |
Duration
| Token name | Value |
|---|---|
$tp-v2-duration__xxsmall | 75ms |
$tp-v2-duration__xsmall | 150ms |
$tp-v2-duration__small | 200ms |
$tp-v2-duration__medium | 250ms |
$tp-v2-duration__large | 300ms |
$tp-v2-duration__xlarge | 350ms |
Easing
| Token name | Value |
|---|---|
$tp-v2-easing__in | cubic-bezier(0.50, 0, 1, 1) |
$tp-v2-easing__out | cubic-bezier(0, 0, 0.40, 1) |
$tp-v2-easing__in-out | cubic-bezier(0.45, 0, 0.40, 1) |
Font
| Token name | Value |
|---|---|
$tp-v2-font__title-0__Size | 48px |
$tp-v2-font__title-0__ResponsiveSize | 64px |
$tp-v2-font__title-0__LineHeight | 105% |
$tp-v2-font__title-0__LetterSpacing | -2% |
$tp-v2-font__title-0__Weight | 563 |
$tp-v2-font__title-1__Size | 36px |
$tp-v2-font__title-1__ResponsiveSize | 48px |
$tp-v2-font__title-1__LineHeight | 105% |
$tp-v2-font__title-1__LetterSpacing | -2% |
$tp-v2-font__title-1__Weight | 563 |
$tp-v2-font__title-2__Size | 28px |
$tp-v2-font__title-2__ResponsiveSize | 36px |
$tp-v2-font__title-2__LineHeight | 110% |
$tp-v2-font__title-2__LetterSpacing | -1% |
$tp-v2-font__title-2__Weight | 563 |
$tp-v2-font__title-3__Size | 22px |
$tp-v2-font__title-3__ResponsiveSize | 24px |
$tp-v2-font__title-3__LetterSpacing | -1% |
$tp-v2-font__title-3__LineHeight | 110% |
$tp-v2-font__title-3__Weight | 590 |
$tp-v2-font__title-4__Size | 20px |
$tp-v2-font__title-4__LineHeight | 120% |
$tp-v2-font__title-4__LetterSpacing | 0% |
$tp-v2-font__title-4__Weight | 660 |
$tp-v2-font__title-5__Size | 18px |
$tp-v2-font__title-5__LineHeight | 120% |
$tp-v2-font__title-5__LetterSpacing | 0% |
$tp-v2-font__title-5__Weight | 660 |
$tp-v2-font__title-6__Size | 16px |
$tp-v2-font__title-6__LineHeight | 120% |
$tp-v2-font__title-6__LetterSpacing | 0% |
$tp-v2-font__title-6__Weight | 660 |
$tp-v2-font__title-7__Size | 14px |
$tp-v2-font__title-7__LineHeight | 120% |
$tp-v2-font__title-7__LetterSpacing | 0% |
$tp-v2-font__title-7__Weight | 660 |
$tp-v2-font__title-8__Size | 12px |
$tp-v2-font__title-8__LineHeight | 120% |
$tp-v2-font__title-8__LetterSpacing | 0% |
$tp-v2-font__title-8__Weight | 660 |
$tp-v2-font__text-1__Size | 16px |
$tp-v2-font__text-1__LineHeight | 140% |
$tp-v2-font__text-1__LetterSpacing | 0% |
$tp-v2-font__text-1__Weight | 400 |
$tp-v2-font__text-2__Size | 14px |
$tp-v2-font__text-2__LineHeight | 140% |
$tp-v2-font__text-2__LetterSpacing | 0% |
$tp-v2-font__text-2__Weight | 400 |
$tp-v2-font__text-3__Size | 12px |
$tp-v2-font__text-3__LineHeight | 140% |
$tp-v2-font__text-3__LetterSpacing | 0% |
$tp-v2-font__text-3__Weight | 400 |
$tp-v2-font__text-4__Size | 10px |
$tp-v2-font__text-4__LineHeight | 140% |
$tp-v2-font__text-4__LetterSpacing | 0% |
$tp-v2-font__text-4__Weight | 400 |
$tp-v2-font__letterSpacing-medium | 0 |
$tp-v2-font__letterSpacing-large | 1% |
$tp-v2-font__letterSpacing-small | -1% |
$tp-v2-font__letterSpacing-xsmall | -2% |
$tp-v2-font__lineHeight-medium | 140% |
$tp-v2-font__lineHeight-large | 160% |
$tp-v2-font__lineHeight-small | 110% |
$tp-v2-font__lineHeight-xsmall | 105% |
$tp-v2-font__lineHeight-xxsmall | 100% |
$tp-v2-font__weight-regular | 400 |
$tp-v2-font__weight-medium-regular | 563 |
$tp-v2-font__weight-medium | 590 |
$tp-v2-font__weight-medium-bold | 660 |
$tp-v2-font__weight-bold | 700 |
$tp-v2-font__weight-heavy | 800 |
Scrim
| Token name | Value | |
|---|---|---|
$tp-v2-scrim__dark-80 |
| |
$tp-v2-scrim__light-80 |
|
Shadow
| Token name | Value |
|---|---|
$tp-v2-shadow__100 | 0px 1px 3px rgba(0, 0, 0, 0.1) |
$tp-v2-shadow__200 | 0px 2px 4px rgba(0, 0, 0, 0.15) |
$tp-v2-shadow__300 | 0px 2px 7px rgba(0, 0, 0, 0.15) |
$tp-v2-shadow__400 | 0px 2px 10px rgba(0, 0, 0, 0.2) |
Space
| Token name | Value |
|---|---|
$tp-v2-space__xxsmall | 4px |
$tp-v2-space__xsmall | 8px |
$tp-v2-space__small | 12px |
$tp-v2-space__medium | 16px |
$tp-v2-space__large | 20px |
$tp-v2-space__xlarge | 24px |
$tp-v2-space__xxlarge | 32px |
$tp-v2-space__3xlarge | 48px |
$tp-v2-space__4xlarge | 64px |
$tp-v2-space__5xlarge | 96px |
$tp-v2-space__6xlarge | 128px |
$tp-v2-space__7xlarge | 256px |
Z-index
| Token name | Value |
|---|---|
$tp-v2-z-index__modal | 200 |