4.4 KiB
4.4 KiB
apps/storybook -- Centralized Storybook
Purpose
Centralized Storybook instance that pulls and renders all stories from packages/ui. Provides a visual development environment, component documentation, and MCP integration for AI agents.
Port: 6006
pnpm dev --filter @repo/storybook # http://localhost:6006
Configuration
.storybook/main.ts
import type { StorybookConfig } from "@storybook/react-vite";
const config: StorybookConfig = {
framework: "@storybook/react-vite",
stories: ["../../../packages/ui/src/**/*.stories.@(ts|tsx)"],
addons: ["@storybook/addon-essentials"],
docs: {
autodocs: "tag",
},
async viteFinal(config) {
const { mergeConfig } = await import("vite");
const tailwindPlugin = await import("@tailwindcss/vite");
return mergeConfig(config, {
plugins: [tailwindPlugin.default()],
});
},
};
Key configuration details:
storiesglob reaches intopackages/ui/src/to find all.stories.tsxfilesviteFinaladds the@tailwindcss/viteplugin so Tailwind v4 classes render correctly in storiesautodocs: "tag"generates documentation pages for stories tagged with"autodocs"@storybook/addon-essentialsincludes Controls, Actions, Backgrounds, Viewport, Docs
.storybook/preview.ts
import type { Preview } from "@storybook/react";
import "../../../packages/ui/src/styles/globals.css";
const preview: Preview = {
parameters: {
controls: {
matchers: {
color: /(background|color)$/i,
date: /Date$/i,
},
},
},
};
Key details:
- Imports
globals.cssfrom@repo/uiso all Tailwind v4@themetokens are available - Control matchers auto-detect color and date props for appropriate editor widgets
Story Organization
Stories are organized by Atomic Design level via the title field in story metadata. The title determines the sidebar hierarchy in Storybook.
Story Title Convention
| Level | Title format | Example | Sidebar path |
|---|---|---|---|
| Atom | "Atoms/{ComponentName}" |
"Atoms/Button" |
Atoms > Button |
| Molecule | "Molecules/{ComponentName}" |
"Molecules/FormField" |
Molecules > FormField |
| Organism | "Organisms/{ComponentName}" |
"Organisms/DataTable" |
Organisms > DataTable |
| Template | "Templates/{ComponentName}" |
"Templates/DashboardLayout" |
Templates > DashboardLayout |
Existing Stories
| Story title | Component | Location in @repo/ui |
|---|---|---|
Atoms/Button |
Button (5 variants: Default, Secondary, Destructive, Outline, Ghost) | src/atoms/button/button.stories.tsx |
Atoms/Input |
Input (Default, Disabled) | src/atoms/input/input.stories.tsx |
Molecules/FormField |
FormField (Default, WithDescription, WithError) | src/molecules/form-field/form-field.stories.tsx |
MCP Integration
When Storybook is running, the MCP (Model Context Protocol) endpoint is available at:
http://localhost:6006/mcp
Available MCP tools:
list-all-documentation-- Lists all documented components and their storiesget-documentation-- Gets detailed documentation for a specific component (props, variants, usage)run-story-tests-- Runs visual tests on stories to validate rendering
Installing addon-mcp
If @storybook/addon-mcp is not already installed:
npx storybook add @storybook/addon-mcp
This adds the addon to .storybook/main.ts and enables the MCP endpoint.
Using MCP in workflows
Always query MCP before creating new UI components:
- Before creating:
list-all-documentationto check if a similar component exists - Before extending:
get-documentationto understand existing props and variants - After creating:
run-story-teststo validate the new story renders correctly
Dependencies
| Dependency | Purpose |
|---|---|
@repo/ui |
Source of all component stories |
@storybook/react-vite |
Storybook framework using Vite bundler |
@storybook/addon-essentials |
Controls, Actions, Docs, Backgrounds, Viewport |
@tailwindcss/vite |
Vite plugin for Tailwind CSS v4 |
storybook |
Storybook core CLI and dev server |
tailwindcss |
Tailwind CSS v4 engine |
vite |
Build tool / dev server |
react / react-dom |
React 19 runtime |
Cross-References
- Component source:
packages/ui/-- seepackages/ui/AGENTS.md - Tailwind tokens:
packages/ui/src/styles/globals.css