@tpitre/story-ui 2.2.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/.env.sample +82 -11
  2. package/README.md +89 -0
  3. package/dist/cli/deploy.d.ts +17 -0
  4. package/dist/cli/deploy.d.ts.map +1 -0
  5. package/dist/cli/deploy.js +696 -0
  6. package/dist/cli/index.d.ts +3 -0
  7. package/dist/cli/index.d.ts.map +1 -0
  8. package/dist/cli/index.js +26 -2
  9. package/dist/cli/setup.d.ts +11 -0
  10. package/dist/cli/setup.d.ts.map +1 -0
  11. package/dist/cli/setup.js +437 -110
  12. package/dist/mcp-server/index.d.ts +2 -0
  13. package/dist/mcp-server/index.d.ts.map +1 -0
  14. package/dist/mcp-server/index.js +120 -2
  15. package/dist/mcp-server/mcp-stdio-server.d.ts +3 -0
  16. package/dist/mcp-server/mcp-stdio-server.d.ts.map +1 -0
  17. package/dist/mcp-server/mcp-stdio-server.js +8 -1
  18. package/dist/mcp-server/routes/claude.d.ts +3 -0
  19. package/dist/mcp-server/routes/claude.d.ts.map +1 -0
  20. package/dist/mcp-server/routes/claude.js +60 -23
  21. package/dist/mcp-server/routes/components.d.ts +4 -0
  22. package/dist/mcp-server/routes/components.d.ts.map +1 -0
  23. package/dist/mcp-server/routes/frameworks.d.ts +38 -0
  24. package/dist/mcp-server/routes/frameworks.d.ts.map +1 -0
  25. package/dist/mcp-server/routes/frameworks.js +183 -0
  26. package/dist/mcp-server/routes/generateStory.d.ts +3 -0
  27. package/dist/mcp-server/routes/generateStory.d.ts.map +1 -0
  28. package/dist/mcp-server/routes/generateStory.js +160 -76
  29. package/dist/mcp-server/routes/generateStoryStream.d.ts +12 -0
  30. package/dist/mcp-server/routes/generateStoryStream.d.ts.map +1 -0
  31. package/dist/mcp-server/routes/generateStoryStream.js +947 -0
  32. package/dist/mcp-server/routes/hybridStories.d.ts +18 -0
  33. package/dist/mcp-server/routes/hybridStories.d.ts.map +1 -0
  34. package/dist/mcp-server/routes/mcpRemote.d.ts +14 -0
  35. package/dist/mcp-server/routes/mcpRemote.d.ts.map +1 -0
  36. package/dist/mcp-server/routes/mcpRemote.js +489 -0
  37. package/dist/mcp-server/routes/memoryStories.d.ts +26 -0
  38. package/dist/mcp-server/routes/memoryStories.d.ts.map +1 -0
  39. package/dist/mcp-server/routes/providers.d.ts +89 -0
  40. package/dist/mcp-server/routes/providers.d.ts.map +1 -0
  41. package/dist/mcp-server/routes/providers.js +369 -0
  42. package/dist/mcp-server/routes/storySync.d.ts +26 -0
  43. package/dist/mcp-server/routes/storySync.d.ts.map +1 -0
  44. package/dist/mcp-server/routes/streamTypes.d.ts +110 -0
  45. package/dist/mcp-server/routes/streamTypes.d.ts.map +1 -0
  46. package/dist/mcp-server/routes/streamTypes.js +18 -0
  47. package/dist/mcp-server/sessionManager.d.ts +50 -0
  48. package/dist/mcp-server/sessionManager.d.ts.map +1 -0
  49. package/dist/story-generator/componentBlacklist.d.ts +21 -0
  50. package/dist/story-generator/componentBlacklist.d.ts.map +1 -0
  51. package/dist/story-generator/componentDiscovery.d.ts +28 -0
  52. package/dist/story-generator/componentDiscovery.d.ts.map +1 -0
  53. package/dist/story-generator/componentRegistryGenerator.d.ts +49 -0
  54. package/dist/story-generator/componentRegistryGenerator.d.ts.map +1 -0
  55. package/dist/story-generator/componentRegistryGenerator.js +205 -0
  56. package/dist/story-generator/configLoader.d.ts +33 -0
  57. package/dist/story-generator/configLoader.d.ts.map +1 -0
  58. package/dist/story-generator/considerationsLoader.d.ts +32 -0
  59. package/dist/story-generator/considerationsLoader.d.ts.map +1 -0
  60. package/dist/story-generator/documentation-sources.d.ts +28 -0
  61. package/dist/story-generator/documentation-sources.d.ts.map +1 -0
  62. package/dist/story-generator/documentationLoader.d.ts +64 -0
  63. package/dist/story-generator/documentationLoader.d.ts.map +1 -0
  64. package/dist/story-generator/dynamicPackageDiscovery.d.ts +97 -0
  65. package/dist/story-generator/dynamicPackageDiscovery.d.ts.map +1 -0
  66. package/dist/story-generator/enhancedComponentDiscovery.d.ts +125 -0
  67. package/dist/story-generator/enhancedComponentDiscovery.d.ts.map +1 -0
  68. package/dist/story-generator/enhancedComponentDiscovery.js +111 -11
  69. package/dist/story-generator/framework-adapters/angular-adapter.d.ts +40 -0
  70. package/dist/story-generator/framework-adapters/angular-adapter.d.ts.map +1 -0
  71. package/dist/story-generator/framework-adapters/angular-adapter.js +427 -0
  72. package/dist/story-generator/framework-adapters/base-adapter.d.ts +75 -0
  73. package/dist/story-generator/framework-adapters/base-adapter.d.ts.map +1 -0
  74. package/dist/story-generator/framework-adapters/base-adapter.js +147 -0
  75. package/dist/story-generator/framework-adapters/framework-detector.d.ts +55 -0
  76. package/dist/story-generator/framework-adapters/framework-detector.d.ts.map +1 -0
  77. package/dist/story-generator/framework-adapters/framework-detector.js +323 -0
  78. package/dist/story-generator/framework-adapters/index.d.ts +97 -0
  79. package/dist/story-generator/framework-adapters/index.d.ts.map +1 -0
  80. package/dist/story-generator/framework-adapters/index.js +198 -0
  81. package/dist/story-generator/framework-adapters/react-adapter.d.ts +40 -0
  82. package/dist/story-generator/framework-adapters/react-adapter.d.ts.map +1 -0
  83. package/dist/story-generator/framework-adapters/react-adapter.js +316 -0
  84. package/dist/story-generator/framework-adapters/svelte-adapter.d.ts +40 -0
  85. package/dist/story-generator/framework-adapters/svelte-adapter.d.ts.map +1 -0
  86. package/dist/story-generator/framework-adapters/svelte-adapter.js +372 -0
  87. package/dist/story-generator/framework-adapters/types.d.ts +182 -0
  88. package/dist/story-generator/framework-adapters/types.d.ts.map +1 -0
  89. package/dist/story-generator/framework-adapters/types.js +8 -0
  90. package/dist/story-generator/framework-adapters/vue-adapter.d.ts +36 -0
  91. package/dist/story-generator/framework-adapters/vue-adapter.d.ts.map +1 -0
  92. package/dist/story-generator/framework-adapters/vue-adapter.js +336 -0
  93. package/dist/story-generator/framework-adapters/web-components-adapter.d.ts +54 -0
  94. package/dist/story-generator/framework-adapters/web-components-adapter.d.ts.map +1 -0
  95. package/dist/story-generator/framework-adapters/web-components-adapter.js +387 -0
  96. package/dist/story-generator/generateStory.d.ts +7 -0
  97. package/dist/story-generator/generateStory.d.ts.map +1 -0
  98. package/dist/story-generator/gitignoreManager.d.ts +50 -0
  99. package/dist/story-generator/gitignoreManager.d.ts.map +1 -0
  100. package/dist/story-generator/imageProcessor.d.ts +80 -0
  101. package/dist/story-generator/imageProcessor.d.ts.map +1 -0
  102. package/dist/story-generator/imageProcessor.js +391 -0
  103. package/dist/story-generator/inMemoryStoryService.d.ts +89 -0
  104. package/dist/story-generator/inMemoryStoryService.d.ts.map +1 -0
  105. package/dist/story-generator/llm-providers/base-provider.d.ts +36 -0
  106. package/dist/story-generator/llm-providers/base-provider.d.ts.map +1 -0
  107. package/dist/story-generator/llm-providers/base-provider.js +135 -0
  108. package/dist/story-generator/llm-providers/claude-provider.d.ts +23 -0
  109. package/dist/story-generator/llm-providers/claude-provider.d.ts.map +1 -0
  110. package/dist/story-generator/llm-providers/claude-provider.js +414 -0
  111. package/dist/story-generator/llm-providers/gemini-provider.d.ts +24 -0
  112. package/dist/story-generator/llm-providers/gemini-provider.d.ts.map +1 -0
  113. package/dist/story-generator/llm-providers/gemini-provider.js +406 -0
  114. package/dist/story-generator/llm-providers/index.d.ts +63 -0
  115. package/dist/story-generator/llm-providers/index.d.ts.map +1 -0
  116. package/dist/story-generator/llm-providers/index.js +169 -0
  117. package/dist/story-generator/llm-providers/openai-provider.d.ts +24 -0
  118. package/dist/story-generator/llm-providers/openai-provider.d.ts.map +1 -0
  119. package/dist/story-generator/llm-providers/openai-provider.js +458 -0
  120. package/dist/story-generator/llm-providers/settings-manager.d.ts +75 -0
  121. package/dist/story-generator/llm-providers/settings-manager.d.ts.map +1 -0
  122. package/dist/story-generator/llm-providers/settings-manager.js +173 -0
  123. package/dist/story-generator/llm-providers/story-llm-service.d.ts +79 -0
  124. package/dist/story-generator/llm-providers/story-llm-service.d.ts.map +1 -0
  125. package/dist/story-generator/llm-providers/story-llm-service.js +240 -0
  126. package/dist/story-generator/llm-providers/types.d.ts +153 -0
  127. package/dist/story-generator/llm-providers/types.d.ts.map +1 -0
  128. package/dist/story-generator/llm-providers/types.js +8 -0
  129. package/dist/story-generator/logger.d.ts +14 -0
  130. package/dist/story-generator/logger.d.ts.map +1 -0
  131. package/dist/story-generator/logger.js +96 -29
  132. package/dist/story-generator/postProcessStory.d.ts +6 -0
  133. package/dist/story-generator/postProcessStory.d.ts.map +1 -0
  134. package/dist/story-generator/productionGitignoreManager.d.ts +91 -0
  135. package/dist/story-generator/productionGitignoreManager.d.ts.map +1 -0
  136. package/dist/story-generator/promptGenerator.d.ts +48 -0
  137. package/dist/story-generator/promptGenerator.d.ts.map +1 -0
  138. package/dist/story-generator/promptGenerator.js +186 -1
  139. package/dist/story-generator/storyHistory.d.ts +44 -0
  140. package/dist/story-generator/storyHistory.d.ts.map +1 -0
  141. package/dist/story-generator/storySync.d.ts +68 -0
  142. package/dist/story-generator/storySync.d.ts.map +1 -0
  143. package/dist/story-generator/storyTracker.d.ts +48 -0
  144. package/dist/story-generator/storyTracker.d.ts.map +1 -0
  145. package/dist/story-generator/storyValidator.d.ts +6 -0
  146. package/dist/story-generator/storyValidator.d.ts.map +1 -0
  147. package/dist/story-generator/universalDesignSystemAdapter.d.ts +68 -0
  148. package/dist/story-generator/universalDesignSystemAdapter.d.ts.map +1 -0
  149. package/dist/story-generator/universalDesignSystemAdapter.js +138 -1
  150. package/dist/story-generator/urlRedirectService.d.ts +21 -0
  151. package/dist/story-generator/urlRedirectService.d.ts.map +1 -0
  152. package/dist/story-generator/validateStory.d.ts +19 -0
  153. package/dist/story-generator/validateStory.d.ts.map +1 -0
  154. package/dist/story-generator/validateStory.js +6 -2
  155. package/dist/story-generator/visionPrompts.d.ts +88 -0
  156. package/dist/story-generator/visionPrompts.d.ts.map +1 -0
  157. package/dist/story-generator/visionPrompts.js +462 -0
  158. package/dist/story-ui.config.d.ts +78 -0
  159. package/dist/story-ui.config.d.ts.map +1 -0
  160. package/dist/templates/StoryUI/StoryUIPanel.d.ts +4 -0
  161. package/dist/templates/StoryUI/StoryUIPanel.d.ts.map +1 -0
  162. package/dist/templates/StoryUI/StoryUIPanel.js +1874 -0
  163. package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts +18 -0
  164. package/dist/templates/StoryUI/StoryUIPanel.stories.d.ts.map +1 -0
  165. package/dist/templates/StoryUI/StoryUIPanel.stories.js +37 -0
  166. package/dist/templates/StoryUI/index.d.ts +3 -0
  167. package/dist/templates/StoryUI/index.d.ts.map +1 -0
  168. package/dist/templates/StoryUI/index.js +2 -0
  169. package/package.json +17 -3
  170. package/templates/StoryUI/StoryUIPanel.tsx +1960 -384
  171. package/templates/StoryUI/index.tsx +1 -1
  172. package/templates/StoryUI/manager.tsx +264 -0
  173. package/templates/production-app/.env.example +11 -0
  174. package/templates/production-app/index.html +66 -0
  175. package/templates/production-app/package.json +30 -0
  176. package/templates/production-app/public/favicon.svg +5 -0
  177. package/templates/production-app/src/App.tsx +1560 -0
  178. package/templates/production-app/src/LivePreviewRenderer.tsx +420 -0
  179. package/templates/production-app/src/componentRegistry.ts +315 -0
  180. package/templates/production-app/src/considerations.ts +16 -0
  181. package/templates/production-app/src/index.css +284 -0
  182. package/templates/production-app/src/main.tsx +25 -0
  183. package/templates/production-app/tsconfig.json +32 -0
  184. package/templates/production-app/tsconfig.node.json +11 -0
  185. package/templates/production-app/vite.config.ts +83 -0
  186. package/templates/react-import-rule.json +2 -2
  187. package/dist/index.js +0 -12
  188. package/dist/story-ui.config.loader.js +0 -205
@@ -0,0 +1,462 @@
1
+ /**
2
+ * Vision Prompts Module
3
+ *
4
+ * Provides specialized prompt templates for image-to-story generation using vision-capable LLMs.
5
+ * These prompts guide the AI to analyze UI screenshots, design mockups, and component layouts,
6
+ * then generate accurate Storybook CSF 3.0 stories.
7
+ *
8
+ * Critical Success Factors:
9
+ * - Precise visual-to-code mapping instructions
10
+ * - Explicit output format requirements
11
+ * - Edge case handling (unclear images, partial views)
12
+ * - Framework and design system awareness
13
+ */
14
+ /**
15
+ * Vision prompt types for different image analysis scenarios
16
+ */
17
+ export var VisionPromptType;
18
+ (function (VisionPromptType) {
19
+ /** Convert a UI screenshot to a complete Storybook story */
20
+ VisionPromptType["SCREENSHOT_TO_STORY"] = "screenshot_to_story";
21
+ /** Convert a design mockup (Figma, Sketch, etc.) to a story */
22
+ VisionPromptType["DESIGN_TO_STORY"] = "design_to_story";
23
+ /** Analyze and identify components present in an image */
24
+ VisionPromptType["COMPONENT_ANALYSIS"] = "component_analysis";
25
+ /** Analyze layout structure, spacing, and responsive behavior */
26
+ VisionPromptType["LAYOUT_ANALYSIS"] = "layout_analysis";
27
+ })(VisionPromptType || (VisionPromptType = {}));
28
+ /**
29
+ * Generate system prompt for vision-based story generation
30
+ *
31
+ * This prompt establishes the AI's role, capabilities, and expected output format.
32
+ * It's crucial for consistent, high-quality story generation from images.
33
+ */
34
+ export function getVisionSystemPrompt(type, availableComponents) {
35
+ const baseInstructions = `You are an expert UI/UX engineer specializing in converting visual designs into production-ready Storybook stories. Your task is to analyze the provided image and generate accurate, well-structured Storybook Component Story Format (CSF) 3.0 code.
36
+
37
+ ## Core Capabilities
38
+
39
+ 1. **Visual Analysis**: Precisely identify UI components, layout patterns, spacing, colors, typography, and interactive states
40
+ 2. **Component Mapping**: Match visual elements to appropriate component implementations
41
+ 3. **Code Generation**: Produce valid, type-safe Storybook stories following CSF 3.0 standards
42
+ 4. **Best Practices**: Apply accessibility, responsive design, and component composition patterns
43
+
44
+ ## Critical Requirements
45
+
46
+ ### Output Format
47
+ - Generate ONLY valid Storybook CSF 3.0 code
48
+ - Use TypeScript interfaces for prop types
49
+ - Include meta export with component metadata
50
+ - Create multiple story variants when appropriate (Default, variants, states)
51
+ - Add JSDoc comments for complex props or logic
52
+
53
+ ### Code Quality Standards
54
+ - Type-safe: All props must have explicit types
55
+ - Semantic: Use meaningful variable and story names
56
+ - Accessible: Include ARIA labels and roles where needed
57
+ - Maintainable: Clear structure with proper imports
58
+ - DRY: Extract common patterns into reusable configurations
59
+
60
+ ### Visual Fidelity
61
+ - Match spacing and layout precisely (use exact px/rem values when clear)
62
+ - Preserve color schemes (use hex/rgb values or design token references)
63
+ - Replicate typography hierarchy (font sizes, weights, line heights)
64
+ - Maintain responsive behavior patterns
65
+ - Capture interactive states (hover, focus, active, disabled)`;
66
+ const componentGuidance = availableComponents && availableComponents.length > 0
67
+ ? `\n\n## Available Components\n\nYou have access to these pre-built components:\n${availableComponents.map(c => `- ${c}`).join('\n')}\n\n**IMPORTANT**: Prefer using these existing components over creating custom implementations. If a visual element matches one of these components, use it directly. Only suggest custom components if no suitable match exists.`
68
+ : '';
69
+ const typeSpecificInstructions = getTypeSpecificSystemInstructions(type);
70
+ return `${baseInstructions}${componentGuidance}\n\n${typeSpecificInstructions}`;
71
+ }
72
+ /**
73
+ * Get type-specific system instructions for different analysis modes
74
+ */
75
+ function getTypeSpecificSystemInstructions(type) {
76
+ switch (type) {
77
+ case VisionPromptType.SCREENSHOT_TO_STORY:
78
+ return `## Screenshot-to-Story Mode
79
+
80
+ You are analyzing a screenshot of an existing UI implementation. Your goal is to recreate it as a Storybook story.
81
+
82
+ ### Analysis Checklist
83
+
84
+ 1. **Component Identification**
85
+ - What is the primary component being displayed?
86
+ - Are there nested child components?
87
+ - What are the component boundaries?
88
+
89
+ 2. **Props and Configuration**
90
+ - What props are being used? (text content, icons, images, etc.)
91
+ - What variants or states are visible? (size, color, disabled, etc.)
92
+ - Are there event handlers needed? (onClick, onChange, etc.)
93
+
94
+ 3. **Layout and Styling**
95
+ - Container dimensions and constraints
96
+ - Spacing between elements (margin, padding, gap)
97
+ - Alignment and positioning (flexbox, grid patterns)
98
+ - Responsive breakpoint behaviors (if visible)
99
+
100
+ 4. **Content and Data**
101
+ - Static text content
102
+ - Dynamic data patterns (lists, tables, forms)
103
+ - Placeholder vs. real content
104
+
105
+ 5. **Edge Cases to Handle**
106
+ - If the screenshot is partial, note what's visible vs. inferred
107
+ - If image quality is poor, indicate assumptions made
108
+ - If multiple components overlap, suggest the component hierarchy
109
+
110
+ ### Output Structure
111
+
112
+ Generate a complete .stories.tsx file with:
113
+ 1. Imports (React, component, types)
114
+ 2. Meta export with title, component, tags, and argTypes
115
+ 3. Default story showing the exact screenshot state
116
+ 4. Additional stories for variants/states if they're inferable
117
+ 5. Inline comments explaining non-obvious decisions`;
118
+ case VisionPromptType.DESIGN_TO_STORY:
119
+ return `## Design-to-Story Mode
120
+
121
+ You are analyzing a design mockup (from Figma, Sketch, etc.) that needs to be implemented as a Storybook story.
122
+
123
+ ### Design Analysis Approach
124
+
125
+ 1. **Design Intent vs. Implementation**
126
+ - Identify the designer's intent (not just pixel-perfect copying)
127
+ - Recognize standard UI patterns and components
128
+ - Distinguish decorative elements from functional ones
129
+
130
+ 2. **Component Architecture**
131
+ - How should this design be broken into components?
132
+ - Which parts should be props vs. composition?
133
+ - What component variants are needed?
134
+
135
+ 3. **Design System Alignment**
136
+ - Does this match existing design system patterns?
137
+ - Are there custom elements that need new components?
138
+ - Can we use composition of existing components?
139
+
140
+ 4. **Responsive Considerations**
141
+ - What breakpoints are implied by the design?
142
+ - How should content reflow on smaller screens?
143
+ - Are there mobile-specific design variations?
144
+
145
+ 5. **State Management**
146
+ - What interactive states exist? (hover, active, focus, disabled, loading, error)
147
+ - Are there animations or transitions?
148
+ - What user interactions are expected?
149
+
150
+ ### Design Mockup Specifics
151
+
152
+ - **Annotations**: Look for design specs (spacing, colors, fonts) in the image
153
+ - **Redlines**: Note any measurement indicators or spacing guides
154
+ - **Style Guide**: Reference any visible design tokens or style definitions
155
+ - **Multiple Artboards**: If multiple screens/states are visible, create separate stories
156
+
157
+ ### Output Approach
158
+
159
+ 1. Start with component structure and hierarchy
160
+ 2. Map visual styles to CSS/styled-components/CSS-in-JS
161
+ 3. Define prop interfaces that enable design flexibility
162
+ 4. Create stories for each design variant shown
163
+ 5. Add notes about implementation assumptions or questions`;
164
+ case VisionPromptType.COMPONENT_ANALYSIS:
165
+ return `## Component Analysis Mode
166
+
167
+ You are performing a detailed component inventory analysis of the UI shown in the image.
168
+
169
+ ### Analysis Objectives
170
+
171
+ 1. **Component Catalog**
172
+ - Identify every distinct UI component
173
+ - Classify by type (button, input, card, modal, etc.)
174
+ - Note component instances vs. unique components
175
+
176
+ 2. **Component Characteristics**
177
+ - Props and configurations for each component
178
+ - Variants observed (sizes, colors, states)
179
+ - Nested component relationships
180
+
181
+ 3. **Hierarchy and Composition**
182
+ - Parent-child relationships
183
+ - Container components vs. presentational components
184
+ - Composition patterns (slots, render props, etc.)
185
+
186
+ 4. **Reusability Assessment**
187
+ - Which components are reusable primitives?
188
+ - Which are specialized/composite components?
189
+ - What components could be shared across the app?
190
+
191
+ ### Output Format
192
+
193
+ Provide a structured analysis:
194
+
195
+ \`\`\`typescript
196
+ // Component Inventory Analysis
197
+
198
+ interface ComponentAnalysis {
199
+ components: {
200
+ name: string; // Suggested component name
201
+ type: string; // Component category
202
+ instances: number; // How many times it appears
203
+ props: Record<string, any>; // Observed props/config
204
+ variants: string[]; // Different variants seen
205
+ location: string; // Where in the UI hierarchy
206
+ notes: string; // Implementation notes
207
+ }[];
208
+
209
+ hierarchy: {
210
+ component: string;
211
+ children: string[];
212
+ }[];
213
+
214
+ recommendations: string[]; // Suggestions for component structure
215
+ }
216
+ \`\`\`
217
+
218
+ Then provide the analysis object with detailed observations.`;
219
+ case VisionPromptType.LAYOUT_ANALYSIS:
220
+ return `## Layout Analysis Mode
221
+
222
+ You are analyzing the structural layout, spacing system, and responsive patterns in the UI.
223
+
224
+ ### Layout Analysis Dimensions
225
+
226
+ 1. **Container Structure**
227
+ - Root container type (full-width, max-width, centered)
228
+ - Main layout pattern (single column, grid, sidebar, dashboard)
229
+ - Section divisions and boundaries
230
+
231
+ 2. **Spacing System**
232
+ - Consistent spacing units (4px, 8px, 16px scale?)
233
+ - Margin patterns between sections
234
+ - Padding within containers
235
+ - Gap between grid/flex items
236
+
237
+ 3. **Grid and Alignment**
238
+ - Grid structure (12-column, custom?)
239
+ - Column widths and gutters
240
+ - Alignment patterns (start, center, end, stretch)
241
+ - Vertical rhythm and baseline grid
242
+
243
+ 4. **Responsive Behavior**
244
+ - Breakpoint thresholds (mobile, tablet, desktop)
245
+ - Content reflow patterns
246
+ - Component stacking order on mobile
247
+ - Hidden/shown elements per breakpoint
248
+
249
+ 5. **Z-Index and Layering**
250
+ - Element stacking order
251
+ - Overlays and modals
252
+ - Sticky/fixed positioning
253
+ - Dropdown and menu layers
254
+
255
+ ### Output Structure
256
+
257
+ Provide CSS/styled-components code showing:
258
+
259
+ 1. Container and wrapper styles
260
+ 2. Layout primitives (Box, Stack, Grid, Flex)
261
+ 3. Spacing constants and design tokens
262
+ 4. Responsive breakpoint configurations
263
+ 5. Example component using these layout patterns
264
+
265
+ Include comments explaining the layout decisions and how they create the observed visual structure.`;
266
+ default:
267
+ return '';
268
+ }
269
+ }
270
+ /**
271
+ * Generate user prompt to accompany the image
272
+ *
273
+ * This is the direct instruction sent with the image to the LLM.
274
+ */
275
+ export function getVisionUserPrompt(type, additionalContext) {
276
+ const contextSection = additionalContext
277
+ ? `\n\n## Additional Context\n${additionalContext}\n`
278
+ : '';
279
+ switch (type) {
280
+ case VisionPromptType.SCREENSHOT_TO_STORY:
281
+ return `Please analyze the attached screenshot and generate a complete Storybook story that recreates this UI exactly.
282
+
283
+ **Your Task:**
284
+ 1. Identify the main component and all sub-components visible
285
+ 2. Determine the props and configuration used
286
+ 3. Generate a complete .stories.tsx file in CSF 3.0 format
287
+ 4. Include the default story matching the screenshot
288
+ 5. Add variant stories if you can infer other states
289
+
290
+ **Important:**
291
+ - Be precise about spacing, colors, and typography
292
+ - If you can't determine exact values, use reasonable defaults and add a comment
293
+ - If the screenshot is partial or unclear, note your assumptions
294
+ - Generate production-ready, type-safe code${contextSection}
295
+
296
+ **Output:** A complete, runnable .stories.tsx file with all necessary imports and exports.`;
297
+ case VisionPromptType.DESIGN_TO_STORY:
298
+ return `Please analyze the attached design mockup and generate a Storybook story implementation.
299
+
300
+ **Your Task:**
301
+ 1. Understand the design intent and component structure
302
+ 2. Map visual elements to appropriate component patterns
303
+ 3. Extract design tokens (colors, spacing, typography)
304
+ 4. Generate a complete .stories.tsx file in CSF 3.0 format
305
+ 5. Create stories for all design variants shown
306
+
307
+ **Important:**
308
+ - Focus on design intent, not just pixel-perfect copying
309
+ - Use semantic component names that reflect purpose
310
+ - Leverage design system components when possible
311
+ - Consider responsive behavior and state variations
312
+ - Note any assumptions about interactions or behaviors${contextSection}
313
+
314
+ **Output:** A complete, runnable .stories.tsx file that faithfully implements the design.`;
315
+ case VisionPromptType.COMPONENT_ANALYSIS:
316
+ return `Please analyze the attached image and provide a detailed component inventory.
317
+
318
+ **Your Task:**
319
+ 1. Identify every distinct UI component in the image
320
+ 2. Classify components by type and purpose
321
+ 3. Note all variants and states observed
322
+ 4. Map out the component hierarchy
323
+ 5. Provide recommendations for component structure
324
+
325
+ **Important:**
326
+ - Be thorough - catalog every button, input, icon, card, etc.
327
+ - Distinguish between component instances and unique components
328
+ - Identify composition patterns and reusable primitives
329
+ - Suggest how components should be organized${contextSection}
330
+
331
+ **Output:** A structured ComponentAnalysis object (see system prompt for format) with detailed observations.`;
332
+ case VisionPromptType.LAYOUT_ANALYSIS:
333
+ return `Please analyze the layout structure and spacing system in the attached image.
334
+
335
+ **Your Task:**
336
+ 1. Identify the overall layout pattern and container structure
337
+ 2. Measure and document the spacing system
338
+ 3. Analyze grid/flex patterns and alignment
339
+ 4. Infer responsive behavior and breakpoints
340
+ 5. Generate layout code showing the structure
341
+
342
+ **Important:**
343
+ - Be precise about spacing values (try to identify consistent units)
344
+ - Document the grid system or layout primitives
345
+ - Note any responsive patterns or breakpoint behaviors
346
+ - Explain how the layout creates the visual hierarchy${contextSection}
347
+
348
+ **Output:** Layout code (CSS/styled-components) with detailed comments explaining the spatial relationships.`;
349
+ default:
350
+ return 'Please analyze the attached image.';
351
+ }
352
+ }
353
+ /**
354
+ * Build a complete vision-aware prompt combining system and user prompts
355
+ *
356
+ * This is the main entry point for generating vision prompts with full context.
357
+ */
358
+ export function buildVisionAwarePrompt(options) {
359
+ const { promptType, userDescription, availableComponents, framework = 'react', designSystem, additionalContext, } = options;
360
+ // Build framework and design system context
361
+ let enhancedContext = additionalContext || '';
362
+ if (framework) {
363
+ enhancedContext += `\n\n**Target Framework:** ${framework}`;
364
+ enhancedContext += `\n- Generate ${framework}-specific code and patterns`;
365
+ enhancedContext += `\n- Use ${framework} conventions for component structure`;
366
+ }
367
+ if (designSystem) {
368
+ enhancedContext += `\n\n**Design System:** ${designSystem}`;
369
+ enhancedContext += `\n- Use ${designSystem} components and patterns`;
370
+ enhancedContext += `\n- Reference ${designSystem} design tokens when applicable`;
371
+ enhancedContext += `\n- Follow ${designSystem} best practices and composition patterns`;
372
+ }
373
+ if (userDescription) {
374
+ enhancedContext += `\n\n**User Request:**\n${userDescription}`;
375
+ }
376
+ // Generate system prompt with component context
377
+ const systemPrompt = getVisionSystemPrompt(promptType, availableComponents);
378
+ // Generate user prompt with enhanced context
379
+ const userPrompt = getVisionUserPrompt(promptType, enhancedContext);
380
+ return {
381
+ systemPrompt,
382
+ userPrompt,
383
+ };
384
+ }
385
+ /**
386
+ * Helper function to validate image input for vision analysis
387
+ *
388
+ * Checks that the image is in a supported format and provides guidance if not.
389
+ */
390
+ export function validateImageInput(imagePath) {
391
+ const supportedExtensions = ['.png', '.jpg', '.jpeg', '.webp', '.gif'];
392
+ const extension = imagePath.toLowerCase().substring(imagePath.lastIndexOf('.'));
393
+ if (!supportedExtensions.includes(extension)) {
394
+ return {
395
+ valid: false,
396
+ error: `Unsupported image format: ${extension}`,
397
+ suggestions: [
398
+ 'Convert the image to PNG, JPG, or WebP format',
399
+ 'Ensure the image file has a valid extension',
400
+ `Supported formats: ${supportedExtensions.join(', ')}`,
401
+ ],
402
+ };
403
+ }
404
+ return { valid: true };
405
+ }
406
+ /**
407
+ * Helper function to suggest optimal image quality for vision analysis
408
+ */
409
+ export function getImageQualityGuidelines() {
410
+ return [
411
+ 'Resolution: Minimum 800x600px, optimal 1920x1080px or higher',
412
+ 'Clarity: Ensure text is readable and UI elements are clearly visible',
413
+ 'Cropping: Include the full component/layout, avoid cutting off edges',
414
+ 'Format: PNG for UI screenshots (lossless), JPG for photos (compressed)',
415
+ 'Size: Under 20MB for best performance',
416
+ 'Color: Use sRGB color space for accurate color representation',
417
+ 'Zoom: Capture at 100% zoom level, not zoomed in or out',
418
+ 'Annotations: Include design specs/measurements if available',
419
+ ];
420
+ }
421
+ /**
422
+ * Extract framework-specific import patterns for generated stories
423
+ */
424
+ export function getFrameworkImports(framework) {
425
+ const imports = {
426
+ react: `import React from 'react';
427
+ import type { Meta, StoryObj } from '@storybook/react';`,
428
+ vue: `import type { Meta, StoryObj } from '@storybook/vue3';`,
429
+ angular: `import type { Meta, StoryObj } from '@storybook/angular';`,
430
+ svelte: `import type { Meta, StoryObj } from '@storybook/svelte';`,
431
+ 'web-components': `import type { Meta, StoryObj } from '@storybook/web-components';`,
432
+ };
433
+ return imports[framework.toLowerCase()] || imports.react;
434
+ }
435
+ /**
436
+ * Get design system specific import hints
437
+ */
438
+ export function getDesignSystemImports(designSystem) {
439
+ const imports = {
440
+ 'chakra-ui': [
441
+ "import { ChakraProvider } from '@chakra-ui/react';",
442
+ "// Wrap stories in ChakraProvider if needed",
443
+ ],
444
+ 'mantine': [
445
+ "import { MantineProvider } from '@mantine/core';",
446
+ "// Wrap stories in MantineProvider if needed",
447
+ ],
448
+ 'material-ui': [
449
+ "import { ThemeProvider } from '@mui/material/styles';",
450
+ "// Wrap stories in ThemeProvider if needed",
451
+ ],
452
+ 'ant-design': [
453
+ "import { ConfigProvider } from 'antd';",
454
+ "// Wrap stories in ConfigProvider if needed",
455
+ ],
456
+ 'tailwind': [
457
+ "// Ensure Tailwind CSS is imported in your Storybook preview",
458
+ "// import '../styles/globals.css';",
459
+ ],
460
+ };
461
+ return imports[designSystem.toLowerCase()] || [];
462
+ }
@@ -0,0 +1,78 @@
1
+ export interface ComponentConfig {
2
+ name: string;
3
+ displayName?: string;
4
+ importPath?: string;
5
+ props?: string[];
6
+ examples?: string[];
7
+ description?: string;
8
+ category?: 'layout' | 'content' | 'form' | 'navigation' | 'feedback' | 'other';
9
+ slots?: string[];
10
+ }
11
+ export interface LayoutRules {
12
+ multiColumnWrapper: string;
13
+ columnComponent: string;
14
+ containerComponent?: string;
15
+ layoutExamples?: {
16
+ twoColumn?: string;
17
+ threeColumn?: string;
18
+ [key: string]: string | undefined;
19
+ };
20
+ prohibitedElements?: string[];
21
+ }
22
+ export interface AdditionalImport {
23
+ path: string;
24
+ components: string[];
25
+ }
26
+ export interface DesignSystemGuidelines {
27
+ name: string;
28
+ preferredComponents?: {
29
+ [category: string]: string;
30
+ };
31
+ spacingTokens?: {
32
+ prefix: string;
33
+ values: string[];
34
+ };
35
+ colorTokens?: {
36
+ prefix: string;
37
+ categories: string[];
38
+ };
39
+ prohibitedPatterns?: {
40
+ cssFrameworks?: string[];
41
+ classNamePatterns?: string[];
42
+ inlineStyles?: string[];
43
+ };
44
+ enforcementRules?: {
45
+ requireDesignTokens?: boolean;
46
+ prohibitArbitraryValues?: boolean;
47
+ enforceComponentLibrary?: boolean;
48
+ };
49
+ /** Additional notes/guidelines for AI story generation (e.g., shadcn-specific instructions) */
50
+ additionalNotes?: string;
51
+ }
52
+ export interface StoryUIConfig {
53
+ generatedStoriesPath: string;
54
+ componentsPath?: string;
55
+ componentsMetadataPath?: string;
56
+ storyPrefix: string;
57
+ defaultAuthor: string;
58
+ importPath: string;
59
+ componentPrefix: string;
60
+ /** Framework type for story generation (e.g., 'react', 'web-components', 'angular', 'vue', 'svelte') */
61
+ framework?: string;
62
+ components: ComponentConfig[];
63
+ layoutComponents?: ComponentConfig[];
64
+ layoutRules: LayoutRules;
65
+ sampleStory: string;
66
+ systemPrompt?: string;
67
+ layoutInstructions?: string[];
68
+ examples?: string[];
69
+ additionalImports?: AdditionalImport[];
70
+ considerationsPath?: string;
71
+ storybookFramework?: string;
72
+ designSystemGuidelines?: DesignSystemGuidelines;
73
+ }
74
+ export declare const DEFAULT_CONFIG: StoryUIConfig;
75
+ export declare const GENERIC_CONFIG_TEMPLATE: Partial<StoryUIConfig>;
76
+ export declare const STORY_UI_CONFIG: StoryUIConfig;
77
+ export declare function createStoryUIConfig(userConfig: Partial<StoryUIConfig>): StoryUIConfig;
78
+ //# sourceMappingURL=story-ui.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"story-ui.config.d.ts","sourceRoot":"","sources":["../story-ui.config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ declare function StoryUIPanel(): import("react/jsx-runtime").JSX.Element;
2
+ export default StoryUIPanel;
3
+ export { StoryUIPanel };
4
+ //# sourceMappingURL=StoryUIPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StoryUIPanel.d.ts","sourceRoot":"","sources":["../../../templates/StoryUI/StoryUIPanel.tsx"],"names":[],"mappings":"AAs4CA,iBAAS,YAAY,4CAqsCpB;AAED,eAAe,YAAY,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,CAAC"}