@batterai/editor-shell 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (666) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE +101 -0
  3. package/README.md +11 -0
  4. package/dist/App.d.ts +4 -0
  5. package/dist/App.d.ts.map +1 -0
  6. package/dist/App.js +388 -0
  7. package/dist/App.js.map +1 -0
  8. package/dist/app/AppCanvas.d.ts +52 -0
  9. package/dist/app/AppCanvas.d.ts.map +1 -0
  10. package/dist/app/AppCanvas.js +43 -0
  11. package/dist/app/AppCanvas.js.map +1 -0
  12. package/dist/app/AppDialogs.d.ts +25 -0
  13. package/dist/app/AppDialogs.d.ts.map +1 -0
  14. package/dist/app/AppDialogs.js +16 -0
  15. package/dist/app/AppDialogs.js.map +1 -0
  16. package/dist/app/AppInspectorPanel.d.ts +66 -0
  17. package/dist/app/AppInspectorPanel.d.ts.map +1 -0
  18. package/dist/app/AppInspectorPanel.js +94 -0
  19. package/dist/app/AppInspectorPanel.js.map +1 -0
  20. package/dist/app/AppStates.d.ts +5 -0
  21. package/dist/app/AppStates.d.ts.map +1 -0
  22. package/dist/app/AppStates.js +8 -0
  23. package/dist/app/AppStates.js.map +1 -0
  24. package/dist/app/AppTypes.d.ts +18 -0
  25. package/dist/app/AppTypes.d.ts.map +1 -0
  26. package/dist/app/AppTypes.js +2 -0
  27. package/dist/app/AppTypes.js.map +1 -0
  28. package/dist/app/OperationErrorBanner.d.ts +5 -0
  29. package/dist/app/OperationErrorBanner.d.ts.map +1 -0
  30. package/dist/app/OperationErrorBanner.js +5 -0
  31. package/dist/app/OperationErrorBanner.js.map +1 -0
  32. package/dist/app/capability-guards.d.ts +9 -0
  33. package/dist/app/capability-guards.d.ts.map +1 -0
  34. package/dist/app/capability-guards.js +22 -0
  35. package/dist/app/capability-guards.js.map +1 -0
  36. package/dist/app/deriveSelectionState.d.ts +31 -0
  37. package/dist/app/deriveSelectionState.d.ts.map +1 -0
  38. package/dist/app/deriveSelectionState.js +79 -0
  39. package/dist/app/deriveSelectionState.js.map +1 -0
  40. package/dist/app/helpers.d.ts +31 -0
  41. package/dist/app/helpers.d.ts.map +1 -0
  42. package/dist/app/helpers.js +145 -0
  43. package/dist/app/helpers.js.map +1 -0
  44. package/dist/app/hostServices.d.ts +2 -0
  45. package/dist/app/hostServices.d.ts.map +1 -0
  46. package/dist/app/hostServices.js +2 -0
  47. package/dist/app/hostServices.js.map +1 -0
  48. package/dist/app/persistence-machine.d.ts +27 -0
  49. package/dist/app/persistence-machine.d.ts.map +1 -0
  50. package/dist/app/persistence-machine.js +66 -0
  51. package/dist/app/persistence-machine.js.map +1 -0
  52. package/dist/app/useCollectionEditing.d.ts +30 -0
  53. package/dist/app/useCollectionEditing.d.ts.map +1 -0
  54. package/dist/app/useCollectionEditing.js +80 -0
  55. package/dist/app/useCollectionEditing.js.map +1 -0
  56. package/dist/app/useCommitActions.d.ts +64 -0
  57. package/dist/app/useCommitActions.d.ts.map +1 -0
  58. package/dist/app/useCommitActions.js +319 -0
  59. package/dist/app/useCommitActions.js.map +1 -0
  60. package/dist/app/useEditorCollaboration.d.ts +30 -0
  61. package/dist/app/useEditorCollaboration.d.ts.map +1 -0
  62. package/dist/app/useEditorCollaboration.js +374 -0
  63. package/dist/app/useEditorCollaboration.js.map +1 -0
  64. package/dist/app/useEditorEffects.d.ts +42 -0
  65. package/dist/app/useEditorEffects.d.ts.map +1 -0
  66. package/dist/app/useEditorEffects.js +105 -0
  67. package/dist/app/useEditorEffects.js.map +1 -0
  68. package/dist/app/useEditorRuntime.d.ts +34 -0
  69. package/dist/app/useEditorRuntime.d.ts.map +1 -0
  70. package/dist/app/useEditorRuntime.js +68 -0
  71. package/dist/app/useEditorRuntime.js.map +1 -0
  72. package/dist/app/useEditorState.d.ts +55 -0
  73. package/dist/app/useEditorState.d.ts.map +1 -0
  74. package/dist/app/useEditorState.js +68 -0
  75. package/dist/app/useEditorState.js.map +1 -0
  76. package/dist/app/usePageOps.d.ts +37 -0
  77. package/dist/app/usePageOps.d.ts.map +1 -0
  78. package/dist/app/usePageOps.js +69 -0
  79. package/dist/app/usePageOps.js.map +1 -0
  80. package/dist/app/usePersistence.d.ts +48 -0
  81. package/dist/app/usePersistence.d.ts.map +1 -0
  82. package/dist/app/usePersistence.js +344 -0
  83. package/dist/app/usePersistence.js.map +1 -0
  84. package/dist/app/usePreviewSession.d.ts +22 -0
  85. package/dist/app/usePreviewSession.d.ts.map +1 -0
  86. package/dist/app/usePreviewSession.js +21 -0
  87. package/dist/app/usePreviewSession.js.map +1 -0
  88. package/dist/app/useWorkspaceDocumentSync.d.ts +33 -0
  89. package/dist/app/useWorkspaceDocumentSync.d.ts.map +1 -0
  90. package/dist/app/useWorkspaceDocumentSync.js +128 -0
  91. package/dist/app/useWorkspaceDocumentSync.js.map +1 -0
  92. package/dist/appearance.d.ts +6 -0
  93. package/dist/appearance.d.ts.map +1 -0
  94. package/dist/appearance.js +53 -0
  95. package/dist/appearance.js.map +1 -0
  96. package/dist/bindingChips.d.ts +28 -0
  97. package/dist/bindingChips.d.ts.map +1 -0
  98. package/dist/bindingChips.js +93 -0
  99. package/dist/bindingChips.js.map +1 -0
  100. package/dist/block-factory.d.ts +21 -0
  101. package/dist/block-factory.d.ts.map +1 -0
  102. package/dist/block-factory.js +78 -0
  103. package/dist/block-factory.js.map +1 -0
  104. package/dist/blockHost.d.ts +22 -0
  105. package/dist/blockHost.d.ts.map +1 -0
  106. package/dist/blockHost.js +103 -0
  107. package/dist/blockHost.js.map +1 -0
  108. package/dist/blockInteraction.d.ts +11 -0
  109. package/dist/blockInteraction.d.ts.map +1 -0
  110. package/dist/blockInteraction.js +16 -0
  111. package/dist/blockInteraction.js.map +1 -0
  112. package/dist/blockPresets.d.ts +4 -0
  113. package/dist/blockPresets.d.ts.map +1 -0
  114. package/dist/blockPresets.js +11 -0
  115. package/dist/blockPresets.js.map +1 -0
  116. package/dist/collaboration.d.ts +41 -0
  117. package/dist/collaboration.d.ts.map +1 -0
  118. package/dist/collaboration.js +4 -0
  119. package/dist/collaboration.js.map +1 -0
  120. package/dist/collectionItemAddress.d.ts +12 -0
  121. package/dist/collectionItemAddress.d.ts.map +1 -0
  122. package/dist/collectionItemAddress.js +19 -0
  123. package/dist/collectionItemAddress.js.map +1 -0
  124. package/dist/components/AddCollectionItemControl.d.ts +15 -0
  125. package/dist/components/AddCollectionItemControl.d.ts.map +1 -0
  126. package/dist/components/AddCollectionItemControl.js +19 -0
  127. package/dist/components/AddCollectionItemControl.js.map +1 -0
  128. package/dist/components/AuditHistoryPanel.d.ts +10 -0
  129. package/dist/components/AuditHistoryPanel.d.ts.map +1 -0
  130. package/dist/components/AuditHistoryPanel.js +11 -0
  131. package/dist/components/AuditHistoryPanel.js.map +1 -0
  132. package/dist/components/Canvas.d.ts +64 -0
  133. package/dist/components/Canvas.d.ts.map +1 -0
  134. package/dist/components/Canvas.js +238 -0
  135. package/dist/components/Canvas.js.map +1 -0
  136. package/dist/components/CollaborationLayer.d.ts +13 -0
  137. package/dist/components/CollaborationLayer.d.ts.map +1 -0
  138. package/dist/components/CollaborationLayer.js +91 -0
  139. package/dist/components/CollaborationLayer.js.map +1 -0
  140. package/dist/components/DesignSettingsPanel.d.ts +10 -0
  141. package/dist/components/DesignSettingsPanel.d.ts.map +1 -0
  142. package/dist/components/DesignSettingsPanel.js +26 -0
  143. package/dist/components/DesignSettingsPanel.js.map +1 -0
  144. package/dist/components/EditableDate.d.ts +24 -0
  145. package/dist/components/EditableDate.d.ts.map +1 -0
  146. package/dist/components/EditableDate.js +41 -0
  147. package/dist/components/EditableDate.js.map +1 -0
  148. package/dist/components/EditableText.d.ts +23 -0
  149. package/dist/components/EditableText.d.ts.map +1 -0
  150. package/dist/components/EditableText.js +53 -0
  151. package/dist/components/EditableText.js.map +1 -0
  152. package/dist/components/FieldControl.d.ts +15 -0
  153. package/dist/components/FieldControl.d.ts.map +1 -0
  154. package/dist/components/FieldControl.js +64 -0
  155. package/dist/components/FieldControl.js.map +1 -0
  156. package/dist/components/IconFieldEditor.d.ts +9 -0
  157. package/dist/components/IconFieldEditor.d.ts.map +1 -0
  158. package/dist/components/IconFieldEditor.js +15 -0
  159. package/dist/components/IconFieldEditor.js.map +1 -0
  160. package/dist/components/ImageFieldEditor.d.ts +15 -0
  161. package/dist/components/ImageFieldEditor.d.ts.map +1 -0
  162. package/dist/components/ImageFieldEditor.js +37 -0
  163. package/dist/components/ImageFieldEditor.js.map +1 -0
  164. package/dist/components/Inspector.d.ts +55 -0
  165. package/dist/components/Inspector.d.ts.map +1 -0
  166. package/dist/components/Inspector.js +44 -0
  167. package/dist/components/Inspector.js.map +1 -0
  168. package/dist/components/LayoutBlockEditor.d.ts +32 -0
  169. package/dist/components/LayoutBlockEditor.d.ts.map +1 -0
  170. package/dist/components/LayoutBlockEditor.js +176 -0
  171. package/dist/components/LayoutBlockEditor.js.map +1 -0
  172. package/dist/components/LicenseWatermark.d.ts +5 -0
  173. package/dist/components/LicenseWatermark.d.ts.map +1 -0
  174. package/dist/components/LicenseWatermark.js +7 -0
  175. package/dist/components/LicenseWatermark.js.map +1 -0
  176. package/dist/components/NestedBlockItem.d.ts +26 -0
  177. package/dist/components/NestedBlockItem.d.ts.map +1 -0
  178. package/dist/components/NestedBlockItem.js +164 -0
  179. package/dist/components/NestedBlockItem.js.map +1 -0
  180. package/dist/components/NestedInsertSlot.d.ts +18 -0
  181. package/dist/components/NestedInsertSlot.d.ts.map +1 -0
  182. package/dist/components/NestedInsertSlot.js +51 -0
  183. package/dist/components/NestedInsertSlot.js.map +1 -0
  184. package/dist/components/NewPageDialog.d.ts +9 -0
  185. package/dist/components/NewPageDialog.d.ts.map +1 -0
  186. package/dist/components/NewPageDialog.js +12 -0
  187. package/dist/components/NewPageDialog.js.map +1 -0
  188. package/dist/components/PageFrame.d.ts +75 -0
  189. package/dist/components/PageFrame.d.ts.map +1 -0
  190. package/dist/components/PageFrame.js +87 -0
  191. package/dist/components/PageFrame.js.map +1 -0
  192. package/dist/components/PageInspector.d.ts +16 -0
  193. package/dist/components/PageInspector.d.ts.map +1 -0
  194. package/dist/components/PageInspector.js +56 -0
  195. package/dist/components/PageInspector.js.map +1 -0
  196. package/dist/components/PresetSaveDialog.d.ts +8 -0
  197. package/dist/components/PresetSaveDialog.d.ts.map +1 -0
  198. package/dist/components/PresetSaveDialog.js +7 -0
  199. package/dist/components/PresetSaveDialog.js.map +1 -0
  200. package/dist/components/ReferenceChipsEditor.d.ts +23 -0
  201. package/dist/components/ReferenceChipsEditor.d.ts.map +1 -0
  202. package/dist/components/ReferenceChipsEditor.js +68 -0
  203. package/dist/components/ReferenceChipsEditor.js.map +1 -0
  204. package/dist/components/TopBar.d.ts +49 -0
  205. package/dist/components/TopBar.d.ts.map +1 -0
  206. package/dist/components/TopBar.js +41 -0
  207. package/dist/components/TopBar.js.map +1 -0
  208. package/dist/components/canvas/CanvasBoard.d.ts +97 -0
  209. package/dist/components/canvas/CanvasBoard.d.ts.map +1 -0
  210. package/dist/components/canvas/CanvasBoard.js +35 -0
  211. package/dist/components/canvas/CanvasBoard.js.map +1 -0
  212. package/dist/components/canvas/EditableCanvasTitle.d.ts +13 -0
  213. package/dist/components/canvas/EditableCanvasTitle.d.ts.map +1 -0
  214. package/dist/components/canvas/EditableCanvasTitle.js +74 -0
  215. package/dist/components/canvas/EditableCanvasTitle.js.map +1 -0
  216. package/dist/components/canvas/camera.d.ts +9 -0
  217. package/dist/components/canvas/camera.d.ts.map +1 -0
  218. package/dist/components/canvas/camera.js +31 -0
  219. package/dist/components/canvas/camera.js.map +1 -0
  220. package/dist/components/canvas/column-window.d.ts +10 -0
  221. package/dist/components/canvas/column-window.d.ts.map +1 -0
  222. package/dist/components/canvas/column-window.js +46 -0
  223. package/dist/components/canvas/column-window.js.map +1 -0
  224. package/dist/components/canvas/keyboard-nav.d.ts +7 -0
  225. package/dist/components/canvas/keyboard-nav.d.ts.map +1 -0
  226. package/dist/components/canvas/keyboard-nav.js +44 -0
  227. package/dist/components/canvas/keyboard-nav.js.map +1 -0
  228. package/dist/components/canvas/links.d.ts +2 -0
  229. package/dist/components/canvas/links.d.ts.map +1 -0
  230. package/dist/components/canvas/links.js +7 -0
  231. package/dist/components/canvas/links.js.map +1 -0
  232. package/dist/components/editable-text/BindingInlineEditor.d.ts +13 -0
  233. package/dist/components/editable-text/BindingInlineEditor.d.ts.map +1 -0
  234. package/dist/components/editable-text/BindingInlineEditor.js +24 -0
  235. package/dist/components/editable-text/BindingInlineEditor.js.map +1 -0
  236. package/dist/components/editable-text/BindingPicker.d.ts +10 -0
  237. package/dist/components/editable-text/BindingPicker.d.ts.map +1 -0
  238. package/dist/components/editable-text/BindingPicker.js +20 -0
  239. package/dist/components/editable-text/BindingPicker.js.map +1 -0
  240. package/dist/components/editable-text/RichTextToolbar.d.ts +13 -0
  241. package/dist/components/editable-text/RichTextToolbar.d.ts.map +1 -0
  242. package/dist/components/editable-text/RichTextToolbar.js +24 -0
  243. package/dist/components/editable-text/RichTextToolbar.js.map +1 -0
  244. package/dist/components/editable-text/bindingHtml.d.ts +19 -0
  245. package/dist/components/editable-text/bindingHtml.d.ts.map +1 -0
  246. package/dist/components/editable-text/bindingHtml.js +106 -0
  247. package/dist/components/editable-text/bindingHtml.js.map +1 -0
  248. package/dist/components/editable-text/editableTextDom.d.ts +5 -0
  249. package/dist/components/editable-text/editableTextDom.d.ts.map +1 -0
  250. package/dist/components/editable-text/editableTextDom.js +24 -0
  251. package/dist/components/editable-text/editableTextDom.js.map +1 -0
  252. package/dist/components/editable-text/floatingPosition.d.ts +25 -0
  253. package/dist/components/editable-text/floatingPosition.d.ts.map +1 -0
  254. package/dist/components/editable-text/floatingPosition.js +35 -0
  255. package/dist/components/editable-text/floatingPosition.js.map +1 -0
  256. package/dist/components/editable-text/formatting.d.ts +15 -0
  257. package/dist/components/editable-text/formatting.d.ts.map +1 -0
  258. package/dist/components/editable-text/formatting.js +82 -0
  259. package/dist/components/editable-text/formatting.js.map +1 -0
  260. package/dist/components/editable-text/richCommands.d.ts +9 -0
  261. package/dist/components/editable-text/richCommands.d.ts.map +1 -0
  262. package/dist/components/editable-text/richCommands.js +41 -0
  263. package/dist/components/editable-text/richCommands.js.map +1 -0
  264. package/dist/components/editable-text/richHtml.d.ts +5 -0
  265. package/dist/components/editable-text/richHtml.d.ts.map +1 -0
  266. package/dist/components/editable-text/richHtml.js +150 -0
  267. package/dist/components/editable-text/richHtml.js.map +1 -0
  268. package/dist/components/editable-text/selection.d.ts +12 -0
  269. package/dist/components/editable-text/selection.d.ts.map +1 -0
  270. package/dist/components/editable-text/selection.js +119 -0
  271. package/dist/components/editable-text/selection.js.map +1 -0
  272. package/dist/components/editable-text/types.d.ts +32 -0
  273. package/dist/components/editable-text/types.d.ts.map +1 -0
  274. package/dist/components/editable-text/types.js +2 -0
  275. package/dist/components/editable-text/types.js.map +1 -0
  276. package/dist/components/editable-text/useEditableText.d.ts +35 -0
  277. package/dist/components/editable-text/useEditableText.d.ts.map +1 -0
  278. package/dist/components/editable-text/useEditableText.js +395 -0
  279. package/dist/components/editable-text/useEditableText.js.map +1 -0
  280. package/dist/components/image-editor/ImageEditorDialog.d.ts +16 -0
  281. package/dist/components/image-editor/ImageEditorDialog.d.ts.map +1 -0
  282. package/dist/components/image-editor/ImageEditorDialog.js +137 -0
  283. package/dist/components/image-editor/ImageEditorDialog.js.map +1 -0
  284. package/dist/components/image-editor/ImagePreview.d.ts +15 -0
  285. package/dist/components/image-editor/ImagePreview.d.ts.map +1 -0
  286. package/dist/components/image-editor/ImagePreview.js +16 -0
  287. package/dist/components/image-editor/ImagePreview.js.map +1 -0
  288. package/dist/components/image-editor/MediaBrowser.d.ts +22 -0
  289. package/dist/components/image-editor/MediaBrowser.d.ts.map +1 -0
  290. package/dist/components/image-editor/MediaBrowser.js +16 -0
  291. package/dist/components/image-editor/MediaBrowser.js.map +1 -0
  292. package/dist/components/image-editor/UsageSettingsForm.d.ts +10 -0
  293. package/dist/components/image-editor/UsageSettingsForm.d.ts.map +1 -0
  294. package/dist/components/image-editor/UsageSettingsForm.js +29 -0
  295. package/dist/components/image-editor/UsageSettingsForm.js.map +1 -0
  296. package/dist/components/image-editor/preview-style.d.ts +7 -0
  297. package/dist/components/image-editor/preview-style.d.ts.map +1 -0
  298. package/dist/components/image-editor/preview-style.js +47 -0
  299. package/dist/components/image-editor/preview-style.js.map +1 -0
  300. package/dist/components/image-editor/stage.d.ts +14 -0
  301. package/dist/components/image-editor/stage.d.ts.map +1 -0
  302. package/dist/components/image-editor/stage.js +116 -0
  303. package/dist/components/image-editor/stage.js.map +1 -0
  304. package/dist/components/image-editor/types.d.ts +38 -0
  305. package/dist/components/image-editor/types.d.ts.map +1 -0
  306. package/dist/components/image-editor/types.js +10 -0
  307. package/dist/components/image-editor/types.js.map +1 -0
  308. package/dist/components/image-editor/usage-conversion.d.ts +35 -0
  309. package/dist/components/image-editor/usage-conversion.d.ts.map +1 -0
  310. package/dist/components/image-editor/usage-conversion.js +249 -0
  311. package/dist/components/image-editor/usage-conversion.js.map +1 -0
  312. package/dist/components/inspector/CollectionItemFields.d.ts +10 -0
  313. package/dist/components/inspector/CollectionItemFields.d.ts.map +1 -0
  314. package/dist/components/inspector/CollectionItemFields.js +13 -0
  315. package/dist/components/inspector/CollectionItemFields.js.map +1 -0
  316. package/dist/components/inspector/ContentBindingControl.d.ts +14 -0
  317. package/dist/components/inspector/ContentBindingControl.d.ts.map +1 -0
  318. package/dist/components/inspector/ContentBindingControl.js +42 -0
  319. package/dist/components/inspector/ContentBindingControl.js.map +1 -0
  320. package/dist/components/inspector/PinControl.d.ts +10 -0
  321. package/dist/components/inspector/PinControl.d.ts.map +1 -0
  322. package/dist/components/inspector/PinControl.js +14 -0
  323. package/dist/components/inspector/PinControl.js.map +1 -0
  324. package/dist/components/inspector/constants.d.ts +8 -0
  325. package/dist/components/inspector/constants.d.ts.map +1 -0
  326. package/dist/components/inspector/constants.js +12 -0
  327. package/dist/components/inspector/constants.js.map +1 -0
  328. package/dist/components/inspector/content-item-label.d.ts +2 -0
  329. package/dist/components/inspector/content-item-label.d.ts.map +1 -0
  330. package/dist/components/inspector/content-item-label.js +23 -0
  331. package/dist/components/inspector/content-item-label.js.map +1 -0
  332. package/dist/components/page-frame/InsertSlot.d.ts +19 -0
  333. package/dist/components/page-frame/InsertSlot.d.ts.map +1 -0
  334. package/dist/components/page-frame/InsertSlot.js +55 -0
  335. package/dist/components/page-frame/InsertSlot.js.map +1 -0
  336. package/dist/components/page-frame/PageFrameBlockList.d.ts +43 -0
  337. package/dist/components/page-frame/PageFrameBlockList.d.ts.map +1 -0
  338. package/dist/components/page-frame/PageFrameBlockList.js +204 -0
  339. package/dist/components/page-frame/PageFrameBlockList.js.map +1 -0
  340. package/dist/components/page-frame/PageFrameControls.d.ts +23 -0
  341. package/dist/components/page-frame/PageFrameControls.d.ts.map +1 -0
  342. package/dist/components/page-frame/PageFrameControls.js +36 -0
  343. package/dist/components/page-frame/PageFrameControls.js.map +1 -0
  344. package/dist/components/page-frame/PageFramePathEditor.d.ts +33 -0
  345. package/dist/components/page-frame/PageFramePathEditor.d.ts.map +1 -0
  346. package/dist/components/page-frame/PageFramePathEditor.js +5 -0
  347. package/dist/components/page-frame/PageFramePathEditor.js.map +1 -0
  348. package/dist/components/page-frame/viewport.d.ts +26 -0
  349. package/dist/components/page-frame/viewport.d.ts.map +1 -0
  350. package/dist/components/page-frame/viewport.js +37 -0
  351. package/dist/components/page-frame/viewport.js.map +1 -0
  352. package/dist/content-model.d.ts +36 -0
  353. package/dist/content-model.d.ts.map +1 -0
  354. package/dist/content-model.js +15 -0
  355. package/dist/content-model.js.map +1 -0
  356. package/dist/contentModel.d.ts +3 -0
  357. package/dist/contentModel.d.ts.map +1 -0
  358. package/dist/contentModel.js +2 -0
  359. package/dist/contentModel.js.map +1 -0
  360. package/dist/designSettings.d.ts +11 -0
  361. package/dist/designSettings.d.ts.map +1 -0
  362. package/dist/designSettings.js +96 -0
  363. package/dist/designSettings.js.map +1 -0
  364. package/dist/drag-transfer.d.ts +28 -0
  365. package/dist/drag-transfer.d.ts.map +1 -0
  366. package/dist/drag-transfer.js +42 -0
  367. package/dist/drag-transfer.js.map +1 -0
  368. package/dist/editor/app/AppCanvas.d.ts +2 -0
  369. package/dist/editor/app/AppCanvas.d.ts.map +1 -0
  370. package/dist/editor/app/AppCanvas.js +2 -0
  371. package/dist/editor/app/AppCanvas.js.map +1 -0
  372. package/dist/editor/app/AppDialogs.d.ts +2 -0
  373. package/dist/editor/app/AppDialogs.d.ts.map +1 -0
  374. package/dist/editor/app/AppDialogs.js +2 -0
  375. package/dist/editor/app/AppDialogs.js.map +1 -0
  376. package/dist/editor/app/AppInspectorPanel.d.ts +2 -0
  377. package/dist/editor/app/AppInspectorPanel.d.ts.map +1 -0
  378. package/dist/editor/app/AppInspectorPanel.js +2 -0
  379. package/dist/editor/app/AppInspectorPanel.js.map +1 -0
  380. package/dist/editor/app/deriveSelectionState.d.ts +2 -0
  381. package/dist/editor/app/deriveSelectionState.d.ts.map +1 -0
  382. package/dist/editor/app/deriveSelectionState.js +2 -0
  383. package/dist/editor/app/deriveSelectionState.js.map +1 -0
  384. package/dist/editor/app/helpers.d.ts +2 -0
  385. package/dist/editor/app/helpers.d.ts.map +1 -0
  386. package/dist/editor/app/helpers.js +2 -0
  387. package/dist/editor/app/helpers.js.map +1 -0
  388. package/dist/editor/app/useCollectionEditing.d.ts +2 -0
  389. package/dist/editor/app/useCollectionEditing.d.ts.map +1 -0
  390. package/dist/editor/app/useCollectionEditing.js +2 -0
  391. package/dist/editor/app/useCollectionEditing.js.map +1 -0
  392. package/dist/editor/app/useCommitActions.d.ts +2 -0
  393. package/dist/editor/app/useCommitActions.d.ts.map +1 -0
  394. package/dist/editor/app/useCommitActions.js +2 -0
  395. package/dist/editor/app/useCommitActions.js.map +1 -0
  396. package/dist/editor/app/useEditorEffects.d.ts +2 -0
  397. package/dist/editor/app/useEditorEffects.d.ts.map +1 -0
  398. package/dist/editor/app/useEditorEffects.js +2 -0
  399. package/dist/editor/app/useEditorEffects.js.map +1 -0
  400. package/dist/editor/app/useEditorRuntime.d.ts +2 -0
  401. package/dist/editor/app/useEditorRuntime.d.ts.map +1 -0
  402. package/dist/editor/app/useEditorRuntime.js +2 -0
  403. package/dist/editor/app/useEditorRuntime.js.map +1 -0
  404. package/dist/editor/app/useEditorState.d.ts +2 -0
  405. package/dist/editor/app/useEditorState.d.ts.map +1 -0
  406. package/dist/editor/app/useEditorState.js +2 -0
  407. package/dist/editor/app/useEditorState.js.map +1 -0
  408. package/dist/editor/app/usePageOps.d.ts +2 -0
  409. package/dist/editor/app/usePageOps.d.ts.map +1 -0
  410. package/dist/editor/app/usePageOps.js +2 -0
  411. package/dist/editor/app/usePageOps.js.map +1 -0
  412. package/dist/editor/app/usePersistence.d.ts +2 -0
  413. package/dist/editor/app/usePersistence.d.ts.map +1 -0
  414. package/dist/editor/app/usePersistence.js +2 -0
  415. package/dist/editor/app/usePersistence.js.map +1 -0
  416. package/dist/editor/app/usePreviewSession.d.ts +2 -0
  417. package/dist/editor/app/usePreviewSession.d.ts.map +1 -0
  418. package/dist/editor/app/usePreviewSession.js +2 -0
  419. package/dist/editor/app/usePreviewSession.js.map +1 -0
  420. package/dist/editor/app/useWorkspaceDocumentSync.d.ts +2 -0
  421. package/dist/editor/app/useWorkspaceDocumentSync.d.ts.map +1 -0
  422. package/dist/editor/app/useWorkspaceDocumentSync.js +2 -0
  423. package/dist/editor/app/useWorkspaceDocumentSync.js.map +1 -0
  424. package/dist/editor/bindingChips.d.ts +2 -0
  425. package/dist/editor/bindingChips.d.ts.map +1 -0
  426. package/dist/editor/bindingChips.js +2 -0
  427. package/dist/editor/bindingChips.js.map +1 -0
  428. package/dist/editor/blockInteraction.d.ts +2 -0
  429. package/dist/editor/blockInteraction.d.ts.map +1 -0
  430. package/dist/editor/blockInteraction.js +2 -0
  431. package/dist/editor/blockInteraction.js.map +1 -0
  432. package/dist/editor/blockPresets.d.ts +2 -0
  433. package/dist/editor/blockPresets.d.ts.map +1 -0
  434. package/dist/editor/blockPresets.js +2 -0
  435. package/dist/editor/blockPresets.js.map +1 -0
  436. package/dist/editor/collectionItemAddress.d.ts +2 -0
  437. package/dist/editor/collectionItemAddress.d.ts.map +1 -0
  438. package/dist/editor/collectionItemAddress.js +2 -0
  439. package/dist/editor/collectionItemAddress.js.map +1 -0
  440. package/dist/editor/contentModel.d.ts +2 -0
  441. package/dist/editor/contentModel.d.ts.map +1 -0
  442. package/dist/editor/contentModel.js +2 -0
  443. package/dist/editor/contentModel.js.map +1 -0
  444. package/dist/editor/designSettings.d.ts +2 -0
  445. package/dist/editor/designSettings.d.ts.map +1 -0
  446. package/dist/editor/designSettings.js +2 -0
  447. package/dist/editor/designSettings.js.map +1 -0
  448. package/dist/editor/editorClipboard.d.ts +2 -0
  449. package/dist/editor/editorClipboard.d.ts.map +1 -0
  450. package/dist/editor/editorClipboard.js +2 -0
  451. package/dist/editor/editorClipboard.js.map +1 -0
  452. package/dist/editor/formatDate.d.ts +2 -0
  453. package/dist/editor/formatDate.d.ts.map +1 -0
  454. package/dist/editor/formatDate.js +2 -0
  455. package/dist/editor/formatDate.js.map +1 -0
  456. package/dist/editor/iconCatalog.d.ts +2 -0
  457. package/dist/editor/iconCatalog.d.ts.map +1 -0
  458. package/dist/editor/iconCatalog.js +2 -0
  459. package/dist/editor/iconCatalog.js.map +1 -0
  460. package/dist/editor/pageActions.d.ts +2 -0
  461. package/dist/editor/pageActions.d.ts.map +1 -0
  462. package/dist/editor/pageActions.js +2 -0
  463. package/dist/editor/pageActions.js.map +1 -0
  464. package/dist/editor/pagePaths.d.ts +2 -0
  465. package/dist/editor/pagePaths.d.ts.map +1 -0
  466. package/dist/editor/pagePaths.js +2 -0
  467. package/dist/editor/pagePaths.js.map +1 -0
  468. package/dist/editor/pagesActions.d.ts +2 -0
  469. package/dist/editor/pagesActions.d.ts.map +1 -0
  470. package/dist/editor/pagesActions.js +2 -0
  471. package/dist/editor/pagesActions.js.map +1 -0
  472. package/dist/editor/renderActions.d.ts +2 -0
  473. package/dist/editor/renderActions.d.ts.map +1 -0
  474. package/dist/editor/renderActions.js +2 -0
  475. package/dist/editor/renderActions.js.map +1 -0
  476. package/dist/editor/translation.d.ts +2 -0
  477. package/dist/editor/translation.d.ts.map +1 -0
  478. package/dist/editor/translation.js +2 -0
  479. package/dist/editor/translation.js.map +1 -0
  480. package/dist/editor/useCanvasBackStack.d.ts +2 -0
  481. package/dist/editor/useCanvasBackStack.d.ts.map +1 -0
  482. package/dist/editor/useCanvasBackStack.js +2 -0
  483. package/dist/editor/useCanvasBackStack.js.map +1 -0
  484. package/dist/editor/useCanvasCamera.d.ts +2 -0
  485. package/dist/editor/useCanvasCamera.d.ts.map +1 -0
  486. package/dist/editor/useCanvasCamera.js +2 -0
  487. package/dist/editor/useCanvasCamera.js.map +1 -0
  488. package/dist/editor/useCanvasFocus.d.ts +2 -0
  489. package/dist/editor/useCanvasFocus.d.ts.map +1 -0
  490. package/dist/editor/useCanvasFocus.js +2 -0
  491. package/dist/editor/useCanvasFocus.js.map +1 -0
  492. package/dist/editor/useCanvasKeyboardNav.d.ts +2 -0
  493. package/dist/editor/useCanvasKeyboardNav.d.ts.map +1 -0
  494. package/dist/editor/useCanvasKeyboardNav.js +2 -0
  495. package/dist/editor/useCanvasKeyboardNav.js.map +1 -0
  496. package/dist/editor/useClipboardActions.d.ts +2 -0
  497. package/dist/editor/useClipboardActions.d.ts.map +1 -0
  498. package/dist/editor/useClipboardActions.js +2 -0
  499. package/dist/editor/useClipboardActions.js.map +1 -0
  500. package/dist/editor/useColumnWindow.d.ts +2 -0
  501. package/dist/editor/useColumnWindow.d.ts.map +1 -0
  502. package/dist/editor/useColumnWindow.js +2 -0
  503. package/dist/editor/useColumnWindow.js.map +1 -0
  504. package/dist/editor/useEditorHistory.d.ts +2 -0
  505. package/dist/editor/useEditorHistory.d.ts.map +1 -0
  506. package/dist/editor/useEditorHistory.js +2 -0
  507. package/dist/editor/useEditorHistory.js.map +1 -0
  508. package/dist/editor/usePagePathEditor.d.ts +2 -0
  509. package/dist/editor/usePagePathEditor.d.ts.map +1 -0
  510. package/dist/editor/usePagePathEditor.js +2 -0
  511. package/dist/editor/usePagePathEditor.js.map +1 -0
  512. package/dist/editor/usePageTitleEditor.d.ts +2 -0
  513. package/dist/editor/usePageTitleEditor.d.ts.map +1 -0
  514. package/dist/editor/usePageTitleEditor.js +2 -0
  515. package/dist/editor/usePageTitleEditor.js.map +1 -0
  516. package/dist/editor/useTextFocusIntent.d.ts +2 -0
  517. package/dist/editor/useTextFocusIntent.d.ts.map +1 -0
  518. package/dist/editor/useTextFocusIntent.js +2 -0
  519. package/dist/editor/useTextFocusIntent.js.map +1 -0
  520. package/dist/editorClipboard.d.ts +23 -0
  521. package/dist/editorClipboard.d.ts.map +1 -0
  522. package/dist/editorClipboard.js +46 -0
  523. package/dist/editorClipboard.js.map +1 -0
  524. package/dist/fields-bridge.d.ts +26 -0
  525. package/dist/fields-bridge.d.ts.map +1 -0
  526. package/dist/fields-bridge.js +217 -0
  527. package/dist/fields-bridge.js.map +1 -0
  528. package/dist/formatDate.d.ts +8 -0
  529. package/dist/formatDate.d.ts.map +1 -0
  530. package/dist/formatDate.js +34 -0
  531. package/dist/formatDate.js.map +1 -0
  532. package/dist/grid-state.d.ts +29 -0
  533. package/dist/grid-state.d.ts.map +1 -0
  534. package/dist/grid-state.js +207 -0
  535. package/dist/grid-state.js.map +1 -0
  536. package/dist/history/commands.d.ts +29 -0
  537. package/dist/history/commands.d.ts.map +1 -0
  538. package/dist/history/commands.js +63 -0
  539. package/dist/history/commands.js.map +1 -0
  540. package/dist/history/diff.d.ts +22 -0
  541. package/dist/history/diff.d.ts.map +1 -0
  542. package/dist/history/diff.js +259 -0
  543. package/dist/history/diff.js.map +1 -0
  544. package/dist/history/transforms.d.ts +19 -0
  545. package/dist/history/transforms.d.ts.map +1 -0
  546. package/dist/history/transforms.js +69 -0
  547. package/dist/history/transforms.js.map +1 -0
  548. package/dist/history/types.d.ts +23 -0
  549. package/dist/history/types.d.ts.map +1 -0
  550. package/dist/history/types.js +11 -0
  551. package/dist/history/types.js.map +1 -0
  552. package/dist/host-services.d.ts +57 -0
  553. package/dist/host-services.d.ts.map +1 -0
  554. package/dist/host-services.js +2 -0
  555. package/dist/host-services.js.map +1 -0
  556. package/dist/iconCatalog.d.ts +16 -0
  557. package/dist/iconCatalog.d.ts.map +1 -0
  558. package/dist/iconCatalog.js +32 -0
  559. package/dist/iconCatalog.js.map +1 -0
  560. package/dist/index.d.ts +33 -0
  561. package/dist/index.d.ts.map +1 -0
  562. package/dist/index.js +26 -0
  563. package/dist/index.js.map +1 -0
  564. package/dist/insert-menu.d.ts +17 -0
  565. package/dist/insert-menu.d.ts.map +1 -0
  566. package/dist/insert-menu.js +35 -0
  567. package/dist/insert-menu.js.map +1 -0
  568. package/dist/model/bind-map.d.ts +6 -0
  569. package/dist/model/bind-map.d.ts.map +1 -0
  570. package/dist/model/bind-map.js +6 -0
  571. package/dist/model/bind-map.js.map +1 -0
  572. package/dist/model/layout-columns.d.ts +51 -0
  573. package/dist/model/layout-columns.d.ts.map +1 -0
  574. package/dist/model/layout-columns.js +74 -0
  575. package/dist/model/layout-columns.js.map +1 -0
  576. package/dist/model/page-topology.d.ts +20 -0
  577. package/dist/model/page-topology.d.ts.map +1 -0
  578. package/dist/model/page-topology.js +94 -0
  579. package/dist/model/page-topology.js.map +1 -0
  580. package/dist/model/page-tree-bridge.d.ts +81 -0
  581. package/dist/model/page-tree-bridge.d.ts.map +1 -0
  582. package/dist/model/page-tree-bridge.js +234 -0
  583. package/dist/model/page-tree-bridge.js.map +1 -0
  584. package/dist/model/prop-access.d.ts +69 -0
  585. package/dist/model/prop-access.d.ts.map +1 -0
  586. package/dist/model/prop-access.js +94 -0
  587. package/dist/model/prop-access.js.map +1 -0
  588. package/dist/mount.d.ts +25 -0
  589. package/dist/mount.d.ts.map +1 -0
  590. package/dist/mount.js +26 -0
  591. package/dist/mount.js.map +1 -0
  592. package/dist/page-actions.d.ts +26 -0
  593. package/dist/page-actions.d.ts.map +1 -0
  594. package/dist/page-actions.js +118 -0
  595. package/dist/page-actions.js.map +1 -0
  596. package/dist/pageActions.d.ts +4 -0
  597. package/dist/pageActions.d.ts.map +1 -0
  598. package/dist/pageActions.js +4 -0
  599. package/dist/pageActions.js.map +1 -0
  600. package/dist/pagePaths.d.ts +30 -0
  601. package/dist/pagePaths.d.ts.map +1 -0
  602. package/dist/pagePaths.js +102 -0
  603. package/dist/pagePaths.js.map +1 -0
  604. package/dist/pagesActions.d.ts +60 -0
  605. package/dist/pagesActions.d.ts.map +1 -0
  606. package/dist/pagesActions.js +216 -0
  607. package/dist/pagesActions.js.map +1 -0
  608. package/dist/preview-auth.d.ts +29 -0
  609. package/dist/preview-auth.d.ts.map +1 -0
  610. package/dist/preview-auth.js +18 -0
  611. package/dist/preview-auth.js.map +1 -0
  612. package/dist/renderActions.d.ts +30 -0
  613. package/dist/renderActions.d.ts.map +1 -0
  614. package/dist/renderActions.js +2 -0
  615. package/dist/renderActions.js.map +1 -0
  616. package/dist/translation.d.ts +78 -0
  617. package/dist/translation.d.ts.map +1 -0
  618. package/dist/translation.js +64 -0
  619. package/dist/translation.js.map +1 -0
  620. package/dist/types.d.ts +128 -0
  621. package/dist/types.d.ts.map +1 -0
  622. package/dist/types.js +2 -0
  623. package/dist/types.js.map +1 -0
  624. package/dist/useCanvasBackStack.d.ts +19 -0
  625. package/dist/useCanvasBackStack.d.ts.map +1 -0
  626. package/dist/useCanvasBackStack.js +49 -0
  627. package/dist/useCanvasBackStack.js.map +1 -0
  628. package/dist/useCanvasCamera.d.ts +37 -0
  629. package/dist/useCanvasCamera.d.ts.map +1 -0
  630. package/dist/useCanvasCamera.js +247 -0
  631. package/dist/useCanvasCamera.js.map +1 -0
  632. package/dist/useCanvasFocus.d.ts +32 -0
  633. package/dist/useCanvasFocus.d.ts.map +1 -0
  634. package/dist/useCanvasFocus.js +114 -0
  635. package/dist/useCanvasFocus.js.map +1 -0
  636. package/dist/useCanvasKeyboardNav.d.ts +32 -0
  637. package/dist/useCanvasKeyboardNav.d.ts.map +1 -0
  638. package/dist/useCanvasKeyboardNav.js +185 -0
  639. package/dist/useCanvasKeyboardNav.js.map +1 -0
  640. package/dist/useClipboardActions.d.ts +37 -0
  641. package/dist/useClipboardActions.d.ts.map +1 -0
  642. package/dist/useClipboardActions.js +126 -0
  643. package/dist/useClipboardActions.js.map +1 -0
  644. package/dist/useColumnWindow.d.ts +29 -0
  645. package/dist/useColumnWindow.d.ts.map +1 -0
  646. package/dist/useColumnWindow.js +80 -0
  647. package/dist/useColumnWindow.js.map +1 -0
  648. package/dist/useEditorHistory.d.ts +18 -0
  649. package/dist/useEditorHistory.d.ts.map +1 -0
  650. package/dist/useEditorHistory.js +91 -0
  651. package/dist/useEditorHistory.js.map +1 -0
  652. package/dist/usePagePathEditor.d.ts +36 -0
  653. package/dist/usePagePathEditor.d.ts.map +1 -0
  654. package/dist/usePagePathEditor.js +163 -0
  655. package/dist/usePagePathEditor.js.map +1 -0
  656. package/dist/usePageTitleEditor.d.ts +17 -0
  657. package/dist/usePageTitleEditor.d.ts.map +1 -0
  658. package/dist/usePageTitleEditor.js +101 -0
  659. package/dist/usePageTitleEditor.js.map +1 -0
  660. package/dist/useTextFocusIntent.d.ts +13 -0
  661. package/dist/useTextFocusIntent.d.ts.map +1 -0
  662. package/dist/useTextFocusIntent.js +70 -0
  663. package/dist/useTextFocusIntent.js.map +1 -0
  664. package/package.json +58 -0
  665. package/styles/index.css +196 -0
  666. package/styles/preview-auth.css +17 -0
@@ -0,0 +1,74 @@
1
+ import { literal, unwrapProp } from "./prop-access.js";
2
+ /**
3
+ * The `layout.columns` block's nesting is canonical `BlockNode.children` (plan
4
+ * §1 D1): each column is a `layout.column` `BlockNode` (its inner blocks are
5
+ * that node's `children`), and the grid geometry — `colstart`/`colspan`/
6
+ * `rowstart`/`rowspan`/`order` — rides a `{kind:"literal"}` `props["grid"]`
7
+ * array on the parent layout node, one `GridCell` per column id. This module
8
+ * is the ONE bridge between the canonical children/grid representation the tree
9
+ * engine operates on and the flat `LayoutColumnView` the layout editor renders.
10
+ */
11
+ export const LAYOUT_COLUMNS_TYPE = "layout.columns";
12
+ export const LAYOUT_COLUMN_TYPE = "layout.column";
13
+ /** Reserved literal-prop key on a layout node carrying its per-column grid
14
+ * geometry (D1). One cell per column child, keyed by the column node id. */
15
+ export const GRID_PROP = "grid";
16
+ /** Is this a canonical layout node (its columns live in `children` + `grid`)? */
17
+ export function isLayoutColumnsNode(node) {
18
+ return node.kind === "block" && node.blockType === LAYOUT_COLUMNS_TYPE;
19
+ }
20
+ function readGridCells(node) {
21
+ const raw = unwrapProp(node.props[GRID_PROP]);
22
+ return Array.isArray(raw) ? raw : [];
23
+ }
24
+ /**
25
+ * The `LayoutColumnView[]` the layout editor consumes, derived from a layout
26
+ * node's `children` (the column nodes) + `props.grid` (the geometry). A column
27
+ * with no matching grid cell falls back to a full-width single-row cell so a
28
+ * malformed page still renders rather than dropping the column.
29
+ */
30
+ export function columnsView(node) {
31
+ const cells = readGridCells(node);
32
+ const byId = new Map(cells.map((cell) => [cell.id, cell]));
33
+ return (node.children ?? []).map((child, index) => {
34
+ const cell = byId.get(child.id);
35
+ const children = child.kind === "block" ? (child.children ?? []) : [];
36
+ return {
37
+ id: child.id,
38
+ colstart: cell?.colstart ?? 1,
39
+ colspan: cell?.colspan ?? 12,
40
+ rowstart: cell?.rowstart ?? 1,
41
+ rowspan: cell?.rowspan ?? 1,
42
+ order: cell?.order ?? index,
43
+ children,
44
+ };
45
+ });
46
+ }
47
+ /**
48
+ * Fold a whole-array `LayoutColumnView[]` replace (a geometry/content edit from
49
+ * the layout editor) back onto a layout `BlockNode`: rebuild the column
50
+ * children from each view's `children` and re-derive the `grid` literal. The
51
+ * ONE writer of a layout node's structure.
52
+ */
53
+ export function withColumns(node, columns) {
54
+ const children = columns.map((column) => ({
55
+ id: column.id,
56
+ kind: "block",
57
+ blockType: LAYOUT_COLUMN_TYPE,
58
+ props: {},
59
+ children: column.children,
60
+ }));
61
+ const grid = literal(columns.map(cellOf));
62
+ return { ...node, props: { ...node.props, [GRID_PROP]: grid }, children };
63
+ }
64
+ function cellOf(column) {
65
+ return {
66
+ id: column.id,
67
+ colstart: column.colstart,
68
+ colspan: column.colspan,
69
+ rowstart: column.rowstart,
70
+ rowspan: column.rowspan,
71
+ order: column.order,
72
+ };
73
+ }
74
+ //# sourceMappingURL=layout-columns.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout-columns.js","sourceRoot":"","sources":["../../src/model/layout-columns.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { PageNode } from "@batterai/bind-core";
2
+ import type { CanvasPage } from "../types";
3
+ export interface PageTopology {
4
+ readonly pageById: ReadonlyMap<string, CanvasPage>;
5
+ readonly childrenByParent: ReadonlyMap<string, readonly CanvasPage[]>;
6
+ readonly roots: readonly CanvasPage[];
7
+ readonly preorder: readonly CanvasPage[];
8
+ readonly pagesByRoot: ReadonlyMap<string, readonly CanvasPage[]>;
9
+ readonly depthById: ReadonlyMap<string, number>;
10
+ readonly topLevelAncestorById: ReadonlyMap<string, string>;
11
+ readonly blockOwnerPageId: ReadonlyMap<string, string>;
12
+ readonly nodeById: ReadonlyMap<string, PageNode>;
13
+ }
14
+ /**
15
+ * Builds every page and block lookup used by the board in one O(pages + nodes)
16
+ * pass. Invalid graphs are rejected instead of being silently promoted to
17
+ * roots; untrusted documents must already have passed the contract parser.
18
+ */
19
+ export declare function buildPageTopology(pages: readonly CanvasPage[]): PageTopology;
20
+ //# sourceMappingURL=page-topology.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-topology.d.ts","sourceRoot":"","sources":["../../src/model/page-topology.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACnD,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC,CAAC;IACtE,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;IACzC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC,CAAC;IACjE,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChD,QAAQ,CAAC,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3D,QAAQ,CAAC,gBAAgB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CAClD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,YAAY,CAkF5E"}
@@ -0,0 +1,94 @@
1
+ import { deriveCanvasPageParents } from "@batterai/contract";
2
+ /**
3
+ * Builds every page and block lookup used by the board in one O(pages + nodes)
4
+ * pass. Invalid graphs are rejected instead of being silently promoted to
5
+ * roots; untrusted documents must already have passed the contract parser.
6
+ */
7
+ export function buildPageTopology(pages) {
8
+ const hierarchyPages = deriveCanvasPageParents(pages);
9
+ const pageById = new Map();
10
+ const childrenByParent = new Map();
11
+ const roots = [];
12
+ for (const page of hierarchyPages) {
13
+ if (pageById.has(page.id))
14
+ throw new Error(`Duplicate Canvas page id: ${page.id}`);
15
+ pageById.set(page.id, page);
16
+ }
17
+ for (const page of hierarchyPages) {
18
+ if (page.parentId === null || page.parentId === undefined) {
19
+ roots.push(page);
20
+ continue;
21
+ }
22
+ if (!pageById.has(page.parentId)) {
23
+ throw new Error(`Canvas page ${page.id} references missing parent ${page.parentId}`);
24
+ }
25
+ const children = childrenByParent.get(page.parentId) ?? [];
26
+ children.push(page);
27
+ childrenByParent.set(page.parentId, children);
28
+ }
29
+ const preorder = [];
30
+ const pagesByRoot = new Map();
31
+ const depthById = new Map();
32
+ const topLevelAncestorById = new Map();
33
+ const visiting = new Set();
34
+ const visited = new Set();
35
+ function visit(page, rootId, depth, column) {
36
+ if (visiting.has(page.id))
37
+ throw new Error(`Canvas page parent cycle includes ${page.id}`);
38
+ if (visited.has(page.id))
39
+ throw new Error(`Canvas page ${page.id} occurs more than once in the graph`);
40
+ visiting.add(page.id);
41
+ visited.add(page.id);
42
+ depthById.set(page.id, depth);
43
+ topLevelAncestorById.set(page.id, rootId);
44
+ preorder.push(page);
45
+ column.push(page);
46
+ for (const child of childrenByParent.get(page.id) ?? [])
47
+ visit(child, rootId, depth + 1, column);
48
+ visiting.delete(page.id);
49
+ }
50
+ for (const root of roots) {
51
+ const column = [];
52
+ visit(root, root.id, 0, column);
53
+ pagesByRoot.set(root.id, column);
54
+ }
55
+ if (visited.size !== hierarchyPages.length) {
56
+ const unresolved = hierarchyPages.find((page) => !visited.has(page.id));
57
+ throw new Error(`Canvas page parent cycle includes ${unresolved?.id ?? "unknown"}`);
58
+ }
59
+ const blockOwnerPageId = new Map();
60
+ const nodeById = new Map();
61
+ const activeObjects = new WeakSet();
62
+ function indexNode(node, pageId) {
63
+ if (activeObjects.has(node))
64
+ throw new Error(`Canvas node object cycle includes ${node.id}`);
65
+ if (nodeById.has(node.id))
66
+ throw new Error(`Duplicate Canvas node id: ${node.id}`);
67
+ activeObjects.add(node);
68
+ nodeById.set(node.id, node);
69
+ blockOwnerPageId.set(node.id, pageId);
70
+ if (node.kind === "block") {
71
+ for (const child of node.children ?? [])
72
+ indexNode(child, pageId);
73
+ }
74
+ else {
75
+ indexNode(node.itemTemplate, pageId);
76
+ }
77
+ activeObjects.delete(node);
78
+ }
79
+ for (const page of hierarchyPages)
80
+ for (const node of page.root)
81
+ indexNode(node, page.id);
82
+ return {
83
+ pageById,
84
+ childrenByParent,
85
+ roots,
86
+ preorder,
87
+ pagesByRoot,
88
+ depthById,
89
+ topLevelAncestorById,
90
+ blockOwnerPageId,
91
+ nodeById,
92
+ };
93
+ }
94
+ //# sourceMappingURL=page-topology.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-topology.js","sourceRoot":"","sources":["../../src/model/page-topology.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,81 @@
1
+ import { type BlockNode, type PageNode } from "@batterai/bind-core";
2
+ import type { CanvasPage } from "../types";
3
+ import { type LayoutColumnView } from "./layout-columns";
4
+ /**
5
+ * The ONE adapter between the in-memory `CanvasPage` and bind-core's
6
+ * `page-tree.ts` (D5 / A2). The tree is now canonical (`CanvasPage.root` is
7
+ * `PageNode[]`), so every mutation — insert, move, remove, duplicate, patch —
8
+ * runs the single `page-tree.ts` engine directly on `page.root`; there is no
9
+ * per-mutation model round-trip and no second tree walker in the app
10
+ * (`pageActions`/`pagesActions`/`editorClipboard` all funnel through here).
11
+ *
12
+ * Node ids are carried verbatim, so collab lock targets (`nodeId`) stay valid
13
+ * across every mutation (S5).
14
+ */
15
+ type Root = readonly PageNode[];
16
+ /** Locate a block node anywhere in the tree (null = not present / not a block). */
17
+ export declare function findNode(page: CanvasPage, blockId: string | null): BlockNode | null;
18
+ /** The immediate parent id of a block (null = top level), or undefined if the
19
+ * block is not on the page. */
20
+ export declare function parentIdOf(root: Root, blockId: string): string | null | undefined;
21
+ /** Ordered child ids of a parent (null parent = top-level ids). */
22
+ export declare function childIdsOf(root: Root, parentId: string | null): string[];
23
+ /** Insert nodes at `index` within `parentId`, preserving their order. */
24
+ export declare function insertNodesAt(page: CanvasPage, parentId: string | null, index: number, nodes: PageNode[]): CanvasPage;
25
+ /** Insert nodes directly after an anchor block (append when the anchor is
26
+ * missing), matching the old `insertBlocksAfter` semantics. */
27
+ export declare function insertNodesAfter(page: CanvasPage, anchorId: string | null, nodes: PageNode[]): CanvasPage;
28
+ /**
29
+ * Move a block under `parentId`, inserting it at `insertIndex` measured against
30
+ * the destination list AFTER the block has been removed (the post-removal
31
+ * splice index). `movePageNode` removes-then-inserts, so this is the natural,
32
+ * unambiguous index; callers that hold a pre-removal "drop index" adjust before
33
+ * calling (see `moveBlockToTopLevel`/`moveBlockToColumn`).
34
+ */
35
+ export declare function moveNodeTo(page: CanvasPage, blockId: string, parentId: string | null, insertIndex: number): CanvasPage;
36
+ /** The post-removal insertion index for a "drop at `index` in the current
37
+ * list" gesture: dropping past the block's own slot in the SAME parent shifts
38
+ * the tail left by one once the block is removed (the old drop correction). */
39
+ export declare function dropIndexToInsertIndex(page: CanvasPage, blockId: string, parentId: string | null, index: number): number;
40
+ /** Remove a block (top-level or nested) from the page. */
41
+ export declare function removeNode(page: CanvasPage, blockId: string): CanvasPage;
42
+ /** Insert a freshly-minted copy of `blockId` immediately after it (same parent);
43
+ * `mint` supplies the fresh-id copy (an app concern, not a tree concern). */
44
+ export declare function duplicateNode(page: CanvasPage, blockId: string, mint: (block: BlockNode) => BlockNode): CanvasPage;
45
+ /** Patch a block's props (plain values wrapped as literals). */
46
+ export declare function patchNodeProps(page: CanvasPage, blockId: string, patch: Record<string, unknown>): CanvasPage;
47
+ /**
48
+ * Replace a `layout.columns` block's whole column structure from the layout
49
+ * editor's `LayoutColumnView[]` (a geometry/content edit). Rebuilds the column
50
+ * `children` + `grid` literal via `withColumns` (D1); routing this through the
51
+ * generic prop-patch would not touch `children`. Layout blocks never nest, so
52
+ * the target is always top-level — no tree walk beyond the top row is needed.
53
+ */
54
+ export declare function setLayoutColumns(page: CanvasPage, blockId: string, columns: readonly LayoutColumnView[]): CanvasPage;
55
+ /** Replace a block in place with another (kept for the swap/replace drop
56
+ * choices). Preserves the target's slot; the replacement carries its own id. */
57
+ export declare function replaceNode(page: CanvasPage, blockId: string, replacement: BlockNode): CanvasPage;
58
+ /**
59
+ * Substitute the node at `blockId` in place with `replacement`, keeping its
60
+ * slot (position + parent) via `page-tree.ts`'s `replacePageNode`. A no-op when
61
+ * the block is not on this page (so it can be applied to every page
62
+ * unconditionally); the cross-page "replace" drop composes it.
63
+ */
64
+ export declare function substituteNode(page: CanvasPage, blockId: string, replacement: BlockNode): CanvasPage;
65
+ /**
66
+ * Swap two blocks' positions within one page via `page-tree.ts`'s single-pass
67
+ * `swapPageNodes` (matches each against its ORIGINAL id, so it never
68
+ * double-applies the way two sequential substitutes would). A no-op unless both
69
+ * ids live on this page — the cross-page swap handles the split case itself.
70
+ */
71
+ export declare function swapNodes(page: CanvasPage, aId: string, bId: string): CanvasPage;
72
+ /**
73
+ * Remove the node at `removeId` and, in the same pass, substitute the node at
74
+ * `keepAtId` with `replacement` — the "replace" drop choice (source takes the
75
+ * target's slot, source's own slot is dropped). A no-op unless both ids live on
76
+ * this page, so it is safe to apply to every page. */
77
+ export declare function pullNodeInto(page: CanvasPage, removeId: string, keepAtId: string, replacement: BlockNode): CanvasPage;
78
+ /** Every block id under a subtree, in document order (top-level then nested). */
79
+ export declare function collectBlockIds(root: Root): string[];
80
+ export {};
81
+ //# sourceMappingURL=page-tree-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-tree-bridge.d.ts","sourceRoot":"","sources":["../../src/model/page-tree-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,234 @@
1
+ import { findPageNode, insertPageNode, movePageNode, patchPageBlockProps, removePageNode, replacePageNode, swapPageNodes, } from "@batterai/bind-core";
2
+ import { withColumns } from "./layout-columns.js";
3
+ import { literal } from "./prop-access.js";
4
+ /** Run a pure transform of the canonical root and fold the result back onto the
5
+ * page. A transform returning the same root (a rejected mutation) is a no-op. */
6
+ function withRoot(page, transform) {
7
+ const nextRoot = transform(page.root);
8
+ if (nextRoot === page.root)
9
+ return page;
10
+ return { ...page, root: nextRoot };
11
+ }
12
+ /** Locate a block node anywhere in the tree (null = not present / not a block). */
13
+ export function findNode(page, blockId) {
14
+ if (!blockId)
15
+ return null;
16
+ const match = findPageNode(page.root, blockId);
17
+ return match && match.node.kind === "block" ? match.node : null;
18
+ }
19
+ /** The immediate parent id of a block (null = top level), or undefined if the
20
+ * block is not on the page. */
21
+ export function parentIdOf(root, blockId) {
22
+ const match = findPageNode(root, blockId);
23
+ return match ? match.parentId : undefined;
24
+ }
25
+ /** Ordered child ids of a parent (null parent = top-level ids). */
26
+ export function childIdsOf(root, parentId) {
27
+ if (parentId === null)
28
+ return root.map((node) => node.id);
29
+ const parent = findPageNode(root, parentId)?.node;
30
+ if (!parent || parent.kind !== "block")
31
+ return [];
32
+ return (parent.children ?? []).map((node) => node.id);
33
+ }
34
+ /**
35
+ * Turn an insertion index within a parent's sibling list into the anchor
36
+ * `page-tree.ts` expects. Index 0 of a non-empty list must PREPEND (`beforeId`
37
+ * the current head); the middle/end uses `afterId` the preceding sibling; an
38
+ * empty list appends (no anchor). This is why bind-core's insert grew a
39
+ * `beforeId`: `afterId` alone can only append, never prepend.
40
+ */
41
+ function anchorForIndex(siblingIds, index) {
42
+ const clamped = Math.max(0, Math.min(index, siblingIds.length));
43
+ if (clamped === 0) {
44
+ const head = siblingIds[0];
45
+ return head === undefined ? {} : { beforeId: head };
46
+ }
47
+ return { afterId: siblingIds[clamped - 1] };
48
+ }
49
+ /** Insert nodes at `index` within `parentId`, preserving their order. */
50
+ export function insertNodesAt(page, parentId, index, nodes) {
51
+ if (nodes.length === 0)
52
+ return page;
53
+ return withRoot(page, (root) => insertBlocksIntoRoot(root, parentId, index, nodes));
54
+ }
55
+ /** Insert nodes directly after an anchor block (append when the anchor is
56
+ * missing), matching the old `insertBlocksAfter` semantics. */
57
+ export function insertNodesAfter(page, anchorId, nodes) {
58
+ if (nodes.length === 0)
59
+ return page;
60
+ return withRoot(page, (root) => {
61
+ if (!anchorId)
62
+ return appendToRoot(root, null, nodes);
63
+ const parentId = parentIdOf(root, anchorId);
64
+ if (parentId === undefined)
65
+ return appendToRoot(root, null, nodes);
66
+ return sequentialInsert(root, parentId, { afterId: anchorId }, nodes);
67
+ });
68
+ }
69
+ function insertBlocksIntoRoot(root, parentId, index, nodes) {
70
+ return sequentialInsert(root, parentId, anchorForIndex(childIdsOf(root, parentId), index), nodes);
71
+ }
72
+ function appendToRoot(root, parentId, nodes) {
73
+ const afterId = childIdsOf(root, parentId).at(-1);
74
+ return sequentialInsert(root, parentId, { afterId }, nodes);
75
+ }
76
+ /** Insert a run of nodes at an anchor, threading each inserted id as the
77
+ * `afterId` for the next so the run keeps its order (the first honors the
78
+ * given anchor, which may be a `beforeId` prepend). */
79
+ function sequentialInsert(root, parentId, anchor, nodes) {
80
+ let current = root;
81
+ let next = anchor;
82
+ for (const node of nodes) {
83
+ const result = insertPageNode(current, { parentId, ...next }, node);
84
+ if (!result.ok)
85
+ return root;
86
+ current = result.root;
87
+ next = { afterId: node.id };
88
+ }
89
+ return current;
90
+ }
91
+ /**
92
+ * Move a block under `parentId`, inserting it at `insertIndex` measured against
93
+ * the destination list AFTER the block has been removed (the post-removal
94
+ * splice index). `movePageNode` removes-then-inserts, so this is the natural,
95
+ * unambiguous index; callers that hold a pre-removal "drop index" adjust before
96
+ * calling (see `moveBlockToTopLevel`/`moveBlockToColumn`).
97
+ */
98
+ export function moveNodeTo(page, blockId, parentId, insertIndex) {
99
+ return withRoot(page, (root) => {
100
+ const siblingIds = childIdsOf(root, parentId).filter((id) => id !== blockId);
101
+ const anchor = anchorForIndex(siblingIds, insertIndex);
102
+ const result = movePageNode(root, blockId, { parentId, ...anchor });
103
+ return result.ok ? result.root : root;
104
+ });
105
+ }
106
+ /** The post-removal insertion index for a "drop at `index` in the current
107
+ * list" gesture: dropping past the block's own slot in the SAME parent shifts
108
+ * the tail left by one once the block is removed (the old drop correction). */
109
+ export function dropIndexToInsertIndex(page, blockId, parentId, index) {
110
+ const root = page.root;
111
+ const currentParent = parentIdOf(root, blockId);
112
+ const currentIndex = childIdsOf(root, parentId).indexOf(blockId);
113
+ const sameParent = currentParent === parentId && currentIndex >= 0;
114
+ return sameParent && currentIndex < index ? index - 1 : index;
115
+ }
116
+ /** Remove a block (top-level or nested) from the page. */
117
+ export function removeNode(page, blockId) {
118
+ return withRoot(page, (root) => {
119
+ const result = removePageNode(root, blockId);
120
+ return result.ok ? result.root : root;
121
+ });
122
+ }
123
+ /** Insert a freshly-minted copy of `blockId` immediately after it (same parent);
124
+ * `mint` supplies the fresh-id copy (an app concern, not a tree concern). */
125
+ export function duplicateNode(page, blockId, mint) {
126
+ const original = findNode(page, blockId);
127
+ if (!original)
128
+ return page;
129
+ const copy = mint(original);
130
+ return withRoot(page, (root) => {
131
+ const parentId = parentIdOf(root, blockId);
132
+ if (parentId === undefined)
133
+ return root;
134
+ const result = insertPageNode(root, { parentId, afterId: blockId }, copy);
135
+ return result.ok ? result.root : root;
136
+ });
137
+ }
138
+ /** Patch a block's props (plain values wrapped as literals). */
139
+ export function patchNodeProps(page, blockId, patch) {
140
+ return withRoot(page, (root) => {
141
+ const props = {};
142
+ for (const [key, value] of Object.entries(patch))
143
+ props[key] = literal(value);
144
+ const result = patchPageBlockProps(root, blockId, props);
145
+ return result.ok ? result.root : root;
146
+ });
147
+ }
148
+ /**
149
+ * Replace a `layout.columns` block's whole column structure from the layout
150
+ * editor's `LayoutColumnView[]` (a geometry/content edit). Rebuilds the column
151
+ * `children` + `grid` literal via `withColumns` (D1); routing this through the
152
+ * generic prop-patch would not touch `children`. Layout blocks never nest, so
153
+ * the target is always top-level — no tree walk beyond the top row is needed.
154
+ */
155
+ export function setLayoutColumns(page, blockId, columns) {
156
+ return withRoot(page, (root) => root.map((node) => node.id === blockId && node.kind === "block" ? withColumns(node, columns) : node));
157
+ }
158
+ /** Replace a block in place with another (kept for the swap/replace drop
159
+ * choices). Preserves the target's slot; the replacement carries its own id. */
160
+ export function replaceNode(page, blockId, replacement) {
161
+ return withRoot(page, (root) => {
162
+ const parentId = parentIdOf(root, blockId);
163
+ if (parentId === undefined)
164
+ return root;
165
+ const index = childIdsOf(root, parentId).indexOf(blockId);
166
+ const removed = removePageNode(root, blockId);
167
+ if (!removed.ok)
168
+ return root;
169
+ // Address the freed slot against the post-removal sibling list.
170
+ const anchor = anchorForIndex(childIdsOf(removed.root, parentId), index);
171
+ const inserted = insertPageNode(removed.root, { parentId, ...anchor }, replacement);
172
+ return inserted.ok ? inserted.root : root;
173
+ });
174
+ }
175
+ /**
176
+ * Substitute the node at `blockId` in place with `replacement`, keeping its
177
+ * slot (position + parent) via `page-tree.ts`'s `replacePageNode`. A no-op when
178
+ * the block is not on this page (so it can be applied to every page
179
+ * unconditionally); the cross-page "replace" drop composes it.
180
+ */
181
+ export function substituteNode(page, blockId, replacement) {
182
+ return withRoot(page, (root) => {
183
+ if (!findPageNode(root, blockId))
184
+ return root;
185
+ const result = replacePageNode(root, blockId, replacement);
186
+ return result.ok ? result.root : root;
187
+ });
188
+ }
189
+ /**
190
+ * Swap two blocks' positions within one page via `page-tree.ts`'s single-pass
191
+ * `swapPageNodes` (matches each against its ORIGINAL id, so it never
192
+ * double-applies the way two sequential substitutes would). A no-op unless both
193
+ * ids live on this page — the cross-page swap handles the split case itself.
194
+ */
195
+ export function swapNodes(page, aId, bId) {
196
+ return withRoot(page, (root) => {
197
+ if (!findPageNode(root, aId) || !findPageNode(root, bId))
198
+ return root;
199
+ const result = swapPageNodes(root, aId, bId);
200
+ return result.ok ? result.root : root;
201
+ });
202
+ }
203
+ /**
204
+ * Remove the node at `removeId` and, in the same pass, substitute the node at
205
+ * `keepAtId` with `replacement` — the "replace" drop choice (source takes the
206
+ * target's slot, source's own slot is dropped). A no-op unless both ids live on
207
+ * this page, so it is safe to apply to every page. */
208
+ export function pullNodeInto(page, removeId, keepAtId, replacement) {
209
+ return withRoot(page, (root) => {
210
+ if (!findPageNode(root, removeId) || !findPageNode(root, keepAtId))
211
+ return root;
212
+ const removed = removePageNode(root, removeId);
213
+ if (!removed.ok)
214
+ return root;
215
+ const substituted = replacePageNode(removed.root, keepAtId, replacement);
216
+ return substituted.ok ? substituted.root : root;
217
+ });
218
+ }
219
+ /** Every block id under a subtree, in document order (top-level then nested). */
220
+ export function collectBlockIds(root) {
221
+ const ids = [];
222
+ const walk = (nodes) => {
223
+ for (const node of nodes) {
224
+ if (node.kind !== "block")
225
+ continue;
226
+ ids.push(node.id);
227
+ if (node.children?.length)
228
+ walk(node.children);
229
+ }
230
+ };
231
+ walk(root);
232
+ return ids;
233
+ }
234
+ //# sourceMappingURL=page-tree-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-tree-bridge.js","sourceRoot":"","sources":["../../src/model/page-tree-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { BlockNode, PropValue } from "@batterai/bind-core";
2
+ /** Reserved portable block prop for Canvas design settings. */
3
+ export declare const DESIGN_PROP = "design";
4
+ /**
5
+ * The ONE block-prop accessor. Every block-prop read in the app routes through
6
+ * `readProp` and every write through `writeProp`, so the canonical
7
+ * `BlockNode.props` (`PropValue` union) has a single bridge to the plain
8
+ * values the UI works with. A missed direct read renders `[object Object]`; a
9
+ * missed direct write silently drops an edit — hence the grep gate on
10
+ * `.props.<key>`.
11
+ *
12
+ * The in-memory tree is now canonical (Phase 2 keystone): a page's `root` is
13
+ * `PageNode[]` with props as `PropValue`. The accessor stays
14
+ * representation-tolerant — it unwraps a `PropValue` wrapper AND returns a raw
15
+ * value verbatim — so a legacy raw block (e.g. one still crossing the wire, or
16
+ * a fixture) reads through the very same function.
17
+ */
18
+ /** A block whose props are readable by the accessor. Canonically a
19
+ * `BlockNode`; a raw `{ props }` record is also accepted so legacy/wire blocks
20
+ * read identically. */
21
+ export type PropBearer = {
22
+ readonly props: Readonly<Record<string, unknown>>;
23
+ };
24
+ /**
25
+ * Unwrap a stored prop to its plain value. Mirrors proof's `propDisplayValue`
26
+ * (apps/proof/src/editor-app.ts): a literal yields its value; a rich value
27
+ * yields its plain text; a binding yields "" (unresolved at the editor edge —
28
+ * live resolution happens through the resolver, never here). A raw value is
29
+ * returned verbatim. This is a DATA accessor, not a renderer: it never escapes
30
+ * or sanitizes — the single escaping boundary stays at the render sink
31
+ * (EditableText display / bind-core `escape.ts`), preserving invariant S1.
32
+ */
33
+ export declare function unwrapProp(stored: unknown): unknown;
34
+ /** Wrap a plain value as a `{kind:"literal"}` PropValue (ingest direction). */
35
+ export declare function literal<T = unknown>(value: T): PropValue<T>;
36
+ /** Wrap a whole raw prop record as `{kind:"literal"}` PropValues — the
37
+ * canonical props for a `BlockNode` built from a raw source (block definition
38
+ * defaults, a preset, a wire block). */
39
+ export declare function literalProps(raw: Readonly<Record<string, unknown>>): Record<string, PropValue>;
40
+ /**
41
+ * Unwrap a `BlockNode`'s whole prop record to plain values — the multi-key
42
+ * form of `readProp`, for the few consumers that need a raw props object
43
+ * (`@batterai/block-sdk`'s `BlockConfig.props`, the login-copy reader, the
44
+ * unknown-block JSON dump, the collection-list config reader).
45
+ */
46
+ export declare function rawProps(block: PropBearer): Record<string, unknown>;
47
+ /**
48
+ * Read a block prop by key — the ONE read accessor. Returns the plain value
49
+ * (unwrapped from a `PropValue`, or a raw value verbatim), exactly as the
50
+ * pre-convergence `block.props[key]` did, so every downstream guard
51
+ * (`asString`, `typeof x === "string"`, `Array.isArray`, …) keeps working
52
+ * unchanged.
53
+ */
54
+ export declare function readProp(block: PropBearer | null | undefined, key: string): unknown;
55
+ /**
56
+ * Write a block prop by key — the ONE write accessor. Returns a NEW `BlockNode`
57
+ * with `props[key]` set to a `{kind:"literal"}` PropValue (immutable update;
58
+ * the input is not mutated). `undefined` deletes the key.
59
+ */
60
+ export declare function writeProp(block: BlockNode, key: string, value: unknown): BlockNode;
61
+ /** Merge a patch of plain values in one immutable write — the multi-key form of
62
+ * `writeProp`, used by the inspector's props-patch path. Each value is wrapped
63
+ * as a literal `PropValue`; `undefined` deletes the key. */
64
+ export declare function writeProps(block: BlockNode, patch: Record<string, unknown>): BlockNode;
65
+ /** Whether a block carries a value for `key` (presence, not truthiness) —
66
+ * routes the `"key" in block.props` / `hasOwnProperty` checks through the
67
+ * accessor without collapsing a stored empty string to "absent". */
68
+ export declare function hasProp(block: PropBearer, key: string): boolean;
69
+ //# sourceMappingURL=prop-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prop-access.d.ts","sourceRoot":"","sources":["../../src/model/prop-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhE,+DAA+D;AAC/D,eAAO,MAAM,WAAW,WAAW,CAAC;AAEpC;;;;;;;;;;;;;GAaG;AAEH;;uBAEuB;AACvB,MAAM,MAAM,UAAU,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,CAAC;AAQ/E;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CASnD;AAED,+EAA+E;AAC/E,wBAAgB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAE3D;AAED;;wCAEwC;AACxC,wBAAgB,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAI9F;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAInE;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAGnF;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,SAAS,CAElF;AAED;;4DAE4D;AAC5D,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAOtF;AAED;;oEAEoE;AACpE,wBAAgB,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAE/D"}