import { Meta } from '@storybook/addon-docs';
# Documentation Guidelines
> 💡 To improve the quality of our component documentation we are currently in the process of updating our storybook to use Storyboook's [controls](https://storybook.js.org/addons/@storybook/addon-controls/), [a11y](https://storybook.js.org/addons/@storybook/addon-a11y/) and [docs](https://storybook.js.org/addons/@storybook/addon-docs/) plugins. You will find most components currently without documentation and use [knobs](https://storybook.js.org/addons/@storybook/addon-knobs)(deprecated) for their primary interactivity. These will eventually be updated. Want to contribute? Check out the storybook issues on github
## General Guidelines
Thorough documentation makes it much easier for a component to be found, adapted and reused. It also provides space for explanation and reasoning for a component. This is useful as components become more complex.
Some general documentation best practices to follow:
- Put yourself in the shoes of another developer trying to use the component you just created for the first time
- Write a brief description of the component and what it's used for in the `README.mdx` file
- Display the component's API using the `` component from storybook docs. Add descriptions of each prop by using jsDoc style comments in the `propTypes`.
- Use the [controls](https://storybook.js.org/addons/@storybook/addon-controls/) over [knobs](https://storybook.js.org/addons/@storybook/addon-knobs)(deprecated)
- Use the [action argType annotation](https://storybook.js.org/docs/react/essentials/actions#action-argtype-annotation) over importing the actions plugin directly
See the [Button](https://metamask.github.io/metamask-storybook/index.html?path=/story/components-ui-button--default-story)(`ui/components/ui/button/button.stories.js`) component for reference
## Creating a Story
[Component Story Format (CSF)](https://storybook.js.org/docs/react/api/csf) is the recommended way to write stories. It's an open standard based on ES6 modules.
A story **without MDX** documentation can be as simple as:
```jsx
import React from 'react';
import MyComponent from '.';
export default {
title: 'Components/UI/MyComponent', // title should follow the folder structure location of the component. Don't use spaces.
};
export const DefaultStory = () => ;
DefaultStory.storyName = 'Default';
```
For a more in-depth and higher quality form of story and documentation, you can use controls and MDX docs.
The example below displays the `Button` component and it explains how we should write our stories:
```jsx
// Button component example story
import React from 'react';
import IconTokenSearch from '../icon/icon-token-search';
// The mdx file to document props and usage
import README from './README.mdx';
import Button from '.';
// The default storybook component export should always follow the same template
export default {
// The `title` effects the components tile and location in storybook
// It should follow the folder structure location of the component. Don't use spaces.
title: 'Components/UI/Button',
component: Button, // The component you are documenting
parameters: {
docs: {
page: README, // Reference to the docs page MDX file
},
},
// the controls plugin argTypes are used for the interactivity of the component
argTypes: {
children: { control: 'text' },
disabled: { control: 'boolean' },
// use the updated action API to log actions in the actions tab
onClick: { action: 'clicked' },
type: {
control: {
type: 'select',
},
options: [
'default',
'primary',
'secondary',
'warning',
'danger',
'danger-primary',
'link',
],
},
submit: { control: 'boolean' },
large: { control: 'boolean' },
className: { control: 'text' },
icon: {
control: {
type: 'select',
},
options: ['IconTokenSearch'],
mapping: {
IconTokenSearch: ,
},
},
},
};
// First story component should always be called "DefaultStory"
// The `DefaultStory` should include argTypes and controls where appropriate
export const DefaultStory = (args) => (
);
// The name of the DefaultStory component can be renamed to simply "Default"
DefaultStory.storyName = 'Default';
// More stories should be added for different usage examples
// You can add as many stories as you think appropriate to comprehensively document the component
// A good convention is to name the story component after the prop you are highlighting
export const Type = (args) => (
<>
>
);
```
## Writing MDX Documentation
Now the storybook components are complete, the `README.mdx` documentation should explain the component in detail. [MDX](https://mdxjs.com/) format lets you seamlessly use `JSX` in your markdown documents. You can import react components and stories into your documentation to enhance the developer experience.
```md
import { Story, Canvas, ArgsTable } from '@storybook/addon-docs';
import Button from '.';
# Button
Buttons communicate actions that users can take.
## Props
## Usage
The following describes the props and example usage for this component.
### Type
By changing the `type` prop you can use different styles of the button.
| type | Description |
| ----------------- | ----------------------------------------------------------------------------------------------------- |
| `default` | default style of the button |
| `primary` | the principle call to action on the page |
| `secondary` | secondary actions on each page |
| `warning` | a warning action in the page |
| `danger` | a negative action (such as Delete) on the page |
| `danger--primary` | a negative principle call to action (such as Delete) on the page |
| `link` | an optional action or navigation action out of the app changes root html tag from `