import { Story, Canvas, ArgsTable } from '@storybook/addon-docs';

import { Icon } from './icon';

# Icon

The `Icon` component in conjunction with `ICON_NAMES` can be used for all icons in the extension

<Canvas>
  <Story id="components-componentlibrary-icon--default-story" />
</Canvas>

## Props

The `Icon` accepts all props below as well as all [Box](/docs/components-ui-box--default-story#props) component props

<ArgsTable of={Icon} />

### Name

Use the `name` prop and the `ICON_NAMES` object to change the icon.

Use the [IconSearch](/story/components-componentlibrary-icon--default-story) story to find the icon you want to use.

<Canvas>
  <Story id="components-componentlibrary-icon--name" />
</Canvas>

```jsx
import { Icon, ICON_NAMES } from '../../components/component-library';

<Icon name={ICON_NAMES.ADD_SQUARE} />
<Icon name={ICON_NAMES.BANK} />
<Icon name={ICON_NAMES.CALCULATOR} />
<Icon name={ICON_NAMES.COIN} />
// etc...
```

### Size

Use the `size` prop and the `SIZES` object from `./ui/helpers/constants/design-system.js` to change the size of `Icon`. Defaults to `SIZES.SM`

Possible sizes include:

- `SIZES.XS` 12px
- `SIZES.SM` 16px
- `SIZES.MD` 20px
- `SIZES.LG` 24px
- `SIZES.XL` 32px
- `SIZES.INHERIT` inherits the font-size from parent element. This is useful for inline icons in text.

<Canvas>
  <Story id="components-componentlibrary-icon--size" />
</Canvas>

```jsx
import { Size，TextVariant } from '../../../helpers/constants/design-system';
import { Icon, ICON_NAMES } from '../../components/component-library';

<Icon name={ICON_NAMES.ADD_SQUARE} size={Size.XS} />
<Icon name={ICON_NAMES.ADD_SQUARE} size={Size.SM} />
<Icon name={ICON_NAMES.ADD_SQUARE} size={Size.MD} />
<Icon name={ICON_NAMES.ADD_SQUARE} size={Size.LG} />
<Icon name={ICON_NAMES.ADD_SQUARE} size={Size.XL} />
<Text as="p" variant={TextVariant.bodySm}>
    <Icon size={Size.inherit} />  inherits the
    font-size of the parent element.
</Text>
```

### Color

Use the `color` prop and the `COLORS` object from `./ui/helpers/constants/design-system.js` to change the color of `Icon`. Defaults to `COLORS.INHERIT` which will use the text color of the parent element. This is useful for inline icons.

<Canvas>
  <Story id="components-componentlibrary-icon--color" />
</Canvas>

```jsx
import { IconColor } from '../../../helpers/constants/design-system';
import { Icon, ICON_NAMES } from '../../components/component-library';

<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.inherit} />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.iconDefault} />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.iconAlternative} />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.iconMuted} />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.overlayInverse} />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.primaryDefault} />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.primaryInverse} />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.errorDefault />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.errorInverse} />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.successDefault} />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.successInverse} />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.warningDefault} />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.warningInverse} />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.infoDefault} />
<Icon name={ICON_NAMES.ADD_SQUARE} color={IconColor.infoInvers} />
```

### Adding a new icon

To add a new icon the only thing you need to do is add the icon svg file to `app/images/icons`. To ensure that the icon is added correctly follow these steps:

#### Step 1.

Optimize the svg using [Fontastic](https://fontastic.me/). This will remove any unnecessary code from the svg. Your svg should only contain a single path.

Example of a correctly optimized svg:

```
<svg xmlns="http://www.w3.org/2000/svg" id="icon-add-square-filled" viewBox="0 0 512 512">
  <path d="m337 51l-171 0c-75 0-119 45-119 119l0 172c0 74 44 119 119 119l171 0c75 0 119-45 119-119l0-172c1-74-44-119-119-119z m-3 220l-67 0 0 67c0 8-7 15-15 15-9 0-16-7-16-15l0-67-66 0c-9 0-16-7-16-15 0-8 7-15 16-15l66 0 0-67c0-8 7-15 16-15 8 0 15 7 15 15l0 67 67 0c8 0 15 7 15 15 0 8-7 15-15 15z"/>
</svg>
```

If your svg **does not** contain a single path, you will need to get a designer to join all paths and outline strokes into a single path.

#### Step 2.

Add your optimized svg file to to `app/images/icons`

#### Step 3.

Run `yarn start` to generate the `ICON_NAMES` with your added icon.

If you have any questions please reach out to the design system team in the [#metamask-design-system](https://consensys.slack.com/archives/C0354T27M5M) channel on slack.
