Buttons

Buttons trigger an action, whether that is submitting a form, opening a dialog, or moving a task forward.

Demo

Change the props and copy the result.

Component
size
color
iconLeading
iconTrailing
import { Button } from "@/components/base/buttons/button"; <Button size="xl">Get started</Button>

The family

Reach for the standard Button for almost everything. The rest of the family exists for the jobs it does badly: repeated actions in dense rows, dismissing the surface it sits in, OAuth sign-in, and linking to an app marketplace. Each name links to its variants below.

The components in this family, with their descriptions and import paths
ComponentDescriptionImport from
ButtonThe standard action button; also renders as a link when given href.@/​components/​base/​buttons/​button
ButtonUtilityCompact icon-only button for toolbars and table rows.@/​components/​base/​buttons/​button-utility
CloseButtonDismiss affordance for modals, banners, and overlays.@/​components/​base/​buttons/​close-button
SocialButtonOAuth sign-in buttons with provider logos.@/​components/​base/​buttons/​social-button
GooglePlayButtonGoogle Play store badge, in solid black.@/​components/​base/​buttons/​app-store-buttons
GooglePlayWhiteButtonGoogle Play store badge, solid black with a white keyline.@/​components/​base/​buttons/​app-store-buttons
AppStoreButtonApple App Store badge, in solid black.@/​components/​base/​buttons/​app-store-buttons
GalaxyStoreButtonSamsung Galaxy Store badge, in solid black.@/​components/​base/​buttons/​app-store-buttons
AppGalleryButtonHuawei AppGallery badge, in solid black.@/​components/​base/​buttons/​app-store-buttons

Button

The workhorse: use it wherever an action needs a visible control, in forms, dialogs, toolbars, and empty states. Pick the color for the action’s weight and consequence, the size for the surface’s density, and add an icon only when it speeds recognition. Every size and color combination follows, read from the kit’s exported style object.

Variants by size across the columns and color down the rows
xssmmdlgxl
primary
secondary
tertiary
link-color
link-gray
primary-destructive
secondary-destructive
tertiary-destructive
link-destructive

Hover and focus states are live. Interact with any cell.

With icons

Icon only

Variants by size across the columns and color down the rows
xssmmdlgxl
primary
secondary
tertiary
link-color
link-gray
primary-destructive
secondary-destructive
tertiary-destructive
link-destructive

Hover and focus states are live. Interact with any cell.

An icon-only Button needs an aria-label

Every cell above carries one. The kit adds no accessible name to an icon-only standard Button; details are on the Code tab under Accessibility.

ButtonUtility

For rows of repeated actions where labels would be noise: table rows, card corners, and editor toolbars. It stays quiet at rest so the content wins, and its tooltip doubles as the accessible name. Not for a screen’s main action, which deserves a labeled Button.

Variants by size across the columns and color down the rows
xssm
secondary
tertiary

Hover and focus states are live. Interact with any cell.

CloseButton

One job: dismissing the surface it sits in. Use it in the top corner of modals, drawers, banners, and toasts. The light theme sits on ordinary surfaces; the dark theme paints hardcoded white for photography and dark panels, which is why the lower band renders it on its own dark surface.

xs
sm
md
lg
xs
sm
md
lg

SocialButton

OAuth sign-in on auth screens, and nothing else. Brand follows each provider’s palette and belongs on white. Color keeps the colorful logo on a neutral button, for stacks where competing brand palettes would clash. Gray is monochrome, for interfaces that need the quietest treatment. Each theme shows the labeled form and its icon-only sibling in their own columns.

brandcolorgray
google
facebook
apple
twitter
figma
dribble

Social button groups

brand
color
gray

App store badges

Marketplace links for landing pages and footers, never in-product actions. They render as anchors with fixed artwork at two heights, 40px and 44px. Use the solid set on light surfaces; the outline set inherits the current text color, so it follows the theme.

Variants by size across the columns and badge down the rows
mdlg
Google Play
Google Play, white keyline
App Store
Galaxy Store
AppGallery
Google Play, outline
App Store, outline
Galaxy Store, outline
AppGallery, outline

States

Reach for disabled when the action cannot run yet, and loading while it runs; the two are not interchangeable. Every state below is forced onto a real button: hover and focus re-apply the kit’s own state classes with the variant prefix stripped, so what renders is what the kit ships rather than a repainted approximation.

Variants by state across the columns and color down the rows
resthoverfocus-visibledisabledloading
primary
secondary
tertiary
link-color
link-gray
primary-destructive
secondary-destructive
tertiary-destructive
link-destructive

Hover and focus states are live. Interact with any cell.

There is no pressed treatment

React Aria emits data-pressed while a button is held down, and the kit never styles it. Nothing changes visually between rest and pressed beyond the hover treatment already showing. That is worth knowing before you design a screen that depends on press feedback.