Skip to content

Main Button

The Button is one of the most important interactive elements in the design system. It enables users to take action — for example, saving changes, submitting a form, or moving forward in a process.

There are two main ways a Primary Button can appear:

  • As a Button: used when the action happens within the same page (e.g. opening a modal, submitting data).
  • As a Link styled as a Button: used when the action takes the user to another page or an external website.

The Tertiary Button includes an optional underline that can be toggled on or off through the boolean property “Underline”. This ensures consistent behaviour and appearance while simplifying maintenance and documentation across Figma and development.

  • Use a Button when the action happens on the same page (save, add, continue, open).
  • Use a Link (styled as a button) when the user needs to go to another page or website.
  • Only use one Primary Button per screen or section, so it’s clear what the main action is.
  • Never use an icon-only button — there must always be text so that everyone understands it.

Quick summary of accessibility & consistency

Section titled “Quick summary of accessibility & consistency”
  • Buttons can be used with a keyboard, always show a visible focus, and meet accessibility contrast requirements so text is easy to read.
  • The touch area is always at least 44×44px, so it’s easy to press on mobile.
  • Semantics are correct: buttons are for actions, links are for navigation. This makes them predictable and clear for everyone, including people using assistive technologies.
  • Buttons can be restyled to match the look and feel of each brand without changing their structure. In Figma, this is done by switching modes, so the same component automatically takes on the right colours, typography, and styles for each brand.
  • Design tokens keep these styles consistent across brands, devices, and screens.

Buttons remain consistent across all breakpoints. Their design, size, and interaction states are the same on every device — only layout spacing and container alignment adapt to ensure responsiveness.

Rested

Button-Main
Background color:
buttons-main-button-primary-neutral-rested-fill-color#00244d
buttons-main-button-primary-neutral-rested-fill-color#282830
Border color:
buttons-main-button-primary-neutral-rested-border-color#282830
buttons-main-button-primary-neutral-rested-border-color#282830
Border weight: 1
Border radius:
buttons-corner-radius1000px
 
buttons-corner-radius0px
 
Stroke alignment: Inside
Label
Text color:
buttons-main-button-primary-neutral-rested-foreground-color#ffffff
buttons-main-button-primary-neutral-rested-foreground-color#ffffff

Hover

Button-Main
Background color:
buttons-main-button-primary-neutral-hover-fill-color#001a38
buttons-main-button-primary-neutral-hover-fill-color#6c7073
Border color:
buttons-main-button-primary-neutral-hover-border-color#15151b
buttons-main-button-primary-neutral-hover-border-color#6c7073
Border weight: 0
Border radius:
buttons-corner-radius1000px
 
buttons-corner-radius0px
 
Label
Text color:
buttons-main-button-primary-neutral-hover-foreground-color#ffffff
buttons-main-button-primary-neutral-hover-foreground-color#ffffff

Active

Button-Main
Background color:
buttons-main-button-primary-neutral-active-fill-color#4d4d4d
buttons-main-button-primary-neutral-active-fill-color#000000
Border color:
buttons-main-button-primary-neutral-active-border-color#000000
buttons-main-button-primary-neutral-active-border-color#15151b
Border weight: 1
Border radius:
buttons-corner-radius1000px
 
buttons-corner-radius0px
 
Label
Text color:
buttons-main-button-primary-neutral-rested-foreground-color#ffffff
buttons-main-button-primary-neutral-rested-foreground-color#ffffff

Disabled

Button-Main
Background color:
buttons-main-button-primary-neutral-disabled-fill-color#e5e3e1
buttons-main-button-primary-neutral-disabled-fill-color#a8aaac
Border color:
buttons-main-button-primary-neutral-disabled-border-color#999999
buttons-main-button-primary-neutral-disabled-border-color#a8aaac
Border weight: 1
Border radius:
buttons-corner-radius1000px
 
buttons-corner-radius0px
 
Label
Text color:
buttons-main-button-primary-neutral-disabled-foreground-color#999999
buttons-main-button-primary-neutral-disabled-foreground-color#15151b

Focus

Button-Main
Border color:
color-border-focus-neutral-default#0072f0
color-border-focus-neutral-default#0072f0
Border weight: 2
Border radius: 2

Rested

Button-Main
Border color:
buttons-main-button-secondary-neutral-rested-border-color#c57046
buttons-main-button-secondary-neutral-rested-border-color#a8aaac
Border weight: 1
Border radius:
buttons-corner-radius1000px
 
buttons-corner-radius0px
 
Stroke alignment: Inside
Label
Text color:
buttons-main-button-secondary-neutral-rested-foreground-color#000000
buttons-main-button-secondary-neutral-rested-foreground-color#15151b

Hover

Button-Main
Background color:
buttons-main-button-secondary-neutral-hover-fill-colorrgba(255, 255, 255, 0.45)
buttons-main-button-secondary-neutral-hover-fill-color#e4e4e4
Border color:
buttons-main-button-secondary-neutral-hover-foreground-color#000000
buttons-main-button-secondary-neutral-hover-foreground-color#15151b
Border weight: 1
Label
Text color:
buttons-main-button-secondary-neutral-hover-foreground-color#000000
buttons-main-button-secondary-neutral-hover-foreground-color#15151b

Active

Button-Main
Background color:
buttons-main-button-secondary-neutral-active-fill-colorrgba(255, 255, 255, 0.45)
buttons-main-button-secondary-neutral-active-fill-color#ffffff
Border color:
buttons-main-button-secondary-neutral-active-border-color#000000
buttons-main-button-secondary-neutral-active-border-color#15151b
Border weight: 1
Label
Text color:
buttons-main-button-secondary-neutral-active-foreground-color#000000
buttons-main-button-secondary-neutral-active-foreground-color#15151b

Disabled

Button-Main
Border color:
buttons-main-button-secondary-neutral-disabled-border-color#999999
buttons-main-button-secondary-neutral-disabled-border-color#6c7073
Border weight: 1
Label
Text color:
buttons-main-button-secondary-neutral-disabled-foreground-color#999999
buttons-main-button-secondary-neutral-disabled-foreground-color#6c7073

Focus

Button-Main
Border color:
color-border-focus-neutral-default#0072f0
color-border-focus-neutral-default#0072f0
Border weight: 2
Border radius: 2

Rested

Button-Main
Stroke alignment: Center
Border radius: 0
border
Border color:
buttons-main-button-tertiary-neutral-rested-border-color#282830
buttons-main-button-tertiary-neutral-rested-border-color#282830

Hover

Button-Main
Stroke alignment: Inside
Border radius: 0
border
Border color:
buttons-main-button-tertiary-neutral-hover-border-color#999999
buttons-main-button-tertiary-neutral-hover-border-color#6c7073

Active

Button-Main
Stroke alignment: Inside
Border radius: 0
border
Border color:
buttons-main-button-tertiary-neutral-active-border-color#000000
buttons-main-button-tertiary-neutral-active-border-color#15151b
Label
Text color:
buttons-main-button-tertiary-neutral-rested-foreground-color#000000
buttons-main-button-tertiary-neutral-rested-foreground-color#282830

Disabled

Button-Main
Stroke alignment: Inside
Border radius: 0
border
Border color:
buttons-main-button-tertiary-neutral-disabled-border-color#999999
buttons-main-button-tertiary-neutral-disabled-border-color#6c7073
Label
Text color:
buttons-main-button-tertiary-neutral-disabled-foreground-color#999999
buttons-main-button-tertiary-neutral-disabled-foreground-color#6c7073

Focus

Button-Main
Border color:
color-border-focus-neutral-default#0072f0
color-border-focus-neutral-default#0072f0
Stroke alignment: Inside
Border weight: 2
Border radius: 2

Large (LG)

Button-Main
Height: 50

Medium (MD)

Button-Main
Height: 38

Small (SM)

Button-Main
Height: 32

We define three sizes for this component: Large (LG), Medium (MD) and Small (SM). Each size has a specific role and should be applied consistently across the system.

  • Large (LG): Most frequently used size. Applied across the majority of modules and layouts. Recommended as the default choice for consistency, unless there is a clear reason to use another size.
  • Medium (MD): Currently no active use cases identified. Retained in the system to avoid breaking existing designs where it might have been applied. Future audits may redefine or consolidate this size depending on real usage.
  • Small (SM): Used in specific contexts such as secondary navigation bars. Helps reduce visual weight when multiple elements compete for space. Must not be used for primary actions or as the default size. Only apply it when hierarchy and space require it.

Neutral (False)

Button-Main
Background color:
buttons-main-button-primary-neutral-rested-fill-color#00244d
buttons-main-button-primary-neutral-rested-fill-color#282830
Border color:
buttons-main-button-primary-neutral-rested-border-color#282830
buttons-main-button-primary-neutral-rested-border-color#282830
Label
Text color:
buttons-main-button-primary-neutral-rested-foreground-color#ffffff
buttons-main-button-primary-neutral-rested-foreground-color#ffffff

Contrast (True)

Button-Main
Background color:
buttons-main-button-primary-contrast-rested-fill-color#f5f5f5
buttons-main-button-primary-contrast-rested-fill-color#ffffff
Border color:
buttons-main-button-primary-contrast-rested-border-color#ffffff
buttons-main-button-primary-contrast-rested-border-color#ffffff
Label
Text color:
buttons-main-button-primary-contrast-rested-foreground-color#000000
buttons-main-button-primary-contrast-rested-foreground-color#15151b

Has icon right

Arrow_Right
Type: Boolean
Default: true

Has icon left

Arrow_Right
Type: Boolean
Default: true

Has border

border
Type: Boolean
Default: true
NameApplied asApplied to
buttons-main-button-primary-neutral-rested-fill-color
Background colorButton-Main
buttons-main-button-primary-neutral-rested-fill-color
Background colorButton-Main
buttons-main-button-primary-neutral-rested-border-color
Border colorButton-Main
buttons-main-button-primary-neutral-rested-border-color
Border colorButton-Main
buttons-main-button-primary-neutral-rested-foreground-color
Text colorLabel
buttons-main-button-primary-neutral-rested-foreground-color
Text colorLabel
buttons-main-button-primary-contrast-rested-fill-color
Background colorButton-Main
buttons-main-button-primary-contrast-rested-fill-color
Background colorButton-Main
buttons-main-button-primary-contrast-rested-border-color
Border colorButton-Main
buttons-main-button-primary-contrast-rested-border-color
Border colorButton-Main
buttons-main-button-primary-contrast-rested-foreground-color
Text colorLabel
buttons-main-button-primary-contrast-rested-foreground-color
Text colorLabel
buttons-main-button-primary-neutral-hover-fill-color
Background colorButton-Main
buttons-main-button-primary-neutral-hover-fill-color
Background colorButton-Main
buttons-main-button-primary-neutral-hover-border-color
Border colorButton-Main
buttons-main-button-primary-neutral-hover-border-color
Border colorButton-Main
buttons-main-button-primary-neutral-hover-foreground-color
Text colorLabel
buttons-main-button-primary-neutral-hover-foreground-color
Text colorLabel
buttons-main-button-primary-neutral-active-fill-color
Background colorButton-Main
buttons-main-button-primary-neutral-active-fill-color
Background colorButton-Main
buttons-main-button-primary-neutral-active-border-color
Border colorButton-Main
buttons-main-button-primary-neutral-active-border-color
Border colorButton-Main
buttons-main-button-primary-neutral-active-foreground-color
Text colorLabel
buttons-main-button-primary-neutral-active-foreground-color
Text colorLabel
buttons-main-button-primary-neutral-disabled-fill-color
Background colorButton-Main
buttons-main-button-primary-neutral-disabled-fill-color
Background colorButton-Main
buttons-main-button-primary-neutral-disabled-border-color
Border colorButton-Main
buttons-main-button-primary-neutral-disabled-border-color
Border colorButton-Main
buttons-main-button-primary-neutral-disabled-foreground-color
Text colorLabel
buttons-main-button-primary-neutral-disabled-foreground-color
Text colorLabel
buttons-main-button-secondary-neutral-rested-border-color
Border colorButton-Main
buttons-main-button-secondary-neutral-rested-border-color
Border colorButton-Main
buttons-main-button-secondary-neutral-rested-foreground-color
Text colorLabel
buttons-main-button-secondary-neutral-rested-foreground-color
Text colorLabel
buttons-main-button-secondary-neutral-hover-fill-color
Background colorButton-Main
buttons-main-button-secondary-neutral-hover-fill-color
Background colorButton-Main
buttons-main-button-secondary-neutral-hover-foreground-color
Text colorLabel
buttons-main-button-secondary-neutral-hover-foreground-color
Text colorLabel
buttons-main-button-secondary-neutral-active-fill-color
Background colorButton-Main
buttons-main-button-secondary-neutral-active-fill-color
Background colorButton-Main
buttons-main-button-secondary-neutral-active-border-color
Border colorButton-Main
buttons-main-button-secondary-neutral-active-border-color
Border colorButton-Main
buttons-main-button-secondary-neutral-active-foreground-color
Text colorLabel
buttons-main-button-secondary-neutral-active-foreground-color
Text colorLabel
buttons-main-button-secondary-neutral-disabled-border-color
Border colorButton-Main
buttons-main-button-secondary-neutral-disabled-border-color
Border colorButton-Main
buttons-main-button-secondary-neutral-disabled-foreground-color
Text colorLabel
buttons-main-button-secondary-neutral-disabled-foreground-color
Text colorLabel
buttons-main-button-tertiary-neutral-rested-border-color
Border colorborder
buttons-main-button-tertiary-neutral-rested-border-color
Border colorborder
buttons-main-button-tertiary-neutral-rested-foreground-color
Text colorLabel
buttons-main-button-tertiary-neutral-rested-foreground-color
Text colorLabel
buttons-main-button-tertiary-neutral-hover-border-color
Border colorborder
buttons-main-button-tertiary-neutral-hover-border-color
Border colorborder
buttons-main-button-tertiary-neutral-hover-foreground-color
Text colorLabel
buttons-main-button-tertiary-neutral-hover-foreground-color
Text colorLabel
buttons-main-button-tertiary-neutral-active-border-color
Border colorborder
buttons-main-button-tertiary-neutral-active-border-color
Border colorborder
buttons-main-button-tertiary-neutral-active-foreground-color
Text colorLabel
buttons-main-button-tertiary-neutral-active-foreground-color
Text colorLabel
buttons-main-button-tertiary-neutral-disabled-border-color
Border colorborder
buttons-main-button-tertiary-neutral-disabled-border-color
Border colorborder
buttons-main-button-tertiary-neutral-disabled-foreground-color
Text colorLabel
buttons-main-button-tertiary-neutral-disabled-foreground-color
Text colorLabel
color-border-focus-neutral-default
Border colorButton-Main (Focus)
color-border-focus-neutral-default
Border colorButton-Main (Focus)
 
buttons-corner-radius
Border radiusButton-Main
 
buttons-corner-radius
Border radiusButton-Main
NameApplied asApplied to
 
buttons-lg-content-gap
Item spacingButton-Main
 
buttons-lg-content-gap
Item spacingButton-Main
 
buttons-lg-spacing-horizontal
Padding left / rightButton-Main
 
buttons-lg-spacing-horizontal
Padding left / rightButton-Main
 
buttons-lg-spacing-vertical
Padding top / bottomButton-Main
 
buttons-lg-spacing-vertical
Padding top / bottomButton-Main
 
buttons-md-content-gap
Item spacingButton-Main
 
buttons-md-content-gap
Item spacingButton-Main
 
buttons-md-spacing-horizontal
Padding left / rightButton-Main
 
buttons-md-spacing-horizontal
Padding left / rightButton-Main
 
buttons-md-spacing-vertical
Padding top / bottomButton-Main
 
buttons-md-spacing-vertical
Padding top / bottomButton-Main
 
buttons-sm-content-gap
Item spacingButton-Main
 
buttons-sm-content-gap
Item spacingButton-Main
 
buttons-sm-spacing-horizontal
Padding left / rightButton-Main
 
buttons-sm-spacing-horizontal
Padding left / rightButton-Main
 
buttons-sm-spacing-vertical
Padding top / bottomButton-Main
 
buttons-sm-spacing-vertical
Padding top / bottomButton-Main
NameApplied asApplied to
Lorem Ipsum
buttons-sm-font-size
Text styleButton Label
Lorem Ipsum
buttons-sm-font-size
Text styleButton Label
Lorem Ipsum
buttons-md-font-size
Text styleButton Label
Lorem Ipsum
buttons-md-font-size
Text styleButton Label
Lorem Ipsum
buttons-lg-font-size
Text styleButton Label
Lorem Ipsum
buttons-lg-font-size
Text styleButton Label
  • There should only ever be one Primary Button visible within a page or container. This keeps the main action clear and avoids competing calls to action.
  • Place the Primary Button where users naturally expect to find the next step — for example, at the bottom right of a form, in the footer of a card, or as a sticky action in a header.
  • Secondary and Tertiary Buttons must always be positioned in relation to the Primary. They must not compete visually. Place them to the left of, or below, the Primary Button, or move them into a contextual menu if space is limited.
  • Ensure sufficient spacing between buttons to prevent accidental clicks or taps. Button height and width must always follow design tokens for consistency across breakpoints.
  • Use contrast, size and weight to make sure the Primary Button stands out as the most important action on the screen.

To ensure that all button variants meet accessibility standards across platforms, follow the implementation checklist below. These recommendations align with WCAG 2.1 AA, support keyboard navigation, and are compatible with assistive technologies.

  • All button states (rested, hover, active, disabled, focus) must maintain accessible contrast in both light and dark background contexts.
  • Focus styles must remain visible and meet WCAG AA contrast requirements across all supported surfaces. Focus should be clearly distinguishable from hover. Use a high-contrast outline or border (e.g. #0072F0 against adjacent backgrounds).
  • Hover, focus and pressed states must be clearly differentiated using more than colour alone. Examples: colour change plus border or shadow; icon or text emphasis.
  • All buttons must show a visible focus style (not just a colour change) on keyboard navigation. Never remove the browser’s default outline unless replaced with an accessible alternative.
  • Disabled buttons must not be focusable and must not trigger actions. Maintain sufficient visual contrast for recognition (ideally ≥ 3:1, or provide a clear visual separation).
  • Absolute minimum: 24 × 24 px — the lowest technical requirement. It ensures the element can still be reached but does not guarantee an optimal experience.
  • Recommended best practice: 44 × 44 px — follows WCAG 2.5.5 Target Size (Level AA) and EN 301549 guidance. Provides a more comfortable interaction area for users with motor difficulties, touch devices, or when using a device outdoors. Should be the default requirement.
  • The minimum target size applies regardless of the visual size of the component. If the visual element is smaller, additional spacing or invisible padding must be added. Consistency is key: the same rule applies across all sizes (LG, MD, SM).

To ensure buttons meet WCAG 2.1 AA and support assistive technologies, follow these implementation standards:

  1. Semantic HTML
    • Always use the native <button> element (not <div> or <a> without role). If an <a> element must be used as a button, ensure role="button" is set, that it is focusable with tabindex="0", and that it supports Enter/Space keypress events. This should be considered a fallback only.
  2. Keyboard Navigation
    • All buttons must be reachable with Tab and activatable with Enter and Space.
    • Icon-only buttons must include accessible labelling: aria-label="Edit" or aria-labelledby="..." when referencing visible text elsewhere.
    • Ensure keyboard shortcuts follow platform conventions (Enter/Space on desktop, tap on mobile).
  3. Focus Ring / Visible Focus
    • All buttons must show a visible focus style (not just a colour change) on keyboard navigation.
    • Use a high-contrast outline or border (e.g. #0072F0 against adjacent backgrounds).
    • Focus must remain persistent and highly visible, not replaced by hover styles.
    • Never remove the browser’s default outline unless replaced with an accessible alternative.
  4. Screen Reader Support
    • Each button must include a clear and concise text label (e.g. <button>Edit</button>).
    • For icon-only buttons: use aria-label or title to describe the action (e.g. “Download PDF”).
    • Avoid redundant roles or aria-hidden="true" on interactive buttons.
  5. Disabled State
    • Use the disabled attribute on <button> rather than visually faking it.
    • Disabled buttons must not be focusable and must not trigger actions.
    • Maintain sufficient visual contrast for recognition (ideally ≥ 3:1, or provide a clear visual separation).
    • Note: contrast may fall below 4.5:1 if disabled buttons are visibly distinguishable and not interactive, as per WCAG 2.1 SC 1.4.3.
  6. Interaction Feedback
    • Hover, focus and pressed states must be clearly differentiated using more than colour alone.
    • Examples: colour change plus border or shadow; icon or text emphasis.
  7. Responsive and Tap Targets
    • Touch targets must meet minimum sizes (WCAG + mobile UX best practices).
    • Ensure icon-only or small buttons are not too small on touch devices.
    • Use spacing tokens to maintain consistency across breakpoints.
Case✅ Good❌ Bad
Semantic Structure<button>Save</button><div onclick="save()">
Keyboard NavigationActivatable using Enter / SpaceOnly activatable with pointer click
Focus VisibilityClear, high-contrast focus ringFocus removed or replaced by hover-only styling
Disabled State<button disabled> with muted stylingVisually greyed but still interactive
Screen Reader<button aria-label="Download PDF"> for iconIcon button with no accessible name
Guidance on how to use a component.
  • Represents the main action on a screen or within a content block.
  • There should only ever be one Primary Button per view to maintain hierarchy.
  • Ensure strong visual emphasis (high contrast, size, weight).
  • Use it when the action is directly tied to the user’s goal (e.g. Save, Submit, Purchase).
  • Represents a supporting action.
  • Multiple Secondary Buttons can be used within the same view.
  • Use it when the Primary action is already present and you don’t want to compete with it visually.
  • Suitable for actions such as Back, Cancel, Edit.
  • Represents a low-priority action, used infrequently.
  • Helps reduce visual noise in the interface.
  • Common in footers, settings panels, filters, preferences.
  • Works well in card layouts or lists where the action should not steal attention.
  • Use the Underline property to adapt the tertiary button visually when needed.
  • Keep its default (underline visible) for text-based or inline actions.
  • Disable it when the button appears in dense layouts or icon-driven contexts to reduce visual noise.
Guidance on what to avoid when using a component.
  • Don’t place multiple Primary Buttons of equal importance within the same view.
  • Don’t use it inside highly prominent containers where it may feel visually overwhelming.
  • Don’t place it on backgrounds with strong or conflicting colours that reduce clarity.
  • Don’t use it when the action is the main call to action (use Primary instead).
  • Don’t place it in tight spaces where bordered styles look cluttered or compete with container borders.
  • Don’t use it when de-emphasis is required (in those cases use Tertiary).
  • Don’t use it for main user actions (use Primary or Secondary instead).
  • Don’t place it in contexts where strong contrast is needed (e.g. dark mode, complex backgrounds).
  • Don’t use it if the border blends into the background, making it hard to perceive.
Guidance on where this component has been used
  • Use clear and accurate labels that lead with an actionable verb.
  • Be limited to one Primary per view to maintain hierarchy.
  • Be positioned consistently across screens to support predictable navigation.
  • Use established button colours appropriately (e.g. avoid over-emphasis with multiple high-contrast buttons).
  • Never rely on icons alone — always provide a text label or accessible name.
  • Be grouped thoughtfully: Secondary or Tertiary actions should be visually related to the Primary but not compete with it.
  • Buttons are used for actions (e.g. Add, Save, Close).
  • Links are used for navigation and typically appear within or following a sentence.
  • Using the correct element improves accessibility, visual consistency, and maintainability at scale.
  • Only use buttons that follow the best practices defined above.
  • Group together calls to action that share a clear relationship.
  • Avoid overloading users with too many buttons — this can cause uncertainty about what to do next.
  • Be mindful of how multiple buttons display and behave on smaller screens.
  • Limit groups to a maximum of six buttons, and only when they contain icons without text.
  • Use clear and specific action verbs. Examples: Save changes / Download invoice / Submit form. Avoid vague labels such as: Click here / OK / Confirm.
  • Be concise — limit button text to 1–3 words, aiming for around 24 characters in English. Allow flexibility for languages with longer words (e.g. German, Finnish).
  • Make the outcome predictable. Instead of Yes / No, use: Yes, delete account / Cancel.
  • Avoid jargon or idioms — use plain English.
  • When buttons appear in groups (e.g. modal dialogs), each should be self-explanatory. Example: Save draft / Discard draft — not: Yes / No.
  • For icon-only buttons, ensure accessible names are applied (e.g. using aria-label). For icon + text buttons, do not repeat the icon meaning redundantly in the text.
  • Keep copy neutral, translatable and adaptable. Buttons must allow at least 25–40% extra width to accommodate longer translations.