Are you upgrading to v4 (healthcare v8, medicare v6)?
Take a look at our v4 buttons migration guide to get started.
The following tables give an overview of the different available button styles in the selected design system. Each button has three controllable traits that can be used in various combinations. They are:
- Variation: which affects the border and background styles
- Color: defined as either main or alternate
- Context: specified as either on-light or on-dark
See the examples in the following sections to learn how they can be applied.
Each button variation (outline, solid, ghost) has an alternate option. Alternate buttons can be styled differently than the main buttons.
Alternate solid button
Alternate outline button
Alternate ghost button
On dark background
Buttons can exist in two sizes other than default: "big" or "small".
- Add an inline SVG icon and it will become the same color as the button text. For the crispest icon rendering, ensure the icon has a square
viewBoxwith values that are multiples of
- Use the margin utility class to add spacing between the icon and button text.
Button component accepts its text as children (AKA inner HTML), which
means you can also pass in HTML or custom components. This gives you a lot of
flexibility and supports a variety of advanced use cases. The most common use
case would be passing in an SVG icon along with the text.
In addition to the supported props listed, you can also pass in additional
props, which will be passed to the rendered root component. For example,
you could pass in a
target prop to pass to the rendered anchor element.
|Label text or HTML|
|Additional classes to be added to the root button element.|
|When provided, the root component will render as an |
|Access a reference to the |
|Applies the alternate color to a Button. By default, Button
uses the |
|Returns the |
|Defines a color palette best used when Button is placed on a dark background-color. By default, Button uses a light color palette.|
|A string corresponding to Button variation classes.|
|Analytics events tracking is enabled by default. Set this value to |
|An override for the dynamic content sent to analytics services. By default this content comes from the heading. In cases where this component’s heading may contain sensitive information, use this prop to override what is sent to analytics.|
|If you need the |
|Optional callback that will intercept analytics events for this component.
If none is specified, the design system will use the default analytics
function, which can be overwritten globally with |
|If needed for analytics, pass heading text of parent component of button.|
|If needed for analytics, pass type of parent component of button.|
|This component passes any additional props to its underlying |
The following CSS variables can be overridden to customize Button components:
This component has analytics tracking available. Please see our developer documentation about using analytics in the design system.
Buttons are promises to the user; they must deliver the promise they offer by doing what the button says it will do.
When to use
- Use buttons for the most important actions you want users to take on your site, such as "Download," "Sign up," or "Apply."
When to consider alternatives
- Less popular or less important actions may be visually styled as links.
- Buttons are for performing actions, not making choices. If you need your users to make a choice, use something else like radio buttons. Alternatively, if one choice is much less important then try styling it as a link instead.
- Avoid using too many buttons on a page. Aim to use only one button per page.
- Avoid similar styles elsewhere on the page that could be confused for buttons.
- Use buttons for the primary action and links for secondary actions.
- Use sentence case for button labels.
- Button labels should be as short as possible with “trigger words” that your users will recognize to clearly explain what will happen when the button is clicked (for example, “Save and continue,” “Download” or “Sign up”).
- Make the first word of the button’s label a verb. For example, instead of “Complaint Filing”, label the button “File a complaint.”
- If a button has an icon, it should still have accompanying text describing the action.
- Confirm the user meant to trigger a destructive action before following through with the action.
- Provide a method for a user to undo a destructive action.
Avoid using disabled buttons
Disabling a "button" to act as a guide to the level of form completion is a common anti-pattern (e.g., you aren't able to proceed in the next step until the form contains enough data). Why it's a problem:
- Buttons tend to have call-to-action text that matches what users want to do, so people try to interact with them.
- They have terrible color contrast.
- They don’t provide feedback and tell the user why they're disabled. They communicate that something is off, but very often that is not enough information. As a result, users are left wondering what’s actually missing, and consequently are locked out entirely.
- Assistive technologies like screen readers and switches are usually not even able to navigate to disabled buttons.
For these reasons, disabled buttons can be frustrating for all users but especially those with cognitive disabilities and those who use assistive technologies.
- Buttons should display a visible focus state when users tab to them.
- Create a button with a
<a>element to retain the native click functionality. Avoid using
<img>tags to create buttons. Screen readers don't automatically know either is a usable button.
- When styling links to look like buttons, remember that screen readers handle links slightly differently than they do buttons. Pressing the
Spacekey triggers a button, but pressing the
Enterkey triggers a link.
- Dimmed or unavailable buttons using the
<a>tag must have the
aria-disabledattribute set to true and its
- Unlike the
disabledis not a valid attribute for
<a>. To describe the disabled state to screen reader users, use the
hrefattribute is not required on
<a>, and when it's absent it doesn't create a hyperlink.
- Unlike the
- Dimmed or unavailable buttons using the
<button>tag should have the
disabledattribute applied. This removes native click and keypress events from the button. It also prevents automated scanners from logging a low contrast error. Finally, it announces the button as "dimmed" or "disabled" to screen readers, offering users additional context.
- Describe what will happen, not the current state.
- Buttons always start with an action word describing the main thing users will do once selected.
- Pair it with a noun to help it be clearer. Example: Get tips.
- If in a form, it can be just the action word if it's navigating between steps. Example: Cancel, Back, Next.
- Use the least amount of words possible (no more than 6 with 2-4 being ideal).
Moving through a process or sequential steps after starting
For forward movement to the next page or step.
- Beyond Blue Links: Making Clickable Elements Recognizable
- 7 Basic Best Practices for Buttons
- The Grammar of Interactivity
- GOV.UK navigation buttons discussion
For more information about how we tested and validated our work for each checklist item, read our component maturity documentation.
ColorMeets AA color contrast standards for accessibility and color blindness.Complete
Forced Colors Mode (FCM)While using FCM the components text is legible and improves readability.Complete
WCAG 2.1 Level AA ConformanceAll Axe checks for WCAG AA compliance have passed.Complete
Screen readersVoiceOver, NVDA, and JAWS screen readers provide concise communication and interaction.Complete
Keyboard navigationComponent is fully navigable with a keyboard.Complete
StorybookComponent has stories to cover all defined props.Complete
ResponsiveComponent designed to work in all responsive breakpoints.Complete
Spanish translationsIncludes Spanish translations for default text content.Not applicable
CodeTokens implemented in code.Complete
DesignTokens implemented in the Sketch.Complete
On this page
- Learn more
- Component maturity