import { Button } from '@uhg-abyss/mobile';<Button>Click Here!</Button>Button Types and Variants
Button provides distinct visual styles through separate type and variant props:
- Use the
typeprop to specify the button style category:filled,outline, ortext. - Use the
variantprop to indicate purpose:brand(primary actions),neutral(secondary actions),destructive(dangerous actions), orinverse(on dark backgrounds).
By default, brand variant and filled type are enabled.
Size
Use the size prop to change the size of the button. The size prop can take in either large or small. The default value is large. To better visualize the difference, the Layout is preventing the large from taking up the full screen.
Icon Position
The iconPosition prop controls where icons appear in your button. There are three options:
trailing(default): Places the icon after the button textleading: Places the icon before the button texticonOnly: Creates a small circular button with only the icon and no text
Icon-Only Buttons
iconPosition="iconOnly" creates button with no text.
Icons
Button provides icon support through the icon prop. You can display icons in different ways:
Using an Icon Object: Provide an icon object with properties:
name: The icon name (from IconSymbol)variant: icon style ('filled' or 'outlined')
Using a String Name: Provide the icon name as a valid IconSymbol name string.
Using a React Node: For advanced use cases, you can provide a custom Icon component.
Using a Function: Use a function that returns a React node, which receives the button's pressed state and allows Button to set the color according to Abyss color mappings, or override them.
Loading
When isLoading is set to true, a spinner indicates that an action is in progress, and onPress events are disabled.
Disabled
Use the isDisabled prop to render the button in a non-interactive state. A disabled button cannot be in a loading state.
Button Props
| Prop Name | Type | Default | Description |
|---|---|---|---|
| children | node | - | The contents of the button component |
| icon | { name: string, variant?: string } | React.ReactNode | string | Function | - | Configuration for an icon to display in the button |
| iconPosition | 'leading' | 'trailing' | 'iconOnly' | false | When true, displays only the icon in a circular button |
| isDisabled | boolean | false | Flag to disable the button |
| isLoading | boolean | false | Flag to show loading spinner within the button |
| onPress | function | - | Callback fired when the button is pressed |
| size | 'large' | 'small' | large | Set the size of the button |
| submit | boolean | false | Flag to indicate the button is a form submit button |
| type | 'filled' | 'outline' | 'text' | filled | The style category of the button |
| variant | 'brand' | 'neutral' | 'destructive' | 'inverse' | brand | The color scheme of the button |
Button Classes
| Class Name | Description |
|---|---|
| abyss-button-icon | Button icon element |
| abyss-button-label | Button label element |
| abyss-button-loading-spinner | Button spinner element |
| abyss-button-root | Button root element |
Button Tokens
| Token Name | Value | |
|---|---|---|
| button.color.surface.container.filled-brand.rest | #002677 | |
| button.color.surface.container.filled-brand.active | #00184D | |
| button.color.surface.container.filled-neutral.rest | #323334 | |
| button.color.surface.container.filled-neutral.active | #000000 | |
| button.color.surface.container.filled-destructive.rest | #990000 | |
| button.color.surface.container.filled-destructive.active | #890000 | |
| button.color.surface.container.filled-inverse.rest | #FFFFFF | |
| button.color.surface.container.filled-inverse.active | #F3F3F3 | |
| button.color.surface.container.filled-disabled | #CBCCCD | |
| button.color.surface.container.outline-brand.rest | #FFFFFF | |
| button.color.surface.container.outline-brand.active | #EDF3FB | |
| button.color.surface.container.outline-neutral.rest | #FFFFFF | |
| button.color.surface.container.outline-neutral.active | #F3F3F3 | |
| button.color.surface.container.outline-destructive.rest | #FFFFFF | |
| button.color.surface.container.outline-destructive.active | #FCF0F0 | |
| button.color.surface.container.outline-disabled | #F3F3F3 | |
| button.color.surface.container.text-brand.active | rgba(255, 255, 255, 0) | |
| button.color.surface.loading-spinner.filled-brand | #FFFFFF | |
| button.color.surface.loading-spinner.outline-brand | #002677 | |
| button.color.surface.loading-spinner.text-brand | #196ECF | |
| button.color.surface.loading-spinner.filled-neutral | #FFFFFF | |
| button.color.surface.loading-spinner.outline-neutral | #4B4D4F | |
| button.color.surface.loading-spinner.text-neutral | #4B4D4F | |
| button.color.surface.loading-spinner.filled-destructive | #FFFFFF | |
| button.color.surface.loading-spinner.outline-destructive | #990000 | |
| button.color.surface.loading-spinner.text-destructive | #990000 | |
| button.color.surface.loading-spinner.outline-inverse | #FFFFFF | |
| button.color.surface.loading-spinner.filled-inverse | #323334 | |
| button.color.surface.loading-spinner.text-inverse | #FFFFFF | |
| button.color.text.label.filled-brand | #FFFFFF | |
| button.color.text.label.filled-destructive | #FFFFFF | |
| button.color.text.label.filled-neutral | #FFFFFF | |
| button.color.text.label.filled-inverse | #323334 | |
| button.color.text.label.filled-disabled | #4B4D4F | |
| button.color.text.label.outline-brand | #002677 | |
| button.color.text.label.outline-neutral.rest | #323334 | |
| button.color.text.label.outline-neutral.active | #000000 | |
| button.color.text.label.outline-destructive | #990000 | |
| button.color.text.label.outline-inverse.rest | #FFFFFF | |
| button.color.text.label.outline-inverse.active | #A5DFE7 | |
| button.color.text.label.outline-disabled | #929496 | |
| button.color.text.label.text-brand.rest | #0C55B8 | |
| button.color.text.label.text-brand.active | #003A8D | |
| button.color.text.label.text-neutral.rest | #323334 | |
| button.color.text.label.text-neutral.active | #000000 | |
| button.color.text.label.text-inverse.rest | #FFFFFF | |
| button.color.text.label.text-inverse.active | #A5DFE7 | |
| button.color.text.label.text-destructive.rest | #990000 | |
| button.color.text.label.text-destructive.active | #890000 | |
| button.color.text.label.text-disabled | #929496 | |
| button.color.icon.filled-brand | #FFFFFF | |
| button.color.icon.filled-neutral | #FFFFFF | |
| button.color.icon.filled-destructive | #FFFFFF | |
| button.color.icon.filled-inverse | #4B4D4F | |
| button.color.icon.filled-disabled | #4B4D4F | |
| button.color.icon.outline-brand | #002677 | |
| button.color.icon.outline-neutral | #323334 | |
| button.color.icon.outline-destructive | #990000 | |
| button.color.icon.outline-inverse.rest | #FFFFFF | |
| button.color.icon.outline-inverse.active | #A5DFE7 | |
| button.color.icon.outline-disabled | #929496 | |
| button.color.icon.text-brand.rest | #196ECF | |
| button.color.icon.text-brand.active | #004BA0 | |
| button.color.icon.text-neutral.rest | #323334 | |
| button.color.icon.text-neutral.active | #000000 | |
| button.color.icon.text-inverse.rest | #FFFFFF | |
| button.color.icon.text-inverse.active | #A5DFE7 | |
| button.color.icon.text-destructive.rest | #990000 | |
| button.color.icon.text-destructive.active | #890000 | |
| button.color.icon.text-disabled | #929496 | |
| button.color.border.container.outline-brand | #002677 | |
| button.color.border.container.outline-neutral | #323334 | |
| button.color.border.container.outline-destructive | #990000 | |
| button.color.border.container.outline-inverse.rest | #FFFFFF | |
| button.color.border.container.outline-inverse.active | #A5DFE7 | |
| button.color.border.container.outline-disabled | #929496 | |
| button.border-radius.all.container.with-text | 500 | |
| button.border-radius.all.container.icon-only | 4 | |
| button.border-width.all.container | 1 | |
| button.sizing.all.icon.with-text | 16 | |
| button.sizing.all.icon.icon-only | 24 | |
| button.sizing.all.min.container.icon-only | 40 | |
| button.sizing.height.min.container.lg | 48 | |
| button.sizing.height.min.container.sm | 32 | |
| button.spacing.padding.vertical.container.sm | 4 | |
| button.spacing.padding.vertical.container.lg | 12 | |
| button.spacing.padding.horizontal.container.sm | 16 | |
| button.spacing.padding.horizontal.container.lg | 24 | |
| button.spacing.padding.all.container.icon-only | 8 | |
| button.spacing.gap.horizontal.container | 8 |
Variant Mappings
This section explains how Button props map from V1 to V2 and shows concrete examples to make migration easier.
The variant props were renamed.
primary->brand(Brand is the default)secondary->neutraltertiary-> Use the prop:type="text"The color is determined by thevariantdestructive->destructiveandtype="outline"alt->inverse
Example:
// v1<Button variant="primary">Click Here!</Button>
// v2<Button variant="brand">Click Here!</Button>Type vs Variant in V2
In v2 the type prop controls the visual category (filled | outline | text) while variant controls purpose/semantic color (brand | neutral | destructive | inverse). If you previously relied on variant to imply filled vs outline, add an explicit type prop in V2.
If you used type in the v1 Button to submit a form, in v2 you can use the new submit boolean prop.
Example:
// v1 intent: a secondary/outline button with the primary color (legacy)<Button variant="secondary">Secondary</Button>
// v2: an outlined button with the brand color (brand prop optional here due to default)<Button type="outline" variant="brand">Secondary</Button>
// v1 intent: a button that submits a form<Button type="submit">Submit</Button>
// v2: a button that submits a form<Button submit>Submit</Button>Removed props and recommended replacements
before/after-> useicon+iconPosition(leading/trailing)rounded-> useiconPosition="iconOnly"andiconobject
There are multiple ways to add icons in the new button, see main doc page.
Examples:
// v1<Button before={<IconSymbol icon="home" />}>Home</Button>
// v2<Button icon={{ name: 'home' }} iconPosition="leading">Home</Button>
// v1<Button rounded before={<IconSymbol icon="add" />} />
// v2<Button icon={{ name: 'add' }} iconPosition="iconOnly" accessibilityLabel="Add" />Button Classes
| V2 | V1 | Status |
|---|---|---|
| button-icon | - | Added |
| button-label | button-label | Unchanged |
| button-loading-spinner | - | Added |
| button-root | button-root | Unchanged |
Button Props
| V2 | V1 | Status |
|---|---|---|
| children | children | Unchanged |
| icon | before | Renamed |
| icon | after | Renamed |
| iconPosition | - | Added |
| isDisabled | isDisabled | Unchanged |
| isLoading | - | Added |
| onPress | onPress | Unchanged |
| - | rounded | Removed |
| size | size | Modified |
| submit | - | Added |
| type | type | Modified |
| variant | variant | Modified |
Button Tokens
| V2 | V1 | Status |
|---|---|---|
| button.border-radius.all.container.icon-only | - | Unchanged |
| button.border-radius.all.container.with-text | - | Unchanged |
| button.border-width.all.container | - | Unchanged |
| - | button.color.border.container.alt.active | Removed |
| - | button.color.border.container.alt.rest | Removed |
| - | button.color.border.container.destructive | Removed |
| button.color.border.container.outline-brand | - | Added |
| button.color.border.container.outline-destructive | - | Added |
| button.color.border.container.outline-disabled | - | Added |
| button.color.border.container.outline-inverse | - | Added |
| button.color.border.container.outline-neutral | - | Added |
| - | button.color.border.container.secondary | Removed |
| - | button.color.icon.alt.active | Removed |
| - | button.color.icon.alt.rest | Removed |
| button.color.icon.filled-brand | - | Added |
| button.color.icon.filled-destructive | - | Added |
| button.color.icon.filled-disabled | - | Added |
| button.color.icon.filled-inverse | - | Added |
| button.color.icon.filled-neutral | - | Added |
| - | button.color.icon.interactive.disabled.primary | Removed |
| button.color.icon.outline-brand | - | Added |
| button.color.icon.outline-destructive | - | Added |
| button.color.icon.outline-disabled | - | Added |
| button.color.icon.outline-inverse | - | Added |
| button.color.icon.outline-neutral | - | Added |
| - | button.color.icon.status.error | Removed |
| - | button.color.icon.tertiary.active | Removed |
| - | button.color.icon.tertiary.rest | Removed |
| button.color.icon.text-brand | - | Added |
| button.color.icon.text-destructive | - | Added |
| button.color.icon.text-disabled | - | Added |
| button.color.icon.text-inverse | - | Added |
| button.color.icon.text-neutral | - | Added |
| - | button.color.surface.container.destructive | Removed |
| - | button.color.surface.container.disabled | Removed |
| button.color.surface.container.filled-brand | - | Added |
| button.color.surface.container.filled-destructive | - | Added |
| button.color.surface.container.filled-disabled | - | Added |
| button.color.surface.container.filled-inverse | - | Added |
| button.color.surface.container.filled-neutral | - | Added |
| button.color.surface.container.loading-spinner.filled-inverse | - | Added |
| button.color.surface.container.loading-spinner.outline-destructive | - | Added |
| button.color.surface.container.loading-spinner.outline-neutral | - | Added |
| button.color.surface.container.loading-spinner.text-brand | - | Added |
| button.color.surface.container.loading-spinner.text-destructive | - | Added |
| button.color.surface.container.loading-spinner.text-neutral | - | Added |
| button.color.surface.container.outline-brand | - | Added |
| button.color.surface.container.outline-destructive | - | Added |
| button.color.surface.container.outline-disabled | - | Added |
| button.color.surface.container.outline-neutral | - | Added |
| - | button.color.surface.container.primary-icon-only | Removed |
| - | button.color.surface.container.secondary | Removed |
| - | button.color.text.label.alt.active | Removed |
| - | button.color.text.label.alt.rest | Removed |
| button.color.text.label.filled-brand | - | Added |
| button.color.text.label.filled-destructive | - | Added |
| button.color.text.label.filled-disabled | - | Added |
| button.color.text.label.filled-inverse | - | Added |
| button.color.text.label.filled-neutral | - | Added |
| button.color.text.label.outline-brand | - | Added |
| button.color.text.label.outline-destructive | - | Added |
| button.color.text.label.outline-disabled | - | Added |
| button.color.text.label.outline-inverse | - | Added |
| button.color.text.label.outline-neutral | - | Added |
| - | button.color.text.label.tertiary.active | Removed |
| - | button.color.text.label.tertiary.rest | Removed |
| button.color.text.label.text-brand | - | Added |
| button.color.text.label.text-destructive | - | Added |
| button.color.text.label.text-disabled | - | Added |
| button.color.text.label.text-inverse | - | Added |
| button.color.text.label.text-neutral | - | Added |
| button.sizing.all.icon.icon-only | - | Unchanged |
| button.sizing.all.icon.with-text | - | Unchanged |
| button.sizing.all.min.container.icon-only | - | Unchanged |
| button.sizing.height.min.container.lg | - | Unchanged |
| button.sizing.height.min.container.sm | - | Unchanged |
| button.spacing.gap.horizontal.container | - | Unchanged |
| button.spacing.padding.all.container.icon-only | - | Unchanged |
| button.spacing.padding.horizontal.container.lg | - | Unchanged |
| button.spacing.padding.horizontal.container.sm | - | Unchanged |
| button.spacing.padding.vertical.container.lg | - | Unchanged |
| button.spacing.padding.vertical.container.sm | - | Unchanged |