432 lines
12 KiB
Markdown
432 lines
12 KiB
Markdown
# Product Requirements Document: Storybook Integration
|
|
|
|
## Overview
|
|
|
|
Implement Storybook as our component development and documentation platform to improve development workflow, component testing, and design system consistency across the jedmund-svelte project.
|
|
|
|
## Goals
|
|
|
|
- **Isolated Component Development**: Build and test components in isolation from business logic
|
|
- **Visual Documentation**: Create a living style guide for all UI components
|
|
- **Design System Consistency**: Ensure consistent component behavior across different states
|
|
- **Developer Experience**: Improve development workflow with hot reloading and component playground
|
|
- **Quality Assurance**: Test component edge cases and various prop combinations
|
|
- **Team Collaboration**: Provide a central place for designers and developers to review components
|
|
|
|
## Current State Analysis
|
|
|
|
### ✅ What We Have
|
|
|
|
- Comprehensive admin UI component library (Button, Input, Modal, etc.)
|
|
- Media Library components (MediaLibraryModal, ImagePicker, GalleryManager, etc.)
|
|
- SCSS-based styling system with global variables
|
|
- SvelteKit project with Svelte 5 runes mode
|
|
- TypeScript configuration
|
|
- Vite build system
|
|
|
|
### 🎯 What We Need
|
|
|
|
- Storybook installation and configuration
|
|
- Stories for existing components
|
|
- Visual regression testing setup
|
|
- Component documentation standards
|
|
- Integration with existing SCSS variables and themes
|
|
|
|
## Technical Requirements
|
|
|
|
### 1. Storybook Installation
|
|
|
|
**Installation Method**: Manual setup (not template-based since we have an existing project)
|
|
|
|
```bash
|
|
# Install Storybook CLI and initialize
|
|
npx storybook@latest init
|
|
|
|
# Or manual installation for better control
|
|
npm install --save-dev @storybook/svelte-vite @storybook/addon-essentials
|
|
```
|
|
|
|
**Expected File Structure**:
|
|
|
|
```
|
|
.storybook/
|
|
├── main.js # Storybook configuration
|
|
├── preview.js # Global decorators and parameters
|
|
└── manager.js # Storybook UI customization
|
|
|
|
src/
|
|
├── stories/ # Component stories
|
|
│ ├── Button.stories.js
|
|
│ ├── Input.stories.js
|
|
│ └── ...
|
|
└── components/ # Existing components
|
|
```
|
|
|
|
### 2. Configuration Requirements
|
|
|
|
#### Main Configuration (.storybook/main.js)
|
|
|
|
```javascript
|
|
export default {
|
|
stories: ['../src/**/*.stories.@(js|jsx|ts|tsx|svelte)'],
|
|
addons: [
|
|
'@storybook/addon-essentials', // Controls, actions, viewport, etc.
|
|
'@storybook/addon-svelte-csf', // Svelte Component Story Format
|
|
'@storybook/addon-a11y', // Accessibility testing
|
|
'@storybook/addon-design-tokens' // Design system tokens
|
|
],
|
|
framework: {
|
|
name: '@storybook/svelte-vite',
|
|
options: {}
|
|
},
|
|
viteFinal: async (config) => {
|
|
// Integrate with existing Vite config
|
|
// Import SCSS variables and aliases
|
|
return mergeConfig(config, {
|
|
resolve: {
|
|
alias: {
|
|
$lib: path.resolve('./src/lib'),
|
|
$components: path.resolve('./src/lib/components'),
|
|
$icons: path.resolve('./src/assets/icons'),
|
|
$illos: path.resolve('./src/assets/illos')
|
|
}
|
|
},
|
|
css: {
|
|
preprocessorOptions: {
|
|
scss: {
|
|
additionalData: `
|
|
@import './src/assets/styles/variables.scss';
|
|
@import './src/assets/styles/fonts.scss';
|
|
@import './src/assets/styles/themes.scss';
|
|
@import './src/assets/styles/globals.scss';
|
|
`
|
|
}
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Preview Configuration (.storybook/preview.js)
|
|
|
|
```javascript
|
|
import '../src/assets/styles/reset.css'
|
|
import '../src/assets/styles/globals.scss'
|
|
|
|
export const parameters = {
|
|
actions: { argTypesRegex: '^on[A-Z].*' },
|
|
controls: {
|
|
matchers: {
|
|
color: /(background|color)$/i,
|
|
date: /Date$/
|
|
}
|
|
},
|
|
backgrounds: {
|
|
default: 'light',
|
|
values: [
|
|
{ name: 'light', value: '#ffffff' },
|
|
{ name: 'dark', value: '#333333' },
|
|
{ name: 'admin', value: '#f5f5f5' }
|
|
]
|
|
},
|
|
viewport: {
|
|
viewports: {
|
|
mobile: { name: 'Mobile', styles: { width: '375px', height: '667px' } },
|
|
tablet: { name: 'Tablet', styles: { width: '768px', height: '1024px' } },
|
|
desktop: { name: 'Desktop', styles: { width: '1440px', height: '900px' } }
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### 3. Component Story Standards
|
|
|
|
#### Story File Format
|
|
|
|
Each component should have a corresponding `.stories.js` file following this structure:
|
|
|
|
```javascript
|
|
// Button.stories.js
|
|
import Button from '../lib/components/admin/Button.svelte'
|
|
|
|
export default {
|
|
title: 'Admin/Button',
|
|
component: Button,
|
|
tags: ['autodocs'],
|
|
argTypes: {
|
|
variant: {
|
|
control: { type: 'select' },
|
|
options: ['primary', 'secondary', 'ghost', 'danger']
|
|
},
|
|
size: {
|
|
control: { type: 'select' },
|
|
options: ['small', 'medium', 'large']
|
|
},
|
|
disabled: {
|
|
control: 'boolean'
|
|
},
|
|
onclick: { action: 'clicked' }
|
|
}
|
|
}
|
|
|
|
export const Primary = {
|
|
args: {
|
|
variant: 'primary',
|
|
children: 'Primary Button'
|
|
}
|
|
}
|
|
|
|
export const Secondary = {
|
|
args: {
|
|
variant: 'secondary',
|
|
children: 'Secondary Button'
|
|
}
|
|
}
|
|
|
|
export const AllVariants = {
|
|
render: () => ({
|
|
Component: ButtonShowcase,
|
|
props: {}
|
|
})
|
|
}
|
|
```
|
|
|
|
#### Story Organization
|
|
|
|
```
|
|
src/stories/
|
|
├── admin/ # Admin interface components
|
|
│ ├── Button.stories.js
|
|
│ ├── Input.stories.js
|
|
│ ├── Modal.stories.js
|
|
│ └── forms/ # Form-specific components
|
|
│ ├── MediaInput.stories.js
|
|
│ ├── ImagePicker.stories.js
|
|
│ └── GalleryManager.stories.js
|
|
├── public/ # Public-facing components
|
|
│ ├── Header.stories.js
|
|
│ └── Footer.stories.js
|
|
└── examples/ # Complex examples and compositions
|
|
├── AdminDashboard.stories.js
|
|
└── MediaLibraryFlow.stories.js
|
|
```
|
|
|
|
## Implementation Plan
|
|
|
|
### Phase 1: Initial Setup (1-2 days)
|
|
|
|
1. **Install and Configure Storybook**
|
|
|
|
- Run `npx storybook@latest init`
|
|
- Configure Vite integration for SCSS and aliases
|
|
- Set up TypeScript support
|
|
- Configure preview with global styles
|
|
|
|
2. **Test Basic Setup**
|
|
- Create simple Button story
|
|
- Verify SCSS variables work
|
|
- Test hot reloading
|
|
|
|
### Phase 2: Core Component Stories (3-4 days)
|
|
|
|
1. **Basic UI Components**
|
|
|
|
- Button (all variants, states, sizes)
|
|
- Input (text, textarea, validation states)
|
|
- Modal (different sizes, content types)
|
|
- LoadingSpinner (different sizes)
|
|
|
|
2. **Form Components**
|
|
|
|
- MediaInput (single/multiple modes)
|
|
- ImagePicker (different aspect ratios)
|
|
- GalleryManager (with/without items)
|
|
|
|
3. **Complex Components**
|
|
- MediaLibraryModal (with mock data)
|
|
- DataTable (with sample data)
|
|
- AdminNavBar (active states)
|
|
|
|
### Phase 3: Advanced Features (2-3 days)
|
|
|
|
1. **Mock Data Setup**
|
|
|
|
- Create mock Media objects
|
|
- Set up API mocking for components that need data
|
|
- Create realistic test scenarios
|
|
|
|
2. **Accessibility Testing**
|
|
|
|
- Add @storybook/addon-a11y
|
|
- Test keyboard navigation
|
|
- Verify screen reader compatibility
|
|
|
|
3. **Visual Regression Testing**
|
|
- Set up Chromatic (optional)
|
|
- Create baseline screenshots
|
|
- Configure CI integration
|
|
|
|
### Phase 4: Documentation and Polish (1-2 days)
|
|
|
|
1. **Component Documentation**
|
|
|
|
- Add JSDoc comments to components
|
|
- Create usage examples
|
|
- Document props and events
|
|
|
|
2. **Design System Documentation**
|
|
- Color palette showcase
|
|
- Typography scale
|
|
- Spacing system
|
|
- Icon library
|
|
|
|
## Success Criteria
|
|
|
|
### Functional Requirements
|
|
|
|
- [ ] Storybook runs successfully with `npm run storybook`
|
|
- [ ] All existing components have basic stories
|
|
- [ ] SCSS variables and global styles work correctly
|
|
- [ ] Components render properly in isolation
|
|
- [ ] Hot reloading works for both component and story changes
|
|
- [ ] TypeScript support is fully functional
|
|
|
|
### Quality Requirements
|
|
|
|
- [ ] Stories cover all major component variants
|
|
- [ ] Interactive controls work for all props
|
|
- [ ] Actions are properly logged for events
|
|
- [ ] Accessibility addon reports no critical issues
|
|
- [ ] Components are responsive across viewport sizes
|
|
|
|
### Developer Experience Requirements
|
|
|
|
- [ ] Story creation is straightforward and documented
|
|
- [ ] Mock data is easily accessible and realistic
|
|
- [ ] Component API is clearly documented
|
|
- [ ] Common patterns have reusable templates
|
|
|
|
## Integration with Existing Workflow
|
|
|
|
### Development Workflow
|
|
|
|
1. **Component Development**: Start new components in Storybook
|
|
2. **Testing**: Test all states and edge cases in stories
|
|
3. **Documentation**: Stories serve as living documentation
|
|
4. **Review**: Use Storybook for design/code reviews
|
|
|
|
### Project Structure Integration
|
|
|
|
```
|
|
package.json # Add storybook scripts
|
|
├── "storybook": "storybook dev -p 6006"
|
|
├── "build-storybook": "storybook build"
|
|
|
|
.storybook/ # Storybook configuration
|
|
src/
|
|
├── lib/components/ # Existing components (unchanged)
|
|
├── stories/ # New: component stories
|
|
└── assets/styles/ # Existing styles (used by Storybook)
|
|
```
|
|
|
|
### Scripts and Commands
|
|
|
|
```json
|
|
{
|
|
"scripts": {
|
|
"dev": "vite dev",
|
|
"storybook": "storybook dev -p 6006",
|
|
"build-storybook": "storybook build",
|
|
"storybook:test": "test-storybook"
|
|
}
|
|
}
|
|
```
|
|
|
|
## Technical Considerations
|
|
|
|
### SCSS Integration
|
|
|
|
- Import global variables in Storybook preview
|
|
- Ensure component styles render correctly
|
|
- Test responsive breakpoints
|
|
|
|
### SvelteKit Compatibility
|
|
|
|
- Handle SvelteKit-specific imports (like `$app/stores`)
|
|
- Mock SvelteKit modules when needed
|
|
- Ensure aliases work in Storybook context
|
|
|
|
### TypeScript Support
|
|
|
|
- Configure proper type checking
|
|
- Use TypeScript for story definitions where beneficial
|
|
- Ensure IntelliSense works for story arguments
|
|
|
|
### Performance
|
|
|
|
- Optimize bundle size for faster story loading
|
|
- Use lazy loading for large story collections
|
|
- Configure appropriate caching
|
|
|
|
## Future Enhancements
|
|
|
|
### Advanced Testing
|
|
|
|
- **Visual Regression Testing**: Use Chromatic for automated visual testing
|
|
- **Interaction Testing**: Add @storybook/addon-interactions for user flow testing
|
|
- **Accessibility Automation**: Automated a11y testing in CI/CD
|
|
|
|
### Design System Evolution
|
|
|
|
- **Design Tokens**: Implement design tokens addon
|
|
- **Figma Integration**: Connect with Figma designs
|
|
- **Component Status**: Track component implementation status
|
|
|
|
### Collaboration Features
|
|
|
|
- **Published Storybook**: Deploy Storybook for team access
|
|
- **Design Review Process**: Use Storybook for design approvals
|
|
- **Documentation Site**: Evolve into full design system documentation
|
|
|
|
## Risks and Mitigation
|
|
|
|
### Technical Risks
|
|
|
|
- **Build Conflicts**: Vite configuration conflicts
|
|
- _Mitigation_: Careful configuration merging and testing
|
|
- **SCSS Import Issues**: Global styles not loading
|
|
- _Mitigation_: Test SCSS integration early in setup
|
|
|
|
### Workflow Risks
|
|
|
|
- **Adoption Resistance**: Team not using Storybook
|
|
- _Mitigation_: Start with high-value components, show immediate benefits
|
|
- **Maintenance Overhead**: Stories become outdated
|
|
- _Mitigation_: Include story updates in component change process
|
|
|
|
## Success Metrics
|
|
|
|
### Development Efficiency
|
|
|
|
- Reduced time to develop new components
|
|
- Faster iteration on component designs
|
|
- Fewer bugs in component edge cases
|
|
|
|
### Code Quality
|
|
|
|
- Better component API consistency
|
|
- Improved accessibility compliance
|
|
- More comprehensive component testing
|
|
|
|
### Team Collaboration
|
|
|
|
- Faster design review cycles
|
|
- Better communication between design and development
|
|
- More consistent component usage across the application
|
|
|
|
## Conclusion
|
|
|
|
Implementing Storybook will significantly improve our component development workflow, provide better documentation, and create a foundation for a mature design system. The investment in setup and story creation will pay dividends in development speed, component quality, and team collaboration.
|
|
|
|
The implementation should be done incrementally, starting with the most commonly used components and gradually expanding coverage. This approach minimizes risk while providing immediate value to the development process.
|