@bendyline/squisq-editor-react 1.4.0 → 1.5.1
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 +173 -4
- package/dist/EditorShell.d.ts.map +1 -1
- package/dist/EditorShell.js +110 -10
- 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/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__/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 +13 -0
- package/dist/__tests__/tiptapBridge.test.js.map +1 -1
- 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 +171 -14
- 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 +571 -55
- 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/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__/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 +15 -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 +188 -20
- 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
package/dist/EditorShell.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { jsx as _jsx,
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
3
|
* EditorShell
|
|
4
4
|
*
|
|
@@ -6,37 +6,67 @@ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-run
|
|
|
6
6
|
* views, and StatusBar into a complete editing experience. Wraps everything
|
|
7
7
|
* in an EditorProvider for shared state.
|
|
8
8
|
*/
|
|
9
|
-
import { useEffect, useState, useCallback } from 'react';
|
|
9
|
+
import { useEffect, useRef, useState, useCallback, useMemo } from 'react';
|
|
10
10
|
import { EditorProvider, useEditorContext, } from './EditorContext';
|
|
11
11
|
import { Toolbar } from './Toolbar';
|
|
12
12
|
import { StatusBar } from './StatusBar';
|
|
13
13
|
import { RawEditor } from './RawEditor';
|
|
14
14
|
import { WysiwygEditor } from './WysiwygEditor';
|
|
15
|
+
import { InlinePreviewGutter } from './InlinePreviewGutter';
|
|
16
|
+
import { OutlinePanel } from './OutlinePanel';
|
|
15
17
|
import { PreviewPanel } from './PreviewPanel';
|
|
18
|
+
import { ImageViewer } from './ImageViewer';
|
|
19
|
+
import { ImageEditor } from './ImageEditor';
|
|
16
20
|
import { PreviewSettingsProvider, PreviewToolbarControls } from './PreviewControls';
|
|
17
21
|
import { MediaBin } from './MediaBin';
|
|
18
22
|
import { DropZoneOverlay } from './DropZoneOverlay';
|
|
19
23
|
import { TooltipLayer } from './Tooltip';
|
|
20
24
|
import { useFileDrop } from './hooks/useFileDrop';
|
|
21
25
|
import { partitionFiles, processMediaFiles, processTextFile, processTextFiles, } from './utils/dropUtils';
|
|
26
|
+
import { DARK_SURFACE, LIGHT_SURFACE } from '@bendyline/squisq/schemas';
|
|
27
|
+
import { MemoryContentContainer, scopeContainer, createMediaProviderFromContainer, } from '@bendyline/squisq/storage';
|
|
22
28
|
/**
|
|
23
29
|
* Complete markdown editor shell with toolbar, view switcher, and three
|
|
24
30
|
* editing modes: Raw (Monaco), WYSIWYG (Tiptap), and Preview.
|
|
25
31
|
*/
|
|
26
|
-
export function EditorShell({ initialMarkdown = '', initialView = 'wysiwyg', articleId = 'untitled', basePath = '/', onChange, theme = 'light', className, height = '100vh', minHeight, maxHeight, mediaProvider, container, showFilesToggle, toolbarSlotLeft, toolbarSlotAfterActions, toolbarSlotRight, showPlayTab = true, submitOnEnter, fullWidth = false, uxFont, thinMargins = false, showStatusBar = true, imageDisplayMode = 'inline', fileName, language, mentionProvider, placeholder, readOnly = false, }) {
|
|
32
|
+
export function EditorShell({ initialMarkdown = '', initialView = 'wysiwyg', articleId = 'untitled', basePath = '/', onChange, theme = 'light', className, height = '100vh', minHeight, maxHeight, mediaProvider, workspaceContainer, container, allowVersioning = false, versionBasename, versioningPrunePolicy, versioningAutoSaveIdleMs, onSaveVersion, showFilesToggle, toolbarSlotLeft, toolbarSlotAfterActions, toolbarSlotRight, showPlayTab = true, submitOnEnter, fullWidth = false, uxFont, thinMargins = false, showStatusBar = true, imageDisplayMode = 'inline', fileName, language, mentionProvider, documentLinkProvider, allowRecording = true, placeholder, readOnly = false, imageSrc, imageAlt, imageMode = 'view', imageEditorContainer, onImageExport, inlinePreview = false, inlinePreviewWidth = 320, outline = false, outlineWidth = 240, blockTags = true, themeInheritance = 'fonts', viewPreferences, onViewPreferencesChange, themeOverride = null, }) {
|
|
33
|
+
const effectiveContainer = workspaceContainer ?? container ?? null;
|
|
34
|
+
// If the host gave us a `workspaceContainer` but no explicit `mediaProvider`,
|
|
35
|
+
// derive one automatically. Without this, drag-and-drop of an image
|
|
36
|
+
// into the editor silently failed (no provider \u2192 nothing to upload to)
|
|
37
|
+
// even though we had a perfectly good ContentContainer to write into.
|
|
38
|
+
const effectiveMediaProvider = useMemo(() => {
|
|
39
|
+
if (mediaProvider !== undefined)
|
|
40
|
+
return mediaProvider;
|
|
41
|
+
if (effectiveContainer)
|
|
42
|
+
return createMediaProviderFromContainer(effectiveContainer);
|
|
43
|
+
return undefined;
|
|
44
|
+
}, [mediaProvider, effectiveContainer]);
|
|
27
45
|
// Show the toggle when explicitly opted in, or when mediaProvider prop was passed at all
|
|
28
|
-
const filesToggleEnabled = showFilesToggle ??
|
|
46
|
+
const filesToggleEnabled = showFilesToggle ?? effectiveMediaProvider !== undefined;
|
|
29
47
|
// If the host hides the Play tab but asked for it as the initial view,
|
|
30
48
|
// fall back to wysiwyg so we don't boot into a tab the user can't leave.
|
|
31
49
|
const effectiveInitialView = !showPlayTab && initialView === 'preview' ? 'wysiwyg' : initialView;
|
|
32
|
-
return (_jsx(EditorProvider, { initialMarkdown: initialMarkdown, initialView: effectiveInitialView, articleId: articleId, theme: theme, mediaProvider:
|
|
50
|
+
return (_jsx(EditorProvider, { initialMarkdown: initialMarkdown, initialView: effectiveInitialView, articleId: articleId, theme: theme, workspaceContainer: effectiveContainer, allowVersioning: allowVersioning, versionBasename: versionBasename, versioningPrunePolicy: versioningPrunePolicy, versioningAutoSaveIdleMs: versioningAutoSaveIdleMs, onSaveVersion: onSaveVersion, mediaProvider: effectiveMediaProvider, imageDisplayMode: imageDisplayMode, mentionProvider: mentionProvider, documentLinkProvider: documentLinkProvider, allowRecording: allowRecording, fileName: fileName, language: language, inlinePreview: inlinePreview, showStatusBar: showStatusBar, outline: outline, blockTags: blockTags, themeInheritance: themeInheritance, viewPreferences: viewPreferences, onViewPreferencesChange: onViewPreferencesChange, children: _jsx(EditorShellInner, { basePath: basePath, onChange: onChange, className: className, height: height, minHeight: minHeight, maxHeight: maxHeight, placeholder: placeholder, mediaProvider: effectiveMediaProvider ?? null, workspaceContainer: effectiveContainer, filesToggleEnabled: filesToggleEnabled, toolbarSlotLeft: toolbarSlotLeft, toolbarSlotAfterActions: toolbarSlotAfterActions, toolbarSlotRight: toolbarSlotRight, showPlayTab: showPlayTab, submitOnEnter: submitOnEnter, fullWidth: fullWidth, uxFont: uxFont, thinMargins: thinMargins, readOnly: readOnly, imageSrc: imageSrc, imageAlt: imageAlt, imageMode: imageMode, imageEditorContainer: imageEditorContainer, onImageExport: onImageExport, allowVersioning: allowVersioning, versioningAutoSaveIdleMs: versioningAutoSaveIdleMs, inlinePreviewWidth: inlinePreviewWidth, outlineWidth: outlineWidth, themeOverride: themeOverride }) }));
|
|
33
51
|
}
|
|
34
|
-
function EditorShellInner({ basePath, onChange, className, height, minHeight, maxHeight, placeholder, mediaProvider,
|
|
35
|
-
const { activeView, markdownSource, doc, theme, editorMode, insertAtCursor, replaceAll, tiptapEditor, monacoEditor, setMarkdownSource, } = useEditorContext();
|
|
52
|
+
function EditorShellInner({ basePath, onChange, className, height, minHeight, maxHeight, placeholder, mediaProvider, workspaceContainer, filesToggleEnabled, toolbarSlotLeft, toolbarSlotAfterActions, toolbarSlotRight, showPlayTab, submitOnEnter, fullWidth, uxFont, thinMargins, readOnly, imageSrc, imageAlt, imageMode, imageEditorContainer, onImageExport, allowVersioning, versioningAutoSaveIdleMs, inlinePreviewWidth, outlineWidth, themeOverride, }) {
|
|
53
|
+
const { activeView, markdownSource, doc, theme, editorMode, insertAtCursor, replaceAll, tiptapEditor, monacoEditor, setMarkdownSource, inlinePreviewVisible, statusBarVisible, outlineVisible, imageEditTarget, closeImageEdit, bumpMediaRevision, } = useEditorContext();
|
|
36
54
|
const isPreview = activeView === 'preview';
|
|
37
55
|
const isCodeMode = editorMode === 'code';
|
|
56
|
+
const isImageMode = editorMode === 'image';
|
|
57
|
+
const isMarkdownMode = editorMode === 'markdown';
|
|
38
58
|
const [showFiles, setShowFiles] = useState(false);
|
|
39
59
|
const [mediaRefreshKey, setMediaRefreshKey] = useState(0);
|
|
60
|
+
// Persistent fallback container for image-edit sidecars when the host
|
|
61
|
+
// didn't supply one. Lifted to shell scope so opening the same image
|
|
62
|
+
// multiple times sees the same `.imageEdits/<sanitized>/.versions/...`
|
|
63
|
+
// snapshots — otherwise each modal mount would start from an empty
|
|
64
|
+
// in-memory container and history would vanish on close.
|
|
65
|
+
const imageEditFallbackContainerRef = useRef(null);
|
|
66
|
+
if (imageEditFallbackContainerRef.current === null) {
|
|
67
|
+
imageEditFallbackContainerRef.current = new MemoryContentContainer();
|
|
68
|
+
}
|
|
69
|
+
const imageEditFallbackContainer = imageEditFallbackContainerRef.current;
|
|
40
70
|
const isDark = theme === 'dark';
|
|
41
71
|
const handleToggleFiles = useCallback(() => {
|
|
42
72
|
setShowFiles((prev) => !prev);
|
|
@@ -163,7 +193,7 @@ function EditorShellInner({ basePath, onChange, className, height, minHeight, ma
|
|
|
163
193
|
return () => window.removeEventListener('keydown', handler);
|
|
164
194
|
}, [showPlayTab]);
|
|
165
195
|
const autoGrow = minHeight !== undefined || maxHeight !== undefined;
|
|
166
|
-
return (_jsxs("div", { className: `squisq-editor-shell ${className || ''}`, "data-theme": theme, "data-full-width": fullWidth ? 'true' : undefined, "data-thin-margins": thinMargins ? 'true' : undefined, style: {
|
|
196
|
+
return (_jsxs("div", { className: `squisq-editor-shell ${className || ''}`, "data-theme": theme, "data-full-width": fullWidth ? 'true' : undefined, "data-thin-margins": thinMargins ? 'true' : undefined, "data-outline-visible": isMarkdownMode && outlineVisible ? 'true' : undefined, style: {
|
|
167
197
|
display: 'flex',
|
|
168
198
|
flexDirection: 'column',
|
|
169
199
|
overflow: 'hidden',
|
|
@@ -173,7 +203,14 @@ function EditorShellInner({ basePath, onChange, className, height, minHeight, ma
|
|
|
173
203
|
// tabs, status bar) consume `--squisq-ux-font` as their
|
|
174
204
|
// `font-family`, falling back to the system stack when unset.
|
|
175
205
|
...(uxFont ? { '--squisq-ux-font': uxFont } : {}),
|
|
176
|
-
|
|
206
|
+
// Exposed so the toolbar's view-tabs section can match the outline
|
|
207
|
+
// pane's width, lining up its right-edge separator with the
|
|
208
|
+
// outline's right edge. The variable is set unconditionally so the
|
|
209
|
+
// outline pane itself can also read it if needed; the
|
|
210
|
+
// `data-outline-visible` gate above keeps the toolbar override
|
|
211
|
+
// scoped to the case where alignment matters.
|
|
212
|
+
...{ '--squisq-outline-width': `${outlineWidth}px` },
|
|
213
|
+
}, ...containerProps, children: [_jsxs(PreviewSettingsProvider, { doc: doc, themeOverride: themeOverride, children: [isImageMode ? ((toolbarSlotLeft || toolbarSlotRight) && (_jsxs("div", { className: "squisq-editor-header squisq-editor-header--image", children: [toolbarSlotLeft, _jsx("div", { style: { flex: 1 } }), toolbarSlotRight] }))) : (_jsx("div", { className: "squisq-editor-header", children: _jsx(Toolbar, { showFiles: showFiles, onToggleFiles: !isCodeMode && filesToggleEnabled ? handleToggleFiles : undefined, slotLeft: toolbarSlotLeft, slotAfterActions: _jsxs(_Fragment, { children: [toolbarSlotAfterActions, !isCodeMode && isPreview && _jsx(PreviewToolbarControls, {})] }), slotRight: toolbarSlotRight, showPlayTab: showPlayTab }) })), _jsxs("div", { className: "squisq-editor-content", style: {
|
|
177
214
|
flex: autoGrow ? '1 1 auto' : 1,
|
|
178
215
|
overflowY: autoGrow ? 'auto' : 'hidden',
|
|
179
216
|
overflowX: 'hidden',
|
|
@@ -185,6 +222,69 @@ function EditorShellInner({ basePath, onChange, className, height, minHeight, ma
|
|
|
185
222
|
overflow: autoGrow ? 'visible' : 'hidden',
|
|
186
223
|
minHeight: 0,
|
|
187
224
|
position: 'relative',
|
|
188
|
-
}, children: [
|
|
225
|
+
}, children: [isImageMode &&
|
|
226
|
+
imageSrc &&
|
|
227
|
+
(imageMode === 'edit' && imageEditorContainer ? (_jsx(ImageEditor, { filesContainer: imageEditorContainer, initialSrc: imageSrc, allowVersioning: allowVersioning, versioningAutoSaveIdleMs: versioningAutoSaveIdleMs, onExport: onImageExport })) : (_jsx(ImageViewer, { src: imageSrc, alt: imageAlt, theme: theme }))), !isImageMode && activeView === 'raw' && (_jsxs("div", { className: "squisq-editor-with-gutter", children: [isMarkdownMode && outlineVisible && (_jsx(OutlinePanel, { width: outlineWidth }, "outline")), _jsx("div", { className: "squisq-raw-editor-container", children: _jsx(RawEditor, { theme: theme === 'dark' ? 'vs-dark' : 'vs', submitOnEnter: submitOnEnter, readOnly: readOnly }) }, "raw-editor"), isMarkdownMode && inlinePreviewVisible && (_jsx(InlinePreviewGutter, { width: inlinePreviewWidth, basePath: basePath, mediaProvider: mediaProvider }, "inline"))] }, "raw-shell")), isMarkdownMode && activeView === 'wysiwyg' && (_jsxs("div", { className: "squisq-editor-with-gutter", children: [outlineVisible && _jsx(OutlinePanel, { width: outlineWidth }, "outline"), _jsx(WysiwygEditor, { submitOnEnter: submitOnEnter, placeholder: placeholder, readOnly: readOnly }, "wysiwyg-editor"), inlinePreviewVisible && (_jsx(InlinePreviewGutter, { width: inlinePreviewWidth, basePath: basePath, mediaProvider: mediaProvider }, "inline"))] }, "wysiwyg-shell")), isMarkdownMode && isPreview && (_jsx(PreviewPanel, { basePath: basePath, workspaceContainer: workspaceContainer }))] }), isMarkdownMode && showFiles && (_jsx(MediaBin, { mediaProvider: mediaProvider, isDark: isDark, refreshKey: mediaRefreshKey, onMediaUploaded: insertMediaRef })), isMarkdownMode &&
|
|
228
|
+
isDragging &&
|
|
229
|
+
!(activeView === 'wysiwyg' && dragContentType === 'media') && (_jsx(DropZoneOverlay, { dragContentType: dragContentType, zoneProps: zoneProps, hasMediaProvider: mediaProvider !== null }))] }), statusBarVisible && !isImageMode && _jsx(StatusBar, {})] }), _jsx(TooltipLayer, {}), imageEditTarget !== null && mediaProvider && (_jsx(ImageEditModal, { relativePath: imageEditTarget, container: workspaceContainer ?? imageEditFallbackContainer, mediaProvider: mediaProvider, onClose: closeImageEdit, onSaved: () => {
|
|
230
|
+
bumpMediaRevision();
|
|
231
|
+
closeImageEdit();
|
|
232
|
+
}, allowVersioning: allowVersioning, versioningAutoSaveIdleMs: versioningAutoSaveIdleMs, shellTheme: theme }))] }));
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Modal overlay that mounts a full `<ImageEditor>` against a sidecar
|
|
236
|
+
* container scoped under `.imageEdits/<sanitized-path>/` of the document's
|
|
237
|
+
* `ContentContainer`. Opens when a user clicks the "Edit" affordance on an
|
|
238
|
+
* image in the WYSIWYG view; on Export, rewrites the original image bytes
|
|
239
|
+
* via `mediaProvider.addMedia(relativePath, blob, mime)` and bumps
|
|
240
|
+
* `mediaRevision` so live `<img>` nodes pick up the new content.
|
|
241
|
+
*/
|
|
242
|
+
function ImageEditModal({ relativePath, container, mediaProvider, onClose, onSaved, allowVersioning, versioningAutoSaveIdleMs, shellTheme, }) {
|
|
243
|
+
// Each unique image path gets its own sidecar so multiple images in the
|
|
244
|
+
// same doc can be edited independently without colliding state. When the
|
|
245
|
+
// host didn't supply a `container`, fall back to a fresh in-memory one
|
|
246
|
+
// — the edit session is transient anyway and the final raster is what
|
|
247
|
+
// gets written back through `mediaProvider`.
|
|
248
|
+
const sidecar = useMemo(() => {
|
|
249
|
+
const sanitized = relativePath.replace(/[^a-zA-Z0-9._-]+/g, '_');
|
|
250
|
+
const parent = container ?? new MemoryContentContainer();
|
|
251
|
+
return scopeContainer(parent, `.imageEdits/${sanitized}`);
|
|
252
|
+
}, [container, relativePath]);
|
|
253
|
+
const [initialSrc, setInitialSrc] = useState(null);
|
|
254
|
+
const [resolveError, setResolveError] = useState(null);
|
|
255
|
+
useEffect(() => {
|
|
256
|
+
let cancelled = false;
|
|
257
|
+
mediaProvider.resolveUrl(relativePath).then((url) => {
|
|
258
|
+
if (!cancelled)
|
|
259
|
+
setInitialSrc(url);
|
|
260
|
+
}, (err) => {
|
|
261
|
+
if (!cancelled) {
|
|
262
|
+
setResolveError(err instanceof Error ? err.message : String(err));
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
return () => {
|
|
266
|
+
cancelled = true;
|
|
267
|
+
};
|
|
268
|
+
}, [mediaProvider, relativePath]);
|
|
269
|
+
const handleExport = useCallback((blob, format) => {
|
|
270
|
+
const mime = `image/${format}`;
|
|
271
|
+
mediaProvider.addMedia(relativePath, blob, mime).then(() => onSaved(), (err) => {
|
|
272
|
+
console.error('Failed to write image back:', err instanceof Error ? err.message : err);
|
|
273
|
+
});
|
|
274
|
+
}, [mediaProvider, relativePath, onSaved]);
|
|
275
|
+
// Close on Escape — global listener so it works regardless of focus.
|
|
276
|
+
useEffect(() => {
|
|
277
|
+
const handler = (e) => {
|
|
278
|
+
if (e.key === 'Escape')
|
|
279
|
+
onClose();
|
|
280
|
+
};
|
|
281
|
+
window.addEventListener('keydown', handler);
|
|
282
|
+
return () => window.removeEventListener('keydown', handler);
|
|
283
|
+
}, [onClose]);
|
|
284
|
+
return (_jsx("div", { className: "squisq-image-edit-modal", "data-testid": "image-edit-modal", role: "dialog", "aria-modal": "true", "aria-label": `Edit ${relativePath}`, onClick: (e) => {
|
|
285
|
+
// Click on the dim backdrop (but not on the surface) → close.
|
|
286
|
+
if (e.target === e.currentTarget)
|
|
287
|
+
onClose();
|
|
288
|
+
}, children: _jsxs("div", { className: "squisq-image-edit-modal__surface", children: [_jsxs("header", { className: "squisq-image-edit-modal__header", children: [_jsx("span", { className: "squisq-image-edit-modal__title", children: "Edit image" }), _jsx("span", { className: "squisq-image-edit-modal__path", children: relativePath }), _jsx("button", { type: "button", className: "squisq-image-edit-modal__close", "data-testid": "image-edit-modal-close", onClick: onClose, "aria-label": "Close image editor", children: "\u00D7" })] }), _jsx("div", { className: "squisq-image-edit-modal__body", children: resolveError ? (_jsxs("div", { className: "squisq-image-edit-modal__error", children: ["Failed to load image: ", resolveError] })) : !initialSrc ? (_jsx("div", { className: "squisq-image-edit-modal__loading", children: "Loading image\u2026" })) : (_jsx(ImageEditor, { filesContainer: sidecar, initialSrc: initialSrc, allowVersioning: allowVersioning, versioningAutoSaveIdleMs: versioningAutoSaveIdleMs, onExport: handleExport, saveBehavior: "export", saveFormat: "png", saveLabel: "Save and close", saveTitle: "Save changes back to the image and close", surface: shellTheme === 'dark' ? DARK_SURFACE : LIGHT_SURFACE })) })] }) }));
|
|
189
289
|
}
|
|
190
290
|
//# sourceMappingURL=EditorShell.js.map
|
package/dist/EditorShell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EditorShell.js","sourceRoot":"","sources":["../src/EditorShell.tsx"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EditorShell.js","sourceRoot":"","sources":["../src/EditorShell.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EmojiPicker
|
|
3
|
+
*
|
|
4
|
+
* Toolbar-anchored popover for inserting emoji. The user picks a
|
|
5
|
+
* category from a row of tabs along the top, sees a scrollable grid
|
|
6
|
+
* for that category, and can type into a search box to narrow across
|
|
7
|
+
* all categories at once. Click → `onSelect(char)` → caller is
|
|
8
|
+
* responsible for routing the character into the active editor.
|
|
9
|
+
*
|
|
10
|
+
* Keeps the data flat and the rendering simple: there's no fuzzy
|
|
11
|
+
* search, no recently-used persistence, no skin-tone modifiers — just
|
|
12
|
+
* a fast, predictable picker. We can layer those on later without
|
|
13
|
+
* changing the public surface.
|
|
14
|
+
*/
|
|
15
|
+
import type { CSSProperties } from 'react';
|
|
16
|
+
import type { PickerEntry } from './emojiData';
|
|
17
|
+
export interface EmojiPickerProps {
|
|
18
|
+
/** Whether the picker is visible. */
|
|
19
|
+
open: boolean;
|
|
20
|
+
/**
|
|
21
|
+
* Fired when the user picks an entry. Carries either an emoji glyph
|
|
22
|
+
* or a FontAwesome icon descriptor — the caller dispatches on
|
|
23
|
+
* `kind` to insert it into the active editor. The caller is also
|
|
24
|
+
* responsible for closing the popover.
|
|
25
|
+
*/
|
|
26
|
+
onSelect: (entry: PickerEntry) => void;
|
|
27
|
+
/** Fired on Escape, click-outside, or selection so the caller can close. */
|
|
28
|
+
onClose: () => void;
|
|
29
|
+
/** Optional anchor element — used for click-outside detection. When the
|
|
30
|
+
* popover is rendered inside the same container as the trigger, pointer
|
|
31
|
+
* events on the trigger don't fire the outside handler. */
|
|
32
|
+
anchorRef?: React.RefObject<HTMLElement>;
|
|
33
|
+
/** Optional CSS class for the popover root. */
|
|
34
|
+
className?: string;
|
|
35
|
+
/** Optional inline style for the popover root (e.g. positioning). */
|
|
36
|
+
style?: CSSProperties;
|
|
37
|
+
/**
|
|
38
|
+
* Editor theme — `'light'` or `'dark'`. Drives the picker's color
|
|
39
|
+
* palette. Required for the picker to render correctly when portaled
|
|
40
|
+
* outside the editor shell, since CSS custom properties defined on
|
|
41
|
+
* the shell don't cascade to portal targets. Defaults to `'light'`.
|
|
42
|
+
*/
|
|
43
|
+
theme?: 'light' | 'dark';
|
|
44
|
+
}
|
|
45
|
+
/** Default popover dimensions. The Toolbar reads these to position the
|
|
46
|
+
* popover with viewport-aware clamping so it never gets clipped. */
|
|
47
|
+
export declare const EMOJI_PICKER_WIDTH = 480;
|
|
48
|
+
export declare const EMOJI_PICKER_MAX_HEIGHT = 560;
|
|
49
|
+
export declare function EmojiPicker({ open, onSelect, onClose, anchorRef, className, style, theme, }: EmojiPickerProps): import("react/jsx-runtime").JSX.Element | null;
|
|
50
|
+
//# sourceMappingURL=EmojiPicker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmojiPicker.d.ts","sourceRoot":"","sources":["../src/EmojiPicker.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAE3C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B,qCAAqC;IACrC,IAAI,EAAE,OAAO,CAAC;IACd;;;;;OAKG;IACH,QAAQ,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,CAAC;IACvC,4EAA4E;IAC5E,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB;;gEAE4D;IAC5D,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IACzC,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;CAC1B;AAgCD;qEACqE;AACrE,eAAO,MAAM,kBAAkB,MAAM,CAAC;AACtC,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAwB3C,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,OAAO,EACP,SAAS,EACT,SAAS,EACT,KAAK,EACL,KAAe,GAChB,EAAE,gBAAgB,kDAyNlB"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
/**
|
|
3
|
+
* EmojiPicker
|
|
4
|
+
*
|
|
5
|
+
* Toolbar-anchored popover for inserting emoji. The user picks a
|
|
6
|
+
* category from a row of tabs along the top, sees a scrollable grid
|
|
7
|
+
* for that category, and can type into a search box to narrow across
|
|
8
|
+
* all categories at once. Click → `onSelect(char)` → caller is
|
|
9
|
+
* responsible for routing the character into the active editor.
|
|
10
|
+
*
|
|
11
|
+
* Keeps the data flat and the rendering simple: there's no fuzzy
|
|
12
|
+
* search, no recently-used persistence, no skin-tone modifiers — just
|
|
13
|
+
* a fast, predictable picker. We can layer those on later without
|
|
14
|
+
* changing the public surface.
|
|
15
|
+
*/
|
|
16
|
+
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
17
|
+
import { PICKER_CATEGORIES, searchPickerEntries } from './emojiData';
|
|
18
|
+
const LIGHT_PALETTE = {
|
|
19
|
+
bg: '#fff',
|
|
20
|
+
border: '#d4cdb5',
|
|
21
|
+
inputBg: '#fff',
|
|
22
|
+
text: '#1f2937',
|
|
23
|
+
textMuted: '#8a7a5a',
|
|
24
|
+
accent: '#8B6914',
|
|
25
|
+
accentSoft: '#f3eedb',
|
|
26
|
+
};
|
|
27
|
+
const DARK_PALETTE = {
|
|
28
|
+
bg: '#1f2937',
|
|
29
|
+
border: '#4b5563',
|
|
30
|
+
inputBg: '#374151',
|
|
31
|
+
text: '#e5e7eb',
|
|
32
|
+
textMuted: '#9ca3af',
|
|
33
|
+
accent: '#fbbf24',
|
|
34
|
+
accentSoft: '#374151',
|
|
35
|
+
};
|
|
36
|
+
/** Default popover dimensions. The Toolbar reads these to position the
|
|
37
|
+
* popover with viewport-aware clamping so it never gets clipped. */
|
|
38
|
+
export const EMOJI_PICKER_WIDTH = 480;
|
|
39
|
+
export const EMOJI_PICKER_MAX_HEIGHT = 560;
|
|
40
|
+
function buildPopoverStyle(palette) {
|
|
41
|
+
return {
|
|
42
|
+
position: 'absolute',
|
|
43
|
+
zIndex: 100,
|
|
44
|
+
background: palette.bg,
|
|
45
|
+
border: `1px solid ${palette.border}`,
|
|
46
|
+
borderRadius: 6,
|
|
47
|
+
// Dark mode needs a deeper shadow than the light palette uses,
|
|
48
|
+
// because the popover sits on a dark surface where a soft 15%
|
|
49
|
+
// shadow effectively disappears.
|
|
50
|
+
boxShadow: palette === DARK_PALETTE ? '0 8px 32px rgba(0, 0, 0, 0.5)' : '0 6px 24px rgba(0, 0, 0, 0.15)',
|
|
51
|
+
color: palette.text,
|
|
52
|
+
width: EMOJI_PICKER_WIDTH,
|
|
53
|
+
maxWidth: '95vw',
|
|
54
|
+
maxHeight: EMOJI_PICKER_MAX_HEIGHT,
|
|
55
|
+
display: 'flex',
|
|
56
|
+
flexDirection: 'column',
|
|
57
|
+
overflow: 'hidden',
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export function EmojiPicker({ open, onSelect, onClose, anchorRef, className, style, theme = 'light', }) {
|
|
61
|
+
const palette = theme === 'dark' ? DARK_PALETTE : LIGHT_PALETTE;
|
|
62
|
+
const [activeCategory, setActiveCategory] = useState(PICKER_CATEGORIES[0].id);
|
|
63
|
+
const [query, setQuery] = useState('');
|
|
64
|
+
const popoverRef = useRef(null);
|
|
65
|
+
const searchInputRef = useRef(null);
|
|
66
|
+
// Focus the search box when the popover opens; reset query when it
|
|
67
|
+
// closes so the next open starts fresh.
|
|
68
|
+
useEffect(() => {
|
|
69
|
+
if (open) {
|
|
70
|
+
// Defer so the input is mounted.
|
|
71
|
+
const t = setTimeout(() => searchInputRef.current?.focus(), 0);
|
|
72
|
+
return () => clearTimeout(t);
|
|
73
|
+
}
|
|
74
|
+
setQuery('');
|
|
75
|
+
setActiveCategory(PICKER_CATEGORIES[0].id);
|
|
76
|
+
return undefined;
|
|
77
|
+
}, [open]);
|
|
78
|
+
// Close on outside click and Escape.
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (!open)
|
|
81
|
+
return;
|
|
82
|
+
const onPointerDown = (e) => {
|
|
83
|
+
const target = e.target;
|
|
84
|
+
if (!target)
|
|
85
|
+
return;
|
|
86
|
+
if (popoverRef.current?.contains(target))
|
|
87
|
+
return;
|
|
88
|
+
if (anchorRef?.current?.contains(target))
|
|
89
|
+
return;
|
|
90
|
+
onClose();
|
|
91
|
+
};
|
|
92
|
+
const onKey = (e) => {
|
|
93
|
+
if (e.key === 'Escape')
|
|
94
|
+
onClose();
|
|
95
|
+
};
|
|
96
|
+
document.addEventListener('mousedown', onPointerDown);
|
|
97
|
+
document.addEventListener('keydown', onKey);
|
|
98
|
+
return () => {
|
|
99
|
+
document.removeEventListener('mousedown', onPointerDown);
|
|
100
|
+
document.removeEventListener('keydown', onKey);
|
|
101
|
+
};
|
|
102
|
+
}, [open, onClose, anchorRef]);
|
|
103
|
+
const visibleEntries = useMemo(() => {
|
|
104
|
+
if (query.trim())
|
|
105
|
+
return searchPickerEntries(query);
|
|
106
|
+
const cat = PICKER_CATEGORIES.find((c) => c.id === activeCategory);
|
|
107
|
+
return cat ? cat.entries : [];
|
|
108
|
+
}, [query, activeCategory]);
|
|
109
|
+
if (!open)
|
|
110
|
+
return null;
|
|
111
|
+
return (_jsxs("div", { ref: popoverRef, className: `squisq-emoji-picker ${className ?? ''}`, "data-theme": theme, style: { ...buildPopoverStyle(palette), ...style }, role: "dialog", "aria-label": "Insert emoji", "data-testid": "emoji-picker", children: [_jsx("div", { style: {
|
|
112
|
+
padding: '8px 10px',
|
|
113
|
+
borderBottom: `1px solid ${palette.border}`,
|
|
114
|
+
}, children: _jsx("input", { ref: searchInputRef, type: "text", value: query, onChange: (e) => setQuery(e.target.value), placeholder: "Search emoji & icons\u2026", "aria-label": "Search emoji & icons", style: {
|
|
115
|
+
width: '100%',
|
|
116
|
+
padding: '6px 8px',
|
|
117
|
+
fontSize: 13,
|
|
118
|
+
fontFamily: 'inherit',
|
|
119
|
+
border: `1px solid ${palette.border}`,
|
|
120
|
+
borderRadius: 4,
|
|
121
|
+
background: palette.inputBg,
|
|
122
|
+
color: palette.text,
|
|
123
|
+
boxSizing: 'border-box',
|
|
124
|
+
} }) }), !query.trim() && (_jsx("div", { role: "tablist", "aria-label": "Emoji & icon categories", style: {
|
|
125
|
+
display: 'grid',
|
|
126
|
+
gridTemplateColumns: 'repeat(6, 1fr)',
|
|
127
|
+
gap: 2,
|
|
128
|
+
padding: '4px 6px',
|
|
129
|
+
borderBottom: `1px solid ${palette.border}`,
|
|
130
|
+
}, children: PICKER_CATEGORIES.map((cat) => {
|
|
131
|
+
const active = cat.id === activeCategory;
|
|
132
|
+
return (_jsx("button", { type: "button", role: "tab", "aria-selected": active, "aria-label": cat.label, title: cat.label, onClick: () => setActiveCategory(cat.id), style: {
|
|
133
|
+
fontSize: 18,
|
|
134
|
+
lineHeight: 1,
|
|
135
|
+
padding: '6px 0',
|
|
136
|
+
cursor: 'pointer',
|
|
137
|
+
background: active ? palette.accentSoft : 'transparent',
|
|
138
|
+
border: '1px solid transparent',
|
|
139
|
+
borderBottom: active ? `2px solid ${palette.accent}` : '2px solid transparent',
|
|
140
|
+
borderRadius: 4,
|
|
141
|
+
color: palette.text,
|
|
142
|
+
display: 'flex',
|
|
143
|
+
alignItems: 'center',
|
|
144
|
+
justifyContent: 'center',
|
|
145
|
+
}, children: cat.tab.kind === 'emoji' ? (cat.tab.char) : (_jsx("i", { className: `fa-${cat.tab.family} fa-${cat.tab.name}`, "aria-hidden": "true" })) }, cat.id));
|
|
146
|
+
}) })), _jsx("div", { style: {
|
|
147
|
+
padding: 6,
|
|
148
|
+
flex: 1,
|
|
149
|
+
minHeight: 0,
|
|
150
|
+
overflowY: 'auto',
|
|
151
|
+
display: 'grid',
|
|
152
|
+
gridTemplateColumns: 'repeat(10, 1fr)',
|
|
153
|
+
gap: 2,
|
|
154
|
+
}, children: visibleEntries.length === 0 ? (_jsx("div", { style: {
|
|
155
|
+
gridColumn: '1 / -1',
|
|
156
|
+
padding: '20px 8px',
|
|
157
|
+
textAlign: 'center',
|
|
158
|
+
color: palette.textMuted,
|
|
159
|
+
fontSize: 13,
|
|
160
|
+
}, children: query.trim() ? `No matches for "${query.trim()}"` : 'No entries' })) : (visibleEntries.map((entry, idx) => {
|
|
161
|
+
const tooltip = entry.kind === 'emoji' ? entry.name : entry.label;
|
|
162
|
+
const key = entry.kind === 'emoji' ? `e-${entry.char}-${idx}` : `i-${entry.token}-${idx}`;
|
|
163
|
+
return (_jsx("button", { type: "button", title: tooltip, "aria-label": tooltip, "data-picker-kind": entry.kind, onClick: () => onSelect(entry), style: {
|
|
164
|
+
fontSize: 22,
|
|
165
|
+
lineHeight: 1,
|
|
166
|
+
padding: 4,
|
|
167
|
+
background: 'transparent',
|
|
168
|
+
border: '1px solid transparent',
|
|
169
|
+
borderRadius: 4,
|
|
170
|
+
cursor: 'pointer',
|
|
171
|
+
color: palette.text,
|
|
172
|
+
display: 'flex',
|
|
173
|
+
alignItems: 'center',
|
|
174
|
+
justifyContent: 'center',
|
|
175
|
+
}, onMouseEnter: (e) => {
|
|
176
|
+
e.currentTarget.style.background = palette.accentSoft;
|
|
177
|
+
}, onMouseLeave: (e) => {
|
|
178
|
+
e.currentTarget.style.background = 'transparent';
|
|
179
|
+
}, children: entry.kind === 'emoji' ? (entry.char) : (_jsx("i", { className: `fa-${entry.family} fa-${entry.name}`, "aria-hidden": "true" })) }, key));
|
|
180
|
+
})) })] }));
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=EmojiPicker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EmojiPicker.js","sourceRoot":"","sources":["../src/EmojiPicker.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ImageEditor — top-level shell that wires together the toolbar,
|
|
3
|
+
* canvas surface, layers panel, and properties panel against an
|
|
4
|
+
* `ImageEditDoc` persisted in a sidecar `ContentContainer`.
|
|
5
|
+
*
|
|
6
|
+
* Hosts pass an already-scoped container (typically built with
|
|
7
|
+
* `scopeContainer(parent, basename + '_files')`). On first mount, if
|
|
8
|
+
* the sidecar has no `state.json`, the editor seeds it from
|
|
9
|
+
* `initialSrc` — the source bytes are copied to `assets/source.<ext>`
|
|
10
|
+
* so the doc is portable and round-trips through ZIP serialization.
|
|
11
|
+
*
|
|
12
|
+
* The export pipeline is `state.json` → SVG → raster blob via
|
|
13
|
+
* `exportImageEditDoc` from `@bendyline/squisq/imageEdit`.
|
|
14
|
+
*/
|
|
15
|
+
import type { ContentContainer } from '@bendyline/squisq/storage';
|
|
16
|
+
import { type ImageEditExportFormat } from '@bendyline/squisq/imageEdit';
|
|
17
|
+
import type { SurfaceScheme, Theme } from '@bendyline/squisq/schemas';
|
|
18
|
+
export interface ImageEditorProps {
|
|
19
|
+
/**
|
|
20
|
+
* Scoped sidecar container for this image — typically
|
|
21
|
+
* `scopeContainer(parent, basename + '_files')`.
|
|
22
|
+
*/
|
|
23
|
+
filesContainer: ContentContainer;
|
|
24
|
+
/**
|
|
25
|
+
* Source URL used to seed `assets/source.<ext>` and layer 0 the
|
|
26
|
+
* first time the sidecar is opened. Ignored once `state.json` exists.
|
|
27
|
+
*/
|
|
28
|
+
initialSrc?: string;
|
|
29
|
+
/** Override the state filename. Default: `state.json`. */
|
|
30
|
+
stateFilename?: string;
|
|
31
|
+
/** Enable version-history snapshots in `.versions/`. Default: `false`. */
|
|
32
|
+
allowVersioning?: boolean;
|
|
33
|
+
/** Auto-save idle delay (ms) for version snapshots. Default: `5000`. */
|
|
34
|
+
versioningAutoSaveIdleMs?: number;
|
|
35
|
+
/** Called after the user clicks Export and the blob is produced. */
|
|
36
|
+
onExport?: (blob: Blob, format: ImageEditExportFormat) => void;
|
|
37
|
+
/**
|
|
38
|
+
* What the toolbar's Save button does:
|
|
39
|
+
* - `'flush'` (default): write `state.json` to the sidecar.
|
|
40
|
+
* - `'export'`: rasterize the canvas in `saveFormat` and fire
|
|
41
|
+
* {@link onExport} — the same code path the Export menu uses.
|
|
42
|
+
* Hosts that want one-click "save and close" semantics use this.
|
|
43
|
+
*/
|
|
44
|
+
saveBehavior?: 'flush' | 'export';
|
|
45
|
+
/** Format used when `saveBehavior === 'export'`. Default: `'png'`. */
|
|
46
|
+
saveFormat?: ImageEditExportFormat;
|
|
47
|
+
/** Override the Save button label. Default: `'Save'`. */
|
|
48
|
+
saveLabel?: string;
|
|
49
|
+
/** Override the Save button tooltip. */
|
|
50
|
+
saveTitle?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Squisq Theme to color the editor chrome (toolbar, panels, controls).
|
|
53
|
+
* Defaults to `DEFAULT_THEME`. Combined with {@link surface} the same
|
|
54
|
+
* way `<JsonView>` and `<LinearDocView>` do.
|
|
55
|
+
*/
|
|
56
|
+
theme?: Theme;
|
|
57
|
+
/**
|
|
58
|
+
* Surface scheme — `LIGHT_SURFACE`, `DARK_SURFACE`, an explicit
|
|
59
|
+
* `SurfaceScheme` object, or `'auto'` to track the user's OS
|
|
60
|
+
* `prefers-color-scheme`. When omitted, the theme's own background is
|
|
61
|
+
* used as-is.
|
|
62
|
+
*/
|
|
63
|
+
surface?: SurfaceScheme | 'auto';
|
|
64
|
+
/** Optional className for the root element. */
|
|
65
|
+
className?: string;
|
|
66
|
+
}
|
|
67
|
+
export declare function ImageEditor(props: ImageEditorProps): import("react/jsx-runtime").JSX.Element;
|
|
68
|
+
//# sourceMappingURL=ImageEditor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ImageEditor.d.ts","sourceRoot":"","sources":["../src/ImageEditor.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAsB,KAAK,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAC7F,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAStE,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,cAAc,EAAE,gBAAgB,CAAC;IACjC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,0EAA0E;IAC1E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,wEAAwE;IACxE,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,qBAAqB,KAAK,IAAI,CAAC;IAC/D;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,sEAAsE;IACtE,UAAU,CAAC,EAAE,qBAAqB,CAAC;IACnC,yDAAyD;IACzD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;OAIG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC;IACd;;;;;OAKG;IACH,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAAC;IACjC,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,2CAyPlD"}
|