Component-Driven Development with Storybook in React

Utilizing Storybook to develop, test, and document React components in isolation.

0 likes
9 views

Rule Content

---
description: Enforce the use of Storybook for developing, testing, and documenting React components in isolation.
globs: src/components/**/*.tsx
tags: [React, Storybook, Component-Driven Development]
priority: 2
version: 1.0.0
---

# Component-Driven Development with Storybook in React

## Context
- Applicable to all React components within the project.
- Aims to enhance component modularity, reusability, and maintainability.

## Requirements
- **Storybook Integration**: Ensure Storybook is set up and configured to mirror the application's component structure.
- **Component Stories**:
  - Create a dedicated `.stories.tsx` file for each React component.
  - Include a default story showcasing the component with only its required props.
  - Add additional stories to represent various states and interactions of the component.
- **Mock Data Usage**: Utilize mock data and handlers to simulate real-world scenarios within stories, avoiding reliance on external APIs.
- **Consistent Styling**: Apply global styles and theme providers within Storybook to ensure consistency with the main application.
- **Performance Optimization**: Implement dynamic story loading and pagination to maintain optimal performance as the number of stories grows.

## Examples
// Button.stories.tsx

import React from 'react';
import { ComponentMeta, ComponentStory } from '@storybook/react';
import Button from './Button';

export default {
  title: 'Button',
  component: Button,
  argTypes: {
    onClick: { action: 'clicked' },
  },
  parameters: {
    docs: {
      description: {
        component: 'A simple button component',
      },
    },
  },
} as ComponentMeta<typeof Button>;

const Template: ComponentStory<typeof Button> = (args) => <Button {...args} />;

export const Default = Template.bind({});
Default.args = {
  label: 'Default Button',
};

export const Primary = Template.bind({});
Primary.args = {
  label: 'Primary Button',
  primary: true,
};
// .storybook/preview.tsx

import React from 'react';
import { ThemeProvider } from 'styled-components';
import { theme } from '../src/theme';

export const decorators = [
  (Story) => (
    <ThemeProvider theme={theme}>
      <Story />
    </ThemeProvider>
  ),
];