Buttons

A button is designed to grab the user’s attention.

Use the button classes on an <a>, <button>, or <input> element. Also you can use any of the available button classes to quickly create a styled button: .btn-secondary or .btn-primary or a medium-sized variant: .btn-md

Figma logo The guideline content on this page is synced with Figma and can be used as a source of truth. Open in Figma


Anatomy

  1. Button container
  2. Icon (optional)
  3. Label
Anatomy of a button showing: 1 — button container, 2 — icon (optional), 3 — label

Primary

Primary buttons have a background fill in order to make them clearly distinguishable from input fields. The primary button has the following states.

Secondary

Secondary buttons are white in their normal state and can therefore not use purple for hover and focus state. The secondary button has the following states.

Tertiary

The tertiary button has the following states.

Button with icon

Add an icon before the button label.


Summary

Primary button — Used for the main action in a flow that changes data — for example sending, saving, or confirming. Represents the most important, often irreversible action in a view.

Secondary button — Used for supporting actions that change data, or — in rare cases — to give visual emphasis to an important action that initiates a process (e.g. opens a confirmation dialog).

Tertiary button — Used for non-committing actions that change the view or state, but do not change data or URL. Tertiary buttons are visually subtle and should never compete with Primary or Secondary buttons.

Link — Used for navigation to a new URL — either internal or external. Always use for navigation between pages or external resources. Clarify if it opens in a new tab/window.

Overview

This overview helps you select the right button or link.

Button type Changing data? Typical measures Recommendation
Primary Yes Submit form, Save changes, Publish, Confirm Main action in flow. Only one per page/view. Positioned farthest right.
Secondary Yes / No Save as draft, Delete, Duplicate, Reset Supplementary data change. Max 2–3 per view, not side by side.
Tertiary No Cancel, Back, Show more, Switch tab, Open panel Navigates within page/view or changes visual state. Use sparingly.
Link No (navigate) Go to page, Open help/docs, Download file Always use for page/external navigation. Clarify new tab/window.

Primary

Usage

Used for the main action in a flow that changes data — for example sending, saving, or confirming.

Represents the most important, often irreversible action in a view. Primary buttons should only appear once per task, but not every screen needs a primary button.

Typical use:
"Submit application"
"Save and close"
"Publish"
"Confirm"

Placement: Use only one primary button per view or task. Typically placed on the right or in the main action area.

Primary button in an empty state context

Best practices

Do

  • Use for committing or finalising actions.

Don't

  • Do not use for navigation or cancel actions.
  • Do not use multiple primary buttons in the same view.

Do

Only use 1 primary button per screen. Use default, tertiary, or text buttons for other actions.

Don't

Avoid more than one primary button on the screen as it reduces the clarity of what should be done next.

Examples

If you are uncertain about when to use primary buttons, this table provides a clear reference for their intended use cases and placement.

ActionComponentComment
SendPrimaryCommits form data
SavePrimaryFinalises changes
ConfirmPrimaryConfirms irreversible action

Secondary

Usage

Used for supporting actions that change data, or — in rare cases — to give visual emphasis to an important action that initiates a process (e.g. opens a confirmation dialog).

Typical use:

  • Save as draft
  • Delete (open dialog)
  • Duplicate
  • Reset to default
Selected 0 out of 7 items

Placement

  • Positioned near the Primary button, but visually secondary.
  • Can use multiple Secondary buttons per view (max ~3), but avoid side-by-side clutter.
Secondary button placement example

Examples

If you are uncertain about when to use secondary buttons, this table provides a clear reference for their intended use cases and placement.

ActionComponentComment
Save as draftSecondarySaves data, but not the main action
Delete (opens dialog)SecondaryInitiates process; deletion happens inside dialog
DuplicateSecondaryCreates a copy of an item

Exception rule

Visual weight without direct data change

In some cases, the Secondary button is used instead of the Tertiary button even when data is not directly changed, but the action leads to something important. For example, it opens a dialog that requires a conscious choice.

This applies to, for instance:

  • “Delete” in a list that opens a confirmation dialog.
  • “Publish” which opens a review flow or publishing settings.
  • “Submit for review” that leads to another view.

In these cases, Secondary is used to give visual weight to an initiating but important action, signalling that this is the next step in a decision-making process.

Secondary button exception rule example

Best practices

Do

  • Use for meaningful actions that are less critical than primary.
  • Use for initiating important flows that don’t immediately change data.

Don't

  • Do not use for simple navigation or cancel actions.
  • Do not use Secondary purely for visual styling.

Tertiary

Usage

Used for non-committing actions that change the view or state, but do not change data or URL. Tertiary buttons are visually subtle and should never compete with Primary or Secondary buttons.

Typical use:

  • Cancel
  • Back
  • Show more
  • Switch tabs

Placement

  • Typically placed to the left of Primary and Secondary buttons.
  • Can appear multiple times per view, but avoid overuse.

Best practices

Do

  • Use for navigation within the current view.
  • Use for safe “escape” actions (e.g., “Cancel”).
  • Keep visual emphasis low (text-only or outline style).

Don't

  • Do not use to change data.
  • Do not compete visually with Primary/Secondary buttons.
  • Do not use for links that navigate to a new URL.
Content 2020-05-11
Content 2020-05-11
Content 2020-05-11
Content 2020-05-11
Content 2020-05-11
Content 2020-05-11
Content 2020-05-11
Content 2020-05-11

Examples

If you are uncertain about when to use tertiary buttons, this table provides a clear reference for their intended use cases and placement.

ActionComponentComment
CancelTertiaryCancels without saving.
Show moreTertiaryExpands content in-place
Switch tabTertiarySwitches view state, no data change.
Delete (open dialog)Secondary or TertiaryInitiates an important process; actual deletion is Primary inside dialog.

Hierarchy

Buttons follow a visual hierarchy: Primary → Secondary → Tertiary. Use only one Primary button per view. Pair it with Secondary and/or Tertiary buttons as needed.

Horizontal stack

When stacking buttons horizontally, place the highest-emphasis button on the trailing edge (right in LTR layouts). Lower-emphasis buttons go to the left.

Vertical stack

Use a vertical stack when horizontal space is limited. Buttons are stacked top-to-bottom with 8 px gap. The highest emphasis button should be on top.

Use the .btn-group-block helper class on the parent container to make all direct child buttons span the full width, without adding .btn-block to each button individually.

Button label

The amount of text in a button is a critical element for both usability and visual consistency. The general rule is to prioritise clarity and conciseness above all else. A good button label tells the user exactly what will happen when they click it, without requiring them to read a lot of extra information.

Use verb

Button labels should typically start with a strong, action-oriented verb. This makes it a clear command. Examples include:

  • "Save"
  • "Download"
  • "Add to cart"
  • "Create account"

Maximum words

As a general guideline, button labels should be kept to a maximum of 2–3 words. This ensures the button is scannable and the text doesn't wrap to a second line, which can look messy and increase cognitive load. A single line of text is a key constraint for maintaining a clean and consistent layout, especially in mobile interfaces.

Behaviour

Minimum width

The minimum width for basic buttons is 2× the height of the button.

68 px min width

Maximum width

A button may grow with its label but should never exceed a maximum width of 240 px or the width of its container.

240 px max width

Touch area

The minimum touch/click target for a button is 40 × 40 pixels, ensuring comfortable interaction on both pointer and touch devices.

Illustration of the minimum 40 × 40 pixel touch area for buttons

Size

Two available sizes: medium (40 px, default) and small (32 px). Add .btn-sm for the small variant or .btn-md to be explicit. Choose based on the density of the surrounding UI.

Deprecated! The legacy .btn-lg class (48 px) is deprecated and will be removed in v3.0 — use .btn-md instead.

Accessibility

Keyboard interaction

Buttons must be reachable and operable via keyboard alone.

KeyAction
TabMoves focus to the next focusable element
Shift + TabMoves focus to the previous focusable element
Enter / SpaceActivates the focused button

Disabled state

For disabled state (buttons are unclickable) add .disabled class on your button or add the disabled attribute to <button> or <input> buttons.

<a> tags don't support the disabled attribute, so you must add the .disabled class to make it visually appear disabled. For disabled links that include .disabled class, they should include the aria-disabled="true" attribute to indicate the state of the element to assistive technologies.

For active/selected state add .active class on the element and include the aria-selected="true" attribute.


Best practices

Labels

Use clear, concise verb-based labels. Avoid vague or generic wording.

Do

Labels should use verbs and indicate what will happen when the button is pressed.

Don't

Don't use adjectives, nouns, or past tense labels.

Icons

Icons can reinforce meaning. Always pair icons with a visible text label unless the icon is universally understood.

Do

Use icons when it helps clarify an action.

Don't

Avoid overusing icons in buttons for decorative purposes. This adds unnecessary noise to the UI.

Do

Use a single icon in a button.

Don't

Don't use more than one icon in a button.


Design

Standard buttons

Primary, Secondary (formerly Default), Tertiary (formerly Link button), and Destructive buttons in their default appearance.

Deprecated in 2.3. Destructive buttons (.btn-destructive) have no replacement and will be removed in 3.0.
Type Example Class
Secondary .btn or .btn.btn-secondary
Primary .btn.btn-primary
Tertiary .btn.btn-tertiary
Destructive .btn.btn-destructive
Destructive (disabled) .btn.btn-destructive.disabled
Primary destructive .btn.btn-primary.btn-destructive
Primary destructive (disabled) .btn.btn-primary.btn-destructive.disabled

Directional buttons — size variants

Add .left or .right class together with .btn to indicate direction in a flow (e.g. wizard steps) or data movement.

Directional buttons in all three sizes (small, medium, large) for both secondary and primary themes.

Deprecated! The legacy .btn-lg class (48 px) is deprecated and will be removed in v3.0 — use .btn-md instead.

Squerkle buttons

Add .btn-squerkle together with .btn. Recommended sizes: 48 × 48, 32 × 32, and 24 × 24 px. Use background colour helper classes and spacing helpers to customise.

Deprecated in 2.3. No replacement. Will be removed in 3.0.

Default - .btn.btn-squerkle


.btn.btn-squerkle.bg-secondary


.btn.btn-squerkle.bg-primary

Use .btn-link for a button-styled link that retains button height without the full button surface treatment.

For icon-only buttons (.btn-icon), see the dedicated Icon button page.

Link button - .btn.btn-link


Transparent background buttons

Use .btn-link with .btn-secondary or .btn-destructive for a button-link with interaction styles of a secondary or destructive button.

Deprecated in 2.3. No replacement. Will be removed in 3.0.

Small button - .btn-sm

Medium size (default)

Login buttons

Different types of buttons used for login pages.

Deprecated in 2.3. No replacement. Will be removed in 3.0.

Default login button .btn-login

Block button

Create block-level buttons that span the full width of a parent by adding .btn-block.

Small

Medium (default)


Specs

Button spacing specification — padding, height, gap between icon and label, and border radius
Button group horizontal spacing — 8 px gap between buttons
Button group vertical spacing — 8 px gap between buttons
Unlike primary and secondary variants, tertiary buttons do not utilise internal horizontal padding. When a tertiary button is adjacent to primary/secondary buttons, use a 24 px gap at the container level to provide the additional separation.