Skip to content
Back to skills

Storybook Pro

ASecurity

Develop UI in isolation with Storybook: stories, args, controls, decorators, and interaction/visual testing. Use for component-driven development.

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 29, 2026
ai-agentsgobashreacttestingapidocumentation

Works with

  • cli
  • api

Security analysis

A100/100

Scanned September 29, 2026

npx -y skills add aicodedecode/awesome-muse-skills --skill storybook-pro --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Storybook Pro?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Storybook Pro
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/aicodedecode-storybook-pro/badge)](https://www.skillsdirectory.com/skills/aicodedecode-storybook-pro)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: storybook-pro
description: Develop UI in isolation with Storybook: stories, args, controls, decorators, and interaction/visual testing. Use for component-driven development.
category: web-development
---

# Storybook Pro

A practical guide to Storybook: component-driven development — writing stories, args/controls, decorators, documentation, and using stories as the basis for visual and interaction testing.

## Overview

Storybook renders components in isolation, outside the app: each **story** is a component in a specific state (default, loading, error, long-text). This gives you a **living component catalog** for development, design review, and QA — build the UI states without navigating the app into them. Stories then double as test fixtures (interaction tests) and visual regression baselines.

## When to use

- Building/maintaining a component library or design system.
- Developing complex component states (empty, error, loading) without app setup.
- Design review and QA of UI in isolation.
- Visual regression and interaction testing via stories.

## Core concepts

- **Stories (CSF).** `export const Primary = { args: { variant: 'primary', children: 'Save' } }` — Component Story Format: stories as objects with args. One file per component (`Button.stories.tsx`).
- **Args & controls.** Args are story inputs; controls auto-generate a UI panel to tweak them (text, boolean, select, color). Great for explorative QA.
- **Decorators.** Wrappers applied to stories: theme providers, router context, padding, locale. Global decorators in `.storybook/preview.tsx`.
- **Parameters.** Per-story config: layout (`centered`, `fullscreen`), backgrounds, viewport sizes, a11y rules.
- **Docs.** Autodocs generates prop tables and docs pages from stories + TSDoc. Stories *are* the documentation — write them to be read.
- **Interaction testing.** `play` functions simulate user flows inside stories (click, type, assert) — run in CI with the test runner.
- **Visual testing.** Chromatic (or similar) snapshots every story on every PR — pixel-level regression detection across the whole catalog.

## Practical workflow

**1. Setup.**
```bash
npx storybook@latest init   # detects framework, scaffolds .storybook/
npm run storybook
```

**2. Write stories for states, not just the happy path.**
```tsx
// Button.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';

const meta: Meta<typeof Button> = { component: Button, tags: ['autodocs'],
  argTypes: { onClick: { action: 'clicked' } } };
export default meta;
type Story = StoryObj<typeof Button>;

export const Primary: Story = { args: { variant: 'primary', children: 'Save' } };
export const Loading: Story = { args: { loading: true, children: 'Save' } };
export const Disabled: Story = { args: { disabled: true, children: 'Save' } };
export const LongLabel: Story = { args: { children: 'Save all changes to the shared workspace' } };
```

**3. Decorators for context.**
```tsx
// .storybook/preview.tsx
export const decorators = [
  (Story) => <ThemeProvider><div style={{ padding: 16 }}><Story /></div></ThemeProvider>,
];
```

**4. Interaction test.**
```tsx
export const Toggles: Story = {
  play: async ({ canvasElement }) => {
    const canvas = within(canvasElement);
    await userEvent.click(canvas.getByRole('switch'));
    await expect(canvas.getByRole('switch')).toHaveAttribute('aria-checked', 'true');
  },
};
```

**5. CI.** Build Storybook, run test-runner (interaction + a11y), publish to Chromatic for visual review on PRs.

## Common pitfalls

- **Stories only for happy path.** The value is in states: loading, error, empty, overflow, RTL. If a story doesn't exist for a state, that state isn't designed.
- **Stories duplicating app logic.** Stories with complex setup replicating app state become maintenance burdens. Keep stories presentational; mock at the props boundary.
- **No decorators for providers.** Stories crashing on missing context (theme, router, store). Global decorators once, not per story.
- **Stale stories.** Component API changes, stories not updated → catalog lies. Treat stories as code: update in the same PR.
- **Over-mocking.** Stories so mocked they don't resemble real usage. Use realistic data (long names, edge values).
- **Ignoring visual review.** Chromatic diffs rubber-stamped. Assign reviewers; diffs are design QA.
- **Slow Storybook.** Hundreds of stories with heavy decorators = sluggish. Code-split stories, keep decorators light, lazy-load where possible.
- **Docs rot.** Autodocs only works if props are typed and commented. Write TSDoc on props — the docs page is your API reference.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…