Skip to content

Color

Color is a fundamental piece in the Primer visual language. In this guide you will learn about the principles, patterns, and abstractions that make Primer’s color system.

Get started

Image showing the two different types of color modes: light mode and dark mode

GitHub's UI offers a variety of different color modes. When designing product interfaces, you should design in light mode by default. Every pattern in Primer is built to work across all color modes out of the box.

Same component shown in light mode and dark mode color palettes

How to use color for product UI

Primer delivers colors in the form of variables or design tokens. Color variables are grouped based on their purpose:

  • Functional: To convey a meaning or a state. For example, from a functional perspective the color green is used to reinforce positive messaging. In a functional system, green variables are named with the suffix .success.
  • Presentational: To represent a color. For example, the color steps in the Primer scale are named by color and lightness, such as scale.blue.5. These variables don't currently support color modes. As the system grows, it will provide more APIs that fit different color needs. Check the Primer Primitives repository to follow along as we release new variables and systems.

Functional system

The functional system is based on the meaning, or purpose, that colors have in the interface. This system is structured into two groups of variables:

  • Foundations: Foregrounds, backgrounds, and borders that make up most of a product interface. Each variable is generated based on visual weight.
Dark gray, midtone gray and light gray swatches as example of foundational colors
  • Color roles: Foregrounds, backgrounds, and borders that highlight affordance or the meaning of elements in the UI.
Accent: blue, Success: green, Attention: yellow, Danger: red, Severe: orange, Open: green, Closed: red, Done: purple

You should always use Primer's functional color system in your designs to make sure that:

Foregrounds

Foreground elements are text and icons. You can apply color to them using any of the foreground variables (or fg for short).

FoundationsUsage
fg.defaultPrimary color for text and icons in any given interface. It should be used for body content, titles and labels.
fg.mutedUse for content that is secondary or that provides additional context but is not critical to understanding the flow of an interface.
fg.subtleUse for placeholder text, icons or decorative foregrounds.
fg.onEmphasisOn emphasis is the text color designed to combine with -emphasis backgrounds for optimal contrast.
Color rolesUsage
fg.accentUse for interactive text or icons like links or buttons.
fg.successUse to emphasize a positive message.
fg.attentionUse to highlight text or icons that require the user's attention.
fg.dangerUse to emphasize an error or a blocking status. Action is required.
fg.severeUse to emphasize a level of severity between attention and danger.
fg.openUse to style text that refers to open tasks or workflows.
fg.closedUse to style text that refers to closed tasks or workflows.
fg.doneUse to style text that refers to completed tasks or workflows.

Backgrounds

Background colors apply to surfaces of components or UI elements, such as pages, boxes, and overlays.

FoundationsUsage
bg.emphasisProvides the highest contrast against the default background, such as in tooltips.
bg.defaultPrimary background color.
bg.subtleProvides visual rest and contrast against the default background.
bg.insetCan be used instead of the default background to create a focal point, such as in conversations or activity feeds.
Color rolesUsage
bg.accentUse to accentuate interactive areas in the UI like selected elements.
bg.successUse to highlight a positive message.
bg.attentionUse to highlight elements that require a user's attention or pending statuses.
bg.dangerUse to emphasize an error or a blocking status, where action is required.
bg.severeUse to emphasize an extra level of severity between attention and danger.
bg.openUse to style text that refers to open tasks or workflows.
bg.closedUse to style text that refers to closed tasks or workflows.
bg.doneUse to style text that refers to completed tasks or workflows.
bg.[ANY_OF_ABOVE].emphasisUse to highlight the most important item of a view or an interface.

Borders

Borders can be used to group content or to create a visible separation between sections or items. They’re most commonly used on tables, side sections, and cards.

FoundationsUsage
border.defaultUse to create bounds around content, for example elements inside a card. Default borders are critical to understanding a page layout.
border.mutedUse for dividers to emphasize the separation between items, columns or sections.
Color rolesUsage
border.accentUse to accentuate interactive areas in the UI like selected elements.
border.successUse to highlight a positive message.
border.attentionUse to highlight elements that require a users attention or pending statuses.
border.dangerUse to emphasize an error or a blocking status. Action is required.
border.severeUse to emphasize an extra level of severity between attention and danger.
border.openUse to style text that refers to open tasks or workflows.
border.closedUse to style text that refers to closed tasks or workflows.
border.doneUse to style text that refers to completed tasks or workflows.
border.[ROLE].emphasisUse to highlight the most important item of a view or an interface.

Functional system in action

Table component showing the combination of bg.subtle with border.default, and border.muted

Example of pairing foundation variables: bg.subtle with border.default, and border.muted.

UI demonstration of what bg.inset looks like. It darkens the background of the whole UI

Thinking in terms of elevation, bg.inset would represent an underground level. It's meant to create a feeling of focus or depth.

Example of a hover style on a list where the background uses bg.accent.emphasis and the text uses fg.onEmphasis.

fg.onEmphasis pairs with bg.[ANY_COLOR_ROLE].emphasis variables. This example shows fg.onEmphasis paired with bg.accent.emphasis.

Green success alert with check icon, pairing bg.success, fg.success, and border.success color variables

An example of an alert that pairs bg.success, fg.success, and border.success.

Combining colors

Not all colors pair well with each other. There are combinations of backgrounds and foregrounds that guarantee compliance with WCAG contrast guidelines and a wide range of hierarchical relationships between elements. Never use color on its own to convey a message or meaning. Pair it with explicit text and icons instead.

Pairing color roles

Do

Pair color role foregrounds with their background counterparts or with bg.default and bg.subtle.

Don’t

Never pair emphasis foregrounds with emphasis background.

Color roles and foregrounds

Do

Only use fg.muted with bg.default, bg.subtle, and bg.inset.

Don’t

Never use fg.muted on bg.emphasis or any of the color roles backgrounds.

Color roles recipes

Combination of variables 1: bg.[COLOR-ROLE] + border.[COLOR-ROLE] + fg.[COLOR-ROLE]Combination of variables 2: bg.[COLOR-ROLE] + border.[COLOR-ROLE].emphasis + fg.[COLOR-ROLE]Combination of variables 3: bg.default + border.[COLOR-ROLE].emphasis + fg.[COLOR-ROLE]Combination of variables 4: bg.[COLOR-ROLE] + border.[COLOR-ROLE] + fg.default

Accessibility

When designing with colors consider the following to make your UI visually accessible.

Assure adequate color contrast

Color contrast between text and its background must meet required WCAG standards.

The contrast requirements are:

  • 4.5:1 for normal text
  • 3:1 for large text (>24px)
  • 3:1 for UI elements and graphics
  • No contrast requirement for decorative and disabled elements

Use an online contrast checker or a Figma plugin to test your contrast.

If you work with the functional colors, this work has already been done for you. We checked all recommended combinations, so you are all set.

Don't rely on color alone

Show state with more than color

Color vision deficiency is different for different people. To make sure everyone can understand and use your UI you should show state with more than a change in color. For example by using icons or changing the content.

Example icon that uses a distinct shape in addition to color to indicate an error.

Connect labels to graphs with lines or patterns

For charts and graphs you can position the labels on top or close to each section. You can also use patterns to distinguish different parts.

Two graphs. One is a line graph and one is a pie graph. The line graph is demonstrating using unique shapes for each comparison line's plot symbol. The pie chart is demonstrating how each slice's label can use a line to point to its corresponding slide.

Color outside the functional system

Primer does not currently provide a presentational or data visualization color system. If you or your team at GitHub are working on a feature that has color needs beyond the functional system, please open an issue in the github/primer repository (only available to GitHub staff).

How to use colors in Primer libraries?

Primer colors exist in different formats and are made available throughout the Primer libraries and tools. Not all colors exist everywhere and the naming depends on the Primer library. Below a list to help find the right Primer color documentation that is specific to that role and environment.

I amDocumentationExample color usage
A product designer working in FigmaPrimer Primitivesbg/accent
An engineer using Primer ViewComponentscolor system argumentsbg: :accent
An engineer using Primer Reactsx propsaccent.subtle
An engineer creating custom UIPrimer CSS color utilitiescolor-bg-accent
A Primer React maintainer creating a componentPrimer Primitives variablesaccent.subtle
A Primer CSS maintainer creating a componentPrimer Primitives variables--color-accent-subtle

Stuck choosing the right color? Feel free to reach out in the #primer Slack channel.