Button

Button is the core action component for forms, navigation triggers, toolbars, dialogs, hero sections, and interactive UI flows. The visual structure is driven entirely by CSS — no JavaScript runtime is required for standard buttons. Use the same .button base class on native <button> elements for actions and <a> elements for navigation.

Button is suited for primary actions, secondary actions, destructive confirmations, inline action links, icon-only controls, loading states, and connected button groups.


Getting Started

Apply .button to an interactive element and add a visual modifier such as .is-primary, .is-primary-outline, or .is-ghost. Use class in HTML examples and className in React examples.

<button class="button is-primary">
  Save changes
</button>

<a href="/docs" class="button is-primary-outline">
  View documentation
</a>
View documentation

Use <button> for actions and <a> for navigation. Button does not require a fa-component attribute.


Structure

The base structure is intentionally small: one root element receives .button, then optional modifiers define color, size, state, or grouping behavior.

ElementClass / AttributePurpose
RootbuttonBase class for spacing, alignment, border, focus, active, and disabled behavior.
Semantic modifieris-primary / is-success / is-dangerSets the button tone for brand, positive, destructive, warning, or informational actions.
Outline modifieris-primary-outlineCreates a bordered secondary action that fills on hover.
Ghost modifieris-ghost / is-primary-ghostCreates a low-emphasis transparent button.
Size modifieris-tiny / is-small / is-large / is-xlargeAdjusts padding and font size through button sizing tokens.
Icon modifieris-iconCreates a square icon-only button with equal width and height.
State modifieris-loading / is-loading-inline / is-disabledControls loading and disabled visual states.
Group wrapperbutton-groupConnects related buttons into a segmented control.

Solid Variants

Solid variants are high-emphasis buttons. Use them for actions that should clearly stand out.

ClassCSS VariableDescription
is-primaryvar(--primary)Main product, page, or brand action.
is-successvar(--success)Positive, completed, or confirm action.
is-dangervar(--danger)Destructive, critical, or high-risk action.
is-warningvar(--warning)Caution or attention action.
is-infovar(--info)Informational highlighted action.
is-darkvar(--dark)Dark neutral action.
is-lightvar(--light)Light neutral action.
<button class="button is-primary">Primary</button>
<button class="button is-success">Success</button>
<button class="button is-danger">Danger</button>
<button class="button is-warning">Warning</button>
<button class="button is-info">Info</button>
<button class="button is-dark">Dark</button>
<button class="button is-light">Light</button>

Outline Variants

Outline variants are useful for secondary actions that still need a visible boundary.

ClassBehavior
is-primary-outlinePrimary bordered button that fills on hover.
is-success-outlineSuccess bordered button that fills on hover.
is-danger-outlineDanger bordered button that fills on hover.
is-warning-outlineWarning bordered button that fills on hover.
is-info-outlineInfo bordered button that fills on hover.
is-dark-outlineDark neutral outline button.
is-light-outlineLight neutral outline button.
<button class="button is-primary-outline">Primary</button>
<button class="button is-success-outline">Success</button>
<button class="button is-danger-outline">Danger</button>
<button class="button is-warning-outline">Warning</button>
<button class="button is-info-outline">Info</button>
<button class="button is-dark-outline">Dark</button>
<button class="button is-light-outline">Light</button>

Ghost Variants

Ghost variants are low-emphasis buttons with transparent backgrounds. They are useful for toolbars, cards, and quiet secondary actions.

ClassPurpose
is-ghostNeutral ghost action.
is-primary-ghostPrimary ghost action.
is-success-ghostSuccess ghost action.
is-danger-ghostDanger ghost action.
is-warning-ghostWarning ghost action.
is-info-ghostInfo ghost action.
<button class="button is-ghost">Ghost</button>
<button class="button is-primary-ghost">Primary</button>
<button class="button is-success-ghost">Success</button>
<button class="button is-danger-ghost">Danger</button>
<button class="button is-warning-ghost">Warning</button>
<button class="button is-info-ghost">Info</button>

Ghost buttons do not apply the active press transform used by regular buttons.


Button Size

Button sizes adjust padding and font size through button tokens. The default button requires no size modifier.

ClassSizeUse case
is-tinyExtra smallDense interfaces and compact actions.
is-smallSmallToolbars, filters, and compact forms.
buttonDefaultGeneral UI actions.
is-largeLargeHero sections and prominent actions.
is-xlargeExtra largeMarketing sections and high-emphasis CTAs.
<button class="button is-primary is-tiny">Tiny</button>
<button class="button is-primary is-small">Small</button>
<button class="button is-primary">Default</button>
<button class="button is-primary is-large">Large</button>
<button class="button is-primary is-xlarge">Extra Large</button>

Icon as Button

Use .is-icon for square icon-only buttons. Icon buttons remove regular text padding and define equal width and height. Always provide an accessible label for icon-only buttons.

Class combinationSize
button is-icon is-tiny1.8rem × 1.8rem
button is-icon is-small2.1rem × 2.1rem
button is-icon2.75rem × 2.75rem
button is-icon is-large3rem × 3rem
button is-icon is-xlarge3.5rem × 3.5rem
<button class="button is-primary is-icon" aria-label="Add item">
  +
</button>

<button class="button is-primary-outline is-icon" aria-label="Search">
  <span aria-hidden="true">⌕</span>
</button>

Buttons With Icon

Icons and SVGs inside .button are displayed as block-level, non-shrinking elements. Use spacing utilities such as .gap-2 when the button contains an icon and text.

<button class="button is-primary gap-2">
  <span aria-hidden="true">↓</span>
  <span>Download</span>
</button>

<button class="button is-primary-outline gap-2">
  <span aria-hidden="true">→</span>
  <span>Continue</span>
</button>

Loading State

Button supports two loading styles. Use .is-loading when the label should be visually replaced by a spinner and .is-loading-inline when the label should stay visible.

ClassBehaviorBest for
is-loadingHides the button text and centers the spinner.Full button loading state.
is-loading-inlineAdds an inline spinner without hiding content.Buttons that should keep their label visible.
<button class="button is-primary is-loading">
  Saving
</button>

<button class="button is-primary is-loading-inline gap-2">
  Saving
</button>

Loading buttons disable pointer interactions.


Disabled State

Buttons can be disabled with the native disabled attribute, aria-disabled="true", or .is-disabled. Use the native disabled attribute whenever the element is a real <button>.

PatternBehavior
disabledNative disabled button behavior.
aria-disabled="true"Accessible disabled state for links or custom elements.
is-disabledVisual disabled class.
fieldset:disabled .buttonButtons inside disabled fieldsets receive disabled styling.
<button class="button is-primary" disabled>
  Disabled
</button>

<a href="#" class="button is-primary-outline is-disabled" aria-disabled="true">
  Disabled link
</a>
Disabled link

Button Group

Use .button-group to visually connect related buttons. Grouped buttons share borders, remove duplicate border seams, and adjust border radius automatically.

ClassPurpose
button-groupCreates a connected horizontal button group.
is-verticalStacks grouped buttons vertically.
is-pillCreates pill-shaped outer edges on a horizontal group.
<div class="button-group">
  <button class="button is-primary-outline">Left</button>
  <button class="button is-primary-outline">Center</button>
  <button class="button is-primary-outline">Right</button>
</div>

<div class="button-group is-vertical">
  <button class="button is-primary-outline">Top</button>
  <button class="button is-primary-outline">Middle</button>
  <button class="button is-primary-outline">Bottom</button>
</div>

<div class="button-group is-pill">
  <button class="button is-primary-outline">Day</button>
  <button class="button is-primary-outline">Week</button>
  <button class="button is-primary-outline">Month</button>
</div>



Common Patterns

Use these combinations for frequent interface layouts.

Primary Action Row

<div class="is-flex gap-2 flex-wrap">
  <button class="button is-primary">Save changes</button>
  <button class="button is-light">Cancel</button>
</div>

Destructive Confirmation

<div class="is-flex gap-2 flex-wrap">
  <button class="button is-danger">Delete</button>
  <button class="button is-danger-outline">Cancel</button>
</div>

Toolbar

<div class="is-flex align-items-center gap-2 flex-wrap">
  <button class="button is-light is-small">Filter</button>
  <button class="button is-light is-small">Sort</button>
  <button class="button is-primary is-small">Create</button>
</div>

Hero Actions

<div class="is-flex gap-2 flex-wrap">
  <a href="/docs" class="button is-primary is-large">Get Started</a>
  <a href="/docs/components" class="button is-primary-outline is-large">Components</a>
</div>

Runtime Behavior

Button is a CSS-only component. No FrontAlign JavaScript helper, runtime scanner, or hook is required.

FeatureRuntime requirement
Solid, outline, and ghost buttonsNo JavaScript required.
Sizes and icon buttonsNo JavaScript required.
Loading and disabled visualsNo JavaScript required; toggle classes from your app logic when needed.
Button groupsNo JavaScript required.

React Usage

Button does not require a React hook. Use regular JSX with FrontAlign classes.

export function ButtonExample() {
  return (
    <div className="is-flex gap-2 flex-wrap">
      <button className="button is-primary">
        Save changes
      </button>

      <button className="button is-primary-outline">
        Cancel
      </button>
    </div>
  );
}

For application-level setup, provider usage, and runtime-powered components, continue with the React Integration guide.


Accessibility

Use the correct element for the action and keep disabled states semantic.

  • Use <button> for actions.
  • Use <a> for navigation.
  • Use disabled for native disabled buttons.
  • Use aria-disabled="true" when disabling links or non-button elements.
  • Provide aria-label for icon-only buttons.
  • Avoid disabled links with active href behavior unless your application also prevents interaction.
<button class="button is-primary">
  Save changes
</button>

<a href="/docs" class="button is-primary-outline">
  Read documentation
</a>

<button class="button is-icon is-primary" aria-label="Search">
  <svg aria-hidden="true"></svg>
</button>
<button className="button is-primary">
  Save changes
</button>

<a href="/docs" className="button is-primary-outline">
  Read documentation
</a>

<button className="button is-icon is-primary" aria-label="Search">
  <svg aria-hidden="true" />
</button>
Read documentation

Class Reference

ClassGroupDescription
buttonBaseBase button structure and interaction styling.
is-primarySolidPrimary brand action.
is-successSolidPositive action.
is-dangerSolidDestructive action.
is-warningSolidCaution action.
is-infoSolidInformational action.
is-darkSolidDark neutral action.
is-lightSolidLight neutral action.
is-primary-outlineOutlinePrimary outline action.
is-success-outlineOutlineSuccess outline action.
is-danger-outlineOutlineDanger outline action.
is-warning-outlineOutlineWarning outline action.
is-info-outlineOutlineInfo outline action.
is-dark-outlineOutlineDark outline action.
is-light-outlineOutlineLight outline action.
is-ghostGhostNeutral low-emphasis action.
is-primary-ghostGhostPrimary low-emphasis action.
is-success-ghostGhostSuccess low-emphasis action.
is-danger-ghostGhostDanger low-emphasis action.
is-warning-ghostGhostWarning low-emphasis action.
is-info-ghostGhostInfo low-emphasis action.
is-tinySizeExtra-small button size.
is-smallSizeSmall button size.
is-largeSizeLarge button size.
is-xlargeSizeExtra-large button size.
is-iconIconSquare icon-only button.
is-loadingStateFull loading spinner state.
is-loading-inlineStateInline loading spinner state.
is-disabledStateVisual disabled state.
button-groupGroupConnected segmented button group.
is-verticalGroupVertical button group modifier.
is-pillGroupPill-shaped horizontal group modifier.

Notes

  • Button is a CSS-only component.
  • No JavaScript runtime is required.
  • No React hook is required.
  • Use semantic elements for accessible behavior.
  • Use .is-loading for full loading state and .is-loading-inline for inline loading state.
  • Use .button-group for connected button controls.

FrontAlign