@vtex/styleguide
Version:
> VTEX Styleguide React components ([Docs](https://vtex.github.io/styleguide))
276 lines (259 loc) • 7.73 kB
Markdown
#### Buttons are independent interactive elements used to trigger actions or to perform navigation.
### Choosing a variation
Our Styleguide defines 3 main variations based on the button visual prominence. As with any UI element, the prominence should be proportional to the importance of that element.
- Do mix variations as needed.
- Avoid having more than one Primary button, save this kind for the most important or most recommended action in a given screen.
- Use the Danger variation for destructive actions that delete data or lead to a state that is hard to recover. Danger buttons should _always_ have a confirmation dialog.
- In doubt, use Secondary buttons.
- Since reading speed can be slowed down by up to 20% when reading all caps (Breland & Breland - 1944), beware of "phrase long" button texts. Keep it short, and make your point in 3 words or less.
Types
```js
<div className="flex justify-center">
<div className="flex flex-column items-center w-100">
<span className="mb4">
<Button variation="primary">Primary</Button>
</span>
<span className="mb4">
<Button variation="secondary">Secondary</Button>
</span>
<span className="mb4">
<Button variation="tertiary">Tertiary</Button>
</span>
<span className="mb4">
<Button variation="danger">Danger</Button>
</span>
<span className="mb4">
<Button variation="danger-tertiary">Danger Tertiary</Button>
</span>
<span className="bg-base--inverted w-100 pa4 flex justify-center">
<span className="mb4">
<Button variation="inverted-tertiary">Inverted Tertiary</Button>
</span>
</span>
</div>
<div className="flex flex-column items-center w-100">
<span className="mb4">
<Button variation="primary" disabled>Primary</Button>
</span>
<span className="mb4">
<Button variation="secondary" disabled>Secondary</Button>
</span>
<span className="mb4">
<Button variation="tertiary" disabled>Tertiary</Button>
</span>
<span className="mb4">
<Button variation="danger" disabled>Danger</Button>
</span>
<span className="mb4">
<Button variation="danger-tertiary" disabled>Danger Tertiary</Button>
</span>
<span className="bg-base--inverted w-100 pa4 flex justify-center">
<span className="mb4">
<Button variation="inverted-tertiary" disabled>Inverted Tertiary</Button>
</span>
</span>
</div>
</div>
```
Sizes
```js
<div>
<div className="mb4">
<span className="mr4">
<Button variation="primary" size="small">
Small
</Button>
</span>
<span className="mr4">
<Button variation="primary">
Regular
</Button>
</span>
<span className="mr4">
<Button variation="primary" size="large">
Large
</Button>
</span>
</div>
<div className="mb4">
<span className="mr4">
<Button variation="secondary" size="small">
Small
</Button>
</span>
<span className="mr4">
<Button variation="secondary" size="regular">
Regular
</Button>
</span>
<span className="mr4">
<Button variation="secondary" size="large">
Large
</Button>
</span>
</div>
<div className="mb4">
<span className="mr4">
<Button variation="tertiary" size="small">
Small
</Button>
</span>
<span className="mr4">
<Button variation="tertiary" size="regular">
Regular
</Button>
</span>
<span className="mr4">
<Button variation="tertiary" size="large">
Large
</Button>
</span>
</div>
<div className="mb4">
<span className="mr4">
<Button variation="danger" size="small">
Small
</Button>
</span>
<span className="mr4">
<Button variation="danger" size="regular">
Regular
</Button>
</span>
<span className="mr4">
<Button variation="danger" size="large">
Large
</Button>
</span>
</div>
<div className="mb4">
<span className="mr4">
<Button variation="danger-tertiary" size="small">
Small
</Button>
</span>
<span className="mr4">
<Button variation="danger-tertiary" size="regular">
Regular
</Button>
</span>
<span className="mr4">
<Button variation="danger-tertiary" size="large">
Large
</Button>
</span>
</div>
</div>
```
Box types
```js
<div>
<div className="mb4">
<Button variation="primary">Default</Button>
</div>
<div className="mb4">
<Button variation="primary" block>
Block
</Button>
</div>
</div>
```
Link mode
```js
<div className="mb4">
<Button variation="primary" href="http://vtex.com" target="_blank">Sign in</Button>
</div>
```
Cancelling out button paddings. Useful for visually aligning tertiary buttons
```js
const Box = require('../Box').default
;<>
<div className="flex justify-center">
<div className="flex flex-column w-60">
<div className="t-heading-6 mb4">Use collapse props when tertiary button is alone, to align it with the other elements</div>
<div className="w-100 mb4">
<Box />
</div>
<div className="mb4 flex justify-between">
<Button variation="tertiary" collapseLeft>Collapse left</Button>
<Button variation="tertiary" collapseRight>Collapse right</Button>
</div>
</div>
</div>
<div className="flex justify-center mt6">
<div className="flex flex-column w-60">
<div className="t-heading-6 mb4">Don't collapse when the button is not alone</div>
<div className="w-100 mb4">
<Box />
</div>
<div className="mb4 flex">
<Button variation="tertiary">Default</Button>
<div className="ml2">
<Button variation="secondary">Another Button</Button>
</div>
</div>
</div>
</div>
<div className="flex justify-center mt6">
<div className="flex flex-column w-60">
<div className="t-heading-6 mb4">Collapse props don't work on primary and secondary variations (and it shouldn't)</div>
<div className="w-100 mb4">
<Box />
</div>
<div className="mb4 flex justify-between">
<Button variation="primary" collapseLeft>Collapse left</Button>
<Button variation="primary" collapseRight>Collapse right</Button>
</div>
<div className="w-100 mb4">
<Box />
</div>
<div className="mb4 flex justify-between">
<Button variation="secondary" collapseLeft>Collapse left</Button>
<Button variation="secondary" collapseRight>Collapse right</Button>
</div>
</div>
</div>
</>;
```
Colored container background
```js
<div className="bg-warning--faded pa5">
<div>
<span className="mr4">
<Button variation="primary">Primary</Button>
</span>
<span className="mr4">
<Button variation="secondary">Secondary</Button>
</span>
<span className="mr4">
<Button variation="tertiary">Neutral</Button>
</span>
</div>
<div className="mt4">
<span className="mr4">
<Button variation="primary" disabled>Primary</Button>
</span>
<span className="mr4">
<Button variation="secondary" disabled>Secondary</Button>
</span>
<span className="mr4">
<Button variation="tertiary" disabled>Neutral</Button>
</span>
</div>
</div>
```
Loading state
```js
initialState = { isLoading1: true, isLoading2: true, isLoading3: true };
<div>
<div className="mt4">
<Button
variation="primary"
onClick={() => setState({ isLoading2: !state.isLoading2 })}
isLoading={state.isLoading2}
>
Toggle loading state
</Button>
</div>
</div>
```