@tpitre/story-ui 2.7.1 → 2.8.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 (292) hide show
  1. package/README.md +40 -9
  2. package/dist/cli/deploy.d.ts +1 -1
  3. package/dist/cli/deploy.d.ts.map +1 -1
  4. package/dist/cli/deploy.js +5 -115
  5. package/dist/cli/index.js +0 -0
  6. package/dist/cli/setup.js +3 -3
  7. package/dist/templates/StoryUI/StoryUIPanel.d.ts.map +1 -1
  8. package/dist/templates/StoryUI/StoryUIPanel.js +30 -2
  9. package/package.json +1 -1
  10. package/templates/StoryUI/StoryUIPanel.tsx +35 -2
  11. package/dist/cli/index.js.map +0 -1
  12. package/dist/cli/setup.js.map +0 -1
  13. package/dist/cloudflare-edge/src/mcp-session.js +0 -462
  14. package/dist/cloudflare-edge/src/types.js +0 -4
  15. package/dist/cloudflare-edge/src/worker.js +0 -106
  16. package/dist/cloudflare-pages/vite.config.js +0 -14
  17. package/dist/index.d.ts +0 -13
  18. package/dist/index.d.ts.map +0 -1
  19. package/dist/index.js +0 -12
  20. package/dist/index.js.map +0 -1
  21. package/dist/mcp-server/index.js.map +0 -1
  22. package/dist/mcp-server/mcp-stdio-server.js.map +0 -1
  23. package/dist/mcp-server/routes/claude.js.map +0 -1
  24. package/dist/mcp-server/routes/components.js.map +0 -1
  25. package/dist/mcp-server/routes/generateStory.js.map +0 -1
  26. package/dist/mcp-server/routes/hybridStories.js.map +0 -1
  27. package/dist/mcp-server/routes/memoryStories.js.map +0 -1
  28. package/dist/mcp-server/routes/storySync.js.map +0 -1
  29. package/dist/mcp-server/routes/updateStory.js +0 -246
  30. package/dist/mcp-server/sessionManager.js.map +0 -1
  31. package/dist/playground/components/AIAssistant/AIAssistant.d.ts +0 -6
  32. package/dist/playground/components/AIAssistant/AIAssistant.d.ts.map +0 -1
  33. package/dist/playground/components/AIAssistant/AIAssistant.js +0 -109
  34. package/dist/playground/components/AIAssistant/AIAssistant.js.map +0 -1
  35. package/dist/playground/components/AIAssistant/AIAssistant.module.css +0 -166
  36. package/dist/playground/components/Canvas/Canvas.d.ts +0 -9
  37. package/dist/playground/components/Canvas/Canvas.d.ts.map +0 -1
  38. package/dist/playground/components/Canvas/Canvas.js +0 -58
  39. package/dist/playground/components/Canvas/Canvas.js.map +0 -1
  40. package/dist/playground/components/Canvas/Canvas.module.css +0 -189
  41. package/dist/playground/components/Canvas/CanvasWithDnd.d.ts +0 -9
  42. package/dist/playground/components/Canvas/CanvasWithDnd.d.ts.map +0 -1
  43. package/dist/playground/components/Canvas/CanvasWithDnd.js +0 -158
  44. package/dist/playground/components/Canvas/CanvasWithDnd.js.map +0 -1
  45. package/dist/playground/components/Canvas/ComponentRenderer.d.ts +0 -15
  46. package/dist/playground/components/Canvas/ComponentRenderer.d.ts.map +0 -1
  47. package/dist/playground/components/Canvas/ComponentRenderer.js +0 -177
  48. package/dist/playground/components/Canvas/ComponentRenderer.js.map +0 -1
  49. package/dist/playground/components/Canvas/DraggableComponent.d.ts +0 -15
  50. package/dist/playground/components/Canvas/DraggableComponent.d.ts.map +0 -1
  51. package/dist/playground/components/Canvas/DraggableComponent.js +0 -49
  52. package/dist/playground/components/Canvas/DraggableComponent.js.map +0 -1
  53. package/dist/playground/components/Canvas/index.d.ts +0 -9
  54. package/dist/playground/components/Canvas/index.d.ts.map +0 -1
  55. package/dist/playground/components/Canvas/index.js +0 -5
  56. package/dist/playground/components/Canvas/index.js.map +0 -1
  57. package/dist/playground/components/CodeView/CodeView.d.ts +0 -12
  58. package/dist/playground/components/CodeView/CodeView.d.ts.map +0 -1
  59. package/dist/playground/components/CodeView/CodeView.js +0 -77
  60. package/dist/playground/components/CodeView/CodeView.js.map +0 -1
  61. package/dist/playground/components/CodeView/CodeView.module.css +0 -178
  62. package/dist/playground/components/ComponentPalette/ComponentPalette.d.ts +0 -17
  63. package/dist/playground/components/ComponentPalette/ComponentPalette.d.ts.map +0 -1
  64. package/dist/playground/components/ComponentPalette/ComponentPalette.js +0 -138
  65. package/dist/playground/components/ComponentPalette/ComponentPalette.js.map +0 -1
  66. package/dist/playground/components/ComponentPalette/ComponentPalette.module.css +0 -217
  67. package/dist/playground/components/ComponentPalette/index.d.ts +0 -3
  68. package/dist/playground/components/ComponentPalette/index.d.ts.map +0 -1
  69. package/dist/playground/components/ComponentPalette/index.js +0 -2
  70. package/dist/playground/components/ComponentPalette/index.js.map +0 -1
  71. package/dist/playground/components/DropZone/DropZone.d.ts +0 -17
  72. package/dist/playground/components/DropZone/DropZone.d.ts.map +0 -1
  73. package/dist/playground/components/DropZone/DropZone.js +0 -73
  74. package/dist/playground/components/DropZone/DropZone.js.map +0 -1
  75. package/dist/playground/components/DropZone/DropZone.module.css +0 -86
  76. package/dist/playground/components/ExportDialog/ExportDialog.d.ts +0 -10
  77. package/dist/playground/components/ExportDialog/ExportDialog.d.ts.map +0 -1
  78. package/dist/playground/components/ExportDialog/ExportDialog.js +0 -57
  79. package/dist/playground/components/ExportDialog/ExportDialog.js.map +0 -1
  80. package/dist/playground/components/ExportDialog/ExportDialog.module.css +0 -328
  81. package/dist/playground/components/LayoutHelpers/LayoutHelpers.d.ts +0 -134
  82. package/dist/playground/components/LayoutHelpers/LayoutHelpers.d.ts.map +0 -1
  83. package/dist/playground/components/LayoutHelpers/LayoutHelpers.js +0 -254
  84. package/dist/playground/components/LayoutHelpers/LayoutHelpers.js.map +0 -1
  85. package/dist/playground/components/LayoutHelpers/index.d.ts +0 -3
  86. package/dist/playground/components/LayoutHelpers/index.d.ts.map +0 -1
  87. package/dist/playground/components/LayoutHelpers/index.js +0 -2
  88. package/dist/playground/components/LayoutHelpers/index.js.map +0 -1
  89. package/dist/playground/components/Playground/Playground.d.ts +0 -10
  90. package/dist/playground/components/Playground/Playground.d.ts.map +0 -1
  91. package/dist/playground/components/Playground/Playground.js +0 -128
  92. package/dist/playground/components/Playground/Playground.js.map +0 -1
  93. package/dist/playground/components/Playground/Playground.module.css +0 -308
  94. package/dist/playground/components/PropertiesPanel/PropertiesPanel.d.ts +0 -10
  95. package/dist/playground/components/PropertiesPanel/PropertiesPanel.d.ts.map +0 -1
  96. package/dist/playground/components/PropertiesPanel/PropertiesPanel.js +0 -150
  97. package/dist/playground/components/PropertiesPanel/PropertiesPanel.js.map +0 -1
  98. package/dist/playground/components/PropertiesPanel/PropertiesPanel.module.css +0 -155
  99. package/dist/playground/components/PropertiesPanel/index.d.ts +0 -3
  100. package/dist/playground/components/PropertiesPanel/index.d.ts.map +0 -1
  101. package/dist/playground/components/PropertiesPanel/index.js +0 -2
  102. package/dist/playground/components/PropertiesPanel/index.js.map +0 -1
  103. package/dist/playground/components/PropertyEditors/BooleanEditor.d.ts +0 -12
  104. package/dist/playground/components/PropertyEditors/BooleanEditor.d.ts.map +0 -1
  105. package/dist/playground/components/PropertyEditors/BooleanEditor.js +0 -14
  106. package/dist/playground/components/PropertyEditors/BooleanEditor.js.map +0 -1
  107. package/dist/playground/components/PropertyEditors/ColorEditor.d.ts +0 -12
  108. package/dist/playground/components/PropertyEditors/ColorEditor.d.ts.map +0 -1
  109. package/dist/playground/components/PropertyEditors/ColorEditor.js +0 -62
  110. package/dist/playground/components/PropertyEditors/ColorEditor.js.map +0 -1
  111. package/dist/playground/components/PropertyEditors/IconEditor.d.ts +0 -12
  112. package/dist/playground/components/PropertyEditors/IconEditor.d.ts.map +0 -1
  113. package/dist/playground/components/PropertyEditors/IconEditor.js +0 -123
  114. package/dist/playground/components/PropertyEditors/IconEditor.js.map +0 -1
  115. package/dist/playground/components/PropertyEditors/NumberEditor.d.ts +0 -15
  116. package/dist/playground/components/PropertyEditors/NumberEditor.d.ts.map +0 -1
  117. package/dist/playground/components/PropertyEditors/NumberEditor.js +0 -46
  118. package/dist/playground/components/PropertyEditors/NumberEditor.js.map +0 -1
  119. package/dist/playground/components/PropertyEditors/PropertyEditors.module.css +0 -432
  120. package/dist/playground/components/PropertyEditors/SelectEditor.d.ts +0 -19
  121. package/dist/playground/components/PropertyEditors/SelectEditor.d.ts.map +0 -1
  122. package/dist/playground/components/PropertyEditors/SelectEditor.js +0 -17
  123. package/dist/playground/components/PropertyEditors/SelectEditor.js.map +0 -1
  124. package/dist/playground/components/PropertyEditors/SpacingEditor.d.ts +0 -19
  125. package/dist/playground/components/PropertyEditors/SpacingEditor.d.ts.map +0 -1
  126. package/dist/playground/components/PropertyEditors/SpacingEditor.js +0 -162
  127. package/dist/playground/components/PropertyEditors/SpacingEditor.js.map +0 -1
  128. package/dist/playground/components/PropertyEditors/SpacingEditor.module.css +0 -214
  129. package/dist/playground/components/PropertyEditors/TextEditor.d.ts +0 -14
  130. package/dist/playground/components/PropertyEditors/TextEditor.d.ts.map +0 -1
  131. package/dist/playground/components/PropertyEditors/TextEditor.js +0 -38
  132. package/dist/playground/components/PropertyEditors/TextEditor.js.map +0 -1
  133. package/dist/playground/components/PropertyEditors/TokenEditor.d.ts +0 -23
  134. package/dist/playground/components/PropertyEditors/TokenEditor.d.ts.map +0 -1
  135. package/dist/playground/components/PropertyEditors/TokenEditor.js +0 -50
  136. package/dist/playground/components/PropertyEditors/TokenEditor.js.map +0 -1
  137. package/dist/playground/components/PropertyEditors/index.d.ts +0 -20
  138. package/dist/playground/components/PropertyEditors/index.d.ts.map +0 -1
  139. package/dist/playground/components/PropertyEditors/index.js +0 -12
  140. package/dist/playground/components/PropertyEditors/index.js.map +0 -1
  141. package/dist/playground/components/TreeView/TreeView.d.ts +0 -10
  142. package/dist/playground/components/TreeView/TreeView.d.ts.map +0 -1
  143. package/dist/playground/components/TreeView/TreeView.js +0 -146
  144. package/dist/playground/components/TreeView/TreeView.js.map +0 -1
  145. package/dist/playground/components/TreeView/TreeView.module.css +0 -214
  146. package/dist/playground/components/TreeView/index.d.ts +0 -3
  147. package/dist/playground/components/TreeView/index.d.ts.map +0 -1
  148. package/dist/playground/components/TreeView/index.js +0 -2
  149. package/dist/playground/components/TreeView/index.js.map +0 -1
  150. package/dist/playground/config/propertyDefinitions.d.ts +0 -73
  151. package/dist/playground/config/propertyDefinitions.d.ts.map +0 -1
  152. package/dist/playground/config/propertyDefinitions.js +0 -809
  153. package/dist/playground/config/propertyDefinitions.js.map +0 -1
  154. package/dist/playground/hooks/useKeyboardShortcuts.d.ts +0 -38
  155. package/dist/playground/hooks/useKeyboardShortcuts.d.ts.map +0 -1
  156. package/dist/playground/hooks/useKeyboardShortcuts.js +0 -191
  157. package/dist/playground/hooks/useKeyboardShortcuts.js.map +0 -1
  158. package/dist/playground/index.d.ts +0 -21
  159. package/dist/playground/index.d.ts.map +0 -1
  160. package/dist/playground/index.js +0 -23
  161. package/dist/playground/index.js.map +0 -1
  162. package/dist/playground/services/CodeGenerator.d.ts +0 -73
  163. package/dist/playground/services/CodeGenerator.d.ts.map +0 -1
  164. package/dist/playground/services/CodeGenerator.js +0 -359
  165. package/dist/playground/services/CodeGenerator.js.map +0 -1
  166. package/dist/playground/services/DragDropManager.d.ts +0 -95
  167. package/dist/playground/services/DragDropManager.d.ts.map +0 -1
  168. package/dist/playground/services/DragDropManager.js +0 -408
  169. package/dist/playground/services/DragDropManager.js.map +0 -1
  170. package/dist/playground/services/StoryParser.d.ts +0 -73
  171. package/dist/playground/services/StoryParser.d.ts.map +0 -1
  172. package/dist/playground/services/StoryParser.js +0 -419
  173. package/dist/playground/services/StoryParser.js.map +0 -1
  174. package/dist/playground/store/playgroundStore.d.ts +0 -86
  175. package/dist/playground/store/playgroundStore.d.ts.map +0 -1
  176. package/dist/playground/store/playgroundStore.js +0 -337
  177. package/dist/playground/store/playgroundStore.js.map +0 -1
  178. package/dist/playground/stories/PlaygroundDragDrop.stories.d.ts +0 -13
  179. package/dist/playground/stories/PlaygroundDragDrop.stories.d.ts.map +0 -1
  180. package/dist/playground/stories/PlaygroundDragDrop.stories.js +0 -227
  181. package/dist/playground/stories/PlaygroundDragDrop.stories.js.map +0 -1
  182. package/dist/playground/stories/PlaygroundPhase4.stories.d.ts +0 -13
  183. package/dist/playground/stories/PlaygroundPhase4.stories.d.ts.map +0 -1
  184. package/dist/playground/stories/PlaygroundPhase4.stories.js +0 -334
  185. package/dist/playground/stories/PlaygroundPhase4.stories.js.map +0 -1
  186. package/dist/playground/stories/PlaygroundPhase5.stories.d.ts +0 -14
  187. package/dist/playground/stories/PlaygroundPhase5.stories.d.ts.map +0 -1
  188. package/dist/playground/stories/PlaygroundPhase5.stories.js +0 -512
  189. package/dist/playground/stories/PlaygroundPhase5.stories.js.map +0 -1
  190. package/dist/playground/stories/PlaygroundProperties.stories.d.ts +0 -13
  191. package/dist/playground/stories/PlaygroundProperties.stories.d.ts.map +0 -1
  192. package/dist/playground/stories/PlaygroundProperties.stories.js +0 -342
  193. package/dist/playground/stories/PlaygroundProperties.stories.js.map +0 -1
  194. package/dist/playground/types/index.d.ts +0 -251
  195. package/dist/playground/types/index.d.ts.map +0 -1
  196. package/dist/playground/types/index.js +0 -5
  197. package/dist/playground/types/index.js.map +0 -1
  198. package/dist/scripts/verify-framework-adapters.js +0 -105
  199. package/dist/story-generator/componentBlacklist.js.map +0 -1
  200. package/dist/story-generator/componentDiscovery.js.map +0 -1
  201. package/dist/story-generator/configLoader.js.map +0 -1
  202. package/dist/story-generator/considerationsLoader.js.map +0 -1
  203. package/dist/story-generator/documentation-sources.js.map +0 -1
  204. package/dist/story-generator/documentationLoader.js.map +0 -1
  205. package/dist/story-generator/dynamicPackageDiscovery.js.map +0 -1
  206. package/dist/story-generator/enhancedComponentDiscovery.js.map +0 -1
  207. package/dist/story-generator/generateStory.js.map +0 -1
  208. package/dist/story-generator/gitignoreManager.js.map +0 -1
  209. package/dist/story-generator/inMemoryStoryService.js.map +0 -1
  210. package/dist/story-generator/logger.js.map +0 -1
  211. package/dist/story-generator/postProcessStory.js.map +0 -1
  212. package/dist/story-generator/productionGitignoreManager.js.map +0 -1
  213. package/dist/story-generator/promptGenerator.js.map +0 -1
  214. package/dist/story-generator/providerPresets.d.ts +0 -54
  215. package/dist/story-generator/providerPresets.d.ts.map +0 -1
  216. package/dist/story-generator/providerPresets.js +0 -214
  217. package/dist/story-generator/storyHistory.js.map +0 -1
  218. package/dist/story-generator/storySync.js.map +0 -1
  219. package/dist/story-generator/storyTracker.js.map +0 -1
  220. package/dist/story-generator/storyValidator.js.map +0 -1
  221. package/dist/story-generator/test_validation.d.ts +0 -2
  222. package/dist/story-generator/test_validation.d.ts.map +0 -1
  223. package/dist/story-generator/test_validation.js +0 -51
  224. package/dist/story-generator/universalDesignSystemAdapter.js.map +0 -1
  225. package/dist/story-generator/urlRedirectService.js.map +0 -1
  226. package/dist/story-generator/validateStory.js.map +0 -1
  227. package/dist/story-ui.config.js.map +0 -1
  228. package/dist/story-ui.config.loader.d.ts +0 -36
  229. package/dist/story-ui.config.loader.d.ts.map +0 -1
  230. package/dist/story-ui.config.loader.js +0 -205
  231. package/dist/story-ui.config.loader.js.map +0 -1
  232. package/dist/temp/package/templates/StoryUI/StoryUIPanel.js +0 -807
  233. package/dist/temp/package/templates/StoryUI/StoryUIPanel.stories.js +0 -37
  234. package/dist/temp/package/templates/StoryUI/index.js +0 -2
  235. package/dist/templates/StoryUI/StoryUIPanel.js.map +0 -1
  236. package/dist/templates/StoryUI/StoryUIPanel.stories.js.map +0 -1
  237. package/dist/templates/StoryUI/index.js.map +0 -1
  238. package/dist/templates/StoryUI/manager.d.ts +0 -14
  239. package/dist/templates/StoryUI/manager.d.ts.map +0 -1
  240. package/dist/templates/production-app/src/App.d.ts +0 -10
  241. package/dist/templates/production-app/src/App.d.ts.map +0 -1
  242. package/dist/templates/production-app/src/App.js +0 -653
  243. package/dist/templates/production-app/src/LivePreviewRenderer.d.ts +0 -24
  244. package/dist/templates/production-app/src/LivePreviewRenderer.d.ts.map +0 -1
  245. package/dist/templates/production-app/src/LivePreviewRenderer.js +0 -199
  246. package/dist/templates/production-app/src/componentRegistry.d.ts +0 -20
  247. package/dist/templates/production-app/src/componentRegistry.d.ts.map +0 -1
  248. package/dist/templates/production-app/src/componentRegistry.js +0 -316
  249. package/dist/templates/production-app/src/main.d.ts +0 -9
  250. package/dist/templates/production-app/src/main.d.ts.map +0 -1
  251. package/dist/templates/production-app/src/main.js +0 -18
  252. package/dist/templates/production-app/vite.config.d.ts +0 -3
  253. package/dist/templates/production-app/vite.config.d.ts.map +0 -1
  254. package/dist/templates/production-app/vite.config.js +0 -71
  255. package/dist/test-storybooks/angular-material-storybook/src/main.js +0 -66
  256. package/dist/test-storybooks/chakra-storybook/vite.config.js +0 -6
  257. package/dist/test-storybooks/mantine-storybook/vite.config.js +0 -93
  258. package/dist/test-storybooks/web-components-shoelace/vite.config.js +0 -9
  259. package/dist/tsconfig.tsbuildinfo +0 -1
  260. package/dist/visual-builder/components/Canvas/Canvas.js +0 -70
  261. package/dist/visual-builder/components/Canvas/ComponentRenderer.js +0 -545
  262. package/dist/visual-builder/components/CodeExporter/CodeExporter.js +0 -25
  263. package/dist/visual-builder/components/CodeExporter/codeGenerator.js +0 -99
  264. package/dist/visual-builder/components/ComponentPalette/ComponentPalette.js +0 -8
  265. package/dist/visual-builder/components/ComponentPalette/ComponentPaletteItem.js +0 -51
  266. package/dist/visual-builder/components/EmbeddedVisualBuilder.js +0 -107
  267. package/dist/visual-builder/components/PropertyEditor/PropertyEditor.js +0 -16
  268. package/dist/visual-builder/components/PropertyEditor/PropertyForm.js +0 -88
  269. package/dist/visual-builder/components/PropertyEditor/SpacingControl.js +0 -145
  270. package/dist/visual-builder/components/PropertyEditor/SpacingEditor.js +0 -32
  271. package/dist/visual-builder/components/StoryManager/SaveOnlyManager.js +0 -94
  272. package/dist/visual-builder/components/StoryManager/StoryManager.js +0 -68
  273. package/dist/visual-builder/components/StoryManager/index.js +0 -1
  274. package/dist/visual-builder/components/VisualBuilder.js +0 -256
  275. package/dist/visual-builder/config/componentRegistry.js +0 -1758
  276. package/dist/visual-builder/decorators/VisualBuilderDecorator.js +0 -184
  277. package/dist/visual-builder/example-integration.js +0 -59
  278. package/dist/visual-builder/example.js +0 -23
  279. package/dist/visual-builder/hooks/useDragAndDrop.js +0 -137
  280. package/dist/visual-builder/hooks/useSelection.js +0 -27
  281. package/dist/visual-builder/index.js +0 -7
  282. package/dist/visual-builder/store/visualBuilderStore.js +0 -305
  283. package/dist/visual-builder/types/index.js +0 -1
  284. package/dist/visual-builder/utils/__tests__/storyFileUpdater.test.js +0 -145
  285. package/dist/visual-builder/utils/aiParser.js +0 -336
  286. package/dist/visual-builder/utils/componentTreeUtils.js +0 -111
  287. package/dist/visual-builder/utils/parserValidation.js +0 -122
  288. package/dist/visual-builder/utils/storyFileManager.js +0 -73
  289. package/dist/visual-builder/utils/storyFileUpdater.js +0 -326
  290. package/dist/visual-builder/utils/storyNameExtraction.test.js +0 -211
  291. package/dist/visual-builder/utils/storyPersistence.js +0 -180
  292. package/dist/visual-builder/utils/storyToBuilder.js +0 -813
@@ -1,305 +0,0 @@
1
- import { create } from 'zustand';
2
- import { devtools } from 'zustand/middleware';
3
- import { removeComponentFromTree, insertComponentInTree, findComponentWithParent, isDescendant } from '../utils/componentTreeUtils';
4
- import { saveStory, loadStory, scheduleAutoSave, cancelAutoSave } from '../utils/storyPersistence';
5
- export const useVisualBuilderStore = create()(devtools((set, _get) => ({
6
- // Initial state
7
- components: [],
8
- selectedComponent: null,
9
- draggedComponent: null,
10
- isCodeModalOpen: false,
11
- isImportedFromStory: false,
12
- // Story management state
13
- currentStoryId: null,
14
- currentStoryName: 'Untitled Story',
15
- isDirty: false,
16
- // Actions
17
- addComponent: (component, targetId, insertIndex) => {
18
- set((state) => {
19
- const newComponent = { ...component, id: `${component.type}-${Date.now()}` };
20
- let newComponents;
21
- if (targetId) {
22
- // Add as child to target component
23
- const updateComponents = (components) => {
24
- return components.map(comp => {
25
- if (comp.id === targetId) {
26
- const children = comp.children || [];
27
- const newChildren = insertIndex !== undefined
28
- ? [...children.slice(0, insertIndex), newComponent, ...children.slice(insertIndex)]
29
- : [...children, newComponent];
30
- return {
31
- ...comp,
32
- children: newChildren
33
- };
34
- }
35
- if (comp.children) {
36
- return {
37
- ...comp,
38
- children: updateComponents(comp.children)
39
- };
40
- }
41
- return comp;
42
- });
43
- };
44
- newComponents = updateComponents(state.components);
45
- }
46
- else {
47
- // Add to root level
48
- newComponents = insertIndex !== undefined
49
- ? [...state.components.slice(0, insertIndex), newComponent, ...state.components.slice(insertIndex)]
50
- : [...state.components, newComponent];
51
- }
52
- // Mark as dirty and schedule auto-save
53
- scheduleAutoSave(state.currentStoryName, newComponents, state.currentStoryId || undefined);
54
- return { components: newComponents, isDirty: true };
55
- });
56
- },
57
- removeComponent: (id) => {
58
- set((state) => {
59
- const removeFromComponents = (components) => {
60
- return components
61
- .filter(comp => comp.id !== id)
62
- .map(comp => ({
63
- ...comp,
64
- children: comp.children ? removeFromComponents(comp.children) : undefined
65
- }));
66
- };
67
- const newComponents = removeFromComponents(state.components);
68
- // Mark as dirty and schedule auto-save
69
- scheduleAutoSave(state.currentStoryName, newComponents, state.currentStoryId || undefined);
70
- return {
71
- components: newComponents,
72
- selectedComponent: state.selectedComponent?.id === id ? null : state.selectedComponent,
73
- isDirty: true
74
- };
75
- });
76
- },
77
- updateComponent: (id, updates) => {
78
- set((state) => {
79
- const updateComponents = (components) => {
80
- return components.map(comp => {
81
- if (comp.id === id) {
82
- return { ...comp, ...updates };
83
- }
84
- if (comp.children) {
85
- return {
86
- ...comp,
87
- children: updateComponents(comp.children)
88
- };
89
- }
90
- return comp;
91
- });
92
- };
93
- const newComponents = updateComponents(state.components);
94
- // Mark as dirty and schedule auto-save
95
- scheduleAutoSave(state.currentStoryName, newComponents, state.currentStoryId || undefined);
96
- return { components: newComponents, isDirty: true };
97
- });
98
- },
99
- selectComponent: (component) => {
100
- set({ selectedComponent: component });
101
- },
102
- setDraggedComponent: (component) => {
103
- set({ draggedComponent: component });
104
- },
105
- openCodeModal: () => {
106
- set({ isCodeModalOpen: true });
107
- },
108
- closeCodeModal: () => {
109
- set({ isCodeModalOpen: false });
110
- },
111
- clearCanvas: () => {
112
- set({
113
- components: [],
114
- selectedComponent: null,
115
- isImportedFromStory: false,
116
- isDirty: true
117
- });
118
- },
119
- moveComponent: (activeId, overId, insertIndex, insertPosition) => {
120
- set((state) => {
121
- // Prevent moving a component into itself or its descendants
122
- if (activeId === overId || isDescendant(state.components, activeId, overId)) {
123
- return state;
124
- }
125
- // Remove the component from its current location
126
- const { components: updatedComponents, removed } = removeComponentFromTree(state.components, activeId);
127
- if (!removed) {
128
- return state; // Component not found
129
- }
130
- // Determine insertion target and index
131
- let targetContainerId = null;
132
- let insertionIndex = insertIndex;
133
- if (insertIndex !== undefined) {
134
- // Direct insertion at specific index (root level)
135
- targetContainerId = null;
136
- }
137
- else {
138
- // Insert relative to another component
139
- const overComponent = findComponentWithParent(updatedComponents, overId);
140
- if (overComponent) {
141
- if (overComponent.parent) {
142
- targetContainerId = overComponent.parent.id;
143
- insertionIndex = overComponent.index + (insertPosition === 'after' ? 1 : 0);
144
- }
145
- else {
146
- // Insert at root level
147
- targetContainerId = null;
148
- insertionIndex = overComponent.index + (insertPosition === 'after' ? 1 : 0);
149
- }
150
- }
151
- }
152
- // Insert the component at the new location
153
- const finalComponents = insertComponentInTree(updatedComponents, removed, targetContainerId, insertionIndex);
154
- // Mark as dirty and schedule auto-save
155
- scheduleAutoSave(state.currentStoryName, finalComponents, state.currentStoryId || undefined);
156
- return { components: finalComponents, isDirty: true };
157
- });
158
- },
159
- moveComponentBetweenContainers: (activeId, _fromParentId, toParentId, insertIndex) => {
160
- set((state) => {
161
- // Prevent moving a component into itself or its descendants
162
- if (activeId === toParentId || (toParentId && isDescendant(state.components, activeId, toParentId))) {
163
- return state;
164
- }
165
- // Remove component from its current location
166
- const { components: afterRemoval, removed } = removeComponentFromTree(state.components, activeId);
167
- if (!removed) {
168
- return state; // Component not found
169
- }
170
- // Add component to new location
171
- const finalComponents = insertComponentInTree(afterRemoval, removed, toParentId, insertIndex);
172
- // Mark as dirty and schedule auto-save
173
- scheduleAutoSave(state.currentStoryName, finalComponents, state.currentStoryId || undefined);
174
- return { components: finalComponents, isDirty: true };
175
- });
176
- },
177
- loadFromAI: (components) => {
178
- set({
179
- components,
180
- selectedComponent: null,
181
- isImportedFromStory: false,
182
- isDirty: true
183
- });
184
- },
185
- loadFromCode: async (code) => {
186
- try {
187
- const { parseAIGeneratedCode } = await import('../utils/aiParser');
188
- const result = parseAIGeneratedCode(code);
189
- if (result.errors.length === 0) {
190
- set({
191
- components: result.components,
192
- selectedComponent: null,
193
- isImportedFromStory: false,
194
- isDirty: true
195
- });
196
- }
197
- return {
198
- success: result.errors.length === 0,
199
- errors: result.errors,
200
- warnings: result.warnings
201
- };
202
- }
203
- catch (error) {
204
- return {
205
- success: false,
206
- errors: [`Failed to load parser: ${error instanceof Error ? error.message : 'Unknown error'}`],
207
- warnings: []
208
- };
209
- }
210
- },
211
- importFromStoryUI: async (storyCode) => {
212
- try {
213
- const { parseStoryUIToBuilder, validateParsedComponents, extractStoryName } = await import('../utils/storyToBuilder');
214
- const parseResult = parseStoryUIToBuilder(storyCode);
215
- // Validate the parsed components
216
- const validationIssues = validateParsedComponents(parseResult.components);
217
- const allWarnings = [...parseResult.warnings, ...validationIssues];
218
- // Extract story name using the improved extraction function
219
- const storyName = extractStoryName(storyCode);
220
- // Determine if this is an existing story (has a valid extracted name)
221
- const isEditingExistingStory = storyName !== 'Imported Story' && storyName !== 'Untitled Story';
222
- if (parseResult.errors.length === 0) {
223
- // Generate or use existing story ID
224
- const state = _get();
225
- const storyId = state.currentStoryId || `story-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
226
- set({
227
- components: parseResult.components,
228
- selectedComponent: null,
229
- isImportedFromStory: true, // Mark as imported from story
230
- currentStoryName: storyName, // Set the extracted story name
231
- currentStoryId: storyId, // Set the story ID
232
- isDirty: isEditingExistingStory ? false : true // Start clean for existing stories, dirty for new imports
233
- });
234
- }
235
- return {
236
- success: parseResult.errors.length === 0,
237
- errors: parseResult.errors,
238
- warnings: allWarnings
239
- };
240
- }
241
- catch (error) {
242
- return {
243
- success: false,
244
- errors: [`Failed to import from Story UI: ${error instanceof Error ? error.message : 'Unknown error'}`],
245
- warnings: []
246
- };
247
- }
248
- },
249
- // Story management actions
250
- saveCurrentStory: (name) => {
251
- const state = _get();
252
- const storyName = name || state.currentStoryName;
253
- const savedStory = saveStory(storyName, state.components, state.currentStoryId || undefined);
254
- set({
255
- currentStoryId: savedStory.id,
256
- currentStoryName: savedStory.name,
257
- isDirty: false
258
- });
259
- // Update URL with story ID
260
- const url = new URL(window.location.href);
261
- url.searchParams.set('story', savedStory.id);
262
- window.history.replaceState({}, '', url.toString());
263
- return savedStory;
264
- },
265
- loadStoryById: (id) => {
266
- const story = loadStory(id);
267
- if (story) {
268
- cancelAutoSave(); // Cancel any pending auto-save
269
- set({
270
- components: story.components,
271
- currentStoryId: story.id,
272
- currentStoryName: story.name,
273
- isDirty: false,
274
- selectedComponent: null,
275
- isImportedFromStory: false
276
- });
277
- return true;
278
- }
279
- return false;
280
- },
281
- markDirty: () => {
282
- set({ isDirty: true });
283
- },
284
- markClean: () => {
285
- set({ isDirty: false });
286
- },
287
- setCurrentStoryName: (name) => {
288
- set({ currentStoryName: name, isDirty: true });
289
- },
290
- newStory: () => {
291
- cancelAutoSave();
292
- set({
293
- components: [],
294
- selectedComponent: null,
295
- currentStoryId: null,
296
- currentStoryName: 'Untitled Story',
297
- isDirty: false,
298
- isImportedFromStory: false
299
- });
300
- // Remove story parameter from URL
301
- const url = new URL(window.location.href);
302
- url.searchParams.delete('story');
303
- window.history.replaceState({}, '', url.toString());
304
- }
305
- }), { name: 'visual-builder-store' }));
@@ -1 +0,0 @@
1
- export {};
@@ -1,145 +0,0 @@
1
- import { generateStoryFileContent, generatePropsString } from '../storyFileUpdater';
2
- describe('storyFileUpdater', () => {
3
- describe('generatePropsString', () => {
4
- it('should generate correct style props with double curly braces', () => {
5
- const props = {
6
- style: { maxWidth: 400, padding: '1rem' }
7
- };
8
- const result = generatePropsString(props, 'Card');
9
- // Should have double curly braces for style object
10
- expect(result).toBe(' style={{ maxWidth: 400, padding: \'1rem\' }}');
11
- expect(result).not.toContain('style="');
12
- expect(result).toContain('style={{');
13
- });
14
- it('should handle numeric values in style objects correctly', () => {
15
- const props = {
16
- style: { width: 300, height: 200, zIndex: 10 }
17
- };
18
- const result = generatePropsString(props, 'div');
19
- expect(result).toBe(' style={{ width: 300, height: 200, zIndex: 10 }}');
20
- });
21
- it('should handle string values in style objects with quotes', () => {
22
- const props = {
23
- style: { color: 'red', backgroundColor: '#fff', display: 'flex' }
24
- };
25
- const result = generatePropsString(props, 'div');
26
- expect(result).toBe(' style={{ color: \'red\', backgroundColor: \'#fff\', display: \'flex\' }}');
27
- });
28
- it('should handle mixed style values correctly', () => {
29
- const props = {
30
- style: {
31
- maxWidth: 400,
32
- padding: '1rem',
33
- margin: 0,
34
- display: 'block'
35
- }
36
- };
37
- const result = generatePropsString(props, 'Card');
38
- expect(result).toBe(' style={{ maxWidth: 400, padding: \'1rem\', margin: 0, display: \'block\' }}');
39
- });
40
- it('should handle other prop types correctly alongside style', () => {
41
- const props = {
42
- shadow: 'md',
43
- padding: 'xl',
44
- radius: 'md',
45
- withBorder: true,
46
- style: { maxWidth: 400 }
47
- };
48
- const result = generatePropsString(props, 'Card');
49
- expect(result).toContain('shadow="md"');
50
- expect(result).toContain('padding="xl"');
51
- expect(result).toContain('radius="md"');
52
- expect(result).toContain('withBorder');
53
- expect(result).toContain('style={{ maxWidth: 400 }}');
54
- expect(result).not.toContain('style="');
55
- });
56
- it('should filter out children prop for Text components', () => {
57
- const props = {
58
- children: 'Some text',
59
- size: 'lg'
60
- };
61
- const result = generatePropsString(props, 'Text');
62
- expect(result).toBe(' size="lg"');
63
- expect(result).not.toContain('children');
64
- });
65
- it('should keep children prop for Button components', () => {
66
- const props = {
67
- children: 'Click me',
68
- variant: 'outline'
69
- };
70
- const result = generatePropsString(props, 'Button');
71
- expect(result).toContain('children="Click me"');
72
- expect(result).toContain('variant="outline"');
73
- });
74
- });
75
- describe('generateStoryFileContent', () => {
76
- it('should generate story with correct style syntax', () => {
77
- const components = [{
78
- id: 'card1',
79
- type: 'Card',
80
- displayName: 'Card',
81
- category: 'mantine',
82
- props: {
83
- shadow: 'md',
84
- padding: 'xl',
85
- radius: 'md',
86
- withBorder: true,
87
- style: { maxWidth: 400 }
88
- },
89
- children: []
90
- }];
91
- const result = generateStoryFileContent(components, 'TestStory', 'test.stories.tsx');
92
- // Should contain double curly braces, not single quotes around object
93
- expect(result).toContain('style={{ maxWidth: 400 }}');
94
- expect(result).not.toContain('style="{ maxWidth: 400 }"');
95
- expect(result).not.toContain('style="');
96
- });
97
- it('should generate story with complex style objects correctly', () => {
98
- const components = [{
99
- id: 'div1',
100
- type: 'div',
101
- displayName: 'div',
102
- category: 'html',
103
- props: {
104
- style: {
105
- maxWidth: 400,
106
- padding: '1rem',
107
- margin: 0,
108
- backgroundColor: '#f8f9fa',
109
- borderRadius: '8px'
110
- }
111
- },
112
- children: []
113
- }];
114
- const result = generateStoryFileContent(components, 'ComplexStyle', 'complex.stories.tsx');
115
- expect(result).toContain('style={{ maxWidth: 400, padding: \'1rem\', margin: 0, backgroundColor: \'#f8f9fa\', borderRadius: \'8px\' }}');
116
- expect(result).not.toContain('style="');
117
- });
118
- it('should handle nested components with styles correctly', () => {
119
- const components = [{
120
- id: 'card1',
121
- type: 'Card',
122
- displayName: 'Card',
123
- category: 'mantine',
124
- props: {
125
- style: { maxWidth: 400 }
126
- },
127
- children: [{
128
- id: 'stack1',
129
- type: 'Stack',
130
- displayName: 'Stack',
131
- category: 'mantine',
132
- props: {
133
- gap: 'md',
134
- style: { padding: '1rem' }
135
- },
136
- children: []
137
- }]
138
- }];
139
- const result = generateStoryFileContent(components, 'NestedStyles', 'nested.stories.tsx');
140
- expect(result).toContain('style={{ maxWidth: 400 }}');
141
- expect(result).toContain('style={{ padding: \'1rem\' }}');
142
- expect(result).not.toContain('style="');
143
- });
144
- });
145
- });