@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,19 @@
1
+ type UseCanvasBackStackArgs = {
2
+ activePageId: string;
3
+ onActivatePage: (pageId: string) => void;
4
+ };
5
+ /**
6
+ * `useCanvasBackStack` — the board's back history. Every time the active
7
+ * page changes for any reason (a link jump, opening a collection item, an
8
+ * overview jump), the page just left is pushed so a back-press can unwind one
9
+ * hop at a time; a back-press itself is flagged so it pops rather than pushes.
10
+ *
11
+ * Returns the current stack (read by the portal login flow to find where to
12
+ * return to) and the back-press handler.
13
+ */
14
+ export declare function useCanvasBackStack({ activePageId, onActivatePage }: UseCanvasBackStackArgs): {
15
+ backStack: string[];
16
+ handleBack: () => void;
17
+ };
18
+ export {};
19
+ //# sourceMappingURL=useCanvasBackStack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCanvasBackStack.d.ts","sourceRoot":"","sources":["../src/useCanvasBackStack.ts"],"names":[],"mappings":"AAGA,KAAK,sBAAsB,GAAG;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,sBAAsB;;;EAoC1F"}
@@ -0,0 +1,49 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ import { scrollPageFrameIntoView } from "@batterai/canvas";
3
+ /**
4
+ * `useCanvasBackStack` — the board's back history. Every time the active
5
+ * page changes for any reason (a link jump, opening a collection item, an
6
+ * overview jump), the page just left is pushed so a back-press can unwind one
7
+ * hop at a time; a back-press itself is flagged so it pops rather than pushes.
8
+ *
9
+ * Returns the current stack (read by the portal login flow to find where to
10
+ * return to) and the back-press handler.
11
+ */
12
+ export function useCanvasBackStack({ activePageId, onActivatePage }) {
13
+ // Pages visited via an in-canvas link jump, most recent last, so Back
14
+ // can unwind multiple hops one at a time (A -> B -> C, back, back).
15
+ const [backStack, setBackStack] = useState([]);
16
+ // Back-navigation history: whenever the active page changes for ANY reason
17
+ // (a link jump, opening a collection item, clicking another page's block, the
18
+ // overview jump), remember the page we just left so Back can unwind one
19
+ // hop at a time. A back-press itself must NOT record a hop — otherwise Back
20
+ // would ping-pong between the last two pages instead of walking back.
21
+ const prevActivePageRef = useRef(activePageId);
22
+ const backNavRef = useRef(false);
23
+ useEffect(() => {
24
+ const previous = prevActivePageRef.current;
25
+ if (previous === activePageId)
26
+ return;
27
+ prevActivePageRef.current = activePageId;
28
+ if (backNavRef.current) {
29
+ backNavRef.current = false;
30
+ return;
31
+ }
32
+ setBackStack((current) => [...current, previous]);
33
+ }, [activePageId]);
34
+ function handleBack() {
35
+ if (backStack.length === 0)
36
+ return;
37
+ const targetId = backStack[backStack.length - 1];
38
+ if (!targetId)
39
+ return;
40
+ // Mark the coming activePageId change as a back-press so the effect above
41
+ // pops rather than pushes.
42
+ backNavRef.current = true;
43
+ setBackStack((current) => current.slice(0, -1));
44
+ onActivatePage(targetId);
45
+ requestAnimationFrame(() => scrollPageFrameIntoView(targetId));
46
+ }
47
+ return { backStack, handleBack };
48
+ }
49
+ //# sourceMappingURL=useCanvasBackStack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCanvasBackStack.js","sourceRoot":"","sources":["../src/useCanvasBackStack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAO3D;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAAC,EAAE,YAAY,EAAE,cAAc,EAA0B;IACzF,sEAAsE;IACtE,oEAAoE;IACpE,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAEzD,2EAA2E;IAC3E,8EAA8E;IAC9E,wEAAwE;IACxE,4EAA4E;IAC5E,sEAAsE;IACtE,MAAM,iBAAiB,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACjC,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,CAAC;QAC3C,IAAI,QAAQ,KAAK,YAAY;YAAE,OAAO;QACtC,iBAAiB,CAAC,OAAO,GAAG,YAAY,CAAC;QACzC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,UAAU,CAAC,OAAO,GAAG,KAAK,CAAC;YAC3B,OAAO;QACT,CAAC;QACD,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACpD,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC;IAEnB,SAAS,UAAU;QACjB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACnC,MAAM,QAAQ,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ;YAAE,OAAO;QACtB,0EAA0E;QAC1E,2BAA2B;QAC3B,UAAU,CAAC,OAAO,GAAG,IAAI,CAAC;QAC1B,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAChD,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzB,qBAAqB,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { PointerEvent as ReactPointerEvent } from "react";
2
+ type UseCanvasCameraArgs = {
3
+ onActivatePage: (pageId: string) => void;
4
+ };
5
+ /**
6
+ * `useCanvasCamera` — the Figma-style zoom/pan controller for the board.
7
+ *
8
+ * Mid-gesture the live zoom lives in `zoomRef` and is written straight to the
9
+ * DOM (transform on the board, size on the sizer, scroll on the shell, the %
10
+ * label), so React never re-renders during the gesture itself; only after the
11
+ * gesture settles (`ZOOM_SETTLE_MS`) does `setZoom` commit and let the rest of
12
+ * Canvas (the lazy-load window) catch up.
13
+ *
14
+ * The refs are returned so Canvas can attach them to the DOM and so the
15
+ * windowing code can read `zoomRef`/`settleTimerRef`/`shellRef` — those stay
16
+ * shared by design (the window is held still mid-gesture and recomputed on the
17
+ * settle commit).
18
+ */
19
+ export declare function useCanvasCamera({ onActivatePage }: UseCanvasCameraArgs): {
20
+ zoom: number;
21
+ shellRef: import("react").RefObject<HTMLElement | null>;
22
+ boardRef: import("react").RefObject<HTMLDivElement | null>;
23
+ sizerRef: import("react").RefObject<HTMLDivElement | null>;
24
+ zoomLabelRef: import("react").RefObject<HTMLButtonElement | null>;
25
+ settleTimerRef: import("react").RefObject<number | null>;
26
+ zoomRef: import("react").RefObject<number>;
27
+ zoomLabelDragRef: import("react").RefObject<{
28
+ startY: number;
29
+ startZoom: number;
30
+ moved: boolean;
31
+ } | null>;
32
+ applyZoom: (newZoom: number) => void;
33
+ centerFrameOnViewport: (pageId: string, finalWidthPx: number) => void;
34
+ handleZoomLabelPointerDown: (event: ReactPointerEvent<HTMLButtonElement>) => void;
35
+ };
36
+ export {};
37
+ //# sourceMappingURL=useCanvasCamera.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCanvasCamera.d.ts","sourceRoot":"","sources":["../src/useCanvasCamera.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,IAAI,iBAAiB,EAAE,MAAM,OAAO,CAAC;AAU/D,KAAK,mBAAmB,GAAG;IAGzB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1C,CAAC;AAEF;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAAC,EAAE,cAAc,EAAE,EAAE,mBAAmB;;;;;;;;;gBAmH3B,MAAM;mBAAa,MAAM;eAAS,OAAO;;yBAnDvD,MAAM;oCAiCK,MAAM,gBAAgB,MAAM;wCAsBxB,iBAAiB,CAAC,iBAAiB,CAAC;EA+GhF"}
@@ -0,0 +1,247 @@
1
+ import { useEffect, useRef, useState } from "react";
2
+ import { scrollPageFrameIntoView } from "@batterai/canvas";
3
+ import { CENTER_PAN_MS, ZOOM_JUMP_THRESHOLD, ZOOM_SETTLE_MS, ZOOM_WHEEL_SENSITIVITY, clampZoom, } from "./components/canvas/camera.js";
4
+ /**
5
+ * `useCanvasCamera` — the Figma-style zoom/pan controller for the board.
6
+ *
7
+ * Mid-gesture the live zoom lives in `zoomRef` and is written straight to the
8
+ * DOM (transform on the board, size on the sizer, scroll on the shell, the %
9
+ * label), so React never re-renders during the gesture itself; only after the
10
+ * gesture settles (`ZOOM_SETTLE_MS`) does `setZoom` commit and let the rest of
11
+ * Canvas (the lazy-load window) catch up.
12
+ *
13
+ * The refs are returned so Canvas can attach them to the DOM and so the
14
+ * windowing code can read `zoomRef`/`settleTimerRef`/`shellRef` — those stay
15
+ * shared by design (the window is held still mid-gesture and recomputed on the
16
+ * settle commit).
17
+ */
18
+ export function useCanvasCamera({ onActivatePage }) {
19
+ // Settled zoom only: mid-gesture the live value lives in zoomRef and is
20
+ // written straight to the DOM (see applyZoomAt), so React never re-renders
21
+ // during the gesture itself.
22
+ const [zoom, setZoom] = useState(1);
23
+ const shellRef = useRef(null);
24
+ const boardRef = useRef(null);
25
+ const sizerRef = useRef(null);
26
+ const zoomLabelRef = useRef(null);
27
+ const settleTimerRef = useRef(null);
28
+ const panRafRef = useRef(null);
29
+ const zoomRef = useRef(zoom);
30
+ // Mirror state into the ref ONLY while no gesture is in flight: mid-gesture
31
+ // the ref is ahead of state by design, and an unrelated re-render syncing
32
+ // the stale state back in would make the after-commit style sync snap the
33
+ // board to the wrong scale.
34
+ if (settleTimerRef.current === null) {
35
+ zoomRef.current = zoom;
36
+ }
37
+ // The board scales via transform (compositor-only — no layout, no repaint
38
+ // of the page frames, which is what makes the gesture smooth; the previous
39
+ // CSS `zoom` approach re-laid-out the entire board subtree every tick).
40
+ // transform doesn't change layout size, so a sizer element around the
41
+ // board is resized to the scaled dimensions to keep .canvas-shell's native
42
+ // scroll range correct. offsetWidth/Height read layout size, which
43
+ // transform doesn't affect — so this never compounds.
44
+ function syncZoomStyles() {
45
+ const board = boardRef.current;
46
+ const sizer = sizerRef.current;
47
+ if (!board || !sizer)
48
+ return;
49
+ const value = zoomRef.current;
50
+ board.style.transform = `scale(${value})`;
51
+ sizer.style.width = `${board.offsetWidth * value}px`;
52
+ sizer.style.height = `${board.offsetHeight * value}px`;
53
+ }
54
+ // One zoom tick: keep the anchor point (cursor or button-press center)
55
+ // visually still, touch ONLY the DOM (transform, sizer, scroll, % label),
56
+ // and defer the React commit until the gesture settles.
57
+ function applyZoomAt(newZoom, anchorX, anchorY) {
58
+ const shell = shellRef.current;
59
+ const currentZoom = zoomRef.current;
60
+ if (!shell || newZoom === currentZoom)
61
+ return;
62
+ // Capture before the sizer shrinks — the browser clamps scroll position
63
+ // to the new scroll range immediately, which would corrupt the math.
64
+ const scrollLeft = shell.scrollLeft;
65
+ const scrollTop = shell.scrollTop;
66
+ zoomRef.current = newZoom;
67
+ syncZoomStyles();
68
+ shell.scrollLeft = ((scrollLeft + anchorX) / currentZoom) * newZoom - anchorX;
69
+ shell.scrollTop = ((scrollTop + anchorY) / currentZoom) * newZoom - anchorY;
70
+ if (zoomLabelRef.current) {
71
+ zoomLabelRef.current.textContent = `${Math.round(newZoom * 100)}%`;
72
+ }
73
+ if (settleTimerRef.current !== null)
74
+ window.clearTimeout(settleTimerRef.current);
75
+ settleTimerRef.current = window.setTimeout(() => {
76
+ settleTimerRef.current = null;
77
+ setZoom(newZoom);
78
+ }, ZOOM_SETTLE_MS);
79
+ }
80
+ // Shared by the zoom-control buttons: anchor on the shell's own visible
81
+ // center rather than a cursor position, since a button click has none.
82
+ function applyZoom(newZoom) {
83
+ const shell = shellRef.current;
84
+ if (!shell)
85
+ return;
86
+ applyZoomAt(newZoom, shell.clientWidth / 2, shell.clientHeight / 2);
87
+ }
88
+ // A tunable eased horizontal pan (easeInOutCubic), replacing the browser's
89
+ // native smooth scroll so its duration is controllable. Cancels any in-flight
90
+ // pan first. Clamps to the current scroll range since a manual scroll (unlike
91
+ // native) isn't auto-bounded.
92
+ function panScrollLeft(shell, target, durationMs) {
93
+ if (panRafRef.current !== null)
94
+ cancelAnimationFrame(panRafRef.current);
95
+ const start = shell.scrollLeft;
96
+ const max = shell.scrollWidth - shell.clientWidth;
97
+ const end = Math.max(0, Math.min(max, target));
98
+ const delta = end - start;
99
+ if (Math.abs(delta) < 1)
100
+ return;
101
+ const t0 = performance.now();
102
+ const ease = (t) => (t < 0.5 ? 4 * t * t * t : 1 - Math.pow(-2 * t + 2, 3) / 2);
103
+ const step = (now) => {
104
+ const p = Math.min(1, (now - t0) / durationMs);
105
+ shell.scrollLeft = start + delta * ease(p);
106
+ panRafRef.current = p < 1 ? requestAnimationFrame(step) : null;
107
+ };
108
+ panRafRef.current = requestAnimationFrame(step);
109
+ }
110
+ // After a viewport switch (collapsing all-viewports, or switching between
111
+ // single device viewports), pan the camera so that viewport ends up
112
+ // horizontally centered. Anchor on the frame SECTION's left, not a shell:
113
+ // this runs synchronously on the click while the DOM may still be expanded (3
114
+ // shells), and the section's left = column left, which is where the resulting
115
+ // single frame sits and stays put (only downstream columns shift).
116
+ function centerFrameOnViewport(pageId, finalWidthPx) {
117
+ const shell = shellRef.current;
118
+ const board = boardRef.current;
119
+ if (!shell || !board)
120
+ return;
121
+ const section = board.querySelector(`[data-page-id="${CSS.escape(pageId)}"]`);
122
+ if (!section)
123
+ return;
124
+ const zoomValue = zoomRef.current;
125
+ const shellRect = shell.getBoundingClientRect();
126
+ const secRect = section.getBoundingClientRect();
127
+ // Scaled X of the frame's left edge within the scrollable content.
128
+ const frameLeftScaled = shell.scrollLeft + (secRect.left - shellRect.left);
129
+ const centerScaled = frameLeftScaled + (finalWidthPx * zoomValue) / 2;
130
+ panScrollLeft(shell, centerScaled - shell.clientWidth / 2, CENTER_PAN_MS);
131
+ }
132
+ // The % label works like the inspector's drag-numbers: drag vertically to
133
+ // change the zoom (1% per pixel), plain click resets to 100%. `moved`
134
+ // suppresses the click-reset that follows a drag release.
135
+ const zoomLabelDragRef = useRef(null);
136
+ function handleZoomLabelPointerDown(event) {
137
+ event.preventDefault();
138
+ const drag = { startY: event.clientY, startZoom: zoomRef.current, moved: false };
139
+ zoomLabelDragRef.current = drag;
140
+ const onMove = (moveEvent) => {
141
+ const dy = drag.startY - moveEvent.clientY;
142
+ if (Math.abs(dy) > 2)
143
+ drag.moved = true;
144
+ applyZoom(clampZoom(drag.startZoom + dy / 100));
145
+ };
146
+ const onUp = () => {
147
+ window.removeEventListener("pointermove", onMove);
148
+ window.removeEventListener("pointerup", onUp);
149
+ // Cleared a tick later so the click that follows release can still see
150
+ // whether this was a drag.
151
+ window.setTimeout(() => {
152
+ if (zoomLabelDragRef.current === drag)
153
+ zoomLabelDragRef.current = null;
154
+ }, 0);
155
+ };
156
+ window.addEventListener("pointermove", onMove);
157
+ window.addEventListener("pointerup", onUp);
158
+ }
159
+ useEffect(() => () => {
160
+ if (settleTimerRef.current !== null)
161
+ window.clearTimeout(settleTimerRef.current);
162
+ if (panRafRef.current !== null)
163
+ cancelAnimationFrame(panRafRef.current);
164
+ }, []);
165
+ // Keep the imperative styles in sync after every React commit (zoom settle,
166
+ // column mounts, page adds), and whenever the board's layout size changes
167
+ // for a reason React doesn't see (e.g. images loading in).
168
+ useEffect(() => {
169
+ syncZoomStyles();
170
+ });
171
+ useEffect(() => {
172
+ const board = boardRef.current;
173
+ if (!board)
174
+ return;
175
+ const observer = new ResizeObserver(() => syncZoomStyles());
176
+ observer.observe(board);
177
+ return () => observer.disconnect();
178
+ }, []);
179
+ // Ctrl/Cmd + scroll wheel (also how trackpad pinch-to-zoom reaches the
180
+ // browser) zooms the board toward the cursor, Figma-style. Has to be a
181
+ // native non-passive listener: React's onWheel is passive, so
182
+ // preventDefault (needed to stop the browser's own page zoom/scroll) is
183
+ // silently ignored.
184
+ useEffect(() => {
185
+ const shell = shellRef.current;
186
+ if (!shell)
187
+ return;
188
+ function handleWheelZoom(event) {
189
+ if (!shell || (!event.ctrlKey && !event.metaKey))
190
+ return;
191
+ event.preventDefault();
192
+ const currentZoom = zoomRef.current;
193
+ const newZoom = clampZoom(currentZoom * Math.exp(-event.deltaY * ZOOM_WHEEL_SENSITIVITY));
194
+ const rect = shell.getBoundingClientRect();
195
+ applyZoomAt(newZoom, event.clientX - rect.left, event.clientY - rect.top);
196
+ }
197
+ shell.addEventListener("wheel", handleWheelZoom, { passive: false });
198
+ return () => shell.removeEventListener("wheel", handleWheelZoom);
199
+ }, []);
200
+ // Zoomed out below ZOOM_JUMP_THRESHOLD, a click on any page means "take me
201
+ // there": zoom back to 100% anchored on the click and center that page,
202
+ // instead of selecting a block nobody can read at that scale. Registered
203
+ // BEFORE the link-click effect below (effects run in code order) and uses
204
+ // stopImmediatePropagation so neither the link jump nor React's own
205
+ // block-selection handlers also react to the same click.
206
+ useEffect(() => {
207
+ const shell = shellRef.current;
208
+ if (!shell)
209
+ return;
210
+ function handleOverviewClick(event) {
211
+ if (zoomRef.current >= ZOOM_JUMP_THRESHOLD || !(event.target instanceof Element))
212
+ return;
213
+ if (event.target.closest(".zoom-control, .canvas-toolbar"))
214
+ return;
215
+ const column = event.target.closest(".page-column");
216
+ const frame = event.target.closest(".page-frame");
217
+ const pageId = frame?.dataset.pageId ?? column?.dataset.columnId;
218
+ if (!pageId || !shell)
219
+ return;
220
+ event.preventDefault();
221
+ event.stopImmediatePropagation();
222
+ const rect = shell.getBoundingClientRect();
223
+ applyZoomAt(1, event.clientX - rect.left, event.clientY - rect.top);
224
+ onActivatePage(pageId);
225
+ // Center only after the zoom's settle commit (and the heavy
226
+ // column-window re-render it triggers) has landed: a scroll issued
227
+ // before that gets swallowed by that same commit.
228
+ window.setTimeout(() => scrollPageFrameIntoView(pageId, "auto"), ZOOM_SETTLE_MS + 80);
229
+ }
230
+ shell.addEventListener("click", handleOverviewClick, true);
231
+ return () => shell.removeEventListener("click", handleOverviewClick, true);
232
+ }, [onActivatePage]);
233
+ return {
234
+ zoom,
235
+ shellRef,
236
+ boardRef,
237
+ sizerRef,
238
+ zoomLabelRef,
239
+ settleTimerRef,
240
+ zoomRef,
241
+ zoomLabelDragRef,
242
+ applyZoom,
243
+ centerFrameOnViewport,
244
+ handleZoomLabelPointerDown,
245
+ };
246
+ }
247
+ //# sourceMappingURL=useCanvasCamera.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCanvasCamera.js","sourceRoot":"","sources":["../src/useCanvasCamera.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface CanvasFocus {
2
+ /** The board's active page — always a real page id. */
3
+ readonly activePageId: string;
4
+ /** Direct-edit toggle; gates inline text editing, not selection. */
5
+ readonly editMode: boolean;
6
+ /** The primary-selected block, owned by the focus store (I-2). */
7
+ readonly selectedId: string | null;
8
+ /** Multi-block selection: an app extension over the primary `selectedId`.
9
+ * A `string[]` (not `readonly`) to match the existing board/inspector props;
10
+ * consumers only ever read it. */
11
+ readonly selectedIds: string[];
12
+ /** Point the board camera at a page (keeps the current block selection). */
13
+ setActivePageId(pageId: string): void;
14
+ /** Flip the direct-edit toggle. */
15
+ setEditMode(on: boolean): void;
16
+ /** Select a single block as the primary selection (store write); its
17
+ * `selectedIds` collapses to just this block. Pass a page id to also move the
18
+ * board camera to the owning page in the same step. */
19
+ selectBlock(blockId: string, owningPageId?: string): void;
20
+ /** Set the primary selection to `lastId` and the multi-selection to `ids`
21
+ * (e.g. a drag range, a preset paste, an extend-click). */
22
+ selectMany(lastId: string | null, ids: readonly string[]): void;
23
+ /** Clear all selection back to page level (store write). */
24
+ clearSelection(): void;
25
+ /** Reset to the initial page with nothing selected (bootstrap / logout). */
26
+ reset(pageId: string): void;
27
+ }
28
+ /**
29
+ * @param initialPageId the page the board opens on (default active page).
30
+ */
31
+ export declare function useCanvasFocus(initialPageId: string): CanvasFocus;
32
+ //# sourceMappingURL=useCanvasFocus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCanvasFocus.d.ts","sourceRoot":"","sources":["../src/useCanvasFocus.ts"],"names":[],"mappings":"AAiCA,MAAM,WAAW,WAAW;IAC1B,uDAAuD;IACvD,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,oEAAoE;IACpE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC;;sCAEkC;IAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAE/B,4EAA4E;IAC5E,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,mCAAmC;IACnC,WAAW,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI,CAAC;IAE/B;;2DAEuD;IACvD,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1D;+DAC2D;IAC3D,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAChE,4DAA4D;IAC5D,cAAc,IAAI,IAAI,CAAC;IACvB,4EAA4E;IAC5E,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,aAAa,EAAE,MAAM,GAAG,WAAW,CAiGjE"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * `useCanvasFocus` — the editor shell's React binding to `@batterai/canvas`'s
3
+ * `createEditorFocusStore` (plan Phase 1d, D4/I-2). The focus store is the
4
+ * SINGLE WRITER of the primary selection: which block is selected lives ONLY in
5
+ * the store's snapshot (`blockPath`), never in a parallel React `useState`, and
6
+ * is read back here via `useSyncExternalStore`. This mirrors the store wiring in
7
+ * `apps/proof/src/editor-app.ts` (there DOM-driven; here React-driven).
8
+ *
9
+ * Two axes the shell keeps beside the ladder's primary selection — neither
10
+ * is "what block is selected", so neither belongs in the store (staying faithful
11
+ * to the store's single-primary-selection contract, and to the Phase-1 non-goal
12
+ * that multi-select stays app-side):
13
+ * - `activePageId` the board camera — always a real page, independent of the
14
+ * browse/edit ladder (the shell has no browse mode UI;
15
+ * the direct-edit toggle gates inline text editing,
16
+ * not block selection). Mirrored into the store's `pageId`
17
+ * so `selectBlock`'s snapshot carries the owning page.
18
+ * - `editMode` the direct-edit toggle — orthogonal to selection
19
+ * (you can select a block with it off), so it is not the
20
+ * store's browse↔page axis.
21
+ * Multi-select (`selectedIds`) is an app-managed extension layered on top of the
22
+ * store's primary `selectedId` and kept consistent with it by construction here.
23
+ */
24
+ import { useCallback, useMemo, useState, useSyncExternalStore } from "react";
25
+ import { createEditorFocusStore } from "@batterai/canvas";
26
+ /** The single selected block id (the tail of the store's root-to-target path),
27
+ * or null at page level — the ONE place `selectedId` is derived. */
28
+ function selectedIdFromSnapshot(snapshot) {
29
+ if (snapshot.level !== "block")
30
+ return null;
31
+ return snapshot.blockPath[snapshot.blockPath.length - 1] ?? null;
32
+ }
33
+ /**
34
+ * @param initialPageId the page the board opens on (default active page).
35
+ */
36
+ export function useCanvasFocus(initialPageId) {
37
+ const store = useMemo(() => createEditorFocusStore(), []);
38
+ // Seed the store at page level on the initial page so `selectBlock`'s snapshot
39
+ // always carries a real owning page and the ladder starts at page — the
40
+ // The shell never shows the store's `browse` level (edit mode is a separate
41
+ // axis; `exitEditMode` is never called). Seeding while still at `browse` makes
42
+ // this idempotent and self-healing if a `useMemo` reset ever hands back a
43
+ // fresh, unseeded store. No subscribers exist during render, so the `commit`
44
+ // inside `enterEditMode` notifies nobody here.
45
+ if (store.getSnapshot().level === "browse") {
46
+ store.enterEditMode(initialPageId);
47
+ }
48
+ const snapshot = useSyncExternalStore(store.subscribe, store.getSnapshot, store.getSnapshot);
49
+ const selectedId = selectedIdFromSnapshot(snapshot);
50
+ const [activePageId, setActivePageIdState] = useState(initialPageId);
51
+ const [editMode, setEditModeState] = useState(false);
52
+ // Kept consistent with the store's primary `selectedId`: every path that
53
+ // writes the primary selection also sets this, so `selectedIds` always
54
+ // contains `selectedId` (or is empty when nothing is selected).
55
+ const [selectedIds, setSelectedIds] = useState([]);
56
+ // The store inherits `pageId` from its current snapshot on `selectBlock`, so
57
+ // moving the camera has to re-commit the level with the new page. At page
58
+ // level (nothing selected) `enterEditMode` sets page + empty path; with a
59
+ // block selected we re-select the same block under the new page so the
60
+ // selection survives the camera move (matches the old `setActivePageId` +
61
+ // `setSelectedId` pairs).
62
+ const setActivePageId = useCallback((pageId) => {
63
+ setActivePageIdState(pageId);
64
+ const current = store.getSnapshot();
65
+ const block = selectedIdFromSnapshot(current);
66
+ if (block && current.pageId !== pageId) {
67
+ store.enterEditMode(pageId);
68
+ store.selectBlock([block]);
69
+ }
70
+ else if (current.pageId !== pageId) {
71
+ store.enterEditMode(pageId);
72
+ }
73
+ }, [store]);
74
+ const setEditMode = useCallback((on) => setEditModeState(on), []);
75
+ const selectBlock = useCallback((blockId, owningPageId) => {
76
+ if (owningPageId && owningPageId !== store.getSnapshot().pageId) {
77
+ setActivePageIdState(owningPageId);
78
+ store.enterEditMode(owningPageId);
79
+ }
80
+ store.selectBlock([blockId]);
81
+ setSelectedIds([blockId]);
82
+ }, [store]);
83
+ const selectMany = useCallback((lastId, ids) => {
84
+ if (!lastId) {
85
+ store.deselect();
86
+ setSelectedIds([]);
87
+ return;
88
+ }
89
+ store.selectBlock([lastId]);
90
+ setSelectedIds([...ids]);
91
+ }, [store]);
92
+ const clearSelection = useCallback(() => {
93
+ store.deselect();
94
+ setSelectedIds([]);
95
+ }, [store]);
96
+ const reset = useCallback((pageId) => {
97
+ setActivePageIdState(pageId);
98
+ store.enterEditMode(pageId);
99
+ setSelectedIds([]);
100
+ }, [store]);
101
+ return {
102
+ activePageId,
103
+ editMode,
104
+ selectedId,
105
+ selectedIds,
106
+ setActivePageId,
107
+ setEditMode,
108
+ selectBlock,
109
+ selectMany,
110
+ clearSelection,
111
+ reset,
112
+ };
113
+ }
114
+ //# sourceMappingURL=useCanvasFocus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCanvasFocus.js","sourceRoot":"","sources":["../src/useCanvasFocus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { KeyboardEvent as ReactKeyboardEvent, RefObject } from "react";
2
+ import type { CanvasPage } from "./types";
3
+ type UseCanvasKeyboardNavArgs = {
4
+ boardRef: RefObject<HTMLDivElement | null>;
5
+ shellRef: RefObject<HTMLElement | null>;
6
+ pages: CanvasPage[];
7
+ topLevel: readonly CanvasPage[];
8
+ pagesInColumn: (topLevelId: string) => readonly CanvasPage[];
9
+ activePageId: string;
10
+ selectedId: string | null;
11
+ isTextEditing: boolean;
12
+ onSelect: (blockId: string | null, extend?: boolean) => void;
13
+ setMovingBlockId: (blockId: string | null) => void;
14
+ activateAndScroll: (pageId: string, behavior?: ScrollBehavior) => void;
15
+ };
16
+ /**
17
+ * `useCanvasKeyboardNav` — arrow-key navigation across the board plus the Esc
18
+ * selection ladder (§2.1, I-1). Arrow keys move the selection between a page's
19
+ * blocks (Up/Down) and between pages (all four directions); Esc from a text
20
+ * session lands on the enclosing block, and a further Esc climbs block → parent
21
+ * block → page level.
22
+ *
23
+ * Returns the `onKeyDown` handler for the canvas shell. The two Esc listeners
24
+ * are native (document/shell) rather than React handlers because committing a
25
+ * text session blurs focus to <body> before the keydown fires, so a
26
+ * shell-scoped React handler would never see them.
27
+ */
28
+ export declare function useCanvasKeyboardNav({ boardRef, shellRef, pages, topLevel, pagesInColumn, activePageId, selectedId, isTextEditing, onSelect, setMovingBlockId, activateAndScroll, }: UseCanvasKeyboardNavArgs): {
29
+ handleCanvasKeyDown: (event: ReactKeyboardEvent<HTMLElement>) => void;
30
+ };
31
+ export {};
32
+ //# sourceMappingURL=useCanvasKeyboardNav.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCanvasKeyboardNav.d.ts","sourceRoot":"","sources":["../src/useCanvasKeyboardNav.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,IAAI,kBAAkB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAM5E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,KAAK,wBAAwB,GAAG;IAC9B,QAAQ,EAAE,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC3C,QAAQ,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACxC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;IAChC,aAAa,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,SAAS,UAAU,EAAE,CAAC;IAC7D,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7D,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IACnD,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,KAAK,IAAI,CAAC;CACxE,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAAC,EACnC,QAAQ,EACR,QAAQ,EACR,KAAK,EACL,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,UAAU,EACV,aAAa,EACb,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,GAClB,EAAE,wBAAwB;iCA4FW,kBAAkB,CAAC,WAAW,CAAC;EAsFpE"}