@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,96 +0,0 @@
1
- 'use client';
2
- import { useCallback, useEffect, useRef, useState } from 'react';
3
- import { toast } from 'sonner';
4
- import { buildPublicPreviewUrl, createPreviewToken, resolveSiteUrl, } from '../../lib/preview-link.js';
5
- /** Prefer the Next canvas origin (admin host); fall back to siteUrl only offline. */
6
- function resolveCanvasOrigin(canvasUrl, siteUrl) {
7
- if (canvasUrl)
8
- return resolveSiteUrl(canvasUrl);
9
- if (typeof window !== 'undefined' && window.location?.origin) {
10
- return window.location.origin;
11
- }
12
- return resolveSiteUrl(siteUrl);
13
- }
14
- /**
15
- * Inline branded preview — drives an in-editor iframe that renders the draft
16
- * through the consumer's Next builder route (same `?preview=<token>` contract
17
- * as "View on site"), so editors see actual site CSS without leaving the
18
- * admin. On Astro-split deploys the canvas is the CMS host, not the public
19
- * Astro apex. Saves first when dirty, and reloads the frame after each save.
20
- */
21
- export function useSitePreview({ collection, documentId, slug, path, urlPrefix, canvasUrl, siteUrl, dirty, saveState, saveDraft, defaultActive = false, }) {
22
- const [active, setActive] = useState(false);
23
- const [url, setUrl] = useState(null);
24
- const [reloadKey, setReloadKey] = useState(0);
25
- const tokenRef = useRef(null);
26
- const prevSaveState = useRef(saveState);
27
- const autoOpenRef = useRef(false);
28
- const activatePreview = useCallback(async () => {
29
- if (!documentId || !slug) {
30
- toast.error('Save the page before opening the site preview');
31
- return false;
32
- }
33
- setActive(true);
34
- setUrl(null);
35
- try {
36
- if (dirty) {
37
- const ok = await saveDraft();
38
- if (!ok) {
39
- setActive(false);
40
- return false;
41
- }
42
- }
43
- const { token } = await createPreviewToken(collection, documentId);
44
- tokenRef.current = token;
45
- setUrl(buildPublicPreviewUrl({
46
- siteUrl: resolveCanvasOrigin(canvasUrl, siteUrl),
47
- urlPrefix: urlPrefix ?? '',
48
- slug,
49
- path,
50
- token,
51
- }));
52
- return true;
53
- }
54
- catch (err) {
55
- toast.error(err instanceof Error ? err.message : 'Failed to open site preview');
56
- setActive(false);
57
- return false;
58
- }
59
- }, [collection, documentId, slug, path, urlPrefix, canvasUrl, siteUrl, dirty, saveDraft]);
60
- // Opt-in default: open the iframe once a saved document is loaded.
61
- useEffect(() => {
62
- if (!defaultActive || autoOpenRef.current)
63
- return;
64
- if (!documentId || !slug)
65
- return;
66
- autoOpenRef.current = true;
67
- void activatePreview();
68
- }, [defaultActive, documentId, slug, activatePreview]);
69
- // After a save completes while the preview is open, rebuild the URL (the
70
- // slug/path may have changed in settings — the token is bound to the document
71
- // id, not the path) and reload the frame.
72
- useEffect(() => {
73
- if (active && prevSaveState.current === 'saving' && saveState === 'saved') {
74
- if (tokenRef.current && slug) {
75
- setUrl(buildPublicPreviewUrl({
76
- siteUrl: resolveCanvasOrigin(canvasUrl, siteUrl),
77
- urlPrefix: urlPrefix ?? '',
78
- slug,
79
- path,
80
- token: tokenRef.current,
81
- }));
82
- }
83
- setReloadKey((k) => k + 1);
84
- }
85
- prevSaveState.current = saveState;
86
- }, [active, saveState, slug, path, canvasUrl, siteUrl, urlPrefix]);
87
- const toggle = useCallback(() => {
88
- if (active) {
89
- setActive(false);
90
- return;
91
- }
92
- void activatePreview();
93
- }, [active, activatePreview]);
94
- return { active, url, reloadKey, toggle };
95
- }
96
- //# sourceMappingURL=useSitePreview.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useSitePreview.js","sourceRoot":"","sources":["../../../src/views/page-editor/useSitePreview.ts"],"names":[],"mappings":"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"}
@@ -1,14 +0,0 @@
1
- interface PostPreviewProps {
2
- postType: string;
3
- documentId: string;
4
- session?: any;
5
- onNavigate: (path: string) => void;
6
- }
7
- /**
8
- * Chrome-free render of a post using the same header + section renderers as
9
- * the editor canvas, so the preview reflects what ships. Only visible
10
- * sections render (hidden ones are omitted, like the public page).
11
- */
12
- export declare function PostPreview({ postType, documentId, session, onNavigate }: PostPreviewProps): import("react/jsx-runtime").JSX.Element;
13
- export {};
14
- //# sourceMappingURL=PostPreview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PostPreview.d.ts","sourceRoot":"","sources":["../../../src/views/post-editor/PostPreview.tsx"],"names":[],"mappings":"AAcA,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,GAAG,CAAA;IACb,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CACnC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,gBAAgB,2CAkG1F"}
@@ -1,63 +0,0 @@
1
- 'use client';
2
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { useEffect, useState } from 'react';
4
- import { AlertTriangle, Loader2, Pencil, X } from 'lucide-react';
5
- import { fetchPostForEditor, fetchTemplateForEditor, } from '../../lib/post-editor-service.js';
6
- import { defaultPostHeader } from '@prenta/core/page-sections';
7
- import { SectionRenderer } from '../page-editor/sections/index.js';
8
- import { PostHeader } from './PostHeader.js';
9
- /**
10
- * Chrome-free render of a post using the same header + section renderers as
11
- * the editor canvas, so the preview reflects what ships. Only visible
12
- * sections render (hidden ones are omitted, like the public page).
13
- */
14
- export function PostPreview({ postType, documentId, session, onNavigate }) {
15
- const [post, setPost] = useState(null);
16
- const [header, setHeader] = useState(defaultPostHeader());
17
- const [loading, setLoading] = useState(true);
18
- const [error, setError] = useState(null);
19
- useEffect(() => {
20
- let cancelled = false;
21
- setLoading(true);
22
- fetchTemplateForEditor(postType)
23
- .then((t) => !cancelled && setHeader(t.header))
24
- .catch(() => {
25
- /* default header */
26
- });
27
- fetchPostForEditor(postType, documentId)
28
- .then((p) => !cancelled && setPost(p))
29
- .catch((err) => !cancelled && setError(err instanceof Error ? err.message : 'Failed to load'))
30
- .finally(() => !cancelled && setLoading(false));
31
- return () => {
32
- cancelled = true;
33
- };
34
- }, [postType, documentId]);
35
- if (loading) {
36
- return (_jsxs("div", { className: "bg-background flex h-full items-center justify-center", children: [_jsx(Loader2, { className: "text-muted-foreground h-6 w-6 animate-spin", "aria-hidden": true }), _jsx("span", { className: "sr-only", children: "Loading preview\u2026" })] }));
37
- }
38
- if (error || !post) {
39
- return (_jsx("div", { className: "bg-background flex h-full items-center justify-center p-6", children: _jsxs("div", { className: "border-destructive/30 bg-destructive/5 flex max-w-md items-center gap-3 rounded-lg border p-4", children: [_jsx(AlertTriangle, { className: "text-destructive shrink-0", size: 20, "aria-hidden": true }), _jsx("p", { className: "text-foreground text-sm font-medium", children: error ?? 'Post not found.' })] }) }));
40
- }
41
- const context = {
42
- title: post.title,
43
- excerpt: post.excerpt,
44
- body: post.body,
45
- featuredImageUrl: post.featuredImage,
46
- publishDate: post.publishDate ?? post.updatedAt ?? null,
47
- category: post.category,
48
- author: { name: session?.user?.name || session?.user?.email },
49
- };
50
- const visible = post.sections.filter((s) => s.visible);
51
- // `window.close()` only works for tabs JS opened (the "View preview" action
52
- // opens this view via window.open). When the user reached it through in-app
53
- // navigation there is no opener, so close() is a silent no-op — fall back to
54
- // the editor after a tick so the Close button always does something.
55
- const handleClose = () => {
56
- window.close();
57
- setTimeout(() => {
58
- onNavigate(`/posts/${postType}/${documentId}/edit`);
59
- }, 120);
60
- };
61
- return (_jsxs("div", { className: "flex h-full flex-col", children: [_jsxs("div", { className: "bg-card border-border flex h-12 shrink-0 items-center justify-between border-b px-4", children: [_jsxs("button", { type: "button", onClick: handleClose, className: "text-muted-foreground hover:text-foreground inline-flex items-center gap-1.5 text-sm", "aria-label": "Close preview tab", children: [_jsx(X, { className: "h-4 w-4", "aria-hidden": true }), "Close"] }), _jsxs("span", { className: "text-muted-foreground text-xs", children: ["Preview \u00B7 ", post.title || 'Untitled'] }), _jsxs("button", { type: "button", onClick: () => onNavigate(`/posts/${postType}/${documentId}/edit`), className: "bg-primary text-primary-foreground hover:bg-primary/90 inline-flex items-center gap-1.5 rounded-lg px-3 py-1.5 text-sm font-medium", children: [_jsx(Pencil, { className: "h-3.5 w-3.5", "aria-hidden": true }), "Open editor"] })] }), _jsxs("div", { className: "prenta-canvas bg-card flex-1 overflow-auto", children: [_jsx(PostHeader, { config: header, context: context }), visible.map((section) => (_jsx(SectionRenderer, { section: section, context: context }, section.id)))] })] }));
62
- }
63
- //# sourceMappingURL=PostPreview.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PostPreview.js","sourceRoot":"","sources":["../../../src/views/post-editor/PostPreview.tsx"],"names":[],"mappings":"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"}
@@ -1,66 +0,0 @@
1
- // @vitest-environment happy-dom
2
- import { beforeEach, describe, expect, it, vi } from 'vitest'
3
- import { fireEvent, render, screen, waitFor } from '@testing-library/react'
4
- import type { BlockNode } from '@prenta/core'
5
-
6
- const cmsApi = vi.fn()
7
- vi.mock('../../lib/api.js', () => ({ cmsApi: (...args: unknown[]) => cmsApi(...args) }))
8
-
9
- const { BlockRenderer } = await import('../../views/page-builder/canvas/BlockRenderer.js')
10
-
11
- function formNode(over: Partial<BlockNode> = {}): BlockNode {
12
- return {
13
- id: 'node-1',
14
- type: 'block',
15
- settings: { blockType: 'form', variant: 'contact' },
16
- data: { formId: 'f1' },
17
- ...over,
18
- } as BlockNode
19
- }
20
-
21
- beforeEach(() => {
22
- cmsApi.mockReset()
23
- cmsApi.mockResolvedValue({
24
- data: {
25
- name: 'Contact Us',
26
- fields: [
27
- { key: 'name', label: 'Full Name', type: 'text' },
28
- { key: 'message', label: 'Message', type: 'textarea' },
29
- ],
30
- },
31
- status: 200,
32
- })
33
- })
34
-
35
- describe('canvas BlockRenderer', () => {
36
- it('renders the live form preview with the linked form name and fields', async () => {
37
- render(<BlockRenderer node={formNode()} selectedNodeId={null} onSelectNode={vi.fn()} />)
38
- await waitFor(() => expect(screen.getByText('Contact Us')).toBeTruthy())
39
- expect(cmsApi).toHaveBeenCalledWith('/forms/f1')
40
- expect(screen.getByText('Full Name')).toBeTruthy()
41
- })
42
-
43
- it('selects the node on click', () => {
44
- const onSelectNode = vi.fn()
45
- const { container } = render(
46
- <BlockRenderer
47
- node={formNode({ data: {} })}
48
- selectedNodeId={null}
49
- onSelectNode={onSelectNode}
50
- />,
51
- )
52
- fireEvent.click(container.querySelector('[data-node-id="node-1"]')!)
53
- expect(onSelectNode).toHaveBeenCalledWith('node-1')
54
- })
55
-
56
- it('falls back to a placeholder for unknown block types', () => {
57
- render(
58
- <BlockRenderer
59
- node={formNode({ settings: { blockType: 'widget' }, data: {} })}
60
- selectedNodeId={null}
61
- onSelectNode={vi.fn()}
62
- />,
63
- )
64
- expect(screen.getByText('No preview available')).toBeTruthy()
65
- })
66
- })
@@ -1,54 +0,0 @@
1
- // @vitest-environment happy-dom
2
- import { beforeEach, describe, expect, it, vi } from 'vitest'
3
- import { fireEvent, render, screen, waitFor } from '@testing-library/react'
4
- import type { FieldDefinition } from '@prenta/core'
5
-
6
- const cmsApi = vi.fn()
7
- vi.mock('../../lib/api.js', () => ({ cmsApi: (...args: unknown[]) => cmsApi(...args) }))
8
-
9
- const { RelationshipField } = await import('../../views/page-builder/RelationshipField.js')
10
-
11
- const formField: FieldDefinition = {
12
- type: 'relationship',
13
- label: 'Form',
14
- relationTo: 'forms',
15
- } as FieldDefinition
16
-
17
- beforeEach(() => {
18
- cmsApi.mockReset()
19
- })
20
-
21
- describe('RelationshipField (form block picker)', () => {
22
- it('loads forms and lets the editor pick one by id', async () => {
23
- cmsApi.mockResolvedValue({
24
- data: [
25
- { id: 'f1', name: 'Contact Us', slug: 'contact-us' },
26
- { id: 'f2', name: 'Event RSVP', slug: 'event-rsvp' },
27
- ],
28
- status: 200,
29
- })
30
- const onChange = vi.fn()
31
- render(<RelationshipField definition={formField} value="" onChange={onChange} label="Form" />)
32
-
33
- await waitFor(() => expect(screen.getByText('Contact Us')).toBeTruthy())
34
- expect(cmsApi).toHaveBeenCalledWith('/forms')
35
- expect(screen.getByText('Event RSVP')).toBeTruthy()
36
-
37
- fireEvent.change(screen.getByLabelText('Form'), { target: { value: 'f2' } })
38
- expect(onChange).toHaveBeenCalledWith('f2')
39
- })
40
-
41
- it('shows an empty hint when the collection has no items', async () => {
42
- cmsApi.mockResolvedValue({ data: [], status: 200 })
43
- render(<RelationshipField definition={formField} value="" onChange={vi.fn()} label="Form" />)
44
- await waitFor(() => expect(screen.getByText('No forms found.')).toBeTruthy())
45
- })
46
-
47
- it('degrades to a plain id input when the collection cannot be loaded', async () => {
48
- cmsApi.mockResolvedValue({ error: 'boom', status: 500 })
49
- render(<RelationshipField definition={formField} value="f9" onChange={vi.fn()} label="Form" />)
50
- await waitFor(() =>
51
- expect((screen.getByPlaceholderText('Enter forms id…') as HTMLInputElement).value).toBe('f9'),
52
- )
53
- })
54
- })
@@ -1,138 +0,0 @@
1
- // @vitest-environment happy-dom
2
- import { beforeEach, describe, expect, it, vi } from 'vitest'
3
- import { fireEvent, render, screen } from '@testing-library/react'
4
- import type { PageNode } from '@prenta/core'
5
-
6
- const { BuilderSectionsPanel } = await import('../../views/page-builder/BuilderSectionsPanel.js')
7
-
8
- /** Minimal builder tree: a hero section plus an empty, hidden section. */
9
- function makeTree(): PageNode {
10
- return {
11
- id: 'page1',
12
- type: 'page',
13
- children: [
14
- {
15
- id: 'sec1',
16
- type: 'section',
17
- settings: {},
18
- children: [
19
- {
20
- id: 'cont1',
21
- type: 'container',
22
- settings: {},
23
- children: [
24
- {
25
- id: 'row1',
26
- type: 'row',
27
- settings: {},
28
- children: [
29
- {
30
- id: 'col1',
31
- type: 'column',
32
- settings: { width: 12 },
33
- children: [
34
- {
35
- id: 'blk1',
36
- type: 'block',
37
- settings: { blockType: 'hero', variant: 'centered' },
38
- data: {},
39
- },
40
- ],
41
- },
42
- ],
43
- },
44
- ],
45
- },
46
- ],
47
- },
48
- { id: 'sec2', type: 'section', settings: { visibility: 'hidden' }, children: [] },
49
- ],
50
- }
51
- }
52
-
53
- function renderPanel(over: Partial<Parameters<typeof BuilderSectionsPanel>[0]> = {}) {
54
- const props = {
55
- tree: makeTree(),
56
- selectedNodeId: null,
57
- collapsed: false,
58
- onToggleCollapsed: vi.fn(),
59
- onSelect: vi.fn(),
60
- onReorder: vi.fn(),
61
- onAddSection: vi.fn(),
62
- ...over,
63
- }
64
- render(<BuilderSectionsPanel {...props} />)
65
- return props
66
- }
67
-
68
- beforeEach(() => {
69
- vi.clearAllMocks()
70
- })
71
-
72
- describe('BuilderSectionsPanel', () => {
73
- it('lists the page sections in order with derived names and block counts', () => {
74
- renderPanel()
75
-
76
- // First section is named after its first block's catalog label.
77
- expect(screen.getByText('Hero')).toBeTruthy()
78
- expect(screen.getByText('1 block')).toBeTruthy()
79
- // Empty section falls back to a positional name.
80
- expect(screen.getByText('Section 2')).toBeTruthy()
81
- expect(screen.getByText('Empty section')).toBeTruthy()
82
- // Count chip in the header.
83
- expect(screen.getByText('2')).toBeTruthy()
84
- // Panel is an accessible nav landmark.
85
- expect(screen.getByRole('navigation', { name: 'Page sections' })).toBeTruthy()
86
- })
87
-
88
- it('fires the selection callback when a section row is clicked', () => {
89
- const props = renderPanel()
90
-
91
- // `/^Hero/` excludes the drag handle ("Drag to reorder Hero").
92
- fireEvent.click(screen.getByRole('button', { name: /^Hero/ }))
93
- expect(props.onSelect).toHaveBeenCalledWith('sec1')
94
- })
95
-
96
- it('marks the selected section with aria-current', () => {
97
- renderPanel({ selectedNodeId: 'sec1' })
98
-
99
- const row = screen.getByRole('button', { name: /^Hero/ })
100
- expect(row.getAttribute('aria-current')).toBe('true')
101
- })
102
-
103
- it('exposes keyboard-accessible drag handles per section', () => {
104
- renderPanel()
105
- expect(screen.getByRole('button', { name: 'Drag to reorder Hero' })).toBeTruthy()
106
- expect(screen.getByRole('button', { name: 'Drag to reorder Section 2' })).toBeTruthy()
107
- })
108
-
109
- it('fires the add-section callback from the bottom affordance', () => {
110
- const props = renderPanel()
111
-
112
- fireEvent.click(screen.getByRole('button', { name: 'Add Section' }))
113
- expect(props.onAddSection).toHaveBeenCalledTimes(1)
114
- })
115
-
116
- it('collapses to a rail with an expand toggle', () => {
117
- const props = renderPanel({ collapsed: true })
118
-
119
- // Section rows are gone; only the expand affordance remains.
120
- expect(screen.queryByText('Hero')).toBeNull()
121
- const toggle = screen.getByRole('button', { name: 'Expand sections panel' })
122
- expect(toggle.getAttribute('aria-expanded')).toBe('false')
123
-
124
- fireEvent.click(toggle)
125
- expect(props.onToggleCollapsed).toHaveBeenCalledTimes(1)
126
- })
127
-
128
- it('shows a collapse toggle with aria-expanded when open', () => {
129
- renderPanel()
130
- const toggle = screen.getByRole('button', { name: 'Collapse sections panel' })
131
- expect(toggle.getAttribute('aria-expanded')).toBe('true')
132
- })
133
-
134
- it('shows an empty message when the page has no sections', () => {
135
- renderPanel({ tree: { id: 'page1', type: 'page', children: [] } })
136
- expect(screen.getByText(/No sections yet/)).toBeTruthy()
137
- })
138
- })
@@ -1,77 +0,0 @@
1
- // @vitest-environment happy-dom
2
- import { describe, expect, it, vi } from 'vitest'
3
- import { render, screen } from '@testing-library/react'
4
- import type { PageNode } from '@prenta/core'
5
- import { BuilderSEOPanel } from '../../views/page-builder/SEOPanel.js'
6
-
7
- const tree = {
8
- id: 'page-1',
9
- type: 'page',
10
- children: [
11
- {
12
- id: 'sec-1',
13
- type: 'section',
14
- settings: {},
15
- children: [
16
- {
17
- id: 'row-1',
18
- type: 'row',
19
- settings: {},
20
- children: [
21
- {
22
- id: 'col-1',
23
- type: 'column',
24
- settings: { width: 12 },
25
- children: [
26
- {
27
- id: 'blk-hero',
28
- type: 'block',
29
- settings: { blockType: 'hero' },
30
- data: {
31
- title: 'Welcome to Our Service',
32
- image: { url: '/hero.webp', alt: 'Hero banner' },
33
- },
34
- },
35
- ],
36
- },
37
- ],
38
- },
39
- ],
40
- },
41
- ],
42
- } as PageNode
43
-
44
- const pageSettings = {
45
- title: 'Home',
46
- slug: 'home',
47
- metaTitle: 'Welcome to Our Service',
48
- metaDescription: 'The public description.',
49
- }
50
-
51
- describe('BuilderSEOPanel', () => {
52
- it('grades the live tree with the shared page audit panel and keeps meta fields', () => {
53
- render(
54
- <BuilderSEOPanel tree={tree} pageSettings={pageSettings} onPageSettingsChange={vi.fn()} />,
55
- )
56
-
57
- expect(screen.getByRole('img', { name: /SEO score:/i })).toBeTruthy()
58
- expect(screen.getByRole('img', { name: /GEO score:/i })).toBeTruthy()
59
- expect(screen.getByText('SEO checks')).toBeTruthy()
60
- expect(screen.getByText('GEO checks')).toBeTruthy()
61
- expect(screen.getByLabelText('Meta Title')).toBeTruthy()
62
- expect(screen.queryByText('Readability')).toBeNull()
63
- expect(screen.queryByText('Block Hints')).toBeNull()
64
- })
65
-
66
- it('keeps the empty-tree copy when the canvas has no children', () => {
67
- render(
68
- <BuilderSEOPanel
69
- tree={{ id: 'page-1', type: 'page', children: [] } as PageNode}
70
- pageSettings={pageSettings}
71
- onPageSettingsChange={vi.fn()}
72
- />,
73
- )
74
- expect(screen.getByText('Add content to your page to see SEO analysis')).toBeTruthy()
75
- expect(screen.queryByRole('img', { name: /SEO score:/i })).toBeNull()
76
- })
77
- })
@@ -1,59 +0,0 @@
1
- // @vitest-environment happy-dom
2
- import { beforeEach, describe, expect, it, vi, afterEach } from 'vitest'
3
- import { cleanup, render, screen, waitFor } from '@testing-library/react'
4
-
5
- const cmsApi = vi.fn()
6
- vi.mock('../../lib/api.js', () => ({ cmsApi: (...args: unknown[]) => cmsApi(...args) }))
7
- vi.mock('sonner', () => ({
8
- toast: { success: vi.fn(), error: vi.fn(), loading: vi.fn() },
9
- Toaster: () => null,
10
- }))
11
-
12
- const { PageBuilder } = await import('../../views/page-builder/PageBuilder.js')
13
-
14
- const TEMPLATE_TREE = {
15
- id: 'tpl-page',
16
- type: 'page',
17
- children: [
18
- {
19
- id: 'sec1',
20
- type: 'section',
21
- settings: { label: 'Hero From Template' },
22
- children: [],
23
- },
24
- ],
25
- }
26
-
27
- beforeEach(() => {
28
- cmsApi.mockReset()
29
- cmsApi.mockImplementation(async (endpoint: string) => {
30
- if (endpoint === '/page-templates/tpl-1') {
31
- return { data: { id: 'tpl-1', name: 'Landing', tree: TEMPLATE_TREE }, status: 200 }
32
- }
33
- return { data: {}, status: 200 }
34
- })
35
- })
36
-
37
- afterEach(cleanup)
38
-
39
- describe('PageBuilder template seeding (/page-builder/new?template=)', () => {
40
- it('fetches the template and seeds the canvas tree for a new page', async () => {
41
- render(
42
- <PageBuilder templateId="tpl-1" collectionSlug="pages" config={{}} onNavigate={() => {}} />,
43
- )
44
-
45
- await waitFor(() => expect(cmsApi).toHaveBeenCalledWith('/page-templates/tpl-1'))
46
- // replaceTree marks the builder dirty — the unsaved-changes dot is the
47
- // observable proof the template tree was seeded into the canvas state.
48
- expect(await screen.findByTitle('Unsaved changes')).toBeTruthy()
49
- })
50
-
51
- it('starts from a blank, clean tree when no template id is given', async () => {
52
- render(<PageBuilder collectionSlug="pages" config={{}} onNavigate={() => {}} />)
53
-
54
- await waitFor(() =>
55
- expect(cmsApi).not.toHaveBeenCalledWith(expect.stringContaining('/page-templates/')),
56
- )
57
- expect(screen.queryByTitle('Unsaved changes')).toBeNull()
58
- })
59
- })