Button component - How to use

The button component is used to trigger an action or event. For accessibility, buttons should not be used to route to a URL.

Basic use

The most basic invocation requires text to be passed:

<Hds::Button @text="Copy to clipboard" />

Renders to:

Add an icon

To add an icon to your button, give the @icon a Flight icon name:

<Hds::Button @text="Copy to clipboard" @icon="clipboard-copy" />

Renders to:

Icon position

By default, if you define an icon, it is placed before the text. If you would like to position the icon after the text, define @iconPosition:

<Hds::Button @text="Copy to clipboard" @icon="clipboard-copy" @iconPosition="trailing" />

Renders to:

Icon-only button

If you would like to create an icon-only button, set @isIconOnly to true. Note that you still have to define the @text value; it will be used as the aria-label attribute value on the button element.

<Hds::Button @text="Copy to clipboard" @icon="clipboard-copy" @isIconOnly={{true}} />

Renders to:

If you need to add a tooltip to an icon-only button, here is an example of how to do it in an accessible way: Accessible Button Tooltip Pattern.

Color

There are four available colors for a button: primary, secondary, tertiary, and critical. The default is primary. To use a different color, declare another value for @color:

<Hds::Button @text="Critical" @color="critical" />

Renders to:




Size

There are three sizes available for buttons: small, medium and large. The default is medium. To use a different size, declare a value for @size:

<Hds::Button @text="Large button" @size="large" />

Renders to (with icons):



Full-width

This allows indication that a button should take up the full-width of the parent container. It is set to false by default.

<Hds::Button @text="Copy to clipboard" @isFullWidth={{true}} />

Renders to:

Type

This is the native button attribute, type. There are three possible values: button, submit, and reset. The default type for the button is submit. To prevent a button from submitting a form, set type to button.

<Hds::Button @text="Submit" type="submit" />

Notice: if you're passing a @href or a @route argument to the component, this will generate a <a> link, not a <button> (see below). In this case no type is needed.

Actions

Define the action in your route or controller, and add it to the component invocation in your template:

<Hds::Button @text="Copy to clipboard" {{on "click" this.copyToClipboard}} />

Read the Ember.js guides for more information: Patterns for Actions .

Links

You can generate a link with the visual appearence of a button passing a @href or a @route argument to the component.

Notice: the Hds::Button component internally uses the generic Hds::Interactive component. For more details about how this low-level component works please refer to its documentation page.

With @href

If you pass a @href argument a <a> link will be generated:

<Hds::Button @text="Visit website" @icon="external-link" @iconPosition="trailing" @href="https://hashicorp.com" />

Renders to:

Visit website

⚠️ Important: when using the @href argument the component adds by default the attributes target="_blank" and rel="noopener noreferrer" to the <a> element (because this is the most common use case: internal links are generally handled using a @route argument). If the href points to an internal link, or uses a different protocol (eg. "mailto" of "ftp") you can pass @isHrefExternal={{true}} to the component and it will not add the target and rel attributes (but you can pass yours if needed, using the ...attributes spreading. For more details see the Hds::Interactive component.

🚨 Notice: if a href HTML attribute is used instead of the @href Ember argument we apply this visual treatment to alert the developer:

With @route

If you pass a @route argument a <a> link will be generated using a <LinkTo> Ember component:

<Hds::Button @text="Back to homepage" @icon="arrow-left" @route="index" />

Renders to:

Back to homepage

⚠️ Important: if the route is external to your current engine you have to pass also @isRouteExternal={{true}} to the component so that it will use <LinkToExternal> instead of a simple <LinkTo> for the @route. For more details see the Hds::Interactive component.

Notice: all the standard arguments for the <LinkTo/LinkToExternal> components are supported (eg. models/model/query/current-when/replace).

Disabled buttons

To disable a button, manually add the native disabled attribute:

<Hds::Button @text="Copy to clipboard" disabled />

Renders to:

Notice: since a <a> link can't be disabled, if you're passing a @href or a @route argument to the component you will need to take care of intercepting the events in case you want to disable it.