TrademarkTrademark
Docs
Ctrl k
Search docs...
Components

Button

Updated: October 18, 2026
View on GitHub
Soon
Not released yet. This is on main and is not in any published version yet. It will not install today.

Button renders a React Native Pressable with a label, optional icons and the same variants and sizes as the web. Handle taps with onPress. See the web Button page for how each variant is meant to be used.

Variants

primary is the default. danger, success and warning are solid like primary. secondary, tertiary, quaternary, subtle, ghost and link are quieter.

Sizes and width

size takes xs, s, m, l and xl, from 24 to 56 points tall. m is the default. A button is as wide as its label; fillWidth stretches it to its parent, and horizontal aligns the content inside it.

Small sizes still take taps from a 44 point area around them, without being drawn larger.

Icons

prefixIcon and suffixIcon take a built-in icon name, as on the web, or any element. The icon takes the label's colour.

States

loading swaps the prefix icon for a spinner and blocks presses. disabled greys the button out and blocks presses. Both are reported to screen readers.

Differences from the web

  • onPress. Button takes React Native's Pressable props, so taps go to onPress. There is no onClick.
  • No href. A button does not render a link. Navigate in onPress, for example with your router.
  • Pressed, not hover. Each variant shows its pressed colours while the finger is down.
  • No arrowIcon. Use suffixIcon="arrowRight" for an arrow.

Props

Button also takes every React Native Pressable prop except children and style, which it replaces.

Prop
Type
Default
Description
labelstringThe button's text.
childrenReactNodeUsed as the label when label is not set.
variant"primary" | "secondary" | "tertiary" | "quaternary" | "subtle" | "danger" | "success" | "warning" | "ghost" | "link""primary"Visual style.
size"xs" | "s" | "m" | "l" | "xl""m"Height and padding.
weight"default" | "strong""strong"Label weight.
roundedbooleanFully rounded corners.
prefixIconIconName | ReactNodeIcon before the label.
suffixIconIconName | ReactNodeIcon after the label.
loadingbooleanfalseShows a spinner and blocks presses.
disabledbooleanfalseGreys the button out and blocks presses.
fillWidthbooleanfalseStretches to the parent's width.
horizontal"start" | "center" | "end" | "between""center"Content alignment inside the button.
onPress(event) => voidCalled on tap.
styleViewStyleApplied after the button's own style.
Edit this page on GitHub
TrademarkTrademark
Built with curiosity by Lorant One and the Design Engineers Club