@tpitre/story-ui 2.7.1 → 2.8.0

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 (289) 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/package.json +1 -1
  8. package/dist/cli/index.js.map +0 -1
  9. package/dist/cli/setup.js.map +0 -1
  10. package/dist/cloudflare-edge/src/mcp-session.js +0 -462
  11. package/dist/cloudflare-edge/src/types.js +0 -4
  12. package/dist/cloudflare-edge/src/worker.js +0 -106
  13. package/dist/cloudflare-pages/vite.config.js +0 -14
  14. package/dist/index.d.ts +0 -13
  15. package/dist/index.d.ts.map +0 -1
  16. package/dist/index.js +0 -12
  17. package/dist/index.js.map +0 -1
  18. package/dist/mcp-server/index.js.map +0 -1
  19. package/dist/mcp-server/mcp-stdio-server.js.map +0 -1
  20. package/dist/mcp-server/routes/claude.js.map +0 -1
  21. package/dist/mcp-server/routes/components.js.map +0 -1
  22. package/dist/mcp-server/routes/generateStory.js.map +0 -1
  23. package/dist/mcp-server/routes/hybridStories.js.map +0 -1
  24. package/dist/mcp-server/routes/memoryStories.js.map +0 -1
  25. package/dist/mcp-server/routes/storySync.js.map +0 -1
  26. package/dist/mcp-server/routes/updateStory.js +0 -246
  27. package/dist/mcp-server/sessionManager.js.map +0 -1
  28. package/dist/playground/components/AIAssistant/AIAssistant.d.ts +0 -6
  29. package/dist/playground/components/AIAssistant/AIAssistant.d.ts.map +0 -1
  30. package/dist/playground/components/AIAssistant/AIAssistant.js +0 -109
  31. package/dist/playground/components/AIAssistant/AIAssistant.js.map +0 -1
  32. package/dist/playground/components/AIAssistant/AIAssistant.module.css +0 -166
  33. package/dist/playground/components/Canvas/Canvas.d.ts +0 -9
  34. package/dist/playground/components/Canvas/Canvas.d.ts.map +0 -1
  35. package/dist/playground/components/Canvas/Canvas.js +0 -58
  36. package/dist/playground/components/Canvas/Canvas.js.map +0 -1
  37. package/dist/playground/components/Canvas/Canvas.module.css +0 -189
  38. package/dist/playground/components/Canvas/CanvasWithDnd.d.ts +0 -9
  39. package/dist/playground/components/Canvas/CanvasWithDnd.d.ts.map +0 -1
  40. package/dist/playground/components/Canvas/CanvasWithDnd.js +0 -158
  41. package/dist/playground/components/Canvas/CanvasWithDnd.js.map +0 -1
  42. package/dist/playground/components/Canvas/ComponentRenderer.d.ts +0 -15
  43. package/dist/playground/components/Canvas/ComponentRenderer.d.ts.map +0 -1
  44. package/dist/playground/components/Canvas/ComponentRenderer.js +0 -177
  45. package/dist/playground/components/Canvas/ComponentRenderer.js.map +0 -1
  46. package/dist/playground/components/Canvas/DraggableComponent.d.ts +0 -15
  47. package/dist/playground/components/Canvas/DraggableComponent.d.ts.map +0 -1
  48. package/dist/playground/components/Canvas/DraggableComponent.js +0 -49
  49. package/dist/playground/components/Canvas/DraggableComponent.js.map +0 -1
  50. package/dist/playground/components/Canvas/index.d.ts +0 -9
  51. package/dist/playground/components/Canvas/index.d.ts.map +0 -1
  52. package/dist/playground/components/Canvas/index.js +0 -5
  53. package/dist/playground/components/Canvas/index.js.map +0 -1
  54. package/dist/playground/components/CodeView/CodeView.d.ts +0 -12
  55. package/dist/playground/components/CodeView/CodeView.d.ts.map +0 -1
  56. package/dist/playground/components/CodeView/CodeView.js +0 -77
  57. package/dist/playground/components/CodeView/CodeView.js.map +0 -1
  58. package/dist/playground/components/CodeView/CodeView.module.css +0 -178
  59. package/dist/playground/components/ComponentPalette/ComponentPalette.d.ts +0 -17
  60. package/dist/playground/components/ComponentPalette/ComponentPalette.d.ts.map +0 -1
  61. package/dist/playground/components/ComponentPalette/ComponentPalette.js +0 -138
  62. package/dist/playground/components/ComponentPalette/ComponentPalette.js.map +0 -1
  63. package/dist/playground/components/ComponentPalette/ComponentPalette.module.css +0 -217
  64. package/dist/playground/components/ComponentPalette/index.d.ts +0 -3
  65. package/dist/playground/components/ComponentPalette/index.d.ts.map +0 -1
  66. package/dist/playground/components/ComponentPalette/index.js +0 -2
  67. package/dist/playground/components/ComponentPalette/index.js.map +0 -1
  68. package/dist/playground/components/DropZone/DropZone.d.ts +0 -17
  69. package/dist/playground/components/DropZone/DropZone.d.ts.map +0 -1
  70. package/dist/playground/components/DropZone/DropZone.js +0 -73
  71. package/dist/playground/components/DropZone/DropZone.js.map +0 -1
  72. package/dist/playground/components/DropZone/DropZone.module.css +0 -86
  73. package/dist/playground/components/ExportDialog/ExportDialog.d.ts +0 -10
  74. package/dist/playground/components/ExportDialog/ExportDialog.d.ts.map +0 -1
  75. package/dist/playground/components/ExportDialog/ExportDialog.js +0 -57
  76. package/dist/playground/components/ExportDialog/ExportDialog.js.map +0 -1
  77. package/dist/playground/components/ExportDialog/ExportDialog.module.css +0 -328
  78. package/dist/playground/components/LayoutHelpers/LayoutHelpers.d.ts +0 -134
  79. package/dist/playground/components/LayoutHelpers/LayoutHelpers.d.ts.map +0 -1
  80. package/dist/playground/components/LayoutHelpers/LayoutHelpers.js +0 -254
  81. package/dist/playground/components/LayoutHelpers/LayoutHelpers.js.map +0 -1
  82. package/dist/playground/components/LayoutHelpers/index.d.ts +0 -3
  83. package/dist/playground/components/LayoutHelpers/index.d.ts.map +0 -1
  84. package/dist/playground/components/LayoutHelpers/index.js +0 -2
  85. package/dist/playground/components/LayoutHelpers/index.js.map +0 -1
  86. package/dist/playground/components/Playground/Playground.d.ts +0 -10
  87. package/dist/playground/components/Playground/Playground.d.ts.map +0 -1
  88. package/dist/playground/components/Playground/Playground.js +0 -128
  89. package/dist/playground/components/Playground/Playground.js.map +0 -1
  90. package/dist/playground/components/Playground/Playground.module.css +0 -308
  91. package/dist/playground/components/PropertiesPanel/PropertiesPanel.d.ts +0 -10
  92. package/dist/playground/components/PropertiesPanel/PropertiesPanel.d.ts.map +0 -1
  93. package/dist/playground/components/PropertiesPanel/PropertiesPanel.js +0 -150
  94. package/dist/playground/components/PropertiesPanel/PropertiesPanel.js.map +0 -1
  95. package/dist/playground/components/PropertiesPanel/PropertiesPanel.module.css +0 -155
  96. package/dist/playground/components/PropertiesPanel/index.d.ts +0 -3
  97. package/dist/playground/components/PropertiesPanel/index.d.ts.map +0 -1
  98. package/dist/playground/components/PropertiesPanel/index.js +0 -2
  99. package/dist/playground/components/PropertiesPanel/index.js.map +0 -1
  100. package/dist/playground/components/PropertyEditors/BooleanEditor.d.ts +0 -12
  101. package/dist/playground/components/PropertyEditors/BooleanEditor.d.ts.map +0 -1
  102. package/dist/playground/components/PropertyEditors/BooleanEditor.js +0 -14
  103. package/dist/playground/components/PropertyEditors/BooleanEditor.js.map +0 -1
  104. package/dist/playground/components/PropertyEditors/ColorEditor.d.ts +0 -12
  105. package/dist/playground/components/PropertyEditors/ColorEditor.d.ts.map +0 -1
  106. package/dist/playground/components/PropertyEditors/ColorEditor.js +0 -62
  107. package/dist/playground/components/PropertyEditors/ColorEditor.js.map +0 -1
  108. package/dist/playground/components/PropertyEditors/IconEditor.d.ts +0 -12
  109. package/dist/playground/components/PropertyEditors/IconEditor.d.ts.map +0 -1
  110. package/dist/playground/components/PropertyEditors/IconEditor.js +0 -123
  111. package/dist/playground/components/PropertyEditors/IconEditor.js.map +0 -1
  112. package/dist/playground/components/PropertyEditors/NumberEditor.d.ts +0 -15
  113. package/dist/playground/components/PropertyEditors/NumberEditor.d.ts.map +0 -1
  114. package/dist/playground/components/PropertyEditors/NumberEditor.js +0 -46
  115. package/dist/playground/components/PropertyEditors/NumberEditor.js.map +0 -1
  116. package/dist/playground/components/PropertyEditors/PropertyEditors.module.css +0 -432
  117. package/dist/playground/components/PropertyEditors/SelectEditor.d.ts +0 -19
  118. package/dist/playground/components/PropertyEditors/SelectEditor.d.ts.map +0 -1
  119. package/dist/playground/components/PropertyEditors/SelectEditor.js +0 -17
  120. package/dist/playground/components/PropertyEditors/SelectEditor.js.map +0 -1
  121. package/dist/playground/components/PropertyEditors/SpacingEditor.d.ts +0 -19
  122. package/dist/playground/components/PropertyEditors/SpacingEditor.d.ts.map +0 -1
  123. package/dist/playground/components/PropertyEditors/SpacingEditor.js +0 -162
  124. package/dist/playground/components/PropertyEditors/SpacingEditor.js.map +0 -1
  125. package/dist/playground/components/PropertyEditors/SpacingEditor.module.css +0 -214
  126. package/dist/playground/components/PropertyEditors/TextEditor.d.ts +0 -14
  127. package/dist/playground/components/PropertyEditors/TextEditor.d.ts.map +0 -1
  128. package/dist/playground/components/PropertyEditors/TextEditor.js +0 -38
  129. package/dist/playground/components/PropertyEditors/TextEditor.js.map +0 -1
  130. package/dist/playground/components/PropertyEditors/TokenEditor.d.ts +0 -23
  131. package/dist/playground/components/PropertyEditors/TokenEditor.d.ts.map +0 -1
  132. package/dist/playground/components/PropertyEditors/TokenEditor.js +0 -50
  133. package/dist/playground/components/PropertyEditors/TokenEditor.js.map +0 -1
  134. package/dist/playground/components/PropertyEditors/index.d.ts +0 -20
  135. package/dist/playground/components/PropertyEditors/index.d.ts.map +0 -1
  136. package/dist/playground/components/PropertyEditors/index.js +0 -12
  137. package/dist/playground/components/PropertyEditors/index.js.map +0 -1
  138. package/dist/playground/components/TreeView/TreeView.d.ts +0 -10
  139. package/dist/playground/components/TreeView/TreeView.d.ts.map +0 -1
  140. package/dist/playground/components/TreeView/TreeView.js +0 -146
  141. package/dist/playground/components/TreeView/TreeView.js.map +0 -1
  142. package/dist/playground/components/TreeView/TreeView.module.css +0 -214
  143. package/dist/playground/components/TreeView/index.d.ts +0 -3
  144. package/dist/playground/components/TreeView/index.d.ts.map +0 -1
  145. package/dist/playground/components/TreeView/index.js +0 -2
  146. package/dist/playground/components/TreeView/index.js.map +0 -1
  147. package/dist/playground/config/propertyDefinitions.d.ts +0 -73
  148. package/dist/playground/config/propertyDefinitions.d.ts.map +0 -1
  149. package/dist/playground/config/propertyDefinitions.js +0 -809
  150. package/dist/playground/config/propertyDefinitions.js.map +0 -1
  151. package/dist/playground/hooks/useKeyboardShortcuts.d.ts +0 -38
  152. package/dist/playground/hooks/useKeyboardShortcuts.d.ts.map +0 -1
  153. package/dist/playground/hooks/useKeyboardShortcuts.js +0 -191
  154. package/dist/playground/hooks/useKeyboardShortcuts.js.map +0 -1
  155. package/dist/playground/index.d.ts +0 -21
  156. package/dist/playground/index.d.ts.map +0 -1
  157. package/dist/playground/index.js +0 -23
  158. package/dist/playground/index.js.map +0 -1
  159. package/dist/playground/services/CodeGenerator.d.ts +0 -73
  160. package/dist/playground/services/CodeGenerator.d.ts.map +0 -1
  161. package/dist/playground/services/CodeGenerator.js +0 -359
  162. package/dist/playground/services/CodeGenerator.js.map +0 -1
  163. package/dist/playground/services/DragDropManager.d.ts +0 -95
  164. package/dist/playground/services/DragDropManager.d.ts.map +0 -1
  165. package/dist/playground/services/DragDropManager.js +0 -408
  166. package/dist/playground/services/DragDropManager.js.map +0 -1
  167. package/dist/playground/services/StoryParser.d.ts +0 -73
  168. package/dist/playground/services/StoryParser.d.ts.map +0 -1
  169. package/dist/playground/services/StoryParser.js +0 -419
  170. package/dist/playground/services/StoryParser.js.map +0 -1
  171. package/dist/playground/store/playgroundStore.d.ts +0 -86
  172. package/dist/playground/store/playgroundStore.d.ts.map +0 -1
  173. package/dist/playground/store/playgroundStore.js +0 -337
  174. package/dist/playground/store/playgroundStore.js.map +0 -1
  175. package/dist/playground/stories/PlaygroundDragDrop.stories.d.ts +0 -13
  176. package/dist/playground/stories/PlaygroundDragDrop.stories.d.ts.map +0 -1
  177. package/dist/playground/stories/PlaygroundDragDrop.stories.js +0 -227
  178. package/dist/playground/stories/PlaygroundDragDrop.stories.js.map +0 -1
  179. package/dist/playground/stories/PlaygroundPhase4.stories.d.ts +0 -13
  180. package/dist/playground/stories/PlaygroundPhase4.stories.d.ts.map +0 -1
  181. package/dist/playground/stories/PlaygroundPhase4.stories.js +0 -334
  182. package/dist/playground/stories/PlaygroundPhase4.stories.js.map +0 -1
  183. package/dist/playground/stories/PlaygroundPhase5.stories.d.ts +0 -14
  184. package/dist/playground/stories/PlaygroundPhase5.stories.d.ts.map +0 -1
  185. package/dist/playground/stories/PlaygroundPhase5.stories.js +0 -512
  186. package/dist/playground/stories/PlaygroundPhase5.stories.js.map +0 -1
  187. package/dist/playground/stories/PlaygroundProperties.stories.d.ts +0 -13
  188. package/dist/playground/stories/PlaygroundProperties.stories.d.ts.map +0 -1
  189. package/dist/playground/stories/PlaygroundProperties.stories.js +0 -342
  190. package/dist/playground/stories/PlaygroundProperties.stories.js.map +0 -1
  191. package/dist/playground/types/index.d.ts +0 -251
  192. package/dist/playground/types/index.d.ts.map +0 -1
  193. package/dist/playground/types/index.js +0 -5
  194. package/dist/playground/types/index.js.map +0 -1
  195. package/dist/scripts/verify-framework-adapters.js +0 -105
  196. package/dist/story-generator/componentBlacklist.js.map +0 -1
  197. package/dist/story-generator/componentDiscovery.js.map +0 -1
  198. package/dist/story-generator/configLoader.js.map +0 -1
  199. package/dist/story-generator/considerationsLoader.js.map +0 -1
  200. package/dist/story-generator/documentation-sources.js.map +0 -1
  201. package/dist/story-generator/documentationLoader.js.map +0 -1
  202. package/dist/story-generator/dynamicPackageDiscovery.js.map +0 -1
  203. package/dist/story-generator/enhancedComponentDiscovery.js.map +0 -1
  204. package/dist/story-generator/generateStory.js.map +0 -1
  205. package/dist/story-generator/gitignoreManager.js.map +0 -1
  206. package/dist/story-generator/inMemoryStoryService.js.map +0 -1
  207. package/dist/story-generator/logger.js.map +0 -1
  208. package/dist/story-generator/postProcessStory.js.map +0 -1
  209. package/dist/story-generator/productionGitignoreManager.js.map +0 -1
  210. package/dist/story-generator/promptGenerator.js.map +0 -1
  211. package/dist/story-generator/providerPresets.d.ts +0 -54
  212. package/dist/story-generator/providerPresets.d.ts.map +0 -1
  213. package/dist/story-generator/providerPresets.js +0 -214
  214. package/dist/story-generator/storyHistory.js.map +0 -1
  215. package/dist/story-generator/storySync.js.map +0 -1
  216. package/dist/story-generator/storyTracker.js.map +0 -1
  217. package/dist/story-generator/storyValidator.js.map +0 -1
  218. package/dist/story-generator/test_validation.d.ts +0 -2
  219. package/dist/story-generator/test_validation.d.ts.map +0 -1
  220. package/dist/story-generator/test_validation.js +0 -51
  221. package/dist/story-generator/universalDesignSystemAdapter.js.map +0 -1
  222. package/dist/story-generator/urlRedirectService.js.map +0 -1
  223. package/dist/story-generator/validateStory.js.map +0 -1
  224. package/dist/story-ui.config.js.map +0 -1
  225. package/dist/story-ui.config.loader.d.ts +0 -36
  226. package/dist/story-ui.config.loader.d.ts.map +0 -1
  227. package/dist/story-ui.config.loader.js +0 -205
  228. package/dist/story-ui.config.loader.js.map +0 -1
  229. package/dist/temp/package/templates/StoryUI/StoryUIPanel.js +0 -807
  230. package/dist/temp/package/templates/StoryUI/StoryUIPanel.stories.js +0 -37
  231. package/dist/temp/package/templates/StoryUI/index.js +0 -2
  232. package/dist/templates/StoryUI/StoryUIPanel.js.map +0 -1
  233. package/dist/templates/StoryUI/StoryUIPanel.stories.js.map +0 -1
  234. package/dist/templates/StoryUI/index.js.map +0 -1
  235. package/dist/templates/StoryUI/manager.d.ts +0 -14
  236. package/dist/templates/StoryUI/manager.d.ts.map +0 -1
  237. package/dist/templates/production-app/src/App.d.ts +0 -10
  238. package/dist/templates/production-app/src/App.d.ts.map +0 -1
  239. package/dist/templates/production-app/src/App.js +0 -653
  240. package/dist/templates/production-app/src/LivePreviewRenderer.d.ts +0 -24
  241. package/dist/templates/production-app/src/LivePreviewRenderer.d.ts.map +0 -1
  242. package/dist/templates/production-app/src/LivePreviewRenderer.js +0 -199
  243. package/dist/templates/production-app/src/componentRegistry.d.ts +0 -20
  244. package/dist/templates/production-app/src/componentRegistry.d.ts.map +0 -1
  245. package/dist/templates/production-app/src/componentRegistry.js +0 -316
  246. package/dist/templates/production-app/src/main.d.ts +0 -9
  247. package/dist/templates/production-app/src/main.d.ts.map +0 -1
  248. package/dist/templates/production-app/src/main.js +0 -18
  249. package/dist/templates/production-app/vite.config.d.ts +0 -3
  250. package/dist/templates/production-app/vite.config.d.ts.map +0 -1
  251. package/dist/templates/production-app/vite.config.js +0 -71
  252. package/dist/test-storybooks/angular-material-storybook/src/main.js +0 -66
  253. package/dist/test-storybooks/chakra-storybook/vite.config.js +0 -6
  254. package/dist/test-storybooks/mantine-storybook/vite.config.js +0 -93
  255. package/dist/test-storybooks/web-components-shoelace/vite.config.js +0 -9
  256. package/dist/tsconfig.tsbuildinfo +0 -1
  257. package/dist/visual-builder/components/Canvas/Canvas.js +0 -70
  258. package/dist/visual-builder/components/Canvas/ComponentRenderer.js +0 -545
  259. package/dist/visual-builder/components/CodeExporter/CodeExporter.js +0 -25
  260. package/dist/visual-builder/components/CodeExporter/codeGenerator.js +0 -99
  261. package/dist/visual-builder/components/ComponentPalette/ComponentPalette.js +0 -8
  262. package/dist/visual-builder/components/ComponentPalette/ComponentPaletteItem.js +0 -51
  263. package/dist/visual-builder/components/EmbeddedVisualBuilder.js +0 -107
  264. package/dist/visual-builder/components/PropertyEditor/PropertyEditor.js +0 -16
  265. package/dist/visual-builder/components/PropertyEditor/PropertyForm.js +0 -88
  266. package/dist/visual-builder/components/PropertyEditor/SpacingControl.js +0 -145
  267. package/dist/visual-builder/components/PropertyEditor/SpacingEditor.js +0 -32
  268. package/dist/visual-builder/components/StoryManager/SaveOnlyManager.js +0 -94
  269. package/dist/visual-builder/components/StoryManager/StoryManager.js +0 -68
  270. package/dist/visual-builder/components/StoryManager/index.js +0 -1
  271. package/dist/visual-builder/components/VisualBuilder.js +0 -256
  272. package/dist/visual-builder/config/componentRegistry.js +0 -1758
  273. package/dist/visual-builder/decorators/VisualBuilderDecorator.js +0 -184
  274. package/dist/visual-builder/example-integration.js +0 -59
  275. package/dist/visual-builder/example.js +0 -23
  276. package/dist/visual-builder/hooks/useDragAndDrop.js +0 -137
  277. package/dist/visual-builder/hooks/useSelection.js +0 -27
  278. package/dist/visual-builder/index.js +0 -7
  279. package/dist/visual-builder/store/visualBuilderStore.js +0 -305
  280. package/dist/visual-builder/types/index.js +0 -1
  281. package/dist/visual-builder/utils/__tests__/storyFileUpdater.test.js +0 -145
  282. package/dist/visual-builder/utils/aiParser.js +0 -336
  283. package/dist/visual-builder/utils/componentTreeUtils.js +0 -111
  284. package/dist/visual-builder/utils/parserValidation.js +0 -122
  285. package/dist/visual-builder/utils/storyFileManager.js +0 -73
  286. package/dist/visual-builder/utils/storyFileUpdater.js +0 -326
  287. package/dist/visual-builder/utils/storyNameExtraction.test.js +0 -211
  288. package/dist/visual-builder/utils/storyPersistence.js +0 -180
  289. 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
- });