Skip to content

Button

Buttons are interactive elements that trigger actions or events when activated by users. Our button system provides six base button types designed for different use cases and interaction patterns.

The main button component with three visual variants for different emphasis levels.

<button class="tng-button">Button</button>
<a class="tng-button" href="#">Button</a>
Button

The default scheme is primary.

<button class="tng-button is-primary">Primary</button>
<button class="tng-button is-secondary">Secondary</button>
<button class="tng-button is-tertiary">Tertiary</button>
<button class="tng-button is-tertiary is-ghost">
Tertiary Ghost
</button>

The default size is lg.

<button class="tng-button is-sm">Small</button>
<button class="tng-button is-md">Medium</button>
<button class="tng-button is-lg">Large</button>
<button class="tng-button is-primary" disabled>Primary</button>
<button class="tng-button is-secondary" disabled>Secondary</button>
<button class="tng-button is-tertiary" disabled>Tertiary</button>
<button class="tng-button is-tertiary is-ghost" disabled>
Tertiary Ghost
</button>
<button class="tng-button is-primary">
<i class="tng-icon icon-download" aria-hidden="true"></i>
<span>Download</span>
</button>
<button class="tng-button is-secondary">
<span>Save</span>
<i class="tng-icon icon-bookmark" aria-hidden="true"></i>
</button>
<button class="tng-button is-tertiary">
<i class="tng-icon icon-external-link" aria-hidden="true"></i>
<span>External Link</span>
</button>

High-contrast conversion buttons for critical actions and call-to-actions.

<button class="tng-accent-button">Default</button>
<button class="tng-accent-button is-bz4x">BZ4X</button>

The default size is lg.

<button class="tng-accent-button is-sm">Small</button>
<button class="tng-accent-button is-md">Medium</button>
<button class="tng-accent-button is-lg">Large</button>
<button class="tng-accent-button" disabled>Default</button>
<button class="tng-accent-button is-bz4x" disabled>BZ4X</button>
<button class="tng-icon-button" aria-label="Download">
<i class="tng-icon icon-download" aria-hidden="true"></i>
</button>
<button class="tng-icon-button is-outlined" aria-label="Bookmark">
<i class="tng-icon icon-bookmark" aria-hidden="true"></i>
</button>
<button class="tng-icon-button is-ghost" aria-label="External link">
<i class="tng-icon icon-external-link" aria-hidden="true"></i>
</button>

The default size is sm.

<button class="tng-icon-button is-sm" aria-label="Search">
<i class="tng-icon icon-search" aria-hidden="true"></i>
</button>
<button class="tng-icon-button is-md" aria-label="Calendar">
<i class="tng-icon icon-calendar" aria-hidden="true"></i>
</button>
<button class="tng-icon-button is-lg" aria-label="Confirm">
<i class="tng-icon icon-check" aria-hidden="true"></i>
</button>
<button class="tng-icon-button" disabled aria-label="Download">
<i class="tng-icon icon-download" aria-hidden="true"></i>
</button>
<button
class="tng-icon-button is-outlined"
disabled
aria-label="External link"
>
<i class="tng-icon icon-external-link" aria-hidden="true"></i>
</button>
<button
class="tng-icon-button is-ghost"
disabled
aria-label="External link"
>
<i class="tng-icon icon-external-link" aria-hidden="true"></i>
</button>

Rounded buttons perfect for filters, tags, and selection interfaces.

The default size is lg.

<button class="tng-pill-button is-sm">Small</button>
<button class="tng-pill-button is-md">Medium</button>
<button class="tng-pill-button is-lg">Large</button>
<button class="tng-pill-button is-selected">Selected</button>
<button class="tng-pill-button" disabled>Disabled</button>
<button class="tng-pill-button on-overlay">Rested</button>
<button class="tng-pill-button on-overlay is-selected">
Selected
</button>
<button class="tng-pill-button on-overlay is-cta">CTA</button>
<button class="tng-pill-button on-overlay" disabled>Disabled</button>
<button class="tng-pill-button">
<i class="tng-icon icon-ui-spinner" aria-hidden="true"></i>
<span>Loading</span>
</button>
<button class="tng-pill-button">
<span>Popular</span>
<i class="tng-icon icon-arrow-right" aria-hidden="true"></i>
</button>

Icon-only buttons for social media actions and sharing.

The default size is sm.

<button
class="tng-social-button is-sm"
aria-label="Share on Facebook"
>
<i class="tng-icon icon-facebook" aria-hidden="true"></i>
</button>
<button class="tng-social-button is-lg" aria-label="Share on YouTube">
<i class="tng-icon icon-youtube" aria-hidden="true"></i>
</button>
<button
class="tng-social-button"
disabled
aria-label="Share on YouTube"
>
<i class="tng-icon icon-youtube" aria-hidden="true"></i>
</button>

You can set overflow limitation on a button just like any other element by using the overflow utility class.

<button class="tng-button">
<div class="tng-overflow-ellipsis"></div>
</button>
  • Use <button> for actions (submit, toggle, open dialog). Use <a> for navigation. Both can be styled with .tng-button, but only <button> responds to Space and has implicit role="button".
  • Never use <a href="#"> as a button substitute — screen readers announce it as a link.

Icon buttons (.tng-icon-button, .tng-social-button) must include an accessible label. Prefer aria-label over .sr-only (learn why).

<button class="tng-icon-button" aria-label="Download">
<i class="tng-icon icon-download" aria-hidden="true"></i>
</button>
  • Disabled — prefer the native disabled attribute. It removes the button from tab order and communicates the state automatically.
  • Focusable disabled — if a disabled button must remain focusable (e.g. to show a tooltip), use aria-disabled="true" instead and prevent the click in JavaScript.
  • Toggle buttons — use aria-pressed="true" / "false" for on/off toggles. Use aria-expanded when the button controls a collapsible region.

All button variants use the tng-touch-target utility to meet the WCAG 2.5.8 minimum target size of 44×44 CSS pixels.