Button
Buttons allow users to perform an action or to navigate to another page. They have multiple styles for various needs, and are ideal for calling attention to where a user needs to do something in order to move forward in a flow.
| install | yarn add @react-spectrum/button |
|---|---|
| version | 3.0.0-rc.2 |
| usage | import {Button} from '@react-spectrum/button' |
Example#
<Button variant="cta">Test</Button>Content#
Buttons can have a label, and icon, or both. An icon is provided by passing an icon component to the icon prop.
A visible label can be provided by passing children.
import {Text} from '@react-spectrum/typography';
<Button variant="primary">Label only</Button>
<Button variant="primary">
<Bell />
<Text>Icon + Label</Text>
</Button>
<Button variant="primary" aria-label="Icon only">
<Bell />
</Button>Accessibility#
If no visible label is provided (e.g. an icon only button),
an alternative text label must be provided to identify the control for accessibility. This should be added using
the aria-label prop.
Internationalization#
In order to internationalize a button, a localized string should be passed to the children or aria-label prop.
Events#
Buttons support user interactions via mouse, keyboard, and touch. You can handle all of these via the onPress
prop.
The following example uses an onPress handler to update a counter stored in React state.
function Example() {
let [count setCount] = ReactuseState(0);
return (
<Button variant="primary" onPress=() => setCount(c => c + 1)>count Dogs</Button>
);
}Props#
| Name | Type | Default | Description |
icon | ReactElement | — | An icon to display in the button |
variant | 'cta'
| 'overBackground'
| 'primary'
| 'secondary'
| 'negative' | — | The visual style of the button. |
isQuiet | boolean | — | Whether the button should be displayed with a quiet style. |
isDisabled | boolean | — | Whether the button is disabled |
elementType | string | JSXElementConstructor<any> | "button" | The HTML element or React element used to render the button, e.g. "div", "a", or RouterLink. |
children | ReactNode | — | The content to display in the button. |
href | string | — | A URL to link to if elementType="a". |
target | string | — | The target window for the link. |
autoFocus | boolean | — | Whether the element should receive focus on render |
UNSAFE_className | string | — | |
UNSAFE_style | CSSProperties | — |
Events
| Name | Type | Default | Description |
onPress | (e: PressEvent) => void | — | Handler that is called when the press is released over the target. |
onPressStart | (e: PressEvent) => void | — | Handler that is called when a press interaction starts. |
onPressEnd | (e: PressEvent) => void | — | Handler that is called when a press interation ends, either over the target or when the pointer leaves the target. |
onPressChange | (isPressed: boolean) => void | — | Handler that is called when the press state changes. |
onPressUp | (e: PressEvent) => void | — | Handler that is called when a press is released over the target, regardless of whether it started on the target or not. |
onFocus | (e: FocusEvent) => void | — | Handler that is called when the element receives focus. |
onBlur | (e: FocusEvent) => void | — | Handler that is called when the element loses focus. |
onFocusChange | (isFocused: boolean) => void | — | Handler that is called when the element's focus status changes. |
onKeyDown | (e: KeyboardEvent) => void | — | Handler that is called when a key is pressed. |
onKeyUp | (e: KeyboardEvent) => void | — | Handler that is called when a key is released. |
Layout
| Name | Type | Default | Description |
flex | string | number | boolean | — | |
flexGrow | number | — | |
flexShrink | number | — | |
flexBasis | number | string | — | |
alignSelf | 'auto'
| 'normal'
| 'start'
| 'end'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'center'
| 'stretch' | — | |
justifySelf | 'auto'
| 'normal'
| 'start'
| 'end'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'center'
| 'left'
| 'right'
| 'stretch' | — | |
flexOrder | number | — | |
gridArea | string | — | |
gridColumn | string | — | |
gridRow | string | — | |
gridColumnStart | string | — | |
gridColumnEnd | string | — | |
gridRowStart | string | — | |
gridRowEnd | string | — |
Spacing
| Name | Type | Default | Description |
margin | DimensionValue | — | |
marginTop | DimensionValue | — | |
marginLeft | DimensionValue | — | |
marginRight | DimensionValue | — | |
marginBottom | DimensionValue | — | |
marginStart | DimensionValue | — | |
marginEnd | DimensionValue | — | |
marginX | DimensionValue | — | |
marginY | DimensionValue | — |
Sizing
| Name | Type | Default | Description |
width | DimensionValue | — | |
minWidth | DimensionValue | — | |
maxWidth | DimensionValue | — | |
height | DimensionValue | — | |
minHeight | DimensionValue | — | |
maxHeight | DimensionValue | — |
Positioning
| Name | Type | Default | Description |
position | 'static'
| 'relative'
| 'absolute'
| 'fixed'
| 'sticky' | — | |
top | DimensionValue | — | |
bottom | DimensionValue | — | |
left | DimensionValue | — | |
right | DimensionValue | — | |
start | DimensionValue | — | |
end | DimensionValue | — | |
zIndex | number | — | |
isHidden | boolean | — |
Accessibility
| Name | Type | Default | Description |
role | string | — | |
id | string | — | |
tabIndex | number | — | |
aria-label | string | — | Defines a string value that labels the current element. |
aria-labelledby | string | — | Identifies the element (or elements) that labels the current element. |
aria-describedby | string | — | Identifies the element (or elements) that describes the object. |
aria-controls | string | — | Identifies the element (or elements) whose contents or presence are controlled by the current element. |
aria-owns | string | — | Identifies an element (or elements) in order to define a visual, functional, or contextual parent/child relationship between DOM elements where the DOM hierarchy cannot be used to represent the relationship. |
aria-hidden | boolean | 'false' | 'true' | — | Indicates that the element is perceivable but disabled, so it is not editable or otherwise operable. |
Visual Options#
Call To Action#
<Button variant="cta">Test</Button>Primary#
<Button variant="primary">Test</Button>
<Button variant="primary" isQuiet>Test</Button>Secondary#
<Button variant="secondary">Test</Button>
<Button variant="secondary" isQuiet>Test</Button>Over Background#
<div style={backgroundColor: 'rgb(15, 121, 125)' padding: '15px 20px'}>
<Button variant="overBackground">Test</Button>
<Button variant="overBackground" isQuiet>Test</Button>
</div>Negative#
<Button variant="negative">Test</Button>
<Button variant="negative" isQuiet>Test</Button>