@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.
- package/CHANGELOG.md +5 -0
- package/LICENSE +101 -0
- package/README.md +11 -0
- package/dist/App.d.ts +4 -0
- package/dist/App.d.ts.map +1 -0
- package/dist/App.js +388 -0
- package/dist/App.js.map +1 -0
- package/dist/app/AppCanvas.d.ts +52 -0
- package/dist/app/AppCanvas.d.ts.map +1 -0
- package/dist/app/AppCanvas.js +43 -0
- package/dist/app/AppCanvas.js.map +1 -0
- package/dist/app/AppDialogs.d.ts +25 -0
- package/dist/app/AppDialogs.d.ts.map +1 -0
- package/dist/app/AppDialogs.js +16 -0
- package/dist/app/AppDialogs.js.map +1 -0
- package/dist/app/AppInspectorPanel.d.ts +66 -0
- package/dist/app/AppInspectorPanel.d.ts.map +1 -0
- package/dist/app/AppInspectorPanel.js +94 -0
- package/dist/app/AppInspectorPanel.js.map +1 -0
- package/dist/app/AppStates.d.ts +5 -0
- package/dist/app/AppStates.d.ts.map +1 -0
- package/dist/app/AppStates.js +8 -0
- package/dist/app/AppStates.js.map +1 -0
- package/dist/app/AppTypes.d.ts +18 -0
- package/dist/app/AppTypes.d.ts.map +1 -0
- package/dist/app/AppTypes.js +2 -0
- package/dist/app/AppTypes.js.map +1 -0
- package/dist/app/OperationErrorBanner.d.ts +5 -0
- package/dist/app/OperationErrorBanner.d.ts.map +1 -0
- package/dist/app/OperationErrorBanner.js +5 -0
- package/dist/app/OperationErrorBanner.js.map +1 -0
- package/dist/app/capability-guards.d.ts +9 -0
- package/dist/app/capability-guards.d.ts.map +1 -0
- package/dist/app/capability-guards.js +22 -0
- package/dist/app/capability-guards.js.map +1 -0
- package/dist/app/deriveSelectionState.d.ts +31 -0
- package/dist/app/deriveSelectionState.d.ts.map +1 -0
- package/dist/app/deriveSelectionState.js +79 -0
- package/dist/app/deriveSelectionState.js.map +1 -0
- package/dist/app/helpers.d.ts +31 -0
- package/dist/app/helpers.d.ts.map +1 -0
- package/dist/app/helpers.js +145 -0
- package/dist/app/helpers.js.map +1 -0
- package/dist/app/hostServices.d.ts +2 -0
- package/dist/app/hostServices.d.ts.map +1 -0
- package/dist/app/hostServices.js +2 -0
- package/dist/app/hostServices.js.map +1 -0
- package/dist/app/persistence-machine.d.ts +27 -0
- package/dist/app/persistence-machine.d.ts.map +1 -0
- package/dist/app/persistence-machine.js +66 -0
- package/dist/app/persistence-machine.js.map +1 -0
- package/dist/app/useCollectionEditing.d.ts +30 -0
- package/dist/app/useCollectionEditing.d.ts.map +1 -0
- package/dist/app/useCollectionEditing.js +80 -0
- package/dist/app/useCollectionEditing.js.map +1 -0
- package/dist/app/useCommitActions.d.ts +64 -0
- package/dist/app/useCommitActions.d.ts.map +1 -0
- package/dist/app/useCommitActions.js +319 -0
- package/dist/app/useCommitActions.js.map +1 -0
- package/dist/app/useEditorCollaboration.d.ts +30 -0
- package/dist/app/useEditorCollaboration.d.ts.map +1 -0
- package/dist/app/useEditorCollaboration.js +374 -0
- package/dist/app/useEditorCollaboration.js.map +1 -0
- package/dist/app/useEditorEffects.d.ts +42 -0
- package/dist/app/useEditorEffects.d.ts.map +1 -0
- package/dist/app/useEditorEffects.js +105 -0
- package/dist/app/useEditorEffects.js.map +1 -0
- package/dist/app/useEditorRuntime.d.ts +34 -0
- package/dist/app/useEditorRuntime.d.ts.map +1 -0
- package/dist/app/useEditorRuntime.js +68 -0
- package/dist/app/useEditorRuntime.js.map +1 -0
- package/dist/app/useEditorState.d.ts +55 -0
- package/dist/app/useEditorState.d.ts.map +1 -0
- package/dist/app/useEditorState.js +68 -0
- package/dist/app/useEditorState.js.map +1 -0
- package/dist/app/usePageOps.d.ts +37 -0
- package/dist/app/usePageOps.d.ts.map +1 -0
- package/dist/app/usePageOps.js +69 -0
- package/dist/app/usePageOps.js.map +1 -0
- package/dist/app/usePersistence.d.ts +48 -0
- package/dist/app/usePersistence.d.ts.map +1 -0
- package/dist/app/usePersistence.js +344 -0
- package/dist/app/usePersistence.js.map +1 -0
- package/dist/app/usePreviewSession.d.ts +22 -0
- package/dist/app/usePreviewSession.d.ts.map +1 -0
- package/dist/app/usePreviewSession.js +21 -0
- package/dist/app/usePreviewSession.js.map +1 -0
- package/dist/app/useWorkspaceDocumentSync.d.ts +33 -0
- package/dist/app/useWorkspaceDocumentSync.d.ts.map +1 -0
- package/dist/app/useWorkspaceDocumentSync.js +128 -0
- package/dist/app/useWorkspaceDocumentSync.js.map +1 -0
- package/dist/appearance.d.ts +6 -0
- package/dist/appearance.d.ts.map +1 -0
- package/dist/appearance.js +53 -0
- package/dist/appearance.js.map +1 -0
- package/dist/bindingChips.d.ts +28 -0
- package/dist/bindingChips.d.ts.map +1 -0
- package/dist/bindingChips.js +93 -0
- package/dist/bindingChips.js.map +1 -0
- package/dist/block-factory.d.ts +21 -0
- package/dist/block-factory.d.ts.map +1 -0
- package/dist/block-factory.js +78 -0
- package/dist/block-factory.js.map +1 -0
- package/dist/blockHost.d.ts +22 -0
- package/dist/blockHost.d.ts.map +1 -0
- package/dist/blockHost.js +103 -0
- package/dist/blockHost.js.map +1 -0
- package/dist/blockInteraction.d.ts +11 -0
- package/dist/blockInteraction.d.ts.map +1 -0
- package/dist/blockInteraction.js +16 -0
- package/dist/blockInteraction.js.map +1 -0
- package/dist/blockPresets.d.ts +4 -0
- package/dist/blockPresets.d.ts.map +1 -0
- package/dist/blockPresets.js +11 -0
- package/dist/blockPresets.js.map +1 -0
- package/dist/collaboration.d.ts +41 -0
- package/dist/collaboration.d.ts.map +1 -0
- package/dist/collaboration.js +4 -0
- package/dist/collaboration.js.map +1 -0
- package/dist/collectionItemAddress.d.ts +12 -0
- package/dist/collectionItemAddress.d.ts.map +1 -0
- package/dist/collectionItemAddress.js +19 -0
- package/dist/collectionItemAddress.js.map +1 -0
- package/dist/components/AddCollectionItemControl.d.ts +15 -0
- package/dist/components/AddCollectionItemControl.d.ts.map +1 -0
- package/dist/components/AddCollectionItemControl.js +19 -0
- package/dist/components/AddCollectionItemControl.js.map +1 -0
- package/dist/components/AuditHistoryPanel.d.ts +10 -0
- package/dist/components/AuditHistoryPanel.d.ts.map +1 -0
- package/dist/components/AuditHistoryPanel.js +11 -0
- package/dist/components/AuditHistoryPanel.js.map +1 -0
- package/dist/components/Canvas.d.ts +64 -0
- package/dist/components/Canvas.d.ts.map +1 -0
- package/dist/components/Canvas.js +238 -0
- package/dist/components/Canvas.js.map +1 -0
- package/dist/components/CollaborationLayer.d.ts +13 -0
- package/dist/components/CollaborationLayer.d.ts.map +1 -0
- package/dist/components/CollaborationLayer.js +91 -0
- package/dist/components/CollaborationLayer.js.map +1 -0
- package/dist/components/DesignSettingsPanel.d.ts +10 -0
- package/dist/components/DesignSettingsPanel.d.ts.map +1 -0
- package/dist/components/DesignSettingsPanel.js +26 -0
- package/dist/components/DesignSettingsPanel.js.map +1 -0
- package/dist/components/EditableDate.d.ts +24 -0
- package/dist/components/EditableDate.d.ts.map +1 -0
- package/dist/components/EditableDate.js +41 -0
- package/dist/components/EditableDate.js.map +1 -0
- package/dist/components/EditableText.d.ts +23 -0
- package/dist/components/EditableText.d.ts.map +1 -0
- package/dist/components/EditableText.js +53 -0
- package/dist/components/EditableText.js.map +1 -0
- package/dist/components/FieldControl.d.ts +15 -0
- package/dist/components/FieldControl.d.ts.map +1 -0
- package/dist/components/FieldControl.js +64 -0
- package/dist/components/FieldControl.js.map +1 -0
- package/dist/components/IconFieldEditor.d.ts +9 -0
- package/dist/components/IconFieldEditor.d.ts.map +1 -0
- package/dist/components/IconFieldEditor.js +15 -0
- package/dist/components/IconFieldEditor.js.map +1 -0
- package/dist/components/ImageFieldEditor.d.ts +15 -0
- package/dist/components/ImageFieldEditor.d.ts.map +1 -0
- package/dist/components/ImageFieldEditor.js +37 -0
- package/dist/components/ImageFieldEditor.js.map +1 -0
- package/dist/components/Inspector.d.ts +55 -0
- package/dist/components/Inspector.d.ts.map +1 -0
- package/dist/components/Inspector.js +44 -0
- package/dist/components/Inspector.js.map +1 -0
- package/dist/components/LayoutBlockEditor.d.ts +32 -0
- package/dist/components/LayoutBlockEditor.d.ts.map +1 -0
- package/dist/components/LayoutBlockEditor.js +176 -0
- package/dist/components/LayoutBlockEditor.js.map +1 -0
- package/dist/components/LicenseWatermark.d.ts +5 -0
- package/dist/components/LicenseWatermark.d.ts.map +1 -0
- package/dist/components/LicenseWatermark.js +7 -0
- package/dist/components/LicenseWatermark.js.map +1 -0
- package/dist/components/NestedBlockItem.d.ts +26 -0
- package/dist/components/NestedBlockItem.d.ts.map +1 -0
- package/dist/components/NestedBlockItem.js +164 -0
- package/dist/components/NestedBlockItem.js.map +1 -0
- package/dist/components/NestedInsertSlot.d.ts +18 -0
- package/dist/components/NestedInsertSlot.d.ts.map +1 -0
- package/dist/components/NestedInsertSlot.js +51 -0
- package/dist/components/NestedInsertSlot.js.map +1 -0
- package/dist/components/NewPageDialog.d.ts +9 -0
- package/dist/components/NewPageDialog.d.ts.map +1 -0
- package/dist/components/NewPageDialog.js +12 -0
- package/dist/components/NewPageDialog.js.map +1 -0
- package/dist/components/PageFrame.d.ts +75 -0
- package/dist/components/PageFrame.d.ts.map +1 -0
- package/dist/components/PageFrame.js +87 -0
- package/dist/components/PageFrame.js.map +1 -0
- package/dist/components/PageInspector.d.ts +16 -0
- package/dist/components/PageInspector.d.ts.map +1 -0
- package/dist/components/PageInspector.js +56 -0
- package/dist/components/PageInspector.js.map +1 -0
- package/dist/components/PresetSaveDialog.d.ts +8 -0
- package/dist/components/PresetSaveDialog.d.ts.map +1 -0
- package/dist/components/PresetSaveDialog.js +7 -0
- package/dist/components/PresetSaveDialog.js.map +1 -0
- package/dist/components/ReferenceChipsEditor.d.ts +23 -0
- package/dist/components/ReferenceChipsEditor.d.ts.map +1 -0
- package/dist/components/ReferenceChipsEditor.js +68 -0
- package/dist/components/ReferenceChipsEditor.js.map +1 -0
- package/dist/components/TopBar.d.ts +49 -0
- package/dist/components/TopBar.d.ts.map +1 -0
- package/dist/components/TopBar.js +41 -0
- package/dist/components/TopBar.js.map +1 -0
- package/dist/components/canvas/CanvasBoard.d.ts +97 -0
- package/dist/components/canvas/CanvasBoard.d.ts.map +1 -0
- package/dist/components/canvas/CanvasBoard.js +35 -0
- package/dist/components/canvas/CanvasBoard.js.map +1 -0
- package/dist/components/canvas/EditableCanvasTitle.d.ts +13 -0
- package/dist/components/canvas/EditableCanvasTitle.d.ts.map +1 -0
- package/dist/components/canvas/EditableCanvasTitle.js +74 -0
- package/dist/components/canvas/EditableCanvasTitle.js.map +1 -0
- package/dist/components/canvas/camera.d.ts +9 -0
- package/dist/components/canvas/camera.d.ts.map +1 -0
- package/dist/components/canvas/camera.js +31 -0
- package/dist/components/canvas/camera.js.map +1 -0
- package/dist/components/canvas/column-window.d.ts +10 -0
- package/dist/components/canvas/column-window.d.ts.map +1 -0
- package/dist/components/canvas/column-window.js +46 -0
- package/dist/components/canvas/column-window.js.map +1 -0
- package/dist/components/canvas/keyboard-nav.d.ts +7 -0
- package/dist/components/canvas/keyboard-nav.d.ts.map +1 -0
- package/dist/components/canvas/keyboard-nav.js +44 -0
- package/dist/components/canvas/keyboard-nav.js.map +1 -0
- package/dist/components/canvas/links.d.ts +2 -0
- package/dist/components/canvas/links.d.ts.map +1 -0
- package/dist/components/canvas/links.js +7 -0
- package/dist/components/canvas/links.js.map +1 -0
- package/dist/components/editable-text/BindingInlineEditor.d.ts +13 -0
- package/dist/components/editable-text/BindingInlineEditor.d.ts.map +1 -0
- package/dist/components/editable-text/BindingInlineEditor.js +24 -0
- package/dist/components/editable-text/BindingInlineEditor.js.map +1 -0
- package/dist/components/editable-text/BindingPicker.d.ts +10 -0
- package/dist/components/editable-text/BindingPicker.d.ts.map +1 -0
- package/dist/components/editable-text/BindingPicker.js +20 -0
- package/dist/components/editable-text/BindingPicker.js.map +1 -0
- package/dist/components/editable-text/RichTextToolbar.d.ts +13 -0
- package/dist/components/editable-text/RichTextToolbar.d.ts.map +1 -0
- package/dist/components/editable-text/RichTextToolbar.js +24 -0
- package/dist/components/editable-text/RichTextToolbar.js.map +1 -0
- package/dist/components/editable-text/bindingHtml.d.ts +19 -0
- package/dist/components/editable-text/bindingHtml.d.ts.map +1 -0
- package/dist/components/editable-text/bindingHtml.js +106 -0
- package/dist/components/editable-text/bindingHtml.js.map +1 -0
- package/dist/components/editable-text/editableTextDom.d.ts +5 -0
- package/dist/components/editable-text/editableTextDom.d.ts.map +1 -0
- package/dist/components/editable-text/editableTextDom.js +24 -0
- package/dist/components/editable-text/editableTextDom.js.map +1 -0
- package/dist/components/editable-text/floatingPosition.d.ts +25 -0
- package/dist/components/editable-text/floatingPosition.d.ts.map +1 -0
- package/dist/components/editable-text/floatingPosition.js +35 -0
- package/dist/components/editable-text/floatingPosition.js.map +1 -0
- package/dist/components/editable-text/formatting.d.ts +15 -0
- package/dist/components/editable-text/formatting.d.ts.map +1 -0
- package/dist/components/editable-text/formatting.js +82 -0
- package/dist/components/editable-text/formatting.js.map +1 -0
- package/dist/components/editable-text/richCommands.d.ts +9 -0
- package/dist/components/editable-text/richCommands.d.ts.map +1 -0
- package/dist/components/editable-text/richCommands.js +41 -0
- package/dist/components/editable-text/richCommands.js.map +1 -0
- package/dist/components/editable-text/richHtml.d.ts +5 -0
- package/dist/components/editable-text/richHtml.d.ts.map +1 -0
- package/dist/components/editable-text/richHtml.js +150 -0
- package/dist/components/editable-text/richHtml.js.map +1 -0
- package/dist/components/editable-text/selection.d.ts +12 -0
- package/dist/components/editable-text/selection.d.ts.map +1 -0
- package/dist/components/editable-text/selection.js +119 -0
- package/dist/components/editable-text/selection.js.map +1 -0
- package/dist/components/editable-text/types.d.ts +32 -0
- package/dist/components/editable-text/types.d.ts.map +1 -0
- package/dist/components/editable-text/types.js +2 -0
- package/dist/components/editable-text/types.js.map +1 -0
- package/dist/components/editable-text/useEditableText.d.ts +35 -0
- package/dist/components/editable-text/useEditableText.d.ts.map +1 -0
- package/dist/components/editable-text/useEditableText.js +395 -0
- package/dist/components/editable-text/useEditableText.js.map +1 -0
- package/dist/components/image-editor/ImageEditorDialog.d.ts +16 -0
- package/dist/components/image-editor/ImageEditorDialog.d.ts.map +1 -0
- package/dist/components/image-editor/ImageEditorDialog.js +137 -0
- package/dist/components/image-editor/ImageEditorDialog.js.map +1 -0
- package/dist/components/image-editor/ImagePreview.d.ts +15 -0
- package/dist/components/image-editor/ImagePreview.d.ts.map +1 -0
- package/dist/components/image-editor/ImagePreview.js +16 -0
- package/dist/components/image-editor/ImagePreview.js.map +1 -0
- package/dist/components/image-editor/MediaBrowser.d.ts +22 -0
- package/dist/components/image-editor/MediaBrowser.d.ts.map +1 -0
- package/dist/components/image-editor/MediaBrowser.js +16 -0
- package/dist/components/image-editor/MediaBrowser.js.map +1 -0
- package/dist/components/image-editor/UsageSettingsForm.d.ts +10 -0
- package/dist/components/image-editor/UsageSettingsForm.d.ts.map +1 -0
- package/dist/components/image-editor/UsageSettingsForm.js +29 -0
- package/dist/components/image-editor/UsageSettingsForm.js.map +1 -0
- package/dist/components/image-editor/preview-style.d.ts +7 -0
- package/dist/components/image-editor/preview-style.d.ts.map +1 -0
- package/dist/components/image-editor/preview-style.js +47 -0
- package/dist/components/image-editor/preview-style.js.map +1 -0
- package/dist/components/image-editor/stage.d.ts +14 -0
- package/dist/components/image-editor/stage.d.ts.map +1 -0
- package/dist/components/image-editor/stage.js +116 -0
- package/dist/components/image-editor/stage.js.map +1 -0
- package/dist/components/image-editor/types.d.ts +38 -0
- package/dist/components/image-editor/types.d.ts.map +1 -0
- package/dist/components/image-editor/types.js +10 -0
- package/dist/components/image-editor/types.js.map +1 -0
- package/dist/components/image-editor/usage-conversion.d.ts +35 -0
- package/dist/components/image-editor/usage-conversion.d.ts.map +1 -0
- package/dist/components/image-editor/usage-conversion.js +249 -0
- package/dist/components/image-editor/usage-conversion.js.map +1 -0
- package/dist/components/inspector/CollectionItemFields.d.ts +10 -0
- package/dist/components/inspector/CollectionItemFields.d.ts.map +1 -0
- package/dist/components/inspector/CollectionItemFields.js +13 -0
- package/dist/components/inspector/CollectionItemFields.js.map +1 -0
- package/dist/components/inspector/ContentBindingControl.d.ts +14 -0
- package/dist/components/inspector/ContentBindingControl.d.ts.map +1 -0
- package/dist/components/inspector/ContentBindingControl.js +42 -0
- package/dist/components/inspector/ContentBindingControl.js.map +1 -0
- package/dist/components/inspector/PinControl.d.ts +10 -0
- package/dist/components/inspector/PinControl.d.ts.map +1 -0
- package/dist/components/inspector/PinControl.js +14 -0
- package/dist/components/inspector/PinControl.js.map +1 -0
- package/dist/components/inspector/constants.d.ts +8 -0
- package/dist/components/inspector/constants.d.ts.map +1 -0
- package/dist/components/inspector/constants.js +12 -0
- package/dist/components/inspector/constants.js.map +1 -0
- package/dist/components/inspector/content-item-label.d.ts +2 -0
- package/dist/components/inspector/content-item-label.d.ts.map +1 -0
- package/dist/components/inspector/content-item-label.js +23 -0
- package/dist/components/inspector/content-item-label.js.map +1 -0
- package/dist/components/page-frame/InsertSlot.d.ts +19 -0
- package/dist/components/page-frame/InsertSlot.d.ts.map +1 -0
- package/dist/components/page-frame/InsertSlot.js +55 -0
- package/dist/components/page-frame/InsertSlot.js.map +1 -0
- package/dist/components/page-frame/PageFrameBlockList.d.ts +43 -0
- package/dist/components/page-frame/PageFrameBlockList.d.ts.map +1 -0
- package/dist/components/page-frame/PageFrameBlockList.js +204 -0
- package/dist/components/page-frame/PageFrameBlockList.js.map +1 -0
- package/dist/components/page-frame/PageFrameControls.d.ts +23 -0
- package/dist/components/page-frame/PageFrameControls.d.ts.map +1 -0
- package/dist/components/page-frame/PageFrameControls.js +36 -0
- package/dist/components/page-frame/PageFrameControls.js.map +1 -0
- package/dist/components/page-frame/PageFramePathEditor.d.ts +33 -0
- package/dist/components/page-frame/PageFramePathEditor.d.ts.map +1 -0
- package/dist/components/page-frame/PageFramePathEditor.js +5 -0
- package/dist/components/page-frame/PageFramePathEditor.js.map +1 -0
- package/dist/components/page-frame/viewport.d.ts +26 -0
- package/dist/components/page-frame/viewport.d.ts.map +1 -0
- package/dist/components/page-frame/viewport.js +37 -0
- package/dist/components/page-frame/viewport.js.map +1 -0
- package/dist/content-model.d.ts +36 -0
- package/dist/content-model.d.ts.map +1 -0
- package/dist/content-model.js +15 -0
- package/dist/content-model.js.map +1 -0
- package/dist/contentModel.d.ts +3 -0
- package/dist/contentModel.d.ts.map +1 -0
- package/dist/contentModel.js +2 -0
- package/dist/contentModel.js.map +1 -0
- package/dist/designSettings.d.ts +11 -0
- package/dist/designSettings.d.ts.map +1 -0
- package/dist/designSettings.js +96 -0
- package/dist/designSettings.js.map +1 -0
- package/dist/drag-transfer.d.ts +28 -0
- package/dist/drag-transfer.d.ts.map +1 -0
- package/dist/drag-transfer.js +42 -0
- package/dist/drag-transfer.js.map +1 -0
- package/dist/editor/app/AppCanvas.d.ts +2 -0
- package/dist/editor/app/AppCanvas.d.ts.map +1 -0
- package/dist/editor/app/AppCanvas.js +2 -0
- package/dist/editor/app/AppCanvas.js.map +1 -0
- package/dist/editor/app/AppDialogs.d.ts +2 -0
- package/dist/editor/app/AppDialogs.d.ts.map +1 -0
- package/dist/editor/app/AppDialogs.js +2 -0
- package/dist/editor/app/AppDialogs.js.map +1 -0
- package/dist/editor/app/AppInspectorPanel.d.ts +2 -0
- package/dist/editor/app/AppInspectorPanel.d.ts.map +1 -0
- package/dist/editor/app/AppInspectorPanel.js +2 -0
- package/dist/editor/app/AppInspectorPanel.js.map +1 -0
- package/dist/editor/app/deriveSelectionState.d.ts +2 -0
- package/dist/editor/app/deriveSelectionState.d.ts.map +1 -0
- package/dist/editor/app/deriveSelectionState.js +2 -0
- package/dist/editor/app/deriveSelectionState.js.map +1 -0
- package/dist/editor/app/helpers.d.ts +2 -0
- package/dist/editor/app/helpers.d.ts.map +1 -0
- package/dist/editor/app/helpers.js +2 -0
- package/dist/editor/app/helpers.js.map +1 -0
- package/dist/editor/app/useCollectionEditing.d.ts +2 -0
- package/dist/editor/app/useCollectionEditing.d.ts.map +1 -0
- package/dist/editor/app/useCollectionEditing.js +2 -0
- package/dist/editor/app/useCollectionEditing.js.map +1 -0
- package/dist/editor/app/useCommitActions.d.ts +2 -0
- package/dist/editor/app/useCommitActions.d.ts.map +1 -0
- package/dist/editor/app/useCommitActions.js +2 -0
- package/dist/editor/app/useCommitActions.js.map +1 -0
- package/dist/editor/app/useEditorEffects.d.ts +2 -0
- package/dist/editor/app/useEditorEffects.d.ts.map +1 -0
- package/dist/editor/app/useEditorEffects.js +2 -0
- package/dist/editor/app/useEditorEffects.js.map +1 -0
- package/dist/editor/app/useEditorRuntime.d.ts +2 -0
- package/dist/editor/app/useEditorRuntime.d.ts.map +1 -0
- package/dist/editor/app/useEditorRuntime.js +2 -0
- package/dist/editor/app/useEditorRuntime.js.map +1 -0
- package/dist/editor/app/useEditorState.d.ts +2 -0
- package/dist/editor/app/useEditorState.d.ts.map +1 -0
- package/dist/editor/app/useEditorState.js +2 -0
- package/dist/editor/app/useEditorState.js.map +1 -0
- package/dist/editor/app/usePageOps.d.ts +2 -0
- package/dist/editor/app/usePageOps.d.ts.map +1 -0
- package/dist/editor/app/usePageOps.js +2 -0
- package/dist/editor/app/usePageOps.js.map +1 -0
- package/dist/editor/app/usePersistence.d.ts +2 -0
- package/dist/editor/app/usePersistence.d.ts.map +1 -0
- package/dist/editor/app/usePersistence.js +2 -0
- package/dist/editor/app/usePersistence.js.map +1 -0
- package/dist/editor/app/usePreviewSession.d.ts +2 -0
- package/dist/editor/app/usePreviewSession.d.ts.map +1 -0
- package/dist/editor/app/usePreviewSession.js +2 -0
- package/dist/editor/app/usePreviewSession.js.map +1 -0
- package/dist/editor/app/useWorkspaceDocumentSync.d.ts +2 -0
- package/dist/editor/app/useWorkspaceDocumentSync.d.ts.map +1 -0
- package/dist/editor/app/useWorkspaceDocumentSync.js +2 -0
- package/dist/editor/app/useWorkspaceDocumentSync.js.map +1 -0
- package/dist/editor/bindingChips.d.ts +2 -0
- package/dist/editor/bindingChips.d.ts.map +1 -0
- package/dist/editor/bindingChips.js +2 -0
- package/dist/editor/bindingChips.js.map +1 -0
- package/dist/editor/blockInteraction.d.ts +2 -0
- package/dist/editor/blockInteraction.d.ts.map +1 -0
- package/dist/editor/blockInteraction.js +2 -0
- package/dist/editor/blockInteraction.js.map +1 -0
- package/dist/editor/blockPresets.d.ts +2 -0
- package/dist/editor/blockPresets.d.ts.map +1 -0
- package/dist/editor/blockPresets.js +2 -0
- package/dist/editor/blockPresets.js.map +1 -0
- package/dist/editor/collectionItemAddress.d.ts +2 -0
- package/dist/editor/collectionItemAddress.d.ts.map +1 -0
- package/dist/editor/collectionItemAddress.js +2 -0
- package/dist/editor/collectionItemAddress.js.map +1 -0
- package/dist/editor/contentModel.d.ts +2 -0
- package/dist/editor/contentModel.d.ts.map +1 -0
- package/dist/editor/contentModel.js +2 -0
- package/dist/editor/contentModel.js.map +1 -0
- package/dist/editor/designSettings.d.ts +2 -0
- package/dist/editor/designSettings.d.ts.map +1 -0
- package/dist/editor/designSettings.js +2 -0
- package/dist/editor/designSettings.js.map +1 -0
- package/dist/editor/editorClipboard.d.ts +2 -0
- package/dist/editor/editorClipboard.d.ts.map +1 -0
- package/dist/editor/editorClipboard.js +2 -0
- package/dist/editor/editorClipboard.js.map +1 -0
- package/dist/editor/formatDate.d.ts +2 -0
- package/dist/editor/formatDate.d.ts.map +1 -0
- package/dist/editor/formatDate.js +2 -0
- package/dist/editor/formatDate.js.map +1 -0
- package/dist/editor/iconCatalog.d.ts +2 -0
- package/dist/editor/iconCatalog.d.ts.map +1 -0
- package/dist/editor/iconCatalog.js +2 -0
- package/dist/editor/iconCatalog.js.map +1 -0
- package/dist/editor/pageActions.d.ts +2 -0
- package/dist/editor/pageActions.d.ts.map +1 -0
- package/dist/editor/pageActions.js +2 -0
- package/dist/editor/pageActions.js.map +1 -0
- package/dist/editor/pagePaths.d.ts +2 -0
- package/dist/editor/pagePaths.d.ts.map +1 -0
- package/dist/editor/pagePaths.js +2 -0
- package/dist/editor/pagePaths.js.map +1 -0
- package/dist/editor/pagesActions.d.ts +2 -0
- package/dist/editor/pagesActions.d.ts.map +1 -0
- package/dist/editor/pagesActions.js +2 -0
- package/dist/editor/pagesActions.js.map +1 -0
- package/dist/editor/renderActions.d.ts +2 -0
- package/dist/editor/renderActions.d.ts.map +1 -0
- package/dist/editor/renderActions.js +2 -0
- package/dist/editor/renderActions.js.map +1 -0
- package/dist/editor/translation.d.ts +2 -0
- package/dist/editor/translation.d.ts.map +1 -0
- package/dist/editor/translation.js +2 -0
- package/dist/editor/translation.js.map +1 -0
- package/dist/editor/useCanvasBackStack.d.ts +2 -0
- package/dist/editor/useCanvasBackStack.d.ts.map +1 -0
- package/dist/editor/useCanvasBackStack.js +2 -0
- package/dist/editor/useCanvasBackStack.js.map +1 -0
- package/dist/editor/useCanvasCamera.d.ts +2 -0
- package/dist/editor/useCanvasCamera.d.ts.map +1 -0
- package/dist/editor/useCanvasCamera.js +2 -0
- package/dist/editor/useCanvasCamera.js.map +1 -0
- package/dist/editor/useCanvasFocus.d.ts +2 -0
- package/dist/editor/useCanvasFocus.d.ts.map +1 -0
- package/dist/editor/useCanvasFocus.js +2 -0
- package/dist/editor/useCanvasFocus.js.map +1 -0
- package/dist/editor/useCanvasKeyboardNav.d.ts +2 -0
- package/dist/editor/useCanvasKeyboardNav.d.ts.map +1 -0
- package/dist/editor/useCanvasKeyboardNav.js +2 -0
- package/dist/editor/useCanvasKeyboardNav.js.map +1 -0
- package/dist/editor/useClipboardActions.d.ts +2 -0
- package/dist/editor/useClipboardActions.d.ts.map +1 -0
- package/dist/editor/useClipboardActions.js +2 -0
- package/dist/editor/useClipboardActions.js.map +1 -0
- package/dist/editor/useColumnWindow.d.ts +2 -0
- package/dist/editor/useColumnWindow.d.ts.map +1 -0
- package/dist/editor/useColumnWindow.js +2 -0
- package/dist/editor/useColumnWindow.js.map +1 -0
- package/dist/editor/useEditorHistory.d.ts +2 -0
- package/dist/editor/useEditorHistory.d.ts.map +1 -0
- package/dist/editor/useEditorHistory.js +2 -0
- package/dist/editor/useEditorHistory.js.map +1 -0
- package/dist/editor/usePagePathEditor.d.ts +2 -0
- package/dist/editor/usePagePathEditor.d.ts.map +1 -0
- package/dist/editor/usePagePathEditor.js +2 -0
- package/dist/editor/usePagePathEditor.js.map +1 -0
- package/dist/editor/usePageTitleEditor.d.ts +2 -0
- package/dist/editor/usePageTitleEditor.d.ts.map +1 -0
- package/dist/editor/usePageTitleEditor.js +2 -0
- package/dist/editor/usePageTitleEditor.js.map +1 -0
- package/dist/editor/useTextFocusIntent.d.ts +2 -0
- package/dist/editor/useTextFocusIntent.d.ts.map +1 -0
- package/dist/editor/useTextFocusIntent.js +2 -0
- package/dist/editor/useTextFocusIntent.js.map +1 -0
- package/dist/editorClipboard.d.ts +23 -0
- package/dist/editorClipboard.d.ts.map +1 -0
- package/dist/editorClipboard.js +46 -0
- package/dist/editorClipboard.js.map +1 -0
- package/dist/fields-bridge.d.ts +26 -0
- package/dist/fields-bridge.d.ts.map +1 -0
- package/dist/fields-bridge.js +217 -0
- package/dist/fields-bridge.js.map +1 -0
- package/dist/formatDate.d.ts +8 -0
- package/dist/formatDate.d.ts.map +1 -0
- package/dist/formatDate.js +34 -0
- package/dist/formatDate.js.map +1 -0
- package/dist/grid-state.d.ts +29 -0
- package/dist/grid-state.d.ts.map +1 -0
- package/dist/grid-state.js +207 -0
- package/dist/grid-state.js.map +1 -0
- package/dist/history/commands.d.ts +29 -0
- package/dist/history/commands.d.ts.map +1 -0
- package/dist/history/commands.js +63 -0
- package/dist/history/commands.js.map +1 -0
- package/dist/history/diff.d.ts +22 -0
- package/dist/history/diff.d.ts.map +1 -0
- package/dist/history/diff.js +259 -0
- package/dist/history/diff.js.map +1 -0
- package/dist/history/transforms.d.ts +19 -0
- package/dist/history/transforms.d.ts.map +1 -0
- package/dist/history/transforms.js +69 -0
- package/dist/history/transforms.js.map +1 -0
- package/dist/history/types.d.ts +23 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +11 -0
- package/dist/history/types.js.map +1 -0
- package/dist/host-services.d.ts +57 -0
- package/dist/host-services.d.ts.map +1 -0
- package/dist/host-services.js +2 -0
- package/dist/host-services.js.map +1 -0
- package/dist/iconCatalog.d.ts +16 -0
- package/dist/iconCatalog.d.ts.map +1 -0
- package/dist/iconCatalog.js +32 -0
- package/dist/iconCatalog.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/insert-menu.d.ts +17 -0
- package/dist/insert-menu.d.ts.map +1 -0
- package/dist/insert-menu.js +35 -0
- package/dist/insert-menu.js.map +1 -0
- package/dist/model/bind-map.d.ts +6 -0
- package/dist/model/bind-map.d.ts.map +1 -0
- package/dist/model/bind-map.js +6 -0
- package/dist/model/bind-map.js.map +1 -0
- package/dist/model/layout-columns.d.ts +51 -0
- package/dist/model/layout-columns.d.ts.map +1 -0
- package/dist/model/layout-columns.js +74 -0
- package/dist/model/layout-columns.js.map +1 -0
- package/dist/model/page-topology.d.ts +20 -0
- package/dist/model/page-topology.d.ts.map +1 -0
- package/dist/model/page-topology.js +94 -0
- package/dist/model/page-topology.js.map +1 -0
- package/dist/model/page-tree-bridge.d.ts +81 -0
- package/dist/model/page-tree-bridge.d.ts.map +1 -0
- package/dist/model/page-tree-bridge.js +234 -0
- package/dist/model/page-tree-bridge.js.map +1 -0
- package/dist/model/prop-access.d.ts +69 -0
- package/dist/model/prop-access.d.ts.map +1 -0
- package/dist/model/prop-access.js +94 -0
- package/dist/model/prop-access.js.map +1 -0
- package/dist/mount.d.ts +25 -0
- package/dist/mount.d.ts.map +1 -0
- package/dist/mount.js +26 -0
- package/dist/mount.js.map +1 -0
- package/dist/page-actions.d.ts +26 -0
- package/dist/page-actions.d.ts.map +1 -0
- package/dist/page-actions.js +118 -0
- package/dist/page-actions.js.map +1 -0
- package/dist/pageActions.d.ts +4 -0
- package/dist/pageActions.d.ts.map +1 -0
- package/dist/pageActions.js +4 -0
- package/dist/pageActions.js.map +1 -0
- package/dist/pagePaths.d.ts +30 -0
- package/dist/pagePaths.d.ts.map +1 -0
- package/dist/pagePaths.js +102 -0
- package/dist/pagePaths.js.map +1 -0
- package/dist/pagesActions.d.ts +60 -0
- package/dist/pagesActions.d.ts.map +1 -0
- package/dist/pagesActions.js +216 -0
- package/dist/pagesActions.js.map +1 -0
- package/dist/preview-auth.d.ts +29 -0
- package/dist/preview-auth.d.ts.map +1 -0
- package/dist/preview-auth.js +18 -0
- package/dist/preview-auth.js.map +1 -0
- package/dist/renderActions.d.ts +30 -0
- package/dist/renderActions.d.ts.map +1 -0
- package/dist/renderActions.js +2 -0
- package/dist/renderActions.js.map +1 -0
- package/dist/translation.d.ts +78 -0
- package/dist/translation.d.ts.map +1 -0
- package/dist/translation.js +64 -0
- package/dist/translation.js.map +1 -0
- package/dist/types.d.ts +128 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/useCanvasBackStack.d.ts +19 -0
- package/dist/useCanvasBackStack.d.ts.map +1 -0
- package/dist/useCanvasBackStack.js +49 -0
- package/dist/useCanvasBackStack.js.map +1 -0
- package/dist/useCanvasCamera.d.ts +37 -0
- package/dist/useCanvasCamera.d.ts.map +1 -0
- package/dist/useCanvasCamera.js +247 -0
- package/dist/useCanvasCamera.js.map +1 -0
- package/dist/useCanvasFocus.d.ts +32 -0
- package/dist/useCanvasFocus.d.ts.map +1 -0
- package/dist/useCanvasFocus.js +114 -0
- package/dist/useCanvasFocus.js.map +1 -0
- package/dist/useCanvasKeyboardNav.d.ts +32 -0
- package/dist/useCanvasKeyboardNav.d.ts.map +1 -0
- package/dist/useCanvasKeyboardNav.js +185 -0
- package/dist/useCanvasKeyboardNav.js.map +1 -0
- package/dist/useClipboardActions.d.ts +37 -0
- package/dist/useClipboardActions.d.ts.map +1 -0
- package/dist/useClipboardActions.js +126 -0
- package/dist/useClipboardActions.js.map +1 -0
- package/dist/useColumnWindow.d.ts +29 -0
- package/dist/useColumnWindow.d.ts.map +1 -0
- package/dist/useColumnWindow.js +80 -0
- package/dist/useColumnWindow.js.map +1 -0
- package/dist/useEditorHistory.d.ts +18 -0
- package/dist/useEditorHistory.d.ts.map +1 -0
- package/dist/useEditorHistory.js +91 -0
- package/dist/useEditorHistory.js.map +1 -0
- package/dist/usePagePathEditor.d.ts +36 -0
- package/dist/usePagePathEditor.d.ts.map +1 -0
- package/dist/usePagePathEditor.js +163 -0
- package/dist/usePagePathEditor.js.map +1 -0
- package/dist/usePageTitleEditor.d.ts +17 -0
- package/dist/usePageTitleEditor.d.ts.map +1 -0
- package/dist/usePageTitleEditor.js +101 -0
- package/dist/usePageTitleEditor.js.map +1 -0
- package/dist/useTextFocusIntent.d.ts +13 -0
- package/dist/useTextFocusIntent.d.ts.map +1 -0
- package/dist/useTextFocusIntent.js +70 -0
- package/dist/useTextFocusIntent.js.map +1 -0
- package/package.json +58 -0
- package/styles/index.css +196 -0
- 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":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEpD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,cAAc,EACd,sBAAsB,EACtB,SAAS,GACV,MAAM,4BAA4B,CAAC;AAQpC;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,eAAe,CAAC,EAAE,cAAc,EAAuB;IACrE,wEAAwE;IACxE,2EAA2E;IAC3E,6BAA6B;IAC7B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpC,MAAM,QAAQ,GAAG,MAAM,CAAqB,IAAI,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,CAAwB,IAAI,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,MAAM,CAA2B,IAAI,CAAC,CAAC;IAC5D,MAAM,cAAc,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,4EAA4E;IAC5E,0EAA0E;IAC1E,0EAA0E;IAC1E,4BAA4B;IAC5B,IAAI,cAAc,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QACpC,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC;IACzB,CAAC;IAED,0EAA0E;IAC1E,2EAA2E;IAC3E,wEAAwE;IACxE,sEAAsE;IACtE,2EAA2E;IAC3E,mEAAmE;IACnE,sDAAsD;IACtD,SAAS,cAAc;QACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;YAAE,OAAO;QAC7B,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC;QAC9B,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,SAAS,KAAK,GAAG,CAAC;QAC1C,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,KAAK,CAAC,WAAW,GAAG,KAAK,IAAI,CAAC;QACrD,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,YAAY,GAAG,KAAK,IAAI,CAAC;IACzD,CAAC;IAED,uEAAuE;IACvE,0EAA0E;IAC1E,wDAAwD;IACxD,SAAS,WAAW,CAAC,OAAe,EAAE,OAAe,EAAE,OAAe;QACpE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;QACpC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,WAAW;YAAE,OAAO;QAC9C,wEAAwE;QACxE,qEAAqE;QACrE,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;QACpC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAClC,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC;QAC1B,cAAc,EAAE,CAAC;QACjB,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,GAAG,OAAO,CAAC,GAAG,WAAW,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC;QAC9E,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,WAAW,CAAC,GAAG,OAAO,GAAG,OAAO,CAAC;QAC5E,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;YACzB,YAAY,CAAC,OAAO,CAAC,WAAW,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC;QACrE,CAAC;QACD,IAAI,cAAc,CAAC,OAAO,KAAK,IAAI;YAAE,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACjF,cAAc,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;YAC9C,cAAc,CAAC,OAAO,GAAG,IAAI,CAAC;YAC9B,OAAO,CAAC,OAAO,CAAC,CAAC;QACnB,CAAC,EAAE,cAAc,CAAC,CAAC;IACrB,CAAC;IAED,wEAAwE;IACxE,uEAAuE;IACvE,SAAS,SAAS,CAAC,OAAe;QAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,2EAA2E;IAC3E,8EAA8E;IAC9E,8EAA8E;IAC9E,8BAA8B;IAC9B,SAAS,aAAa,CAAC,KAAkB,EAAE,MAAc,EAAE,UAAkB;QAC3E,IAAI,SAAS,CAAC,OAAO,KAAK,IAAI;YAAE,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC;QAC/B,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;QAClD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,GAAG,GAAG,KAAK,CAAC;QAC1B,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;YAAE,OAAO;QAChC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACxF,MAAM,IAAI,GAAG,CAAC,GAAW,EAAE,EAAE;YAC3B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,UAAU,CAAC,CAAC;YAC/C,KAAK,CAAC,UAAU,GAAG,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YAC3C,SAAS,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACjE,CAAC,CAAC;QACF,SAAS,CAAC,OAAO,GAAG,qBAAqB,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC;IAED,0EAA0E;IAC1E,oEAAoE;IACpE,0EAA0E;IAC1E,8EAA8E;IAC9E,8EAA8E;IAC9E,mEAAmE;IACnE,SAAS,qBAAqB,CAAC,MAAc,EAAE,YAAoB;QACjE,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK;YAAE,OAAO;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,CAAc,kBAAkB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3F,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;QAClC,MAAM,SAAS,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAChD,mEAAmE;QACnE,MAAM,eAAe,GAAG,KAAK,CAAC,UAAU,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,YAAY,GAAG,eAAe,GAAG,CAAC,YAAY,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC;QACtE,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,aAAa,CAAC,CAAC;IAC5E,CAAC;IAED,0EAA0E;IAC1E,sEAAsE;IACtE,0DAA0D;IAC1D,MAAM,gBAAgB,GAAG,MAAM,CAC7B,IAAI,CACL,CAAC;IAEF,SAAS,0BAA0B,CAAC,KAA2C;QAC7E,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;QACjF,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;QAChC,MAAM,MAAM,GAAG,CAAC,SAAuB,EAAE,EAAE;YACzC,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC;YAC3C,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC;gBAAE,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YACxC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QAClD,CAAC,CAAC;QACF,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,MAAM,CAAC,mBAAmB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,CAAC,mBAAmB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;YAC9C,uEAAuE;YACvE,2BAA2B;YAC3B,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE;gBACrB,IAAI,gBAAgB,CAAC,OAAO,KAAK,IAAI;oBAAE,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;YACzE,CAAC,EAAE,CAAC,CAAC,CAAC;QACR,CAAC,CAAC;QACF,MAAM,CAAC,gBAAgB,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;QAC/C,MAAM,CAAC,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC7C,CAAC;IAED,SAAS,CACP,GAAG,EAAE,CAAC,GAAG,EAAE;QACT,IAAI,cAAc,CAAC,OAAO,KAAK,IAAI;YAAE,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QACjF,IAAI,SAAS,CAAC,OAAO,KAAK,IAAI;YAAE,oBAAoB,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC1E,CAAC,EACD,EAAE,CACH,CAAC;IAEF,4EAA4E;IAC5E,0EAA0E;IAC1E,2DAA2D;IAC3D,SAAS,CAAC,GAAG,EAAE;QACb,cAAc,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK;YAAE,OAAO;QACnB,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,GAAG,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;QAC5D,QAAQ,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACxB,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;IACrC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,uEAAuE;IACvE,uEAAuE;IACvE,8DAA8D;IAC9D,wEAAwE;IACxE,oBAAoB;IACpB,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,SAAS,eAAe,CAAC,KAAiB;YACxC,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;gBAAE,OAAO;YACzD,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;YACpC,MAAM,OAAO,GAAG,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,sBAAsB,CAAC,CAAC,CAAC;YAC1F,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;YAC3C,WAAW,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC5E,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,eAAe,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACrE,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACnE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,2EAA2E;IAC3E,wEAAwE;IACxE,yEAAyE;IACzE,0EAA0E;IAC1E,oEAAoE;IACpE,yDAAyD;IACzD,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,SAAS,mBAAmB,CAAC,KAAiB;YAC5C,IAAI,OAAO,CAAC,OAAO,IAAI,mBAAmB,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,YAAY,OAAO,CAAC;gBAAE,OAAO;YACzF,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,gCAAgC,CAAC;gBAAE,OAAO;YACnE,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAc,cAAc,CAAC,CAAC;YACjE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,OAAO,CAAc,aAAa,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,KAAK,EAAE,OAAO,CAAC,MAAM,IAAI,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC;YACjE,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK;gBAAE,OAAO;YAC9B,KAAK,CAAC,cAAc,EAAE,CAAC;YACvB,KAAK,CAAC,wBAAwB,EAAE,CAAC;YACjC,MAAM,IAAI,GAAG,KAAK,CAAC,qBAAqB,EAAE,CAAC;YAC3C,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;YACpE,cAAc,CAAC,MAAM,CAAC,CAAC;YACvB,4DAA4D;YAC5D,mEAAmE;YACnE,kDAAkD;YAClD,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,EAAE,CAAC,CAAC;QACxF,CAAC;QAED,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;QAC3D,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,mBAAmB,CAAC,OAAO,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC;IAC7E,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC;IAErB,OAAO;QACL,IAAI;QACJ,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,YAAY;QACZ,cAAc;QACd,OAAO;QACP,gBAAgB;QAChB,SAAS;QACT,qBAAqB;QACrB,0BAA0B;KAC3B,CAAC;AACJ,CAAC"}
|
|
@@ -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"}
|