Button Buttons indicate actions that users can take, such as adding an item to the cart, submitting a form, and proceeding with an operation.
Overview
Import
Import the component from @faststore/ui
import { Button } from '@faststore/ui'
Import Styles
import '@faststore/ui/src/components/atoms/Button/styles.scss'
Usage
< Button variant = "primary" >Add to Cart</ Button >
Props
Name Type Description Default testId string
ID to find this component in testing tools (e.g.: cypress, testing library, and jest). fs-button
variant "primary" | "secondary" | "tertiary"
Specifies the component color variant. size "small" | "regular"
Specifies the size variant. regular
inverse false | true
Defines the use of inverted colors. disabled false | true
Specifies that this button should be disabled. icon string | number | false | true | ReactElement<any, string | JSXElementConstructor<any>> | ReactFragment | ReactPortal
A React component that will be rendered as an icon. loading false | true
Boolean that represents a loading state. loadingLabel string
Specifies a label for loading state. iconPosition "left" | "right"
Specifies where the icon should be positioned left
Design Tokens
Local token Default value/Global token linked --fs-button-padding
calc(var(--fs-spacing-1) - (var(--fs-button-border-width) * 2)) var(--fs-spacing-3)
--fs-button-height
var(--fs-control-tap-size)
--fs-button-gap
var(--fs-spacing-2)
--fs-button-shadow
var(--fs-shadow)
--fs-button-shadow-hover
var(--fs-button-shadow)
--fs-button-border-radius
var(--fs-border-radius)
--fs-button-border-width
var(--fs-border-width-thick)
--fs-button-border-color
transparent
--fs-button-text-size
var(--fs-text-size-base)
--fs-button-text-weight
var(--fs-text-weight-bold)
--fs-button-transition-function
var(--fs-transition-function)
--fs-button-transition-property
var(--fs-transition-property)
--fs-button-transition-timing
var(--fs-transition-timing)
Nested Elements
Icon
< Button variant = "primary" icon = {< Icon name = "ShoppingCart" />} iconPosition = "left" >
Add to Cart
</ Button >
Local token Default value/Global token linked --fs-button-icon-padding
0 var(--fs-spacing-1)
Hierarchy
Primary
< Button variant = "primary" >Button</ Button >
Local token Default value/Global token linked --fs-button-primary-text-color
var(--fs-color-primary-text)
--fs-button-primary-text-color-hover
var(--fs-button-primary-text-color)
--fs-button-primary-text-color-active
var(--fs-button-primary-text-color)
--fs-button-primary-bkg-color
var(--fs-color-primary-bkg)
--fs-button-primary-bkg-color-hover
var(--fs-color-primary-bkg-hover)
--fs-button-primary-bkg-color-active
var(--fs-color-primary-bkg-active)
--fs-button-primary-border-color
transparent
--fs-button-primary-border-color-hover
var(--fs-button-primary-border-color)
--fs-button-primary-border-color-active
var(--fs-button-primary-border-color)
--fs-button-primary-shadow-hover
var(--fs-button-shadow-hover)
Primary Inverse
< Button inverse variant = "primary" >
Button
</ Button >
Local token Default value/Global token linked --fs-button-primary-inverse-text-color
var(--fs-button-primary-bkg-color)
--fs-button-primary-inverse-text-color-hover
var(--fs-button-primary-bkg-color)
--fs-button-primary-inverse-text-color-active
var(--fs-button-primary-bkg-color)
--fs-button-primary-inverse-bkg-color
var(--fs-button-primary-text-color)
--fs-button-primary-inverse-bkg-color-hover
var(--fs-color-primary-bkg-light)
--fs-button-primary-inverse-bkg-color-active
var(--fs-color-primary-bkg-light-active)
--fs-button-primary-inverse-border-color
var(--fs-button-primary-border-color)
--fs-button-primary-inverse-border-color-hover
var(--fs-button-primary-border-color)
--fs-button-primary-inverse-border-color-active
var(--fs-button-primary-border-color)
--fs-button-primary-inverse-shadow-hover
var(--fs-button-shadow-hover)
Secondary
< Button variant = "secondary" >Button</ Button >
Local token Default value/Global token linked --fs-button-secondary-text-color
var(--fs-color-secondary-text)
--fs-button-secondary-text-color-hover
var(--fs-color-text-inverse)
--fs-button-secondary-text-color-active
var(--fs-button-secondary-text-color-hover)
--fs-button-secondary-bkg-color
var(--fs-color-secondary-bkg)
--fs-button-secondary-bkg-color-hover
var(--fs-color-secondary-bkg-hover)
--fs-button-secondary-bkg-color-active
var(--fs-color-secondary-bkg-active)
--fs-button-secondary-border-color
var(--fs-button-secondary-text-color)
--fs-button-secondary-border-color-hover
var(--fs-button-secondary-bkg-color-hover)
--fs-button-secondary-border-color-active
var(--fs-button-secondary-bkg-color-active)
--fs-button-secondary-shadow-hover
var(--fs-button-shadow-hover)
Secondary Inverse
< Button inverse variant = "secondary" >
Button
</ Button >
Local token Default value/Global token linked --fs-button-secondary-inverse-text-color
var(--fs-button-secondary-text-color-hover)
--fs-button-secondary-inverse-text-color-hover
var(--fs-button-secondary-text-color)
--fs-button-secondary-inverse-text-color-active
var(--fs-button-secondary-inverse-text-color-hover)
--fs-button-secondary-inverse-bkg-color
var(--fs-button-secondary-bkg-color)
--fs-button-secondary-inverse-bkg-color-hover
var(--fs-button-secondary-text-color-hover)
--fs-button-secondary-inverse-bkg-color-active
var(--fs-color-secondary-bkg-light)
--fs-button-secondary-inverse-border-color
var(--fs-button-secondary-inverse-text-color)
--fs-button-secondary-inverse-border-color-hover
var(--fs-button-secondary-inverse-bkg-color-hover)
--fs-button-secondary-inverse-border-color-active
var(--fs-button-secondary-inverse-bkg-color-hover)
--fs-button-secondary-inverse-shadow-hover
var(--fs-button-shadow-hover)
Tertiary
< Button variant = "tertiary" >Button</ Button >
Local token Default value/Global token linked --fs-button-tertiary-text-color
var(--fs-color-tertiary-text)
--fs-button-tertiary-text-color-hover
var(--fs-button-tertiary-text-color)
--fs-button-tertiary-text-color-active
var(--fs-button-primary-bkg-color)
--fs-button-tertiary-bkg-color
var(--fs-color-tertiary-bkg)
--fs-button-tertiary-bkg-color-hover
var(--fs-color-tertiary-bkg-hover)
--fs-button-tertiary-bkg-color-active
var(--fs-color-tertiary-bkg-active)
--fs-button-tertiary-border-color
transparent
--fs-button-tertiary-border-color-hover
var(--fs-button-tertiary-border-color)
--fs-button-tertiary-border-color-active
var(--fs-button-tertiary-border-color)
--fs-button-tertiary-shadow-hover
var(--fs-button-shadow-hover)
Tertiary Inverse
< Button inverse variant = "tertiary" >
Button
</ Button >
Local token Default value/Global token linked --fs-button-tertiary-inverse-text-color
var(--fs-button-secondary-text-color-hover)
--fs-button-tertiary-inverse-text-color-hover
var(--fs-button-secondary-text-color-hover)
--fs-button-tertiary-inverse-text-color-active
var(--fs-button-secondary-text-color-hover)
--fs-button-tertiary-inverse-bkg-color
var(--fs-button-secondary-inverse-bkg-color)
--fs-button-tertiary-inverse-bkg-color-hover
var(--fs-button-primary-bkg-color-hover)
--fs-button-tertiary-inverse-bkg-color-active
var(--fs-button-primary-bkg-color-active)
--fs-button-tertiary-inverse-border-color
var(--fs-button-tertiary-border-color)
--fs-button-tertiary-inverse-border-color-hover
var(--fs-button-tertiary-border-color)
--fs-button-tertiary-inverse-border-color-active
var(--fs-button-tertiary-border-color)
--fs-button-tertiary-inverse-shadow-hover
var(--fs-button-shadow-hover)
Variants
Disabled
< Button variant = "primary" disabled >
Button
</ Button >
Local token Default value/Global token linked --fs-button-disabled-bkg-color
var(--fs-color-disabled-bkg)
--fs-button-disabled-text-color
var(--fs-color-disabled-text)
Loading
Local token Default value/Global token linked --fs-button-loading-label-column-gap
var(--fs-spacing-3)
Small
< Button variant = "primary" size = "small" >
Button
</ Button >
< Button variant = "primary" size = "small" icon = {< Icon name = "ShoppingCart" />}>
Button
</ Button >
Local token Default value/Global token linked --fs-button-small-padding
var(--fs-spacing-0) var(--fs-spacing-1)
--fs-button-small-min-height
var(--fs-spacing-5)
--fs-button-small-gap
var(--fs-spacing-1)
--fs-button-small-icon-width
var(--fs-spacing-3)
--fs-button-small-icon-height
var(--fs-button-small-icon-width)
Use Cases
Use the Button
component to communicate user actions on the following components:
Buy-now and add-to-cart buttons on Product Cards
Call-to-action buttons on Cards
Submit and/or withdraw actions on Forms
Submit and/or withdraw actions on Modal windows.
Customization
For further customization, you can use the following data attributes:
data-fs-button
data-fs-button-variant="primary | secondary | tertiary"
data-fs-button-inverse
data-fs-button-size="small | regular"
data-fs-button-loading="true"
Best Practices
✅ Do's
Use standard button designs and shapes to make your button look clickable .
Use styles to communicate the importance of an action by visually differentiating Primary and Secondary buttons.
Make buttons finger-friendly for mobile users and large enough for reliable interactions . Generally, touch targets are at least 44 by 44 CSS pixels.
Use task-specific words to write button labels.
Place the buttons in an order that reflects a conversation between the user and the system .
Provide visual or audio feedback on interactions . Whenever a user interacts with a button, the button should change its state and let the user know that something is happening as a consequence.
Define a style system for your button states (i.e., normal, focus, hover, active, pressed, disabled).
Use icon-only buttons only for widespread actions with highly standardized icons, such as a cross for close.
Use the aria-label
attribute to provide a textual alternative for icon-only buttons.
❌ Don'ts
Don’t make users hunt for buttons. Place buttons where users expect to see them or can easily find them.
Don't rely on icons to communicate complex actions.
Don't use generic words that can potentially confuse users.
Avoid cluttering the UI with too many buttons.
Avoid having more than one Primary action button on the screen at a time.
Avoid using disabled buttons, if possible. Instead, give preference to hiding the unavailable option.
Don't place buttons next to Badges . Although badges and buttons are similar in appearance, badges are not interactive and may confuse users if not used in the proper context.
Don't use Buttons as Links . Links are not intended to invite users to take action. Instead, they redirect users somewhere.
Avoid using aria-label
when the button already has a label.
Related components
Icon Button A button which content is only an icon, without any label.
See more
Buy Button A button with the intent of directly sending the user to the checkout/cart step.
See more
Link Button Is similar to a button, however acts as a link to navigate users between pages.
See more