@prenta/admin 0.92.0 → 0.94.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 (425) hide show
  1. package/CHANGELOG.md +663 -0
  2. package/design-system/tokens.css +173 -71
  3. package/design-system/tokens.json +244 -63
  4. package/design-system/tokens.scss +203 -98
  5. package/design-system/tokens.tailwind.cjs +93 -38
  6. package/dist/AdminRoot.d.ts +27 -6
  7. package/dist/AdminRoot.d.ts.map +1 -1
  8. package/dist/AdminRoot.js.map +1 -1
  9. package/dist/__tests__/components/breakpoint-controls.render.test.d.ts +2 -0
  10. package/dist/__tests__/components/breakpoint-controls.render.test.d.ts.map +1 -0
  11. package/dist/__tests__/components/breakpoint-controls.render.test.js +51 -0
  12. package/dist/__tests__/components/breakpoint-controls.render.test.js.map +1 -0
  13. package/dist/__tests__/components/canvas-edit-tip.render.test.d.ts +2 -0
  14. package/dist/__tests__/components/canvas-edit-tip.render.test.d.ts.map +1 -0
  15. package/dist/__tests__/components/canvas-edit-tip.render.test.js +37 -0
  16. package/dist/__tests__/components/canvas-edit-tip.render.test.js.map +1 -0
  17. package/dist/__tests__/components/editor-rail.render.test.d.ts +2 -0
  18. package/dist/__tests__/components/editor-rail.render.test.d.ts.map +1 -0
  19. package/dist/__tests__/components/editor-rail.render.test.js +138 -0
  20. package/dist/__tests__/components/editor-rail.render.test.js.map +1 -0
  21. package/dist/__tests__/components/media-block.render.test.d.ts +2 -0
  22. package/dist/__tests__/components/media-block.render.test.d.ts.map +1 -0
  23. package/dist/__tests__/components/media-block.render.test.js +108 -0
  24. package/dist/__tests__/components/media-block.render.test.js.map +1 -0
  25. package/dist/__tests__/components/page-audit-panel.render.test.d.ts +2 -0
  26. package/dist/__tests__/components/page-audit-panel.render.test.d.ts.map +1 -0
  27. package/dist/__tests__/components/page-audit-panel.render.test.js +59 -0
  28. package/dist/__tests__/components/page-audit-panel.render.test.js.map +1 -0
  29. package/dist/__tests__/components/reflow-meter.render.test.d.ts +2 -0
  30. package/dist/__tests__/components/reflow-meter.render.test.d.ts.map +1 -0
  31. package/dist/__tests__/components/reflow-meter.render.test.js +94 -0
  32. package/dist/__tests__/components/reflow-meter.render.test.js.map +1 -0
  33. package/dist/__tests__/components/seo-char-count.test.js +24 -6
  34. package/dist/__tests__/components/seo-char-count.test.js.map +1 -1
  35. package/dist/__tests__/components/serp-preview.render.test.d.ts +2 -0
  36. package/dist/__tests__/components/serp-preview.render.test.d.ts.map +1 -0
  37. package/dist/__tests__/components/serp-preview.render.test.js +25 -0
  38. package/dist/__tests__/components/serp-preview.render.test.js.map +1 -0
  39. package/dist/__tests__/lib/breakpoints.test.d.ts +2 -0
  40. package/dist/__tests__/lib/breakpoints.test.d.ts.map +1 -0
  41. package/dist/__tests__/lib/breakpoints.test.js +67 -0
  42. package/dist/__tests__/lib/breakpoints.test.js.map +1 -0
  43. package/dist/__tests__/lib/canvas-edit-chrome.test.d.ts +2 -0
  44. package/dist/__tests__/lib/canvas-edit-chrome.test.d.ts.map +1 -0
  45. package/dist/__tests__/lib/canvas-edit-chrome.test.js +44 -0
  46. package/dist/__tests__/lib/canvas-edit-chrome.test.js.map +1 -0
  47. package/dist/__tests__/lib/media-format.test.d.ts +2 -0
  48. package/dist/__tests__/lib/media-format.test.d.ts.map +1 -0
  49. package/dist/__tests__/lib/media-format.test.js +70 -0
  50. package/dist/__tests__/lib/media-format.test.js.map +1 -0
  51. package/dist/__tests__/lib/page-audit-input.test.d.ts +2 -0
  52. package/dist/__tests__/lib/page-audit-input.test.d.ts.map +1 -0
  53. package/dist/__tests__/lib/page-audit-input.test.js +122 -0
  54. package/dist/__tests__/lib/page-audit-input.test.js.map +1 -0
  55. package/dist/__tests__/lib/page-editor-service.test.js +2 -0
  56. package/dist/__tests__/lib/page-editor-service.test.js.map +1 -1
  57. package/dist/__tests__/lib/page-redirect.test.d.ts +2 -0
  58. package/dist/__tests__/lib/page-redirect.test.d.ts.map +1 -0
  59. package/dist/__tests__/lib/page-redirect.test.js +26 -0
  60. package/dist/__tests__/lib/page-redirect.test.js.map +1 -0
  61. package/dist/__tests__/lib/rail-width.test.d.ts +2 -0
  62. package/dist/__tests__/lib/rail-width.test.d.ts.map +1 -0
  63. package/dist/__tests__/lib/rail-width.test.js +69 -0
  64. package/dist/__tests__/lib/rail-width.test.js.map +1 -0
  65. package/dist/__tests__/lib/reflow-baseline.test.d.ts +2 -0
  66. package/dist/__tests__/lib/reflow-baseline.test.d.ts.map +1 -0
  67. package/dist/__tests__/lib/reflow-baseline.test.js +56 -0
  68. package/dist/__tests__/lib/reflow-baseline.test.js.map +1 -0
  69. package/dist/__tests__/lib/reflow-probe.test.d.ts +2 -0
  70. package/dist/__tests__/lib/reflow-probe.test.d.ts.map +1 -0
  71. package/dist/__tests__/lib/reflow-probe.test.js +73 -0
  72. package/dist/__tests__/lib/reflow-probe.test.js.map +1 -0
  73. package/dist/__tests__/lib/version-diff.test.d.ts +2 -0
  74. package/dist/__tests__/lib/version-diff.test.d.ts.map +1 -0
  75. package/dist/__tests__/lib/version-diff.test.js +230 -0
  76. package/dist/__tests__/lib/version-diff.test.js.map +1 -0
  77. package/dist/__tests__/lib/version-history.test.d.ts +2 -0
  78. package/dist/__tests__/lib/version-history.test.d.ts.map +1 -0
  79. package/dist/__tests__/lib/version-history.test.js +125 -0
  80. package/dist/__tests__/lib/version-history.test.js.map +1 -0
  81. package/dist/__tests__/styles/canvas-container-queries.test.d.ts +2 -0
  82. package/dist/__tests__/styles/canvas-container-queries.test.d.ts.map +1 -0
  83. package/dist/__tests__/styles/canvas-container-queries.test.js +87 -0
  84. package/dist/__tests__/styles/canvas-container-queries.test.js.map +1 -0
  85. package/dist/__tests__/styles/packaging.test.d.ts +2 -0
  86. package/dist/__tests__/styles/packaging.test.d.ts.map +1 -0
  87. package/dist/__tests__/styles/packaging.test.js +31 -0
  88. package/dist/__tests__/styles/packaging.test.js.map +1 -0
  89. package/dist/__tests__/styles/responsive-layer.test.d.ts +2 -0
  90. package/dist/__tests__/styles/responsive-layer.test.d.ts.map +1 -0
  91. package/dist/__tests__/styles/responsive-layer.test.js +127 -0
  92. package/dist/__tests__/styles/responsive-layer.test.js.map +1 -0
  93. package/dist/__tests__/styles/tokens-drift.test.d.ts +2 -0
  94. package/dist/__tests__/styles/tokens-drift.test.d.ts.map +1 -0
  95. package/dist/__tests__/styles/tokens-drift.test.js +92 -0
  96. package/dist/__tests__/styles/tokens-drift.test.js.map +1 -0
  97. package/dist/__tests__/views/admin-renderer-compat.test.d.ts +2 -0
  98. package/dist/__tests__/views/admin-renderer-compat.test.d.ts.map +1 -0
  99. package/dist/__tests__/views/admin-renderer-compat.test.js +43 -0
  100. package/dist/__tests__/views/admin-renderer-compat.test.js.map +1 -0
  101. package/dist/__tests__/views/admin-section-renderers.test.js +52 -4
  102. package/dist/__tests__/views/admin-section-renderers.test.js.map +1 -1
  103. package/dist/__tests__/views/canvas-review-mode.render.test.d.ts +2 -0
  104. package/dist/__tests__/views/canvas-review-mode.render.test.d.ts.map +1 -0
  105. package/dist/__tests__/views/canvas-review-mode.render.test.js +70 -0
  106. package/dist/__tests__/views/canvas-review-mode.render.test.js.map +1 -0
  107. package/dist/__tests__/views/editor-top-bar.render.test.js +30 -1
  108. package/dist/__tests__/views/editor-top-bar.render.test.js.map +1 -1
  109. package/dist/__tests__/views/page-tab.render.test.d.ts +2 -0
  110. package/dist/__tests__/views/page-tab.render.test.d.ts.map +1 -0
  111. package/dist/__tests__/views/page-tab.render.test.js +151 -0
  112. package/dist/__tests__/views/page-tab.render.test.js.map +1 -0
  113. package/dist/__tests__/views/section-class-parity.test.d.ts +2 -0
  114. package/dist/__tests__/views/section-class-parity.test.d.ts.map +1 -0
  115. package/dist/__tests__/views/section-class-parity.test.js +81 -0
  116. package/dist/__tests__/views/section-class-parity.test.js.map +1 -0
  117. package/dist/__tests__/views/sections-panel-design-owned.render.test.d.ts +2 -0
  118. package/dist/__tests__/views/sections-panel-design-owned.render.test.d.ts.map +1 -0
  119. package/dist/__tests__/views/sections-panel-design-owned.render.test.js +86 -0
  120. package/dist/__tests__/views/sections-panel-design-owned.render.test.js.map +1 -0
  121. package/dist/__tests__/views/version-history-panel.render.test.d.ts +2 -0
  122. package/dist/__tests__/views/version-history-panel.render.test.d.ts.map +1 -0
  123. package/dist/__tests__/views/version-history-panel.render.test.js +153 -0
  124. package/dist/__tests__/views/version-history-panel.render.test.js.map +1 -0
  125. package/dist/components/BreakpointPicker.d.ts +18 -0
  126. package/dist/components/BreakpointPicker.d.ts.map +1 -0
  127. package/dist/components/BreakpointPicker.js +31 -0
  128. package/dist/components/BreakpointPicker.js.map +1 -0
  129. package/dist/components/CanvasEditTip.d.ts +6 -0
  130. package/dist/components/CanvasEditTip.d.ts.map +1 -0
  131. package/dist/components/CanvasEditTip.js +22 -0
  132. package/dist/components/CanvasEditTip.js.map +1 -0
  133. package/dist/components/EditorRail.d.ts +36 -0
  134. package/dist/components/EditorRail.d.ts.map +1 -0
  135. package/dist/components/EditorRail.js +104 -0
  136. package/dist/components/EditorRail.js.map +1 -0
  137. package/dist/components/EditorRailTabs.d.ts +32 -0
  138. package/dist/components/EditorRailTabs.d.ts.map +1 -0
  139. package/dist/components/EditorRailTabs.js +45 -0
  140. package/dist/components/EditorRailTabs.js.map +1 -0
  141. package/dist/components/MediaBlock.d.ts +49 -0
  142. package/dist/components/MediaBlock.d.ts.map +1 -0
  143. package/dist/components/MediaBlock.js +50 -0
  144. package/dist/components/MediaBlock.js.map +1 -0
  145. package/dist/components/ReflowMeter.d.ts +28 -0
  146. package/dist/components/ReflowMeter.d.ts.map +1 -0
  147. package/dist/components/ReflowMeter.js +42 -0
  148. package/dist/components/ReflowMeter.js.map +1 -0
  149. package/dist/components/ZoomChip.d.ts +17 -0
  150. package/dist/components/ZoomChip.d.ts.map +1 -0
  151. package/dist/components/ZoomChip.js +17 -0
  152. package/dist/components/ZoomChip.js.map +1 -0
  153. package/dist/components/breakpoint-icons.d.ts +3 -0
  154. package/dist/components/breakpoint-icons.d.ts.map +1 -0
  155. package/dist/components/breakpoint-icons.js +16 -0
  156. package/dist/components/breakpoint-icons.js.map +1 -0
  157. package/dist/components/page-tab/AuthorPicker.d.ts +31 -0
  158. package/dist/components/page-tab/AuthorPicker.d.ts.map +1 -0
  159. package/dist/components/page-tab/AuthorPicker.js +95 -0
  160. package/dist/components/page-tab/AuthorPicker.js.map +1 -0
  161. package/dist/components/page-tab/DirectiveSwitch.d.ts +38 -0
  162. package/dist/components/page-tab/DirectiveSwitch.d.ts.map +1 -0
  163. package/dist/components/page-tab/DirectiveSwitch.js +33 -0
  164. package/dist/components/page-tab/DirectiveSwitch.js.map +1 -0
  165. package/dist/components/seo/EditorSeoScoreBadge.d.ts +8 -1
  166. package/dist/components/seo/EditorSeoScoreBadge.d.ts.map +1 -1
  167. package/dist/components/seo/EditorSeoScoreBadge.js +2 -2
  168. package/dist/components/seo/EditorSeoScoreBadge.js.map +1 -1
  169. package/dist/components/seo/PageAuditPanel.d.ts +14 -0
  170. package/dist/components/seo/PageAuditPanel.d.ts.map +1 -0
  171. package/dist/components/seo/PageAuditPanel.js +59 -0
  172. package/dist/components/seo/PageAuditPanel.js.map +1 -0
  173. package/dist/components/seo/SeoCharCount.d.ts +19 -7
  174. package/dist/components/seo/SeoCharCount.d.ts.map +1 -1
  175. package/dist/components/seo/SeoCharCount.js +30 -16
  176. package/dist/components/seo/SeoCharCount.js.map +1 -1
  177. package/dist/components/seo/SeoEditorPane.d.ts +15 -1
  178. package/dist/components/seo/SeoEditorPane.d.ts.map +1 -1
  179. package/dist/components/seo/SeoEditorPane.js +118 -21
  180. package/dist/components/seo/SeoEditorPane.js.map +1 -1
  181. package/dist/components/seo/SerpPreview.d.ts +20 -0
  182. package/dist/components/seo/SerpPreview.d.ts.map +1 -0
  183. package/dist/components/seo/SerpPreview.js +6 -0
  184. package/dist/components/seo/SerpPreview.js.map +1 -0
  185. package/dist/hooks/usePageAudit.d.ts +41 -0
  186. package/dist/hooks/usePageAudit.d.ts.map +1 -0
  187. package/dist/hooks/usePageAudit.js +68 -0
  188. package/dist/hooks/usePageAudit.js.map +1 -0
  189. package/dist/hooks/useReflowGuard.d.ts +47 -0
  190. package/dist/hooks/useReflowGuard.d.ts.map +1 -0
  191. package/dist/hooks/useReflowGuard.js +52 -0
  192. package/dist/hooks/useReflowGuard.js.map +1 -0
  193. package/dist/layout/primitives/AdminShell.d.ts.map +1 -1
  194. package/dist/layout/primitives/AdminShell.js +2 -2
  195. package/dist/layout/primitives/AdminShell.js.map +1 -1
  196. package/dist/lib/breakpoints.d.ts +51 -0
  197. package/dist/lib/breakpoints.d.ts.map +1 -0
  198. package/dist/lib/breakpoints.js +84 -0
  199. package/dist/lib/breakpoints.js.map +1 -0
  200. package/dist/lib/canvas-edit-chrome.d.ts +22 -0
  201. package/dist/lib/canvas-edit-chrome.d.ts.map +1 -0
  202. package/dist/lib/canvas-edit-chrome.js +81 -0
  203. package/dist/lib/canvas-edit-chrome.js.map +1 -0
  204. package/dist/lib/media-format.d.ts +55 -0
  205. package/dist/lib/media-format.d.ts.map +1 -0
  206. package/dist/lib/media-format.js +93 -0
  207. package/dist/lib/media-format.js.map +1 -0
  208. package/dist/lib/page-audit-input.d.ts +45 -0
  209. package/dist/lib/page-audit-input.d.ts.map +1 -0
  210. package/dist/lib/page-audit-input.js +53 -0
  211. package/dist/lib/page-audit-input.js.map +1 -0
  212. package/dist/lib/page-editor-service.d.ts +12 -0
  213. package/dist/lib/page-editor-service.d.ts.map +1 -1
  214. package/dist/lib/page-editor-service.js +6 -0
  215. package/dist/lib/page-editor-service.js.map +1 -1
  216. package/dist/lib/page-redirect.d.ts +39 -0
  217. package/dist/lib/page-redirect.d.ts.map +1 -0
  218. package/dist/lib/page-redirect.js +38 -0
  219. package/dist/lib/page-redirect.js.map +1 -0
  220. package/dist/lib/rail-width.d.ts +23 -0
  221. package/dist/lib/rail-width.d.ts.map +1 -0
  222. package/dist/lib/rail-width.js +59 -0
  223. package/dist/lib/rail-width.js.map +1 -0
  224. package/dist/lib/reflow-baseline.d.ts +45 -0
  225. package/dist/lib/reflow-baseline.d.ts.map +1 -0
  226. package/dist/lib/reflow-baseline.js +38 -0
  227. package/dist/lib/reflow-baseline.js.map +1 -0
  228. package/dist/lib/reflow-probe.d.ts +159 -0
  229. package/dist/lib/reflow-probe.d.ts.map +1 -0
  230. package/dist/lib/reflow-probe.js +228 -0
  231. package/dist/lib/reflow-probe.js.map +1 -0
  232. package/dist/lib/seo-service.d.ts +10 -0
  233. package/dist/lib/seo-service.d.ts.map +1 -1
  234. package/dist/lib/seo-service.js.map +1 -1
  235. package/dist/lib/version-diff.d.ts +50 -0
  236. package/dist/lib/version-diff.d.ts.map +1 -0
  237. package/dist/lib/version-diff.js +294 -0
  238. package/dist/lib/version-diff.js.map +1 -0
  239. package/dist/lib/version-history.d.ts +73 -0
  240. package/dist/lib/version-history.d.ts.map +1 -0
  241. package/dist/lib/version-history.js +126 -0
  242. package/dist/lib/version-history.js.map +1 -0
  243. package/dist/prenta-admin.css +1 -1
  244. package/dist/views/page-editor/CanvasMetaLine.d.ts +19 -0
  245. package/dist/views/page-editor/CanvasMetaLine.d.ts.map +1 -0
  246. package/dist/views/page-editor/CanvasMetaLine.js +23 -0
  247. package/dist/views/page-editor/CanvasMetaLine.js.map +1 -0
  248. package/dist/views/page-editor/EditorCanvas.d.ts +47 -8
  249. package/dist/views/page-editor/EditorCanvas.d.ts.map +1 -1
  250. package/dist/views/page-editor/EditorCanvas.js +68 -34
  251. package/dist/views/page-editor/EditorCanvas.js.map +1 -1
  252. package/dist/views/page-editor/EditorTopBar.d.ts +21 -2
  253. package/dist/views/page-editor/EditorTopBar.d.ts.map +1 -1
  254. package/dist/views/page-editor/EditorTopBar.js +13 -20
  255. package/dist/views/page-editor/EditorTopBar.js.map +1 -1
  256. package/dist/views/page-editor/PageSectionEditor.d.ts.map +1 -1
  257. package/dist/views/page-editor/PageSectionEditor.js +383 -78
  258. package/dist/views/page-editor/PageSectionEditor.js.map +1 -1
  259. package/dist/views/page-editor/PageTab.d.ts +36 -0
  260. package/dist/views/page-editor/PageTab.d.ts.map +1 -0
  261. package/dist/views/page-editor/PageTab.js +65 -0
  262. package/dist/views/page-editor/PageTab.js.map +1 -0
  263. package/dist/views/page-editor/ReviewBar.d.ts +21 -0
  264. package/dist/views/page-editor/ReviewBar.d.ts.map +1 -0
  265. package/dist/views/page-editor/ReviewBar.js +22 -0
  266. package/dist/views/page-editor/ReviewBar.js.map +1 -0
  267. package/dist/views/page-editor/SectionInspector.d.ts.map +1 -1
  268. package/dist/views/page-editor/SectionInspector.js +64 -20
  269. package/dist/views/page-editor/SectionInspector.js.map +1 -1
  270. package/dist/views/page-editor/SectionsPanel.d.ts +30 -5
  271. package/dist/views/page-editor/SectionsPanel.d.ts.map +1 -1
  272. package/dist/views/page-editor/SectionsPanel.js +38 -7
  273. package/dist/views/page-editor/SectionsPanel.js.map +1 -1
  274. package/dist/views/page-editor/SitePreviewFrame.d.ts.map +1 -1
  275. package/dist/views/page-editor/SitePreviewFrame.js +3 -0
  276. package/dist/views/page-editor/SitePreviewFrame.js.map +1 -1
  277. package/dist/views/page-editor/VersionHistoryPanel.d.ts +29 -0
  278. package/dist/views/page-editor/VersionHistoryPanel.d.ts.map +1 -0
  279. package/dist/views/page-editor/VersionHistoryPanel.js +81 -0
  280. package/dist/views/page-editor/VersionHistoryPanel.js.map +1 -0
  281. package/dist/views/page-editor/reflow-context.d.ts +28 -0
  282. package/dist/views/page-editor/reflow-context.d.ts.map +1 -0
  283. package/dist/views/page-editor/reflow-context.js +14 -0
  284. package/dist/views/page-editor/reflow-context.js.map +1 -0
  285. package/dist/views/page-editor/sections/ByTheNumbersSection.d.ts.map +1 -1
  286. package/dist/views/page-editor/sections/ByTheNumbersSection.js +1 -1
  287. package/dist/views/page-editor/sections/ByTheNumbersSection.js.map +1 -1
  288. package/dist/views/page-editor/sections/CtaBannerSection.d.ts.map +1 -1
  289. package/dist/views/page-editor/sections/CtaBannerSection.js +1 -1
  290. package/dist/views/page-editor/sections/CtaBannerSection.js.map +1 -1
  291. package/dist/views/page-editor/sections/FeatureHighlightSection.d.ts.map +1 -1
  292. package/dist/views/page-editor/sections/FeatureHighlightSection.js +2 -2
  293. package/dist/views/page-editor/sections/FeatureHighlightSection.js.map +1 -1
  294. package/dist/views/page-editor/sections/GallerySection.d.ts.map +1 -1
  295. package/dist/views/page-editor/sections/GallerySection.js +7 -3
  296. package/dist/views/page-editor/sections/GallerySection.js.map +1 -1
  297. package/dist/views/page-editor/sections/HeroBannerSection.js +1 -1
  298. package/dist/views/page-editor/sections/HeroBannerSection.js.map +1 -1
  299. package/dist/views/page-editor/sections/MissionSection.d.ts.map +1 -1
  300. package/dist/views/page-editor/sections/MissionSection.js +1 -1
  301. package/dist/views/page-editor/sections/MissionSection.js.map +1 -1
  302. package/dist/views/page-editor/sections/PullQuoteSection.d.ts.map +1 -1
  303. package/dist/views/page-editor/sections/PullQuoteSection.js +1 -1
  304. package/dist/views/page-editor/sections/PullQuoteSection.js.map +1 -1
  305. package/dist/views/page-editor/sections/RelatedPostsSection.d.ts.map +1 -1
  306. package/dist/views/page-editor/sections/RelatedPostsSection.js +1 -1
  307. package/dist/views/page-editor/sections/RelatedPostsSection.js.map +1 -1
  308. package/dist/views/page-editor/sections/SectionRenderer.d.ts +13 -1
  309. package/dist/views/page-editor/sections/SectionRenderer.d.ts.map +1 -1
  310. package/dist/views/page-editor/sections/SectionRenderer.js +66 -26
  311. package/dist/views/page-editor/sections/SectionRenderer.js.map +1 -1
  312. package/dist/views/page-editor/sections/admin-renderers.d.ts +47 -15
  313. package/dist/views/page-editor/sections/admin-renderers.d.ts.map +1 -1
  314. package/dist/views/page-editor/sections/admin-renderers.js +27 -15
  315. package/dist/views/page-editor/sections/admin-renderers.js.map +1 -1
  316. package/dist/views/page-editor/sections/parts.d.ts +0 -1
  317. package/dist/views/page-editor/sections/parts.d.ts.map +1 -1
  318. package/dist/views/page-editor/sections/parts.js +41 -16
  319. package/dist/views/page-editor/sections/parts.js.map +1 -1
  320. package/dist/views/page-editor/viewports.d.ts +7 -14
  321. package/dist/views/page-editor/viewports.d.ts.map +1 -1
  322. package/dist/views/page-editor/viewports.js +7 -12
  323. package/dist/views/page-editor/viewports.js.map +1 -1
  324. package/dist/views/post-editor/PostEditorCanvas.d.ts +2 -1
  325. package/dist/views/post-editor/PostEditorCanvas.d.ts.map +1 -1
  326. package/dist/views/post-editor/PostEditorCanvas.js +5 -2
  327. package/dist/views/post-editor/PostEditorCanvas.js.map +1 -1
  328. package/dist/views/post-editor/PostSectionEditor.d.ts.map +1 -1
  329. package/dist/views/post-editor/PostSectionEditor.js +2 -20
  330. package/dist/views/post-editor/PostSectionEditor.js.map +1 -1
  331. package/dist/views/post-editor/PostTemplateEditor.d.ts.map +1 -1
  332. package/dist/views/post-editor/PostTemplateEditor.js +4 -1
  333. package/dist/views/post-editor/PostTemplateEditor.js.map +1 -1
  334. package/package.json +5 -3
  335. package/src/AdminRoot.tsx +27 -6
  336. package/src/__tests__/components/breakpoint-controls.render.test.tsx +57 -0
  337. package/src/__tests__/components/canvas-edit-tip.render.test.tsx +41 -0
  338. package/src/__tests__/components/editor-rail.render.test.tsx +192 -0
  339. package/src/__tests__/components/media-block.render.test.tsx +126 -0
  340. package/src/__tests__/components/page-audit-panel.render.test.tsx +64 -0
  341. package/src/__tests__/components/reflow-meter.render.test.tsx +144 -0
  342. package/src/__tests__/components/seo-char-count.test.tsx +26 -6
  343. package/src/__tests__/components/serp-preview.render.test.tsx +32 -0
  344. package/src/__tests__/lib/breakpoints.test.ts +84 -0
  345. package/src/__tests__/lib/canvas-edit-chrome.test.ts +56 -0
  346. package/src/__tests__/lib/media-format.test.ts +89 -0
  347. package/src/__tests__/lib/page-audit-input.test.ts +144 -0
  348. package/src/__tests__/lib/page-editor-service.test.ts +2 -0
  349. package/src/__tests__/lib/page-redirect.test.ts +29 -0
  350. package/src/__tests__/lib/rail-width.test.ts +86 -0
  351. package/src/__tests__/lib/reflow-baseline.test.ts +64 -0
  352. package/src/__tests__/lib/reflow-probe.test.ts +95 -0
  353. package/src/__tests__/lib/version-diff.test.ts +278 -0
  354. package/src/__tests__/lib/version-history.test.ts +166 -0
  355. package/src/__tests__/styles/canvas-container-queries.test.ts +103 -0
  356. package/src/__tests__/styles/packaging.test.ts +38 -0
  357. package/src/__tests__/styles/responsive-layer.test.ts +152 -0
  358. package/src/__tests__/styles/tokens-drift.test.ts +110 -0
  359. package/src/__tests__/views/admin-renderer-compat.test.ts +48 -0
  360. package/src/__tests__/views/admin-section-renderers.test.tsx +70 -4
  361. package/src/__tests__/views/canvas-review-mode.render.test.tsx +94 -0
  362. package/src/__tests__/views/editor-top-bar.render.test.tsx +43 -1
  363. package/src/__tests__/views/page-tab.render.test.tsx +226 -0
  364. package/src/__tests__/views/section-class-parity.test.ts +98 -0
  365. package/src/__tests__/views/sections-panel-design-owned.render.test.tsx +104 -0
  366. package/src/__tests__/views/version-history-panel.render.test.tsx +195 -0
  367. package/src/components/BreakpointPicker.tsx +114 -0
  368. package/src/components/CanvasEditTip.tsx +46 -0
  369. package/src/components/EditorRail.tsx +219 -0
  370. package/src/components/EditorRailTabs.tsx +117 -0
  371. package/src/components/MediaBlock.tsx +223 -0
  372. package/src/components/ReflowMeter.tsx +125 -0
  373. package/src/components/ZoomChip.tsx +39 -0
  374. package/src/components/breakpoint-icons.ts +17 -0
  375. package/src/components/page-tab/AuthorPicker.tsx +240 -0
  376. package/src/components/page-tab/DirectiveSwitch.tsx +89 -0
  377. package/src/components/seo/EditorSeoScoreBadge.tsx +9 -1
  378. package/src/components/seo/PageAuditPanel.tsx +192 -0
  379. package/src/components/seo/SeoCharCount.tsx +55 -24
  380. package/src/components/seo/SeoEditorPane.tsx +213 -31
  381. package/src/components/seo/SerpPreview.tsx +41 -0
  382. package/src/hooks/usePageAudit.ts +98 -0
  383. package/src/hooks/useReflowGuard.ts +96 -0
  384. package/src/layout/primitives/AdminShell.tsx +13 -1
  385. package/src/lib/breakpoints.ts +107 -0
  386. package/src/lib/canvas-edit-chrome.ts +82 -0
  387. package/src/lib/media-format.ts +99 -0
  388. package/src/lib/page-audit-input.ts +104 -0
  389. package/src/lib/page-editor-service.ts +18 -0
  390. package/src/lib/page-redirect.ts +60 -0
  391. package/src/lib/rail-width.ts +58 -0
  392. package/src/lib/reflow-baseline.ts +70 -0
  393. package/src/lib/reflow-probe.ts +299 -0
  394. package/src/lib/seo-service.ts +10 -0
  395. package/src/lib/version-diff.ts +376 -0
  396. package/src/lib/version-history.ts +192 -0
  397. package/src/styles/prenta-tokens.css +120 -42
  398. package/src/styles/responsive.css +281 -0
  399. package/src/styles/theme.css +138 -0
  400. package/src/views/page-editor/CanvasMetaLine.tsx +50 -0
  401. package/src/views/page-editor/EditorCanvas.tsx +140 -54
  402. package/src/views/page-editor/EditorTopBar.tsx +55 -51
  403. package/src/views/page-editor/PageSectionEditor.tsx +575 -185
  404. package/src/views/page-editor/PageTab.tsx +433 -0
  405. package/src/views/page-editor/ReviewBar.tsx +76 -0
  406. package/src/views/page-editor/SectionInspector.tsx +84 -42
  407. package/src/views/page-editor/SectionsPanel.tsx +282 -141
  408. package/src/views/page-editor/SitePreviewFrame.tsx +3 -0
  409. package/src/views/page-editor/VersionHistoryPanel.tsx +302 -0
  410. package/src/views/page-editor/reflow-context.ts +43 -0
  411. package/src/views/page-editor/sections/ByTheNumbersSection.tsx +3 -2
  412. package/src/views/page-editor/sections/CtaBannerSection.tsx +3 -1
  413. package/src/views/page-editor/sections/FeatureHighlightSection.tsx +3 -2
  414. package/src/views/page-editor/sections/GallerySection.tsx +7 -3
  415. package/src/views/page-editor/sections/HeroBannerSection.tsx +2 -2
  416. package/src/views/page-editor/sections/MissionSection.tsx +4 -2
  417. package/src/views/page-editor/sections/PullQuoteSection.tsx +3 -1
  418. package/src/views/page-editor/sections/RelatedPostsSection.tsx +2 -1
  419. package/src/views/page-editor/sections/SectionRenderer.tsx +115 -34
  420. package/src/views/page-editor/sections/admin-renderers.tsx +54 -15
  421. package/src/views/page-editor/sections/parts.tsx +46 -18
  422. package/src/views/page-editor/viewports.ts +13 -26
  423. package/src/views/post-editor/PostEditorCanvas.tsx +18 -11
  424. package/src/views/post-editor/PostSectionEditor.tsx +1 -56
  425. package/src/views/post-editor/PostTemplateEditor.tsx +3 -0
@@ -0,0 +1,70 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // @vitest-environment happy-dom
3
+ import { afterEach, describe, expect, it, vi } from 'vitest';
4
+ import { cleanup, fireEvent, render, screen } from '@testing-library/react';
5
+ import { SectionRenderer } from '../../views/page-editor/sections/SectionRenderer.js';
6
+ afterEach(cleanup);
7
+ const SECTION = {
8
+ id: 's1',
9
+ sectionType: 'hero',
10
+ name: 'Hero Banner',
11
+ visible: true,
12
+ content: { heading: 'A headline' },
13
+ settings: {},
14
+ };
15
+ function sectionEl() {
16
+ const el = document.querySelector('[data-section-id="s1"]');
17
+ if (!el)
18
+ throw new Error('section not rendered');
19
+ return el;
20
+ }
21
+ describe('SectionRenderer — review mode', () => {
22
+ it('marks a changed section and names the change in its label', () => {
23
+ render(_jsx(SectionRenderer, { section: SECTION, editable: true, reviewing: true, changed: true }));
24
+ expect(screen.getByText('Hero Banner — changed')).toBeTruthy();
25
+ expect(sectionEl().getAttribute('data-changed')).toBe('true');
26
+ expect(sectionEl().className).toContain('outline-dashed');
27
+ });
28
+ it('leaves an unchanged section unlabelled and unoutlined', () => {
29
+ render(_jsx(SectionRenderer, { section: SECTION, editable: true, reviewing: true, changed: false }));
30
+ expect(screen.queryByText(/— changed/)).toBeNull();
31
+ expect(sectionEl().getAttribute('data-changed')).toBeNull();
32
+ expect(sectionEl().className).not.toContain('outline-dashed');
33
+ });
34
+ it('keeps the changed label even though review mode suppresses editing chrome', () => {
35
+ // The trap the handoff calls out by name: review mode and site-preview
36
+ // mode both drop the cursor, the hover outline and the section label, so
37
+ // it is tempting to share one suppression rule. Doing that hides the one
38
+ // label review mode exists to show.
39
+ render(_jsx(SectionRenderer, { section: SECTION, editable: true, reviewing: true, changed: true, selected: true }));
40
+ expect(sectionEl().getAttribute('data-editable')).toBeNull();
41
+ expect(sectionEl().className).not.toContain('cursor-pointer');
42
+ // The selection label is gone…
43
+ expect(screen.queryByText('Hero Banner')).toBeNull();
44
+ // …and the changed label is not.
45
+ expect(screen.getByText('Hero Banner — changed')).toBeTruthy();
46
+ });
47
+ it('does not select a section while reviewing — that would edit the current page', () => {
48
+ const onSelect = vi.fn();
49
+ render(_jsx(SectionRenderer, { section: SECTION, editable: true, reviewing: true, changed: true, onSelect: onSelect }));
50
+ fireEvent.click(sectionEl());
51
+ expect(onSelect).not.toHaveBeenCalled();
52
+ });
53
+ it('still selects normally when not reviewing', () => {
54
+ const onSelect = vi.fn();
55
+ render(_jsx(SectionRenderer, { section: SECTION, editable: true, onSelect: onSelect }));
56
+ fireEvent.click(sectionEl());
57
+ expect(onSelect).toHaveBeenCalledWith('s1');
58
+ expect(sectionEl().getAttribute('data-editable')).toBe('true');
59
+ });
60
+ it('names the change in the accessible name, not only in colour and a dashed border', () => {
61
+ render(_jsx(SectionRenderer, { section: SECTION, editable: true, reviewing: true, changed: true }));
62
+ expect(sectionEl().getAttribute('aria-label')).toBe('Hero Banner section — changed in this version');
63
+ });
64
+ it('keeps a hidden section muted in a snapshot, as it was when saved', () => {
65
+ render(_jsx(SectionRenderer, { section: { ...SECTION, visible: false }, editable: true, reviewing: true, changed: false }));
66
+ expect(sectionEl().className).toContain('opacity-40');
67
+ expect(screen.getByText('Hidden')).toBeTruthy();
68
+ });
69
+ });
70
+ //# sourceMappingURL=canvas-review-mode.render.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canvas-review-mode.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/canvas-review-mode.render.test.tsx"],"names":[],"mappings":"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"}
@@ -11,7 +11,7 @@ const baseProps = {
11
11
  publishing: false,
12
12
  canEdit: true,
13
13
  canPublish: true,
14
- viewport: '1080p',
14
+ viewport: 'wide',
15
15
  onViewport: vi.fn(),
16
16
  onBack: vi.fn(),
17
17
  onPreview: vi.fn(),
@@ -74,4 +74,33 @@ describe('EditorTopBar view-on-site vs view-live', () => {
74
74
  expect(screen.queryByRole('button', { name: /View (live|draft)/ })).toBeNull();
75
75
  });
76
76
  });
77
+ describe('EditorTopBar history button', () => {
78
+ it('reports whether history is showing, since it takes over the rail rather than opening a dialog', () => {
79
+ const { unmount } = render(_jsx(EditorTopBar, { ...baseProps, onHistory: vi.fn() }));
80
+ expect(screen.getByRole('button', { name: 'Version history' }).getAttribute('aria-pressed')).toBe('false');
81
+ unmount();
82
+ render(_jsx(EditorTopBar, { ...baseProps, onHistory: vi.fn(), historyOpen: true }));
83
+ const open = screen.getByRole('button', { name: 'Version history' });
84
+ expect(open.getAttribute('aria-pressed')).toBe('true');
85
+ expect(open.getAttribute('title')).toBe('Close version history');
86
+ });
87
+ it('gives every icon-only control a touch target', () => {
88
+ // These buttons are 32px square, which is a fine mouse target and an
89
+ // unusable thumb one. `prenta-touch-target` is what grows them under a
90
+ // coarse pointer — and it is applied per control, so a button written with
91
+ // a conditional className is easy to leave out. Exactly that happened to
92
+ // the history button, whose pressed state made it the odd one out.
93
+ render(_jsx(EditorTopBar, { ...baseProps, onHistory: vi.fn(), onViewOnSite: vi.fn(), onToggleSitePreview: vi.fn() }));
94
+ for (const name of [
95
+ 'Page settings',
96
+ 'Version history',
97
+ 'Preview page',
98
+ 'Inline site preview',
99
+ 'View draft on site',
100
+ ]) {
101
+ const button = screen.getByRole('button', { name });
102
+ expect(button.className, `${name} has no touch target`).toContain('prenta-touch-target');
103
+ }
104
+ });
105
+ });
77
106
  //# sourceMappingURL=editor-top-bar.render.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"editor-top-bar.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/editor-top-bar.render.test.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"editor-top-bar.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/editor-top-bar.render.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=page-tab.render.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-tab.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/page-tab.render.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,151 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // @vitest-environment happy-dom
3
+ import { describe, expect, it, vi } from 'vitest';
4
+ import { cleanup, fireEvent, render, screen } from '@testing-library/react';
5
+ import { DEFAULT_DIRECTIVES } from '@prenta/core/seo/robots-directives';
6
+ import { PageTab } from '../../views/page-editor/PageTab.js';
7
+ const page = {
8
+ id: 'p1',
9
+ title: 'About Us',
10
+ slug: 'about',
11
+ path: '/about',
12
+ status: 'PUBLISHED',
13
+ parentPageId: null,
14
+ sections: [],
15
+ seoTitle: '',
16
+ seoDescription: '',
17
+ publishedAt: '2026-05-15T10:00:00.000Z',
18
+ updatedAt: '2026-06-01T09:30:00.000Z',
19
+ scheduledAt: null,
20
+ scheduledUnpublishAt: null,
21
+ authorName: '',
22
+ authorId: '',
23
+ builderOwned: false,
24
+ };
25
+ function renderTab(overrides = {}) {
26
+ return render(_jsx(PageTab, { page: { ...page, ...overrides.page }, canEdit: true, publishedPath: overrides.publishedPath === undefined ? '/about' : overrides.publishedPath, siteUrl: "https://example.com", directives: { ...DEFAULT_DIRECTIVES, ...overrides.directives }, onDirectivesChange: overrides.onDirectivesChange ?? (() => { }), redirectOnPublish: true, onRedirectOnPublishChange: () => { }, onPageChange: overrides.onPageChange ?? (() => { }), onDuplicate: () => { }, onTrash: () => { } }));
27
+ }
28
+ /**
29
+ * Only Address and Publishing are open by default; the rest are collapsed, and
30
+ * Radix unmounts closed content. Tests that assert on a collapsed group must
31
+ * open it first — which is also the interaction a real editor performs.
32
+ */
33
+ function openGroup(name) {
34
+ fireEvent.click(screen.getByRole('button', { name }));
35
+ }
36
+ describe('PageTab — address', () => {
37
+ it('says nothing about redirects while the page has not moved', () => {
38
+ renderTab();
39
+ expect(screen.queryByText(/URL CHANGED/)).toBeNull();
40
+ expect(screen.queryByText(/301 redirect/)).toBeNull();
41
+ cleanup();
42
+ });
43
+ it('offers a 301 naming both paths once a live page moves', () => {
44
+ renderTab({ page: { path: '/about-us' } });
45
+ expect(screen.getByText('URL CHANGED')).toBeTruthy();
46
+ expect(screen.getByText(/Create a 301 redirect on publish/)).toBeTruthy();
47
+ expect(screen.getByText('/about → /about-us')).toBeTruthy();
48
+ cleanup();
49
+ });
50
+ it('keeps path in lockstep when the slug was driving it', () => {
51
+ // The displayed URL and the 301 detector both read `path`. Updating only
52
+ // `slug` left a live `/about` → slug `about-us` with no warning and a
53
+ // full URL that still said /about.
54
+ const onPageChange = vi.fn();
55
+ renderTab({ onPageChange });
56
+ fireEvent.change(screen.getByLabelText(/URL slug/i), { target: { value: 'about-us' } });
57
+ expect(onPageChange).toHaveBeenCalledWith({ slug: 'about-us', path: '/about-us' });
58
+ cleanup();
59
+ });
60
+ it('leaves a custom path alone when the slug changes', () => {
61
+ const onPageChange = vi.fn();
62
+ renderTab({ page: { slug: 'about', path: '/team/about' }, onPageChange });
63
+ fireEvent.change(screen.getByLabelText(/URL slug/i), { target: { value: 'about-us' } });
64
+ expect(onPageChange).toHaveBeenCalledWith({ slug: 'about-us' });
65
+ cleanup();
66
+ });
67
+ it('warns without promising a 301 when the user cannot create redirects', () => {
68
+ render(_jsx(PageTab, { page: { ...page, path: '/about-us' }, canEdit: true, publishedPath: "/about", siteUrl: "https://example.com", directives: DEFAULT_DIRECTIVES, onDirectivesChange: () => { }, redirectOnPublish: true, onRedirectOnPublishChange: () => { }, canCreateRedirect: false, onPageChange: () => { }, onDuplicate: () => { }, onTrash: () => { } }));
69
+ expect(screen.getByText('URL CHANGED')).toBeTruthy();
70
+ expect(screen.queryByText(/Create a 301 redirect on publish/)).toBeNull();
71
+ expect(screen.getByText(/Ask an admin to create a 301/)).toBeTruthy();
72
+ cleanup();
73
+ });
74
+ it('stays quiet when a page that was never live changes its slug', () => {
75
+ // Nothing points at the old path. Warning here would train editors to
76
+ // dismiss the warning that matters.
77
+ renderTab({ page: { path: '/about-us', status: 'DRAFT' }, publishedPath: null });
78
+ expect(screen.queryByText(/URL CHANGED/)).toBeNull();
79
+ cleanup();
80
+ });
81
+ });
82
+ describe('PageTab — search directives', () => {
83
+ it('summarises how many directives are restricted', () => {
84
+ renderTab();
85
+ expect(screen.getByText('OPEN')).toBeTruthy();
86
+ cleanup();
87
+ renderTab({ directives: { index: false, snippet: false } });
88
+ // `noindex` subsumes the snippet token, but both are still restrictions the
89
+ // editor chose, so the count reports two.
90
+ expect(screen.getByText('2 RESTRICTED')).toBeTruthy();
91
+ cleanup();
92
+ });
93
+ it('previews the exact head line, composed by the renderer’s own function', () => {
94
+ renderTab({ directives: { index: false } });
95
+ openGroup(/Search directives/);
96
+ expect(screen.getByText('<meta name="robots" content="noindex" />')).toBeTruthy();
97
+ cleanup();
98
+ renderTab();
99
+ openGroup(/Search directives/);
100
+ // Nothing is emitted when everything is permissive, and the preview says
101
+ // so rather than showing a blank box.
102
+ expect(screen.getByText(/no robots meta/)).toBeTruthy();
103
+ cleanup();
104
+ });
105
+ it('shows each switch’s literal directive token', () => {
106
+ // The failure this prevents is flipping a switch whose consequence you
107
+ // could not name. `noindex` beside it makes the consequence the label.
108
+ renderTab({ directives: { index: false } });
109
+ openGroup(/Search directives/);
110
+ expect(screen.getByText('noindex')).toBeTruthy();
111
+ expect(screen.getByText('follow')).toBeTruthy();
112
+ cleanup();
113
+ });
114
+ it('disables snippet and archive under noindex', () => {
115
+ // They have no effect once the page is out of the index, and an enabled
116
+ // control that changes nothing is a lie about what it does.
117
+ renderTab({ directives: { index: false } });
118
+ openGroup(/Search directives/);
119
+ expect(screen.getByRole('switch', { name: /Allow text snippets/ }).hasAttribute('disabled')).toBe(true);
120
+ expect(screen.getByRole('switch', { name: /Allow cached copies/ }).hasAttribute('disabled')).toBe(true);
121
+ cleanup();
122
+ });
123
+ it('warns that publishing will not make a noindexed page findable', () => {
124
+ renderTab({ directives: { index: false } });
125
+ openGroup(/Search directives/);
126
+ expect(screen.getByText(/hidden from search/)).toBeTruthy();
127
+ cleanup();
128
+ });
129
+ it('reports a toggle as a permission, not a restriction', () => {
130
+ const onDirectivesChange = vi.fn();
131
+ renderTab({ onDirectivesChange });
132
+ openGroup(/Search directives/);
133
+ fireEvent.click(screen.getByRole('switch', { name: /Show in search results/ }));
134
+ expect(onDirectivesChange).toHaveBeenCalledWith(expect.objectContaining({ index: false, follow: true }));
135
+ cleanup();
136
+ });
137
+ });
138
+ describe('PageTab — danger zone', () => {
139
+ it('asks before trashing, and says when the page is live', () => {
140
+ const onTrash = vi.fn();
141
+ render(_jsx(PageTab, { page: page, canEdit: true, publishedPath: "/about", siteUrl: "https://example.com", directives: DEFAULT_DIRECTIVES, onDirectivesChange: () => { }, redirectOnPublish: true, onRedirectOnPublishChange: () => { }, onPageChange: () => { }, onDuplicate: () => { }, onTrash: onTrash }));
142
+ openGroup(/Danger zone/);
143
+ fireEvent.click(screen.getByRole('button', { name: /Move to trash/ }));
144
+ expect(onTrash).not.toHaveBeenCalled();
145
+ expect(screen.getByText(/It is live, and will stop being served/)).toBeTruthy();
146
+ fireEvent.click(screen.getByRole('button', { name: 'Move to trash' }));
147
+ expect(onTrash).toHaveBeenCalled();
148
+ cleanup();
149
+ });
150
+ });
151
+ //# sourceMappingURL=page-tab.render.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-tab.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/page-tab.render.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=section-class-parity.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-class-parity.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/section-class-parity.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,81 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { paddingClass as sitePadding, backgroundClass as siteBackground, isDark as siteIsDark, } from '@prenta/sections-react';
3
+ import { paddingClass as adminPadding, backgroundClass as adminBackground, isDarkBackground as adminIsDark, } from '../../views/page-editor/sections/parts.js';
4
+ import { BACKGROUND_PRESETS, backgroundPreset } from '@prenta/core/page-sections';
5
+ /**
6
+ * The editor canvas wraps each section itself rather than using `<Sections>`,
7
+ * so the admin applies ITS wrapper classes around a body rendered by
8
+ * sections-react. Two implementations, one rendered result.
9
+ *
10
+ * They are duplicated because they have to be: Tailwind generates utilities by
11
+ * scanning source text, and each package's stylesheet scans only its own `src/`
12
+ * tree. A literal shared from a third package is generated by nobody, and the
13
+ * section renders with no background — silently, with correct markup. So
14
+ * `@prenta/core` owns the DECISION (`backgroundPreset`) and each side maps it
15
+ * to its own strings; this file asserts the strings stayed in step.
16
+ */
17
+ const settings = (over = {}) => over;
18
+ /** One settings object per preset, so coverage follows the preset list. */
19
+ const SETTINGS_FOR = {
20
+ 'gradient-purple': settings({ backgroundType: 'gradient', backgroundColor: 'purple' }),
21
+ 'solid-purple': settings({ backgroundType: 'solid', backgroundColor: 'purple' }),
22
+ 'solid-muted': settings({ backgroundType: 'solid', backgroundColor: 'muted' }),
23
+ plain: settings({ backgroundType: 'none' }),
24
+ };
25
+ describe('section wrapper classes', () => {
26
+ it('pads identically in the canvas and on the site', () => {
27
+ for (const paddingY of ['sm', 'md', 'lg', 'xl', undefined]) {
28
+ const s = settings({ paddingY });
29
+ expect(adminPadding(s), `paddingY: ${paddingY}`).toBe(sitePadding(s));
30
+ }
31
+ });
32
+ it('pads with container steps, never viewport breakpoints', () => {
33
+ // A viewport step here would reflow the canvas against the editor window
34
+ // and undo the whole point of the container migration.
35
+ const xl = adminPadding(settings({ paddingY: 'xl' }));
36
+ expect(xl).toContain('@pv-');
37
+ expect(xl).not.toMatch(/(^|\s)(sm|md|lg|xl):/);
38
+ });
39
+ it('covers every declared preset', () => {
40
+ // Guards the fixture table itself: add a preset in core and this fails
41
+ // until it has settings here, so the assertions below cannot quietly stop
42
+ // covering it.
43
+ for (const preset of BACKGROUND_PRESETS) {
44
+ const s = SETTINGS_FOR[preset];
45
+ expect(s, `no settings fixture for preset "${preset}"`).toBeDefined();
46
+ expect(backgroundPreset(s), `settings for ${preset}`).toBe(preset);
47
+ }
48
+ });
49
+ it('paints every preset identically in the canvas and on the site', () => {
50
+ // The canvas is a preview of the public page. It previously used admin
51
+ // theme tokens, so in dark mode it showed a hero in `#9D71F0` on dark body
52
+ // sections while the live page rendered violet-600 on white — a page no
53
+ // visitor would ever see.
54
+ for (const preset of BACKGROUND_PRESETS) {
55
+ const s = SETTINGS_FOR[preset];
56
+ expect(adminBackground(s), `background for ${preset}`).toBe(siteBackground(s));
57
+ }
58
+ });
59
+ it('never paints the canvas with admin theme tokens', () => {
60
+ // The specific regression: theme tokens follow the editor's light/dark
61
+ // preference, and the live site does not.
62
+ for (const preset of BACKGROUND_PRESETS) {
63
+ const cls = adminBackground(SETTINGS_FOR[preset]);
64
+ expect(cls, preset).not.toMatch(/\b(bg-card|bg-brand|bg-muted|text-foreground)\b/);
65
+ }
66
+ });
67
+ it('agrees on which backgrounds are dark', () => {
68
+ for (const preset of BACKGROUND_PRESETS) {
69
+ const s = SETTINGS_FOR[preset];
70
+ expect(adminIsDark(s), preset).toBe(siteIsDark(s));
71
+ }
72
+ });
73
+ it('falls back to the plain preset for an unrecognised colour', () => {
74
+ // A consumer can put any string in `backgroundColor`. It must land on the
75
+ // default background rather than losing the background rules entirely.
76
+ const odd = settings({ backgroundType: 'solid', backgroundColor: 'chartreuse' });
77
+ expect(backgroundPreset(odd)).toBe('plain');
78
+ expect(adminBackground(odd)).toBe(siteBackground(odd));
79
+ });
80
+ });
81
+ //# sourceMappingURL=section-class-parity.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-class-parity.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/section-class-parity.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sections-panel-design-owned.render.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sections-panel-design-owned.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/sections-panel-design-owned.render.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // @vitest-environment happy-dom
3
+ import { describe, expect, it, vi } from 'vitest';
4
+ import { render, screen } from '@testing-library/react';
5
+ import { SectionsPanel } from '../../views/page-editor/SectionsPanel.js';
6
+ /**
7
+ * Pages and posts are design-owned: the section list comes from the template in
8
+ * code. `SectionsPanel` therefore defaults to read-only, and only the template
9
+ * editor — the surface that authors a template — passes `structural`.
10
+ *
11
+ * The default direction is the point. A future consumer that forgets the flag
12
+ * must get the safe behaviour, not an editor that can silently restructure a
13
+ * design-owned page.
14
+ */
15
+ function section(over = {}) {
16
+ return {
17
+ id: 's1',
18
+ sectionType: 'hero',
19
+ name: 'Hero Banner',
20
+ visible: true,
21
+ content: {},
22
+ settings: {},
23
+ ...over,
24
+ };
25
+ }
26
+ function renderPanel(over = {}) {
27
+ return render(_jsx(SectionsPanel, { sections: [section(), section({ id: 's2', name: 'Mission' })], selectedId: null, canEdit: true, onSelect: vi.fn(), onToggleVisibility: vi.fn(), ...over }));
28
+ }
29
+ describe('SectionsPanel — design-owned by default', () => {
30
+ it('offers no add, reorder, duplicate, or delete', () => {
31
+ renderPanel();
32
+ expect(screen.queryByRole('button', { name: /add section/i })).toBeNull();
33
+ expect(screen.queryByRole('button', { name: /drag to reorder/i })).toBeNull();
34
+ expect(screen.queryByRole('button', { name: /more actions/i })).toBeNull();
35
+ });
36
+ it('keeps the visibility toggle — the one structural property an editor owns', () => {
37
+ renderPanel();
38
+ expect(screen.getByRole('button', { name: 'Hide Hero Banner' })).toBeTruthy();
39
+ });
40
+ it('keeps sections selectable for editing', () => {
41
+ const onSelect = vi.fn();
42
+ renderPanel({ onSelect });
43
+ screen.getByText('Hero Banner').click();
44
+ expect(onSelect).toHaveBeenCalledWith('s1');
45
+ });
46
+ it('explains the absence rather than looking broken', () => {
47
+ // Without this the panel reads as a regression — "where did Add Section go"
48
+ // is the first thing a returning editor asks.
49
+ renderPanel();
50
+ expect(screen.getByText(/Layout is design-owned/i)).toBeTruthy();
51
+ expect(screen.getByText(/Hide a section to drop it from the live page/i)).toBeTruthy();
52
+ });
53
+ it('says the template renders nothing rather than inviting a first section', () => {
54
+ renderPanel({ sections: [] });
55
+ expect(screen.getByText(/template renders no sections/i)).toBeTruthy();
56
+ expect(screen.queryByText(/add one below/i)).toBeNull();
57
+ });
58
+ });
59
+ describe('SectionsPanel — structural opt-in', () => {
60
+ it('restores every structural affordance when asked', () => {
61
+ renderPanel({
62
+ structural: true,
63
+ onReorder: vi.fn(),
64
+ onDuplicate: vi.fn(),
65
+ onRequestDelete: vi.fn(),
66
+ onAdd: vi.fn(),
67
+ });
68
+ expect(screen.getByRole('button', { name: /add section/i })).toBeTruthy();
69
+ expect(screen.getAllByRole('button', { name: /drag to reorder/i })).toHaveLength(2);
70
+ expect(screen.getAllByRole('button', { name: /more actions/i })).toHaveLength(2);
71
+ expect(screen.queryByText(/Layout is design-owned/i)).toBeNull();
72
+ });
73
+ it('still locks externally-managed sections', () => {
74
+ // `unmanaged` sections are read-only even where structural editing is
75
+ // allowed — they are owned by a system outside the CMS.
76
+ renderPanel({
77
+ structural: true,
78
+ sections: [section({ unmanaged: true })],
79
+ onReorder: vi.fn(),
80
+ onAdd: vi.fn(),
81
+ });
82
+ expect(screen.queryByRole('button', { name: /more actions/i })).toBeNull();
83
+ expect(screen.getByLabelText(/managed outside the editor/i)).toBeTruthy();
84
+ });
85
+ });
86
+ //# sourceMappingURL=sections-panel-design-owned.render.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sections-panel-design-owned.render.test.js","sourceRoot":"","sources":["../../../src/__tests__/views/sections-panel-design-owned.render.test.tsx"],"names":[],"mappings":";AAAA,gCAAgC;AAChC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAA;AAGxE;;;;;;;;GAQG;AAEH,SAAS,OAAO,CAAC,OAA6B,EAAE;IAC9C,OAAO;QACL,EAAE,EAAE,IAAI;QACR,WAAW,EAAE,MAAM;QACnB,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,GAAG,IAAI;KACO,CAAA;AAClB,CAAC;AAED,SAAS,WAAW,CAAC,OAAqD,EAAE;IAC1E,OAAO,MAAM,CACX,KAAC,aAAa,IACZ,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC,EAC7D,UAAU,EAAE,IAAI,EAChB,OAAO,QACP,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE,EACjB,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,KACvB,IAAI,GACR,CACH,CAAA;AACH,CAAC;AAED,QAAQ,CAAC,yCAAyC,EAAE,GAAG,EAAE;IACvD,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,WAAW,EAAE,CAAA;QACb,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QACzE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7E,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAC5E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,WAAW,EAAE,CAAA;QACb,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;IAC/E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,EAAE,CAAA;QACxB,WAAW,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAA;QACzB,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,CAAA;QACvC,MAAM,CAAC,QAAQ,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,4EAA4E;QAC5E,8CAA8C;QAC9C,WAAW,EAAE,CAAA;QACb,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QAChE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,+CAA+C,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;IACxF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QACtE,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IACzD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,mCAAmC,EAAE,GAAG,EAAE;IACjD,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,WAAW,CAAC;YACV,UAAU,EAAE,IAAI;YAChB,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;YAClB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;YACpB,eAAe,EAAE,EAAE,CAAC,EAAE,EAAE;YACxB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;SACf,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;QACzE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QACnF,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAChF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;IAClE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,sEAAsE;QACtE,wDAAwD;QACxD,WAAW,CAAC;YACV,UAAU,EAAE,IAAI;YAChB,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,IAAI,EAA0B,CAAC,CAAC;YAChE,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE;YAClB,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE;SACf,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC1E,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,6BAA6B,CAAC,CAAC,CAAC,UAAU,EAAE,CAAA;IAC3E,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=version-history-panel.render.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version-history-panel.render.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/views/version-history-panel.render.test.tsx"],"names":[],"mappings":""}