@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,185 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
import { CANVAS_KEYBOARD_IGNORE_SELECTOR, selectableBlocksForPage, } from "./components/canvas/keyboard-nav.js";
|
|
3
|
+
import { isActiveEditorRoot } from "@batterai/canvas";
|
|
4
|
+
/**
|
|
5
|
+
* `useCanvasKeyboardNav` — arrow-key navigation across the board plus the Esc
|
|
6
|
+
* selection ladder (§2.1, I-1). Arrow keys move the selection between a page's
|
|
7
|
+
* blocks (Up/Down) and between pages (all four directions); Esc from a text
|
|
8
|
+
* session lands on the enclosing block, and a further Esc climbs block → parent
|
|
9
|
+
* block → page level.
|
|
10
|
+
*
|
|
11
|
+
* Returns the `onKeyDown` handler for the canvas shell. The two Esc listeners
|
|
12
|
+
* are native (document/shell) rather than React handlers because committing a
|
|
13
|
+
* text session blurs focus to <body> before the keydown fires, so a
|
|
14
|
+
* shell-scoped React handler would never see them.
|
|
15
|
+
*/
|
|
16
|
+
export function useCanvasKeyboardNav({ boardRef, shellRef, pages, topLevel, pagesInColumn, activePageId, selectedId, isTextEditing, onSelect, setMovingBlockId, activateAndScroll, }) {
|
|
17
|
+
function pageColumns() {
|
|
18
|
+
return topLevel.map((page) => pagesInColumn(page.id));
|
|
19
|
+
}
|
|
20
|
+
function pagePosition(pageId) {
|
|
21
|
+
const columns = pageColumns();
|
|
22
|
+
for (let columnIndex = 0; columnIndex < columns.length; columnIndex += 1) {
|
|
23
|
+
const rowIndex = columns[columnIndex]?.findIndex((candidate) => candidate.id === pageId) ?? -1;
|
|
24
|
+
if (rowIndex >= 0)
|
|
25
|
+
return { columnIndex, rowIndex, columns };
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
function adjacentPageId(pageId, key) {
|
|
30
|
+
const position = pagePosition(pageId);
|
|
31
|
+
if (!position)
|
|
32
|
+
return null;
|
|
33
|
+
const { columnIndex, rowIndex, columns } = position;
|
|
34
|
+
if (key === "ArrowUp" || key === "ArrowDown") {
|
|
35
|
+
const nextRow = rowIndex + (key === "ArrowDown" ? 1 : -1);
|
|
36
|
+
return columns[columnIndex]?.[nextRow]?.id ?? null;
|
|
37
|
+
}
|
|
38
|
+
if (key === "ArrowLeft" || key === "ArrowRight") {
|
|
39
|
+
const nextColumn = columnIndex + (key === "ArrowRight" ? 1 : -1);
|
|
40
|
+
const targetColumn = columns[nextColumn];
|
|
41
|
+
return targetColumn?.[Math.min(rowIndex, targetColumn.length - 1)]?.id ?? null;
|
|
42
|
+
}
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
function scrollBlockIntoView(blockId) {
|
|
46
|
+
requestAnimationFrame(() => {
|
|
47
|
+
const block = boardRef.current?.querySelector(`[data-block-id="${CSS.escape(blockId)}"]`);
|
|
48
|
+
block?.scrollIntoView({ block: "nearest", inline: "nearest" });
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function selectAdjacentBlock(direction) {
|
|
52
|
+
if (!selectedId)
|
|
53
|
+
return false;
|
|
54
|
+
const owner = pages.find((candidate) => selectableBlocksForPage(candidate).some((block) => block.id === selectedId));
|
|
55
|
+
if (!owner)
|
|
56
|
+
return false;
|
|
57
|
+
const blocks = selectableBlocksForPage(owner);
|
|
58
|
+
const index = blocks.findIndex((block) => block.id === selectedId);
|
|
59
|
+
const next = blocks[index + direction];
|
|
60
|
+
if (!next)
|
|
61
|
+
return false;
|
|
62
|
+
onSelect(next.id);
|
|
63
|
+
scrollBlockIntoView(next.id);
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
function selectPageByKeyboard(pageId) {
|
|
67
|
+
const sourcePage = selectedId
|
|
68
|
+
? pages.find((candidate) => selectableBlocksForPage(candidate).some((block) => block.id === selectedId))
|
|
69
|
+
: null;
|
|
70
|
+
const sourceBlocks = sourcePage ? selectableBlocksForPage(sourcePage) : [];
|
|
71
|
+
const sourceBlockIndex = selectedId
|
|
72
|
+
? sourceBlocks.findIndex((block) => block.id === selectedId)
|
|
73
|
+
: -1;
|
|
74
|
+
const targetPage = pages.find((candidate) => candidate.id === pageId) ?? null;
|
|
75
|
+
const targetBlocks = targetPage ? selectableBlocksForPage(targetPage) : [];
|
|
76
|
+
const targetBlock = sourceBlockIndex >= 0
|
|
77
|
+
? targetBlocks[Math.min(sourceBlockIndex, targetBlocks.length - 1)] ?? null
|
|
78
|
+
: null;
|
|
79
|
+
setMovingBlockId(null);
|
|
80
|
+
if (targetBlock) {
|
|
81
|
+
onSelect(targetBlock.id);
|
|
82
|
+
scrollBlockIntoView(targetBlock.id);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
onSelect(null);
|
|
86
|
+
activateAndScroll(pageId);
|
|
87
|
+
}
|
|
88
|
+
/** The next rung up the selection ladder (§2.1): a nested block's parent is
|
|
89
|
+
* the nearest enclosing block in the DOM (a layout/column block wraps its
|
|
90
|
+
* nested items). Top-level blocks have no block ancestor → null → page level. */
|
|
91
|
+
function parentBlockIdOf(blockId) {
|
|
92
|
+
const el = boardRef.current?.querySelector(`[data-block-id="${CSS.escape(blockId)}"]`);
|
|
93
|
+
const parent = el?.parentElement?.closest("[data-block-id]");
|
|
94
|
+
return parent?.dataset.blockId ?? null;
|
|
95
|
+
}
|
|
96
|
+
function handleCanvasKeyDown(event) {
|
|
97
|
+
if (event.defaultPrevented ||
|
|
98
|
+
event.altKey ||
|
|
99
|
+
event.ctrlKey ||
|
|
100
|
+
event.metaKey ||
|
|
101
|
+
isTextEditing) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (!["ArrowLeft", "ArrowRight", "ArrowUp", "ArrowDown"].includes(event.key))
|
|
105
|
+
return;
|
|
106
|
+
const target = event.target;
|
|
107
|
+
if (target instanceof Element && target.closest(CANVAS_KEYBOARD_IGNORE_SELECTOR))
|
|
108
|
+
return;
|
|
109
|
+
if (selectedId && (event.key === "ArrowUp" || event.key === "ArrowDown")) {
|
|
110
|
+
const movedBlock = selectAdjacentBlock(event.key === "ArrowDown" ? 1 : -1);
|
|
111
|
+
if (movedBlock) {
|
|
112
|
+
event.preventDefault();
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const targetPageId = adjacentPageId(activePageId, event.key);
|
|
117
|
+
if (!targetPageId)
|
|
118
|
+
return;
|
|
119
|
+
event.preventDefault();
|
|
120
|
+
selectPageByKeyboard(targetPageId);
|
|
121
|
+
}
|
|
122
|
+
// I-1 (decision 011): Esc from a text session commits (EditableText's blur
|
|
123
|
+
// path) and then dispatches `battery:escape-to-block`. This bubbles to the
|
|
124
|
+
// canvas shell, where we select the enclosing block — the same landing as a
|
|
125
|
+
// click on that block, per §2.1 (text -> block selected). A native listener
|
|
126
|
+
// (not a React onKeyDown) because EditableText blurs before the event fires,
|
|
127
|
+
// so the keydown no longer targets a React-tracked node.
|
|
128
|
+
useEffect(() => {
|
|
129
|
+
const shell = shellRef.current;
|
|
130
|
+
if (!shell)
|
|
131
|
+
return;
|
|
132
|
+
function handleEscapeToBlock(event) {
|
|
133
|
+
if (!(event.target instanceof Element))
|
|
134
|
+
return;
|
|
135
|
+
const blockEl = event.target.closest("[data-block-id]");
|
|
136
|
+
const blockId = blockEl?.dataset.blockId;
|
|
137
|
+
if (!blockId)
|
|
138
|
+
return;
|
|
139
|
+
onSelect(blockId);
|
|
140
|
+
}
|
|
141
|
+
shell.addEventListener("battery:escape-to-block", handleEscapeToBlock);
|
|
142
|
+
return () => shell.removeEventListener("battery:escape-to-block", handleEscapeToBlock);
|
|
143
|
+
}, [onSelect]);
|
|
144
|
+
// The rest of the ladder (§2.1, I-1): once a block is selected and no text
|
|
145
|
+
// session is active, Esc climbs to the parent block (nested → layout), and
|
|
146
|
+
// from a top-level block clears to page level. A document listener (not the
|
|
147
|
+
// shell's React onKeyDown) because committing the text session blurs focus to
|
|
148
|
+
// <body>, so a shell-scoped handler would never see these presses. Chrome
|
|
149
|
+
// inputs (title/path/site-title rename) own their own Esc and are skipped so
|
|
150
|
+
// their platform-conventional cancel-rename is preserved (§2.2 scope boundary).
|
|
151
|
+
useEffect(() => {
|
|
152
|
+
if (isTextEditing || !selectedId)
|
|
153
|
+
return;
|
|
154
|
+
function handleLadderEscape(event) {
|
|
155
|
+
const root = shellRef.current?.closest("[data-battery-editor-root]") ?? null;
|
|
156
|
+
if (!isActiveEditorRoot(root))
|
|
157
|
+
return;
|
|
158
|
+
if (event.target instanceof Node && event.target !== document.body && !root?.contains(event.target))
|
|
159
|
+
return;
|
|
160
|
+
if (event.key !== "Escape" ||
|
|
161
|
+
event.defaultPrevented ||
|
|
162
|
+
event.altKey ||
|
|
163
|
+
event.ctrlKey ||
|
|
164
|
+
event.metaKey) {
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const target = event.target;
|
|
168
|
+
if (target instanceof Element && target.closest(CANVAS_KEYBOARD_IGNORE_SELECTOR))
|
|
169
|
+
return;
|
|
170
|
+
event.preventDefault();
|
|
171
|
+
const parentId = parentBlockIdOf(selectedId);
|
|
172
|
+
if (parentId) {
|
|
173
|
+
onSelect(parentId);
|
|
174
|
+
scrollBlockIntoView(parentId);
|
|
175
|
+
}
|
|
176
|
+
else {
|
|
177
|
+
onSelect(null);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
document.addEventListener("keydown", handleLadderEscape);
|
|
181
|
+
return () => document.removeEventListener("keydown", handleLadderEscape);
|
|
182
|
+
}, [isTextEditing, selectedId, onSelect]);
|
|
183
|
+
return { handleCanvasKeyDown };
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=useCanvasKeyboardNav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useCanvasKeyboardNav.js","sourceRoot":"","sources":["../src/useCanvasKeyboardNav.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type EditorClipboardPayload } from "./editorClipboard";
|
|
2
|
+
import type { BlockNode } from "@batterai/bind-core";
|
|
3
|
+
import type { BlockDefinition, BlockDesignSettings, BlockLibrary, CanvasPage } from "./types";
|
|
4
|
+
import type { EditorHostServices } from "./host-services";
|
|
5
|
+
/**
|
|
6
|
+
* Clipboard, design-paste, and preset-save behavior for the editor. Pulled
|
|
7
|
+
* out of App so the page/canvas orchestration stays readable; all state
|
|
8
|
+
* changes still flow through the commit callbacks App provides.
|
|
9
|
+
*/
|
|
10
|
+
export declare function useClipboardActions({ pages, activePage, selectedId, selectedIds, selectedBlock, selectedDefinition, commitPages, commitOwningPage, selectBlocks, onLibraryUpdate, savePreset, }: {
|
|
11
|
+
pages: CanvasPage[] | null;
|
|
12
|
+
activePage: CanvasPage | null;
|
|
13
|
+
selectedId: string | null;
|
|
14
|
+
selectedIds: string[];
|
|
15
|
+
selectedBlock: BlockNode | null;
|
|
16
|
+
selectedDefinition: BlockDefinition | null;
|
|
17
|
+
commitPages: (update: (current: CanvasPage[]) => CanvasPage[]) => void;
|
|
18
|
+
commitOwningPage: (blockId: string, update: (current: CanvasPage) => CanvasPage) => void;
|
|
19
|
+
selectBlocks: (lastId: string | null, ids: string[]) => void;
|
|
20
|
+
onLibraryUpdate: (library: BlockLibrary) => void;
|
|
21
|
+
savePreset: EditorHostServices["savePreset"];
|
|
22
|
+
}): {
|
|
23
|
+
editorClipboard: EditorClipboardPayload | null;
|
|
24
|
+
setEditorClipboard: import("react").Dispatch<import("react").SetStateAction<EditorClipboardPayload | null>>;
|
|
25
|
+
designClipboard: BlockDesignSettings | null;
|
|
26
|
+
pendingDesignPaste: BlockDesignSettings | null;
|
|
27
|
+
setPendingDesignPaste: import("react").Dispatch<import("react").SetStateAction<BlockDesignSettings | null>>;
|
|
28
|
+
showPresetDialog: boolean;
|
|
29
|
+
setShowPresetDialog: import("react").Dispatch<import("react").SetStateAction<boolean>>;
|
|
30
|
+
applyDesign: (settings: BlockDesignSettings) => void;
|
|
31
|
+
resetDesign: () => void;
|
|
32
|
+
pasteClipboard: (payload?: EditorClipboardPayload | null) => boolean;
|
|
33
|
+
copyBlock: (blockId: string) => boolean;
|
|
34
|
+
copySelectedBlocks: () => boolean;
|
|
35
|
+
saveSelectionPreset: (label: string) => Promise<void>;
|
|
36
|
+
};
|
|
37
|
+
//# sourceMappingURL=useClipboardActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClipboardActions.d.ts","sourceRoot":"","sources":["../src/useClipboardActions.ts"],"names":[],"mappings":"AAGA,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,mBAAmB,CAAC;AAU3B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,UAAU,EACX,MAAM,SAAS,CAAC;AACjB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAE1D;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,KAAK,EACL,UAAU,EACV,UAAU,EACV,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,UAAU,GACX,EAAE;IACD,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,SAAS,GAAG,IAAI,CAAC;IAChC,kBAAkB,EAAE,eAAe,GAAG,IAAI,CAAC;IAC3C,WAAW,EAAE,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,UAAU,EAAE,KAAK,IAAI,CAAC;IACvE,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,UAAU,KAAK,IAAI,CAAC;IACzF,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IAC7D,eAAe,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IACjD,UAAU,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;CAC9C;;;;;;;;4BAMgC,mBAAmB;;;yBAiEtB,MAAM;;iCAWQ,MAAM;EA6BjD"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
import { makeSelectionPreset } from "./blockPresets.js";
|
|
3
|
+
import { blockDesignDefaults, hasCustomDesign } from "./designSettings.js";
|
|
4
|
+
import { makeBlocksClipboard, } from "./editorClipboard.js";
|
|
5
|
+
import { blocksById, freshBlocks, insertBlocksAfter, LAYOUT_BLOCK_TYPE, updateBlockDesign, updateBlockProps, } from "./pageActions.js";
|
|
6
|
+
import { pageOfBlock, updatePage } from "./pagesActions.js";
|
|
7
|
+
/**
|
|
8
|
+
* Clipboard, design-paste, and preset-save behavior for the editor. Pulled
|
|
9
|
+
* out of App so the page/canvas orchestration stays readable; all state
|
|
10
|
+
* changes still flow through the commit callbacks App provides.
|
|
11
|
+
*/
|
|
12
|
+
export function useClipboardActions({ pages, activePage, selectedId, selectedIds, selectedBlock, selectedDefinition, commitPages, commitOwningPage, selectBlocks, onLibraryUpdate, savePreset, }) {
|
|
13
|
+
const [editorClipboard, setEditorClipboard] = useState(null);
|
|
14
|
+
const [pendingDesignPaste, setPendingDesignPaste] = useState(null);
|
|
15
|
+
const [showPresetDialog, setShowPresetDialog] = useState(false);
|
|
16
|
+
const designClipboard = editorClipboard?.kind === "design" ? editorClipboard.design : null;
|
|
17
|
+
function applyDesign(settings) {
|
|
18
|
+
if (!selectedId)
|
|
19
|
+
return;
|
|
20
|
+
commitOwningPage(selectedId, (current) => updateBlockDesign(current, selectedId, settings));
|
|
21
|
+
}
|
|
22
|
+
function resetDesign() {
|
|
23
|
+
if (!selectedId || !selectedDefinition)
|
|
24
|
+
return;
|
|
25
|
+
applyDesign(blockDesignDefaults(selectedDefinition));
|
|
26
|
+
}
|
|
27
|
+
function pasteDesign(settings = designClipboard) {
|
|
28
|
+
if (!settings || !selectedBlock || !selectedDefinition)
|
|
29
|
+
return;
|
|
30
|
+
if (hasCustomDesign(selectedBlock, selectedDefinition)) {
|
|
31
|
+
setPendingDesignPaste(settings);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
applyDesign(settings);
|
|
35
|
+
}
|
|
36
|
+
function pasteClipboard(payload = editorClipboard) {
|
|
37
|
+
if (!payload || !pages)
|
|
38
|
+
return false;
|
|
39
|
+
if (payload.kind === "design") {
|
|
40
|
+
pasteDesign(payload.design);
|
|
41
|
+
return true;
|
|
42
|
+
}
|
|
43
|
+
if (payload.kind === "settings") {
|
|
44
|
+
if (!selectedId || selectedBlock?.blockType !== payload.blockType)
|
|
45
|
+
return false;
|
|
46
|
+
commitOwningPage(selectedId, (current) => updateBlockProps(current, selectedId, payload.props));
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
const anchorPage = pageOfBlock(pages, selectedId) ?? activePage;
|
|
50
|
+
if (!anchorPage)
|
|
51
|
+
return false;
|
|
52
|
+
const anchorIsTopLevel = !selectedId || anchorPage.root.some((block) => block.id === selectedId);
|
|
53
|
+
const pasteableBlocks = anchorIsTopLevel
|
|
54
|
+
? payload.blocks
|
|
55
|
+
: payload.blocks.filter((block) => block.kind !== "block" || block.blockType !== LAYOUT_BLOCK_TYPE);
|
|
56
|
+
const inserted = freshBlocks(pasteableBlocks);
|
|
57
|
+
if (inserted.length === 0)
|
|
58
|
+
return false;
|
|
59
|
+
commitPages((current) => updatePage(current, anchorPage.id, (target) => insertBlocksAfter(target, selectedId, inserted)));
|
|
60
|
+
selectBlocks(inserted.at(-1)?.id ?? null, inserted.map((block) => block.id));
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
function copySelectedBlocks() {
|
|
64
|
+
if (!pages)
|
|
65
|
+
return false;
|
|
66
|
+
const ids = selectedIds.length ? selectedIds : selectedId ? [selectedId] : [];
|
|
67
|
+
const sourcePage = pageOfBlock(pages, ids[0] ?? null);
|
|
68
|
+
if (!sourcePage)
|
|
69
|
+
return false;
|
|
70
|
+
const selectedBlocks = blocksById(sourcePage, ids);
|
|
71
|
+
if (selectedBlocks.length === 0)
|
|
72
|
+
return false;
|
|
73
|
+
setEditorClipboard(makeBlocksClipboard(selectedBlocks));
|
|
74
|
+
return true;
|
|
75
|
+
}
|
|
76
|
+
/** Copy one specific block (the per-block toolbar button) to the editor
|
|
77
|
+
* clipboard — deliberately NOT an in-place duplicate: the user pastes it
|
|
78
|
+
* where they want it (Cmd/Ctrl+V), possibly on another page. Also selects
|
|
79
|
+
* the block so the paste anchor is obvious. */
|
|
80
|
+
function copyBlock(blockId) {
|
|
81
|
+
if (!pages)
|
|
82
|
+
return false;
|
|
83
|
+
const sourcePage = pageOfBlock(pages, blockId);
|
|
84
|
+
if (!sourcePage)
|
|
85
|
+
return false;
|
|
86
|
+
const blocks = blocksById(sourcePage, [blockId]);
|
|
87
|
+
if (blocks.length === 0)
|
|
88
|
+
return false;
|
|
89
|
+
setEditorClipboard(makeBlocksClipboard(blocks));
|
|
90
|
+
selectBlocks(blockId, [blockId]);
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
async function saveSelectionPreset(label) {
|
|
94
|
+
if (!pages || selectedIds.length === 0)
|
|
95
|
+
return;
|
|
96
|
+
const firstSelectedId = selectedIds[0];
|
|
97
|
+
if (!firstSelectedId)
|
|
98
|
+
return;
|
|
99
|
+
const sourcePage = pageOfBlock(pages, firstSelectedId);
|
|
100
|
+
if (!sourcePage)
|
|
101
|
+
return;
|
|
102
|
+
const selectedBlocks = blocksById(sourcePage, selectedIds);
|
|
103
|
+
if (selectedBlocks.length === 0)
|
|
104
|
+
return;
|
|
105
|
+
const preset = makeSelectionPreset(label, selectedBlocks);
|
|
106
|
+
const result = await savePreset(preset);
|
|
107
|
+
onLibraryUpdate(result.library);
|
|
108
|
+
setShowPresetDialog(false);
|
|
109
|
+
}
|
|
110
|
+
return {
|
|
111
|
+
editorClipboard,
|
|
112
|
+
setEditorClipboard,
|
|
113
|
+
designClipboard,
|
|
114
|
+
pendingDesignPaste,
|
|
115
|
+
setPendingDesignPaste,
|
|
116
|
+
showPresetDialog,
|
|
117
|
+
setShowPresetDialog,
|
|
118
|
+
applyDesign,
|
|
119
|
+
resetDesign,
|
|
120
|
+
pasteClipboard,
|
|
121
|
+
copyBlock,
|
|
122
|
+
copySelectedBlocks,
|
|
123
|
+
saveSelectionPreset,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=useClipboardActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useClipboardActions.js","sourceRoot":"","sources":["../src/useClipboardActions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EACL,mBAAmB,GAIpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,GACjB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAUzD;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,KAAK,EACL,UAAU,EACV,UAAU,EACV,WAAW,EACX,aAAa,EACb,kBAAkB,EAClB,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,UAAU,GAaX;IACC,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC,GAAG,QAAQ,CAAgC,IAAI,CAAC,CAAC;IAC5F,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC,GAAG,QAAQ,CAA6B,IAAI,CAAC,CAAC;IAC/F,MAAM,CAAC,gBAAgB,EAAE,mBAAmB,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAChE,MAAM,eAAe,GAAG,eAAe,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAE3F,SAAS,WAAW,CAAC,QAA6B;QAChD,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,gBAAgB,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC9F,CAAC;IAED,SAAS,WAAW;QAClB,IAAI,CAAC,UAAU,IAAI,CAAC,kBAAkB;YAAE,OAAO;QAC/C,WAAW,CAAC,mBAAmB,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,SAAS,WAAW,CAAC,QAAQ,GAAG,eAAe;QAC7C,IAAI,CAAC,QAAQ,IAAI,CAAC,aAAa,IAAI,CAAC,kBAAkB;YAAE,OAAO;QAC/D,IAAI,eAAe,CAAC,aAAa,EAAE,kBAAkB,CAAC,EAAE,CAAC;YACvD,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAChC,OAAO;QACT,CAAC;QACD,WAAW,CAAC,QAAQ,CAAC,CAAC;IACxB,CAAC;IAED,SAAS,cAAc,CAAC,OAAO,GAAG,eAAe;QAC/C,IAAI,CAAC,OAAO,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACrC,IAAI,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9B,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YAChC,IAAI,CAAC,UAAU,IAAI,aAAa,EAAE,SAAS,KAAK,OAAO,CAAC,SAAS;gBAAE,OAAO,KAAK,CAAC;YAChF,gBAAgB,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CACvC,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,KAAK,CAAC,CACrD,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,EAAE,UAAU,CAAC,IAAI,UAAU,CAAC;QAChE,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,MAAM,gBAAgB,GACpB,CAAC,UAAU,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;QAC1E,MAAM,eAAe,GAAG,gBAAgB;YACtC,CAAC,CAAC,OAAO,CAAC,MAAM;YAChB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,IAAI,KAAK,CAAC,SAAS,KAAK,iBAAiB,CAAC,CAAC;QACtG,MAAM,QAAQ,GAAG,WAAW,CAAC,eAAe,CAAC,CAAC;QAC9C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACxC,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE,CACtB,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAC5C,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAChD,CACF,CAAC;QACF,YAAY,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,kBAAkB;QACzB,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9E,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC;QACtD,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,MAAM,cAAc,GAAG,UAAU,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QACnD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAC9C,kBAAkB,CAAC,mBAAmB,CAAC,cAAc,CAAC,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;mDAG+C;IAC/C,SAAS,SAAS,CAAC,OAAe;QAChC,IAAI,CAAC,KAAK;YAAE,OAAO,KAAK,CAAC;QACzB,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/C,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACjD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QACtC,kBAAkB,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC;QAChD,YAAY,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACjC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,UAAU,mBAAmB,CAAC,KAAa;QAC9C,IAAI,CAAC,KAAK,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/C,MAAM,eAAe,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,CAAC,eAAe;YAAE,OAAO;QAC7B,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU;YAAE,OAAO;QACxB,MAAM,cAAc,GAAG,UAAU,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAC3D,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACxC,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;QACxC,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,eAAe;QACf,kBAAkB;QAClB,eAAe;QACf,kBAAkB;QAClB,qBAAqB;QACrB,gBAAgB;QAChB,mBAAmB;QACnB,WAAW;QACX,WAAW;QACX,cAAc;QACd,SAAS;QACT,kBAAkB;QAClB,mBAAmB;KACpB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { RefObject } from "react";
|
|
2
|
+
import type { CanvasPage } from "./types";
|
|
3
|
+
type UseColumnWindowArgs = {
|
|
4
|
+
shellRef: RefObject<HTMLElement | null>;
|
|
5
|
+
zoomRef: RefObject<number>;
|
|
6
|
+
settleTimerRef: RefObject<number | null>;
|
|
7
|
+
zoom: number;
|
|
8
|
+
topLevel: readonly CanvasPage[];
|
|
9
|
+
activePageId: string;
|
|
10
|
+
topLevelAncestorOf: (pageId: string) => string;
|
|
11
|
+
columnWidth: (topLevelId: string) => number;
|
|
12
|
+
isDragging: boolean;
|
|
13
|
+
expandedPages: Set<string>;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* `useColumnWindow` — the visible-column lazy-load window for the board. With
|
|
17
|
+
* many pages mounted at once, only the columns within the visible area (plus a
|
|
18
|
+
* margin) render live editable content; everything else is a same-size
|
|
19
|
+
* placeholder. The window is seeded synchronously from the active page (so the
|
|
20
|
+
* right columns are real on first paint) and then recomputed on zoom, content,
|
|
21
|
+
* active-page, and scroll changes.
|
|
22
|
+
*
|
|
23
|
+
* Returns the set of top-level column ids that are currently mounted.
|
|
24
|
+
*/
|
|
25
|
+
export declare function useColumnWindow({ shellRef, zoomRef, settleTimerRef, zoom, topLevel, activePageId, topLevelAncestorOf, columnWidth, isDragging, expandedPages, }: UseColumnWindowArgs): {
|
|
26
|
+
loadedColumns: Set<string>;
|
|
27
|
+
};
|
|
28
|
+
export {};
|
|
29
|
+
//# sourceMappingURL=useColumnWindow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useColumnWindow.d.ts","sourceRoot":"","sources":["../src/useColumnWindow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,KAAK,mBAAmB,GAAG;IACzB,QAAQ,EAAE,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAGxC,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;IAC3B,cAAc,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAGzC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;IAC/C,WAAW,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;IAC5C,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,EAC9B,QAAQ,EACR,OAAO,EACP,cAAc,EACd,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,UAAU,EACV,aAAa,GACd,EAAE,mBAAmB;;EAuErB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { useEffect, useState } from "react";
|
|
2
|
+
import { computeVisibleColumnIds, sameIds } from "./components/canvas/column-window.js";
|
|
3
|
+
/**
|
|
4
|
+
* `useColumnWindow` — the visible-column lazy-load window for the board. With
|
|
5
|
+
* many pages mounted at once, only the columns within the visible area (plus a
|
|
6
|
+
* margin) render live editable content; everything else is a same-size
|
|
7
|
+
* placeholder. The window is seeded synchronously from the active page (so the
|
|
8
|
+
* right columns are real on first paint) and then recomputed on zoom, content,
|
|
9
|
+
* active-page, and scroll changes.
|
|
10
|
+
*
|
|
11
|
+
* Returns the set of top-level column ids that are currently mounted.
|
|
12
|
+
*/
|
|
13
|
+
export function useColumnWindow({ shellRef, zoomRef, settleTimerRef, zoom, topLevel, activePageId, topLevelAncestorOf, columnWidth, isDragging, expandedPages, }) {
|
|
14
|
+
// Which top-level columns (parent + its children) are fully mounted. Seeded
|
|
15
|
+
// synchronously from the active page so the right columns are already real on
|
|
16
|
+
// first paint, before the effect below (which needs the shell's real DOM
|
|
17
|
+
// size) gets to run.
|
|
18
|
+
const [loadedColumns, setLoadedColumns] = useState(() => {
|
|
19
|
+
const ids = topLevel.map((page) => page.id);
|
|
20
|
+
const centerIndex = Math.max(0, ids.indexOf(topLevelAncestorOf(activePageId)));
|
|
21
|
+
return new Set(ids.slice(Math.max(0, centerIndex - 1), centerIndex + 2));
|
|
22
|
+
});
|
|
23
|
+
function recomputeLoadedWindow() {
|
|
24
|
+
const shell = shellRef.current;
|
|
25
|
+
// Mid-gesture, hold the window still: mounting/unmounting page columns
|
|
26
|
+
// while the user is actively zooming is itself a stutter source. The
|
|
27
|
+
// settle commit below recomputes with the final zoom.
|
|
28
|
+
if (!shell || settleTimerRef.current !== null)
|
|
29
|
+
return;
|
|
30
|
+
const visible = computeVisibleColumnIds(topLevel.map((page) => ({ id: page.id, width: columnWidth(page.id) })), shell.scrollLeft, shell.clientWidth, zoomRef.current);
|
|
31
|
+
visible.add(topLevelAncestorOf(activePageId));
|
|
32
|
+
setLoadedColumns((current) => {
|
|
33
|
+
// While a block drag is in flight the window only ever GROWS — a column
|
|
34
|
+
// is never unmounted. Native drag-and-drop tracks the exact DOM node
|
|
35
|
+
// under the cursor, so unmounting the drop target or the drag source
|
|
36
|
+
// mid-drag (the board auto-scrolls near its edges, which fires scroll →
|
|
37
|
+
// recompute) drops the whole gesture: no `drop` event, block never
|
|
38
|
+
// moves. Newly scrolled-in columns still mount so they can be dropped
|
|
39
|
+
// onto; the shrink back to the visible window happens once the drag ends.
|
|
40
|
+
const next = isDragging ? new Set([...current, ...visible]) : visible;
|
|
41
|
+
return sameIds(current, next) ? current : next;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
// Recomputes on mount, and whenever the board's content, zoom, or active
|
|
45
|
+
// page changes — the last one covers jumping straight to a column outside
|
|
46
|
+
// the current window (topbar dropdown, a link jump, Back), since that's
|
|
47
|
+
// a change scrolling alone wouldn't produce.
|
|
48
|
+
// isDragging is a dep so the window recomputes when a drag ends: the
|
|
49
|
+
// grow-only pass during the drag leaves extra columns mounted, and this
|
|
50
|
+
// prunes back to the visible window once the drag is over.
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
recomputeLoadedWindow();
|
|
53
|
+
}, [zoom, topLevel, activePageId, expandedPages, isDragging]);
|
|
54
|
+
// Scrolling also slides the window — rAF-throttled since native scroll
|
|
55
|
+
// events fire far more often than a render can usefully react to.
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
const shell = shellRef.current;
|
|
58
|
+
if (!shell)
|
|
59
|
+
return;
|
|
60
|
+
let rafId = null;
|
|
61
|
+
function handleScroll() {
|
|
62
|
+
if (rafId !== null)
|
|
63
|
+
return;
|
|
64
|
+
rafId = requestAnimationFrame(() => {
|
|
65
|
+
rafId = null;
|
|
66
|
+
recomputeLoadedWindow();
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
shell.addEventListener("scroll", handleScroll, { passive: true });
|
|
70
|
+
return () => {
|
|
71
|
+
shell.removeEventListener("scroll", handleScroll);
|
|
72
|
+
if (rafId !== null)
|
|
73
|
+
cancelAnimationFrame(rafId);
|
|
74
|
+
};
|
|
75
|
+
// isDragging so the rebound handler closes over the current drag state and
|
|
76
|
+
// its recompute takes the grow-only (never-unmount) path during a drag.
|
|
77
|
+
}, [zoom, topLevel, activePageId, expandedPages, isDragging]);
|
|
78
|
+
return { loadedColumns };
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=useColumnWindow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useColumnWindow.js","sourceRoot":"","sources":["../src/useColumnWindow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { CmsContent, CanvasPage } from "./types";
|
|
2
|
+
import type { TranslationStore } from "./translation";
|
|
3
|
+
import type { EditorSnapshot } from "./history/types";
|
|
4
|
+
export type { EditorSnapshot } from "./history/types";
|
|
5
|
+
export declare function useEditorHistory({ pages, translations, content, onPagesChange, onTranslationsChange, onContentChange, }: {
|
|
6
|
+
pages: CanvasPage[] | null;
|
|
7
|
+
translations: TranslationStore;
|
|
8
|
+
content: CmsContent | null;
|
|
9
|
+
onPagesChange: (pages: CanvasPage[]) => void;
|
|
10
|
+
onTranslationsChange: (translations: TranslationStore) => void;
|
|
11
|
+
onContentChange: (content: CmsContent) => void;
|
|
12
|
+
}): {
|
|
13
|
+
apply: (after: EditorSnapshot) => Promise<void>;
|
|
14
|
+
redo: () => void;
|
|
15
|
+
reset: () => void;
|
|
16
|
+
undo: () => void;
|
|
17
|
+
};
|
|
18
|
+
//# sourceMappingURL=useEditorHistory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEditorHistory.d.ts","sourceRoot":"","sources":["../src/useEditorHistory.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAStD,OAAO,KAAK,EAAE,cAAc,EAAkC,MAAM,iBAAiB,CAAC;AAEtF,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEtD,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,YAAY,EACZ,OAAO,EACP,aAAa,EACb,oBAAoB,EACpB,eAAe,GAChB,EAAE;IACD,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;IAC3B,YAAY,EAAE,gBAAgB,CAAC;IAC/B,OAAO,EAAE,UAAU,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAC7C,oBAAoB,EAAE,CAAC,YAAY,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC/D,eAAe,EAAE,CAAC,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;CAChD;mBAoDiB,cAAc;;;;EA+C/B"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
2
|
+
import { createUndoStack } from "@batterai/editor-state";
|
|
3
|
+
import { clone, createNoopCommandContext, errorMessage } from "./history/commands.js";
|
|
4
|
+
import { buildContentCommands, buildPageCommands, buildTranslationCommands, } from "./history/diff.js";
|
|
5
|
+
import { HISTORY_LIMIT } from "./history/types.js";
|
|
6
|
+
export function useEditorHistory({ pages, translations, content, onPagesChange, onTranslationsChange, onContentChange, }) {
|
|
7
|
+
const stateRef = useRef({ pages, translations, content });
|
|
8
|
+
const callbacksRef = useRef({
|
|
9
|
+
onPagesChange,
|
|
10
|
+
onTranslationsChange,
|
|
11
|
+
onContentChange,
|
|
12
|
+
});
|
|
13
|
+
const stackRef = useRef(createUndoStack(createNoopCommandContext(), {
|
|
14
|
+
maxDepth: HISTORY_LIMIT,
|
|
15
|
+
log: (message) => console.warn(message),
|
|
16
|
+
}));
|
|
17
|
+
callbacksRef.current = { onPagesChange, onTranslationsChange, onContentChange };
|
|
18
|
+
useEffect(() => {
|
|
19
|
+
stateRef.current = { pages, translations, content };
|
|
20
|
+
}, [pages, translations, content]);
|
|
21
|
+
const applyPages = useCallback((nextPages) => {
|
|
22
|
+
const pagesCopy = clone(nextPages);
|
|
23
|
+
stateRef.current = { ...stateRef.current, pages: pagesCopy };
|
|
24
|
+
callbacksRef.current.onPagesChange(clone(pagesCopy));
|
|
25
|
+
}, []);
|
|
26
|
+
const applyTranslations = useCallback((nextTranslations) => {
|
|
27
|
+
const translationsCopy = clone(nextTranslations);
|
|
28
|
+
stateRef.current = { ...stateRef.current, translations: translationsCopy };
|
|
29
|
+
callbacksRef.current.onTranslationsChange(clone(translationsCopy));
|
|
30
|
+
}, []);
|
|
31
|
+
const applyContent = useCallback((nextContent) => {
|
|
32
|
+
const contentCopy = clone(nextContent);
|
|
33
|
+
stateRef.current = { ...stateRef.current, content: contentCopy };
|
|
34
|
+
callbacksRef.current.onContentChange(clone(contentCopy));
|
|
35
|
+
}, []);
|
|
36
|
+
const depsRef = useRef({ stateRef, applyPages, applyTranslations, applyContent });
|
|
37
|
+
depsRef.current = { stateRef, applyPages, applyTranslations, applyContent };
|
|
38
|
+
const currentSnapshot = useCallback(() => {
|
|
39
|
+
const current = stateRef.current;
|
|
40
|
+
if (!current.pages || !current.content)
|
|
41
|
+
return null;
|
|
42
|
+
return clone({
|
|
43
|
+
pages: current.pages,
|
|
44
|
+
translations: current.translations,
|
|
45
|
+
content: current.content,
|
|
46
|
+
});
|
|
47
|
+
}, []);
|
|
48
|
+
const apply = useCallback(async (after) => {
|
|
49
|
+
const before = currentSnapshot();
|
|
50
|
+
if (!before)
|
|
51
|
+
return;
|
|
52
|
+
const afterCopy = clone(after);
|
|
53
|
+
const deps = depsRef.current;
|
|
54
|
+
const commands = [
|
|
55
|
+
...buildPageCommands(deps, before.pages, afterCopy.pages),
|
|
56
|
+
...buildTranslationCommands(deps, before.translations, afterCopy.translations),
|
|
57
|
+
...buildContentCommands(deps, before.content, afterCopy.content),
|
|
58
|
+
];
|
|
59
|
+
if (commands.length === 0)
|
|
60
|
+
return;
|
|
61
|
+
const firstCommand = commands[0];
|
|
62
|
+
const outcome = commands.length === 1 && firstCommand
|
|
63
|
+
? await stackRef.current.push(firstCommand)
|
|
64
|
+
: await stackRef.current.pushTransaction(commands);
|
|
65
|
+
if (outcome && !outcome.ok) {
|
|
66
|
+
console.warn(`editor history: ${outcome.error.kind}: ${errorMessage(outcome)}`);
|
|
67
|
+
}
|
|
68
|
+
}, [currentSnapshot]);
|
|
69
|
+
const reset = useCallback(() => {
|
|
70
|
+
stackRef.current = createUndoStack(createNoopCommandContext(), {
|
|
71
|
+
maxDepth: HISTORY_LIMIT,
|
|
72
|
+
log: (message) => console.warn(message),
|
|
73
|
+
});
|
|
74
|
+
}, []);
|
|
75
|
+
const undo = useCallback(() => {
|
|
76
|
+
void stackRef.current.undo().then((outcome) => {
|
|
77
|
+
if (outcome && !outcome.ok) {
|
|
78
|
+
console.warn(`editor history undo: ${outcome.error.kind}: ${errorMessage(outcome)}`);
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}, []);
|
|
82
|
+
const redo = useCallback(() => {
|
|
83
|
+
void stackRef.current.redo().then((outcome) => {
|
|
84
|
+
if (outcome && !outcome.ok) {
|
|
85
|
+
console.warn(`editor history redo: ${outcome.error.kind}: ${errorMessage(outcome)}`);
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
}, []);
|
|
89
|
+
return { apply, redo, reset, undo };
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=useEditorHistory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useEditorHistory.js","sourceRoot":"","sources":["../src/useEditorHistory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,OAAO,EAAE,KAAK,EAAE,wBAAwB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EACL,oBAAoB,EACpB,iBAAiB,EACjB,wBAAwB,GAEzB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAKhD,MAAM,UAAU,gBAAgB,CAAC,EAC/B,KAAK,EACL,YAAY,EACZ,OAAO,EACP,aAAa,EACb,oBAAoB,EACpB,eAAe,GAQhB;IACC,MAAM,QAAQ,GAAG,MAAM,CAAe,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;IACxE,MAAM,YAAY,GAAG,MAAM,CAAmB;QAC5C,aAAa;QACb,oBAAoB;QACpB,eAAe;KAChB,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,CACrB,eAAe,CAAC,wBAAwB,EAAE,EAAE;QAC1C,QAAQ,EAAE,aAAa;QACvB,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;KACxC,CAAC,CACH,CAAC;IAEF,YAAY,CAAC,OAAO,GAAG,EAAE,aAAa,EAAE,oBAAoB,EAAE,eAAe,EAAE,CAAC;IAEhF,SAAS,CAAC,GAAG,EAAE;QACb,QAAQ,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;IACtD,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnC,MAAM,UAAU,GAAG,WAAW,CAAC,CAAC,SAAuB,EAAE,EAAE;QACzD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC;QACnC,QAAQ,CAAC,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;QAC7D,YAAY,CAAC,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;IACvD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,iBAAiB,GAAG,WAAW,CAAC,CAAC,gBAAkC,EAAE,EAAE;QAC3E,MAAM,gBAAgB,GAAG,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACjD,QAAQ,CAAC,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,CAAC;QAC3E,YAAY,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;IACrE,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,WAAuB,EAAE,EAAE;QAC3D,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,CAAC;QACvC,QAAQ,CAAC,OAAO,GAAG,EAAE,GAAG,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;QACjE,YAAY,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAC3D,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,MAAM,CAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC,CAAC;IAC5F,OAAO,CAAC,OAAO,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,YAAY,EAAE,CAAC;IAE5E,MAAM,eAAe,GAAG,WAAW,CAAC,GAA0B,EAAE;QAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QACpD,OAAO,KAAK,CAAC;YACX,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,YAAY,EAAE,OAAO,CAAC,YAAY;YAClC,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,KAAK,GAAG,WAAW,CACvB,KAAK,EAAE,KAAqB,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,eAAe,EAAE,CAAC;QACjC,IAAI,CAAC,MAAM;YAAE,OAAO;QACpB,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;QAC7B,MAAM,QAAQ,GAAG;YACf,GAAG,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC;YACzD,GAAG,wBAAwB,CAAC,IAAI,EAAE,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC;YAC9E,GAAG,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC;SACjE,CAAC;QACF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAClC,MAAM,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACjC,MAAM,OAAO,GACX,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,YAAY;YACnC,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC;YAC3C,CAAC,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACvD,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,mBAAmB,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC,EACD,CAAC,eAAe,CAAC,CAClB,CAAC;IAEF,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,QAAQ,CAAC,OAAO,GAAG,eAAe,CAAC,wBAAwB,EAAE,EAAE;YAC7D,QAAQ,EAAE,aAAa;YACvB,GAAG,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;SACxC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,KAAK,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5C,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,EAAE;QAC5B,KAAK,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YAC5C,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC,wBAAwB,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvF,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACtC,CAAC"}
|