Skip to content

Button

Interactive elements that trigger actions. Aurora ships three button primitives:

  • Button — labelled action with optional icons
  • IconButton — compact, icon-only trigger for toolbars and dense UI
  • LinkButton — text-link styled button for inline navigation and secondary actions

Pick the variant by visual emphasis: primary for the dominant action, secondary for medium-weight alternates, tertiary for low-emphasis options, text for inline minimal-chrome calls.

Use specific verb-noun labels

"Save changes", "Export report", "Add building" beat vague "OK" or "Submit" — the label is the contract with the user about what will happen.

Variants

Choose by emphasis. As a rule, one primary button per view — multiple primaries make the dominant action ambiguous.

VariantUse for
primaryThe single most important action per view — Save, Submit, Export, Add.
secondarySupporting actions that sit alongside a primary (e.g. "Cancel" beside "Save").
tertiaryLow-emphasis actions — neutral confirmations, dismissals.
textInline actions in dense UI (table rows, list items) where chrome would be noise.
html
<Button variant="primary">Save changes</Button>
<Button variant="secondary">Cancel</Button>
<Button variant="tertiary">Skip for now</Button>
<Button variant="text">View details</Button>

Sizes

md is the default for standard contexts. Use sm inside dense UI — table rows, dropdowns, sidebars — where vertical rhythm matters more than tap-target generosity.

html
<Button size="sm">Small</Button>
<Button size="md">Medium</Button>
<Button size="lg">Large</Button>

States

html
<Button>Default</Button>
<Button disabled>Disabled</Button>
<Button loading>Loading</Button>
<Button danger>Danger</Button>

Reserve danger for irreversible actions

The danger state should only mark destructive, irreversible actions that the user is confirming — Delete account, Remove building permanently. Do not use it for routine deletions that can be undone. Always pair a danger button with a confirmation step.

Icons

Icons reinforce the action. Use leading icons for most actions; reserve trailing icons for navigation or expansion (e.g. chevron-right to indicate forward motion, arrow-up-right for external links).

html
<Button leading-icon="check">Confirm</Button>
<Button trailing-icon="chevron-right">Continue</Button>

No emoji, no double icons

Don't put icons on both sides of the label, and never use emoji as substitutes for icons — emoji rendering varies wildly across platforms and breaks the visual system.

Button — Props

PropTypeDefaultDescription
variant'primary' | 'secondary' | 'tertiary' | 'text''primary'Visual style. See variants table above for usage guidance.
size'sm' | 'md' | 'lg''md'Button height and padding.
disabledbooleanfalseDisable interactions and apply disabled styling.
dangerbooleanfalseDestructive styling. Reserve for irreversible actions with a confirmation step.
loadingbooleanfalseShow a spinner and apply loading styling; trailing icon is hidden.
leadingIconIconNameIcon shown before the slot content.
trailingIconIconNameIcon shown after the slot content.

Button — Slots

SlotDescription
defaultButton label content.

IconButton

Compact icon-only trigger. Reach for it in space-constrained surfaces — toolbars, table row actions, dense panels — where a labelled button would crowd the layout. Outside those contexts, prefer a labelled Button so the action is self-evident.

When you do use one, the icon must be unambiguous on its own (or paired with a Tooltip), and the trigger needs an aria-label so screen readers announce the action.

html
<IconButton icon="settings" variant="primary" aria-label="Open settings" />
<IconButton icon="trash" variant="ghost" danger aria-label="Delete row" />

IconButton — Sizes

html
<IconButton icon="settings" size="sm" />
<IconButton icon="settings" size="md" />
<IconButton icon="settings" size="lg" />

IconButton — Props

PropTypeDefaultDescription
iconIconNamerequiredName of the icon to render.
variant'primary' | 'secondary' | 'tertiary' | 'ghost''primary'Visual style.
size'sm' | 'md' | 'lg''md'Button square edge length.
disabledbooleanfalseDisable interactions.
dangerbooleanfalseDestructive styling. Reserve for irreversible actions.
loadingbooleanfalseReplace icon with a spinner.

LinkButton

Looks like a text link, behaves like a button. Use inside paragraphs, table cells, banners, and navigation surfaces where a full Button would feel too heavy.

Use a real <a> for actual navigation

If activating the trigger should change the URL — opening a different page, deep-linking into the app — use an <a> tag, not LinkButton or Button. Buttons are for actions; anchors are for navigation. The two have different semantics for screen readers, the back button, middle-click, and copy-link behaviour.

html
<LinkButton size="sm">Small link</LinkButton>
<LinkButton size="md">Medium link</LinkButton>
<LinkButton size="lg">Large link</LinkButton>
<LinkButton disabled>Disabled link</LinkButton>

LinkButton — Props

PropTypeDefaultDescription
size'sm' | 'md' | 'lg''md'Text size.
disabledbooleanfalseDisable interactions.