@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,99 +0,0 @@
1
- export const generateJSXCode = (components) => {
2
- if (components.length === 0) {
3
- return `import React from 'react';
4
- import { Box } from '@mantine/core';
5
-
6
- export const GeneratedComponent = () => {
7
- return (
8
- <Box>
9
- {/* Add your components here */}
10
- </Box>
11
- );
12
- };`;
13
- }
14
- const imports = generateImports(components);
15
- const componentCode = generateComponentCode(components);
16
- return `import React from 'react';
17
- ${imports}
18
-
19
- export const GeneratedComponent = () => {
20
- return (
21
- <>
22
- ${componentCode.split('\n').map(line => line ? ` ${line}` : '').join('\n')}
23
- </>
24
- );
25
- };`;
26
- };
27
- const generateImports = (components) => {
28
- const usedComponents = new Set();
29
- const collectComponents = (comps) => {
30
- comps.forEach(comp => {
31
- usedComponents.add(comp.type);
32
- if (comp.children) {
33
- collectComponents(comp.children);
34
- }
35
- });
36
- };
37
- collectComponents(components);
38
- const sortedComponents = Array.from(usedComponents).sort();
39
- return `import { ${sortedComponents.join(', ')} } from '@mantine/core';`;
40
- };
41
- const generateComponentCode = (components, indent = 0) => {
42
- const indentStr = ' '.repeat(indent);
43
- return components.map(component => {
44
- const { type, props, children } = component;
45
- const hasChildren = children && children.length > 0;
46
- const hasTextContent = props.children && typeof props.children === 'string';
47
- // Generate props string
48
- const propsString = generatePropsString(props, type);
49
- if (hasChildren) {
50
- // Component with children
51
- return `${indentStr}<${type}${propsString}>
52
- ${generateComponentCode(children, indent + 1)}
53
- ${indentStr}</${type}>`;
54
- }
55
- else if (hasTextContent) {
56
- // Component with text content
57
- return `${indentStr}<${type}${propsString}>
58
- ${indentStr} ${props.children}
59
- ${indentStr}</${type}>`;
60
- }
61
- else {
62
- // Self-closing component
63
- return `${indentStr}<${type}${propsString} />`;
64
- }
65
- }).join('\n');
66
- };
67
- const generatePropsString = (props, componentType) => {
68
- const propEntries = Object.entries(props);
69
- // Filter out children prop for components that don't use it as text content
70
- const filteredProps = propEntries.filter(([key, value]) => {
71
- if (key === 'children') {
72
- // Keep children prop only for text-based components
73
- return ['Button', 'Text', 'Title'].includes(componentType) && typeof value === 'string';
74
- }
75
- // Filter out undefined, null, empty string, and default values
76
- if (value === undefined || value === null || value === '')
77
- return false;
78
- return true;
79
- });
80
- if (filteredProps.length === 0)
81
- return '';
82
- const propsString = filteredProps
83
- .map(([key, value]) => {
84
- if (typeof value === 'boolean') {
85
- return value ? key : `${key}={false}`;
86
- }
87
- else if (typeof value === 'string') {
88
- return `${key}="${value}"`;
89
- }
90
- else if (typeof value === 'number') {
91
- return `${key}={${value}}`;
92
- }
93
- else {
94
- return `${key}={${JSON.stringify(value)}}`;
95
- }
96
- })
97
- .join(' ');
98
- return propsString ? ` ${propsString}` : '';
99
- };
@@ -1,8 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Text, Accordion } from '@mantine/core';
3
- import { ComponentPaletteItem } from './ComponentPaletteItem';
4
- import { getComponentsByCategory } from '../../config/componentRegistry';
5
- export const ComponentPalette = () => {
6
- const componentsByCategory = getComponentsByCategory();
7
- return (_jsx(Box, { p: "sm", children: _jsx(Accordion, { defaultValue: ['Layout', 'Inputs', 'Typography'], multiple: true, children: Object.entries(componentsByCategory).map(([category, components]) => (_jsxs(Accordion.Item, { value: category, children: [_jsx(Accordion.Control, { children: _jsx(Text, { fw: 500, size: "sm", children: category }) }), _jsx(Accordion.Panel, { children: _jsx(Box, { style: { display: 'flex', flexDirection: 'column', gap: '0.5rem' }, children: components.map((component) => (_jsx(ComponentPaletteItem, { config: component }, component.type))) }) })] }, category))) }) }));
8
- };
@@ -1,51 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useDraggable } from '@dnd-kit/core';
3
- import { Box, Text } from '@mantine/core';
4
- export const ComponentPaletteItem = ({ config }) => {
5
- const { attributes, listeners, setNodeRef, transform, isDragging, } = useDraggable({
6
- id: `palette-${config.type}`,
7
- data: {
8
- isFromPalette: true,
9
- componentType: config.type,
10
- config
11
- }
12
- });
13
- const style = transform ? {
14
- transform: `translate3d(${transform.x}px, ${transform.y}px, 0)`,
15
- opacity: isDragging ? 0.5 : 1,
16
- zIndex: isDragging ? 1000 : 1,
17
- } : undefined;
18
- return (_jsxs(Box, { ref: setNodeRef, style: {
19
- ...style,
20
- padding: '.75rem',
21
- backgroundColor: '#f8f9fa',
22
- borderRadius: '6px',
23
- border: '1px solid #e9ecef',
24
- cursor: 'grab',
25
- userSelect: 'none',
26
- transition: 'all 0.2s ease',
27
- ':hover': {
28
- backgroundColor: '#e9ecef',
29
- borderColor: '#dee2e6'
30
- }
31
- }, ...attributes, ...listeners, onMouseEnter: (e) => {
32
- e.currentTarget.style.backgroundColor = '#e9ecef';
33
- e.currentTarget.style.borderColor = '#dee2e6';
34
- }, onMouseLeave: (e) => {
35
- e.currentTarget.style.backgroundColor = '#f8f9fa';
36
- e.currentTarget.style.borderColor = '#e9ecef';
37
- }, children: [_jsx(Text, { size: "sm", fw: 500, children: config.displayName }), _jsx(Text, { size: "xs", c: "dimmed", mt: 2, children: getComponentDescription(config.type) })] }));
38
- };
39
- const getComponentDescription = (type) => {
40
- const descriptions = {
41
- Button: 'Interactive button element',
42
- TextInput: 'Text input field',
43
- Text: 'Text display element',
44
- Title: 'Heading element',
45
- Container: 'Layout container',
46
- Group: 'Horizontal layout',
47
- Stack: 'Vertical layout',
48
- Card: 'Card container'
49
- };
50
- return descriptions[type] || 'Component';
51
- };
@@ -1,107 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { useEffect, useState } from 'react';
3
- import { DndContext } from '@dnd-kit/core';
4
- import { Box, Group, Button, Alert, Text, Modal, Stack } from '@mantine/core';
5
- import { Canvas } from './Canvas/Canvas';
6
- import { ComponentPalette } from './ComponentPalette/ComponentPalette';
7
- import { PropertyEditor } from './PropertyEditor/PropertyEditor';
8
- import { CodeExporter } from './CodeExporter/CodeExporter';
9
- import { useDragAndDrop } from '../hooks/useDragAndDrop';
10
- import { useVisualBuilderStore } from '../store/visualBuilderStore';
11
- import { parseAIGeneratedCode } from '../utils/aiParser';
12
- export const EmbeddedVisualBuilder = ({ initialCode, height = '600px', showPalette = true, showProperties = true, onCodeExport, compact = false, storyMetadata }) => {
13
- const { sensors, handleDragStart, handleDragOver, handleDragEnd, handleDragCancel } = useDragAndDrop();
14
- const { components, clearCanvas, openCodeModal, loadFromCode, loadFromAI, importFromStoryUI, setCurrentStoryName } = useVisualBuilderStore();
15
- const [loadError, setLoadError] = useState(null);
16
- const [loadWarnings, setLoadWarnings] = useState([]);
17
- const [showLoadDialog, setShowLoadDialog] = useState(false);
18
- // Load initial code if provided
19
- useEffect(() => {
20
- if (initialCode) {
21
- handleLoadCode(initialCode);
22
- }
23
- }, [initialCode]);
24
- const handleLoadCode = async (code) => {
25
- setLoadError(null);
26
- setLoadWarnings([]);
27
- try {
28
- // First try to parse as Story UI content
29
- if (code.includes('render:') || code.includes('.stories.')) {
30
- const storyResult = await importFromStoryUI(code);
31
- if (storyResult.success) {
32
- // Use story metadata if available and story name extraction failed
33
- if (storyMetadata?.title && storyMetadata.isExisting) {
34
- const { currentStoryName } = useVisualBuilderStore.getState();
35
- if (currentStoryName === 'Imported Story') {
36
- setCurrentStoryName(storyMetadata.title);
37
- }
38
- }
39
- if (storyResult.warnings.length > 0) {
40
- setLoadWarnings(storyResult.warnings);
41
- setShowLoadDialog(true);
42
- }
43
- return;
44
- }
45
- else {
46
- // If Story UI parsing fails, fall back to AI parser
47
- console.warn('Story UI parsing failed, falling back to AI parser:', storyResult.errors);
48
- }
49
- }
50
- // Fall back to AI generated code parser
51
- const result = parseAIGeneratedCode(code);
52
- if (result.errors.length > 0) {
53
- setLoadError(result.errors.join(', '));
54
- return;
55
- }
56
- if (result.warnings.length > 0) {
57
- setLoadWarnings(result.warnings);
58
- }
59
- loadFromAI(result.components);
60
- if (result.warnings.length > 0) {
61
- setShowLoadDialog(true);
62
- }
63
- }
64
- catch (error) {
65
- setLoadError(error instanceof Error ? error.message : 'Failed to parse code');
66
- }
67
- };
68
- const handleExport = async () => {
69
- if (onCodeExport && components.length > 0) {
70
- try {
71
- // Generate code and pass to callback
72
- const { generateJSXCode } = await import('./CodeExporter/codeGenerator');
73
- const code = generateJSXCode(components);
74
- onCodeExport(code);
75
- }
76
- catch (error) {
77
- console.error('Failed to generate code:', error);
78
- openCodeModal();
79
- }
80
- }
81
- else {
82
- openCodeModal();
83
- }
84
- };
85
- const paletteWidth = showPalette ? (compact ? 240 : 280) : 0;
86
- const propertiesWidth = showProperties ? (compact ? 280 : 320) : 0;
87
- return (_jsxs(_Fragment, { children: [_jsx(DndContext, { sensors: sensors, onDragStart: handleDragStart, onDragOver: handleDragOver, onDragEnd: handleDragEnd, onDragCancel: handleDragCancel, children: _jsxs(Box, { style: {
88
- display: 'flex',
89
- height,
90
- backgroundColor: '#f8f9fa',
91
- border: '1px solid #e9ecef',
92
- borderRadius: compact ? '8px' : '12px',
93
- overflow: 'hidden'
94
- }, children: [showPalette && (_jsxs(Box, { style: {
95
- width: paletteWidth,
96
- backgroundColor: 'white',
97
- borderRight: '1px solid #e9ecef',
98
- display: 'flex',
99
- flexDirection: 'column'
100
- }, children: [_jsxs(Box, { p: compact ? 'sm' : 'md', style: { borderBottom: '1px solid #e9ecef' }, children: [_jsx(Group, { justify: "space-between", mb: "xs", children: _jsx(Text, { size: compact ? 'sm' : 'md', fw: 600, children: "Components" }) }), _jsxs(Group, { gap: "xs", children: [_jsx(Button, { size: "xs", variant: "outline", onClick: clearCanvas, children: "Clear" }), _jsx(Button, { size: "xs", variant: "filled", onClick: handleExport, children: "Export" })] })] }), _jsx(Box, { style: { flex: 1, overflow: 'auto' }, children: _jsx(ComponentPalette, {}) })] })), _jsxs(Box, { style: { flex: 1, display: 'flex', flexDirection: 'column' }, children: [_jsx(Box, { p: compact ? 'sm' : 'md', style: { borderBottom: '1px solid #e9ecef', backgroundColor: 'white' }, children: _jsxs(Group, { justify: "space-between", children: [_jsx(Text, { size: compact ? 'sm' : 'md', fw: 600, children: "Canvas" }), !showPalette && (_jsxs(Group, { gap: "xs", children: [_jsx(Button, { size: "xs", variant: "outline", onClick: clearCanvas, children: "Clear" }), _jsx(Button, { size: "xs", variant: "filled", onClick: handleExport, children: "Export" })] }))] }) }), loadError && (_jsx(Box, { p: "sm", children: _jsx(Alert, { color: "red", title: "Parse Error", children: loadError }) })), _jsx(Box, { style: { flex: 1, overflow: 'auto' }, children: _jsx(Canvas, {}) })] }), showProperties && (_jsxs(Box, { style: {
101
- width: propertiesWidth,
102
- backgroundColor: 'white',
103
- borderLeft: '1px solid #e9ecef',
104
- display: 'flex',
105
- flexDirection: 'column'
106
- }, children: [_jsx(Box, { p: compact ? 'sm' : 'md', style: { borderBottom: '1px solid #e9ecef' }, children: _jsx(Text, { size: compact ? 'sm' : 'md', fw: 600, children: "Properties" }) }), _jsx(Box, { style: { flex: 1, overflow: 'auto' }, children: _jsx(PropertyEditor, {}) })] })), _jsx(CodeExporter, {})] }) }), _jsx(Modal, { opened: showLoadDialog, onClose: () => setShowLoadDialog(false), title: "Code Loaded with Warnings", size: "md", children: _jsxs(Stack, { gap: "md", children: [_jsx(Text, { children: "The code was successfully loaded into the Visual Builder, but there were some warnings:" }), _jsx(Box, { p: "md", style: { backgroundColor: '#fff3cd', borderRadius: '4px' }, children: loadWarnings.map((warning, index) => (_jsxs(Text, { size: "sm", c: "orange.8", children: ["\u2022 ", warning] }, index))) }), _jsx(Text, { size: "sm", c: "dimmed", children: "These warnings don't prevent you from editing the component, but you may want to review them." }), _jsx(Group, { justify: "flex-end", children: _jsx(Button, { onClick: () => setShowLoadDialog(false), children: "Continue Editing" }) })] }) })] }));
107
- };
@@ -1,16 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Box, Text, Button, Group } from '@mantine/core';
3
- import { PropertyForm } from './PropertyForm';
4
- import { useVisualBuilderStore } from '../../store/visualBuilderStore';
5
- export const PropertyEditor = () => {
6
- const { selectedComponent, removeComponent } = useVisualBuilderStore();
7
- if (!selectedComponent) {
8
- return (_jsx(Box, { p: "sm", children: _jsx(Text, { c: "dimmed", ta: "center", mt: "xl", children: "Select a component to edit its properties" }) }));
9
- }
10
- const handleDelete = () => {
11
- if (selectedComponent) {
12
- removeComponent(selectedComponent.id);
13
- }
14
- };
15
- return (_jsxs(Box, { p: "sm", children: [_jsxs(Box, { mb: "lg", children: [_jsxs(Group, { justify: "space-between", align: "center", mb: "sm", children: [_jsx(Text, { fw: 600, size: "sm", children: selectedComponent.type }), _jsx(Button, { size: "xs", variant: "light", color: "red", onClick: handleDelete, children: "Delete" })] }), _jsxs(Text, { size: "xs", c: "dimmed", children: ["Component ID: ", selectedComponent.id] })] }), _jsx(PropertyForm, { componentId: selectedComponent.id, componentType: selectedComponent.type, currentProps: selectedComponent.props })] }));
16
- };
@@ -1,88 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState, useEffect } from 'react';
3
- import { Box, TextInput, Select, Switch, Text, Divider, Accordion, Group, Badge } from '@mantine/core';
4
- import { useVisualBuilderStore } from '../../store/visualBuilderStore';
5
- import { getComponentConfig } from '../../config/componentRegistry';
6
- import { useDebouncedCallback } from '@mantine/hooks';
7
- import { SpacingControl } from './SpacingControl';
8
- export const PropertyForm = ({ componentId, componentType, currentProps }) => {
9
- const { updateComponent } = useVisualBuilderStore();
10
- const config = getComponentConfig(componentType);
11
- // Local state for inputs to prevent focus loss
12
- const [localValues, setLocalValues] = useState({});
13
- // Sync local values when currentProps changes
14
- useEffect(() => {
15
- setLocalValues(currentProps);
16
- }, [currentProps]);
17
- if (!config) {
18
- return (_jsx(Text, { c: "dimmed", ta: "center", children: "No properties available for this component" }));
19
- }
20
- // Debounced update to store for text inputs
21
- const debouncedUpdate = useDebouncedCallback((propertyName, value) => {
22
- updateComponent(componentId, {
23
- props: {
24
- ...currentProps,
25
- [propertyName]: value
26
- }
27
- });
28
- }, 300);
29
- // Immediate update for non-text inputs
30
- const handleImmediatePropertyChange = (propertyName, value) => {
31
- const newProps = { ...currentProps, [propertyName]: value };
32
- setLocalValues(newProps);
33
- updateComponent(componentId, {
34
- props: newProps
35
- });
36
- };
37
- // Handle text input changes with debouncing
38
- const handleTextPropertyChange = (propertyName, value) => {
39
- const newProps = { ...currentProps, [propertyName]: value };
40
- setLocalValues(newProps);
41
- debouncedUpdate(propertyName, value);
42
- };
43
- // Handle blur events to ensure immediate update
44
- const handleTextBlur = (propertyName, value) => {
45
- updateComponent(componentId, {
46
- props: {
47
- ...currentProps,
48
- [propertyName]: value
49
- }
50
- });
51
- };
52
- // Group properties by category
53
- const groupedProperties = config.properties.reduce((acc, property) => {
54
- const category = property.category || 'general';
55
- if (!acc[category]) {
56
- acc[category] = [];
57
- }
58
- acc[category].push(property);
59
- return acc;
60
- }, {});
61
- const renderPropertyInput = (property) => {
62
- // Skip individual spacing properties as they'll be handled by SpacingControl
63
- const spacingProps = ['m', 'mt', 'mr', 'mb', 'ml', 'mx', 'my', 'p', 'pt', 'pr', 'pb', 'pl', 'px', 'py'];
64
- if (spacingProps.includes(property.name)) {
65
- return null;
66
- }
67
- return (_jsxs(Box, { mb: "xs", children: [_jsxs(Group, { justify: "space-between", mb: "xs", children: [_jsx(Text, { size: "sm", fw: 500, children: property.name.charAt(0).toUpperCase() + property.name.slice(1) }), property.category && (_jsx(Badge, { size: "xs", variant: "light", color: "gray", children: property.category }))] }), property.description && (_jsx(Text, { size: "xs", c: "dimmed", mb: "xs", children: property.description })), property.type === 'string' && (_jsx(TextInput, { value: localValues[property.name] || '', onChange: (e) => handleTextPropertyChange(property.name, e.target.value), onBlur: (e) => handleTextBlur(property.name, e.target.value), placeholder: `Enter ${property.name}...`, size: "sm" })), property.type === 'number' && (_jsx(TextInput, { type: "number", value: localValues[property.name] || 0, onChange: (e) => handleTextPropertyChange(property.name, Number(e.target.value)), onBlur: (e) => handleTextBlur(property.name, Number(e.target.value)), placeholder: `Enter ${property.name}...`, size: "sm" })), property.type === 'boolean' && (_jsx(Switch, { checked: Boolean(localValues[property.name]), onChange: (e) => handleImmediatePropertyChange(property.name, e.target.checked), label: property.description || `Enable ${property.name}`, size: "sm" })), property.type === 'select' && property.options && (_jsx(Select, { value: String(localValues[property.name] !== undefined ? localValues[property.name] : property.defaultValue), onChange: (value) => {
68
- // Convert back to number if needed
69
- const finalValue = property.name === 'order' && value ? Number(value) : value;
70
- handleImmediatePropertyChange(property.name, finalValue);
71
- }, data: property.options.map(option => ({
72
- value: String(option),
73
- label: String(option)
74
- })), placeholder: `Select ${property.name}...`, size: "sm", clearable: true, allowDeselect: true })), property.type === 'color' && (_jsx(TextInput, { value: localValues[property.name] || '', onChange: (e) => handleTextPropertyChange(property.name, e.target.value), onBlur: (e) => handleTextBlur(property.name, e.target.value), placeholder: "Enter color (hex, rgb, or name)...", size: "sm" }))] }, property.name));
75
- };
76
- const categoryOrder = ['content', 'appearance', 'spacing', 'behavior'];
77
- const orderedCategories = categoryOrder.filter(cat => groupedProperties[cat]);
78
- const remainingCategories = Object.keys(groupedProperties).filter(cat => !categoryOrder.includes(cat));
79
- const allCategories = [...orderedCategories, ...remainingCategories];
80
- return (_jsx(Box, { children: _jsx(Accordion, { multiple: true, defaultValue: ['content', 'appearance', 'spacing'], children: allCategories.map((category) => (_jsxs(Accordion.Item, { value: category, children: [_jsx(Accordion.Control, { children: _jsxs(Group, { justify: "space-between", children: [_jsx(Text, { fw: 600, tt: "capitalize", children: category }), _jsx(Badge, { size: "xs", variant: "light", children: groupedProperties[category].length })] }) }), _jsx(Accordion.Panel, { children: category === 'spacing' ? (_jsx(SpacingControl, { values: localValues, onChange: handleImmediatePropertyChange })) : (groupedProperties[category]
81
- .map((property, propertyIndex) => {
82
- const renderedInput = renderPropertyInput(property);
83
- if (!renderedInput)
84
- return null;
85
- return (_jsxs(Box, { children: [renderedInput, propertyIndex < groupedProperties[category].length - 1 && (_jsx(Divider, { mb: "xs" }))] }, property.name));
86
- })
87
- .filter(Boolean)) })] }, category))) }) }));
88
- };
@@ -1,145 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState } from 'react';
3
- import { Box, Group, Text, ActionIcon, NumberInput, Select, Stack, Paper, Tooltip, Switch } from '@mantine/core';
4
- const SPACING_OPTIONS = ['0', 'xs', 'sm', 'md', 'lg', 'xl', 'auto'];
5
- export const SpacingControl = ({ values, onChange }) => {
6
- const [marginLocked, setMarginLocked] = useState(false);
7
- const [paddingLocked, setPaddingLocked] = useState(false);
8
- const [marginXLocked, setMarginXLocked] = useState(false);
9
- const [marginYLocked, setMarginYLocked] = useState(false);
10
- const [paddingXLocked, setPaddingXLocked] = useState(false);
11
- const [paddingYLocked, setPaddingYLocked] = useState(false);
12
- const [useNumbers, setUseNumbers] = useState(false);
13
- const handleChange = (property, value) => {
14
- const finalValue = value === null || value === '' ? undefined : value;
15
- onChange(property, finalValue);
16
- // Handle locked states
17
- if (marginLocked && property.startsWith('m') && !property.includes('x') && !property.includes('y')) {
18
- const props = ['mt', 'mr', 'mb', 'ml'];
19
- props.forEach(prop => {
20
- if (prop !== property)
21
- onChange(prop, finalValue);
22
- });
23
- }
24
- if (paddingLocked && property.startsWith('p') && !property.includes('x') && !property.includes('y')) {
25
- const props = ['pt', 'pr', 'pb', 'pl'];
26
- props.forEach(prop => {
27
- if (prop !== property)
28
- onChange(prop, finalValue);
29
- });
30
- }
31
- // Handle axis-specific locks
32
- if (marginXLocked && (property === 'ml' || property === 'mr')) {
33
- if (property === 'ml')
34
- onChange('mr', finalValue);
35
- if (property === 'mr')
36
- onChange('ml', finalValue);
37
- }
38
- if (marginYLocked && (property === 'mt' || property === 'mb')) {
39
- if (property === 'mt')
40
- onChange('mb', finalValue);
41
- if (property === 'mb')
42
- onChange('mt', finalValue);
43
- }
44
- if (paddingXLocked && (property === 'pl' || property === 'pr')) {
45
- if (property === 'pl')
46
- onChange('pr', finalValue);
47
- if (property === 'pr')
48
- onChange('pl', finalValue);
49
- }
50
- if (paddingYLocked && (property === 'pt' || property === 'pb')) {
51
- if (property === 'pt')
52
- onChange('pb', finalValue);
53
- if (property === 'pb')
54
- onChange('pt', finalValue);
55
- }
56
- };
57
- const renderSpacingInput = (property, placeholder) => {
58
- const value = values[property];
59
- if (useNumbers) {
60
- return (_jsxs(Group, { gap: 2, children: [_jsx(NumberInput, { value: typeof value === 'number' ? value : undefined, onChange: (val) => handleChange(property, val), placeholder: placeholder, size: "xs", w: 50, min: 0, hideControls: true }), _jsx(ActionIcon, { size: "xs", variant: "light", onClick: () => {
61
- const currentVal = typeof value === 'number' ? value : 0;
62
- handleChange(property, currentVal + 4);
63
- }, children: "+" }), _jsx(ActionIcon, { size: "xs", variant: "light", onClick: () => {
64
- const currentVal = typeof value === 'number' ? value : 0;
65
- handleChange(property, Math.max(0, currentVal - 4));
66
- }, children: "-" })] }));
67
- }
68
- return (_jsx(Select, { value: value ? String(value) : null, onChange: (val) => handleChange(property, val), data: SPACING_OPTIONS, placeholder: placeholder, size: "xs", w: 75, clearable: true, allowDeselect: true, styles: {
69
- dropdown: { zIndex: 1000 }
70
- } }));
71
- };
72
- return (_jsxs(Stack, { gap: "xs", children: [_jsxs(Group, { justify: "space-between", gap: "xs", children: [_jsx(Text, { size: "xs", fw: 500, children: "Spacing" }), _jsx(Switch, { label: "Numbers", size: "xs", checked: useNumbers, onChange: (event) => setUseNumbers(event.currentTarget.checked) })] }), _jsxs(Paper, { p: 4, withBorder: true, children: [_jsxs(Group, { justify: "space-between", mb: 4, gap: "xs", children: [_jsx(Text, { size: "xs", fw: 500, c: "blue", children: "Margin" }), _jsxs(Group, { gap: 2, children: [_jsx(Tooltip, { label: "Lock X-axis (left & right)", children: _jsx(ActionIcon, { size: "xs", variant: marginXLocked ? "filled" : "light", color: "blue", onClick: () => setMarginXLocked(!marginXLocked), children: marginXLocked ? '🔒' : '🔓' }) }), _jsx(Tooltip, { label: "Lock Y-axis (top & bottom)", children: _jsx(ActionIcon, { size: "xs", variant: marginYLocked ? "filled" : "light", color: "blue", onClick: () => setMarginYLocked(!marginYLocked), children: marginYLocked ? '🔒' : '🔓' }) }), _jsx(Tooltip, { label: "Lock all sides", children: _jsx(ActionIcon, { size: "xs", variant: marginLocked ? "filled" : "light", color: "blue", onClick: () => setMarginLocked(!marginLocked), children: marginLocked ? '🔒' : '🔓' }) })] })] }), _jsxs(Box, { style: {
73
- position: 'relative',
74
- border: '1px dashed #228be6',
75
- borderRadius: '4px',
76
- padding: '25px',
77
- minHeight: '140px'
78
- }, children: [_jsx(Box, { style: {
79
- position: 'absolute',
80
- top: '-8px',
81
- left: '50%',
82
- transform: 'translateX(-50%)',
83
- zIndex: 2
84
- }, children: renderSpacingInput('mt', 'top') }), _jsx(Box, { style: {
85
- position: 'absolute',
86
- right: '-20px',
87
- top: '50%',
88
- transform: 'translateY(-50%)',
89
- zIndex: 2
90
- }, children: renderSpacingInput('mr', 'right') }), _jsx(Box, { style: {
91
- position: 'absolute',
92
- bottom: '-4px',
93
- left: '50%',
94
- transform: 'translateX(-50%)',
95
- zIndex: 2
96
- }, children: renderSpacingInput('mb', 'bottom') }), _jsx(Box, { style: {
97
- position: 'absolute',
98
- left: '-20px',
99
- top: '50%',
100
- transform: 'translateY(-50%)',
101
- zIndex: 2
102
- }, children: renderSpacingInput('ml', 'left') }), _jsxs(Box, { style: {
103
- position: 'absolute',
104
- top: '26%',
105
- left: '50%',
106
- transform: 'translateX(-50%)',
107
- textAlign: 'center'
108
- }, children: [_jsx(Text, { size: "xs", c: "dimmed", mb: 2, children: "All" }), renderSpacingInput('m', 'all')] })] }), _jsxs(Group, { justify: "center", mt: 10, gap: "xs", children: [_jsxs(Box, { ta: "center", children: [_jsx(Text, { size: "xs", c: "dimmed", children: "X" }), renderSpacingInput('mx', 'x')] }), _jsxs(Box, { ta: "center", children: [_jsx(Text, { size: "xs", c: "dimmed", children: "Y" }), renderSpacingInput('my', 'y')] })] })] }), _jsxs(Paper, { p: 4, withBorder: true, children: [_jsxs(Group, { justify: "space-between", mb: 4, gap: "xs", children: [_jsx(Text, { size: "xs", fw: 500, c: "green", children: "Padding" }), _jsxs(Group, { gap: 2, children: [_jsx(Tooltip, { label: "Lock X-axis (left & right)", children: _jsx(ActionIcon, { size: "xs", variant: paddingXLocked ? "filled" : "light", color: "green", onClick: () => setPaddingXLocked(!paddingXLocked), children: paddingXLocked ? '🔒' : '🔓' }) }), _jsx(Tooltip, { label: "Lock Y-axis (top & bottom)", children: _jsx(ActionIcon, { size: "xs", variant: paddingYLocked ? "filled" : "light", color: "green", onClick: () => setPaddingYLocked(!paddingYLocked), children: paddingYLocked ? '🔒' : '🔓' }) }), _jsx(Tooltip, { label: "Lock all sides", children: _jsx(ActionIcon, { size: "xs", variant: paddingLocked ? "filled" : "light", color: "green", onClick: () => setPaddingLocked(!paddingLocked), children: paddingLocked ? '🔒' : '🔓' }) })] })] }), _jsxs(Box, { style: {
109
- position: 'relative',
110
- border: '1px dashed #40c057',
111
- borderRadius: '4px',
112
- padding: '25px',
113
- minHeight: '140px'
114
- }, children: [_jsx(Box, { style: {
115
- position: 'absolute',
116
- top: '-8px',
117
- left: '50%',
118
- transform: 'translateX(-50%)',
119
- zIndex: 2
120
- }, children: renderSpacingInput('pt', 'top') }), _jsx(Box, { style: {
121
- position: 'absolute',
122
- right: '-20px',
123
- top: '50%',
124
- transform: 'translateY(-50%)',
125
- zIndex: 2
126
- }, children: renderSpacingInput('pr', 'right') }), _jsx(Box, { style: {
127
- position: 'absolute',
128
- bottom: '-4px',
129
- left: '50%',
130
- transform: 'translateX(-50%)',
131
- zIndex: 2
132
- }, children: renderSpacingInput('pb', 'bottom') }), _jsx(Box, { style: {
133
- position: 'absolute',
134
- left: '-20px',
135
- top: '50%',
136
- transform: 'translateY(-50%)',
137
- zIndex: 2
138
- }, children: renderSpacingInput('pl', 'left') }), _jsxs(Box, { style: {
139
- position: 'absolute',
140
- top: '26%',
141
- left: '50%',
142
- transform: 'translateX(-50%)',
143
- textAlign: 'center'
144
- }, children: [_jsx(Text, { size: "xs", c: "dimmed", mb: 2, children: "All" }), renderSpacingInput('p', 'all')] })] }), _jsxs(Group, { justify: "center", mt: 10, gap: "xs", children: [_jsxs(Box, { ta: "center", children: [_jsx(Text, { size: "xs", c: "dimmed", children: "X" }), renderSpacingInput('px', 'x')] }), _jsxs(Box, { ta: "center", children: [_jsx(Text, { size: "xs", c: "dimmed", children: "Y" }), renderSpacingInput('py', 'y')] })] })] })] }));
145
- };
@@ -1,32 +0,0 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { useState } from 'react';
3
- import { Box, Text, NumberInput, SegmentedControl, Switch, Group, Stack, Paper } from '@mantine/core';
4
- export const SpacingEditor = ({ type, values = {}, onChange }) => {
5
- const [unit, setUnit] = useState('px');
6
- const [useUniform, setUseUniform] = useState(true);
7
- const handleValueChange = (side, value) => {
8
- if (useUniform && side === 'all') {
9
- onChange({
10
- top: value,
11
- right: value,
12
- bottom: value,
13
- left: value,
14
- all: value
15
- });
16
- }
17
- else {
18
- onChange({
19
- ...values,
20
- [side]: value
21
- });
22
- }
23
- };
24
- const currentValue = useUniform
25
- ? values.all || values.top || 0
26
- : null;
27
- return (_jsx(Paper, { p: "xs", withBorder: true, children: _jsxs(Stack, { gap: "xs", children: [_jsxs(Group, { justify: "space-between", children: [_jsx(Text, { size: "sm", fw: 500, c: type === 'margin' ? 'blue.6' : 'green.6', children: type.charAt(0).toUpperCase() + type.slice(1) }), _jsx(SegmentedControl, { size: "xs", value: unit, onChange: (value) => setUnit(value), data: [
28
- { label: 'px', value: 'px' },
29
- { label: 'rem', value: 'rem' },
30
- { label: '%', value: '%' }
31
- ] })] }), _jsx(Switch, { size: "xs", label: "Uniform spacing", checked: useUniform, onChange: (e) => setUseUniform(e.currentTarget.checked) }), useUniform ? (_jsx(NumberInput, { size: "xs", label: "All sides", value: currentValue, onChange: (value) => handleValueChange('all', value), suffix: unit, min: 0 })) : (_jsxs(Box, { children: [_jsxs(Group, { gap: "xs", mb: "xs", children: [_jsx(NumberInput, { size: "xs", label: "Top", value: values.top || 0, onChange: (value) => handleValueChange('top', value), suffix: unit, min: 0, style: { flex: 1 } }), _jsx(NumberInput, { size: "xs", label: "Right", value: values.right || 0, onChange: (value) => handleValueChange('right', value), suffix: unit, min: 0, style: { flex: 1 } })] }), _jsxs(Group, { gap: "xs", children: [_jsx(NumberInput, { size: "xs", label: "Bottom", value: values.bottom || 0, onChange: (value) => handleValueChange('bottom', value), suffix: unit, min: 0, style: { flex: 1 } }), _jsx(NumberInput, { size: "xs", label: "Left", value: values.left || 0, onChange: (value) => handleValueChange('left', value), suffix: unit, min: 0, style: { flex: 1 } })] })] }))] }) }));
32
- };