Files
ComfyUI_frontend/.storybook/README.md
snomiao 451ef24ea6 [feat] Add Storybook setup and NodePreview story (#4861)
* [feat] Add Storybook setup and NodePreview story

- Install and configure Storybook v9.1.1 for Vue 3
- Set up Storybook configuration with Vite integration
- Add Pinia store support for Storybook environment
- Create comprehensive NodePreview.stories.ts with multiple node examples:
  - KSampler node (complex node with multiple inputs/outputs)
  - CLIP Text Encode node (simple text input node)
  - VAE Decode node (image processing node)
  - Example with long markdown description
- Configure project paths and aliases for Storybook
- Stories demonstrate various ComfyUI node types with realistic mock data
- Update tsconfig.eslint.json to include Storybook files
- Fix ESLint issues with imports and number precision
- Add Storybook ESLint plugin configuration

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* [feat] Improve Storybook configuration and setup

- Add comprehensive PrimeVue theme setup with ComfyUI preset
- Configure proper Vue app setup with Pinia stores, i18n, and services
- Remove unused onboarding addon from Storybook dependencies
- Improve Vite configuration with better chunking and alias resolution
- Add proper CSS imports and styling for ComfyUI components

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* [docs] Add comprehensive Storybook documentation

- Add README.md explaining Storybook usage, benefits, and comparison with other tools
- Add CLAUDE.md with development guidelines for working with Storybook
- Include best practices, troubleshooting tips, and integration notes
- Address PR review feedback for better developer onboarding

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* [refactor] Remove ts-expect-error comment from Storybook preview

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* [bugfix] Fix TypeScript errors in Load3D components and GLTF test

- Fix type mismatches in Load3DScene eventConfig by casting string values to proper enum types (MaterialMode, CameraType, UpDirection)
- Fix Uint8Array vs ArrayBuffer type issues in GLTF test by using .buffer property
- Remove unused @ts-expect-error comment in Rectangle.ts

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* [feat] Add Chromatic GitHub Action for Storybook visual testing

- Add automated visual regression testing for Storybook components
- Configure workflow to run on main branch and PRs
- Auto-accept changes on main branch for baseline updates
- Uses build-storybook script for optimized builds

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* [docs] Add Chromatic documentation to Storybook README

- Document Chromatic visual testing integration
- Add information about automated testing workflow
- Include best practices for visual regression testing
- Explain how to view and manage test results

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* chore(chromatic.yaml): restrict push branches to main only for better workflow management

* [feat] Rebase branch onto main and update Storybook configuration

- Rebase sno-storybook branch onto origin/main with latest changes
- Update .storybook/main.ts with additional plugins and component configuration
- Add icons and component resolvers for Storybook support
- Update .gitignore with new entries
- Regenerate package-lock.json after rebase conflicts

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* [bugfix] Fix TypeScript errors in SubgraphNode type checking

Add proper type validation for subgraph node selection before calling
SubgraphNode-specific methods. This prevents undefined values from being
passed to functions expecting SubgraphNode parameters.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(vite.config.mts): correct path alias for src directory to ensure proper resolution in the project
refactor(vite.config.mts): adjust templates proxy configuration for better readability and maintainability

* [feat] Remove bun.lock as it's now ignored

* [bugfix] Fix Storybook builder require() error by converting main.ts to main.mjs

- Convert .storybook/main.ts to main.mjs to resolve ES module compatibility
- Use dynamic imports instead of static imports to avoid require() errors
- Add .storybook directory to tsconfig.json includes
- Storybook build and dev server now work correctly

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* chore(storybook): replace main.mjs with main.ts for improved type safety and maintainability
fix(storybook): remove unused import map plugins in Storybook configuration to prevent potential issues
fix(storybook): update color palette store initialization to streamline code and improve readability

* [feat] Optimize Chromatic workflow with automated PR status comments

- Replace complex GitHub Script actions with edumserrano/find-create-or-update-comment@v3
- Add comprehensive PR comments showing Storybook build progress and results
- Include build metrics: components, stories, visual changes, and errors
- Add direct links to Chromatic builds and Storybook previews
- Reduce workflow complexity by ~60 lines while maintaining functionality
- Use native GitHub Actions expressions for cleaner maintainability

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>

* chore(chromatic.yaml): move permissions section inside the chromatic-deployment job for better organization and clarity

* [fix] Resolve Vite CJS deprecation warning in Storybook config

- Use dynamic import for mergeConfig to avoid CJS build warning
- Replace static import with dynamic import in viteFinal function
- Maintain type safety with separate type import
- Fixes "The CJS build of Vite's Node API is deprecated" warning

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(chromatic.yaml): change edit-mode from replace to append to preserve existing comments in pull request

* [fix] Replace __dirname with process.cwd() in Storybook config

__dirname is not available in all environments. Using process.cwd()
provides better compatibility and resolves path issues in Storybook.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feature: storybook-setting (#5088)

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Jin Yi <jin12cc@gmail.com>
2025-08-18 20:05:28 -07:00

5.4 KiB

Storybook Configuration for ComfyUI Frontend

What is Storybook?

Storybook is a frontend workshop for building UI components and pages in isolation. It allows developers to:

  • Build components independently from the main application
  • Test components with different props and states
  • Document component APIs and usage patterns
  • Share components across teams and projects
  • Catch visual regressions through visual testing

Storybook vs Other Testing Tools

Tool Purpose Use Case
Storybook Component isolation & documentation Developing, testing, and showcasing individual UI components
Playwright End-to-end testing Full user workflow testing across multiple pages
Vitest Unit testing Testing business logic, utilities, and component behavior
Vue Testing Library Component testing Testing component interactions and DOM output

When to Use Storybook

Use Storybook for:

  • Developing new UI components in isolation
  • Creating component documentation and examples
  • Testing different component states and props
  • Sharing components with designers and stakeholders
  • Visual regression testing
  • Building a component library or design system

Don't use Storybook for:

  • Testing complex user workflows (use Playwright)
  • Testing business logic (use Vitest)
  • Integration testing between components (use Vue Testing Library)

How to Use Storybook

Development Commands

# Start Storybook development server
npm run storybook

# Build static Storybook for deployment
npm run build-storybook

Creating Stories

Stories are located alongside components in src/ directories with the pattern *.stories.ts:

// MyComponent.stories.ts
import type { Meta, StoryObj } from '@storybook/vue3'
import MyComponent from './MyComponent.vue'

const meta: Meta<typeof MyComponent> = {
  title: 'Components/MyComponent',
  component: MyComponent,
  parameters: {
    layout: 'centered'
  }
}

export default meta
type Story = StoryObj<typeof meta>

export const Default: Story = {
  args: {
    title: 'Hello World'
  }
}

export const WithVariant: Story = {
  args: {
    title: 'Variant Example',
    variant: 'secondary'
  }
}

Available Features

  • Vue 3 Support: Full Vue 3 composition API and reactivity
  • PrimeVue Integration: All PrimeVue components and theming
  • ComfyUI Theming: Custom ComfyUI theme preset applied
  • Pinia Stores: Access to application stores for components that need state
  • TypeScript: Full TypeScript support with proper type checking
  • CSS/SCSS: Component styling support
  • Auto-documentation: Automatic prop tables and component documentation
  • Chromatic Integration: Automated visual regression testing for component stories

Development Tips

Best Practices

  1. Keep Stories Simple: Each story should demonstrate one specific use case
  2. Use Realistic Data: Use data that resembles real application usage
  3. Document Edge Cases: Create stories for loading states, errors, and edge cases
  4. Group Related Stories: Use consistent naming and grouping for related components

Component Testing Strategy

// Example: Testing different component states
export const Loading: Story = {
  args: {
    isLoading: true
  }
}

export const Error: Story = {
  args: {
    error: 'Failed to load data'
  }
}

export const WithLongText: Story = {
  args: {
    description: 'Very long description that might cause layout issues...'
  }
}

Debugging Tips

  • Use browser DevTools to inspect component behavior
  • Check the Storybook console for Vue warnings or errors
  • Use the Controls addon to dynamically change props
  • Leverage the Actions addon to test event handling

Configuration Files

  • main.ts: Core Storybook configuration and Vite integration
  • preview.ts: Global decorators, parameters, and Vue app setup
  • manager.ts: Storybook UI customization (if needed)

Chromatic Visual Testing

This project uses Chromatic for automated visual regression testing of Storybook components.

How It Works

  • Automated Testing: Every push to main and sno-storybook branches triggers Chromatic builds
  • Pull Request Reviews: PRs against main branch include visual diffs for component changes
  • Baseline Management: Changes on main branch are automatically accepted as new baselines
  • Cross-browser Testing: Tests across multiple browsers and viewports

Viewing Results

  1. Check the GitHub Actions tab for Chromatic workflow status
  2. Click on the Chromatic build link in PR comments to review visual changes
  3. Accept or reject visual changes directly in the Chromatic UI

Best Practices for Visual Testing

  • Consistent Stories: Ensure stories render consistently across different environments
  • Meaningful Names: Use descriptive story names that clearly indicate the component state
  • Edge Cases: Include stories for loading, error, and empty states
  • Realistic Data: Use data that closely resembles production usage

Integration with ComfyUI

This Storybook setup includes:

  • ComfyUI-specific theming and styling
  • Pre-configured Pinia stores for state management
  • Internationalization (i18n) support
  • PrimeVue component library integration
  • Proper alias resolution for @/ imports

For component-specific examples, see the NodePreview stories in src/components/node/.