@prenta/admin 0.98.1 → 1.1.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 (371) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/AdminRoot.d.ts.map +1 -1
  3. package/dist/AdminRoot.js +22 -84
  4. package/dist/AdminRoot.js.map +1 -1
  5. package/dist/__tests__/components/breakpoint-controls.render.test.js +4 -4
  6. package/dist/__tests__/components/breakpoint-controls.render.test.js.map +1 -1
  7. package/dist/__tests__/components/seo-score-bands.test.js +0 -3
  8. package/dist/__tests__/components/seo-score-bands.test.js.map +1 -1
  9. package/dist/__tests__/layout/sidebar-posts.test.js +6 -11
  10. package/dist/__tests__/layout/sidebar-posts.test.js.map +1 -1
  11. package/dist/__tests__/layout/sidebar-submenu.render.test.js +3 -2
  12. package/dist/__tests__/layout/sidebar-submenu.render.test.js.map +1 -1
  13. package/dist/__tests__/lib/open-public-site-tab.test.d.ts +2 -0
  14. package/dist/__tests__/lib/open-public-site-tab.test.d.ts.map +1 -0
  15. package/dist/__tests__/lib/open-public-site-tab.test.js +64 -0
  16. package/dist/__tests__/lib/open-public-site-tab.test.js.map +1 -0
  17. package/dist/__tests__/lib/page-editor-service-api.test.js +26 -23
  18. package/dist/__tests__/lib/page-editor-service-api.test.js.map +1 -1
  19. package/dist/__tests__/lib/view-site-chrome.test.d.ts +2 -0
  20. package/dist/__tests__/lib/view-site-chrome.test.d.ts.map +1 -0
  21. package/dist/__tests__/lib/view-site-chrome.test.js +59 -0
  22. package/dist/__tests__/lib/view-site-chrome.test.js.map +1 -0
  23. package/dist/__tests__/router/admin-routes.test.js +4 -0
  24. package/dist/__tests__/router/admin-routes.test.js.map +1 -1
  25. package/dist/__tests__/views/canvas-surface-shared.test.js +0 -16
  26. package/dist/__tests__/views/canvas-surface-shared.test.js.map +1 -1
  27. package/dist/__tests__/views/editor-top-bar.render.test.js +44 -22
  28. package/dist/__tests__/views/editor-top-bar.render.test.js.map +1 -1
  29. package/dist/__tests__/views/page-section-editor.test.js +30 -10
  30. package/dist/__tests__/views/page-section-editor.test.js.map +1 -1
  31. package/dist/__tests__/views/page-tab.render.test.js +0 -1
  32. package/dist/__tests__/views/page-tab.render.test.js.map +1 -1
  33. package/dist/__tests__/views/post-section-editor.test.js +23 -0
  34. package/dist/__tests__/views/post-section-editor.test.js.map +1 -1
  35. package/dist/components/BreakpointPicker.d.ts +3 -2
  36. package/dist/components/BreakpointPicker.d.ts.map +1 -1
  37. package/dist/components/BreakpointPicker.js +5 -3
  38. package/dist/components/BreakpointPicker.js.map +1 -1
  39. package/dist/components/CanvasEditTip.js +1 -1
  40. package/dist/components/CanvasEditTip.js.map +1 -1
  41. package/dist/index.d.ts +1 -4
  42. package/dist/index.d.ts.map +1 -1
  43. package/dist/index.js +1 -3
  44. package/dist/index.js.map +1 -1
  45. package/dist/layout/Sidebar.d.ts +3 -4
  46. package/dist/layout/Sidebar.d.ts.map +1 -1
  47. package/dist/layout/Sidebar.js +7 -38
  48. package/dist/layout/Sidebar.js.map +1 -1
  49. package/dist/lib/editor-preview.d.ts +4 -1
  50. package/dist/lib/editor-preview.d.ts.map +1 -1
  51. package/dist/lib/editor-preview.js +4 -1
  52. package/dist/lib/editor-preview.js.map +1 -1
  53. package/dist/lib/open-public-site-tab.d.ts +14 -0
  54. package/dist/lib/open-public-site-tab.d.ts.map +1 -0
  55. package/dist/lib/open-public-site-tab.js +46 -0
  56. package/dist/lib/open-public-site-tab.js.map +1 -0
  57. package/dist/lib/page-editor-service.d.ts +0 -7
  58. package/dist/lib/page-editor-service.d.ts.map +1 -1
  59. package/dist/lib/page-editor-service.js +9 -9
  60. package/dist/lib/page-editor-service.js.map +1 -1
  61. package/dist/lib/view-site-chrome.d.ts +16 -0
  62. package/dist/lib/view-site-chrome.d.ts.map +1 -0
  63. package/dist/lib/view-site-chrome.js +15 -0
  64. package/dist/lib/view-site-chrome.js.map +1 -0
  65. package/dist/prenta-admin.css +1 -1
  66. package/dist/router/admin-routes.d.ts.map +1 -1
  67. package/dist/router/admin-routes.js +0 -2
  68. package/dist/router/admin-routes.js.map +1 -1
  69. package/dist/views/PageEditor.d.ts +2 -2
  70. package/dist/views/PageEditor.js +2 -2
  71. package/dist/views/page-editor/EditorCanvas.d.ts +1 -2
  72. package/dist/views/page-editor/EditorCanvas.d.ts.map +1 -1
  73. package/dist/views/page-editor/EditorCanvas.js +2 -2
  74. package/dist/views/page-editor/EditorCanvas.js.map +1 -1
  75. package/dist/views/page-editor/EditorTopBar.d.ts +13 -17
  76. package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -1
  77. package/dist/views/page-editor/EditorTopBar.js +19 -21
  78. package/dist/views/page-editor/EditorTopBar.js.map +1 -1
  79. package/dist/views/page-editor/PageSectionEditor.d.ts +1 -7
  80. package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
  81. package/dist/views/page-editor/PageSectionEditor.js +38 -110
  82. package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
  83. package/dist/views/page-editor/StructureNotice.d.ts +2 -5
  84. package/dist/views/page-editor/StructureNotice.d.ts.map +1 -1
  85. package/dist/views/page-editor/StructureNotice.js +6 -10
  86. package/dist/views/page-editor/StructureNotice.js.map +1 -1
  87. package/dist/views/post-editor/PostEditorCanvas.d.ts +1 -3
  88. package/dist/views/post-editor/PostEditorCanvas.d.ts.map +1 -1
  89. package/dist/views/post-editor/PostEditorCanvas.js +3 -3
  90. package/dist/views/post-editor/PostEditorCanvas.js.map +1 -1
  91. package/dist/views/post-editor/PostSectionEditor.d.ts +1 -15
  92. package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
  93. package/dist/views/post-editor/PostSectionEditor.js +30 -88
  94. package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
  95. package/package.json +3 -3
  96. package/src/AdminRoot.tsx +18 -138
  97. package/src/__tests__/components/breakpoint-controls.render.test.tsx +6 -4
  98. package/src/__tests__/components/seo-score-bands.test.ts +0 -3
  99. package/src/__tests__/layout/sidebar-posts.test.ts +6 -11
  100. package/src/__tests__/layout/sidebar-submenu.render.test.tsx +3 -2
  101. package/src/__tests__/lib/open-public-site-tab.test.ts +74 -0
  102. package/src/__tests__/lib/page-editor-service-api.test.ts +27 -25
  103. package/src/__tests__/lib/view-site-chrome.test.ts +65 -0
  104. package/src/__tests__/router/admin-routes.test.ts +5 -0
  105. package/src/__tests__/views/canvas-surface-shared.test.ts +0 -19
  106. package/src/__tests__/views/editor-top-bar.render.test.tsx +85 -22
  107. package/src/__tests__/views/page-section-editor.test.tsx +42 -10
  108. package/src/__tests__/views/page-tab.render.test.tsx +0 -1
  109. package/src/__tests__/views/post-section-editor.test.tsx +35 -0
  110. package/src/components/BreakpointPicker.tsx +6 -3
  111. package/src/components/CanvasEditTip.tsx +2 -2
  112. package/src/index.ts +1 -11
  113. package/src/layout/Sidebar.tsx +6 -41
  114. package/src/lib/editor-preview.ts +4 -1
  115. package/src/lib/open-public-site-tab.ts +57 -0
  116. package/src/lib/page-editor-service.ts +9 -16
  117. package/src/lib/view-site-chrome.ts +34 -0
  118. package/src/router/admin-routes.ts +0 -2
  119. package/src/styles/theme.css +4 -4
  120. package/src/views/PageEditor.tsx +2 -2
  121. package/src/views/page-editor/EditorCanvas.tsx +1 -6
  122. package/src/views/page-editor/EditorTopBar.tsx +81 -82
  123. package/src/views/page-editor/PageSectionEditor.tsx +85 -194
  124. package/src/views/page-editor/StructureNotice.tsx +7 -42
  125. package/src/views/post-editor/PostEditorCanvas.tsx +2 -8
  126. package/src/views/post-editor/PostSectionEditor.tsx +66 -138
  127. package/dist/__tests__/views/page-builder-block-renderer.render.test.d.ts +0 -2
  128. package/dist/__tests__/views/page-builder-block-renderer.render.test.d.ts.map +0 -1
  129. package/dist/__tests__/views/page-builder-block-renderer.render.test.js +0 -48
  130. package/dist/__tests__/views/page-builder-block-renderer.render.test.js.map +0 -1
  131. package/dist/__tests__/views/page-builder-form-picker.render.test.d.ts +0 -2
  132. package/dist/__tests__/views/page-builder-form-picker.render.test.d.ts.map +0 -1
  133. package/dist/__tests__/views/page-builder-form-picker.render.test.js +0 -44
  134. package/dist/__tests__/views/page-builder-form-picker.render.test.js.map +0 -1
  135. package/dist/__tests__/views/page-builder-sections-panel.render.test.d.ts +0 -2
  136. package/dist/__tests__/views/page-builder-sections-panel.render.test.d.ts.map +0 -1
  137. package/dist/__tests__/views/page-builder-sections-panel.render.test.js +0 -121
  138. package/dist/__tests__/views/page-builder-sections-panel.render.test.js.map +0 -1
  139. package/dist/__tests__/views/page-builder-seo-panel.render.test.d.ts +0 -2
  140. package/dist/__tests__/views/page-builder-seo-panel.render.test.d.ts.map +0 -1
  141. package/dist/__tests__/views/page-builder-seo-panel.render.test.js +0 -65
  142. package/dist/__tests__/views/page-builder-seo-panel.render.test.js.map +0 -1
  143. package/dist/__tests__/views/page-builder-template-seed.render.test.d.ts +0 -2
  144. package/dist/__tests__/views/page-builder-template-seed.render.test.d.ts.map +0 -1
  145. package/dist/__tests__/views/page-builder-template-seed.render.test.js +0 -48
  146. package/dist/__tests__/views/page-builder-template-seed.render.test.js.map +0 -1
  147. package/dist/__tests__/views/page-templates.render.test.d.ts +0 -2
  148. package/dist/__tests__/views/page-templates.render.test.d.ts.map +0 -1
  149. package/dist/__tests__/views/page-templates.render.test.js +0 -126
  150. package/dist/__tests__/views/page-templates.render.test.js.map +0 -1
  151. package/dist/__tests__/views/use-site-preview.render.test.d.ts +0 -2
  152. package/dist/__tests__/views/use-site-preview.render.test.d.ts.map +0 -1
  153. package/dist/__tests__/views/use-site-preview.render.test.js +0 -120
  154. package/dist/__tests__/views/use-site-preview.render.test.js.map +0 -1
  155. package/dist/hooks/useBuilderState.d.ts +0 -49
  156. package/dist/hooks/useBuilderState.d.ts.map +0 -1
  157. package/dist/hooks/useBuilderState.js +0 -238
  158. package/dist/hooks/useBuilderState.js.map +0 -1
  159. package/dist/views/page-builder/AIBlockAssist.d.ts +0 -9
  160. package/dist/views/page-builder/AIBlockAssist.d.ts.map +0 -1
  161. package/dist/views/page-builder/AIBlockAssist.js +0 -40
  162. package/dist/views/page-builder/AIBlockAssist.js.map +0 -1
  163. package/dist/views/page-builder/AIGenerateDialog.d.ts +0 -8
  164. package/dist/views/page-builder/AIGenerateDialog.d.ts.map +0 -1
  165. package/dist/views/page-builder/AIGenerateDialog.js +0 -173
  166. package/dist/views/page-builder/AIGenerateDialog.js.map +0 -1
  167. package/dist/views/page-builder/BlockEditor.d.ts +0 -11
  168. package/dist/views/page-builder/BlockEditor.d.ts.map +0 -1
  169. package/dist/views/page-builder/BlockEditor.js +0 -159
  170. package/dist/views/page-builder/BlockEditor.js.map +0 -1
  171. package/dist/views/page-builder/BlockPicker.d.ts +0 -7
  172. package/dist/views/page-builder/BlockPicker.d.ts.map +0 -1
  173. package/dist/views/page-builder/BlockPicker.js +0 -103
  174. package/dist/views/page-builder/BlockPicker.js.map +0 -1
  175. package/dist/views/page-builder/BottomBar.d.ts +0 -9
  176. package/dist/views/page-builder/BottomBar.d.ts.map +0 -1
  177. package/dist/views/page-builder/BottomBar.js +0 -13
  178. package/dist/views/page-builder/BottomBar.js.map +0 -1
  179. package/dist/views/page-builder/BuilderSectionsPanel.d.ts +0 -20
  180. package/dist/views/page-builder/BuilderSectionsPanel.d.ts.map +0 -1
  181. package/dist/views/page-builder/BuilderSectionsPanel.js +0 -105
  182. package/dist/views/page-builder/BuilderSectionsPanel.js.map +0 -1
  183. package/dist/views/page-builder/BuilderToolbar.d.ts +0 -21
  184. package/dist/views/page-builder/BuilderToolbar.d.ts.map +0 -1
  185. package/dist/views/page-builder/BuilderToolbar.js +0 -18
  186. package/dist/views/page-builder/BuilderToolbar.js.map +0 -1
  187. package/dist/views/page-builder/ContextPanel.d.ts +0 -20
  188. package/dist/views/page-builder/ContextPanel.d.ts.map +0 -1
  189. package/dist/views/page-builder/ContextPanel.js +0 -43
  190. package/dist/views/page-builder/ContextPanel.js.map +0 -1
  191. package/dist/views/page-builder/DesignScore.d.ts +0 -6
  192. package/dist/views/page-builder/DesignScore.d.ts.map +0 -1
  193. package/dist/views/page-builder/DesignScore.js +0 -93
  194. package/dist/views/page-builder/DesignScore.js.map +0 -1
  195. package/dist/views/page-builder/NodeSettings.d.ts +0 -12
  196. package/dist/views/page-builder/NodeSettings.d.ts.map +0 -1
  197. package/dist/views/page-builder/NodeSettings.js +0 -80
  198. package/dist/views/page-builder/NodeSettings.js.map +0 -1
  199. package/dist/views/page-builder/PageBuilder.d.ts +0 -10
  200. package/dist/views/page-builder/PageBuilder.d.ts.map +0 -1
  201. package/dist/views/page-builder/PageBuilder.js +0 -222
  202. package/dist/views/page-builder/PageBuilder.js.map +0 -1
  203. package/dist/views/page-builder/PageSettings.d.ts +0 -7
  204. package/dist/views/page-builder/PageSettings.d.ts.map +0 -1
  205. package/dist/views/page-builder/PageSettings.js +0 -27
  206. package/dist/views/page-builder/PageSettings.js.map +0 -1
  207. package/dist/views/page-builder/PageTemplates.d.ts +0 -5
  208. package/dist/views/page-builder/PageTemplates.d.ts.map +0 -1
  209. package/dist/views/page-builder/PageTemplates.js +0 -146
  210. package/dist/views/page-builder/PageTemplates.js.map +0 -1
  211. package/dist/views/page-builder/RelationshipField.d.ts +0 -15
  212. package/dist/views/page-builder/RelationshipField.d.ts.map +0 -1
  213. package/dist/views/page-builder/RelationshipField.js +0 -65
  214. package/dist/views/page-builder/RelationshipField.js.map +0 -1
  215. package/dist/views/page-builder/SEOPanel.d.ts +0 -9
  216. package/dist/views/page-builder/SEOPanel.d.ts.map +0 -1
  217. package/dist/views/page-builder/SEOPanel.js +0 -38
  218. package/dist/views/page-builder/SEOPanel.js.map +0 -1
  219. package/dist/views/page-builder/SavedSections.d.ts +0 -6
  220. package/dist/views/page-builder/SavedSections.d.ts.map +0 -1
  221. package/dist/views/page-builder/SavedSections.js +0 -141
  222. package/dist/views/page-builder/SavedSections.js.map +0 -1
  223. package/dist/views/page-builder/TemplatePicker.d.ts +0 -7
  224. package/dist/views/page-builder/TemplatePicker.d.ts.map +0 -1
  225. package/dist/views/page-builder/TemplatePicker.js +0 -68
  226. package/dist/views/page-builder/TemplatePicker.js.map +0 -1
  227. package/dist/views/page-builder/Widgets.d.ts +0 -13
  228. package/dist/views/page-builder/Widgets.d.ts.map +0 -1
  229. package/dist/views/page-builder/Widgets.js +0 -15
  230. package/dist/views/page-builder/Widgets.js.map +0 -1
  231. package/dist/views/page-builder/block-renderers/CTAPreview.d.ts +0 -3
  232. package/dist/views/page-builder/block-renderers/CTAPreview.d.ts.map +0 -1
  233. package/dist/views/page-builder/block-renderers/CTAPreview.js +0 -19
  234. package/dist/views/page-builder/block-renderers/CTAPreview.js.map +0 -1
  235. package/dist/views/page-builder/block-renderers/CardsPreview.d.ts +0 -3
  236. package/dist/views/page-builder/block-renderers/CardsPreview.d.ts.map +0 -1
  237. package/dist/views/page-builder/block-renderers/CardsPreview.js +0 -22
  238. package/dist/views/page-builder/block-renderers/CardsPreview.js.map +0 -1
  239. package/dist/views/page-builder/block-renderers/CodePreview.d.ts +0 -3
  240. package/dist/views/page-builder/block-renderers/CodePreview.d.ts.map +0 -1
  241. package/dist/views/page-builder/block-renderers/CodePreview.js +0 -12
  242. package/dist/views/page-builder/block-renderers/CodePreview.js.map +0 -1
  243. package/dist/views/page-builder/block-renderers/FAQPreview.d.ts +0 -3
  244. package/dist/views/page-builder/block-renderers/FAQPreview.d.ts.map +0 -1
  245. package/dist/views/page-builder/block-renderers/FAQPreview.js +0 -27
  246. package/dist/views/page-builder/block-renderers/FAQPreview.js.map +0 -1
  247. package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts +0 -6
  248. package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts.map +0 -1
  249. package/dist/views/page-builder/block-renderers/FallbackPreview.js +0 -7
  250. package/dist/views/page-builder/block-renderers/FallbackPreview.js.map +0 -1
  251. package/dist/views/page-builder/block-renderers/FormPreview.d.ts +0 -9
  252. package/dist/views/page-builder/block-renderers/FormPreview.d.ts.map +0 -1
  253. package/dist/views/page-builder/block-renderers/FormPreview.js +0 -52
  254. package/dist/views/page-builder/block-renderers/FormPreview.js.map +0 -1
  255. package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts +0 -3
  256. package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts.map +0 -1
  257. package/dist/views/page-builder/block-renderers/GalleryPreview.js +0 -19
  258. package/dist/views/page-builder/block-renderers/GalleryPreview.js.map +0 -1
  259. package/dist/views/page-builder/block-renderers/HeroPreview.d.ts +0 -3
  260. package/dist/views/page-builder/block-renderers/HeroPreview.d.ts.map +0 -1
  261. package/dist/views/page-builder/block-renderers/HeroPreview.js +0 -19
  262. package/dist/views/page-builder/block-renderers/HeroPreview.js.map +0 -1
  263. package/dist/views/page-builder/block-renderers/ImagePreview.d.ts +0 -3
  264. package/dist/views/page-builder/block-renderers/ImagePreview.d.ts.map +0 -1
  265. package/dist/views/page-builder/block-renderers/ImagePreview.js +0 -17
  266. package/dist/views/page-builder/block-renderers/ImagePreview.js.map +0 -1
  267. package/dist/views/page-builder/block-renderers/TextPreview.d.ts +0 -3
  268. package/dist/views/page-builder/block-renderers/TextPreview.d.ts.map +0 -1
  269. package/dist/views/page-builder/block-renderers/TextPreview.js +0 -22
  270. package/dist/views/page-builder/block-renderers/TextPreview.js.map +0 -1
  271. package/dist/views/page-builder/block-renderers/VideoPreview.d.ts +0 -3
  272. package/dist/views/page-builder/block-renderers/VideoPreview.d.ts.map +0 -1
  273. package/dist/views/page-builder/block-renderers/VideoPreview.js +0 -18
  274. package/dist/views/page-builder/block-renderers/VideoPreview.js.map +0 -1
  275. package/dist/views/page-builder/block-renderers/index.d.ts +0 -9
  276. package/dist/views/page-builder/block-renderers/index.d.ts.map +0 -1
  277. package/dist/views/page-builder/block-renderers/index.js +0 -25
  278. package/dist/views/page-builder/block-renderers/index.js.map +0 -1
  279. package/dist/views/page-builder/canvas/BlockRenderer.d.ts +0 -8
  280. package/dist/views/page-builder/canvas/BlockRenderer.d.ts.map +0 -1
  281. package/dist/views/page-builder/canvas/BlockRenderer.js +0 -20
  282. package/dist/views/page-builder/canvas/BlockRenderer.js.map +0 -1
  283. package/dist/views/page-builder/canvas/BuilderCanvas.d.ts +0 -10
  284. package/dist/views/page-builder/canvas/BuilderCanvas.d.ts.map +0 -1
  285. package/dist/views/page-builder/canvas/BuilderCanvas.js +0 -26
  286. package/dist/views/page-builder/canvas/BuilderCanvas.js.map +0 -1
  287. package/dist/views/page-builder/canvas/ColumnRenderer.d.ts +0 -8
  288. package/dist/views/page-builder/canvas/ColumnRenderer.d.ts.map +0 -1
  289. package/dist/views/page-builder/canvas/ColumnRenderer.js +0 -32
  290. package/dist/views/page-builder/canvas/ColumnRenderer.js.map +0 -1
  291. package/dist/views/page-builder/canvas/ContainerRenderer.d.ts +0 -8
  292. package/dist/views/page-builder/canvas/ContainerRenderer.d.ts.map +0 -1
  293. package/dist/views/page-builder/canvas/ContainerRenderer.js +0 -29
  294. package/dist/views/page-builder/canvas/ContainerRenderer.js.map +0 -1
  295. package/dist/views/page-builder/canvas/RowRenderer.d.ts +0 -8
  296. package/dist/views/page-builder/canvas/RowRenderer.d.ts.map +0 -1
  297. package/dist/views/page-builder/canvas/RowRenderer.js +0 -28
  298. package/dist/views/page-builder/canvas/RowRenderer.js.map +0 -1
  299. package/dist/views/page-builder/canvas/SectionRenderer.d.ts +0 -8
  300. package/dist/views/page-builder/canvas/SectionRenderer.d.ts.map +0 -1
  301. package/dist/views/page-builder/canvas/SectionRenderer.js +0 -50
  302. package/dist/views/page-builder/canvas/SectionRenderer.js.map +0 -1
  303. package/dist/views/page-builder/canvas/index.d.ts +0 -3
  304. package/dist/views/page-builder/canvas/index.d.ts.map +0 -1
  305. package/dist/views/page-builder/canvas/index.js +0 -2
  306. package/dist/views/page-builder/canvas/index.js.map +0 -1
  307. package/dist/views/page-editor/PagePreview.d.ts +0 -13
  308. package/dist/views/page-editor/PagePreview.d.ts.map +0 -1
  309. package/dist/views/page-editor/PagePreview.js +0 -46
  310. package/dist/views/page-editor/PagePreview.js.map +0 -1
  311. package/dist/views/page-editor/SitePreviewFrame.d.ts +0 -43
  312. package/dist/views/page-editor/SitePreviewFrame.d.ts.map +0 -1
  313. package/dist/views/page-editor/SitePreviewFrame.js +0 -165
  314. package/dist/views/page-editor/SitePreviewFrame.js.map +0 -1
  315. package/dist/views/page-editor/useSitePreview.d.ts +0 -47
  316. package/dist/views/page-editor/useSitePreview.d.ts.map +0 -1
  317. package/dist/views/page-editor/useSitePreview.js +0 -96
  318. package/dist/views/page-editor/useSitePreview.js.map +0 -1
  319. package/dist/views/post-editor/PostPreview.d.ts +0 -14
  320. package/dist/views/post-editor/PostPreview.d.ts.map +0 -1
  321. package/dist/views/post-editor/PostPreview.js +0 -63
  322. package/dist/views/post-editor/PostPreview.js.map +0 -1
  323. package/src/__tests__/views/page-builder-block-renderer.render.test.tsx +0 -66
  324. package/src/__tests__/views/page-builder-form-picker.render.test.tsx +0 -54
  325. package/src/__tests__/views/page-builder-sections-panel.render.test.tsx +0 -138
  326. package/src/__tests__/views/page-builder-seo-panel.render.test.tsx +0 -77
  327. package/src/__tests__/views/page-builder-template-seed.render.test.tsx +0 -59
  328. package/src/__tests__/views/page-templates.render.test.tsx +0 -182
  329. package/src/__tests__/views/use-site-preview.render.test.tsx +0 -164
  330. package/src/hooks/useBuilderState.ts +0 -361
  331. package/src/views/page-builder/AIBlockAssist.tsx +0 -64
  332. package/src/views/page-builder/AIGenerateDialog.tsx +0 -593
  333. package/src/views/page-builder/BlockEditor.tsx +0 -523
  334. package/src/views/page-builder/BlockPicker.tsx +0 -324
  335. package/src/views/page-builder/BottomBar.tsx +0 -65
  336. package/src/views/page-builder/BuilderSectionsPanel.tsx +0 -304
  337. package/src/views/page-builder/BuilderToolbar.tsx +0 -221
  338. package/src/views/page-builder/ContextPanel.tsx +0 -144
  339. package/src/views/page-builder/DesignScore.tsx +0 -251
  340. package/src/views/page-builder/NodeSettings.tsx +0 -500
  341. package/src/views/page-builder/PageBuilder.tsx +0 -405
  342. package/src/views/page-builder/PageSettings.tsx +0 -162
  343. package/src/views/page-builder/PageTemplates.tsx +0 -435
  344. package/src/views/page-builder/RelationshipField.tsx +0 -113
  345. package/src/views/page-builder/SEOPanel.tsx +0 -222
  346. package/src/views/page-builder/SavedSections.tsx +0 -480
  347. package/src/views/page-builder/TemplatePicker.tsx +0 -197
  348. package/src/views/page-builder/Widgets.tsx +0 -44
  349. package/src/views/page-builder/block-renderers/CTAPreview.tsx +0 -79
  350. package/src/views/page-builder/block-renderers/CardsPreview.tsx +0 -69
  351. package/src/views/page-builder/block-renderers/CodePreview.tsx +0 -46
  352. package/src/views/page-builder/block-renderers/FAQPreview.tsx +0 -87
  353. package/src/views/page-builder/block-renderers/FallbackPreview.tsx +0 -18
  354. package/src/views/page-builder/block-renderers/FormPreview.tsx +0 -117
  355. package/src/views/page-builder/block-renderers/GalleryPreview.tsx +0 -87
  356. package/src/views/page-builder/block-renderers/HeroPreview.tsx +0 -90
  357. package/src/views/page-builder/block-renderers/ImagePreview.tsx +0 -54
  358. package/src/views/page-builder/block-renderers/TextPreview.tsx +0 -81
  359. package/src/views/page-builder/block-renderers/VideoPreview.tsx +0 -73
  360. package/src/views/page-builder/block-renderers/index.ts +0 -34
  361. package/src/views/page-builder/canvas/BlockRenderer.tsx +0 -56
  362. package/src/views/page-builder/canvas/BuilderCanvas.tsx +0 -87
  363. package/src/views/page-builder/canvas/ColumnRenderer.tsx +0 -82
  364. package/src/views/page-builder/canvas/ContainerRenderer.tsx +0 -67
  365. package/src/views/page-builder/canvas/RowRenderer.tsx +0 -68
  366. package/src/views/page-builder/canvas/SectionRenderer.tsx +0 -93
  367. package/src/views/page-builder/canvas/index.ts +0 -2
  368. package/src/views/page-editor/PagePreview.tsx +0 -105
  369. package/src/views/page-editor/SitePreviewFrame.tsx +0 -250
  370. package/src/views/page-editor/useSitePreview.ts +0 -158
  371. package/src/views/post-editor/PostPreview.tsx +0 -125
@@ -1,87 +0,0 @@
1
- 'use client'
2
-
3
- import { Image } from 'lucide-react'
4
- import type { BlockPreviewProps } from './index.js'
5
-
6
- interface GalleryImage {
7
- src?: string
8
- alt?: string
9
- caption?: string
10
- }
11
-
12
- export function GalleryPreview({ data, variant = 'grid' }: BlockPreviewProps) {
13
- const images = (data.images as GalleryImage[]) || []
14
-
15
- const placeholders: GalleryImage[] =
16
- images.length > 0 ? images : Array.from({ length: 6 }, (_, i) => ({ alt: `Image ${i + 1}` }))
17
-
18
- const Thumbnail = ({ item, className = '' }: { item: GalleryImage; className?: string }) => (
19
- <div
20
- className={`bg-muted flex items-center justify-center overflow-hidden rounded-md ${className}`}
21
- >
22
- {item.src ? (
23
- <img src={item.src} alt={item.alt || ''} className="h-full w-full object-cover" />
24
- ) : (
25
- <Image size={20} className="text-muted-foreground" />
26
- )}
27
- </div>
28
- )
29
-
30
- if (variant === 'masonry') {
31
- return (
32
- <div className="border-border rounded-md border p-4">
33
- <div className="columns-3 gap-3 space-y-3">
34
- {placeholders.map((item, i) => (
35
- <Thumbnail
36
- key={i}
37
- item={item}
38
- className={
39
- i % 3 === 0 ? 'aspect-square' : i % 3 === 1 ? 'aspect-[3/4]' : 'aspect-[4/3]'
40
- }
41
- />
42
- ))}
43
- </div>
44
- </div>
45
- )
46
- }
47
-
48
- if (variant === 'carousel') {
49
- return (
50
- <div className="border-border overflow-hidden rounded-md border p-4">
51
- <div className="flex gap-3 overflow-hidden">
52
- {placeholders.slice(0, 4).map((item, i) => (
53
- <Thumbnail key={i} item={item} className="aspect-square min-w-[120px] flex-1" />
54
- ))}
55
- {placeholders.length > 4 && (
56
- <div className="bg-muted flex min-w-[120px] flex-1 items-center justify-center rounded-md">
57
- <span className="text-muted-foreground text-sm">+{placeholders.length - 4}</span>
58
- </div>
59
- )}
60
- </div>
61
- </div>
62
- )
63
- }
64
-
65
- if (variant === 'lightbox') {
66
- return (
67
- <div className="border-border rounded-md border p-4">
68
- <div className="grid grid-cols-3 gap-3">
69
- {placeholders.map((item, i) => (
70
- <Thumbnail key={i} item={item} className="aspect-square" />
71
- ))}
72
- </div>
73
- <p className="text-muted-foreground mt-2 text-center text-xs">Click to open lightbox</p>
74
- </div>
75
- )
76
- }
77
-
78
- return (
79
- <div className="border-border rounded-md border p-4">
80
- <div className="grid grid-cols-3 gap-3">
81
- {placeholders.map((item, i) => (
82
- <Thumbnail key={i} item={item} className="aspect-square" />
83
- ))}
84
- </div>
85
- </div>
86
- )
87
- }
@@ -1,90 +0,0 @@
1
- 'use client'
2
-
3
- import { Image, Play } from 'lucide-react'
4
- import type { BlockPreviewProps } from './index.js'
5
-
6
- export function HeroPreview({ data, variant = 'centered' }: BlockPreviewProps) {
7
- const title = (data.title as string) || ''
8
- const subtitle = (data.subtitle as string) || ''
9
- const image = data.image as string | undefined
10
- const ctaText = (data.ctaText as string) || ''
11
- const overlayOpacity = (data.overlayOpacity as number) ?? 0.4
12
-
13
- if (variant === 'split-image') {
14
- return (
15
- <div className="border-border flex min-h-[200px] overflow-hidden rounded-md border">
16
- <div className="flex flex-1 flex-col justify-center gap-3 p-6">
17
- <h2 className="text-foreground text-2xl font-medium">
18
- {title || <span className="text-muted-foreground">Hero Title</span>}
19
- </h2>
20
- {(subtitle || !title) && (
21
- <p className="text-muted-foreground text-sm">{subtitle || 'Subtitle text goes here'}</p>
22
- )}
23
- {ctaText && (
24
- <div className="mt-2">
25
- <span className="bg-primary text-primary-foreground inline-block rounded-md px-4 py-2 text-sm">
26
- {ctaText}
27
- </span>
28
- </div>
29
- )}
30
- </div>
31
- <div className="bg-muted flex flex-1 items-center justify-center">
32
- {image ? (
33
- <img src={image} alt="" className="h-full w-full object-cover" />
34
- ) : (
35
- <Image size={32} className="text-muted-foreground" />
36
- )}
37
- </div>
38
- </div>
39
- )
40
- }
41
-
42
- if (variant === 'minimal') {
43
- return (
44
- <div className="border-border flex flex-col items-center gap-3 rounded-md border p-8">
45
- <h2 className="text-foreground text-2xl font-medium">
46
- {title || <span className="text-muted-foreground">Hero Title</span>}
47
- </h2>
48
- {(subtitle || !title) && (
49
- <p className="text-muted-foreground text-sm">{subtitle || 'Subtitle text goes here'}</p>
50
- )}
51
- {ctaText && (
52
- <span className="bg-primary text-primary-foreground mt-2 inline-block rounded-md px-4 py-2 text-sm">
53
- {ctaText}
54
- </span>
55
- )}
56
- </div>
57
- )
58
- }
59
-
60
- const isVideo = variant === 'video-bg'
61
-
62
- return (
63
- <div className="border-border relative flex min-h-[220px] flex-col items-center justify-center gap-3 overflow-hidden rounded-md border p-8">
64
- {image ? (
65
- <img src={image} alt="" className="absolute inset-0 h-full w-full object-cover" />
66
- ) : (
67
- <div className="bg-muted absolute inset-0" />
68
- )}
69
- <div className="bg-background absolute inset-0" style={{ opacity: overlayOpacity }} />
70
- <div className="relative z-10 flex flex-col items-center gap-3 text-center">
71
- {isVideo && (
72
- <div className="bg-primary/90 mb-2 flex h-12 w-12 items-center justify-center rounded-full">
73
- <Play size={20} className="text-primary-foreground" />
74
- </div>
75
- )}
76
- <h2 className="text-foreground text-2xl font-medium">
77
- {title || <span className="text-muted-foreground">Hero Title</span>}
78
- </h2>
79
- {(subtitle || !title) && (
80
- <p className="text-muted-foreground text-sm">{subtitle || 'Subtitle text goes here'}</p>
81
- )}
82
- {ctaText && (
83
- <span className="bg-primary text-primary-foreground mt-2 inline-block rounded-md px-4 py-2 text-sm">
84
- {ctaText}
85
- </span>
86
- )}
87
- </div>
88
- </div>
89
- )
90
- }
@@ -1,54 +0,0 @@
1
- 'use client'
2
-
3
- import { Image } from 'lucide-react'
4
- import type { BlockPreviewProps } from './index.js'
5
-
6
- export function ImagePreview({ data, variant = 'full-width' }: BlockPreviewProps) {
7
- const src = data.src as string | undefined
8
- const alt = (data.alt as string) || ''
9
- const caption = (data.caption as string) || ''
10
- const aspectRatio = (data.aspectRatio as string) || '16/9'
11
-
12
- const roundedClass = variant === 'rounded' ? 'rounded-xl' : 'rounded-md'
13
-
14
- const ImagePlaceholder = ({ className = '' }: { className?: string }) => (
15
- <div
16
- className={`bg-muted flex items-center justify-center ${roundedClass} ${className}`}
17
- style={{ aspectRatio }}
18
- >
19
- <Image size={32} className="text-muted-foreground" />
20
- </div>
21
- )
22
-
23
- const ImageElement = ({ className = '' }: { className?: string }) =>
24
- src ? (
25
- <img
26
- src={src}
27
- alt={alt}
28
- className={`h-auto w-full object-cover ${roundedClass} ${className}`}
29
- style={{ aspectRatio }}
30
- />
31
- ) : (
32
- <ImagePlaceholder className={className} />
33
- )
34
-
35
- if (variant === 'side-by-side') {
36
- return (
37
- <div className="border-border grid grid-cols-2 gap-3 rounded-md border p-4">
38
- <ImageElement />
39
- <ImagePlaceholder />
40
- </div>
41
- )
42
- }
43
-
44
- return (
45
- <figure className="border-border overflow-hidden rounded-md border p-4">
46
- <ImageElement />
47
- {(variant === 'captioned' || caption) && (
48
- <figcaption className="text-muted-foreground mt-2 text-center text-sm">
49
- {caption || 'Image caption'}
50
- </figcaption>
51
- )}
52
- </figure>
53
- )
54
- }
@@ -1,81 +0,0 @@
1
- 'use client'
2
-
3
- import type { BlockPreviewProps } from './index.js'
4
-
5
- export function TextPreview({ data, variant = 'prose' }: BlockPreviewProps) {
6
- const body = (data.body as string) || ''
7
- const heading = (data.heading as string) || ''
8
- const headingLevel = (data.headingLevel as string) || 'h2'
9
-
10
- const truncatedBody = body.length > 300 ? body.slice(0, 300) + '…' : body
11
-
12
- const validLevels = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const
13
- const HeadingTag = (validLevels.includes(headingLevel as any) ? headingLevel : 'h2') as
14
- | 'h1'
15
- | 'h2'
16
- | 'h3'
17
- | 'h4'
18
- | 'h5'
19
- | 'h6'
20
- const headingSizeClass =
21
- HeadingTag === 'h1' ? 'text-2xl' : HeadingTag === 'h2' ? 'text-xl' : 'text-lg'
22
-
23
- if (variant === 'two-column') {
24
- const midpoint = Math.ceil(truncatedBody.length / 2)
25
- const col1 = truncatedBody.slice(0, midpoint)
26
- const col2 = truncatedBody.slice(midpoint)
27
-
28
- return (
29
- <div className="border-border rounded-md border p-5">
30
- {heading && (
31
- <HeadingTag className={`${headingSizeClass} text-foreground mb-3 font-medium`}>
32
- {heading}
33
- </HeadingTag>
34
- )}
35
- <div className="grid grid-cols-2 gap-4">
36
- <p className="text-muted-foreground text-sm leading-relaxed">
37
- {col1 || 'Column one text content…'}
38
- </p>
39
- <p className="text-muted-foreground text-sm leading-relaxed">
40
- {col2 || 'Column two text content…'}
41
- </p>
42
- </div>
43
- </div>
44
- )
45
- }
46
-
47
- if (variant === 'with-sidebar') {
48
- return (
49
- <div className="border-border grid grid-cols-[1fr_200px] gap-4 rounded-md border p-5">
50
- <div>
51
- {heading && (
52
- <HeadingTag className={`${headingSizeClass} text-foreground mb-3 font-medium`}>
53
- {heading}
54
- </HeadingTag>
55
- )}
56
- <p className="text-muted-foreground text-sm leading-relaxed">
57
- {truncatedBody || 'Body text content goes here…'}
58
- </p>
59
- </div>
60
- <aside className="bg-muted rounded-md p-3">
61
- <div className="bg-border h-3 w-3/4 rounded" />
62
- <div className="bg-border mt-2 h-2 w-full rounded" />
63
- <div className="bg-border mt-1 h-2 w-2/3 rounded" />
64
- </aside>
65
- </div>
66
- )
67
- }
68
-
69
- return (
70
- <div className="border-border rounded-md border p-5">
71
- {heading && (
72
- <HeadingTag className={`${headingSizeClass} text-foreground mb-3 font-medium`}>
73
- {heading}
74
- </HeadingTag>
75
- )}
76
- <p className="text-muted-foreground text-sm leading-relaxed">
77
- {truncatedBody || <span className="italic">Body text content goes here…</span>}
78
- </p>
79
- </div>
80
- )
81
- }
@@ -1,73 +0,0 @@
1
- 'use client'
2
-
3
- import { Play } from 'lucide-react'
4
- import type { BlockPreviewProps } from './index.js'
5
-
6
- export function VideoPreview({ data, variant = 'inline' }: BlockPreviewProps) {
7
- const poster = data.poster as string | undefined
8
- const autoplay = data.autoplay as boolean | undefined
9
- const loop = data.loop as boolean | undefined
10
-
11
- const badges: string[] = [autoplay ? 'Autoplay' : '', loop ? 'Loop' : ''].filter(
12
- (b): b is string => b !== '',
13
- )
14
-
15
- const content = (
16
- <div className="bg-muted relative flex aspect-video items-center justify-center overflow-hidden rounded-md">
17
- {poster ? (
18
- <img src={poster} alt="" className="absolute inset-0 h-full w-full object-cover" />
19
- ) : (
20
- <div className="bg-card absolute inset-0" />
21
- )}
22
- <div className="bg-primary/90 relative z-10 flex h-12 w-12 items-center justify-center rounded-full shadow-sm">
23
- <Play size={20} className="text-primary-foreground" />
24
- </div>
25
- {badges.length > 0 && (
26
- <div className="absolute right-2 bottom-2 z-10 flex gap-1">
27
- {badges.map((badge) => (
28
- <span
29
- key={badge}
30
- className="bg-background/80 text-muted-foreground rounded px-1.5 py-0.5 text-xs"
31
- >
32
- {badge}
33
- </span>
34
- ))}
35
- </div>
36
- )}
37
- </div>
38
- )
39
-
40
- if (variant === 'background') {
41
- return (
42
- <div className="border-border overflow-hidden rounded-md border">
43
- <div className="relative aspect-[21/9]">
44
- {poster ? (
45
- <img src={poster} alt="" className="absolute inset-0 h-full w-full object-cover" />
46
- ) : (
47
- <div className="bg-card absolute inset-0" />
48
- )}
49
- <div className="bg-background/30 absolute inset-0 flex items-center justify-center">
50
- <div className="bg-primary/90 flex h-14 w-14 items-center justify-center rounded-full shadow-sm">
51
- <Play size={24} className="text-primary-foreground" />
52
- </div>
53
- </div>
54
- </div>
55
- </div>
56
- )
57
- }
58
-
59
- if (variant === 'lightbox') {
60
- return (
61
- <div className="border-border rounded-md border p-4">
62
- <div className="mx-auto max-w-sm">
63
- {content}
64
- <p className="text-muted-foreground mt-2 text-center text-xs">
65
- Click to play in lightbox
66
- </p>
67
- </div>
68
- </div>
69
- )
70
- }
71
-
72
- return <div className="border-border rounded-md border p-4">{content}</div>
73
- }
@@ -1,34 +0,0 @@
1
- 'use client'
2
-
3
- import type { ComponentType } from 'react'
4
- import { HeroPreview } from './HeroPreview.js'
5
- import { TextPreview } from './TextPreview.js'
6
- import { ImagePreview } from './ImagePreview.js'
7
- import { CardsPreview } from './CardsPreview.js'
8
- import { CTAPreview } from './CTAPreview.js'
9
- import { VideoPreview } from './VideoPreview.js'
10
- import { GalleryPreview } from './GalleryPreview.js'
11
- import { FAQPreview } from './FAQPreview.js'
12
- import { FormPreview } from './FormPreview.js'
13
- import { CodePreview } from './CodePreview.js'
14
-
15
- export interface BlockPreviewProps {
16
- data: Record<string, unknown>
17
- variant?: string
18
- }
19
-
20
- export const blockRenderers: Record<string, ComponentType<BlockPreviewProps>> = {
21
- hero: HeroPreview,
22
- text: TextPreview,
23
- image: ImagePreview,
24
- cards: CardsPreview,
25
- cta: CTAPreview,
26
- video: VideoPreview,
27
- gallery: GalleryPreview,
28
- faq: FAQPreview,
29
- form: FormPreview,
30
- code: CodePreview,
31
- }
32
-
33
- export { FallbackPreview } from './FallbackPreview.js'
34
- export type { FallbackPreviewProps } from './FallbackPreview.js'
@@ -1,56 +0,0 @@
1
- 'use client'
2
-
3
- import { useState } from 'react'
4
- import type { BlockNode } from '@prenta/core'
5
- import { blockRenderers, FallbackPreview } from '../block-renderers/index.js'
6
-
7
- export interface BlockRendererProps {
8
- node: BlockNode
9
- selectedNodeId: string | null
10
- onSelectNode: (id: string | null) => void
11
- }
12
-
13
- function getBlockLabel(blockType: string): string {
14
- return blockType.charAt(0).toUpperCase() + blockType.slice(1)
15
- }
16
-
17
- export function BlockRenderer({ node, selectedNodeId, onSelectNode }: BlockRendererProps) {
18
- const [hovered, setHovered] = useState(false)
19
- const isSelected = selectedNodeId === node.id
20
- const blockType = node.settings.blockType
21
- const label = getBlockLabel(blockType)
22
- const Preview = blockRenderers[blockType]
23
-
24
- const handleClick = (e: React.MouseEvent) => {
25
- e.stopPropagation()
26
- onSelectNode(node.id)
27
- }
28
-
29
- return (
30
- <div
31
- data-node-id={node.id}
32
- data-block-type={blockType}
33
- className={`relative min-h-[48px] transition-shadow ${
34
- isSelected ? 'ring-primary ring-2 ring-offset-2' : hovered ? 'ring-primary/50 ring-1' : ''
35
- }`}
36
- onClick={handleClick}
37
- onMouseEnter={() => setHovered(true)}
38
- onMouseLeave={() => setHovered(false)}
39
- >
40
- {(hovered || isSelected) && (
41
- <span className="bg-primary text-primary-foreground absolute -top-2 -left-1 z-10 rounded px-1.5 py-0.5 text-xs font-medium">
42
- {label}
43
- </span>
44
- )}
45
-
46
- {/* Previews are display-only on the canvas; the wrapper owns selection. */}
47
- <div className="pointer-events-none">
48
- {Preview ? (
49
- <Preview data={node.data} variant={node.settings.variant} />
50
- ) : (
51
- <FallbackPreview blockType={blockType} data={node.data} />
52
- )}
53
- </div>
54
- </div>
55
- )
56
- }
@@ -1,87 +0,0 @@
1
- 'use client'
2
-
3
- import { LayoutGrid } from 'lucide-react'
4
- import type { PageNode } from '@prenta/core'
5
- import { SectionRenderer } from './SectionRenderer.js'
6
-
7
- export interface BuilderCanvasProps {
8
- tree: PageNode
9
- selectedNodeId: string | null
10
- showGridOverlay: boolean
11
- deviceMode: 'desktop' | 'tablet' | 'mobile'
12
- onSelectNode: (id: string | null) => void
13
- }
14
-
15
- const DEVICE_CLASSES: Record<BuilderCanvasProps['deviceMode'], string> = {
16
- desktop: 'w-full',
17
- tablet: 'max-w-[768px] mx-auto',
18
- mobile: 'max-w-[375px] mx-auto',
19
- }
20
-
21
- export function BuilderCanvas({
22
- tree,
23
- selectedNodeId,
24
- showGridOverlay,
25
- deviceMode,
26
- onSelectNode,
27
- }: BuilderCanvasProps) {
28
- const handleCanvasClick = (e: React.MouseEvent) => {
29
- if (e.target === e.currentTarget) {
30
- onSelectNode(null)
31
- }
32
- }
33
-
34
- return (
35
- <div className="bg-muted relative flex-1 overflow-auto p-6" onClick={handleCanvasClick}>
36
- {showGridOverlay && <GridOverlay deviceMode={deviceMode} />}
37
-
38
- <div
39
- className={`bg-background relative min-h-full shadow-sm ${DEVICE_CLASSES[deviceMode]}`}
40
- onClick={handleCanvasClick}
41
- >
42
- {tree.children.map((child) => {
43
- if (child.type === 'section') {
44
- return (
45
- <SectionRenderer
46
- key={child.id}
47
- node={child}
48
- selectedNodeId={selectedNodeId}
49
- onSelectNode={onSelectNode}
50
- />
51
- )
52
- }
53
- return null
54
- })}
55
-
56
- {tree.children.length === 0 && (
57
- <div className="flex min-h-[400px] flex-col items-center justify-center text-center">
58
- <LayoutGrid size={32} className="text-muted-foreground mb-3" />
59
- <p className="text-foreground mb-1 text-sm font-medium">No sections yet</p>
60
- <p className="text-muted-foreground text-xs">
61
- Click "Add Section" below to start building your page
62
- </p>
63
- </div>
64
- )}
65
- </div>
66
- </div>
67
- )
68
- }
69
-
70
- function GridOverlay({ deviceMode }: { deviceMode: BuilderCanvasProps['deviceMode'] }) {
71
- return (
72
- <div
73
- className={`pointer-events-none absolute inset-0 z-50 p-6 ${
74
- deviceMode !== 'desktop' ? 'flex justify-center' : ''
75
- }`}
76
- aria-hidden="true"
77
- >
78
- <div
79
- className={`grid h-full grid-cols-12 gap-4 opacity-[0.08] ${DEVICE_CLASSES[deviceMode]}`}
80
- >
81
- {Array.from({ length: 12 }).map((_, i) => (
82
- <div key={i} className="bg-primary h-full rounded-sm" />
83
- ))}
84
- </div>
85
- </div>
86
- )
87
- }
@@ -1,82 +0,0 @@
1
- 'use client'
2
-
3
- import { useState } from 'react'
4
- import type { ColumnNode } from '@prenta/core'
5
- import { BlockRenderer } from './BlockRenderer.js'
6
- import { ContainerRenderer } from './ContainerRenderer.js'
7
-
8
- export interface ColumnRendererProps {
9
- node: ColumnNode
10
- selectedNodeId: string | null
11
- onSelectNode: (id: string | null) => void
12
- }
13
-
14
- export function ColumnRenderer({ node, selectedNodeId, onSelectNode }: ColumnRendererProps) {
15
- const [hovered, setHovered] = useState(false)
16
- const isSelected = selectedNodeId === node.id
17
- const width = node.settings.width
18
- const isEmpty = node.children.length === 0
19
-
20
- const handleClick = (e: React.MouseEvent) => {
21
- e.stopPropagation()
22
- onSelectNode(node.id)
23
- }
24
-
25
- return (
26
- <div
27
- data-node-id={node.id}
28
- className={`relative transition-shadow ${
29
- isSelected ? 'ring-primary ring-2 ring-offset-2' : hovered ? 'ring-primary/50 ring-1' : ''
30
- }`}
31
- style={{
32
- gridColumn: `span ${width}`,
33
- padding: node.settings.padding,
34
- background: node.settings.background,
35
- }}
36
- onClick={handleClick}
37
- onMouseEnter={(e) => {
38
- e.stopPropagation()
39
- setHovered(true)
40
- }}
41
- onMouseLeave={() => setHovered(false)}
42
- >
43
- {(hovered || isSelected) && (
44
- <span className="bg-primary text-primary-foreground absolute -top-2 -left-1 z-10 rounded px-1.5 py-0.5 text-xs font-medium">
45
- Col {width}
46
- </span>
47
- )}
48
-
49
- {isEmpty ? (
50
- <div className="border-border text-muted-foreground flex min-h-[64px] items-center justify-center rounded-md border-2 border-dashed text-sm">
51
- Empty column
52
- </div>
53
- ) : (
54
- <div className="flex flex-col gap-2">
55
- {node.children.map((child) => {
56
- if (child.type === 'block') {
57
- return (
58
- <BlockRenderer
59
- key={child.id}
60
- node={child}
61
- selectedNodeId={selectedNodeId}
62
- onSelectNode={onSelectNode}
63
- />
64
- )
65
- }
66
- if (child.type === 'container') {
67
- return (
68
- <ContainerRenderer
69
- key={child.id}
70
- node={child}
71
- selectedNodeId={selectedNodeId}
72
- onSelectNode={onSelectNode}
73
- />
74
- )
75
- }
76
- return null
77
- })}
78
- </div>
79
- )}
80
- </div>
81
- )
82
- }