К основному содержанию
скилл CX Codex

storybook-story-writing — скилл для Claude Code: истории Storybook

Пишет и правит истории Storybook для компонентов: формат CSF3, все состояния компонента, сборка без ошибок. Пригодится, когда сториз расползаются и ломают билд.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add TheBushidoCollective/han --skill storybook-story-writing -a claude-code
Открыть на GitHub

Что делает storybook-story-writing

Скилл включается, когда вы создаёте или меняете файлы *.stories.tsx. Он держит истории в формате CSF3: объект meta с satisfies Meta<typeof Component>, типизированные StoryObj, отдельные экспорты на каждое состояние. Заодно следит, чтобы сборка Storybook проходила.

Внутри — набор правил и примеров. Мета-экспорт задаёт title, component, parameters, tags: ['autodocs'] и argTypes. Общие пропсы вроде size и theme выносятся в args на уровне меты, а не дублируются в каждой истории. Для контекста используются декораторы, для адаптива — parameters.viewport.

Есть и список антипаттернов: старый CSF2 через Template.bind({}), логика с useState и useEffect прямо в истории, пропущенная аннотация типа. Логику скилл советует уносить в компонент или в play-функции. Если у вас в проекте ещё живут истории CSF2, готовьтесь к тому, что скилл будет на них ругаться.

Какие задачи решает

  • переписать старые истории с CSF2 на CSF3
  • показать все состояния компонента: загрузку, ошибку, disabled
  • вынести повторяющиеся пропсы в args на уровне меты
  • добавить декораторы и viewport для адаптивных историй
  • починить сборку Storybook после правок в сториз

Примеры запросов агенту

  • Напиши истории для компонента Button в формате CSF3, покажи состояния loading и disabled
  • Переделай этот файл stories с Template.bind({}) на CSF3
  • Добавь в истории Input декоратор с отступами и viewport для мобильного

Как установить storybook-story-writing

1Через Skills CLI (Vercel)

npx skills add TheBushidoCollective/han --skill storybook-story-writing -a claude-code

2Вручную: положить файлы

~/.claude/skills/storybook-story-writing/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/storybook-story-writing/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Вопросы о storybook-story-writing

Как установить storybook-story-writing в Claude?

Выполните npx skills add TheBushidoCollective/han --skill storybook-story-writing -a claude-code. Файл скилла появится по пути ~/.claude/skills/storybook-story-writing/SKILL.md.

Что делает storybook-story-writing?

Помогает писать и править истории Storybook для компонентов: следит за форматом CSF3, за тем, чтобы были показаны варианты компонента, и за успешной сборкой.

Какие инструменты доступны скиллу?

Read, Write, Edit, Bash, Grep и Glob. То есть он может читать и править файлы историй, искать по проекту и запускать команды сборки.

Исходный текст

SKILL.md · Apache-2.0
---
name: storybook-story-writing
user-invocable: false
description: Use when creating or modifying Storybook stories for components. Ensures stories follow CSF3 format, properly showcase component variations, and build successfully.
allowed-tools:
  - Read
  - Write
  - Edit
  - Bash
  - Grep
  - Glob
---

# Storybook - Story Writing

Write well-structured, maintainable Storybook stories using Component Story Format 3 (CSF3) that showcase component variations and ensure consistent rendering.

## Key Concepts

### Component Story Format 3 (CSF3)

CSF3 is the modern Storybook format that uses object syntax for stories:

```typescript
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';

const meta = {
  title: 'Components/Button',
  component: Button,
  parameters: {
    layout: 'centered',
  },
  tags: ['autodocs'],
  argTypes: {
    backgroundColor: { control: 'color' },
  },
} satisfies Meta<typeof Button>;

export default meta;
type Story = StoryObj<typeof meta>;

export const Primary: Story = {
  args: {
    primary: true,
    label: 'Button',
  },
};

export const Secondary: Story = {
  args: {
    label: 'Button',
  },
};
```

### Story Organization

- One story file per component: `Component.stories.tsx`
- Use descriptive story names: `Primary`, `Secondary`, `Large`, `Disabled`
- Group related stories under a title hierarchy: `Components/Forms/Input`

### Default Export (Meta)

The default export defines metadata for all stories:

```typescript
const meta = {
  title: 'Components/Button',        // Navigation path
  component: Button,                  // Component reference
  parameters: {},                     // Story-level config
  tags: ['autodocs'],                // Enable auto-documentation
  argTypes: {},                       // Control types
  decorators: [],                     // Wrappers for stories
} satisfies Meta<typeof Button>;
```

## Best Practices

### 1. Use TypeScript for Type Safety

```typescript
import type { Meta, StoryObj } from '@storybook/react';

const meta = {
  component: Button,
} satisfies Meta<typeof Button>;

type Story = StoryObj<typeof meta>;
```

### 2. Show All Component States

Create stories for each meaningful state:

```typescript
export const Default: Story = {
  args: {
    label: 'Click me',
  },
};

export const Loading: Story = {
  args: {
    label: 'Loading...',
    loading: true,
  },
};

export const Disabled: Story = {
  args: {
    label: 'Disabled',
    disabled: true,
  },
};

export const WithIcon: Story = {
  args: {
    label: 'Download',
    icon: 'download',
  },
};
```

### 3. Use Sensible Defaults

```typescript
export const Primary: Story = {
  args: {
    primary: true,
    label: 'Button',
    size: 'medium',
  },
};

// Extend existing stories
export const PrimaryLarge: Story = {
  ...Primary,
  args: {
    ...Primary.args,
    size: 'large',
  },
};
```

### 4. Add Descriptive Parameters

```typescript
export const WithTooltip: Story = {
  args: {
    label: 'Hover me',
    tooltip: 'Click to submit',
  },
  parameters: {
    docs: {
      description: {
        story: 'Shows a tooltip on hover to provide additional context.',
      },
    },
  },
};
```

### 5. Use Decorators for Context

```typescript
import { RouterDecorator } from '../decorators';

const meta = {
  component: Navigation,
  decorators: [
    (Story) => (
      <div style={{ padding: '3rem' }}>
        <Story />
      </div>
    ),
    RouterDecorator,
  ],
} satisfies Meta<typeof Navigation>;
```

## Common Patterns

### Form Components

```typescript
export const EmptyForm: Story = {
  args: {
    onSubmit: (data) => console.log(data),
  },
};

export const PrefilledForm: Story = {
  args: {
    defaultValues: {
      email: '[email protected]',
      name: 'John Doe',
    },
  },
};

export const WithValidationErrors: Story = {
  args: {
    errors: {
      email: 'Invalid email format',
      name: 'Name is required',
    },
  },
};
```

### Layout Components

```typescript
export const WithSidebar: Story = {
  args: {
    sidebar: <Sidebar items={sidebarItems} />,
    children: <Content />,
  },
  parameters: {
    layout: 'fullscreen',
  },
};
```

### Data-Driven Components

```typescript
const mockData = [
  { id: 1, name: 'Item 1' },
  { id: 2, name: 'Item 2' },
  { id: 3, name: 'Item 3' },
];

export const WithData: Story = {
  args: {
    items: mockData,
  },
};

export const Empty: Story = {
  args: {
    items: [],
    emptyMessage: 'No items found',
  },
};
```

### Responsive Components

```typescript
export const Mobile: Story = {
  args: {
    variant: 'mobile',
  },
  parameters: {
    viewport: {
      defaultViewport: 'mobile1',
    },
  },
};

export const Desktop: Story = {
  args: {
    variant: 'desktop',
  },
  parameters: {
    viewport: {
      defaultViewport: 'desktop',
    },
  },
};
```

## Anti-Patterns

### ❌ Don't Use Template Binding (CSF2)

```typescript
// Bad - Old CSF2 format
const Template = (args) => <Button {...args} />;
export const Primary = Template.bind({});
Primary.args = { label: 'Button' };
```

```typescript
// Good - CSF3 format
export const Primary: Story = {
  args: { label: 'Button' },
};
```

### ❌ Don't Mix Logic in Stories

```typescript
// Bad
export const Complex: Story = {
  render: (args) => {
    const [state, setState] = useState(false);
    useEffect(() => {
      // Complex side effects
    }, []);
    return <Component {...args} />;
  },
};
```

```typescript
// Good - Move logic to component or use play functions
export const Complex: Story = {
  args: { initialState: false },
};
```

### ❌ Don't Hardcode Repetitive Props

```typescript
// Bad
export const Story1: Story = {
  args: { label: 'Button', size: 'medium', theme: 'light' },
};
export const Story2: Story = {
  args: { label: 'Submit', size: 'medium', theme: 'light' },
};
```

```typescript
// Good - Use meta-level defaults
const meta = {
  component: Button,
  args: {
    size: 'medium',
    theme: 'light',
  },
} satisfies Meta<typeof Button>;

export const Story1: Story = {
  args: { label: 'Button' },
};
export const Story2: Story = {
  args: { label: 'Submit' },
};
```

### ❌ Don't Skip Story Types

```typescript
// Bad - Missing type annotation
export const Primary = {
  args: { label: 'Button' },
};
```

```typescript
// Good - With type
export const Primary: Story = {
  args: { label: 'Button' },
};
```

## Related Skills

- **storybook-args-controls**: Advanced arg configuration and interactive controls
- **storybook-play-functions**: Automated interaction testing within stories
- **storybook-component-documentation**: Auto-generating component documentation

© TheBushidoCollective · Apache-2.0 · TheBushidoCollective/han

Похожие скиллы

Всё по теме «Фронтенд и UI» →
writing-react-native-storybook-stories storybookjs Помогает агенту писать и править истории React Native по формату CSF: args, argTypes, декораторы, параметры аддонов и портируемые истории для тестов. CX Codex +1 681установок svelte-storybook-mock davila7 Готовит моки модулей SvelteKit для историй Storybook, чтобы компонент рендерился в изоляции без запущенного приложения. 121установок svelte-storybook-troubleshoot davila7 Слэш-команда разбирает типовые поломки Storybook в проектах на SvelteKit: ошибки сборки, неразрешённые модули, конфликты аддонов. 118установок senior-frontend Alireza Rezvani Скилл помогает создавать React-компоненты, запускать проекты Next.js и проверять размер бандла. Пригодится при разработке интерфейса, аудите кода и настройке доступности. 1 630установок setup-react-native-storybook storybookjs Скилл автоматизирует развёртывание Storybook 10 в проектах на React Native. Помогает настроить окружение для Expo, чистого React Native CLI или Re.Pack. CX Codex +1 526установок react-container-presentation-component официальный github Скилл создаёт React-компонент по паттерну Container/Presentation и раскладывает файлы по соглашениям TypeScript, Storybook и SCSS. 65установок

Из того же набора7

android-jetpack-compose Помогает агенту писать Android-интерфейсы на Jetpack Compose и выбирать паттерны состояния. Пригодится при работе с composable-функциями и ViewModel. CX Codex +1 2 200установок fastapi-async-patterns Скилл с готовыми шаблонами async-роутов, асинхронных баз данных, фоновых задач и WebSocket в FastAPI. Пригодится, когда API начинает тормозить на конкурентных запросах. CX Codex +1 953установок atomic-design-fundamentals Помогает разложить компоненты интерфейса по уровням Atomic Design: от токенов до страниц. Пригодится, когда в проекте уже сотня компонентов и непонятно, куда класть новый. CX Codex +1 766установок solid-principles Скилл подсказывает агенту применять пять принципов SOLID, когда он проектирует модули, функции и компоненты. Пригодится на этапе реализации, а не после ревью. CX Codex +1 554установок docker-compose-production Готовит конфигурации Docker Compose для продакшена: задаёт лимиты ресурсов, проверки healthcheck, ротацию логов, секреты и изоляцию сетей. CX Codex +1 484установок rails-hotwire Скилл для работы с Hotwire в Rails: Turbo Frames, Turbo Streams, трансляции и контроллеры Stimulus. Пригодится, когда нужно оживить страницы без тяжёлого JS. CX Codex +1 348установок

Спонсоры проекта

Компании, которые помогают держать аналитику открытой