@bendyline/squisq-editor-react 1.3.0 → 1.5.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/dist/DocumentSettingsDialog.d.ts +26 -0
- package/dist/DocumentSettingsDialog.d.ts.map +1 -0
- package/dist/DocumentSettingsDialog.js +115 -0
- package/dist/DocumentSettingsDialog.js.map +1 -0
- package/dist/EditorContext.d.ts +248 -4
- package/dist/EditorContext.d.ts.map +1 -1
- package/dist/EditorContext.js +248 -10
- package/dist/EditorContext.js.map +1 -1
- package/dist/EditorShell.d.ts +184 -4
- package/dist/EditorShell.d.ts.map +1 -1
- package/dist/EditorShell.js +184 -12
- package/dist/EditorShell.js.map +1 -1
- package/dist/EmojiPicker.d.ts +50 -0
- package/dist/EmojiPicker.d.ts.map +1 -0
- package/dist/EmojiPicker.js +182 -0
- package/dist/EmojiPicker.js.map +1 -0
- package/dist/ImageEditor.d.ts +68 -0
- package/dist/ImageEditor.d.ts.map +1 -0
- package/dist/ImageEditor.js +166 -0
- package/dist/ImageEditor.js.map +1 -0
- package/dist/ImageNodeView.d.ts +13 -1
- package/dist/ImageNodeView.d.ts.map +1 -1
- package/dist/ImageNodeView.js +172 -19
- package/dist/ImageNodeView.js.map +1 -1
- package/dist/ImageViewer.d.ts +26 -0
- package/dist/ImageViewer.d.ts.map +1 -0
- package/dist/ImageViewer.js +119 -0
- package/dist/ImageViewer.js.map +1 -0
- package/dist/InlineIcon.d.ts +17 -0
- package/dist/InlineIcon.d.ts.map +1 -0
- package/dist/InlineIcon.js +72 -0
- package/dist/InlineIcon.js.map +1 -0
- package/dist/InlinePreviewGutter.d.ts +52 -0
- package/dist/InlinePreviewGutter.d.ts.map +1 -0
- package/dist/InlinePreviewGutter.js +397 -0
- package/dist/InlinePreviewGutter.js.map +1 -0
- package/dist/LinkDialog.d.ts +43 -0
- package/dist/LinkDialog.d.ts.map +1 -0
- package/dist/LinkDialog.js +102 -0
- package/dist/LinkDialog.js.map +1 -0
- package/dist/MediaBin.d.ts +12 -1
- package/dist/MediaBin.d.ts.map +1 -1
- package/dist/MediaBin.js +13 -3
- package/dist/MediaBin.js.map +1 -1
- package/dist/MentionExtension.js +10 -7
- package/dist/MentionExtension.js.map +1 -1
- package/dist/OutlinePanel.d.ts +17 -0
- package/dist/OutlinePanel.d.ts.map +1 -0
- package/dist/OutlinePanel.js +167 -0
- package/dist/OutlinePanel.js.map +1 -0
- package/dist/PlainHtmlPreview.d.ts +50 -0
- package/dist/PlainHtmlPreview.d.ts.map +1 -0
- package/dist/PlainHtmlPreview.js +155 -0
- package/dist/PlainHtmlPreview.js.map +1 -0
- package/dist/PreviewControls.d.ts +15 -1
- package/dist/PreviewControls.d.ts.map +1 -1
- package/dist/PreviewControls.js +75 -18
- package/dist/PreviewControls.js.map +1 -1
- package/dist/PreviewPanel.d.ts +11 -10
- package/dist/PreviewPanel.d.ts.map +1 -1
- package/dist/PreviewPanel.js +20 -17
- package/dist/PreviewPanel.js.map +1 -1
- package/dist/RawEditor.d.ts.map +1 -1
- package/dist/RawEditor.js +198 -4
- package/dist/RawEditor.js.map +1 -1
- package/dist/RecorderEntry.d.ts +24 -0
- package/dist/RecorderEntry.d.ts.map +1 -0
- package/dist/RecorderEntry.js +139 -0
- package/dist/RecorderEntry.js.map +1 -0
- package/dist/TemplateAnnotation.d.ts.map +1 -1
- package/dist/TemplateAnnotation.js +32 -6
- package/dist/TemplateAnnotation.js.map +1 -1
- package/dist/TemplatePicker.d.ts +53 -0
- package/dist/TemplatePicker.d.ts.map +1 -0
- package/dist/TemplatePicker.js +388 -0
- package/dist/TemplatePicker.js.map +1 -0
- package/dist/ThemeCustomizerPanel.d.ts +32 -0
- package/dist/ThemeCustomizerPanel.d.ts.map +1 -0
- package/dist/ThemeCustomizerPanel.js +256 -0
- package/dist/ThemeCustomizerPanel.js.map +1 -0
- package/dist/ThemePicker.d.ts +33 -0
- package/dist/ThemePicker.d.ts.map +1 -0
- package/dist/ThemePicker.js +148 -0
- package/dist/ThemePicker.js.map +1 -0
- package/dist/Toolbar.d.ts.map +1 -1
- package/dist/Toolbar.js +508 -33
- package/dist/Toolbar.js.map +1 -1
- package/dist/VersionHistoryPanel.d.ts +14 -0
- package/dist/VersionHistoryPanel.d.ts.map +1 -0
- package/dist/VersionHistoryPanel.js +147 -0
- package/dist/VersionHistoryPanel.js.map +1 -0
- package/dist/ViewMenuPanel.d.ts +13 -0
- package/dist/ViewMenuPanel.d.ts.map +1 -0
- package/dist/ViewMenuPanel.js +58 -0
- package/dist/ViewMenuPanel.js.map +1 -0
- package/dist/WysiwygEditor.d.ts.map +1 -1
- package/dist/WysiwygEditor.js +198 -9
- package/dist/WysiwygEditor.js.map +1 -1
- package/dist/__tests__/detectMarkdown.test.js +0 -14
- package/dist/__tests__/detectMarkdown.test.js.map +1 -1
- package/dist/__tests__/documentSettingsDialog.test.d.ts +2 -0
- package/dist/__tests__/documentSettingsDialog.test.d.ts.map +1 -0
- package/dist/__tests__/documentSettingsDialog.test.js +132 -0
- package/dist/__tests__/documentSettingsDialog.test.js.map +1 -0
- package/dist/__tests__/emojiPicker.test.d.ts +2 -0
- package/dist/__tests__/emojiPicker.test.d.ts.map +1 -0
- package/dist/__tests__/emojiPicker.test.js +111 -0
- package/dist/__tests__/emojiPicker.test.js.map +1 -0
- package/dist/__tests__/fileKind.test.js +13 -0
- package/dist/__tests__/fileKind.test.js.map +1 -1
- package/dist/__tests__/imageEditAffordance.test.d.ts +2 -0
- package/dist/__tests__/imageEditAffordance.test.d.ts.map +1 -0
- package/dist/__tests__/imageEditAffordance.test.js +188 -0
- package/dist/__tests__/imageEditAffordance.test.js.map +1 -0
- package/dist/__tests__/imageEditorShell.test.d.ts +2 -0
- package/dist/__tests__/imageEditorShell.test.d.ts.map +1 -0
- package/dist/__tests__/imageEditorShell.test.js +52 -0
- package/dist/__tests__/imageEditorShell.test.js.map +1 -0
- package/dist/__tests__/imageEditorState.test.d.ts +3 -0
- package/dist/__tests__/imageEditorState.test.d.ts.map +1 -0
- package/dist/__tests__/imageEditorState.test.js +148 -0
- package/dist/__tests__/imageEditorState.test.js.map +1 -0
- package/dist/__tests__/inlinePreviewGutter.test.d.ts +2 -0
- package/dist/__tests__/inlinePreviewGutter.test.d.ts.map +1 -0
- package/dist/__tests__/inlinePreviewGutter.test.js +51 -0
- package/dist/__tests__/inlinePreviewGutter.test.js.map +1 -0
- package/dist/__tests__/inlinePreviewGutterAllBlocks.test.d.ts +2 -0
- package/dist/__tests__/inlinePreviewGutterAllBlocks.test.d.ts.map +1 -0
- package/dist/__tests__/inlinePreviewGutterAllBlocks.test.js +63 -0
- package/dist/__tests__/inlinePreviewGutterAllBlocks.test.js.map +1 -0
- package/dist/__tests__/jsonEditor.test.d.ts +2 -0
- package/dist/__tests__/jsonEditor.test.d.ts.map +1 -0
- package/dist/__tests__/jsonEditor.test.js +134 -0
- package/dist/__tests__/jsonEditor.test.js.map +1 -0
- package/dist/__tests__/layersPanel.test.d.ts +2 -0
- package/dist/__tests__/layersPanel.test.d.ts.map +1 -0
- package/dist/__tests__/layersPanel.test.js +84 -0
- package/dist/__tests__/layersPanel.test.js.map +1 -0
- package/dist/__tests__/linkDialogDocPicker.test.d.ts +7 -0
- package/dist/__tests__/linkDialogDocPicker.test.d.ts.map +1 -0
- package/dist/__tests__/linkDialogDocPicker.test.js +75 -0
- package/dist/__tests__/linkDialogDocPicker.test.js.map +1 -0
- package/dist/__tests__/mediaAttachmentFlow.test.d.ts +2 -0
- package/dist/__tests__/mediaAttachmentFlow.test.d.ts.map +1 -0
- package/dist/__tests__/mediaAttachmentFlow.test.js +99 -0
- package/dist/__tests__/mediaAttachmentFlow.test.js.map +1 -0
- package/dist/__tests__/outlinePanel.test.d.ts +2 -0
- package/dist/__tests__/outlinePanel.test.d.ts.map +1 -0
- package/dist/__tests__/outlinePanel.test.js +68 -0
- package/dist/__tests__/outlinePanel.test.js.map +1 -0
- package/dist/__tests__/plainHtmlPreview.test.d.ts +2 -0
- package/dist/__tests__/plainHtmlPreview.test.d.ts.map +1 -0
- package/dist/__tests__/plainHtmlPreview.test.js +87 -0
- package/dist/__tests__/plainHtmlPreview.test.js.map +1 -0
- package/dist/__tests__/propertiesPanel.test.d.ts +2 -0
- package/dist/__tests__/propertiesPanel.test.d.ts.map +1 -0
- package/dist/__tests__/propertiesPanel.test.js +64 -0
- package/dist/__tests__/propertiesPanel.test.js.map +1 -0
- package/dist/__tests__/recorderFormats.test.d.ts +2 -0
- package/dist/__tests__/recorderFormats.test.d.ts.map +1 -0
- package/dist/__tests__/recorderFormats.test.js +121 -0
- package/dist/__tests__/recorderFormats.test.js.map +1 -0
- package/dist/__tests__/recorderTimingJson.test.d.ts +2 -0
- package/dist/__tests__/recorderTimingJson.test.d.ts.map +1 -0
- package/dist/__tests__/recorderTimingJson.test.js +37 -0
- package/dist/__tests__/recorderTimingJson.test.js.map +1 -0
- package/dist/__tests__/templateAnnotationRoundTrip.test.d.ts +2 -0
- package/dist/__tests__/templateAnnotationRoundTrip.test.d.ts.map +1 -0
- package/dist/__tests__/templateAnnotationRoundTrip.test.js +31 -0
- package/dist/__tests__/templateAnnotationRoundTrip.test.js.map +1 -0
- package/dist/__tests__/tiptapBridge.test.js +26 -0
- package/dist/__tests__/tiptapBridge.test.js.map +1 -1
- package/dist/__tests__/tiptapImageRoundTrip.test.d.ts +2 -0
- package/dist/__tests__/tiptapImageRoundTrip.test.d.ts.map +1 -0
- package/dist/__tests__/tiptapImageRoundTrip.test.js +68 -0
- package/dist/__tests__/tiptapImageRoundTrip.test.js.map +1 -0
- package/dist/__tests__/useImageEditor.test.d.ts +2 -0
- package/dist/__tests__/useImageEditor.test.d.ts.map +1 -0
- package/dist/__tests__/useImageEditor.test.js +131 -0
- package/dist/__tests__/useImageEditor.test.js.map +1 -0
- package/dist/__tests__/useMediaRecorder.test.d.ts +2 -0
- package/dist/__tests__/useMediaRecorder.test.d.ts.map +1 -0
- package/dist/__tests__/useMediaRecorder.test.js +153 -0
- package/dist/__tests__/useMediaRecorder.test.js.map +1 -0
- package/dist/__tests__/versionHistory.test.d.ts +2 -0
- package/dist/__tests__/versionHistory.test.d.ts.map +1 -0
- package/dist/__tests__/versionHistory.test.js +124 -0
- package/dist/__tests__/versionHistory.test.js.map +1 -0
- package/dist/blockSlice.d.ts +24 -0
- package/dist/blockSlice.d.ts.map +1 -0
- package/dist/blockSlice.js +63 -0
- package/dist/blockSlice.js.map +1 -0
- package/dist/buildPreviewDoc.d.ts.map +1 -1
- package/dist/buildPreviewDoc.js +52 -2
- package/dist/buildPreviewDoc.js.map +1 -1
- package/dist/emojiData.d.ts +81 -0
- package/dist/emojiData.d.ts.map +1 -0
- package/dist/emojiData.js +1283 -0
- package/dist/emojiData.js.map +1 -0
- package/dist/fileKind.d.ts +6 -2
- package/dist/fileKind.d.ts.map +1 -1
- package/dist/fileKind.js +25 -4
- package/dist/fileKind.js.map +1 -1
- package/dist/hooks/useFileDrop.d.ts.map +1 -1
- package/dist/hooks/useFileDrop.js +40 -4
- package/dist/hooks/useFileDrop.js.map +1 -1
- package/dist/imageEditor/CanvasSurface.d.ts +31 -0
- package/dist/imageEditor/CanvasSurface.d.ts.map +1 -0
- package/dist/imageEditor/CanvasSurface.js +264 -0
- package/dist/imageEditor/CanvasSurface.js.map +1 -0
- package/dist/imageEditor/ImageVersionHistoryDropdown.d.ts +39 -0
- package/dist/imageEditor/ImageVersionHistoryDropdown.d.ts.map +1 -0
- package/dist/imageEditor/ImageVersionHistoryDropdown.js +283 -0
- package/dist/imageEditor/ImageVersionHistoryDropdown.js.map +1 -0
- package/dist/imageEditor/LayersPanel.d.ts +14 -0
- package/dist/imageEditor/LayersPanel.d.ts.map +1 -0
- package/dist/imageEditor/LayersPanel.js +43 -0
- package/dist/imageEditor/LayersPanel.js.map +1 -0
- package/dist/imageEditor/PropertiesPanel.d.ts +14 -0
- package/dist/imageEditor/PropertiesPanel.d.ts.map +1 -0
- package/dist/imageEditor/PropertiesPanel.js +97 -0
- package/dist/imageEditor/PropertiesPanel.js.map +1 -0
- package/dist/imageEditor/Toolbar.d.ts +30 -0
- package/dist/imageEditor/Toolbar.d.ts.map +1 -0
- package/dist/imageEditor/Toolbar.js +108 -0
- package/dist/imageEditor/Toolbar.js.map +1 -0
- package/dist/imageEditor/icons.d.ts +24 -0
- package/dist/imageEditor/icons.d.ts.map +1 -0
- package/dist/imageEditor/icons.js +45 -0
- package/dist/imageEditor/icons.js.map +1 -0
- package/dist/imageEditor/layers/EditorImageLayer.d.ts +16 -0
- package/dist/imageEditor/layers/EditorImageLayer.d.ts.map +1 -0
- package/dist/imageEditor/layers/EditorImageLayer.js +37 -0
- package/dist/imageEditor/layers/EditorImageLayer.js.map +1 -0
- package/dist/imageEditor/layers/EditorShapeLayer.d.ts +15 -0
- package/dist/imageEditor/layers/EditorShapeLayer.d.ts.map +1 -0
- package/dist/imageEditor/layers/EditorShapeLayer.js +20 -0
- package/dist/imageEditor/layers/EditorShapeLayer.js.map +1 -0
- package/dist/imageEditor/layers/EditorTextLayer.d.ts +18 -0
- package/dist/imageEditor/layers/EditorTextLayer.d.ts.map +1 -0
- package/dist/imageEditor/layers/EditorTextLayer.js +13 -0
- package/dist/imageEditor/layers/EditorTextLayer.js.map +1 -0
- package/dist/imageEditor/layers/SelectionHandles.d.ts +17 -0
- package/dist/imageEditor/layers/SelectionHandles.d.ts.map +1 -0
- package/dist/imageEditor/layers/SelectionHandles.js +19 -0
- package/dist/imageEditor/layers/SelectionHandles.js.map +1 -0
- package/dist/imageEditor/state.d.ts +76 -0
- package/dist/imageEditor/state.d.ts.map +1 -0
- package/dist/imageEditor/state.js +87 -0
- package/dist/imageEditor/state.js.map +1 -0
- package/dist/imageEditor/useImageEditor.d.ts +53 -0
- package/dist/imageEditor/useImageEditor.d.ts.map +1 -0
- package/dist/imageEditor/useImageEditor.js +244 -0
- package/dist/imageEditor/useImageEditor.js.map +1 -0
- package/dist/imageEditor/useImageEditorTokens.d.ts +16 -0
- package/dist/imageEditor/useImageEditorTokens.d.ts.map +1 -0
- package/dist/imageEditor/useImageEditorTokens.js +45 -0
- package/dist/imageEditor/useImageEditorTokens.js.map +1 -0
- package/dist/index.d.ts +48 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -1
- package/dist/jsonEditor/EmbeddedRichTextField.d.ts +15 -0
- package/dist/jsonEditor/EmbeddedRichTextField.d.ts.map +1 -0
- package/dist/jsonEditor/EmbeddedRichTextField.js +74 -0
- package/dist/jsonEditor/EmbeddedRichTextField.js.map +1 -0
- package/dist/jsonEditor/JsonEditor.d.ts +36 -0
- package/dist/jsonEditor/JsonEditor.d.ts.map +1 -0
- package/dist/jsonEditor/JsonEditor.js +15 -0
- package/dist/jsonEditor/JsonEditor.js.map +1 -0
- package/dist/jsonEditor/JsonEditorContext.d.ts +28 -0
- package/dist/jsonEditor/JsonEditorContext.d.ts.map +1 -0
- package/dist/jsonEditor/JsonEditorContext.js +41 -0
- package/dist/jsonEditor/JsonEditorContext.js.map +1 -0
- package/dist/jsonEditor/RenderNode.d.ts +16 -0
- package/dist/jsonEditor/RenderNode.d.ts.map +1 -0
- package/dist/jsonEditor/RenderNode.js +32 -0
- package/dist/jsonEditor/RenderNode.js.map +1 -0
- package/dist/jsonEditor/editors.d.ts +36 -0
- package/dist/jsonEditor/editors.d.ts.map +1 -0
- package/dist/jsonEditor/editors.js +347 -0
- package/dist/jsonEditor/editors.js.map +1 -0
- package/dist/jsonEditor/index.d.ts +3 -0
- package/dist/jsonEditor/index.d.ts.map +1 -0
- package/dist/jsonEditor/index.js +2 -0
- package/dist/jsonEditor/index.js.map +1 -0
- package/dist/jsonEditor/useJsonEditorTokens.d.ts +13 -0
- package/dist/jsonEditor/useJsonEditorTokens.d.ts.map +1 -0
- package/dist/jsonEditor/useJsonEditorTokens.js +38 -0
- package/dist/jsonEditor/useJsonEditorTokens.js.map +1 -0
- package/dist/recorder/RecorderButton.d.ts +31 -0
- package/dist/recorder/RecorderButton.d.ts.map +1 -0
- package/dist/recorder/RecorderButton.js +24 -0
- package/dist/recorder/RecorderButton.js.map +1 -0
- package/dist/recorder/RecorderModal.d.ts +59 -0
- package/dist/recorder/RecorderModal.d.ts.map +1 -0
- package/dist/recorder/RecorderModal.js +333 -0
- package/dist/recorder/RecorderModal.js.map +1 -0
- package/dist/recorder/RecorderPanel.d.ts +25 -0
- package/dist/recorder/RecorderPanel.d.ts.map +1 -0
- package/dist/recorder/RecorderPanel.js +30 -0
- package/dist/recorder/RecorderPanel.js.map +1 -0
- package/dist/recorder/formats.d.ts +51 -0
- package/dist/recorder/formats.d.ts.map +1 -0
- package/dist/recorder/formats.js +144 -0
- package/dist/recorder/formats.js.map +1 -0
- package/dist/recorder/hooks/useMediaRecorder.d.ts +90 -0
- package/dist/recorder/hooks/useMediaRecorder.d.ts.map +1 -0
- package/dist/recorder/hooks/useMediaRecorder.js +277 -0
- package/dist/recorder/hooks/useMediaRecorder.js.map +1 -0
- package/dist/recorder/hooks/useStreamPreview.d.ts +22 -0
- package/dist/recorder/hooks/useStreamPreview.d.ts.map +1 -0
- package/dist/recorder/hooks/useStreamPreview.js +44 -0
- package/dist/recorder/hooks/useStreamPreview.js.map +1 -0
- package/dist/recorder/sources/cameraStream.d.ts +22 -0
- package/dist/recorder/sources/cameraStream.d.ts.map +1 -0
- package/dist/recorder/sources/cameraStream.js +24 -0
- package/dist/recorder/sources/cameraStream.js.map +1 -0
- package/dist/recorder/sources/micStream.d.ts +15 -0
- package/dist/recorder/sources/micStream.d.ts.map +1 -0
- package/dist/recorder/sources/micStream.js +24 -0
- package/dist/recorder/sources/micStream.js.map +1 -0
- package/dist/recorder/sources/screenStream.d.ts +53 -0
- package/dist/recorder/sources/screenStream.d.ts.map +1 -0
- package/dist/recorder/sources/screenStream.js +114 -0
- package/dist/recorder/sources/screenStream.js.map +1 -0
- package/dist/recorder/timingJson.d.ts +51 -0
- package/dist/recorder/timingJson.d.ts.map +1 -0
- package/dist/recorder/timingJson.js +42 -0
- package/dist/recorder/timingJson.js.map +1 -0
- package/dist/tiptap/TiptapAudio.d.ts +26 -0
- package/dist/tiptap/TiptapAudio.d.ts.map +1 -0
- package/dist/tiptap/TiptapAudio.js +58 -0
- package/dist/tiptap/TiptapAudio.js.map +1 -0
- package/dist/tiptap/TiptapVideo.d.ts +30 -0
- package/dist/tiptap/TiptapVideo.d.ts.map +1 -0
- package/dist/tiptap/TiptapVideo.js +66 -0
- package/dist/tiptap/TiptapVideo.js.map +1 -0
- package/dist/tiptap/useResolvedMediaSrc.d.ts +2 -0
- package/dist/tiptap/useResolvedMediaSrc.d.ts.map +1 -0
- package/dist/tiptap/useResolvedMediaSrc.js +42 -0
- package/dist/tiptap/useResolvedMediaSrc.js.map +1 -0
- package/dist/tiptapBridge.d.ts.map +1 -1
- package/dist/tiptapBridge.js +210 -16
- package/dist/tiptapBridge.js.map +1 -1
- package/dist/useHeadingLayout.d.ts +54 -0
- package/dist/useHeadingLayout.d.ts.map +1 -0
- package/dist/useHeadingLayout.js +260 -0
- package/dist/useHeadingLayout.js.map +1 -0
- package/dist/utils/collectInlineFontAwesomeCss.d.ts +21 -0
- package/dist/utils/collectInlineFontAwesomeCss.d.ts.map +1 -0
- package/dist/utils/collectInlineFontAwesomeCss.js +68 -0
- package/dist/utils/collectInlineFontAwesomeCss.js.map +1 -0
- package/dist/utils/dropUtils.d.ts +21 -2
- package/dist/utils/dropUtils.d.ts.map +1 -1
- package/dist/utils/dropUtils.js +43 -4
- package/dist/utils/dropUtils.js.map +1 -1
- package/dist/utils/normalizeMalformedAssetUrl.d.ts +15 -0
- package/dist/utils/normalizeMalformedAssetUrl.d.ts.map +1 -0
- package/dist/utils/normalizeMalformedAssetUrl.js +27 -0
- package/dist/utils/normalizeMalformedAssetUrl.js.map +1 -0
- package/package.json +8 -5
- package/src/DocumentSettingsDialog.tsx +266 -0
- package/src/EditorContext.tsx +534 -10
- package/src/EditorShell.tsx +691 -63
- package/src/EmojiPicker.tsx +332 -0
- package/src/ImageEditor.tsx +327 -0
- package/src/ImageNodeView.tsx +222 -21
- package/src/ImageViewer.tsx +221 -0
- package/src/InlineIcon.ts +84 -0
- package/src/InlinePreviewGutter.tsx +582 -0
- package/src/LinkDialog.tsx +276 -0
- package/src/MediaBin.tsx +22 -3
- package/src/MentionExtension.tsx +10 -7
- package/src/OutlinePanel.tsx +295 -0
- package/src/PlainHtmlPreview.tsx +211 -0
- package/src/PreviewControls.tsx +130 -24
- package/src/PreviewPanel.tsx +38 -21
- package/src/RawEditor.tsx +215 -4
- package/src/RecorderEntry.tsx +164 -0
- package/src/TemplateAnnotation.ts +32 -6
- package/src/TemplatePicker.tsx +818 -0
- package/src/ThemeCustomizerPanel.tsx +595 -0
- package/src/ThemePicker.tsx +319 -0
- package/src/Toolbar.tsx +708 -111
- package/src/VersionHistoryPanel.tsx +329 -0
- package/src/ViewMenuPanel.tsx +188 -0
- package/src/WysiwygEditor.tsx +229 -9
- package/src/__tests__/detectMarkdown.test.ts +0 -15
- package/src/__tests__/documentSettingsDialog.test.tsx +147 -0
- package/src/__tests__/emojiPicker.test.tsx +133 -0
- package/src/__tests__/fileKind.test.ts +16 -0
- package/src/__tests__/imageEditAffordance.test.tsx +268 -0
- package/src/__tests__/imageEditorShell.test.tsx +57 -0
- package/src/__tests__/imageEditorState.test.ts +171 -0
- package/src/__tests__/inlinePreviewGutter.test.tsx +62 -0
- package/src/__tests__/inlinePreviewGutterAllBlocks.test.tsx +103 -0
- package/src/__tests__/jsonEditor.test.tsx +168 -0
- package/src/__tests__/layersPanel.test.tsx +97 -0
- package/src/__tests__/linkDialogDocPicker.test.tsx +137 -0
- package/src/__tests__/mediaAttachmentFlow.test.ts +110 -0
- package/src/__tests__/outlinePanel.test.tsx +79 -0
- package/src/__tests__/plainHtmlPreview.test.tsx +107 -0
- package/src/__tests__/propertiesPanel.test.tsx +69 -0
- package/src/__tests__/recorderFormats.test.ts +146 -0
- package/src/__tests__/recorderTimingJson.test.ts +41 -0
- package/src/__tests__/templateAnnotationRoundTrip.test.ts +34 -0
- package/src/__tests__/tiptapBridge.test.ts +29 -0
- package/src/__tests__/tiptapImageRoundTrip.test.ts +73 -0
- package/src/__tests__/useImageEditor.test.tsx +159 -0
- package/src/__tests__/useMediaRecorder.test.ts +186 -0
- package/src/__tests__/versionHistory.test.tsx +197 -0
- package/src/blockSlice.ts +75 -0
- package/src/buildPreviewDoc.ts +61 -6
- package/src/emojiData.ts +1337 -0
- package/src/fileKind.ts +30 -6
- package/src/hooks/useFileDrop.ts +40 -4
- package/src/imageEditor/CanvasSurface.tsx +402 -0
- package/src/imageEditor/ImageVersionHistoryDropdown.tsx +396 -0
- package/src/imageEditor/LayersPanel.tsx +143 -0
- package/src/imageEditor/PropertiesPanel.tsx +428 -0
- package/src/imageEditor/Toolbar.tsx +242 -0
- package/src/imageEditor/icons.tsx +144 -0
- package/src/imageEditor/image-editor.css +450 -0
- package/src/imageEditor/layers/EditorImageLayer.tsx +45 -0
- package/src/imageEditor/layers/EditorShapeLayer.tsx +62 -0
- package/src/imageEditor/layers/EditorTextLayer.tsx +45 -0
- package/src/imageEditor/layers/SelectionHandles.tsx +86 -0
- package/src/imageEditor/state.ts +153 -0
- package/src/imageEditor/useImageEditor.ts +328 -0
- package/src/imageEditor/useImageEditorTokens.ts +70 -0
- package/src/index.ts +82 -0
- package/src/jsonEditor/EmbeddedRichTextField.tsx +81 -0
- package/src/jsonEditor/JsonEditor.tsx +81 -0
- package/src/jsonEditor/JsonEditorContext.tsx +75 -0
- package/src/jsonEditor/RenderNode.tsx +66 -0
- package/src/jsonEditor/editors.tsx +678 -0
- package/src/jsonEditor/index.ts +2 -0
- package/src/jsonEditor/json-editor.css +463 -0
- package/src/jsonEditor/useJsonEditorTokens.ts +63 -0
- package/src/recorder/RecorderButton.tsx +72 -0
- package/src/recorder/RecorderModal.tsx +596 -0
- package/src/recorder/RecorderPanel.tsx +93 -0
- package/src/recorder/formats.ts +159 -0
- package/src/recorder/hooks/useMediaRecorder.ts +378 -0
- package/src/recorder/hooks/useStreamPreview.ts +47 -0
- package/src/recorder/sources/cameraStream.ts +32 -0
- package/src/recorder/sources/micStream.ts +25 -0
- package/src/recorder/sources/screenStream.ts +162 -0
- package/src/recorder/timingJson.ts +66 -0
- package/src/styles/editor.css +2490 -51
- package/src/styles/image-edit-affordance.css +201 -0
- package/src/styles/index.css +10 -0
- package/src/tiptap/TiptapAudio.tsx +86 -0
- package/src/tiptap/TiptapVideo.tsx +119 -0
- package/src/tiptap/useResolvedMediaSrc.ts +47 -0
- package/src/tiptapBridge.ts +227 -22
- package/src/useHeadingLayout.ts +294 -0
- package/src/utils/collectInlineFontAwesomeCss.ts +69 -0
- package/src/utils/dropUtils.ts +54 -6
- package/src/utils/normalizeMalformedAssetUrl.ts +22 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* Toolbar — tool selector, layer-creation buttons, file-bin uploader,
|
|
4
|
+
* and a Save/Export button. Versioning controls live in
|
|
5
|
+
* `<ImageEditor>` so the toolbar stays purely about authoring tools.
|
|
6
|
+
*/
|
|
7
|
+
import { useRef, useState, useEffect } from 'react';
|
|
8
|
+
import { CropIcon, CursorIcon, PlusIcon, ShapeIcon, TextIcon } from './icons.js';
|
|
9
|
+
const TOOLS = [
|
|
10
|
+
{ id: 'select', icon: _jsx(CursorIcon, {}), title: 'Select / move (V)' },
|
|
11
|
+
{ id: 'text', icon: _jsx(TextIcon, {}), title: 'Add text (T)' },
|
|
12
|
+
{ id: 'shape', icon: _jsx(ShapeIcon, {}), title: 'Add shape (S)' },
|
|
13
|
+
{ id: 'crop', icon: _jsx(CropIcon, {}), title: 'Crop (C)' },
|
|
14
|
+
];
|
|
15
|
+
export function Toolbar({ doc, tool, dispatch, uploadAsset, onExport, onSave, saveLabel = 'Save', saveTitle = 'Save state.json', extraTools, }) {
|
|
16
|
+
const fileInputRef = useRef(null);
|
|
17
|
+
const onFilePicked = async (file) => {
|
|
18
|
+
try {
|
|
19
|
+
const path = await uploadAsset(file, file.name);
|
|
20
|
+
// Place the imported image centered at its native size up to canvas.
|
|
21
|
+
const dims = await probeDims(file);
|
|
22
|
+
const w = Math.min(dims.width, doc.canvas.width);
|
|
23
|
+
const h = Math.min(dims.height, doc.canvas.height);
|
|
24
|
+
dispatch({
|
|
25
|
+
type: 'add-layer',
|
|
26
|
+
layer: {
|
|
27
|
+
type: 'image',
|
|
28
|
+
name: file.name,
|
|
29
|
+
position: {
|
|
30
|
+
x: Math.round((doc.canvas.width - w) / 2),
|
|
31
|
+
y: Math.round((doc.canvas.height - h) / 2),
|
|
32
|
+
width: w,
|
|
33
|
+
height: h,
|
|
34
|
+
},
|
|
35
|
+
content: { src: path, alt: file.name, fit: 'fill' },
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
console.warn('[squisq-editor] image upload failed:', err instanceof Error ? err.message : err);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
return (_jsxs("div", { className: "squisq-image-editor-toolbar", "data-testid": "image-editor-toolbar", children: [_jsx("div", { className: "squisq-image-editor-tool-group", role: "radiogroup", "aria-label": "Tools", children: TOOLS.map((t) => (_jsx("button", { type: "button", role: "radio", "aria-checked": tool === t.id, className: ['squisq-image-editor-tool-button', tool === t.id ? 'is-active' : '']
|
|
44
|
+
.filter(Boolean)
|
|
45
|
+
.join(' '), onClick: () => dispatch({ type: 'set-tool', tool: t.id }), title: t.title, "aria-label": t.title, children: t.icon }, t.id))) }), _jsxs("div", { className: "squisq-image-editor-tool-group", children: [_jsxs("button", { type: "button", className: "squisq-image-editor-tool-button squisq-image-editor-tool-button--with-label", onClick: () => fileInputRef.current?.click(), title: "Import image as new layer", "aria-label": "Import image as new layer", children: [_jsx(PlusIcon, {}), _jsx("span", { children: "Image" })] }), _jsx("input", { ref: fileInputRef, type: "file", accept: "image/*", hidden: true, onChange: (e) => {
|
|
46
|
+
const file = e.target.files?.[0];
|
|
47
|
+
if (file)
|
|
48
|
+
void onFilePicked(file);
|
|
49
|
+
e.target.value = '';
|
|
50
|
+
} })] }), _jsxs("div", { className: "squisq-image-editor-tool-group squisq-image-editor-tool-group--right", children: [extraTools, onSave && (_jsx("button", { type: "button", className: "squisq-image-editor-tool-button", onClick: onSave, title: saveTitle, children: saveLabel })), _jsx(ExportDropdown, { onExport: onExport })] })] }));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Single export dropdown listing all output formats. Replaces the
|
|
54
|
+
* earlier split "Export PNG / Other format…" pair so the toolbar reads
|
|
55
|
+
* as one Export control with a stable label and consistent sizing.
|
|
56
|
+
*/
|
|
57
|
+
function ExportDropdown({ onExport }) {
|
|
58
|
+
const [open, setOpen] = useState(false);
|
|
59
|
+
const wrapRef = useRef(null);
|
|
60
|
+
const triggerRef = useRef(null);
|
|
61
|
+
useEffect(() => {
|
|
62
|
+
if (!open)
|
|
63
|
+
return;
|
|
64
|
+
function onDocClick(e) {
|
|
65
|
+
const t = e.target;
|
|
66
|
+
if (!t)
|
|
67
|
+
return;
|
|
68
|
+
if (wrapRef.current?.contains(t))
|
|
69
|
+
return;
|
|
70
|
+
setOpen(false);
|
|
71
|
+
}
|
|
72
|
+
function onKey(e) {
|
|
73
|
+
if (e.key === 'Escape')
|
|
74
|
+
setOpen(false);
|
|
75
|
+
}
|
|
76
|
+
document.addEventListener('mousedown', onDocClick);
|
|
77
|
+
document.addEventListener('keydown', onKey);
|
|
78
|
+
return () => {
|
|
79
|
+
document.removeEventListener('mousedown', onDocClick);
|
|
80
|
+
document.removeEventListener('keydown', onKey);
|
|
81
|
+
};
|
|
82
|
+
}, [open]);
|
|
83
|
+
const pick = (f) => {
|
|
84
|
+
setOpen(false);
|
|
85
|
+
onExport(f);
|
|
86
|
+
};
|
|
87
|
+
return (_jsxs("span", { ref: wrapRef, className: "squisq-image-editor-version-dropdown", children: [_jsxs("button", { ref: triggerRef, type: "button", className: "squisq-image-editor-tool-button squisq-image-editor-tool-button--with-label", onClick: () => setOpen((o) => !o), "aria-haspopup": "menu", "aria-expanded": open, title: "Export image", children: [_jsx("span", { children: "Export" }), _jsx("span", { "aria-hidden": "true", style: { fontSize: '0.8em' }, children: "\u25BE" })] }), open && (_jsx("div", { className: "squisq-image-editor-version-popover", role: "menu", style: { minWidth: 160 }, children: _jsx("ul", { className: "squisq-image-editor-version-popover__list", style: { maxHeight: 'none' }, children: [
|
|
88
|
+
{ f: 'png', label: 'PNG' },
|
|
89
|
+
{ f: 'jpeg', label: 'JPEG' },
|
|
90
|
+
{ f: 'webp', label: 'WebP' },
|
|
91
|
+
].map(({ f, label }) => (_jsx("li", { className: "squisq-image-editor-version-popover__row", children: _jsxs("button", { type: "button", role: "menuitem", className: "squisq-image-editor-tool-button squisq-image-editor-tool-button--menu", onClick: () => pick(f), children: ["Export as ", label] }) }, f))) }) }))] }));
|
|
92
|
+
}
|
|
93
|
+
function probeDims(file) {
|
|
94
|
+
return new Promise((resolve) => {
|
|
95
|
+
const url = URL.createObjectURL(file);
|
|
96
|
+
const img = new Image();
|
|
97
|
+
img.onload = () => {
|
|
98
|
+
URL.revokeObjectURL(url);
|
|
99
|
+
resolve({ width: img.naturalWidth, height: img.naturalHeight });
|
|
100
|
+
};
|
|
101
|
+
img.onerror = () => {
|
|
102
|
+
URL.revokeObjectURL(url);
|
|
103
|
+
resolve({ width: 200, height: 200 });
|
|
104
|
+
};
|
|
105
|
+
img.src = url;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=Toolbar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toolbar.js","sourceRoot":"","sources":["../../src/imageEditor/Toolbar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Inline SVG line icons for the image editor chrome. Stroke-based,
|
|
3
|
+
* `currentColor`-driven so they pick up `--squisq-image-editor-text` etc.
|
|
4
|
+
* automatically. Sized via `font-size`/`em` so they scale with their
|
|
5
|
+
* button label. Kept inline (no sprite, no font) so the package has zero
|
|
6
|
+
* extra runtime cost and tree-shakes per-icon.
|
|
7
|
+
*/
|
|
8
|
+
import type { SVGProps } from 'react';
|
|
9
|
+
type IconProps = Omit<SVGProps<SVGSVGElement>, 'children'>;
|
|
10
|
+
export declare function EyeIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
11
|
+
export declare function EyeOffIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export declare function LockIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
13
|
+
export declare function UnlockIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export declare function ChevronUpIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
15
|
+
export declare function ChevronDownIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export declare function CloseIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export declare function CursorIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export declare function TextIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
19
|
+
export declare function ShapeIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
20
|
+
export declare function CropIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export declare function PlusIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
22
|
+
export declare function NoneIcon(props: IconProps): import("react/jsx-runtime").JSX.Element;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=icons.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.d.ts","sourceRoot":"","sources":["../../src/imageEditor/icons.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtC,KAAK,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,UAAU,CAAC,CAAC;AAsB3D,wBAAgB,OAAO,CAAC,KAAK,EAAE,SAAS,2CAOvC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,2CAS1C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,2CAOxC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,2CAO1C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,2CAM7C;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,2CAM/C;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,2CAMzC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,2CAM1C;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,2CAMxC;AAED,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,2CAMzC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,2CAOxC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,2CAMxC;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,2CAQxC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
function Svg({ children, ...rest }) {
|
|
3
|
+
return (_jsx("svg", { width: "1em", height: "1em", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: 1.75, strokeLinecap: "round", strokeLinejoin: "round", "aria-hidden": "true", focusable: "false", ...rest, children: children }));
|
|
4
|
+
}
|
|
5
|
+
export function EyeIcon(props) {
|
|
6
|
+
return (_jsxs(Svg, { ...props, children: [_jsx("path", { d: "M2.5 12s3.5-6.5 9.5-6.5S21.5 12 21.5 12s-3.5 6.5-9.5 6.5S2.5 12 2.5 12Z" }), _jsx("circle", { cx: "12", cy: "12", r: "2.75" })] }));
|
|
7
|
+
}
|
|
8
|
+
export function EyeOffIcon(props) {
|
|
9
|
+
return (_jsxs(Svg, { ...props, children: [_jsx("path", { d: "M3.5 3.5l17 17" }), _jsx("path", { d: "M9.5 5.7A10.6 10.6 0 0 1 12 5.5c6 0 9.5 6.5 9.5 6.5a17 17 0 0 1-3.2 4" }), _jsx("path", { d: "M6.2 7.6A17 17 0 0 0 2.5 12s3.5 6.5 9.5 6.5a10.6 10.6 0 0 0 4.3-.9" }), _jsx("path", { d: "M9.9 9.9a3 3 0 0 0 4.2 4.2" })] }));
|
|
10
|
+
}
|
|
11
|
+
export function LockIcon(props) {
|
|
12
|
+
return (_jsxs(Svg, { ...props, children: [_jsx("rect", { x: "5", y: "11", width: "14", height: "9", rx: "1.5" }), _jsx("path", { d: "M8 11V8a4 4 0 0 1 8 0v3" })] }));
|
|
13
|
+
}
|
|
14
|
+
export function UnlockIcon(props) {
|
|
15
|
+
return (_jsxs(Svg, { ...props, children: [_jsx("rect", { x: "5", y: "11", width: "14", height: "9", rx: "1.5" }), _jsx("path", { d: "M8 11V8a4 4 0 0 1 7.6-1.7" })] }));
|
|
16
|
+
}
|
|
17
|
+
export function ChevronUpIcon(props) {
|
|
18
|
+
return (_jsx(Svg, { ...props, children: _jsx("path", { d: "M6 14l6-6 6 6" }) }));
|
|
19
|
+
}
|
|
20
|
+
export function ChevronDownIcon(props) {
|
|
21
|
+
return (_jsx(Svg, { ...props, children: _jsx("path", { d: "M6 10l6 6 6-6" }) }));
|
|
22
|
+
}
|
|
23
|
+
export function CloseIcon(props) {
|
|
24
|
+
return (_jsx(Svg, { ...props, children: _jsx("path", { d: "M6 6l12 12M18 6L6 18" }) }));
|
|
25
|
+
}
|
|
26
|
+
export function CursorIcon(props) {
|
|
27
|
+
return (_jsx(Svg, { ...props, children: _jsx("path", { d: "M5 4l6.5 14.5 2.2-6 6-2.2L5 4Z" }) }));
|
|
28
|
+
}
|
|
29
|
+
export function TextIcon(props) {
|
|
30
|
+
return (_jsx(Svg, { ...props, children: _jsx("path", { d: "M5 6h14M12 6v13M9 19h6" }) }));
|
|
31
|
+
}
|
|
32
|
+
export function ShapeIcon(props) {
|
|
33
|
+
return (_jsx(Svg, { ...props, children: _jsx("rect", { x: "4", y: "4", width: "16", height: "16", rx: "2" }) }));
|
|
34
|
+
}
|
|
35
|
+
export function CropIcon(props) {
|
|
36
|
+
return (_jsxs(Svg, { ...props, children: [_jsx("path", { d: "M7 2v15a1 1 0 0 0 1 1h15" }), _jsx("path", { d: "M2 7h15a1 1 0 0 1 1 1v15" })] }));
|
|
37
|
+
}
|
|
38
|
+
export function PlusIcon(props) {
|
|
39
|
+
return (_jsx(Svg, { ...props, children: _jsx("path", { d: "M12 5v14M5 12h14" }) }));
|
|
40
|
+
}
|
|
41
|
+
export function NoneIcon(props) {
|
|
42
|
+
// Used for "no fill / transparent" affordance.
|
|
43
|
+
return (_jsxs(Svg, { ...props, children: [_jsx("circle", { cx: "12", cy: "12", r: "8" }), _jsx("path", { d: "M6.3 6.3l11.4 11.4" })] }));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=icons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/imageEditor/icons.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG renderer for an `ImageEditLayer` of kind `image` inside the editor.
|
|
3
|
+
* Resolves the asset path to a blob URL via the host-supplied
|
|
4
|
+
* `resolveAssetUrl` (typically backed by the sidecar container).
|
|
5
|
+
*/
|
|
6
|
+
import type { ImageEditCanvas, ImageEditLayer } from '@bendyline/squisq/schemas';
|
|
7
|
+
interface Props {
|
|
8
|
+
layer: ImageEditLayer & {
|
|
9
|
+
type: 'image';
|
|
10
|
+
};
|
|
11
|
+
canvas: ImageEditCanvas;
|
|
12
|
+
resolveAssetUrl: (path: string) => Promise<string>;
|
|
13
|
+
}
|
|
14
|
+
export declare function EditorImageLayer({ layer, canvas, resolveAssetUrl }: Props): import("react/jsx-runtime").JSX.Element | null;
|
|
15
|
+
export {};
|
|
16
|
+
//# sourceMappingURL=EditorImageLayer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditorImageLayer.d.ts","sourceRoot":"","sources":["../../../src/imageEditor/layers/EditorImageLayer.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEjF,UAAU,KAAK;IACb,KAAK,EAAE,cAAc,GAAG;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1C,MAAM,EAAE,eAAe,CAAC;IACxB,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACpD;AAED,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,KAAK,kDA6BzE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* SVG renderer for an `ImageEditLayer` of kind `image` inside the editor.
|
|
4
|
+
* Resolves the asset path to a blob URL via the host-supplied
|
|
5
|
+
* `resolveAssetUrl` (typically backed by the sidecar container).
|
|
6
|
+
*/
|
|
7
|
+
import { useEffect, useState } from 'react';
|
|
8
|
+
export function EditorImageLayer({ layer, canvas, resolveAssetUrl }) {
|
|
9
|
+
const [href, setHref] = useState(null);
|
|
10
|
+
const src = layer.content.src;
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
let cancelled = false;
|
|
13
|
+
resolveAssetUrl(src)
|
|
14
|
+
.then((url) => {
|
|
15
|
+
if (!cancelled)
|
|
16
|
+
setHref(url);
|
|
17
|
+
})
|
|
18
|
+
.catch(() => {
|
|
19
|
+
if (!cancelled)
|
|
20
|
+
setHref(null);
|
|
21
|
+
});
|
|
22
|
+
return () => {
|
|
23
|
+
cancelled = true;
|
|
24
|
+
};
|
|
25
|
+
}, [src, resolveAssetUrl]);
|
|
26
|
+
if (!href)
|
|
27
|
+
return null;
|
|
28
|
+
const p = layer.position;
|
|
29
|
+
const x = typeof p.x === 'number' ? p.x : 0;
|
|
30
|
+
const y = typeof p.y === 'number' ? p.y : 0;
|
|
31
|
+
const width = typeof p.width === 'number' ? p.width : canvas.width;
|
|
32
|
+
const height = typeof p.height === 'number' ? p.height : canvas.height;
|
|
33
|
+
const fit = layer.content.fit ?? 'fill';
|
|
34
|
+
const par = fit === 'cover' ? 'xMidYMid slice' : fit === 'contain' ? 'xMidYMid meet' : 'none';
|
|
35
|
+
return _jsx("image", { href: href, x: x, y: y, width: width, height: height, preserveAspectRatio: par });
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=EditorImageLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditorImageLayer.js","sourceRoot":"","sources":["../../../src/imageEditor/layers/EditorImageLayer.tsx"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAS5C,MAAM,UAAU,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,eAAe,EAAS;IACxE,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACtD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;IAE9B,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,KAAK,CAAC;QACtB,eAAe,CAAC,GAAG,CAAC;aACjB,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE;YACZ,IAAI,CAAC,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC;aACD,KAAK,CAAC,GAAG,EAAE;YACV,IAAI,CAAC,SAAS;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QACL,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,IAAI,CAAC;QACnB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;IAE3B,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;IACzB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;IACnE,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;IACvE,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC;IACxC,MAAM,GAAG,GAAG,GAAG,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC;IAE9F,OAAO,gBAAO,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,GAAG,GAAI,CAAC;AACnG,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG renderer for an `ImageEditLayer` of kind `shape` inside the editor.
|
|
3
|
+
* Mirrors `react/src/layers/ShapeLayer.tsx` minus the animation/anchor
|
|
4
|
+
* logic since the editor authors layers with numeric, top-left positions.
|
|
5
|
+
*/
|
|
6
|
+
import type { ImageEditCanvas, ImageEditLayer } from '@bendyline/squisq/schemas';
|
|
7
|
+
interface Props {
|
|
8
|
+
layer: ImageEditLayer & {
|
|
9
|
+
type: 'shape';
|
|
10
|
+
};
|
|
11
|
+
canvas: ImageEditCanvas;
|
|
12
|
+
}
|
|
13
|
+
export declare function EditorShapeLayer({ layer, canvas: _canvas }: Props): import("react/jsx-runtime").JSX.Element;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=EditorShapeLayer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditorShapeLayer.d.ts","sourceRoot":"","sources":["../../../src/imageEditor/layers/EditorShapeLayer.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEjF,UAAU,KAAK;IACb,KAAK,EAAE,cAAc,GAAG;QAAE,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1C,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,2CAgDjE"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
export function EditorShapeLayer({ layer, canvas: _canvas }) {
|
|
3
|
+
const p = layer.position;
|
|
4
|
+
const x = typeof p.x === 'number' ? p.x : 0;
|
|
5
|
+
const y = typeof p.y === 'number' ? p.y : 0;
|
|
6
|
+
const width = typeof p.width === 'number' ? p.width : 100;
|
|
7
|
+
const height = typeof p.height === 'number' ? p.height : 100;
|
|
8
|
+
const c = layer.content;
|
|
9
|
+
const fill = c.fill ?? 'none';
|
|
10
|
+
const stroke = c.stroke;
|
|
11
|
+
const strokeWidth = c.strokeWidth;
|
|
12
|
+
if (c.shape === 'rect') {
|
|
13
|
+
return (_jsx("rect", { x: x, y: y, width: width, height: height, rx: c.borderRadius, ry: c.borderRadius, fill: fill, stroke: stroke, strokeWidth: strokeWidth }));
|
|
14
|
+
}
|
|
15
|
+
if (c.shape === 'circle') {
|
|
16
|
+
return (_jsx("circle", { cx: x + width / 2, cy: y + height / 2, r: Math.min(width, height) / 2, fill: fill, stroke: stroke, strokeWidth: strokeWidth }));
|
|
17
|
+
}
|
|
18
|
+
return (_jsx("line", { x1: x, y1: y, x2: x + width, y2: y + height, stroke: stroke ?? '#000', strokeWidth: strokeWidth ?? 1 }));
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=EditorShapeLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditorShapeLayer.js","sourceRoot":"","sources":["../../../src/imageEditor/layers/EditorShapeLayer.tsx"],"names":[],"mappings":";AAaA,MAAM,UAAU,gBAAgB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAS;IAChE,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;IACzB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC;IAC7D,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC;IACxB,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,MAAM,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACxB,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC;IAElC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QACvB,OAAO,CACL,eACE,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,EACJ,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,CAAC,CAAC,YAAY,EAClB,EAAE,EAAE,CAAC,CAAC,YAAY,EAClB,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,GACxB,CACH,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACzB,OAAO,CACL,iBACE,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,EACjB,EAAE,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC,EAClB,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,EAC9B,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,WAAW,GACxB,CACH,CAAC;IACJ,CAAC;IACD,OAAO,CACL,eACE,EAAE,EAAE,CAAC,EACL,EAAE,EAAE,CAAC,EACL,EAAE,EAAE,CAAC,GAAG,KAAK,EACb,EAAE,EAAE,CAAC,GAAG,MAAM,EACd,MAAM,EAAE,MAAM,IAAI,MAAM,EACxB,WAAW,EAAE,WAAW,IAAI,CAAC,GAC7B,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SVG renderer for an `ImageEditLayer` of kind `text` inside the editor.
|
|
3
|
+
*
|
|
4
|
+
* Multi-line text is laid out as a `<text>` element with one `<tspan>`
|
|
5
|
+
* per line. The first line sits at `y + fontSize` so the visible top
|
|
6
|
+
* of the glyph block aligns with the layer's `y` coordinate (matches
|
|
7
|
+
* what users expect from a top-anchored bounding box).
|
|
8
|
+
*/
|
|
9
|
+
import type { ImageEditCanvas, ImageEditLayer } from '@bendyline/squisq/schemas';
|
|
10
|
+
interface Props {
|
|
11
|
+
layer: ImageEditLayer & {
|
|
12
|
+
type: 'text';
|
|
13
|
+
};
|
|
14
|
+
canvas: ImageEditCanvas;
|
|
15
|
+
}
|
|
16
|
+
export declare function EditorTextLayer({ layer, canvas: _canvas }: Props): import("react/jsx-runtime").JSX.Element;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=EditorTextLayer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditorTextLayer.d.ts","sourceRoot":"","sources":["../../../src/imageEditor/layers/EditorTextLayer.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEjF,UAAU,KAAK;IACb,KAAK,EAAE,cAAc,GAAG;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,wBAAgB,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,2CA4BhE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
export function EditorTextLayer({ layer, canvas: _canvas }) {
|
|
3
|
+
const p = layer.position;
|
|
4
|
+
const x = typeof p.x === 'number' ? p.x : 0;
|
|
5
|
+
const y = typeof p.y === 'number' ? p.y : 0;
|
|
6
|
+
const { text, style } = layer.content;
|
|
7
|
+
const lineHeight = style.lineHeight ?? 1.4;
|
|
8
|
+
const lineHeightPx = style.fontSize * lineHeight;
|
|
9
|
+
const lines = (text ?? '').split('\n');
|
|
10
|
+
const textAnchor = style.textAlign === 'center' ? 'middle' : style.textAlign === 'right' ? 'end' : 'start';
|
|
11
|
+
return (_jsx("text", { x: x, y: y + style.fontSize, fontFamily: style.fontFamily ?? 'sans-serif', fontSize: style.fontSize, fontWeight: style.fontWeight ?? 'normal', fill: style.color, textAnchor: textAnchor, children: lines.map((line, i) => (_jsx("tspan", { x: x, dy: i === 0 ? 0 : lineHeightPx, children: line || '\u00A0' }, i))) }));
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=EditorTextLayer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EditorTextLayer.js","sourceRoot":"","sources":["../../../src/imageEditor/layers/EditorTextLayer.tsx"],"names":[],"mappings":";AAgBA,MAAM,UAAU,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAS;IAC/D,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;IACzB,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,OAAO,CAAC;IACtC,MAAM,UAAU,GAAG,KAAK,CAAC,UAAU,IAAI,GAAG,CAAC;IAC3C,MAAM,YAAY,GAAG,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;IACjD,MAAM,KAAK,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,UAAU,GACd,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC;IAE1F,OAAO,CACL,eACE,CAAC,EAAE,CAAC,EACJ,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,EACrB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,YAAY,EAC5C,QAAQ,EAAE,KAAK,CAAC,QAAQ,EACxB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,QAAQ,EACxC,IAAI,EAAE,KAAK,CAAC,KAAK,EACjB,UAAU,EAAE,UAAU,YAErB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACtB,gBAAe,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,YAChD,IAAI,IAAI,QAAQ,IADP,CAAC,CAEL,CACT,CAAC,GACG,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SelectionHandles
|
|
3
|
+
*
|
|
4
|
+
* Renders the dashed selection rectangle plus eight resize handles around
|
|
5
|
+
* the currently-selected layer's bounding box. Pointer events on each
|
|
6
|
+
* handle bubble back through `onHandlePointerDown` so the surrounding
|
|
7
|
+
* `<CanvasSurface>` can run its drag loop with the right resize semantics.
|
|
8
|
+
*/
|
|
9
|
+
import type { CanvasRect } from '../state.js';
|
|
10
|
+
export type Handle = 'nw' | 'n' | 'ne' | 'e' | 'se' | 's' | 'sw' | 'w';
|
|
11
|
+
interface Props {
|
|
12
|
+
box: CanvasRect;
|
|
13
|
+
onHandlePointerDown: (e: React.PointerEvent<SVGRectElement>, handle: Handle) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare function SelectionHandles({ box, onHandlePointerDown }: Props): import("react/jsx-runtime").JSX.Element;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=SelectionHandles.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectionHandles.d.ts","sourceRoot":"","sources":["../../../src/imageEditor/layers/SelectionHandles.tsx"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,MAAM,MAAM,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;AAIvE,UAAU,KAAK;IACb,GAAG,EAAE,UAAU,CAAC;IAChB,mBAAmB,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,YAAY,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CACtF;AAED,wBAAgB,gBAAgB,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,EAAE,KAAK,2CAiEnE"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
const HANDLE_SIZE = 10; // canvas-pixel size of each square handle
|
|
3
|
+
export function SelectionHandles({ box, onHandlePointerDown }) {
|
|
4
|
+
const half = HANDLE_SIZE / 2;
|
|
5
|
+
const cx = box.x + box.width / 2;
|
|
6
|
+
const cy = box.y + box.height / 2;
|
|
7
|
+
const handles = [
|
|
8
|
+
{ id: 'nw', x: box.x, y: box.y, cursor: 'nwse-resize' },
|
|
9
|
+
{ id: 'n', x: cx, y: box.y, cursor: 'ns-resize' },
|
|
10
|
+
{ id: 'ne', x: box.x + box.width, y: box.y, cursor: 'nesw-resize' },
|
|
11
|
+
{ id: 'e', x: box.x + box.width, y: cy, cursor: 'ew-resize' },
|
|
12
|
+
{ id: 'se', x: box.x + box.width, y: box.y + box.height, cursor: 'nwse-resize' },
|
|
13
|
+
{ id: 's', x: cx, y: box.y + box.height, cursor: 'ns-resize' },
|
|
14
|
+
{ id: 'sw', x: box.x, y: box.y + box.height, cursor: 'nesw-resize' },
|
|
15
|
+
{ id: 'w', x: box.x, y: cy, cursor: 'ew-resize' },
|
|
16
|
+
];
|
|
17
|
+
return (_jsxs("g", { pointerEvents: "none", children: [_jsx("rect", { x: box.x, y: box.y, width: box.width, height: box.height, fill: "none", stroke: "#ffffff", strokeOpacity: 0.9, strokeWidth: 4, vectorEffect: "non-scaling-stroke" }), _jsx("rect", { x: box.x, y: box.y, width: box.width, height: box.height, fill: "none", stroke: "#39f", strokeWidth: 2, strokeDasharray: "6 4", vectorEffect: "non-scaling-stroke" }), handles.map((h) => (_jsx("rect", { x: h.x - half, y: h.y - half, width: HANDLE_SIZE, height: HANDLE_SIZE, fill: "#fff", stroke: "#39f", strokeWidth: 2, vectorEffect: "non-scaling-stroke", style: { cursor: h.cursor, pointerEvents: 'all' }, onPointerDown: (e) => onHandlePointerDown(e, h.id) }, h.id)))] }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=SelectionHandles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SelectionHandles.js","sourceRoot":"","sources":["../../../src/imageEditor/layers/SelectionHandles.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure state + reducer for the `<ImageEditor>` component.
|
|
3
|
+
*
|
|
4
|
+
* Kept React-free so it's easy to unit-test in isolation. The actual
|
|
5
|
+
* React hook that wires this to a {@link ContentContainer} (and the
|
|
6
|
+
* version manager) lives in `useImageEditor.ts`.
|
|
7
|
+
*/
|
|
8
|
+
import type { ImageEditDoc, ImageEditLayer } from '@bendyline/squisq/schemas';
|
|
9
|
+
/**
|
|
10
|
+
* Layer payload accepted by the `add-layer` action — the `id` field is
|
|
11
|
+
* optional and will be assigned by the underlying `addLayer` helper if
|
|
12
|
+
* the caller doesn't supply one.
|
|
13
|
+
*/
|
|
14
|
+
export type ImageEditLayerInput = ImageEditLayer | (Omit<ImageEditLayer, 'id'> & {
|
|
15
|
+
id?: string;
|
|
16
|
+
});
|
|
17
|
+
/** The currently active interaction tool. */
|
|
18
|
+
export type ImageEditorTool = 'select' | 'text' | 'shape' | 'image' | 'crop';
|
|
19
|
+
/** A pixel-space rectangle in canvas coordinates. */
|
|
20
|
+
export interface CanvasRect {
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
}
|
|
26
|
+
export interface ImageEditorState {
|
|
27
|
+
/** The persisted document. */
|
|
28
|
+
doc: ImageEditDoc;
|
|
29
|
+
/** Selected layer id, or `null` when nothing is selected. */
|
|
30
|
+
selectedLayerId: string | null;
|
|
31
|
+
/** Active tool. */
|
|
32
|
+
tool: ImageEditorTool;
|
|
33
|
+
/**
|
|
34
|
+
* Dirty flag — true when the in-memory doc has unsaved changes
|
|
35
|
+
* relative to the last `markClean()` call. The hook uses this to
|
|
36
|
+
* debounce writes back to `state.json`.
|
|
37
|
+
*/
|
|
38
|
+
dirty: boolean;
|
|
39
|
+
}
|
|
40
|
+
export type ImageEditorAction = {
|
|
41
|
+
type: 'load';
|
|
42
|
+
doc: ImageEditDoc;
|
|
43
|
+
} | {
|
|
44
|
+
type: 'mark-clean';
|
|
45
|
+
} | {
|
|
46
|
+
type: 'set-tool';
|
|
47
|
+
tool: ImageEditorTool;
|
|
48
|
+
} | {
|
|
49
|
+
type: 'select';
|
|
50
|
+
layerId: string | null;
|
|
51
|
+
} | {
|
|
52
|
+
type: 'set-canvas';
|
|
53
|
+
canvas: ImageEditDoc['canvas'];
|
|
54
|
+
} | {
|
|
55
|
+
type: 'add-layer';
|
|
56
|
+
layer: ImageEditLayerInput;
|
|
57
|
+
select?: boolean;
|
|
58
|
+
} | {
|
|
59
|
+
type: 'remove-layer';
|
|
60
|
+
layerId: string;
|
|
61
|
+
} | {
|
|
62
|
+
type: 'update-layer';
|
|
63
|
+
layerId: string;
|
|
64
|
+
patch: Partial<ImageEditLayer>;
|
|
65
|
+
} | {
|
|
66
|
+
type: 'reorder-layer';
|
|
67
|
+
layerId: string;
|
|
68
|
+
toIndex: number;
|
|
69
|
+
} | {
|
|
70
|
+
type: 'crop';
|
|
71
|
+
rect: CanvasRect;
|
|
72
|
+
};
|
|
73
|
+
/** Build the initial state from a freshly-loaded doc. */
|
|
74
|
+
export declare function initialImageEditorState(doc: ImageEditDoc): ImageEditorState;
|
|
75
|
+
export declare function imageEditorReducer(state: ImageEditorState, action: ImageEditorAction): ImageEditorState;
|
|
76
|
+
//# sourceMappingURL=state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/imageEditor/state.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAU9E;;;;GAIG;AACH,MAAM,MAAM,mBAAmB,GAAG,cAAc,GAAG,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,GAAG;IAAE,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAElG,6CAA6C;AAC7C,MAAM,MAAM,eAAe,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,CAAC;AAE7E,qDAAqD;AACrD,MAAM,WAAW,UAAU;IACzB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAgB;IAC/B,8BAA8B;IAC9B,GAAG,EAAE,YAAY,CAAC;IAClB,6DAA6D;IAC7D,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,mBAAmB;IACnB,IAAI,EAAE,eAAe,CAAC;IACtB;;;;OAIG;IACH,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,YAAY,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,GACtB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,eAAe,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAA;CAAE,GACtD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,mBAAmB,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,GACnE;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC,cAAc,CAAC,CAAA;CAAE,GACzE;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,UAAU,CAAA;CAAE,CAAC;AAEvC,yDAAyD;AACzD,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,YAAY,GAAG,gBAAgB,CAO3E;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,gBAAgB,EACvB,MAAM,EAAE,iBAAiB,GACxB,gBAAgB,CA4ElB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure state + reducer for the `<ImageEditor>` component.
|
|
3
|
+
*
|
|
4
|
+
* Kept React-free so it's easy to unit-test in isolation. The actual
|
|
5
|
+
* React hook that wires this to a {@link ContentContainer} (and the
|
|
6
|
+
* version manager) lives in `useImageEditor.ts`.
|
|
7
|
+
*/
|
|
8
|
+
import { addLayer, removeLayer, reorderLayer, setCanvas, updateLayer, touch, } from '@bendyline/squisq/imageEdit';
|
|
9
|
+
/** Build the initial state from a freshly-loaded doc. */
|
|
10
|
+
export function initialImageEditorState(doc) {
|
|
11
|
+
return {
|
|
12
|
+
doc,
|
|
13
|
+
selectedLayerId: null,
|
|
14
|
+
tool: 'select',
|
|
15
|
+
dirty: false,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
export function imageEditorReducer(state, action) {
|
|
19
|
+
switch (action.type) {
|
|
20
|
+
case 'load':
|
|
21
|
+
return { doc: action.doc, selectedLayerId: null, tool: 'select', dirty: false };
|
|
22
|
+
case 'mark-clean':
|
|
23
|
+
return state.dirty ? { ...state, dirty: false } : state;
|
|
24
|
+
case 'set-tool':
|
|
25
|
+
return state.tool === action.tool ? state : { ...state, tool: action.tool };
|
|
26
|
+
case 'select':
|
|
27
|
+
return state.selectedLayerId === action.layerId
|
|
28
|
+
? state
|
|
29
|
+
: { ...state, selectedLayerId: action.layerId };
|
|
30
|
+
case 'set-canvas': {
|
|
31
|
+
const next = setCanvas(state.doc, action.canvas);
|
|
32
|
+
return next === state.doc ? state : { ...state, doc: next, dirty: true };
|
|
33
|
+
}
|
|
34
|
+
case 'add-layer': {
|
|
35
|
+
// `addLayer` from core assigns an id when missing; cast through
|
|
36
|
+
// `ImageEditLayer` for the existing helper signature.
|
|
37
|
+
const next = addLayer(state.doc, action.layer);
|
|
38
|
+
// Pick up the assigned id (last layer)
|
|
39
|
+
const newId = next.layers[next.layers.length - 1].id;
|
|
40
|
+
return {
|
|
41
|
+
...state,
|
|
42
|
+
doc: next,
|
|
43
|
+
dirty: true,
|
|
44
|
+
selectedLayerId: action.select === false ? state.selectedLayerId : newId,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
case 'remove-layer': {
|
|
48
|
+
const next = removeLayer(state.doc, action.layerId);
|
|
49
|
+
if (next === state.doc)
|
|
50
|
+
return state;
|
|
51
|
+
return {
|
|
52
|
+
...state,
|
|
53
|
+
doc: next,
|
|
54
|
+
dirty: true,
|
|
55
|
+
selectedLayerId: state.selectedLayerId === action.layerId ? null : state.selectedLayerId,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
case 'update-layer': {
|
|
59
|
+
const next = updateLayer(state.doc, action.layerId, action.patch);
|
|
60
|
+
return next === state.doc ? state : { ...state, doc: next, dirty: true };
|
|
61
|
+
}
|
|
62
|
+
case 'reorder-layer': {
|
|
63
|
+
const next = reorderLayer(state.doc, action.layerId, action.toIndex);
|
|
64
|
+
return next === state.doc ? state : { ...state, doc: next, dirty: true };
|
|
65
|
+
}
|
|
66
|
+
case 'crop': {
|
|
67
|
+
const { rect } = action;
|
|
68
|
+
const newCanvas = {
|
|
69
|
+
...state.doc.canvas,
|
|
70
|
+
width: Math.max(1, Math.round(rect.width)),
|
|
71
|
+
height: Math.max(1, Math.round(rect.height)),
|
|
72
|
+
};
|
|
73
|
+
// Translate every layer by (-rect.x, -rect.y). Only handles numeric
|
|
74
|
+
// positions; percentage strings are left alone (rare for image-edit
|
|
75
|
+
// layers, which the editor produces with numeric coords).
|
|
76
|
+
const translated = state.doc.layers.map((layer) => {
|
|
77
|
+
const { position } = layer;
|
|
78
|
+
const x = typeof position.x === 'number' ? position.x - rect.x : position.x;
|
|
79
|
+
const y = typeof position.y === 'number' ? position.y - rect.y : position.y;
|
|
80
|
+
return { ...layer, position: { ...position, x, y } };
|
|
81
|
+
});
|
|
82
|
+
const next = touch({ ...state.doc, canvas: newCanvas, layers: translated });
|
|
83
|
+
return { ...state, doc: next, dirty: true };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/imageEditor/state.ts"],"names":[],"mappings":"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"}
|