@prenta/admin 0.98.0 → 1.0.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 (270) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/AdminRoot.d.ts.map +1 -1
  3. package/dist/AdminRoot.js +17 -28
  4. package/dist/AdminRoot.js.map +1 -1
  5. package/dist/__tests__/components/seo-score-bands.test.js +0 -10
  6. package/dist/__tests__/components/seo-score-bands.test.js.map +1 -1
  7. package/dist/__tests__/layout/sidebar-posts.test.js +6 -11
  8. package/dist/__tests__/layout/sidebar-posts.test.js.map +1 -1
  9. package/dist/__tests__/layout/sidebar-submenu.render.test.js +3 -2
  10. package/dist/__tests__/layout/sidebar-submenu.render.test.js.map +1 -1
  11. package/dist/__tests__/lib/page-audit-input.test.js +77 -1
  12. package/dist/__tests__/lib/page-audit-input.test.js.map +1 -1
  13. package/dist/__tests__/lib/page-editor-service-api.test.js +26 -23
  14. package/dist/__tests__/lib/page-editor-service-api.test.js.map +1 -1
  15. package/dist/__tests__/views/page-section-editor.test.js +0 -1
  16. package/dist/__tests__/views/page-section-editor.test.js.map +1 -1
  17. package/dist/__tests__/views/page-tab.render.test.js +0 -1
  18. package/dist/__tests__/views/page-tab.render.test.js.map +1 -1
  19. package/dist/index.d.ts +1 -4
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +1 -3
  22. package/dist/index.js.map +1 -1
  23. package/dist/layout/Sidebar.d.ts +3 -4
  24. package/dist/layout/Sidebar.d.ts.map +1 -1
  25. package/dist/layout/Sidebar.js +7 -38
  26. package/dist/layout/Sidebar.js.map +1 -1
  27. package/dist/lib/page-audit-input.d.ts +14 -1
  28. package/dist/lib/page-audit-input.d.ts.map +1 -1
  29. package/dist/lib/page-audit-input.js +19 -0
  30. package/dist/lib/page-audit-input.js.map +1 -1
  31. package/dist/lib/page-editor-service.d.ts +0 -7
  32. package/dist/lib/page-editor-service.d.ts.map +1 -1
  33. package/dist/lib/page-editor-service.js +9 -9
  34. package/dist/lib/page-editor-service.js.map +1 -1
  35. package/dist/prenta-admin.css +1 -1
  36. package/dist/views/PageEditor.d.ts +2 -2
  37. package/dist/views/PageEditor.js +2 -2
  38. package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
  39. package/dist/views/page-editor/PageSectionEditor.js +9 -15
  40. package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
  41. package/package.json +4 -4
  42. package/src/AdminRoot.tsx +18 -68
  43. package/src/__tests__/components/seo-score-bands.test.ts +0 -10
  44. package/src/__tests__/layout/sidebar-posts.test.ts +6 -11
  45. package/src/__tests__/layout/sidebar-submenu.render.test.tsx +3 -2
  46. package/src/__tests__/lib/page-audit-input.test.ts +91 -1
  47. package/src/__tests__/lib/page-editor-service-api.test.ts +27 -25
  48. package/src/__tests__/views/page-section-editor.test.tsx +0 -1
  49. package/src/__tests__/views/page-tab.render.test.tsx +0 -1
  50. package/src/index.ts +1 -11
  51. package/src/layout/Sidebar.tsx +6 -41
  52. package/src/lib/page-audit-input.ts +36 -1
  53. package/src/lib/page-editor-service.ts +9 -16
  54. package/src/views/PageEditor.tsx +2 -2
  55. package/src/views/page-editor/PageSectionEditor.tsx +8 -37
  56. package/dist/__tests__/views/page-builder-block-renderer.render.test.d.ts +0 -2
  57. package/dist/__tests__/views/page-builder-block-renderer.render.test.d.ts.map +0 -1
  58. package/dist/__tests__/views/page-builder-block-renderer.render.test.js +0 -48
  59. package/dist/__tests__/views/page-builder-block-renderer.render.test.js.map +0 -1
  60. package/dist/__tests__/views/page-builder-form-picker.render.test.d.ts +0 -2
  61. package/dist/__tests__/views/page-builder-form-picker.render.test.d.ts.map +0 -1
  62. package/dist/__tests__/views/page-builder-form-picker.render.test.js +0 -44
  63. package/dist/__tests__/views/page-builder-form-picker.render.test.js.map +0 -1
  64. package/dist/__tests__/views/page-builder-sections-panel.render.test.d.ts +0 -2
  65. package/dist/__tests__/views/page-builder-sections-panel.render.test.d.ts.map +0 -1
  66. package/dist/__tests__/views/page-builder-sections-panel.render.test.js +0 -121
  67. package/dist/__tests__/views/page-builder-sections-panel.render.test.js.map +0 -1
  68. package/dist/__tests__/views/page-builder-template-seed.render.test.d.ts +0 -2
  69. package/dist/__tests__/views/page-builder-template-seed.render.test.d.ts.map +0 -1
  70. package/dist/__tests__/views/page-builder-template-seed.render.test.js +0 -48
  71. package/dist/__tests__/views/page-builder-template-seed.render.test.js.map +0 -1
  72. package/dist/__tests__/views/page-templates.render.test.d.ts +0 -2
  73. package/dist/__tests__/views/page-templates.render.test.d.ts.map +0 -1
  74. package/dist/__tests__/views/page-templates.render.test.js +0 -126
  75. package/dist/__tests__/views/page-templates.render.test.js.map +0 -1
  76. package/dist/hooks/useBuilderState.d.ts +0 -49
  77. package/dist/hooks/useBuilderState.d.ts.map +0 -1
  78. package/dist/hooks/useBuilderState.js +0 -238
  79. package/dist/hooks/useBuilderState.js.map +0 -1
  80. package/dist/views/page-builder/AIBlockAssist.d.ts +0 -9
  81. package/dist/views/page-builder/AIBlockAssist.d.ts.map +0 -1
  82. package/dist/views/page-builder/AIBlockAssist.js +0 -40
  83. package/dist/views/page-builder/AIBlockAssist.js.map +0 -1
  84. package/dist/views/page-builder/AIGenerateDialog.d.ts +0 -8
  85. package/dist/views/page-builder/AIGenerateDialog.d.ts.map +0 -1
  86. package/dist/views/page-builder/AIGenerateDialog.js +0 -173
  87. package/dist/views/page-builder/AIGenerateDialog.js.map +0 -1
  88. package/dist/views/page-builder/BlockEditor.d.ts +0 -11
  89. package/dist/views/page-builder/BlockEditor.d.ts.map +0 -1
  90. package/dist/views/page-builder/BlockEditor.js +0 -159
  91. package/dist/views/page-builder/BlockEditor.js.map +0 -1
  92. package/dist/views/page-builder/BlockPicker.d.ts +0 -7
  93. package/dist/views/page-builder/BlockPicker.d.ts.map +0 -1
  94. package/dist/views/page-builder/BlockPicker.js +0 -103
  95. package/dist/views/page-builder/BlockPicker.js.map +0 -1
  96. package/dist/views/page-builder/BottomBar.d.ts +0 -9
  97. package/dist/views/page-builder/BottomBar.d.ts.map +0 -1
  98. package/dist/views/page-builder/BottomBar.js +0 -13
  99. package/dist/views/page-builder/BottomBar.js.map +0 -1
  100. package/dist/views/page-builder/BuilderSectionsPanel.d.ts +0 -20
  101. package/dist/views/page-builder/BuilderSectionsPanel.d.ts.map +0 -1
  102. package/dist/views/page-builder/BuilderSectionsPanel.js +0 -105
  103. package/dist/views/page-builder/BuilderSectionsPanel.js.map +0 -1
  104. package/dist/views/page-builder/BuilderToolbar.d.ts +0 -21
  105. package/dist/views/page-builder/BuilderToolbar.d.ts.map +0 -1
  106. package/dist/views/page-builder/BuilderToolbar.js +0 -18
  107. package/dist/views/page-builder/BuilderToolbar.js.map +0 -1
  108. package/dist/views/page-builder/ContextPanel.d.ts +0 -20
  109. package/dist/views/page-builder/ContextPanel.d.ts.map +0 -1
  110. package/dist/views/page-builder/ContextPanel.js +0 -43
  111. package/dist/views/page-builder/ContextPanel.js.map +0 -1
  112. package/dist/views/page-builder/DesignScore.d.ts +0 -6
  113. package/dist/views/page-builder/DesignScore.d.ts.map +0 -1
  114. package/dist/views/page-builder/DesignScore.js +0 -93
  115. package/dist/views/page-builder/DesignScore.js.map +0 -1
  116. package/dist/views/page-builder/NodeSettings.d.ts +0 -12
  117. package/dist/views/page-builder/NodeSettings.d.ts.map +0 -1
  118. package/dist/views/page-builder/NodeSettings.js +0 -80
  119. package/dist/views/page-builder/NodeSettings.js.map +0 -1
  120. package/dist/views/page-builder/PageBuilder.d.ts +0 -10
  121. package/dist/views/page-builder/PageBuilder.d.ts.map +0 -1
  122. package/dist/views/page-builder/PageBuilder.js +0 -222
  123. package/dist/views/page-builder/PageBuilder.js.map +0 -1
  124. package/dist/views/page-builder/PageSettings.d.ts +0 -7
  125. package/dist/views/page-builder/PageSettings.d.ts.map +0 -1
  126. package/dist/views/page-builder/PageSettings.js +0 -27
  127. package/dist/views/page-builder/PageSettings.js.map +0 -1
  128. package/dist/views/page-builder/PageTemplates.d.ts +0 -5
  129. package/dist/views/page-builder/PageTemplates.d.ts.map +0 -1
  130. package/dist/views/page-builder/PageTemplates.js +0 -146
  131. package/dist/views/page-builder/PageTemplates.js.map +0 -1
  132. package/dist/views/page-builder/RelationshipField.d.ts +0 -15
  133. package/dist/views/page-builder/RelationshipField.d.ts.map +0 -1
  134. package/dist/views/page-builder/RelationshipField.js +0 -65
  135. package/dist/views/page-builder/RelationshipField.js.map +0 -1
  136. package/dist/views/page-builder/SEOPanel.d.ts +0 -10
  137. package/dist/views/page-builder/SEOPanel.d.ts.map +0 -1
  138. package/dist/views/page-builder/SEOPanel.js +0 -103
  139. package/dist/views/page-builder/SEOPanel.js.map +0 -1
  140. package/dist/views/page-builder/SavedSections.d.ts +0 -6
  141. package/dist/views/page-builder/SavedSections.d.ts.map +0 -1
  142. package/dist/views/page-builder/SavedSections.js +0 -141
  143. package/dist/views/page-builder/SavedSections.js.map +0 -1
  144. package/dist/views/page-builder/TemplatePicker.d.ts +0 -7
  145. package/dist/views/page-builder/TemplatePicker.d.ts.map +0 -1
  146. package/dist/views/page-builder/TemplatePicker.js +0 -68
  147. package/dist/views/page-builder/TemplatePicker.js.map +0 -1
  148. package/dist/views/page-builder/Widgets.d.ts +0 -13
  149. package/dist/views/page-builder/Widgets.d.ts.map +0 -1
  150. package/dist/views/page-builder/Widgets.js +0 -15
  151. package/dist/views/page-builder/Widgets.js.map +0 -1
  152. package/dist/views/page-builder/block-renderers/CTAPreview.d.ts +0 -3
  153. package/dist/views/page-builder/block-renderers/CTAPreview.d.ts.map +0 -1
  154. package/dist/views/page-builder/block-renderers/CTAPreview.js +0 -19
  155. package/dist/views/page-builder/block-renderers/CTAPreview.js.map +0 -1
  156. package/dist/views/page-builder/block-renderers/CardsPreview.d.ts +0 -3
  157. package/dist/views/page-builder/block-renderers/CardsPreview.d.ts.map +0 -1
  158. package/dist/views/page-builder/block-renderers/CardsPreview.js +0 -22
  159. package/dist/views/page-builder/block-renderers/CardsPreview.js.map +0 -1
  160. package/dist/views/page-builder/block-renderers/CodePreview.d.ts +0 -3
  161. package/dist/views/page-builder/block-renderers/CodePreview.d.ts.map +0 -1
  162. package/dist/views/page-builder/block-renderers/CodePreview.js +0 -12
  163. package/dist/views/page-builder/block-renderers/CodePreview.js.map +0 -1
  164. package/dist/views/page-builder/block-renderers/FAQPreview.d.ts +0 -3
  165. package/dist/views/page-builder/block-renderers/FAQPreview.d.ts.map +0 -1
  166. package/dist/views/page-builder/block-renderers/FAQPreview.js +0 -27
  167. package/dist/views/page-builder/block-renderers/FAQPreview.js.map +0 -1
  168. package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts +0 -6
  169. package/dist/views/page-builder/block-renderers/FallbackPreview.d.ts.map +0 -1
  170. package/dist/views/page-builder/block-renderers/FallbackPreview.js +0 -7
  171. package/dist/views/page-builder/block-renderers/FallbackPreview.js.map +0 -1
  172. package/dist/views/page-builder/block-renderers/FormPreview.d.ts +0 -9
  173. package/dist/views/page-builder/block-renderers/FormPreview.d.ts.map +0 -1
  174. package/dist/views/page-builder/block-renderers/FormPreview.js +0 -52
  175. package/dist/views/page-builder/block-renderers/FormPreview.js.map +0 -1
  176. package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts +0 -3
  177. package/dist/views/page-builder/block-renderers/GalleryPreview.d.ts.map +0 -1
  178. package/dist/views/page-builder/block-renderers/GalleryPreview.js +0 -19
  179. package/dist/views/page-builder/block-renderers/GalleryPreview.js.map +0 -1
  180. package/dist/views/page-builder/block-renderers/HeroPreview.d.ts +0 -3
  181. package/dist/views/page-builder/block-renderers/HeroPreview.d.ts.map +0 -1
  182. package/dist/views/page-builder/block-renderers/HeroPreview.js +0 -19
  183. package/dist/views/page-builder/block-renderers/HeroPreview.js.map +0 -1
  184. package/dist/views/page-builder/block-renderers/ImagePreview.d.ts +0 -3
  185. package/dist/views/page-builder/block-renderers/ImagePreview.d.ts.map +0 -1
  186. package/dist/views/page-builder/block-renderers/ImagePreview.js +0 -17
  187. package/dist/views/page-builder/block-renderers/ImagePreview.js.map +0 -1
  188. package/dist/views/page-builder/block-renderers/TextPreview.d.ts +0 -3
  189. package/dist/views/page-builder/block-renderers/TextPreview.d.ts.map +0 -1
  190. package/dist/views/page-builder/block-renderers/TextPreview.js +0 -22
  191. package/dist/views/page-builder/block-renderers/TextPreview.js.map +0 -1
  192. package/dist/views/page-builder/block-renderers/VideoPreview.d.ts +0 -3
  193. package/dist/views/page-builder/block-renderers/VideoPreview.d.ts.map +0 -1
  194. package/dist/views/page-builder/block-renderers/VideoPreview.js +0 -18
  195. package/dist/views/page-builder/block-renderers/VideoPreview.js.map +0 -1
  196. package/dist/views/page-builder/block-renderers/index.d.ts +0 -9
  197. package/dist/views/page-builder/block-renderers/index.d.ts.map +0 -1
  198. package/dist/views/page-builder/block-renderers/index.js +0 -25
  199. package/dist/views/page-builder/block-renderers/index.js.map +0 -1
  200. package/dist/views/page-builder/canvas/BlockRenderer.d.ts +0 -8
  201. package/dist/views/page-builder/canvas/BlockRenderer.d.ts.map +0 -1
  202. package/dist/views/page-builder/canvas/BlockRenderer.js +0 -20
  203. package/dist/views/page-builder/canvas/BlockRenderer.js.map +0 -1
  204. package/dist/views/page-builder/canvas/BuilderCanvas.d.ts +0 -10
  205. package/dist/views/page-builder/canvas/BuilderCanvas.d.ts.map +0 -1
  206. package/dist/views/page-builder/canvas/BuilderCanvas.js +0 -26
  207. package/dist/views/page-builder/canvas/BuilderCanvas.js.map +0 -1
  208. package/dist/views/page-builder/canvas/ColumnRenderer.d.ts +0 -8
  209. package/dist/views/page-builder/canvas/ColumnRenderer.d.ts.map +0 -1
  210. package/dist/views/page-builder/canvas/ColumnRenderer.js +0 -32
  211. package/dist/views/page-builder/canvas/ColumnRenderer.js.map +0 -1
  212. package/dist/views/page-builder/canvas/ContainerRenderer.d.ts +0 -8
  213. package/dist/views/page-builder/canvas/ContainerRenderer.d.ts.map +0 -1
  214. package/dist/views/page-builder/canvas/ContainerRenderer.js +0 -29
  215. package/dist/views/page-builder/canvas/ContainerRenderer.js.map +0 -1
  216. package/dist/views/page-builder/canvas/RowRenderer.d.ts +0 -8
  217. package/dist/views/page-builder/canvas/RowRenderer.d.ts.map +0 -1
  218. package/dist/views/page-builder/canvas/RowRenderer.js +0 -28
  219. package/dist/views/page-builder/canvas/RowRenderer.js.map +0 -1
  220. package/dist/views/page-builder/canvas/SectionRenderer.d.ts +0 -8
  221. package/dist/views/page-builder/canvas/SectionRenderer.d.ts.map +0 -1
  222. package/dist/views/page-builder/canvas/SectionRenderer.js +0 -50
  223. package/dist/views/page-builder/canvas/SectionRenderer.js.map +0 -1
  224. package/dist/views/page-builder/canvas/index.d.ts +0 -3
  225. package/dist/views/page-builder/canvas/index.d.ts.map +0 -1
  226. package/dist/views/page-builder/canvas/index.js +0 -2
  227. package/dist/views/page-builder/canvas/index.js.map +0 -1
  228. package/src/__tests__/views/page-builder-block-renderer.render.test.tsx +0 -66
  229. package/src/__tests__/views/page-builder-form-picker.render.test.tsx +0 -54
  230. package/src/__tests__/views/page-builder-sections-panel.render.test.tsx +0 -138
  231. package/src/__tests__/views/page-builder-template-seed.render.test.tsx +0 -59
  232. package/src/__tests__/views/page-templates.render.test.tsx +0 -182
  233. package/src/hooks/useBuilderState.ts +0 -361
  234. package/src/views/page-builder/AIBlockAssist.tsx +0 -64
  235. package/src/views/page-builder/AIGenerateDialog.tsx +0 -593
  236. package/src/views/page-builder/BlockEditor.tsx +0 -523
  237. package/src/views/page-builder/BlockPicker.tsx +0 -324
  238. package/src/views/page-builder/BottomBar.tsx +0 -65
  239. package/src/views/page-builder/BuilderSectionsPanel.tsx +0 -304
  240. package/src/views/page-builder/BuilderToolbar.tsx +0 -221
  241. package/src/views/page-builder/ContextPanel.tsx +0 -145
  242. package/src/views/page-builder/DesignScore.tsx +0 -251
  243. package/src/views/page-builder/NodeSettings.tsx +0 -500
  244. package/src/views/page-builder/PageBuilder.tsx +0 -405
  245. package/src/views/page-builder/PageSettings.tsx +0 -162
  246. package/src/views/page-builder/PageTemplates.tsx +0 -435
  247. package/src/views/page-builder/RelationshipField.tsx +0 -113
  248. package/src/views/page-builder/SEOPanel.tsx +0 -464
  249. package/src/views/page-builder/SavedSections.tsx +0 -480
  250. package/src/views/page-builder/TemplatePicker.tsx +0 -197
  251. package/src/views/page-builder/Widgets.tsx +0 -44
  252. package/src/views/page-builder/block-renderers/CTAPreview.tsx +0 -79
  253. package/src/views/page-builder/block-renderers/CardsPreview.tsx +0 -69
  254. package/src/views/page-builder/block-renderers/CodePreview.tsx +0 -46
  255. package/src/views/page-builder/block-renderers/FAQPreview.tsx +0 -87
  256. package/src/views/page-builder/block-renderers/FallbackPreview.tsx +0 -18
  257. package/src/views/page-builder/block-renderers/FormPreview.tsx +0 -117
  258. package/src/views/page-builder/block-renderers/GalleryPreview.tsx +0 -87
  259. package/src/views/page-builder/block-renderers/HeroPreview.tsx +0 -90
  260. package/src/views/page-builder/block-renderers/ImagePreview.tsx +0 -54
  261. package/src/views/page-builder/block-renderers/TextPreview.tsx +0 -81
  262. package/src/views/page-builder/block-renderers/VideoPreview.tsx +0 -73
  263. package/src/views/page-builder/block-renderers/index.ts +0 -34
  264. package/src/views/page-builder/canvas/BlockRenderer.tsx +0 -56
  265. package/src/views/page-builder/canvas/BuilderCanvas.tsx +0 -87
  266. package/src/views/page-builder/canvas/ColumnRenderer.tsx +0 -82
  267. package/src/views/page-builder/canvas/ContainerRenderer.tsx +0 -67
  268. package/src/views/page-builder/canvas/RowRenderer.tsx +0 -68
  269. package/src/views/page-builder/canvas/SectionRenderer.tsx +0 -93
  270. package/src/views/page-builder/canvas/index.ts +0 -2
@@ -98,7 +98,6 @@ function loadedPage(sections: Array<{ id: string; sectionType: string; name: str
98
98
  seoDescription: '',
99
99
  publishedAt: null,
100
100
  updatedAt: null,
101
- builderOwned: false,
102
101
  }
103
102
  }
104
103
 
@@ -21,7 +21,6 @@ const page: EditorPage = {
21
21
  scheduledUnpublishAt: null,
22
22
  authorName: '',
23
23
  authorId: '',
24
- builderOwned: false,
25
24
  }
26
25
 
27
26
  function renderTab(
package/src/index.ts CHANGED
@@ -52,7 +52,7 @@ export type {
52
52
  export { Dashboard } from './views/Dashboard.js'
53
53
  /** @deprecated Superseded by `PagesListView` routing in `AdminRoot`; will be removed in the next major. */
54
54
  export { Pages } from './views/Pages.js'
55
- /** @deprecated Superseded by the visual page builder (`PageBuilder`); will be removed in the next major. */
55
+ /** @deprecated Superseded by `PageSectionEditor`; will be removed in the next major. */
56
56
  export { PageEditor } from './views/PageEditor.js'
57
57
  export { MediaBrowser } from './views/MediaBrowser.js'
58
58
  export { Forms } from './views/Forms.js'
@@ -78,16 +78,6 @@ export type { ResetPasswordProps } from './views/ResetPassword.js'
78
78
  export { CollectionList } from './views/CollectionList.js'
79
79
  export { DocumentEdit } from './views/DocumentEdit.js'
80
80
 
81
- export { PageBuilder } from './views/page-builder/PageBuilder.js'
82
- export { useBuilderState } from './hooks/useBuilderState.js'
83
- export type {
84
- BuilderState,
85
- BuilderActions,
86
- DeviceMode,
87
- PanelTab,
88
- PageSettings as BuilderPageSettings,
89
- } from './hooks/useBuilderState.js'
90
-
91
81
  export { Breadcrumbs } from './components/Breadcrumbs.js'
92
82
  export { CommandPalette } from './components/CommandPalette.js'
93
83
  export { ErrorBoundary } from './components/ErrorBoundary.js'
@@ -26,9 +26,7 @@ import {
26
26
  PanelTop,
27
27
  PanelBottom,
28
28
  Layers,
29
- LayoutGrid,
30
29
  Code2,
31
- Library,
32
30
  ListTree,
33
31
  Menu as MenuIcon,
34
32
  PanelLeftClose,
@@ -194,37 +192,16 @@ const POSTS_CHILDREN: NavItem[] = [
194
192
  { path: '/posts/types', label: 'Post Types', icon: Layers },
195
193
  ]
196
194
 
197
- /**
198
- * Children of the Templates parent. Templates is its own top-level item
199
- * (page building tools) — Saved Sections are reusable content blocks and
200
- * Widgets are embeddable components. These are deliberately NOT children
201
- * of Pages: Pages is content, Templates/Sections/Widgets are structure.
202
- */
203
- const TEMPLATES_CHILDREN: NavItem[] = [
204
- { path: '/saved-sections', label: 'Saved Sections', icon: Library },
205
- { path: '/widgets', label: 'Widgets', icon: LayoutGrid },
206
- ]
207
-
208
195
  /**
209
196
  * Nav tree for the default (config-less) install. Dashboard sits on its
210
197
  * own at the top, then a CONTENT group holding Pages (no children) above
211
- * Posts (with All Posts + Post Types) and Templates (with Saved Sections
212
- * + Widgets), followed by Media / Forms / SEO / Script Tags, then a
213
- * SETTINGS group (Users / API Keys / Settings). The group ordering is
214
- * meaningful — the renderer emits a section header the first time it
215
- * sees a new group, so "CONTENT" renders once, above Pages.
198
+ * Posts (with All Posts + Post Types), followed by Media / Forms / SEO /
199
+ * Script Tags, then a SETTINGS group (Users / API Keys / Settings).
216
200
  */
217
201
  const defaultNavItems: NavItem[] = [
218
202
  { path: '/', label: 'Dashboard', icon: LayoutDashboard },
219
203
  { path: '/pages', label: 'Pages', icon: File, group: 'Content' },
220
204
  { path: '/posts', label: 'Posts', icon: FileText, group: 'Content', children: POSTS_CHILDREN },
221
- {
222
- path: '/page-templates',
223
- label: 'Templates',
224
- icon: Layers,
225
- group: 'Content',
226
- children: TEMPLATES_CHILDREN,
227
- },
228
205
  { path: '/media', label: 'Media', icon: Image, group: 'Content' },
229
206
  { path: '/forms', label: 'Forms', icon: ClipboardList, group: 'Content' },
230
207
  { path: '/seo', label: 'SEO', icon: SearchIcon, group: 'Content' },
@@ -773,10 +750,9 @@ export interface NavItem {
773
750
  /**
774
751
  * Build the sidebar nav tree from the CMS config. If no collections are
775
752
  * configured, returns the curated `defaultNavItems` tree. When
776
- * collections ARE configured, page-type collections inherit the
777
- * Pages / Saved Sections / Templates child block, and every static
778
- * destination (Media, Forms, SEO, Script Tags, Users, API Keys,
779
- * Settings) is anchored under the right Content / Settings group.
753
+ * collections ARE configured, page-type collections render as Content
754
+ * entries, and every static destination (Media, Forms, SEO, Script Tags,
755
+ * Users, API Keys, Settings) is anchored under the right group.
780
756
  */
781
757
  export function buildNavItems(config: any): NavItem[] {
782
758
  if (!config?.collections) return defaultNavItems
@@ -817,8 +793,7 @@ export function buildNavItems(config: any): NavItem[] {
817
793
  // Script Tags).
818
794
 
819
795
  // Pages-style collections render as plain Content entries (no nested
820
- // children). Saved Sections / Widgets now live under the dedicated
821
- // Templates parent below, not under Pages.
796
+ // children).
822
797
  pages.forEach((collection) => {
823
798
  items.push({
824
799
  label: collection.labels?.plural ?? collection.slug,
@@ -843,16 +818,6 @@ export function buildNavItems(config: any): NavItem[] {
843
818
  })
844
819
  }
845
820
 
846
- // Templates — its own parent holding Saved Sections + Widgets (page
847
- // building structure, distinct from Pages content).
848
- items.push({
849
- path: '/page-templates',
850
- label: 'Templates',
851
- icon: Layers,
852
- group: 'Content',
853
- children: TEMPLATES_CHILDREN,
854
- })
855
-
856
821
  // Standard Content destinations (always present — they map to CMS
857
822
  // features, not collections).
858
823
  items.push(
@@ -1,5 +1,5 @@
1
1
  import { resolveRenderedMetaTitle } from '@prenta/core/client'
2
- import type { PageSection } from '@prenta/core/page-sections'
2
+ import { layoutTreeToSections, type PageSection } from '@prenta/core/page-sections'
3
3
  import type { PageAuditInput } from '@prenta/core/seo/page-audit'
4
4
  import type { SeoContentRecord } from './seo-service.js'
5
5
 
@@ -102,3 +102,38 @@ export function metaFromRecord(record: SeoContentRecord): AuditMetaSource {
102
102
  hasOgImage: Boolean(record.ogImage),
103
103
  }
104
104
  }
105
+
106
+ export interface BuilderAuditSource {
107
+ tree: unknown
108
+ pageSettings: {
109
+ title: string
110
+ slug: string
111
+ metaTitle?: string
112
+ metaDescription?: string
113
+ ogImage?: string
114
+ focusKeyphrase?: string
115
+ schemaType?: string
116
+ }
117
+ }
118
+
119
+ export function buildPageAuditInputFromBuilder({
120
+ tree,
121
+ pageSettings,
122
+ }: BuilderAuditSource): PageAuditInput {
123
+ return buildPageAuditInput({
124
+ sections: layoutTreeToSections(tree),
125
+ meta: {
126
+ metaTitle: pageSettings.metaTitle ?? '',
127
+ metaDescription: pageSettings.metaDescription ?? '',
128
+ focusKeyword: pageSettings.focusKeyphrase ?? '',
129
+ structuredDataType: pageSettings.schemaType ?? '',
130
+ noindex: false,
131
+ nosnippet: false,
132
+ llmsInclude: 'AUTO',
133
+ hasOgImage: Boolean(pageSettings.ogImage),
134
+ },
135
+ slug: pageSettings.slug,
136
+ record: null,
137
+ fallbackTitle: pageSettings.title,
138
+ })
139
+ }
@@ -32,6 +32,8 @@ import {
32
32
  updateSectionMeta,
33
33
  coerceSections as coerceSectionsCore,
34
34
  validateSectionContent,
35
+ isPageBuilderTree,
36
+ layoutTreeToSections,
35
37
  type PageSection,
36
38
  } from '@prenta/core/page-sections'
37
39
  import { validateSlug } from '@prenta/core/client'
@@ -91,13 +93,6 @@ export interface EditorPage {
91
93
  authorName: string
92
94
  /** CMS user behind the byline, when it is one. Empty for generic/guest. */
93
95
  authorId: string
94
- /**
95
- * True when the document was authored in the visual Page Builder (it carries
96
- * a `_layout` tree). Such a page's `sections` are *compiled* from the layout
97
- * on every save (ADR 0002), so the flat editor opens it read-only and points
98
- * the user to the Page Builder instead of silently fighting the next save.
99
- */
100
- builderOwned: boolean
101
96
  }
102
97
 
103
98
  export interface ValidationResult {
@@ -196,20 +191,20 @@ interface DocumentApiRow {
196
191
  scheduledUnpublishAt?: string | null
197
192
  updatedAt: string | null
198
193
  data: Record<string, unknown> | null
199
- /** The page-builder tree, lifted out of `data` onto the wire envelope by the API. */
194
+ /** Lifted leftover page-builder tree from `getDocument` (ADR 0003). */
200
195
  layout?: unknown
201
196
  }
202
197
 
203
- function isPlainObject(v: unknown): v is Record<string, unknown> {
204
- return !!v && typeof v === 'object' && !Array.isArray(v)
198
+ function sectionsFromDocumentRow(doc: DocumentApiRow): PageSection[] {
199
+ const stored = coerceSectionsCore(doc.data?.sections, { onUnknown: 'preserve' })
200
+ if (stored.length > 0) return stored
201
+ if (isPageBuilderTree(doc.layout)) return layoutTreeToSections(doc.layout)
202
+ return stored
205
203
  }
206
204
 
207
205
  function rowToEditorPage(doc: DocumentApiRow): EditorPage {
208
206
  const data = doc.data ?? {}
209
207
  const slug = doc.slug ?? ''
210
- // The API lifts the stored `_layout` onto `doc.layout`, but tolerate either
211
- // shape so ownership detection is robust to response variations.
212
- const builderOwned = isPlainObject(doc.layout) || isPlainObject(data._layout)
213
208
  return {
214
209
  id: doc.id,
215
210
  title: doc.title ?? '',
@@ -220,7 +215,7 @@ function rowToEditorPage(doc: DocumentApiRow): EditorPage {
220
215
  typeof data.parentPageId === 'string' && data.parentPageId ? data.parentPageId : null,
221
216
  // Preserve unknown (externally-managed) sections so the editor can show
222
217
  // them read-only and round-trip them on save instead of dropping them.
223
- sections: coerceSectionsCore(data.sections, { onUnknown: 'preserve' }),
218
+ sections: sectionsFromDocumentRow(doc),
224
219
  seoTitle: typeof data.metaTitle === 'string' ? data.metaTitle : '',
225
220
  seoDescription: typeof data.metaDescription === 'string' ? data.metaDescription : '',
226
221
  publishedAt: doc.publishedAt ?? null,
@@ -229,7 +224,6 @@ function rowToEditorPage(doc: DocumentApiRow): EditorPage {
229
224
  scheduledUnpublishAt: doc.scheduledUnpublishAt ?? null,
230
225
  authorName: typeof data.authorName === 'string' ? data.authorName : '',
231
226
  authorId: typeof data.authorId === 'string' ? data.authorId : '',
232
- builderOwned,
233
227
  }
234
228
  }
235
229
 
@@ -330,6 +324,5 @@ export function emptyPage(parentPageId: string | null = null): EditorPage {
330
324
  scheduledUnpublishAt: null,
331
325
  authorName: '',
332
326
  authorId: '',
333
- builderOwned: false,
334
327
  }
335
328
  }
@@ -13,8 +13,8 @@ export interface PageEditorProps {
13
13
  }
14
14
 
15
15
  /**
16
- * @deprecated Superseded by the visual page builder (`PageBuilder` and the
17
- * `views/page-editor/` section editor); will be removed in the next major.
16
+ * @deprecated Superseded by the section editor (`PageSectionEditor`); will be
17
+ * removed in the next major.
18
18
  */
19
19
  export function PageEditor({ id, onNavigate }: PageEditorProps) {
20
20
  const isNew = !id
@@ -1,7 +1,7 @@
1
1
  'use client'
2
2
 
3
3
  import { useCallback, useEffect, useMemo, useState } from 'react'
4
- import { AlertTriangle, Blocks, Loader2, Lock } from 'lucide-react'
4
+ import { AlertTriangle, Loader2, Lock } from 'lucide-react'
5
5
  import { toast } from 'sonner'
6
6
  import { ConfirmDialog } from '../../components/ui/ConfirmDialog.js'
7
7
  import { useNavigationBlocker } from '../../router/index.js'
@@ -415,25 +415,19 @@ export function PageSectionEditor({
415
415
  )
416
416
 
417
417
  // ─── Edit permission ─────────────────────────────────────────────────
418
- /**
419
- * ADR 0002: a Page-Builder-owned page (it has a `_layout`) compiles its
420
- * sections from the builder layout on every save, so editing them here would
421
- * be overwritten. The server independently refuses such edits with 409.
422
- */
423
- const readOnly = page?.builderOwned ?? false
424
418
  /**
425
419
  * The single gate every writing surface reads.
426
420
  *
427
421
  * Hoisted above the callbacks rather than derived at render time, because
428
422
  * the two that were left behind were the ones that mattered: the site
429
423
  * preview's in-place edit handlers close over `canEdit` (the raw role) and
430
- * so kept accepting edits while a past version was under review and while
431
- * a builder-owned page was supposedly read-only. The iframe is a second
432
- * editing surface, and a lock that only covers the rail is not a lock.
424
+ * so kept accepting edits while a past version was under review. The iframe
425
+ * is a second editing surface, and a lock that only covers the rail is not
426
+ * a lock.
433
427
  */
434
- const effectiveCanEdit = canEdit && !readOnly && !reviewing
428
+ const effectiveCanEdit = canEdit && !reviewing
435
429
  /** Restoring is not editing: it is allowed precisely while reviewing. */
436
- const canRestoreVersion = canEdit && !readOnly
430
+ const canRestoreVersion = canEdit
437
431
 
438
432
  // ─── Load ──────────────────────────────────────────────────────────
439
433
  useEffect(() => {
@@ -911,8 +905,8 @@ export function PageSectionEditor({
911
905
  )
912
906
  }
913
907
 
914
- // `readOnly` / `effectiveCanEdit` / `canRestoreVersion` are computed above,
915
- // with the hooks, so the callbacks defined there share this one gate.
908
+ // `effectiveCanEdit` / `canRestoreVersion` are computed above, with the
909
+ // hooks, so the callbacks defined there share this one gate.
916
910
 
917
911
  // The canvas shows the reviewed snapshot, but `page.sections` stays the
918
912
  // editor's own content throughout — nothing about review mode writes to it.
@@ -982,29 +976,6 @@ export function PageSectionEditor({
982
976
  structuralTypes={structuralTypes}
983
977
  />
984
978
 
985
- {readOnly && (
986
- <div
987
- role="status"
988
- className="border-border bg-accent/40 flex items-center gap-3 border-b px-4 py-2.5"
989
- >
990
- <Blocks className="text-muted-foreground shrink-0" size={16} aria-hidden />
991
- <p className="text-muted-foreground flex-1 text-sm">
992
- This page is built in the{' '}
993
- <span className="text-foreground font-medium">Page Builder</span>. Its sections are
994
- generated from the builder layout and are read-only here.
995
- </p>
996
- {page.id && (
997
- <button
998
- type="button"
999
- onClick={() => guardedNavigate(`/page-builder/${page.id}`)}
1000
- className="bg-primary text-primary-foreground hover:bg-primary/90 shrink-0 rounded-lg px-3 py-1.5 text-sm font-medium transition-colors"
1001
- >
1002
- Open in Page Builder
1003
- </button>
1004
- )}
1005
- </div>
1006
- )}
1007
-
1008
979
  {unmanagedTypes.length > 0 && (
1009
980
  <div
1010
981
  role="status"
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=page-builder-block-renderer.render.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-builder-block-renderer.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-block-renderer.render.test.tsx"],"names":[],"mappings":""}
@@ -1,48 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- // @vitest-environment happy-dom
3
- import { beforeEach, describe, expect, it, vi } from 'vitest';
4
- import { fireEvent, render, screen, waitFor } from '@testing-library/react';
5
- const cmsApi = vi.fn();
6
- vi.mock('../../lib/api.js', () => ({ cmsApi: (...args) => cmsApi(...args) }));
7
- const { BlockRenderer } = await import('../../views/page-builder/canvas/BlockRenderer.js');
8
- function formNode(over = {}) {
9
- return {
10
- id: 'node-1',
11
- type: 'block',
12
- settings: { blockType: 'form', variant: 'contact' },
13
- data: { formId: 'f1' },
14
- ...over,
15
- };
16
- }
17
- beforeEach(() => {
18
- cmsApi.mockReset();
19
- cmsApi.mockResolvedValue({
20
- data: {
21
- name: 'Contact Us',
22
- fields: [
23
- { key: 'name', label: 'Full Name', type: 'text' },
24
- { key: 'message', label: 'Message', type: 'textarea' },
25
- ],
26
- },
27
- status: 200,
28
- });
29
- });
30
- describe('canvas BlockRenderer', () => {
31
- it('renders the live form preview with the linked form name and fields', async () => {
32
- render(_jsx(BlockRenderer, { node: formNode(), selectedNodeId: null, onSelectNode: vi.fn() }));
33
- await waitFor(() => expect(screen.getByText('Contact Us')).toBeTruthy());
34
- expect(cmsApi).toHaveBeenCalledWith('/forms/f1');
35
- expect(screen.getByText('Full Name')).toBeTruthy();
36
- });
37
- it('selects the node on click', () => {
38
- const onSelectNode = vi.fn();
39
- const { container } = render(_jsx(BlockRenderer, { node: formNode({ data: {} }), selectedNodeId: null, onSelectNode: onSelectNode }));
40
- fireEvent.click(container.querySelector('[data-node-id="node-1"]'));
41
- expect(onSelectNode).toHaveBeenCalledWith('node-1');
42
- });
43
- it('falls back to a placeholder for unknown block types', () => {
44
- render(_jsx(BlockRenderer, { node: formNode({ settings: { blockType: 'widget' }, data: {} }), selectedNodeId: null, onSelectNode: vi.fn() }));
45
- expect(screen.getByText('No preview available')).toBeTruthy();
46
- });
47
- });
48
- //# sourceMappingURL=page-builder-block-renderer.render.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-builder-block-renderer.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-block-renderer.render.test.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=page-builder-form-picker.render.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-builder-form-picker.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-form-picker.render.test.tsx"],"names":[],"mappings":""}
@@ -1,44 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- // @vitest-environment happy-dom
3
- import { beforeEach, describe, expect, it, vi } from 'vitest';
4
- import { fireEvent, render, screen, waitFor } from '@testing-library/react';
5
- const cmsApi = vi.fn();
6
- vi.mock('../../lib/api.js', () => ({ cmsApi: (...args) => cmsApi(...args) }));
7
- const { RelationshipField } = await import('../../views/page-builder/RelationshipField.js');
8
- const formField = {
9
- type: 'relationship',
10
- label: 'Form',
11
- relationTo: 'forms',
12
- };
13
- beforeEach(() => {
14
- cmsApi.mockReset();
15
- });
16
- describe('RelationshipField (form block picker)', () => {
17
- it('loads forms and lets the editor pick one by id', async () => {
18
- cmsApi.mockResolvedValue({
19
- data: [
20
- { id: 'f1', name: 'Contact Us', slug: 'contact-us' },
21
- { id: 'f2', name: 'Event RSVP', slug: 'event-rsvp' },
22
- ],
23
- status: 200,
24
- });
25
- const onChange = vi.fn();
26
- render(_jsx(RelationshipField, { definition: formField, value: "", onChange: onChange, label: "Form" }));
27
- await waitFor(() => expect(screen.getByText('Contact Us')).toBeTruthy());
28
- expect(cmsApi).toHaveBeenCalledWith('/forms');
29
- expect(screen.getByText('Event RSVP')).toBeTruthy();
30
- fireEvent.change(screen.getByLabelText('Form'), { target: { value: 'f2' } });
31
- expect(onChange).toHaveBeenCalledWith('f2');
32
- });
33
- it('shows an empty hint when the collection has no items', async () => {
34
- cmsApi.mockResolvedValue({ data: [], status: 200 });
35
- render(_jsx(RelationshipField, { definition: formField, value: "", onChange: vi.fn(), label: "Form" }));
36
- await waitFor(() => expect(screen.getByText('No forms found.')).toBeTruthy());
37
- });
38
- it('degrades to a plain id input when the collection cannot be loaded', async () => {
39
- cmsApi.mockResolvedValue({ error: 'boom', status: 500 });
40
- render(_jsx(RelationshipField, { definition: formField, value: "f9", onChange: vi.fn(), label: "Form" }));
41
- await waitFor(() => expect(screen.getByPlaceholderText('Enter forms id…').value).toBe('f9'));
42
- });
43
- });
44
- //# sourceMappingURL=page-builder-form-picker.render.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-builder-form-picker.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-form-picker.render.test.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=page-builder-sections-panel.render.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-builder-sections-panel.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-sections-panel.render.test.tsx"],"names":[],"mappings":""}
@@ -1,121 +0,0 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
2
- // @vitest-environment happy-dom
3
- import { beforeEach, describe, expect, it, vi } from 'vitest';
4
- import { fireEvent, render, screen } from '@testing-library/react';
5
- const { BuilderSectionsPanel } = await import('../../views/page-builder/BuilderSectionsPanel.js');
6
- /** Minimal builder tree: a hero section plus an empty, hidden section. */
7
- function makeTree() {
8
- return {
9
- id: 'page1',
10
- type: 'page',
11
- children: [
12
- {
13
- id: 'sec1',
14
- type: 'section',
15
- settings: {},
16
- children: [
17
- {
18
- id: 'cont1',
19
- type: 'container',
20
- settings: {},
21
- children: [
22
- {
23
- id: 'row1',
24
- type: 'row',
25
- settings: {},
26
- children: [
27
- {
28
- id: 'col1',
29
- type: 'column',
30
- settings: { width: 12 },
31
- children: [
32
- {
33
- id: 'blk1',
34
- type: 'block',
35
- settings: { blockType: 'hero', variant: 'centered' },
36
- data: {},
37
- },
38
- ],
39
- },
40
- ],
41
- },
42
- ],
43
- },
44
- ],
45
- },
46
- { id: 'sec2', type: 'section', settings: { visibility: 'hidden' }, children: [] },
47
- ],
48
- };
49
- }
50
- function renderPanel(over = {}) {
51
- const props = {
52
- tree: makeTree(),
53
- selectedNodeId: null,
54
- collapsed: false,
55
- onToggleCollapsed: vi.fn(),
56
- onSelect: vi.fn(),
57
- onReorder: vi.fn(),
58
- onAddSection: vi.fn(),
59
- ...over,
60
- };
61
- render(_jsx(BuilderSectionsPanel, { ...props }));
62
- return props;
63
- }
64
- beforeEach(() => {
65
- vi.clearAllMocks();
66
- });
67
- describe('BuilderSectionsPanel', () => {
68
- it('lists the page sections in order with derived names and block counts', () => {
69
- renderPanel();
70
- // First section is named after its first block's catalog label.
71
- expect(screen.getByText('Hero')).toBeTruthy();
72
- expect(screen.getByText('1 block')).toBeTruthy();
73
- // Empty section falls back to a positional name.
74
- expect(screen.getByText('Section 2')).toBeTruthy();
75
- expect(screen.getByText('Empty section')).toBeTruthy();
76
- // Count chip in the header.
77
- expect(screen.getByText('2')).toBeTruthy();
78
- // Panel is an accessible nav landmark.
79
- expect(screen.getByRole('navigation', { name: 'Page sections' })).toBeTruthy();
80
- });
81
- it('fires the selection callback when a section row is clicked', () => {
82
- const props = renderPanel();
83
- // `/^Hero/` excludes the drag handle ("Drag to reorder Hero").
84
- fireEvent.click(screen.getByRole('button', { name: /^Hero/ }));
85
- expect(props.onSelect).toHaveBeenCalledWith('sec1');
86
- });
87
- it('marks the selected section with aria-current', () => {
88
- renderPanel({ selectedNodeId: 'sec1' });
89
- const row = screen.getByRole('button', { name: /^Hero/ });
90
- expect(row.getAttribute('aria-current')).toBe('true');
91
- });
92
- it('exposes keyboard-accessible drag handles per section', () => {
93
- renderPanel();
94
- expect(screen.getByRole('button', { name: 'Drag to reorder Hero' })).toBeTruthy();
95
- expect(screen.getByRole('button', { name: 'Drag to reorder Section 2' })).toBeTruthy();
96
- });
97
- it('fires the add-section callback from the bottom affordance', () => {
98
- const props = renderPanel();
99
- fireEvent.click(screen.getByRole('button', { name: 'Add Section' }));
100
- expect(props.onAddSection).toHaveBeenCalledTimes(1);
101
- });
102
- it('collapses to a rail with an expand toggle', () => {
103
- const props = renderPanel({ collapsed: true });
104
- // Section rows are gone; only the expand affordance remains.
105
- expect(screen.queryByText('Hero')).toBeNull();
106
- const toggle = screen.getByRole('button', { name: 'Expand sections panel' });
107
- expect(toggle.getAttribute('aria-expanded')).toBe('false');
108
- fireEvent.click(toggle);
109
- expect(props.onToggleCollapsed).toHaveBeenCalledTimes(1);
110
- });
111
- it('shows a collapse toggle with aria-expanded when open', () => {
112
- renderPanel();
113
- const toggle = screen.getByRole('button', { name: 'Collapse sections panel' });
114
- expect(toggle.getAttribute('aria-expanded')).toBe('true');
115
- });
116
- it('shows an empty message when the page has no sections', () => {
117
- renderPanel({ tree: { id: 'page1', type: 'page', children: [] } });
118
- expect(screen.getByText(/No sections yet/)).toBeTruthy();
119
- });
120
- });
121
- //# sourceMappingURL=page-builder-sections-panel.render.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-builder-sections-panel.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-sections-panel.render.test.tsx"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=page-builder-template-seed.render.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"page-builder-template-seed.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/page-builder-template-seed.render.test.tsx"],"names":[],"mappings":""}