@pantheon-systems/puck-css 0.7.0 → 0.9.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 (433) hide show
  1. package/dist/agent/useAgentEdit.d.ts.map +1 -1
  2. package/dist/agent/useAgentEdit.js.map +1 -1
  3. package/dist/agent/useAgentTrigger.d.ts.map +1 -1
  4. package/dist/agent/useAgentTrigger.js.map +1 -1
  5. package/dist/auth/AuthGate.d.ts +1 -1
  6. package/dist/auth/AuthGate.d.ts.map +1 -1
  7. package/dist/collaboration/utils/avatarColor.d.ts +2 -8
  8. package/dist/collaboration/utils/avatarColor.d.ts.map +1 -1
  9. package/dist/collaboration/utils/avatarColor.js +4 -31
  10. package/dist/collaboration/utils/avatarColor.js.map +1 -1
  11. package/dist/collaboration/utils/focusHighlightConfig.d.ts.map +1 -1
  12. package/dist/collaboration/utils/focusHighlightConfig.js.map +1 -1
  13. package/dist/collaboration/utils/initials.d.ts +2 -0
  14. package/dist/collaboration/utils/initials.d.ts.map +1 -0
  15. package/dist/collaboration/utils/initials.js +27 -0
  16. package/dist/collaboration/utils/initials.js.map +1 -0
  17. package/dist/collaboration/utils/presenceIdentity.d.ts +29 -0
  18. package/dist/collaboration/utils/presenceIdentity.d.ts.map +1 -0
  19. package/dist/collaboration/utils/presenceIdentity.js +42 -0
  20. package/dist/collaboration/utils/presenceIdentity.js.map +1 -0
  21. package/dist/core/config.d.ts +2 -2
  22. package/dist/core/config.d.ts.map +1 -1
  23. package/dist/core/config.js +1 -1
  24. package/dist/core/config.js.map +1 -1
  25. package/dist/core/types.d.ts +21 -4
  26. package/dist/core/types.d.ts.map +1 -1
  27. package/dist/data/css-queries/css-query-registry.d.ts +11 -0
  28. package/dist/data/css-queries/css-query-registry.d.ts.map +1 -0
  29. package/dist/data/css-queries/css-query-registry.js +28 -0
  30. package/dist/data/css-queries/css-query-registry.js.map +1 -0
  31. package/dist/data/dal/index.d.ts +1 -1
  32. package/dist/data/dal/index.d.ts.map +1 -1
  33. package/dist/data/dal/init.d.ts +5 -0
  34. package/dist/data/dal/init.d.ts.map +1 -1
  35. package/dist/data/dal/init.js +31 -4
  36. package/dist/data/dal/init.js.map +1 -1
  37. package/dist/data/dal/p1-store.d.ts +23 -0
  38. package/dist/data/dal/p1-store.d.ts.map +1 -1
  39. package/dist/data/dal/p1-store.js +14 -1
  40. package/dist/data/dal/p1-store.js.map +1 -1
  41. package/dist/data/page-editor-meta.d.ts.map +1 -1
  42. package/dist/data/page-editor-meta.js +0 -1
  43. package/dist/data/page-editor-meta.js.map +1 -1
  44. package/dist/data/query-provider.d.ts +1 -1
  45. package/dist/data/query-provider.d.ts.map +1 -1
  46. package/dist/data/remote-datasources/fetch-http-json.d.ts.map +1 -1
  47. package/dist/data/remote-datasources/fetch-http-json.js.map +1 -1
  48. package/dist/data/remote-datasources/loader.js +1 -1
  49. package/dist/data/remote-datasources/loader.js.map +1 -1
  50. package/dist/data/resolve-data-templates.d.ts.map +1 -1
  51. package/dist/data/resolve-data-templates.js +26 -4
  52. package/dist/data/resolve-data-templates.js.map +1 -1
  53. package/dist/editor/P1App.d.ts.map +1 -1
  54. package/dist/editor/P1App.js +1 -1
  55. package/dist/editor/P1App.js.map +1 -1
  56. package/dist/editor/P1PuckProvider.d.ts.map +1 -1
  57. package/dist/editor/P1PuckProvider.js +174 -57
  58. package/dist/editor/P1PuckProvider.js.map +1 -1
  59. package/dist/editor/aiPanelStore.d.ts +15 -0
  60. package/dist/editor/aiPanelStore.d.ts.map +1 -0
  61. package/dist/editor/aiPanelStore.js +43 -0
  62. package/dist/editor/aiPanelStore.js.map +1 -0
  63. package/dist/editor/components/CollapsibleFieldSection.d.ts +10 -0
  64. package/dist/editor/components/CollapsibleFieldSection.d.ts.map +1 -0
  65. package/dist/editor/components/CollapsibleFieldSection.js +9 -0
  66. package/dist/editor/components/CollapsibleFieldSection.js.map +1 -0
  67. package/dist/editor/components/CollapsibleSection.module.css +70 -0
  68. package/dist/editor/components/CollapsibleSectionHeader.d.ts +20 -0
  69. package/dist/editor/components/CollapsibleSectionHeader.d.ts.map +1 -0
  70. package/dist/editor/components/CollapsibleSectionHeader.js +10 -0
  71. package/dist/editor/components/CollapsibleSectionHeader.js.map +1 -0
  72. package/dist/editor/components/DraggableRow.d.ts +13 -0
  73. package/dist/editor/components/DraggableRow.d.ts.map +1 -0
  74. package/dist/editor/components/DraggableRow.js +20 -0
  75. package/dist/editor/components/DraggableRow.js.map +1 -0
  76. package/dist/editor/components/FieldHelpText.d.ts +6 -0
  77. package/dist/editor/components/FieldHelpText.d.ts.map +1 -0
  78. package/dist/editor/components/FieldHelpText.js +6 -0
  79. package/dist/editor/components/FieldHelpText.js.map +1 -0
  80. package/dist/editor/components/FieldHelpText.module.css +13 -0
  81. package/dist/editor/components/InspectorTabHeader.d.ts +18 -0
  82. package/dist/editor/components/InspectorTabHeader.d.ts.map +1 -0
  83. package/dist/editor/components/InspectorTabHeader.js +16 -0
  84. package/dist/editor/components/InspectorTabHeader.js.map +1 -0
  85. package/dist/editor/components/OutlinePanel.d.ts +10 -0
  86. package/dist/editor/components/OutlinePanel.d.ts.map +1 -0
  87. package/dist/editor/components/OutlinePanel.js +64 -0
  88. package/dist/editor/components/OutlinePanel.js.map +1 -0
  89. package/dist/editor/components/OutlinePanel.module.css +111 -0
  90. package/dist/editor/components/P1InspectorFields.d.ts +16 -0
  91. package/dist/editor/components/P1InspectorFields.d.ts.map +1 -0
  92. package/dist/editor/components/P1InspectorFields.js +61 -0
  93. package/dist/editor/components/P1InspectorFields.js.map +1 -0
  94. package/dist/editor/components/P1TemplateFields.d.ts +11 -0
  95. package/dist/editor/components/P1TemplateFields.d.ts.map +1 -0
  96. package/dist/editor/components/P1TemplateFields.js +52 -0
  97. package/dist/editor/components/P1TemplateFields.js.map +1 -0
  98. package/dist/editor/components/PanelHeader.d.ts +25 -0
  99. package/dist/editor/components/PanelHeader.d.ts.map +1 -0
  100. package/dist/editor/components/PanelHeader.js +12 -0
  101. package/dist/editor/components/PanelHeader.js.map +1 -0
  102. package/dist/editor/components/PanelHeader.module.css +34 -0
  103. package/dist/editor/components/PanelShell.d.ts +10 -0
  104. package/dist/editor/components/PanelShell.d.ts.map +1 -0
  105. package/dist/editor/components/PanelShell.js +7 -0
  106. package/dist/editor/components/PanelShell.js.map +1 -0
  107. package/dist/editor/components/PanelShell.module.css +15 -0
  108. package/dist/editor/components/PreviewPanelOverlay.d.ts +12 -0
  109. package/dist/editor/components/PreviewPanelOverlay.d.ts.map +1 -0
  110. package/dist/editor/components/PreviewPanelOverlay.js +7 -0
  111. package/dist/editor/components/PreviewPanelOverlay.js.map +1 -0
  112. package/dist/editor/components/PublishedStatusBadge.d.ts +1 -1
  113. package/dist/editor/components/PublishedStatusBadge.d.ts.map +1 -1
  114. package/dist/editor/components/VersionBannerOverride.d.ts +5 -1
  115. package/dist/editor/components/VersionBannerOverride.d.ts.map +1 -1
  116. package/dist/editor/components/VersionBannerOverride.js +24 -7
  117. package/dist/editor/components/VersionBannerOverride.js.map +1 -1
  118. package/dist/editor/components/VersionTimeline.d.ts +20 -0
  119. package/dist/editor/components/VersionTimeline.d.ts.map +1 -0
  120. package/dist/editor/components/VersionTimeline.js +42 -0
  121. package/dist/editor/components/VersionTimeline.js.map +1 -0
  122. package/dist/editor/components/collapsibleSectionContext.d.ts +17 -0
  123. package/dist/editor/components/collapsibleSectionContext.d.ts.map +1 -0
  124. package/dist/editor/components/collapsibleSectionContext.js +13 -0
  125. package/dist/editor/components/collapsibleSectionContext.js.map +1 -0
  126. package/dist/editor/components/componentIconName.d.ts +15 -0
  127. package/dist/editor/components/componentIconName.d.ts.map +1 -0
  128. package/dist/editor/components/componentIconName.js +68 -0
  129. package/dist/editor/components/componentIconName.js.map +1 -0
  130. package/dist/editor/components/connectable.d.ts +1 -1
  131. package/dist/editor/components/connectable.d.ts.map +1 -1
  132. package/dist/editor/components/merge-preview/MergePreviewPanel.d.ts.map +1 -1
  133. package/dist/editor/components/merge-preview/MergePreviewPanel.js.map +1 -1
  134. package/dist/editor/components/merge-preview/MergePreviewRenderer.js +3 -15
  135. package/dist/editor/components/merge-preview/MergePreviewRenderer.js.map +1 -1
  136. package/dist/editor/components/outlineTree.d.ts +68 -0
  137. package/dist/editor/components/outlineTree.d.ts.map +1 -0
  138. package/dist/editor/components/outlineTree.js +72 -0
  139. package/dist/editor/components/outlineTree.js.map +1 -0
  140. package/dist/editor/components/useDragReorder.d.ts +16 -0
  141. package/dist/editor/components/useDragReorder.d.ts.map +1 -0
  142. package/dist/editor/components/useDragReorder.js +35 -0
  143. package/dist/editor/components/useDragReorder.js.map +1 -0
  144. package/dist/editor/index.d.ts +13 -0
  145. package/dist/editor/index.d.ts.map +1 -1
  146. package/dist/editor/index.js +8 -0
  147. package/dist/editor/index.js.map +1 -1
  148. package/dist/editor/plugin/P1Plugin.d.ts +25 -2
  149. package/dist/editor/plugin/P1Plugin.d.ts.map +1 -1
  150. package/dist/editor/plugin/P1Plugin.js +147 -63
  151. package/dist/editor/plugin/P1Plugin.js.map +1 -1
  152. package/dist/editor/plugin/context-sync-key.d.ts +30 -0
  153. package/dist/editor/plugin/context-sync-key.d.ts.map +1 -0
  154. package/dist/editor/plugin/context-sync-key.js +36 -0
  155. package/dist/editor/plugin/context-sync-key.js.map +1 -0
  156. package/dist/editor/plugin/createP1Overrides.d.ts +33 -50
  157. package/dist/editor/plugin/createP1Overrides.d.ts.map +1 -1
  158. package/dist/editor/plugin/createP1Overrides.js +54 -112
  159. package/dist/editor/plugin/createP1Overrides.js.map +1 -1
  160. package/dist/editor/plugin/document-sync-plugin.d.ts +35 -0
  161. package/dist/editor/plugin/document-sync-plugin.d.ts.map +1 -0
  162. package/dist/editor/plugin/document-sync-plugin.js +130 -0
  163. package/dist/editor/plugin/document-sync-plugin.js.map +1 -0
  164. package/dist/editor/plugin/fieldGuidance.d.ts +45 -0
  165. package/dist/editor/plugin/fieldGuidance.d.ts.map +1 -0
  166. package/dist/editor/plugin/fieldGuidance.js +24 -0
  167. package/dist/editor/plugin/fieldGuidance.js.map +1 -0
  168. package/dist/editor/plugin/mergePreviewPlugin.d.ts.map +1 -1
  169. package/dist/editor/plugin/mergePreviewPlugin.js.map +1 -1
  170. package/dist/editor/plugin/selectHeaderCollaborators.d.ts +12 -0
  171. package/dist/editor/plugin/selectHeaderCollaborators.d.ts.map +1 -0
  172. package/dist/editor/plugin/selectHeaderCollaborators.js +15 -0
  173. package/dist/editor/plugin/selectHeaderCollaborators.js.map +1 -0
  174. package/dist/editor/thumbnails/LiveThumbnail.d.ts +47 -0
  175. package/dist/editor/thumbnails/LiveThumbnail.d.ts.map +1 -0
  176. package/dist/editor/thumbnails/LiveThumbnail.js +120 -0
  177. package/dist/editor/thumbnails/LiveThumbnail.js.map +1 -0
  178. package/dist/editor/thumbnails/ThumbnailCard.d.ts +37 -0
  179. package/dist/editor/thumbnails/ThumbnailCard.d.ts.map +1 -0
  180. package/dist/editor/thumbnails/ThumbnailCard.js +91 -0
  181. package/dist/editor/thumbnails/ThumbnailCard.js.map +1 -0
  182. package/dist/editor/thumbnails/buildLiveThumbnailDrawer.d.ts +33 -0
  183. package/dist/editor/thumbnails/buildLiveThumbnailDrawer.d.ts.map +1 -0
  184. package/dist/editor/thumbnails/buildLiveThumbnailDrawer.js +79 -0
  185. package/dist/editor/thumbnails/buildLiveThumbnailDrawer.js.map +1 -0
  186. package/dist/editor/thumbnails/humanizeComponentName.d.ts +18 -0
  187. package/dist/editor/thumbnails/humanizeComponentName.d.ts.map +1 -0
  188. package/dist/editor/thumbnails/humanizeComponentName.js +32 -0
  189. package/dist/editor/thumbnails/humanizeComponentName.js.map +1 -0
  190. package/dist/editor/thumbnails/resolveLiveThumbnailDrawer.d.ts +15 -0
  191. package/dist/editor/thumbnails/resolveLiveThumbnailDrawer.d.ts.map +1 -0
  192. package/dist/editor/thumbnails/resolveLiveThumbnailDrawer.js +19 -0
  193. package/dist/editor/thumbnails/resolveLiveThumbnailDrawer.js.map +1 -0
  194. package/dist/editor/thumbnails/thumbnailCache.d.ts +39 -0
  195. package/dist/editor/thumbnails/thumbnailCache.d.ts.map +1 -0
  196. package/dist/editor/thumbnails/thumbnailCache.js +97 -0
  197. package/dist/editor/thumbnails/thumbnailCache.js.map +1 -0
  198. package/dist/editor/useDocuments.d.ts.map +1 -1
  199. package/dist/editor/useDocuments.js +27 -15
  200. package/dist/editor/useDocuments.js.map +1 -1
  201. package/dist/editor/useP1Editor.d.ts +15 -13
  202. package/dist/editor/useP1Editor.d.ts.map +1 -1
  203. package/dist/editor/useP1Editor.js +97 -20
  204. package/dist/editor/useP1Editor.js.map +1 -1
  205. package/dist/editor/useP1Overrides.d.ts +1 -1
  206. package/dist/editor/useP1Overrides.d.ts.map +1 -1
  207. package/dist/editor/useP1Overrides.js.map +1 -1
  208. package/dist/editor/useP1Plugin.d.ts +20 -2
  209. package/dist/editor/useP1Plugin.d.ts.map +1 -1
  210. package/dist/editor/useP1Plugin.js +5 -0
  211. package/dist/editor/useP1Plugin.js.map +1 -1
  212. package/dist/editor/useRealtime.d.ts +2 -2
  213. package/dist/editor/useRealtime.d.ts.map +1 -1
  214. package/dist/editor/useRealtime.js.map +1 -1
  215. package/dist/editor/utils/componentRegistry.d.ts +4 -4
  216. package/dist/editor/utils/componentRegistry.d.ts.map +1 -1
  217. package/dist/editor/utils/componentRegistry.js +0 -1
  218. package/dist/editor/utils/componentRegistry.js.map +1 -1
  219. package/dist/editor/utils/puckYjsBinding.d.ts.map +1 -1
  220. package/dist/editor/utils/puckYjsBinding.js +6 -4
  221. package/dist/editor/utils/puckYjsBinding.js.map +1 -1
  222. package/dist/editor/utils/restoreDocumentVersion.d.ts +18 -0
  223. package/dist/editor/utils/restoreDocumentVersion.d.ts.map +1 -0
  224. package/dist/editor/utils/restoreDocumentVersion.js +49 -0
  225. package/dist/editor/utils/restoreDocumentVersion.js.map +1 -0
  226. package/dist/editor/utils/sanitizeRichtextDefaults.d.ts +22 -0
  227. package/dist/editor/utils/sanitizeRichtextDefaults.d.ts.map +1 -0
  228. package/dist/editor/utils/sanitizeRichtextDefaults.js +98 -0
  229. package/dist/editor/utils/sanitizeRichtextDefaults.js.map +1 -0
  230. package/dist/editor/utils/snapshotToPuckData.d.ts +11 -0
  231. package/dist/editor/utils/snapshotToPuckData.d.ts.map +1 -0
  232. package/dist/editor/utils/snapshotToPuckData.js +27 -0
  233. package/dist/editor/utils/snapshotToPuckData.js.map +1 -0
  234. package/dist/editor/utils/syncComponentRegistry.d.ts.map +1 -1
  235. package/dist/editor/utils/syncComponentRegistry.js +32 -6
  236. package/dist/editor/utils/syncComponentRegistry.js.map +1 -1
  237. package/dist/editor/utils/templatePath.d.ts +8 -0
  238. package/dist/editor/utils/templatePath.d.ts.map +1 -0
  239. package/dist/editor/utils/templatePath.js +14 -0
  240. package/dist/editor/utils/templatePath.js.map +1 -0
  241. package/dist/features/content-type-templates/permissions/createPuckPermissions.d.ts +10 -7
  242. package/dist/features/content-type-templates/permissions/createPuckPermissions.d.ts.map +1 -1
  243. package/dist/features/content-type-templates/permissions/createPuckPermissions.js +27 -8
  244. package/dist/features/content-type-templates/permissions/createPuckPermissions.js.map +1 -1
  245. package/dist/features/content-type-templates/stores/template-store-api.d.ts.map +1 -1
  246. package/dist/features/content-type-templates/ui/ActionBarPinButton.d.ts.map +1 -1
  247. package/dist/features/content-type-templates/ui/ActionBarPinButton.js +1 -1
  248. package/dist/features/content-type-templates/ui/ActionBarPinButton.js.map +1 -1
  249. package/dist/features/content-type-templates/validation/structural-validation.d.ts +4 -4
  250. package/dist/features/content-type-templates/validation/structural-validation.d.ts.map +1 -1
  251. package/dist/features/content-type-templates/validation/structural-validation.js +123 -50
  252. package/dist/features/content-type-templates/validation/structural-validation.js.map +1 -1
  253. package/dist/index.d.ts +10 -2
  254. package/dist/index.d.ts.map +1 -1
  255. package/dist/index.js +10 -2
  256. package/dist/index.js.map +1 -1
  257. package/dist/merge/components/merge-resolution/CherryPickVisualPanel.js +1 -3
  258. package/dist/merge/components/merge-resolution/CherryPickVisualPanel.js.map +1 -1
  259. package/dist/merge/components/merge-resolution/DocumentResolutionDetail.js +2 -2
  260. package/dist/merge/components/merge-resolution/DocumentResolutionDetail.js.map +1 -1
  261. package/dist/p1/editor/client.d.ts +1 -1
  262. package/dist/p1/editor/client.d.ts.map +1 -1
  263. package/dist/p1/editor/client.js +3 -3
  264. package/dist/p1/editor/client.js.map +1 -1
  265. package/dist/p1/editor/connect/connect-field-modal.d.ts +1 -1
  266. package/dist/p1/editor/connect/connect-field-modal.d.ts.map +1 -1
  267. package/dist/p1/editor/connect/connect-field-modal.js +2 -2
  268. package/dist/p1/editor/connect/connect-field-modal.js.map +1 -1
  269. package/dist/p1/editor/connect/connect-preview-config.d.ts +1 -1
  270. package/dist/p1/editor/connect/connect-preview-config.d.ts.map +1 -1
  271. package/dist/p1/editor/connect/field-connect-plugin.js +1 -1
  272. package/dist/p1/editor/connect/field-connect-plugin.js.map +1 -1
  273. package/dist/p1/editor/editor-preview-resolve.d.ts +7 -1
  274. package/dist/p1/editor/editor-preview-resolve.d.ts.map +1 -1
  275. package/dist/p1/editor/editor-preview-resolve.js +9 -2
  276. package/dist/p1/editor/editor-preview-resolve.js.map +1 -1
  277. package/dist/p1/editor/{hooks.d.ts → hooks/api-hooks.d.ts} +9 -20
  278. package/dist/p1/editor/hooks/api-hooks.d.ts.map +1 -0
  279. package/dist/p1/editor/{hooks.js → hooks/api-hooks.js} +72 -57
  280. package/dist/p1/editor/hooks/api-hooks.js.map +1 -0
  281. package/dist/p1/editor/hooks/index.d.ts +4 -0
  282. package/dist/p1/editor/hooks/index.d.ts.map +1 -0
  283. package/dist/p1/editor/hooks/index.js +4 -0
  284. package/dist/p1/editor/hooks/index.js.map +1 -0
  285. package/dist/p1/editor/hooks/useEditorContext.d.ts +13 -0
  286. package/dist/p1/editor/hooks/useEditorContext.d.ts.map +1 -0
  287. package/dist/p1/editor/hooks/useEditorContext.js +25 -0
  288. package/dist/p1/editor/hooks/useEditorContext.js.map +1 -0
  289. package/dist/p1/editor/hooks/useP1Plugins.d.ts +3 -0
  290. package/dist/p1/editor/hooks/useP1Plugins.d.ts.map +1 -0
  291. package/dist/p1/editor/hooks/useP1Plugins.js +33 -0
  292. package/dist/p1/editor/hooks/useP1Plugins.js.map +1 -0
  293. package/dist/p1/editor/icons/button-block-icon.d.ts +1 -1
  294. package/dist/p1/editor/icons/button-block-icon.d.ts.map +1 -1
  295. package/dist/p1/editor/icons/default-block-icon.d.ts +1 -1
  296. package/dist/p1/editor/icons/default-block-icon.d.ts.map +1 -1
  297. package/dist/p1/editor/icons/divider-block-icon.d.ts +1 -1
  298. package/dist/p1/editor/icons/divider-block-icon.d.ts.map +1 -1
  299. package/dist/p1/editor/icons/grid-block-icon.d.ts +1 -1
  300. package/dist/p1/editor/icons/grid-block-icon.d.ts.map +1 -1
  301. package/dist/p1/editor/icons/heading-block-icon.d.ts +1 -1
  302. package/dist/p1/editor/icons/heading-block-icon.d.ts.map +1 -1
  303. package/dist/p1/editor/icons/image-block-icon.d.ts +1 -1
  304. package/dist/p1/editor/icons/image-block-icon.d.ts.map +1 -1
  305. package/dist/p1/editor/icons/list-block-icon.d.ts +1 -1
  306. package/dist/p1/editor/icons/list-block-icon.d.ts.map +1 -1
  307. package/dist/p1/editor/icons/paragraph-block-icon.d.ts +1 -1
  308. package/dist/p1/editor/icons/paragraph-block-icon.d.ts.map +1 -1
  309. package/dist/p1/editor/icons/quote-block-icon.d.ts +1 -1
  310. package/dist/p1/editor/icons/quote-block-icon.d.ts.map +1 -1
  311. package/dist/p1/editor/icons/spacer-block-icon.d.ts +1 -1
  312. package/dist/p1/editor/icons/spacer-block-icon.d.ts.map +1 -1
  313. package/dist/p1/editor/index.d.ts +2 -2
  314. package/dist/p1/editor/index.d.ts.map +1 -1
  315. package/dist/p1/editor/index.js +2 -2
  316. package/dist/p1/editor/index.js.map +1 -1
  317. package/dist/p1/editor/remote-datasources/remote-datasource-explorer-plugin.js +65 -67
  318. package/dist/p1/editor/remote-datasources/remote-datasource-explorer-plugin.js.map +1 -1
  319. package/dist/p1/editor/remote-datasources/remote-datasource-form-helpers.d.ts +4 -4
  320. package/dist/p1/editor/remote-datasources/remote-datasource-form-helpers.d.ts.map +1 -1
  321. package/dist/p1/editor/remote-datasources/remote-datasource-form-helpers.js.map +1 -1
  322. package/dist/p1/editor/remote-datasources/remote-datasource-manager.d.ts +1 -1
  323. package/dist/p1/editor/remote-datasources/remote-datasource-manager.d.ts.map +1 -1
  324. package/dist/p1/editor/remote-datasources/remote-datasource-manager.js +2 -2
  325. package/dist/p1/editor/remote-datasources/remote-datasource-manager.js.map +1 -1
  326. package/dist/p1/editor/remote-datasources/template-preview-params-toolbar.d.ts +1 -1
  327. package/dist/p1/editor/remote-datasources/template-preview-params-toolbar.d.ts.map +1 -1
  328. package/dist/p1/editor/remote-datasources/template-preview-params-toolbar.js +2 -2
  329. package/dist/p1/editor/remote-datasources/template-preview-params-toolbar.js.map +1 -1
  330. package/dist/p1/editor/template-autocomplete-layer.d.ts +2 -2
  331. package/dist/p1/editor/template-autocomplete-layer.d.ts.map +1 -1
  332. package/dist/p1/editor/template-autocomplete-layer.js +23 -3
  333. package/dist/p1/editor/template-autocomplete-layer.js.map +1 -1
  334. package/dist/p1/pages/render-client.d.ts +1 -1
  335. package/dist/p1/pages/render-client.d.ts.map +1 -1
  336. package/dist/pds/components/AgentChip.d.ts.map +1 -1
  337. package/dist/pds/components/AgentChip.js +1 -2
  338. package/dist/pds/components/AgentChip.js.map +1 -1
  339. package/dist/pds/components/CreatePageModal.d.ts +10 -1
  340. package/dist/pds/components/CreatePageModal.d.ts.map +1 -1
  341. package/dist/pds/components/CreatePageModal.js +29 -9
  342. package/dist/pds/components/CreatePageModal.js.map +1 -1
  343. package/dist/pds/components/CreatePageModal.module.css +34 -0
  344. package/dist/pds/components/DocStateBadge.d.ts +1 -1
  345. package/dist/pds/components/DocStateBadge.d.ts.map +1 -1
  346. package/dist/pds/components/DocStateBadge.js +1 -1
  347. package/dist/pds/components/DocStateBadge.js.map +1 -1
  348. package/dist/pds/components/LoadingMessage.d.ts +16 -0
  349. package/dist/pds/components/LoadingMessage.d.ts.map +1 -0
  350. package/dist/pds/components/LoadingMessage.js +6 -0
  351. package/dist/pds/components/LoadingMessage.js.map +1 -0
  352. package/dist/pds/components/LoadingMessage.module.css +44 -0
  353. package/dist/pds/components/NavIcon.js +1 -1
  354. package/dist/pds/components/NavIcon.js.map +1 -1
  355. package/dist/pds/components/P1EditorHeader.d.ts +10 -2
  356. package/dist/pds/components/P1EditorHeader.d.ts.map +1 -1
  357. package/dist/pds/components/P1EditorHeader.js +16 -7
  358. package/dist/pds/components/P1EditorHeader.js.map +1 -1
  359. package/dist/pds/components/P1EditorHeader.module.css +113 -35
  360. package/dist/pds/components/P1EditorSubheader.d.ts +1 -2
  361. package/dist/pds/components/P1EditorSubheader.d.ts.map +1 -1
  362. package/dist/pds/components/P1EditorSubheader.js +10 -21
  363. package/dist/pds/components/P1EditorSubheader.js.map +1 -1
  364. package/dist/pds/components/P1EditorSubheader.module.css +7 -1
  365. package/dist/pds/components/PageNavigator.d.ts.map +1 -1
  366. package/dist/pds/components/PageNavigator.js.map +1 -1
  367. package/dist/pds/components/PresenceStack.d.ts +6 -5
  368. package/dist/pds/components/PresenceStack.d.ts.map +1 -1
  369. package/dist/pds/components/PresenceStack.js +43 -4
  370. package/dist/pds/components/PresenceStack.js.map +1 -1
  371. package/dist/pds/components/PresenceStack.module.css +52 -7
  372. package/dist/pds/components/PublishControl.js +2 -2
  373. package/dist/pds/components/PublishControl.js.map +1 -1
  374. package/dist/pds/components/WorkstreamSwitcher.d.ts +7 -2
  375. package/dist/pds/components/WorkstreamSwitcher.d.ts.map +1 -1
  376. package/dist/pds/components/WorkstreamSwitcher.js +5 -3
  377. package/dist/pds/components/WorkstreamSwitcher.js.map +1 -1
  378. package/dist/pds/index.d.ts +2 -0
  379. package/dist/pds/index.d.ts.map +1 -1
  380. package/dist/pds/index.js +1 -0
  381. package/dist/pds/index.js.map +1 -1
  382. package/dist/pds/theme/pds-core-content.d.ts +1 -1
  383. package/dist/pds/theme/pds-core-content.d.ts.map +1 -1
  384. package/dist/pds/theme/pds-core-content.js +1 -1
  385. package/dist/pds/theme/pds-core-content.js.map +1 -1
  386. package/dist/server.d.ts +4 -1
  387. package/dist/server.d.ts.map +1 -1
  388. package/dist/server.js +4 -1
  389. package/dist/server.js.map +1 -1
  390. package/dist/versioning/components/HistoricalVersionBanner.d.ts +19 -21
  391. package/dist/versioning/components/HistoricalVersionBanner.d.ts.map +1 -1
  392. package/dist/versioning/components/HistoricalVersionBanner.js +7 -19
  393. package/dist/versioning/components/HistoricalVersionBanner.js.map +1 -1
  394. package/dist/versioning/components/ReadOnlyFieldsGuard.d.ts +14 -0
  395. package/dist/versioning/components/ReadOnlyFieldsGuard.d.ts.map +1 -0
  396. package/dist/versioning/components/ReadOnlyFieldsGuard.js +8 -0
  397. package/dist/versioning/components/ReadOnlyFieldsGuard.js.map +1 -0
  398. package/dist/versioning/components/VersionBannerActions.d.ts +15 -0
  399. package/dist/versioning/components/VersionBannerActions.d.ts.map +1 -0
  400. package/dist/versioning/components/VersionBannerActions.js +30 -0
  401. package/dist/versioning/components/VersionBannerActions.js.map +1 -0
  402. package/dist/versioning/components/VersionPublishedBadge.d.ts +1 -1
  403. package/dist/versioning/components/VersionPublishedBadge.d.ts.map +1 -1
  404. package/dist/versioning/components/VersionReadOnlyBanner.d.ts +12 -0
  405. package/dist/versioning/components/VersionReadOnlyBanner.d.ts.map +1 -0
  406. package/dist/versioning/components/VersionReadOnlyBanner.js +5 -0
  407. package/dist/versioning/components/VersionReadOnlyBanner.js.map +1 -0
  408. package/dist/versioning/components/version-compare/VisualVersionCompare.d.ts +2 -2
  409. package/dist/versioning/components/version-compare/VisualVersionCompare.d.ts.map +1 -1
  410. package/dist/versioning/index.d.ts +4 -0
  411. package/dist/versioning/index.d.ts.map +1 -1
  412. package/dist/versioning/index.js +2 -0
  413. package/dist/versioning/index.js.map +1 -1
  414. package/dist/versioning/utils/formatVersionDate.d.ts +15 -0
  415. package/dist/versioning/utils/formatVersionDate.d.ts.map +1 -0
  416. package/dist/versioning/utils/formatVersionDate.js +41 -0
  417. package/dist/versioning/utils/formatVersionDate.js.map +1 -0
  418. package/dist/versioning/utils/versionKind.d.ts +19 -0
  419. package/dist/versioning/utils/versionKind.d.ts.map +1 -0
  420. package/dist/versioning/utils/versionKind.js +30 -0
  421. package/dist/versioning/utils/versionKind.js.map +1 -0
  422. package/package.json +16 -8
  423. package/src/pds/theme/PuckEditorTheme.css +81 -0
  424. package/src/pds/theme/PuckEditorTheme.test.ts +50 -1
  425. package/src/pds/theme/pds-core-content.ts +1 -1
  426. package/src/pds/theme/pds-core.css +1 -1
  427. package/src/styles.css +693 -29
  428. package/dist/features/content-type-templates/editor/useTemplateScaffold.d.ts +0 -15
  429. package/dist/features/content-type-templates/editor/useTemplateScaffold.d.ts.map +0 -1
  430. package/dist/features/content-type-templates/editor/useTemplateScaffold.js +0 -29
  431. package/dist/features/content-type-templates/editor/useTemplateScaffold.js.map +0 -1
  432. package/dist/p1/editor/hooks.d.ts.map +0 -1
  433. package/dist/p1/editor/hooks.js.map +0 -1
@@ -0,0 +1,32 @@
1
+ /**
2
+ * humanizeComponentName
3
+ *
4
+ * Derives a human-readable label from a Puck component key for display in the
5
+ * visual component sidebar. Callers should prefer a component's explicit
6
+ * `label` when one exists and fall back to this for the raw key.
7
+ *
8
+ * Transform: strip a trailing "Block" suffix, split PascalCase (and
9
+ * digit→capital boundaries) into words, and upper-case known acronyms.
10
+ *
11
+ * "HeroBlock" -> "Hero"
12
+ * "CardGridBlock" -> "Card Grid"
13
+ * "P1WelcomeBlock" -> "P1 Welcome"
14
+ * "CtaBannerBlock" -> "CTA Banner"
15
+ * "FaqBlock" -> "FAQ"
16
+ */
17
+ /** Words (lower-cased) that should render fully upper-cased. */
18
+ const ACRONYMS = {
19
+ cta: 'CTA',
20
+ faq: 'FAQ',
21
+ };
22
+ export function humanizeComponentName(name) {
23
+ return name
24
+ .replace(/Block$/, '')
25
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
26
+ .trim()
27
+ .split(/\s+/)
28
+ .filter(Boolean)
29
+ .map((word) => ACRONYMS[word.toLowerCase()] ?? word)
30
+ .join(' ');
31
+ }
32
+ //# sourceMappingURL=humanizeComponentName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"humanizeComponentName.js","sourceRoot":"","sources":["../../../src/editor/thumbnails/humanizeComponentName.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,gEAAgE;AAChE,MAAM,QAAQ,GAA2B;IACvC,GAAG,EAAE,KAAK;IACV,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,IAAI;SACR,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;SACtC,IAAI,EAAE;SACN,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;SACnD,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * resolveLiveThumbnailDrawer
3
+ *
4
+ * Decides whether useP1Editor should apply the live thumbnail component drawer,
5
+ * turning the `liveThumbnailDrawer` option into a Puck override layer (or null).
6
+ *
7
+ * The drawer is ON by default — passing `undefined` or `true` builds it, an
8
+ * options object builds it with those settings, and `false` opts out (Puck's
9
+ * default drawer is kept). Kept as a pure function so the default-on / opt-out
10
+ * policy is unit-testable independently of the drawer's rendering internals.
11
+ */
12
+ import type { PuckOverrides } from '../plugin/index.js';
13
+ import { type LiveThumbnailDrawerOptions } from './buildLiveThumbnailDrawer.js';
14
+ export declare function resolveLiveThumbnailDrawer(config: unknown, option: boolean | LiveThumbnailDrawerOptions | undefined): Partial<PuckOverrides> | null;
15
+ //# sourceMappingURL=resolveLiveThumbnailDrawer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveLiveThumbnailDrawer.d.ts","sourceRoot":"","sources":["../../../src/editor/thumbnails/resolveLiveThumbnailDrawer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAA4B,KAAK,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAE1G,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,OAAO,EACf,MAAM,EAAE,OAAO,GAAG,0BAA0B,GAAG,SAAS,GACvD,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI,CAI/B"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * resolveLiveThumbnailDrawer
3
+ *
4
+ * Decides whether useP1Editor should apply the live thumbnail component drawer,
5
+ * turning the `liveThumbnailDrawer` option into a Puck override layer (or null).
6
+ *
7
+ * The drawer is ON by default — passing `undefined` or `true` builds it, an
8
+ * options object builds it with those settings, and `false` opts out (Puck's
9
+ * default drawer is kept). Kept as a pure function so the default-on / opt-out
10
+ * policy is unit-testable independently of the drawer's rendering internals.
11
+ */
12
+ import { buildLiveThumbnailDrawer } from './buildLiveThumbnailDrawer.js';
13
+ export function resolveLiveThumbnailDrawer(config, option) {
14
+ if (option === false)
15
+ return null;
16
+ const options = typeof option === 'object' ? option : undefined;
17
+ return buildLiveThumbnailDrawer(config, options);
18
+ }
19
+ //# sourceMappingURL=resolveLiveThumbnailDrawer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolveLiveThumbnailDrawer.js","sourceRoot":"","sources":["../../../src/editor/thumbnails/resolveLiveThumbnailDrawer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,wBAAwB,EAAmC,MAAM,+BAA+B,CAAC;AAE1G,MAAM,UAAU,0BAA0B,CACxC,MAAe,EACf,MAAwD;IAExD,IAAI,MAAM,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC;IAClC,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAChE,OAAO,wBAAwB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * thumbnailCache
3
+ *
4
+ * In-memory, client-side cache for rendered component-preview HTML: a
5
+ * module-level Map that survives editor/document remounts within a single
6
+ * page load (Puck is force-remounted via `key` on every document switch,
7
+ * which would otherwise re-render every preview from scratch).
8
+ *
9
+ * Deliberately NOT persisted to localStorage: the cached value is later
10
+ * injected via `dangerouslySetInnerHTML` (see LiveThumbnail), and localStorage
11
+ * is writable by any same-origin script. Persisting it would let a same-origin
12
+ * write to a `p1-thumb:*` key plant markup that gets trusted and replayed on a
13
+ * future load. Keeping the cache in-memory only means an attacker would need
14
+ * live script execution in this exact session to influence it — at which
15
+ * point they already have full DOM control and this cache buys them nothing.
16
+ *
17
+ * A preview depends only on component name + defaultProps, NOT on the document
18
+ * being edited, so entries are reused across every page. The key embeds a hash
19
+ * of the defaultProps plus a caller-supplied version so stale entries
20
+ * invalidate when a component's inputs change.
21
+ */
22
+ /**
23
+ * Build a cache key for a component preview. Changing `defaultProps` or
24
+ * `version` yields a different key, so cached previews invalidate.
25
+ */
26
+ export declare function makeThumbnailKey(name: string, defaultProps: unknown, version?: string): string;
27
+ /** Cache key for a component preview, shared by LiveThumbnail and ThumbnailCard. */
28
+ export declare function getThumbnailCacheKey(config: {
29
+ components?: Record<string, {
30
+ defaultProps?: unknown;
31
+ }>;
32
+ } | undefined, name: string, version?: string): string;
33
+ /** Read a cached preview (in-memory only — see file header for why). */
34
+ export declare function getCachedThumbnail(key: string): string | undefined;
35
+ /** Write a preview to the in-memory cache. */
36
+ export declare function setCachedThumbnail(key: string, html: string): void;
37
+ /** Clear the in-memory cache, plus any stray entries left by an older, localStorage-backed version of this cache. */
38
+ export declare function clearThumbnailCache(): void;
39
+ //# sourceMappingURL=thumbnailCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbnailCache.d.ts","sourceRoot":"","sources":["../../../src/editor/thumbnails/thumbnailCache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AA8BH;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,SAAM,GAAG,MAAM,CAS3F;AAUD,oFAAoF;AACpF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;CAAE,GAAG,SAAS,EAC/E,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,MAAM,GACf,MAAM,CAER;AAED,wEAAwE;AACxE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAElE;AAED,8CAA8C;AAC9C,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAElE;AAED,qHAAqH;AACrH,wBAAgB,mBAAmB,IAAI,IAAI,CAgB1C"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * thumbnailCache
3
+ *
4
+ * In-memory, client-side cache for rendered component-preview HTML: a
5
+ * module-level Map that survives editor/document remounts within a single
6
+ * page load (Puck is force-remounted via `key` on every document switch,
7
+ * which would otherwise re-render every preview from scratch).
8
+ *
9
+ * Deliberately NOT persisted to localStorage: the cached value is later
10
+ * injected via `dangerouslySetInnerHTML` (see LiveThumbnail), and localStorage
11
+ * is writable by any same-origin script. Persisting it would let a same-origin
12
+ * write to a `p1-thumb:*` key plant markup that gets trusted and replayed on a
13
+ * future load. Keeping the cache in-memory only means an attacker would need
14
+ * live script execution in this exact session to influence it — at which
15
+ * point they already have full DOM control and this cache buys them nothing.
16
+ *
17
+ * A preview depends only on component name + defaultProps, NOT on the document
18
+ * being edited, so entries are reused across every page. The key embeds a hash
19
+ * of the defaultProps plus a caller-supplied version so stale entries
20
+ * invalidate when a component's inputs change.
21
+ */
22
+ // Legacy prefix from a prior localStorage-backed version of this cache.
23
+ // clearThumbnailCache() still purges any stray entries left behind on a
24
+ // user's machine, but nothing here reads or writes through it anymore.
25
+ const LEGACY_LS_PREFIX = 'p1-thumb:';
26
+ // In-memory only, lives as long as the JS runtime (browser tab).
27
+ const memory = new Map();
28
+ /** Small, dependency-free djb2 string hash. */
29
+ function hashString(input) {
30
+ let hash = 5381;
31
+ for (let i = 0; i < input.length; i++) {
32
+ hash = ((hash << 5) + hash + input.charCodeAt(i)) | 0;
33
+ }
34
+ return (hash >>> 0).toString(36);
35
+ }
36
+ /** localStorage if available, else null (SSR / disabled / private mode). */
37
+ function getStore() {
38
+ try {
39
+ return typeof globalThis !== 'undefined' && globalThis.localStorage
40
+ ? globalThis.localStorage
41
+ : null;
42
+ }
43
+ catch {
44
+ return null;
45
+ }
46
+ }
47
+ /**
48
+ * Build a cache key for a component preview. Changing `defaultProps` or
49
+ * `version` yields a different key, so cached previews invalidate.
50
+ */
51
+ export function makeThumbnailKey(name, defaultProps, version = '2') {
52
+ let serialized = '';
53
+ try {
54
+ serialized = JSON.stringify(defaultProps) ?? '';
55
+ }
56
+ catch {
57
+ // Non-serializable props — fall back to name+version only.
58
+ serialized = '';
59
+ }
60
+ return `${name}:${hashString(`${version}|${serialized}`)}`;
61
+ }
62
+ /** A component's defaultProps, resolved from its config entry. */
63
+ function defaultPropsFor(config, name) {
64
+ return config?.components?.[name]?.defaultProps ?? {};
65
+ }
66
+ /** Cache key for a component preview, shared by LiveThumbnail and ThumbnailCard. */
67
+ export function getThumbnailCacheKey(config, name, version) {
68
+ return makeThumbnailKey(name, defaultPropsFor(config, name), version);
69
+ }
70
+ /** Read a cached preview (in-memory only — see file header for why). */
71
+ export function getCachedThumbnail(key) {
72
+ return memory.get(key);
73
+ }
74
+ /** Write a preview to the in-memory cache. */
75
+ export function setCachedThumbnail(key, html) {
76
+ memory.set(key, html);
77
+ }
78
+ /** Clear the in-memory cache, plus any stray entries left by an older, localStorage-backed version of this cache. */
79
+ export function clearThumbnailCache() {
80
+ memory.clear();
81
+ const store = getStore();
82
+ if (store) {
83
+ try {
84
+ const keys = [];
85
+ for (let i = 0; i < store.length; i++) {
86
+ const k = store.key(i);
87
+ if (k && k.startsWith(LEGACY_LS_PREFIX))
88
+ keys.push(k);
89
+ }
90
+ keys.forEach((k) => store.removeItem(k));
91
+ }
92
+ catch {
93
+ // ignore
94
+ }
95
+ }
96
+ }
97
+ //# sourceMappingURL=thumbnailCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbnailCache.js","sourceRoot":"","sources":["../../../src/editor/thumbnails/thumbnailCache.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useDocuments.d.ts","sourceRoot":"","sources":["../../src/editor/useDocuments.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE7D,UAAU,kBAAkB;IAC1B,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,kBAAkB;IAC1B;;OAEG;IACH,SAAS,EAAE,QAAQ,EAAE,CAAC;IAEtB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAEpB;;OAEG;IACH,MAAM,EAAE,CACN,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,QAAQ,EACtB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KACxE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEvB;;OAEG;IACH,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;OAEG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;OAEG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAC;CACnD;AAUD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,MAAM,EACN,QAAQ,GACT,EAAE,kBAAkB,GAAG,kBAAkB,CAmHzC"}
1
+ {"version":3,"file":"useDocuments.d.ts","sourceRoot":"","sources":["../../src/editor/useDocuments.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAE7D,UAAU,kBAAkB;IAC1B,MAAM,EAAE,QAAQ,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,kBAAkB;IAC1B;;OAEG;IACH,SAAS,EAAE,QAAQ,EAAE,CAAC;IAEtB;;OAEG;IACH,OAAO,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAEpB;;OAEG;IACH,MAAM,EAAE,CACN,IAAI,EAAE,MAAM,EACZ,WAAW,CAAC,EAAE,QAAQ,EACtB,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,eAAe,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,KACxE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEvB;;OAEG;IACH,MAAM,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAE9C;;OAEG;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAE7B;;OAEG;IACH,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAC;CACnD;AAUD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,YAAY,CAAC,EAC3B,MAAM,EACN,MAAM,EACN,QAAQ,GACT,EAAE,kBAAkB,GAAG,kBAAkB,CAqIzC"}
@@ -73,20 +73,28 @@ export function useDocuments({ client, siteId, branchId, }) {
73
73
  }, [refresh, branchId]);
74
74
  // Create a new document
75
75
  const create = useCallback(async (path, initialData, options) => {
76
- const doc = await client.documents.create({
77
- siteId,
78
- branchId,
79
- path,
80
- ...(options?.templateId ? {
76
+ // Template pages get their initial version built by the backend from the
77
+ // template, which preserves each component's durable slot id. A
78
+ // client-built snapshot would be layered on top as a second version and
79
+ // bury those ids, so it is rejected here.
80
+ if (options?.templateId) {
81
+ if (initialData !== undefined) {
82
+ throw new Error('Cannot supply initialData when creating a document from a template; the backend builds the initial version from the template.');
83
+ }
84
+ const doc = await client.documents.create({
85
+ siteId,
86
+ branchId,
87
+ path,
81
88
  templateId: options.templateId,
82
89
  templateVersion: options.templateVersion ?? 1,
83
- } : {}),
84
- });
85
- // Create initial version with default or provided data. When a title is
86
- // given, seed it into the Puck root props (root.props.title) — the same
87
- // field Puck's root "title" input reads/writes — so it persists in the
88
- // initial snapshot. This composes with template scaffolding: the title is
89
- // merged into whatever initialData was passed (default or scaffolded).
90
+ ...(options.title ? { title: options.title } : {}),
91
+ });
92
+ await refresh();
93
+ return doc;
94
+ }
95
+ // Blank pages build their initial version on the client. A title seeds
96
+ // root.props.title (the same field Puck's root "title" input
97
+ // reads/writes) so it persists in the initial snapshot.
90
98
  const baseData = initialData ?? DEFAULT_PUCK_DATA;
91
99
  const data = options?.title
92
100
  ? {
@@ -97,12 +105,16 @@ export function useDocuments({ client, siteId, branchId, }) {
97
105
  },
98
106
  }
99
107
  : baseData;
100
- await client.versions.create(siteId, {
101
- documentId: doc.id,
108
+ // Create the document and its initial version in a SINGLE call by passing
109
+ // the content inline as `snapshot`. Previously this was two calls
110
+ // (documents.create with no snapshot, then a separate versions.create),
111
+ // which produced two version rows for a brand-new page.
112
+ const doc = await client.documents.create({
113
+ siteId,
102
114
  branchId,
115
+ path,
103
116
  snapshot: data,
104
117
  });
105
- // Refresh the list
106
118
  await refresh();
107
119
  return doc;
108
120
  }, [client, siteId, branchId, refresh]);
@@ -1 +1 @@
1
- {"version":3,"file":"useDocuments.js","sourceRoot":"","sources":["../../src/editor/useDocuments.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useDocuments.js","sourceRoot":"","sources":["../../src/editor/useDocuments.ts"],"names":[],"mappings":"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"}
@@ -1,19 +1,12 @@
1
- /**
2
- * useP1Editor Hook
3
- *
4
- * All-in-one hook for setting up a P1-enabled Puck editor.
5
- * Composes useP1Plugin and useP1Overrides internally, handles
6
- * document loading, version management, historical version protection,
7
- * and provides everything needed to render <Puck>.
8
- */
1
+ import type { Plugin } from '@puckeditor/core';
2
+ import type { PuckData } from '@pantheon-systems/css-client';
3
+ import type { UiState } from '@puckeditor/core';
4
+ import type { P1PuckContextValue } from '../core/types.js';
9
5
  import type { ThumbnailMap } from './utils/buildThumbnailOverride.js';
6
+ import type { LiveThumbnailDrawerOptions } from './thumbnails/buildLiveThumbnailDrawer.js';
10
7
  import type { UseP1PluginOptions } from './useP1Plugin.js';
11
8
  import type { UseP1OverridesOptions } from './useP1Overrides.js';
12
9
  import type { PuckOverrides } from './plugin/index.js';
13
- import type { Plugin } from '@puckeditor/core';
14
- import type { P1PuckContextValue } from '../core/types.js';
15
- import type { PuckData } from '@pantheon-systems/css-client';
16
- import type { UiState } from '@puckeditor/core';
17
10
  /**
18
11
  * Options for useP1Editor.
19
12
  */
@@ -45,6 +38,15 @@ export interface UseP1EditorOptions {
45
38
  * ```
46
39
  */
47
40
  thumbnails?: ThumbnailMap;
41
+ /**
42
+ * Live thumbnail component drawer — replaces Puck's default component list
43
+ * with collapsible categories of live-rendered preview cards. Defaults to
44
+ * ON for every consumer (no per-app wiring needed). Pass `false` to keep
45
+ * Puck's default drawer, or an options object to tune scale / card height.
46
+ *
47
+ * NOTE: this changes the default drawer for all `puck-css` editors.
48
+ */
49
+ liveThumbnailDrawer?: boolean | LiveThumbnailDrawerOptions;
48
50
  /** Customization options for overrides */
49
51
  overrideOptions?: UseP1OverridesOptions;
50
52
  /** Customization options for the CSS plugin (versions are managed internally) */
@@ -93,7 +95,7 @@ export interface UseP1EditorReturn {
93
95
  loading: boolean;
94
96
  /** Error from document loading, if any */
95
97
  error: Error | null;
96
- /** React key — pass directly as `<Puck key={puckKey} {...puckProps} />` to force clean remount on document switch */
98
+ /** React key — pass directly as `<Puck key={puckKey} {...puckProps} />` to force a clean remount on role change (document switches sync in place) */
97
99
  puckKey: string;
98
100
  /** Props to spread onto <Puck> */
99
101
  puckProps: PuckProps;
@@ -1 +1 @@
1
- {"version":3,"file":"useP1Editor.d.ts","sourceRoot":"","sources":["../../src/editor/useP1Editor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useP1Editor.d.ts","sourceRoot":"","sources":["../../src/editor/useP1Editor.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ "use client";
1
2
  /**
2
3
  * useP1Editor Hook
3
4
  *
@@ -8,12 +9,15 @@
8
9
  */
9
10
  import { useState, useEffect, useRef, useMemo, useCallback } from 'react';
10
11
  import { useP1Puck } from '../core/P1PuckContext.js';
12
+ import { useVersions } from '../versioning/useVersions.js';
13
+ import { useP1Auth } from '../auth/index.js';
11
14
  import { useP1Plugin } from './useP1Plugin.js';
12
15
  import { useP1Overrides } from './useP1Overrides.js';
13
- import { useVersions } from '../versioning/useVersions.js';
14
16
  import { useComponentRegistry } from './useComponentRegistry.js';
15
- import { useP1Auth } from '../auth/index.js';
16
17
  import { buildThumbnailOverride } from './utils/buildThumbnailOverride.js';
18
+ import { restoreDocumentVersion } from './utils/restoreDocumentVersion.js';
19
+ import { createDocumentSyncStore, createDocumentSyncPlugin, documentSyncKey, } from './plugin/document-sync-plugin.js';
20
+ import { resolveLiveThumbnailDrawer } from './thumbnails/resolveLiveThumbnailDrawer.js';
17
21
  /**
18
22
  * All-in-one hook for setting up a P1-enabled Puck editor.
19
23
  *
@@ -42,7 +46,7 @@ import { buildThumbnailOverride } from './utils/buildThumbnailOverride.js';
42
46
  * ```
43
47
  */
44
48
  export function useP1Editor(options) {
45
- const { documentPath, puckConfig, additionalPlugins, additionalOverrides, thumbnails, overrideOptions, pluginOptions, onSelectionChange, onDocumentNotFound, } = options;
49
+ const { documentPath, puckConfig, additionalPlugins, additionalOverrides, thumbnails, liveThumbnailDrawer, overrideOptions, pluginOptions, onSelectionChange, onDocumentNotFound, } = options;
46
50
  const css = useP1Puck();
47
51
  const { user, logout } = useP1Auth();
48
52
  // =========================================================================
@@ -155,6 +159,8 @@ export function useP1Editor(options) {
155
159
  void css.loadVersion(version);
156
160
  }
157
161
  }, [versions, css.loadVersion, css.returnToLatest]);
162
+ // Revert to a prior version.
163
+ const handleRestoreVersion = useCallback((version) => restoreDocumentVersion(version, css, refreshVersions, () => { }), [css, refreshVersions]);
158
164
  // =========================================================================
159
165
  // Published Status (derived from version data)
160
166
  // =========================================================================
@@ -207,9 +213,16 @@ export function useP1Editor(options) {
207
213
  void refreshVersions();
208
214
  consumerOnPublishSuccessRef.current?.(checkpoint);
209
215
  }, [css, refreshVersions]);
216
+ const canRevert = css.userRole === 'admin' || css.userRole === 'editor';
217
+ // Pushes freshly loaded documents into the live Puck instance, replacing
218
+ // the remount-on-document-switch behavior the old document-scoped puckKey
219
+ // provided (see document-sync-plugin.tsx). Handed to the P1 plugin as well
220
+ // so its context sync defers document switches to this store.
221
+ const [documentSyncStore] = useState(createDocumentSyncStore);
210
222
  const p1Plugin = useP1Plugin({
223
+ documentSyncStore,
211
224
  onSelectionChange: handleSelectionChange,
212
- currentUser: user ? { id: user.id, name: user.name, email: user.email, avatar: user.picture } : undefined,
225
+ currentUser: user ? { id: css.userId, name: user.name, email: user.email, avatar: user.picture } : undefined,
213
226
  onLogout: logout,
214
227
  puckConfig,
215
228
  ...pluginOptions,
@@ -219,6 +232,8 @@ export function useP1Editor(options) {
219
232
  publishedStatus,
220
233
  selectedVersionId: css.viewingVersion?.id ?? undefined,
221
234
  onVersionSelect: handleVersionSelect,
235
+ onRestoreVersion: handleRestoreVersion,
236
+ canRevert,
222
237
  });
223
238
  const wrappedOnPublishSuccess = useCallback((checkpoint) => {
224
239
  void refreshVersions();
@@ -232,32 +247,76 @@ export function useP1Editor(options) {
232
247
  // =========================================================================
233
248
  // Stable plugin array
234
249
  // =========================================================================
250
+ if (process.env.NODE_ENV === "development") {
251
+ // eslint-disable-next-line react-hooks/rules-of-hooks
252
+ const prev = useRef(additionalPlugins);
253
+ if (prev.current !== additionalPlugins) {
254
+ const countChanged = (prev.current?.length ?? 0) !== (additionalPlugins?.length ?? 0);
255
+ if (!countChanged) {
256
+ console.warn("[useP1Editor] additionalPlugins ref is changing every render " +
257
+ "without a length change — the caller should memoise this array.");
258
+ }
259
+ prev.current = additionalPlugins;
260
+ }
261
+ }
235
262
  const additionalPluginsRef = useRef(additionalPlugins);
236
263
  additionalPluginsRef.current = additionalPlugins;
264
+ const documentSyncPlugin = useMemo(() => createDocumentSyncPlugin(documentSyncStore), [documentSyncStore]);
265
+ // Read through a ref so a publish happens once per settled load, not on
266
+ // every safeData edit.
267
+ const safeDataRef = useRef(css.safeData);
268
+ safeDataRef.current = css.safeData;
269
+ const currentDocumentId = css.currentDocument?.id;
270
+ useEffect(() => {
271
+ if (loading || error || !currentDocumentId)
272
+ return;
273
+ documentSyncStore.publish({
274
+ syncKey: documentSyncKey(css.branchId, currentDocumentId),
275
+ data: safeDataRef.current,
276
+ });
277
+ }, [loading, error, css.branchId, currentDocumentId, documentSyncStore]);
237
278
  const pluginCount = additionalPlugins?.length ?? 0;
238
279
  const plugins = useMemo(() => {
239
- const result = [p1Plugin];
280
+ const result = [p1Plugin, documentSyncPlugin];
240
281
  if (additionalPluginsRef.current) {
241
282
  result.push(...additionalPluginsRef.current);
242
283
  }
243
284
  return result;
244
- }, [p1Plugin, pluginCount]);
285
+ }, [p1Plugin, documentSyncPlugin, pluginCount]);
245
286
  // =========================================================================
246
- // Stable onChange (disabled for historical versions)
287
+ // Stable onChange (disabled for historical versions, guarded across
288
+ // document switches)
247
289
  // =========================================================================
248
290
  const isViewingHistoricalRef = useRef(css.isViewingHistoricalVersion);
249
291
  isViewingHistoricalRef.current = css.isViewingHistoricalVersion;
292
+ // With Puck surviving document switches, onChange can fire while the canvas
293
+ // still shows the previous document but css already targets the new one
294
+ // (load in flight, or loaded but not yet pushed by the sync plugin). Saving
295
+ // then would write the old page's content into the new page — drop instead.
296
+ const saveTargetKeyRef = useRef(null);
297
+ saveTargetKeyRef.current = css.currentDocument?.id
298
+ ? documentSyncKey(css.branchId, css.currentDocument.id)
299
+ : null;
250
300
  const onChange = useCallback((data) => {
251
- if (!isViewingHistoricalRef.current) {
252
- css.saveData(data);
301
+ if (isViewingHistoricalRef.current)
302
+ return;
303
+ const appliedKey = documentSyncStore.getAppliedKey();
304
+ if (appliedKey !== null && appliedKey !== saveTargetKeyRef.current) {
305
+ console.warn('[useP1Editor] save SKIPPED: canvas/document mismatch during switch.', 'canvas:', appliedKey, 'target:', saveTargetKeyRef.current);
306
+ return;
253
307
  }
254
- }, [css.saveData]);
308
+ css.saveData(data);
309
+ }, [css.saveData, documentSyncStore]);
255
310
  // =========================================================================
256
311
  // Permissions (read-only for historical versions)
257
312
  // =========================================================================
258
313
  const permissions = useMemo(() => {
259
314
  if (css.isViewingHistoricalVersion) {
260
- return { delete: false, drag: false, duplicate: false, edit: false, insert: false };
315
+ // Omit edit:false so page/root fields are never locked by Puck's own
316
+ // readonly rendering. Interaction is blocked by ReadOnlyFieldsGuard
317
+ // (inert attribute) instead, which also covers root fields without
318
+ // requiring resolvePermissions on config.root.
319
+ return { delete: false, drag: false, duplicate: false, insert: false };
261
320
  }
262
321
  return { delete: true, drag: true, duplicate: true, edit: true, insert: true };
263
322
  }, [css.isViewingHistoricalVersion]);
@@ -275,10 +334,20 @@ export function useP1Editor(options) {
275
334
  // componentItem if needed.
276
335
  const thumbnailsRef = useRef(thumbnails);
277
336
  thumbnailsRef.current = thumbnails;
337
+ // Live thumbnail drawer — default ON for every consumer. Uses raw puckConfig
338
+ // (not configWithPermissions) so previews show all components regardless of
339
+ // role. Because useMemo deps on p1Overrides (stable after mount), changes to
340
+ // puckConfig or liveThumbnailDrawer after mount are not picked up.
341
+ const puckConfigRef = useRef(puckConfig);
342
+ puckConfigRef.current = puckConfig;
343
+ const liveThumbnailDrawerRef = useRef(liveThumbnailDrawer);
344
+ liveThumbnailDrawerRef.current = liveThumbnailDrawer;
278
345
  const mergedOverrides = useMemo(() => {
279
- // Layer order (last wins): p1Overrides → thumbnailOverride → additionalOverrides
346
+ // Layer order (last wins):
347
+ // p1Overrides → liveThumbnailDrawer → thumbnailOverride → additionalOverrides
280
348
  const layers = [
281
349
  p1Overrides,
350
+ resolveLiveThumbnailDrawer(puckConfigRef.current, liveThumbnailDrawerRef.current),
282
351
  thumbnailsRef.current ? buildThumbnailOverride(thumbnailsRef.current) : null,
283
352
  additionalOverridesRef.current ?? null,
284
353
  ];
@@ -302,15 +371,15 @@ export function useP1Editor(options) {
302
371
  // =========================================================================
303
372
  // Assemble puckProps
304
373
  // =========================================================================
305
- // Key that forces Puck to remount on document switch or role change,
374
+ // Key that forces Puck to remount on role change (let puck internally manage the change on document change),
306
375
  // ensuring clean undo history, sidebar state, and fresh permission cache.
307
376
  // Puck caches resolvePermissions results per component instance — the
308
377
  // cache is only invalidated when component data changes, not when the
309
378
  // resolver function changes. Including userRole in the key forces a
310
379
  // clean remount with an empty cache when roles switch.
311
- const puckKey = `css-${css.currentDocument?.id ?? documentPath}-${css.userRole}`;
380
+ const puckKey = `css-${css.userRole}`;
312
381
  // Read persisted sidebar visibility from localStorage each time the Puck instance
313
- // changes (puckKey changes on document/branch switch). The value is passed as the
382
+ // changes (puckKey changes on role switch). The value is passed as the
314
383
  // initial `ui` prop so Puck never initializes with wrong defaults.
315
384
  const initialSidebarUi = useMemo(() => {
316
385
  try {
@@ -350,11 +419,19 @@ export function useP1Editor(options) {
350
419
  const resolver = resolvePermsRef.current;
351
420
  if (!resolver)
352
421
  return params.permissions;
353
- const basePerms = resolver({ type: name }, {});
354
- const pinMap = (params.appState?.data?.root?.props?._pinMap ?? {});
355
- const compId = data?.props?.id;
356
- if (compId && pinMap[compId]) {
357
- return { ...basePerms, drag: false, delete: false };
422
+ const basePerms = resolver({ type: name, props: data?.props }, {});
423
+ // Template-authoring mode: the context resolver only sees a
424
+ // metadata summary (no pins), so the document's live _pinMap is the
425
+ // pin source. On a bound page the resolver reads the live template
426
+ // and already governs pins, so the page's own snapshot pinMap is
427
+ // ignored — otherwise a stale pin would stay locked after the
428
+ // template unpins it.
429
+ if (isTemplateMode) {
430
+ const pinMap = (params.appState?.data?.root?.props?._pinMap ?? {});
431
+ const compId = data?.props?.id;
432
+ if (compId && pinMap[compId]) {
433
+ return { ...basePerms, drag: false, delete: false };
434
+ }
358
435
  }
359
436
  return basePerms;
360
437
  },