@gravity-ui/uikit
Version:
Gravity UI base styling and components
211 lines (160 loc) • 9.16 kB
Markdown
# Button
Buttons act as a trigger for certain actions. While this is their main purpose, in some very rare cases, they can be used as links to navigate to other pages.
```tsx
import {Button} from '@gravity-ui/uikit';
```
## Appearance
There are four `Button` types in terms of appearance: basic, outlined, flat, and contrast.
The `Button` appearance is determined by the `view` property.
### Basic
`action`: The most distinctive type of `Button`. It is used for the primary action on a screen that requires the most attention.
We recommend using only one such button per page.
`normal`: Default type of `Button` designed for secondary actions or to maintain the importance of an action without drawing too much attention to it.
`raised`: Placed above the content as a floating element, usually with a fixed location.
```tsx
<Button view="action" size="l">Action</Button>
<Button view="normal" size="l">Normal</Button>
<Button view="raised" size="l">Raised</Button>
```
### Outlined
`outlined`: Used for secondary actions that require less attention. It can be used with or without a main button; in the former case, it must be an emphasized one.
`outlined-action`: Usually used as a link to another page or external resource.
This type also has semantic variations that can be used when additional semantics are needed: `outlined-info`, `outlined-success`, `outlined-warning`, and `outlined-danger`.
```tsx
<Button view="outlined" size="l">Outlined</Button>
<Button view="outlined-action" size="l">Outlined Action</Button>
<Button view="outlined-info" size="l">Outlined Info</Button>
<Button view="outlined-success" size="l">Outlined Success</Button>
<Button view="outlined-warning" size="l">Outlined Warning</Button>
<Button view="outlined-danger" size="l">Outlined Danger</Button>
<Button view="outlined-utility" size="l">Outlined Utility</Button>
```
### Flat
`flat`: Used for auxiliary actions that require the least attention. It is often used in a list of buttons or action icons (without text) in an editor.
`flat-secondary`: Less emphasized than the `flat` button. It is often used as a secondary button in dialog boxes and modal windows.
`flat-action`: Usually used as a link to another page or external resource.
It also has semantic variations that can be used where additional semantics are needed: `outlined-info`, `outlined-success`, `outlined-warning`, and `outlined-danger`.
```tsx
<Button view="flat" size="l">Flat</Button>
<Button view="flat-secondary" size="l">Flat Secondary</Button>
<Button view="flat-action" size="l">Flat Action</Button>
<Button view="flat-info" size="l">Flat Info</Button>
<Button view="flat-success" size="l">Flat Success</Button>
<Button view="flat-warning" size="l">Flat Warning</Button>
<Button view="flat-danger" size="l">Flat Danger</Button>
<Button view="flat-utility" size="l">Flat Utility</Button>
```
### Contrast
The `normal-contrast`, `outline-contrast`, and `flat-contrast` buttons highlight actions against complex background, e.g., in a banner, or against an inverse background.
```tsx
<Button view="normal-contrast" size="l">Normal Contrast</Button>
<Button view="outlined-contrast" size="l">Outlined Contrast</Button>
<Button view="flat-contrast" size="l">Flat Contrast</Button>
```
## Icons
To add an icon to a `Button`, use the [`Icon`](./Icon.md) component, which is a special wrapper for SVGs.
```tsx
<Button view="outlined" size="l">
<Icon data={Gear} size={18} />
Start
</Button>
<Button view="outlined" size="l">
End
<Icon data={Gear} size={18} />
</Button>
<Button view="outlined" size="l">
<Icon data={Gear} size={18} />
Both
<Icon data={Gear} size={18} />
</Button>
<Button view="outlined" size="l">
No text:
<Icon data={Gear} size={18} />
</Button>
```
## States
A `Button` can have different states:
`disabled`: When the button is unavailable for some reason.
`loading`: When some asynchronous processes are running in the background.
`selected`: When the user can **Enable** and **Disable** the button.
```tsx
<Button size="l" disabled>Disabled</Button>
<Button size="l" loading>Loading</Button>
<Button size="l" selected>Selected</Button>
```
### Menu trigger
`Button` automatically changes its appearance when corresponding aria-attributes (`aria-haspopup`, `aria-expanded`) are passed:
```tsx
<Button aria-haspopup="menu" aria-expanded="true">
Menu
</Button>
```
## Size
Use the `size` property to manage the `Button` size. The default size is `m`.
```tsx
<Button size="xs">XS Size</Button>
<Button size="s">S Size</Button>
<Button size="m">M Size</Button>
<Button size="l">L Size</Button>
<Button size="xl">XL Size</Button>
```
## Width
Use the `width` property to manage the way the `Button` behaves inside the container:
`auto`: Limits the maximum width of the `Button` by hiding the overflowing content with an ellipsis.
`max`: Matches the `Button` width to the width of the parent container, also hiding the overflowing content with an ellipsis.
## Pin
The `pin` property allows you to manage the shape of the _start_ and _end_ edges and is usually used for combining multiple buttons in a single unit.
The `pin` property value consists of the _start_ and _end_ style names separated by a hyphen, e.g., `round-brick`.
The edge styles are: `round` (default), `circle`, `brick`, and `clear`.
```tsx
<div>
<Button view="action" size="l" pin="round-brick">Create</Button>
<Button view="action" size="l" pin="brick-round">...</Button>
</div>
<div>
<Button view="normal" size="l" pin="circle-clear">Start</Button>
<Button view="normal" size="l" pin="brick-brick" selected>Center</Button>
<Button view="normal" size="l" pin="clear-circle">End</Button>
</div>
<div>
<Button view="outlined" pin="brick-clear">1</Button>
<Button view="outlined" pin="clear-clear">2</Button>
<Button view="outlined" pin="clear-clear">3</Button>
<Button view="outlined" pin="clear-brick">4</Button>
</div>
```
## Properties
`Button` accepts any valid `button` or `a` element props in addition to these:
| Name | Description | Type | Default |
| :-------- | :------------------------------------------------------------------- | :-----------------------------: | :-------------: |
| children | `Button` content. You can use both text and the `<Icon/>` component. | `React.ReactNode` | |
| component | Overrides the root component | `React.ElementType` | |
| disabled | Toggles the `disabled` state | `boolean` | `false` |
| href | Pass this to make the root component a link | `string` | |
| loading | Toggles the `loading` state | `boolean` | `false` |
| pin | Sets the `Button` edge style | `string` | `"round-round"` |
| qa | `data-qa` HTML attribute, used for testing | `string` | |
| selected | Toggles the `selected` state | `boolean` | |
| size | Sets the`Button` size | `"xs"` `"s"` `"m"` `"l"` `"xl"` | `"m"` |
| view | Sets the `Button` appearance | `ButtonView` | `"normal"` |
| width | Controls how `Button` uses parent's space | `"auto"` `"max"` | |
## CSS API
| Name | Description |
| :---------------------------------- | :------------------------ |
| `--g-button-text-color` | Text color |
| `--g-button-text-color-hover` | Text color on hover |
| `--g-button-background-color` | Background color |
| `--g-button-background-color-hover` | Background color on hover |
| `--g-button-border-width` | Border width |
| `--g-button-border-color` | Border color |
| `--g-button-border-style` | Border style |
| `--g-button-focus-outline-width` | Focus outline width |
| `--g-button-focus-outline-color` | Focus outline color |
| `--g-button-focus-outline-style` | Focus outline style |
| `--g-button-focus-outline-offset` | Focus outline offset |
| `--g-button-height` | Height (line height) |
| `--g-button-padding` | Side paddings |
| `--g-button-border-radius` | Border radius |
| `--g-button-font-size` | Text font size |
| `--g-button-icon-space` | Icon available space |
| `--g-button-icon-offset` | Icon offset |