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.

installyarn add @react-spectrum/button
version3.0.0-rc.1
usageimport {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.

<Button variant="primary">Label only</Button>
<Button variant="primary" icon={<Bell />}>Icon + Label</Button>
<Button variant="primary" icon={<Bell />} aria-label="Icon only" />

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] = React.useState(0);

  return (
    <Button variant="primary" onPress={() => setCount(c => c + 1)}>{count} Dogs</Button>
  );
}

Props#


NameTypeDefaultDescription
iconReactElementAn icon to display in the button
variant'cta' | 'overBackground' | 'primary' | 'secondary' | 'negative'The [visual style](https://spectrum.adobe.com/page/button/#Options) of the button.
isQuietbooleanWhether the button should be displayed with a quiet style
isDisabledbooleanWhether the button is disabled
elementTypestringJSXElementConstructor<any>"button"The HTML element or React element used to render the button, e.g. "div", "a", or `RouterLink`
childrenReactNodeThe content to display in the button
hrefstringA URL to link to if elementType="a"
targetstringThe target window for the link
UNSAFE_classNamestring
UNSAFE_styleCSSProperties
autoFocusboolean
Events
NameTypeDefaultDescription
onPress(e: ) => voidCalled when the mouse or touch is released
onPressStart(e: ) => void
onPressEnd(e: ) => void
onPressChange(isPressed: boolean) => void
onHover(e: ) => void
onHoverEnd(e: ) => void
onHoverChange(isHovering: boolean) => void
onFocus(e: ) => void
onBlur(e: ) => void
onFocusChange(isFocused: boolean) => void
onKeyDown(e: ) => void
onKeyUp(e: ) => void
Layout
NameTypeDefaultDescription
flexstringnumberboolean
flexGrownumber
flexShrinknumber
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'
flexOrdernumber
gridAreastring
gridColumnstring
gridRowstring
gridColumnStartstring
gridColumnEndstring
gridRowStartstring
gridRowEndstring
slotstring
Spacing
NameTypeDefaultDescription
margin
marginTop
marginLeft
marginRight
marginBottom
marginStart
marginEnd
marginX
marginY
Sizing
NameTypeDefaultDescription
width
minWidth
maxWidth
height
minHeight
maxHeight
Positioning
NameTypeDefaultDescription
position'static' | 'relative' | 'absolute' | 'fixed' | 'sticky'
top
bottom
left
right
start
end
zIndexnumber
isHiddenboolean
Accessibility
NameTypeDefaultDescription
rolestring
idstring
tabIndexnumber
aria-labelstringDefines a string value that labels the current element.
aria-labelledbystringIdentifies the element (or elements) that labels the current element.
aria-describedbystringIdentifies the element (or elements) that describes the object.
aria-controlsstringIdentifies the element (or elements) whose contents or presence are controlled by the current element.
aria-ownsstringIdentifies 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-hiddenboolean'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>