@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,93 @@
1
+ /**
2
+ * Presentation helpers for the media block.
3
+ *
4
+ * Pure, because these are the parts with real logic — the rest of the block is
5
+ * layout. Ported from the design prototype so the labels an editor reads match
6
+ * the ones the design specifies.
7
+ */
8
+ /**
9
+ * Aspect ratio per crop, as a CSS `aspect-ratio` value.
10
+ *
11
+ * The frame shows the crop the TEMPLATE renders, not the asset's own ratio.
12
+ * Showing the asset's ratio would tell an editor their portrait photo is fine
13
+ * and then crop its subject out on the page.
14
+ */
15
+ export const CROP_RATIO = {
16
+ section: '16 / 10',
17
+ social: '1.91 / 1',
18
+ };
19
+ /** Named ratios an editor recognises, nearest-match within a tolerance. */
20
+ const KNOWN_RATIOS = [
21
+ [1.91, '1.91:1'],
22
+ [16 / 9, '16:9'],
23
+ [1.5, '3:2'],
24
+ [4 / 3, '4:3'],
25
+ [1, '1:1'],
26
+ [0.8, '4:5'],
27
+ [9 / 16, '9:16'],
28
+ ];
29
+ /**
30
+ * Human ratio for an asset's intrinsic dimensions.
31
+ *
32
+ * Snaps to a named ratio when within 0.05, else reports the number. The
33
+ * tolerance matters: a 2400×1600 photo is 1.5 exactly, but a 2401×1600 scan is
34
+ * 1.5006 and an editor should still read "3:2" rather than "1.50:1".
35
+ *
36
+ * Returns null when dimensions are unknown — the library does not always have
37
+ * them, and inventing "1.00:1" would be worse than saying nothing.
38
+ */
39
+ export function ratioLabel(width, height) {
40
+ if (!width || !height || width <= 0 || height <= 0)
41
+ return null;
42
+ const r = width / height;
43
+ const best = KNOWN_RATIOS.reduce((a, b) => (Math.abs(b[0] - r) < Math.abs(a[0] - r) ? b : a));
44
+ return Math.abs(best[0] - r) < 0.05 ? best[1] : `${r.toFixed(2)}:1`;
45
+ }
46
+ /**
47
+ * Short format badge — the file extension, uppercased.
48
+ *
49
+ * Falls back to the MIME subtype so a URL with no extension (a signed CDN link,
50
+ * an upload route) still shows something meaningful rather than a blank chip.
51
+ */
52
+ export function formatBadge(filenameOrUrl, mimeType) {
53
+ const path = filenameOrUrl.split(/[?#]/)[0] ?? '';
54
+ const segment = path.split('/').pop() ?? '';
55
+ // Only a segment that actually contains a dot has an extension. Comparing
56
+ // against the whole path instead of the segment let a dotless filename —
57
+ // which is what signed CDN links look like — read as its own extension.
58
+ const ext = segment.includes('.') ? (segment.split('.').pop() ?? '') : '';
59
+ if (ext && ext.length <= 5 && /^[a-z0-9]+$/i.test(ext)) {
60
+ return ext.toUpperCase();
61
+ }
62
+ const sub = mimeType?.split('/')[1];
63
+ return sub ? sub.split('+')[0].toUpperCase() : 'FILE';
64
+ }
65
+ /**
66
+ * Filename for display, from a filename or a URL.
67
+ *
68
+ * Query strings are dropped — a signed URL's token is noise in a 200px-wide
69
+ * toolbar, and it is never what an editor is trying to read.
70
+ */
71
+ export function displayName(filenameOrUrl) {
72
+ const path = filenameOrUrl.split(/[?#]/)[0] ?? '';
73
+ return decodeURIComponent(path.split('/').pop() ?? '') || filenameOrUrl;
74
+ }
75
+ /**
76
+ * A stable background tint for an asset.
77
+ *
78
+ * The design fills the frame with a wash derived from the asset's dominant
79
+ * colour. The media library stores no such value, so it is derived from the
80
+ * name instead: the same asset is always the same colour, which is the property
81
+ * that actually matters for recognising a thumbnail, and it costs no storage
82
+ * and no extra request.
83
+ *
84
+ * Returned as a 135° gradient to the design's `color-mix(tint 45%, #fff)`.
85
+ */
86
+ export function assetWash(seed) {
87
+ let hash = 0;
88
+ for (let i = 0; i < seed.length; i++)
89
+ hash = (hash * 31 + seed.charCodeAt(i)) % 360;
90
+ const tint = `oklch(0.88 0.06 ${hash})`;
91
+ return `linear-gradient(135deg, ${tint}, color-mix(in srgb, ${tint} 45%, #fff))`;
92
+ }
93
+ //# sourceMappingURL=media-format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-format.js","sourceRoot":"","sources":["../../src/lib/media-format.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { PageSection } from '@prenta/core/page-sections';
2
+ import type { PageAuditInput } from '@prenta/core/seo/page-audit';
3
+ import type { SeoContentRecord } from './seo-service.js';
4
+ /**
5
+ * One place that turns editor state into `PageAuditInput`.
6
+ *
7
+ * Two callers build the audit and their numbers must agree:
8
+ *
9
+ * - the page editor, from the SAVED record, so the header chip and rail dot
10
+ * have a score from first paint rather than after someone opens a tab;
11
+ * - the SEO pane, from LIVE form state, so the score moves as you type.
12
+ *
13
+ * They differ only in where the metadata comes from — saved versus unsaved —
14
+ * which is exactly the difference an editor expects to see. Everything else
15
+ * (which fields feed which check, how the title is rendered, what counts as
16
+ * unknown) is decided here once. Two hand-written copies of this mapping is how
17
+ * the editor ended up showing three different scores in the first place.
18
+ */
19
+ export interface AuditMetaSource {
20
+ /** Page-level meta title, before the site title template is applied. */
21
+ metaTitle: string;
22
+ metaDescription: string;
23
+ focusKeyword: string;
24
+ structuredDataType: string;
25
+ noindex: boolean;
26
+ /** `nosnippet` — blocks AI Overview and chat citations outright. */
27
+ nosnippet: boolean;
28
+ /** `NEVER` excludes the page from llms.txt. */
29
+ llmsInclude: string;
30
+ /** True when an OG image is set — dimensions are not stored, see below. */
31
+ hasOgImage: boolean;
32
+ }
33
+ export interface BuildAuditInputArgs {
34
+ sections: PageSection[];
35
+ meta: AuditMetaSource;
36
+ slug: string;
37
+ /** Document title and site template, for the rendered `<title>`. */
38
+ record: Pick<SeoContentRecord, 'title' | 'siteName' | 'titleTemplate' | 'url'> | null;
39
+ /** Fallback title when there is no saved record yet. */
40
+ fallbackTitle?: string;
41
+ }
42
+ export declare function buildPageAuditInput({ sections, meta, slug, record, fallbackTitle, }: BuildAuditInputArgs): PageAuditInput;
43
+ /** Meta source from a saved SEO record. */
44
+ export declare function metaFromRecord(record: SeoContentRecord): AuditMetaSource;
45
+ //# sourceMappingURL=page-audit-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-audit-input.d.ts","sourceRoot":"","sources":["../../src/lib/page-audit-input.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AACjE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExD;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,eAAe;IAC9B,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAA;IACjB,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,EAAE,MAAM,CAAA;IACpB,kBAAkB,EAAE,MAAM,CAAA;IAC1B,OAAO,EAAE,OAAO,CAAA;IAChB,oEAAoE;IACpE,SAAS,EAAE,OAAO,CAAA;IAClB,+CAA+C;IAC/C,WAAW,EAAE,MAAM,CAAA;IACnB,2EAA2E;IAC3E,UAAU,EAAE,OAAO,CAAA;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,IAAI,EAAE,eAAe,CAAA;IACrB,IAAI,EAAE,MAAM,CAAA;IACZ,oEAAoE;IACpE,MAAM,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,UAAU,GAAG,eAAe,GAAG,KAAK,CAAC,GAAG,IAAI,CAAA;IACrF,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,aAAa,GACd,EAAE,mBAAmB,GAAG,cAAc,CAsCtC;AAED,2CAA2C;AAC3C,wBAAgB,cAAc,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,CAWxE"}
@@ -0,0 +1,53 @@
1
+ import { resolveRenderedMetaTitle } from '@prenta/core/client';
2
+ export function buildPageAuditInput({ sections, meta, slug, record, fallbackTitle, }) {
3
+ // Measure the title a searcher actually sees — the page meta title with the
4
+ // site's template applied — not the raw field. Checking the raw field would
5
+ // give length advice that contradicts the rendered result.
6
+ const renderedTitle = record
7
+ ? resolveRenderedMetaTitle({
8
+ metaTitlePage: meta.metaTitle,
9
+ documentTitle: record.title,
10
+ site: {
11
+ siteName: record.siteName ?? undefined,
12
+ titleTemplate: record.titleTemplate ?? undefined,
13
+ },
14
+ })
15
+ : meta.metaTitle.trim() || fallbackTitle || '';
16
+ return {
17
+ sections,
18
+ seo: {
19
+ title: renderedTitle,
20
+ description: meta.metaDescription,
21
+ slug: slug || record?.url?.split('/').filter(Boolean).pop() || '',
22
+ keyword: meta.focusKeyword,
23
+ schema: meta.structuredDataType,
24
+ // `undefined` (unknown) when an image is set: the record stores a URL
25
+ // with no dimensions, and the check needs width and ratio. `null` when
26
+ // none is set, which is a genuine absence and correctly fails.
27
+ ogImage: meta.hasOgImage ? undefined : null,
28
+ robots: {
29
+ index: !meta.noindex,
30
+ snippet: !meta.nosnippet,
31
+ },
32
+ },
33
+ llmsTxt: meta.llmsInclude !== 'NEVER',
34
+ // Not resolved in the editor yet; both report not-applicable rather than
35
+ // failing an editor for a gap in the plumbing.
36
+ brand: '',
37
+ author: undefined,
38
+ };
39
+ }
40
+ /** Meta source from a saved SEO record. */
41
+ export function metaFromRecord(record) {
42
+ return {
43
+ metaTitle: record.metaTitlePage ?? '',
44
+ metaDescription: record.metaDescription ?? '',
45
+ focusKeyword: record.focusKeyword ?? '',
46
+ structuredDataType: record.structuredDataType ?? 'WebPage',
47
+ noindex: record.noindex,
48
+ nosnippet: record.nosnippet ?? false,
49
+ llmsInclude: record.llmsInclude ?? 'AUTO',
50
+ hasOgImage: Boolean(record.ogImage),
51
+ };
52
+ }
53
+ //# sourceMappingURL=page-audit-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-audit-input.js","sourceRoot":"","sources":["../../src/lib/page-audit-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAA;AA6C9D,MAAM,UAAU,mBAAmB,CAAC,EAClC,QAAQ,EACR,IAAI,EACJ,IAAI,EACJ,MAAM,EACN,aAAa,GACO;IACpB,4EAA4E;IAC5E,4EAA4E;IAC5E,2DAA2D;IAC3D,MAAM,aAAa,GAAG,MAAM;QAC1B,CAAC,CAAC,wBAAwB,CAAC;YACvB,aAAa,EAAE,IAAI,CAAC,SAAS;YAC7B,aAAa,EAAE,MAAM,CAAC,KAAK;YAC3B,IAAI,EAAE;gBACJ,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,SAAS;gBACtC,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,SAAS;aACjD;SACF,CAAC;QACJ,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,aAAa,IAAI,EAAE,CAAA;IAEhD,OAAO;QACL,QAAQ;QACR,GAAG,EAAE;YACH,KAAK,EAAE,aAAa;YACpB,WAAW,EAAE,IAAI,CAAC,eAAe;YACjC,IAAI,EAAE,IAAI,IAAI,MAAM,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE;YACjE,OAAO,EAAE,IAAI,CAAC,YAAY;YAC1B,MAAM,EAAE,IAAI,CAAC,kBAAkB;YAC/B,sEAAsE;YACtE,uEAAuE;YACvE,+DAA+D;YAC/D,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI;YAC3C,MAAM,EAAE;gBACN,KAAK,EAAE,CAAC,IAAI,CAAC,OAAO;gBACpB,OAAO,EAAE,CAAC,IAAI,CAAC,SAAS;aACzB;SACF;QACD,OAAO,EAAE,IAAI,CAAC,WAAW,KAAK,OAAO;QACrC,yEAAyE;QACzE,+CAA+C;QAC/C,KAAK,EAAE,EAAE;QACT,MAAM,EAAE,SAAS;KAClB,CAAA;AACH,CAAC;AAED,2CAA2C;AAC3C,MAAM,UAAU,cAAc,CAAC,MAAwB;IACrD,OAAO;QACL,SAAS,EAAE,MAAM,CAAC,aAAa,IAAI,EAAE;QACrC,eAAe,EAAE,MAAM,CAAC,eAAe,IAAI,EAAE;QAC7C,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,EAAE;QACvC,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,SAAS;QAC1D,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;QACpC,WAAW,EAAE,MAAM,CAAC,WAAW,IAAI,MAAM;QACzC,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;KACpC,CAAA;AACH,CAAC"}
@@ -22,6 +22,18 @@ export interface EditorPage {
22
22
  updatedAt: string | null;
23
23
  scheduledAt: string | null;
24
24
  scheduledUnpublishAt: string | null;
25
+ /**
26
+ * Displayed byline. Read by `composePageMeta` into the page's structured
27
+ * data, so this is a real output and not decoration.
28
+ *
29
+ * Deliberately separate from the document's `createdById`, which the API
30
+ * never reassigns. That field records who created the record — provenance —
31
+ * and overwriting it to change a displayed name would trade an audit trail
32
+ * for a label.
33
+ */
34
+ authorName: string;
35
+ /** CMS user behind the byline, when it is one. Empty for generic/guest. */
36
+ authorId: string;
25
37
  /**
26
38
  * True when the document was authored in the visual Page Builder (it carries
27
39
  * a `_layout` tree). Such a page's `sections` are *compiled* from the layout
@@ -1 +1 @@
1
- {"version":3,"file":"page-editor-service.d.ts","sourceRoot":"","sources":["../../src/lib/page-editor-service.ts"],"names":[],"mappings":"AAmBA,OAAO,EAEL,aAAa,EACb,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EAGjB,KAAK,WAAW,EACjB,MAAM,4BAA4B,CAAA;AAKnC,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAI7D,OAAO,EACL,aAAa,EACb,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,GAClB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,CAAA;AAEzE,eAAO,MAAM,gBAAgB,UAAU,CAAA;AAEvC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,UAAU,CAAA;IAClB;;;;OAIG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC;;;;;OAKG;IACH,YAAY,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAQD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,UAAQ,GAAG,gBAAgB,CAoCnF;AAoBD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAE3D;AAmDD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAI5E;AAkCD,wDAAwD;AACxD,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAOtE;AAED,iDAAiD;AACjD,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAQzE;AAED,wEAAwE;AACxE,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAUvE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,UAAU,CAiBxE"}
1
+ {"version":3,"file":"page-editor-service.d.ts","sourceRoot":"","sources":["../../src/lib/page-editor-service.ts"],"names":[],"mappings":"AAmBA,OAAO,EAEL,aAAa,EACb,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,EAGjB,KAAK,WAAW,EACjB,MAAM,4BAA4B,CAAA;AAKnC,YAAY,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAI7D,OAAO,EACL,aAAa,EACb,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,0BAA0B,EAC1B,qBAAqB,EACrB,iBAAiB,GAClB,CAAA;AAED,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,CAAA;AAEzE,eAAO,MAAM,gBAAgB,UAAU,CAAA;AAEvC,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,UAAU,CAAA;IAClB;;;;OAIG;IACH,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,QAAQ,EAAE,WAAW,EAAE,CAAA;IACvB,QAAQ,EAAE,MAAM,CAAA;IAChB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC;;;;;;;;OAQG;IACH,UAAU,EAAE,MAAM,CAAA;IAClB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;OAKG;IACH,YAAY,EAAE,OAAO,CAAA;CACtB;AAED,MAAM,WAAW,gBAAgB;IAC/B,4DAA4D;IAC5D,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,yCAAyC;IACzC,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAQD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,EAAE,UAAU,UAAQ,GAAG,gBAAgB,CAoCnF;AAoBD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAE3D;AAqDD,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAI5E;AAoCD,wDAAwD;AACxD,wBAAsB,UAAU,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAOtE;AAED,iDAAiD;AACjD,wBAAsB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAQzE;AAED,wEAAwE;AACxE,wBAAsB,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAUvE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,YAAY,GAAE,MAAM,GAAG,IAAW,GAAG,UAAU,CAmBxE"}
@@ -118,6 +118,8 @@ function rowToEditorPage(doc) {
118
118
  updatedAt: doc.updatedAt ?? null,
119
119
  scheduledAt: doc.scheduledAt ?? null,
120
120
  scheduledUnpublishAt: doc.scheduledUnpublishAt ?? null,
121
+ authorName: typeof data.authorName === 'string' ? data.authorName : '',
122
+ authorId: typeof data.authorId === 'string' ? data.authorId : '',
121
123
  builderOwned,
122
124
  };
123
125
  }
@@ -145,6 +147,8 @@ function toWriteBody(page, extra) {
145
147
  sections: page.sections.map(({ unmanaged: _unmanaged, ...rest }) => rest),
146
148
  metaTitle: page.seoTitle,
147
149
  metaDescription: page.seoDescription,
150
+ authorName: page.authorName,
151
+ authorId: page.authorId,
148
152
  ...extra,
149
153
  };
150
154
  return JSON.stringify(payload);
@@ -203,6 +207,8 @@ export function emptyPage(parentPageId = null) {
203
207
  updatedAt: null,
204
208
  scheduledAt: null,
205
209
  scheduledUnpublishAt: null,
210
+ authorName: '',
211
+ authorId: '',
206
212
  builderOwned: false,
207
213
  };
208
214
  }
@@ -1 +1 @@
1
- {"version":3,"file":"page-editor-service.js","sourceRoot":"","sources":["../../src/lib/page-editor-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"page-editor-service.js","sourceRoot":"","sources":["../../src/lib/page-editor-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * The 301 an editor owes the web when a published page moves.
3
+ *
4
+ * ── Why this is offered rather than assumed ───────────────────────────────
5
+ *
6
+ * Changing the slug of a page that is already live breaks every inbound link
7
+ * to it — search results, other sites, someone's bookmarks — and the CMS is the
8
+ * only party that knows the old address. Leaving the editor to remember it
9
+ * afterwards means the 404s are discovered by visitors.
10
+ *
11
+ * It is offered rather than created silently because a redirect is a public,
12
+ * durable artifact: it outlives the page, and a wrong one is harder to notice
13
+ * than a missing one. The editor sees `old → new` and decides.
14
+ */
15
+ export interface SlugChange {
16
+ from: string;
17
+ to: string;
18
+ }
19
+ /**
20
+ * The move worth redirecting, or `null`.
21
+ *
22
+ * `null` when the page has never been live (nothing out there points at the old
23
+ * path), when the path is unchanged, or when either side is empty — a redirect
24
+ * from or to nothing is not a redirect, and posting one would put a broken rule
25
+ * in a table that runs on every request.
26
+ */
27
+ export declare function pendingSlugChange(publishedPath: string | null, currentPath: string): SlugChange | null;
28
+ /**
29
+ * Create the 301.
30
+ *
31
+ * Failure is reported, never swallowed. The page has already moved by the time
32
+ * this runs, so a silently-failed redirect leaves exactly the broken links the
33
+ * switch promised to prevent — and the editor would have no reason to suspect
34
+ * it.
35
+ */
36
+ export declare function createPublishRedirect(change: SlugChange): Promise<{
37
+ error?: string;
38
+ }>;
39
+ //# sourceMappingURL=page-redirect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-redirect.d.ts","sourceRoot":"","sources":["../../src/lib/page-redirect.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,GAAG,IAAI,EAC5B,WAAW,EAAE,MAAM,GAClB,UAAU,GAAG,IAAI,CAKnB;AAED;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAY3F"}
@@ -0,0 +1,38 @@
1
+ import { cmsApi } from './api.js';
2
+ /**
3
+ * The move worth redirecting, or `null`.
4
+ *
5
+ * `null` when the page has never been live (nothing out there points at the old
6
+ * path), when the path is unchanged, or when either side is empty — a redirect
7
+ * from or to nothing is not a redirect, and posting one would put a broken rule
8
+ * in a table that runs on every request.
9
+ */
10
+ export function pendingSlugChange(publishedPath, currentPath) {
11
+ const from = (publishedPath ?? '').trim();
12
+ const to = currentPath.trim();
13
+ if (!from || !to || from === to)
14
+ return null;
15
+ return { from, to };
16
+ }
17
+ /**
18
+ * Create the 301.
19
+ *
20
+ * Failure is reported, never swallowed. The page has already moved by the time
21
+ * this runs, so a silently-failed redirect leaves exactly the broken links the
22
+ * switch promised to prevent — and the editor would have no reason to suspect
23
+ * it.
24
+ */
25
+ export async function createPublishRedirect(change) {
26
+ const res = await cmsApi('/redirects', {
27
+ method: 'POST',
28
+ body: JSON.stringify({
29
+ source: change.from,
30
+ destination: change.to,
31
+ statusCode: 301,
32
+ source_kind: 'manual',
33
+ notes: 'Created automatically when the page slug changed on publish.',
34
+ }),
35
+ });
36
+ return res.error ? { error: res.error } : {};
37
+ }
38
+ //# sourceMappingURL=page-redirect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-redirect.js","sourceRoot":"","sources":["../../src/lib/page-redirect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAqBjC;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,aAA4B,EAC5B,WAAmB;IAEnB,MAAM,IAAI,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA;IACzC,MAAM,EAAE,GAAG,WAAW,CAAC,IAAI,EAAE,CAAA;IAC7B,IAAI,CAAC,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,KAAK,EAAE;QAAE,OAAO,IAAI,CAAA;IAC5C,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAA;AACrB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,MAAkB;IAC5D,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,YAAY,EAAE;QACrC,MAAM,EAAE,MAAM;QACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;YACnB,MAAM,EAAE,MAAM,CAAC,IAAI;YACnB,WAAW,EAAE,MAAM,CAAC,EAAE;YACtB,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,QAAQ;YACrB,KAAK,EAAE,8DAA8D;SACtE,CAAC;KACH,CAAC,CAAA;IACF,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;AAC9C,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Editor rail sizing — pure logic, no DOM, so the clamping and persistence
3
+ * rules are testable without mounting a resizable panel.
4
+ */
5
+ export declare const RAIL_MIN_WIDTH = 300;
6
+ export declare const RAIL_MAX_WIDTH = 620;
7
+ export declare const RAIL_DEFAULT_WIDTH = 360;
8
+ /** Width of the strip that replaces the rail when it is collapsed. */
9
+ export declare const RAIL_COLLAPSED_WIDTH = 38;
10
+ export declare const RAIL_WIDTH_STORAGE_KEY = "pb.panelW";
11
+ /** Constrain a candidate width to the rail's range, rejecting junk. */
12
+ export declare function clampRailWidth(width: number): number;
13
+ /**
14
+ * Read the persisted width. Anything unreadable — no storage, a value written
15
+ * by an older build, a user editing localStorage — falls back to the default
16
+ * rather than throwing or producing a broken layout.
17
+ *
18
+ * Storage access is wrapped: Safari in private mode throws on `getItem`, and a
19
+ * rail that cannot size itself must not take down the editor.
20
+ */
21
+ export declare function readRailWidth(storage?: Pick<Storage, 'getItem'>): number;
22
+ export declare function writeRailWidth(width: number, storage?: Pick<Storage, 'setItem'>): void;
23
+ //# sourceMappingURL=rail-width.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rail-width.d.ts","sourceRoot":"","sources":["../../src/lib/rail-width.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,cAAc,MAAM,CAAA;AACjC,eAAO,MAAM,cAAc,MAAM,CAAA;AACjC,eAAO,MAAM,kBAAkB,MAAM,CAAA;AAErC,sEAAsE;AACtE,eAAO,MAAM,oBAAoB,KAAK,CAAA;AAEtC,eAAO,MAAM,sBAAsB,cAAc,CAAA;AAEjD,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGpD;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,MAAM,CAWxE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,GAAG,IAAI,CAQtF"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Editor rail sizing — pure logic, no DOM, so the clamping and persistence
3
+ * rules are testable without mounting a resizable panel.
4
+ */
5
+ export const RAIL_MIN_WIDTH = 300;
6
+ export const RAIL_MAX_WIDTH = 620;
7
+ export const RAIL_DEFAULT_WIDTH = 360;
8
+ /** Width of the strip that replaces the rail when it is collapsed. */
9
+ export const RAIL_COLLAPSED_WIDTH = 38;
10
+ export const RAIL_WIDTH_STORAGE_KEY = 'pb.panelW';
11
+ /** Constrain a candidate width to the rail's range, rejecting junk. */
12
+ export function clampRailWidth(width) {
13
+ if (!Number.isFinite(width))
14
+ return RAIL_DEFAULT_WIDTH;
15
+ return Math.min(RAIL_MAX_WIDTH, Math.max(RAIL_MIN_WIDTH, Math.round(width)));
16
+ }
17
+ /**
18
+ * Read the persisted width. Anything unreadable — no storage, a value written
19
+ * by an older build, a user editing localStorage — falls back to the default
20
+ * rather than throwing or producing a broken layout.
21
+ *
22
+ * Storage access is wrapped: Safari in private mode throws on `getItem`, and a
23
+ * rail that cannot size itself must not take down the editor.
24
+ */
25
+ export function readRailWidth(storage) {
26
+ const store = storage ?? safeStorage();
27
+ if (!store)
28
+ return RAIL_DEFAULT_WIDTH;
29
+ try {
30
+ const raw = store.getItem(RAIL_WIDTH_STORAGE_KEY);
31
+ if (raw === null)
32
+ return RAIL_DEFAULT_WIDTH;
33
+ const parsed = Number.parseInt(raw, 10);
34
+ return Number.isNaN(parsed) ? RAIL_DEFAULT_WIDTH : clampRailWidth(parsed);
35
+ }
36
+ catch {
37
+ return RAIL_DEFAULT_WIDTH;
38
+ }
39
+ }
40
+ export function writeRailWidth(width, storage) {
41
+ const store = storage ?? safeStorage();
42
+ if (!store)
43
+ return;
44
+ try {
45
+ store.setItem(RAIL_WIDTH_STORAGE_KEY, String(clampRailWidth(width)));
46
+ }
47
+ catch {
48
+ // Quota or private-mode failure. The width still applies for this session.
49
+ }
50
+ }
51
+ function safeStorage() {
52
+ try {
53
+ return typeof localStorage === 'undefined' ? null : localStorage;
54
+ }
55
+ catch {
56
+ return null;
57
+ }
58
+ }
59
+ //# sourceMappingURL=rail-width.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rail-width.js","sourceRoot":"","sources":["../../src/lib/rail-width.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;AACjC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;AACjC,MAAM,CAAC,MAAM,kBAAkB,GAAG,GAAG,CAAA;AAErC,sEAAsE;AACtE,MAAM,CAAC,MAAM,oBAAoB,GAAG,EAAE,CAAA;AAEtC,MAAM,CAAC,MAAM,sBAAsB,GAAG,WAAW,CAAA;AAEjD,uEAAuE;AACvE,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,kBAAkB,CAAA;IACtD,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAC9E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,aAAa,CAAC,OAAkC;IAC9D,MAAM,KAAK,GAAG,OAAO,IAAI,WAAW,EAAE,CAAA;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,kBAAkB,CAAA;IACrC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAA;QACjD,IAAI,GAAG,KAAK,IAAI;YAAE,OAAO,kBAAkB,CAAA;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;QACvC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAA;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,kBAAkB,CAAA;IAC3B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,OAAkC;IAC9E,MAAM,KAAK,GAAG,OAAO,IAAI,WAAW,EAAE,CAAA;IACtC,IAAI,CAAC,KAAK;QAAE,OAAM;IAClB,IAAI,CAAC;QACH,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,2EAA2E;IAC7E,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,OAAO,OAAO,YAAY,KAAK,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAA;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC"}
@@ -0,0 +1,45 @@
1
+ import type { PageSection } from '@prenta/core/page-sections';
2
+ /**
3
+ * The content a page's sections had when they were last live.
4
+ *
5
+ * ── What "baseline" means here, and why ───────────────────────────────────
6
+ *
7
+ * The guard answers "will this edit change how the live page wraps?" — so the
8
+ * baseline has to be what is actually on the site, not what was last saved.
9
+ *
10
+ * This CMS has no draft/published split: a document carries one `status` and
11
+ * saving a PUBLISHED page updates the live content in place. So for a published
12
+ * page the live content is whatever the editor loaded, refreshed on every save
13
+ * and publish. For a page that has never been published there is no baseline at
14
+ * all, and the guard reports line counts without deltas — correctly, because
15
+ * there is no live layout to break.
16
+ *
17
+ * Deliberately NOT sourced from the versions API. Versions do hold full
18
+ * snapshots, but they record every update, so finding "the published one" means
19
+ * scanning history and guessing which entry was live — an extra request and a
20
+ * heuristic, to reconstruct something the editor already has in hand.
21
+ */
22
+ export interface ReflowBaseline {
23
+ byId: Map<string, Record<string, unknown>>;
24
+ }
25
+ /**
26
+ * Snapshot section content, or `null` when the page is not live.
27
+ *
28
+ * `null` rather than an empty snapshot: an empty baseline would read as "every
29
+ * field was previously blank" and flag every line of existing copy as newly
30
+ * added.
31
+ */
32
+ export declare function snapshotBaseline(sections: readonly PageSection[], status: string): ReflowBaseline | null;
33
+ /**
34
+ * Resolve a `data-cms-field` path against a baseline.
35
+ *
36
+ * Paths are dotted and may index arrays (`stats.0.label`), matching the markers
37
+ * the renderers emit.
38
+ *
39
+ * Returns `undefined` for anything that is not baseline text — no snapshot, a
40
+ * section added since publish, a field that did not exist, or a non-string
41
+ * value. The guard reads `undefined` as "nothing to compare against" and
42
+ * reports no delta, which is the truthful answer in every one of those cases.
43
+ */
44
+ export declare function baselineFieldText(baseline: ReflowBaseline | null, sectionId: string, fieldPath: string): string | undefined;
45
+ //# sourceMappingURL=reflow-baseline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflow-baseline.d.ts","sourceRoot":"","sources":["../../src/lib/reflow-baseline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAA;AAE7D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAC3C;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,SAAS,WAAW,EAAE,EAChC,MAAM,EAAE,MAAM,GACb,cAAc,GAAG,IAAI,CAKvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,cAAc,GAAG,IAAI,EAC/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,MAAM,GAAG,SAAS,CAWpB"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Snapshot section content, or `null` when the page is not live.
3
+ *
4
+ * `null` rather than an empty snapshot: an empty baseline would read as "every
5
+ * field was previously blank" and flag every line of existing copy as newly
6
+ * added.
7
+ */
8
+ export function snapshotBaseline(sections, status) {
9
+ if (status !== 'PUBLISHED')
10
+ return null;
11
+ return {
12
+ byId: new Map(sections.map((s) => [s.id, { ...(s.content ?? {}) }])),
13
+ };
14
+ }
15
+ /**
16
+ * Resolve a `data-cms-field` path against a baseline.
17
+ *
18
+ * Paths are dotted and may index arrays (`stats.0.label`), matching the markers
19
+ * the renderers emit.
20
+ *
21
+ * Returns `undefined` for anything that is not baseline text — no snapshot, a
22
+ * section added since publish, a field that did not exist, or a non-string
23
+ * value. The guard reads `undefined` as "nothing to compare against" and
24
+ * reports no delta, which is the truthful answer in every one of those cases.
25
+ */
26
+ export function baselineFieldText(baseline, sectionId, fieldPath) {
27
+ const content = baseline?.byId.get(sectionId);
28
+ if (!content)
29
+ return undefined;
30
+ let cursor = content;
31
+ for (const key of fieldPath.split('.')) {
32
+ if (cursor === null || typeof cursor !== 'object')
33
+ return undefined;
34
+ cursor = cursor[key];
35
+ }
36
+ return typeof cursor === 'string' ? cursor : undefined;
37
+ }
38
+ //# sourceMappingURL=reflow-baseline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reflow-baseline.js","sourceRoot":"","sources":["../../src/lib/reflow-baseline.ts"],"names":[],"mappings":"AA0BA;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgC,EAChC,MAAc;IAEd,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,IAAI,CAAA;IACvC,OAAO;QACL,IAAI,EAAE,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;KACrE,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,iBAAiB,CAC/B,QAA+B,EAC/B,SAAiB,EACjB,SAAiB;IAEjB,MAAM,OAAO,GAAG,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAC7C,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IAE9B,IAAI,MAAM,GAAY,OAAO,CAAA;IAC7B,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACvC,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAA;QACnE,MAAM,GAAI,MAAkC,CAAC,GAAG,CAAC,CAAA;IACnD,CAAC;IAED,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;AACxD,CAAC"}