Files
dss/dss-mvp1/.storybook/preview.js
Digital Production Factory 276ed71f31 Initial commit: Clean DSS implementation
Migrated from design-system-swarm with fresh git history.
Old project history preserved in /home/overbits/apps/design-system-swarm

Core components:
- MCP Server (Python FastAPI with mcp 1.23.1)
- Claude Plugin (agents, commands, skills, strategies, hooks, core)
- DSS Backend (dss-mvp1 - token translation, Figma sync)
- Admin UI (Node.js/React)
- Server (Node.js/Express)
- Storybook integration (dss-mvp1/.storybook)

Self-contained configuration:
- All paths relative or use DSS_BASE_PATH=/home/overbits/dss
- PYTHONPATH configured for dss-mvp1 and dss-claude-plugin
- .env file with all configuration
- Claude plugin uses ${CLAUDE_PLUGIN_ROOT} for portability

Migration completed: $(date)
🤖 Clean migration with full functionality preserved
2025-12-09 18:45:48 -03:00

189 lines
5.4 KiB
JavaScript

/**
* Storybook Preview Configuration
*
* Integrates DSS design tokens into Storybook:
* - Applies tokens globally to all stories
* - Configures Storybook UI with DSS colors
* - Sets up theme switching with token variables
* - Enables component stories to use own design system
*/
// Import tokens generated from Figma
// These would be auto-generated via build process from token exporters
const DSSTokens = {
colors: {
primary: '#0066FF',
secondary: '#FF6B00',
success: '#00B600',
warning: '#FFB800',
danger: '#FF0000',
text: '#1A1A1A',
textLight: '#666666',
surface: '#FFFFFF',
background: '#F5F5F5',
border: '#E0E0E0',
},
spacing: {
xs: '4px',
sm: '8px',
md: '16px',
lg: '24px',
xl: '32px',
},
typography: {
headingFamily: "'Inter', sans-serif",
bodyFamily: "'Inter', sans-serif",
monospaceFamily: "'Courier New', monospace",
},
borderRadius: {
sm: '4px',
md: '8px',
lg: '12px',
full: '9999px',
},
shadows: {
sm: '0 1px 2px rgba(0, 0, 0, 0.05)',
md: '0 4px 6px rgba(0, 0, 0, 0.1)',
lg: '0 10px 15px rgba(0, 0, 0, 0.1)',
},
};
// Create Storybook theme using DSS tokens
const createStorybookTheme = () => ({
base: 'light',
colorPrimary: DSSTokens.colors.primary,
colorSecondary: DSSTokens.colors.secondary,
appBg: DSSTokens.colors.background,
appContentBg: DSSTokens.colors.surface,
appBorderColor: DSSTokens.colors.border,
appBorderRadius: parseInt(DSSTokens.borderRadius.md),
textColor: DSSTokens.colors.text,
textInverseColor: '#FFFFFF',
barTextColor: DSSTokens.colors.text,
barBg: DSSTokens.colors.surface,
barSelectedColor: DSSTokens.colors.primary,
barHoverColor: DSSTokens.colors.primary,
barBorderColor: DSSTokens.colors.border,
inputBg: '#FFFFFF',
inputBorder: DSSTokens.colors.border,
inputTextColor: DSSTokens.colors.text,
inputBorderRadius: parseInt(DSSTokens.borderRadius.md),
brandUrl: 'https://dss.overbits.luz.uy',
brandImage: '/dss-logo.svg',
brandTitle: 'DSS Design System',
});
// Register all CSS variables globally
const registerCSSVariables = () => {
const style = document.documentElement.style;
// Register color tokens
Object.entries(DSSTokens.colors).forEach(([name, value]) => {
style.setProperty(`--dss-color-${name}`, value);
});
// Register spacing tokens
Object.entries(DSSTokens.spacing).forEach(([name, value]) => {
style.setProperty(`--dss-spacing-${name}`, value);
});
// Register typography tokens
Object.entries(DSSTokens.typography).forEach(([name, value]) => {
style.setProperty(`--dss-typography-${name}`, value);
});
// Register border radius tokens
Object.entries(DSSTokens.borderRadius).forEach(([name, value]) => {
style.setProperty(`--dss-radius-${name}`, value);
});
// Register shadow tokens
Object.entries(DSSTokens.shadows).forEach(([name, value]) => {
style.setProperty(`--dss-shadow-${name}`, value);
});
};
// Export preview configuration
export const preview = {
parameters: {
// Apply DSS theme to Storybook UI
docs: {
theme: createStorybookTheme(),
},
// Configure viewport options
viewport: {
viewports: {
mobile: {
name: 'Mobile',
styles: { width: '375px', height: '812px' },
type: 'mobile',
},
tablet: {
name: 'Tablet',
styles: { width: '768px', height: '1024px' },
type: 'tablet',
},
desktop: {
name: 'Desktop',
styles: { width: '1280px', height: '720px' },
type: 'desktop',
},
},
},
// Setup backgrounds
backgrounds: {
default: 'light',
values: [
{ name: 'light', value: DSSTokens.colors.surface },
{ name: 'dark', value: '#1A1A1A' },
{ name: 'gray', value: DSSTokens.colors.background },
],
},
},
// Global decorator to apply DSS tokens to all stories
decorators: [
(Story, context) => {
// Register CSS variables
registerCSSVariables();
// Get the story content
const storyContent = Story();
// Create wrapper div with DSS token styles
const wrapper = document.createElement('div');
wrapper.style.cssText = `
--dss-primary: ${DSSTokens.colors.primary};
--dss-secondary: ${DSSTokens.colors.secondary};
--dss-text: ${DSSTokens.colors.text};
--dss-surface: ${DSSTokens.colors.surface};
--dss-background: ${DSSTokens.colors.background};
--dss-border: ${DSSTokens.colors.border};
--dss-spacing-base: ${DSSTokens.spacing.md};
--dss-font-body: ${DSSTokens.typography.bodyFamily};
--dss-font-heading: ${DSSTokens.typography.headingFamily};
--dss-radius: ${DSSTokens.borderRadius.md};
font-family: ${DSSTokens.typography.bodyFamily};
color: ${DSSTokens.colors.text};
background-color: ${DSSTokens.colors.surface};
padding: ${DSSTokens.spacing.lg};
`;
// Append story content to wrapper
if (typeof storyContent === 'string') {
wrapper.innerHTML = storyContent;
} else if (storyContent instanceof Node) {
wrapper.appendChild(storyContent);
}
return wrapper;
},
],
};
// Export Storybook theme (for use in stories)
export const dssTheme = createStorybookTheme();
// Export DSS tokens for use in stories
export const dssTokens = DSSTokens;