@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
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* useHeadingLayout
|
|
3
|
+
*
|
|
4
|
+
* Shared positioning hook for the editor gutters (`OutlinePanel` and
|
|
5
|
+
* `InlinePreviewGutter`). Each gutter needs to know:
|
|
6
|
+
* - where every heading sits vertically inside the wrapper
|
|
7
|
+
* - where the editor "page" edges sit horizontally
|
|
8
|
+
* - how to scroll the editor to a particular heading
|
|
9
|
+
*
|
|
10
|
+
* Two backends, picked from `EditorContext.activeView`:
|
|
11
|
+
* - **wysiwyg** — query DOM headings inside `.squisq-wysiwyg-container`,
|
|
12
|
+
* measure with `getBoundingClientRect`, scroll via `scrollIntoView`.
|
|
13
|
+
* Live updates via `ResizeObserver` + `MutationObserver`.
|
|
14
|
+
* - **raw** — walk `doc.blocks`, derive each heading's line number from
|
|
15
|
+
* `MarkdownHeading.position.start.line`, ask Monaco for the line's
|
|
16
|
+
* pixel offset via `getTopForLineNumber`, scroll via
|
|
17
|
+
* `revealLineInCenterIfOutsideViewport` + `setPosition`. Live updates
|
|
18
|
+
* via `onDidScrollChange` + `onDidChangeModelContent`.
|
|
19
|
+
*
|
|
20
|
+
* Both backends produce coordinates in the *wrapper's* reference frame
|
|
21
|
+
* (i.e., `.squisq-editor-with-gutter`), so the rendering layers — cards,
|
|
22
|
+
* extent bars, outline rows — don't care which editor is active.
|
|
23
|
+
*/
|
|
24
|
+
import { useCallback, useEffect, useMemo, useState } from 'react';
|
|
25
|
+
import { flattenBlocks, hasTemplate } from '@bendyline/squisq/doc';
|
|
26
|
+
import { useEditorContext } from './EditorContext';
|
|
27
|
+
/**
|
|
28
|
+
* @param refInsideWrapper — any DOM ref under `.squisq-editor-with-gutter`.
|
|
29
|
+
* The hook walks up to find the wrapper.
|
|
30
|
+
*/
|
|
31
|
+
export function useHeadingLayout(refInsideWrapper) {
|
|
32
|
+
const { doc, activeView, monacoEditor, tiptapEditor } = useEditorContext();
|
|
33
|
+
const flatBlocks = useMemo(() => (doc ? flattenBlocks(doc.blocks) : []), [doc]);
|
|
34
|
+
const [entries, setEntries] = useState([]);
|
|
35
|
+
const [pageEdges, setPageEdges] = useState(null);
|
|
36
|
+
// ── WYSIWYG backend ────────────────────────────────────────────────
|
|
37
|
+
useEffect(() => {
|
|
38
|
+
if (activeView !== 'wysiwyg')
|
|
39
|
+
return;
|
|
40
|
+
const node = refInsideWrapper.current;
|
|
41
|
+
if (!node)
|
|
42
|
+
return;
|
|
43
|
+
const wrapper = findWrapper(node);
|
|
44
|
+
if (!wrapper)
|
|
45
|
+
return;
|
|
46
|
+
const wysiwygContainer = wrapper.querySelector('.squisq-wysiwyg-container');
|
|
47
|
+
if (!wysiwygContainer)
|
|
48
|
+
return;
|
|
49
|
+
let raf = 0;
|
|
50
|
+
const recompute = () => {
|
|
51
|
+
cancelAnimationFrame(raf);
|
|
52
|
+
raf = requestAnimationFrame(() => {
|
|
53
|
+
const headings = Array.from(wysiwygContainer.querySelectorAll('h1, h2, h3, h4, h5, h6'));
|
|
54
|
+
const wrapperRect = wrapper.getBoundingClientRect();
|
|
55
|
+
const editorRect = wysiwygContainer.getBoundingClientRect();
|
|
56
|
+
const next = [];
|
|
57
|
+
flatBlocks.forEach((block, i) => {
|
|
58
|
+
const h = headings[i];
|
|
59
|
+
if (!h)
|
|
60
|
+
return;
|
|
61
|
+
const top = h.getBoundingClientRect().top - wrapperRect.top;
|
|
62
|
+
const nextH = headings[i + 1];
|
|
63
|
+
const bottom = nextH
|
|
64
|
+
? nextH.getBoundingClientRect().top - wrapperRect.top
|
|
65
|
+
: editorRect.bottom - wrapperRect.top;
|
|
66
|
+
next.push({
|
|
67
|
+
block,
|
|
68
|
+
top,
|
|
69
|
+
bottom,
|
|
70
|
+
annotated: !!h.getAttribute('data-template'),
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
setEntries((prev) => (sameEntries(prev, next) ? prev : next));
|
|
74
|
+
// Page edges — anchor to the .squisq-wysiwyg-editor (the centered "page").
|
|
75
|
+
const page = wysiwygContainer.querySelector('.squisq-wysiwyg-editor');
|
|
76
|
+
if (page) {
|
|
77
|
+
const pageRect = page.getBoundingClientRect();
|
|
78
|
+
const left = pageRect.left - wrapperRect.left;
|
|
79
|
+
const right = pageRect.right - wrapperRect.left;
|
|
80
|
+
setPageEdges((prev) => prev != null && Math.abs(prev.left - left) < 0.5 && Math.abs(prev.right - right) < 0.5
|
|
81
|
+
? prev
|
|
82
|
+
: { left, right });
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
};
|
|
86
|
+
recompute();
|
|
87
|
+
const ro = new ResizeObserver(recompute);
|
|
88
|
+
ro.observe(wysiwygContainer);
|
|
89
|
+
const editorSurface = wysiwygContainer.querySelector('.squisq-wysiwyg-editor');
|
|
90
|
+
if (editorSurface)
|
|
91
|
+
ro.observe(editorSurface);
|
|
92
|
+
const mo = new MutationObserver(recompute);
|
|
93
|
+
mo.observe(wysiwygContainer, {
|
|
94
|
+
childList: true,
|
|
95
|
+
subtree: true,
|
|
96
|
+
characterData: true,
|
|
97
|
+
attributes: true,
|
|
98
|
+
attributeFilter: ['data-template', 'data-template-params'],
|
|
99
|
+
});
|
|
100
|
+
wysiwygContainer.addEventListener('scroll', recompute, { passive: true });
|
|
101
|
+
window.addEventListener('resize', recompute);
|
|
102
|
+
const settle = window.setTimeout(recompute, 250);
|
|
103
|
+
return () => {
|
|
104
|
+
cancelAnimationFrame(raf);
|
|
105
|
+
window.clearTimeout(settle);
|
|
106
|
+
ro.disconnect();
|
|
107
|
+
mo.disconnect();
|
|
108
|
+
wysiwygContainer.removeEventListener('scroll', recompute);
|
|
109
|
+
window.removeEventListener('resize', recompute);
|
|
110
|
+
};
|
|
111
|
+
}, [activeView, flatBlocks, refInsideWrapper]);
|
|
112
|
+
// ── Raw (Monaco) backend ───────────────────────────────────────────
|
|
113
|
+
useEffect(() => {
|
|
114
|
+
if (activeView !== 'raw')
|
|
115
|
+
return;
|
|
116
|
+
if (!monacoEditor)
|
|
117
|
+
return;
|
|
118
|
+
const node = refInsideWrapper.current;
|
|
119
|
+
if (!node)
|
|
120
|
+
return;
|
|
121
|
+
const wrapper = findWrapper(node);
|
|
122
|
+
if (!wrapper)
|
|
123
|
+
return;
|
|
124
|
+
let raf = 0;
|
|
125
|
+
const recompute = () => {
|
|
126
|
+
cancelAnimationFrame(raf);
|
|
127
|
+
raf = requestAnimationFrame(() => {
|
|
128
|
+
const wrapperRect = wrapper.getBoundingClientRect();
|
|
129
|
+
const monacoRoot = monacoEditor.getDomNode();
|
|
130
|
+
if (!monacoRoot)
|
|
131
|
+
return;
|
|
132
|
+
const monacoRect = monacoRoot.getBoundingClientRect();
|
|
133
|
+
// Y of the editor's content top in wrapper coordinates.
|
|
134
|
+
const monacoTop = monacoRect.top - wrapperRect.top;
|
|
135
|
+
const scrollTop = monacoEditor.getScrollTop();
|
|
136
|
+
const layoutInfo = monacoEditor.getLayoutInfo();
|
|
137
|
+
const next = [];
|
|
138
|
+
flatBlocks.forEach((block, i) => {
|
|
139
|
+
const line = block.sourceHeading?.position?.start.line;
|
|
140
|
+
if (typeof line !== 'number')
|
|
141
|
+
return;
|
|
142
|
+
const lineTop = monacoEditor.getTopForLineNumber(line) - scrollTop + monacoTop;
|
|
143
|
+
// Bottom = next block's top, or the visible bottom of the editor.
|
|
144
|
+
const nextBlock = flatBlocks[i + 1];
|
|
145
|
+
const nextLine = nextBlock?.sourceHeading?.position?.start.line;
|
|
146
|
+
const bottom = typeof nextLine === 'number'
|
|
147
|
+
? monacoEditor.getTopForLineNumber(nextLine) - scrollTop + monacoTop
|
|
148
|
+
: monacoTop + layoutInfo.height;
|
|
149
|
+
const tplName = block.sourceHeading?.templateAnnotation?.template;
|
|
150
|
+
next.push({
|
|
151
|
+
block,
|
|
152
|
+
top: lineTop,
|
|
153
|
+
bottom,
|
|
154
|
+
annotated: !!tplName && hasTemplate(tplName),
|
|
155
|
+
});
|
|
156
|
+
});
|
|
157
|
+
setEntries((prev) => (sameEntries(prev, next) ? prev : next));
|
|
158
|
+
// Page edges — Monaco's editor area extends to its container's
|
|
159
|
+
// box edges; treat the whole editor as the "page".
|
|
160
|
+
const left = monacoRect.left - wrapperRect.left;
|
|
161
|
+
const right = monacoRect.right - wrapperRect.left;
|
|
162
|
+
setPageEdges((prev) => prev != null && Math.abs(prev.left - left) < 0.5 && Math.abs(prev.right - right) < 0.5
|
|
163
|
+
? prev
|
|
164
|
+
: { left, right });
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
recompute();
|
|
168
|
+
const scrollSub = monacoEditor.onDidScrollChange(recompute);
|
|
169
|
+
const contentSub = monacoEditor.onDidChangeModelContent(recompute);
|
|
170
|
+
const layoutSub = monacoEditor.onDidLayoutChange(recompute);
|
|
171
|
+
const ro = new ResizeObserver(recompute);
|
|
172
|
+
const monacoRoot = monacoEditor.getDomNode();
|
|
173
|
+
if (monacoRoot)
|
|
174
|
+
ro.observe(monacoRoot);
|
|
175
|
+
window.addEventListener('resize', recompute);
|
|
176
|
+
const settle = window.setTimeout(recompute, 250);
|
|
177
|
+
return () => {
|
|
178
|
+
cancelAnimationFrame(raf);
|
|
179
|
+
window.clearTimeout(settle);
|
|
180
|
+
scrollSub.dispose();
|
|
181
|
+
contentSub.dispose();
|
|
182
|
+
layoutSub.dispose();
|
|
183
|
+
ro.disconnect();
|
|
184
|
+
window.removeEventListener('resize', recompute);
|
|
185
|
+
};
|
|
186
|
+
}, [activeView, monacoEditor, flatBlocks, refInsideWrapper]);
|
|
187
|
+
// Reset edges when the active view changes — the previous view's
|
|
188
|
+
// measurements don't carry over to the next.
|
|
189
|
+
useEffect(() => {
|
|
190
|
+
setEntries([]);
|
|
191
|
+
setPageEdges(null);
|
|
192
|
+
}, [activeView]);
|
|
193
|
+
// ── scrollToBlock ──────────────────────────────────────────────────
|
|
194
|
+
const scrollToBlock = useCallback((block) => {
|
|
195
|
+
if (activeView === 'wysiwyg') {
|
|
196
|
+
const node = refInsideWrapper.current;
|
|
197
|
+
const wrapper = node ? findWrapper(node) : null;
|
|
198
|
+
const wysiwygContainer = wrapper?.querySelector('.squisq-wysiwyg-container');
|
|
199
|
+
if (!wysiwygContainer)
|
|
200
|
+
return;
|
|
201
|
+
const headings = wysiwygContainer.querySelectorAll('h1, h2, h3, h4, h5, h6');
|
|
202
|
+
const index = flatBlocks.findIndex((b) => b.id === block.id);
|
|
203
|
+
if (index < 0 || index >= headings.length)
|
|
204
|
+
return;
|
|
205
|
+
headings[index].scrollIntoView({ behavior: 'smooth', block: 'start' });
|
|
206
|
+
if (tiptapEditor) {
|
|
207
|
+
try {
|
|
208
|
+
tiptapEditor.chain().focus().run();
|
|
209
|
+
}
|
|
210
|
+
catch {
|
|
211
|
+
// ignore
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
if (activeView === 'raw' && monacoEditor) {
|
|
217
|
+
const line = block.sourceHeading?.position?.start.line;
|
|
218
|
+
if (typeof line !== 'number')
|
|
219
|
+
return;
|
|
220
|
+
monacoEditor.revealLineInCenter(line);
|
|
221
|
+
monacoEditor.setPosition({ lineNumber: line, column: 1 });
|
|
222
|
+
monacoEditor.focus();
|
|
223
|
+
}
|
|
224
|
+
}, [activeView, flatBlocks, monacoEditor, refInsideWrapper, tiptapEditor]);
|
|
225
|
+
return {
|
|
226
|
+
entries,
|
|
227
|
+
pageEdges,
|
|
228
|
+
scrollToBlock,
|
|
229
|
+
ready: entries.length > 0 || pageEdges != null,
|
|
230
|
+
};
|
|
231
|
+
}
|
|
232
|
+
// ── Helpers ────────────────────────────────────────────────────────
|
|
233
|
+
function findWrapper(node) {
|
|
234
|
+
let cur = node.parentElement;
|
|
235
|
+
while (cur) {
|
|
236
|
+
if (cur.classList.contains('squisq-editor-with-gutter'))
|
|
237
|
+
return cur;
|
|
238
|
+
cur = cur.parentElement;
|
|
239
|
+
}
|
|
240
|
+
// Fallback: immediate parent (during transitional renames).
|
|
241
|
+
return node.parentElement;
|
|
242
|
+
}
|
|
243
|
+
function sameEntries(a, b) {
|
|
244
|
+
if (a.length !== b.length)
|
|
245
|
+
return false;
|
|
246
|
+
for (let i = 0; i < a.length; i++) {
|
|
247
|
+
const x = a[i];
|
|
248
|
+
const y = b[i];
|
|
249
|
+
if (x.block.id !== y.block.id)
|
|
250
|
+
return false;
|
|
251
|
+
if (x.annotated !== y.annotated)
|
|
252
|
+
return false;
|
|
253
|
+
if (Math.abs(x.top - y.top) > 0.5)
|
|
254
|
+
return false;
|
|
255
|
+
if (Math.abs(x.bottom - y.bottom) > 0.5)
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
//# sourceMappingURL=useHeadingLayout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useHeadingLayout.js","sourceRoot":"","sources":["../src/useHeadingLayout.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collect FontAwesome `@font-face` + utility CSS rules from the host
|
|
3
|
+
* document's loaded stylesheets so we can inline them into a sandboxed
|
|
4
|
+
* iframe preview.
|
|
5
|
+
*
|
|
6
|
+
* Why: an iframe rendered via `srcDoc` cannot reliably load
|
|
7
|
+
* FontAwesome from a cross-origin CDN. Tracking prevention, stricter
|
|
8
|
+
* origin policies, and the iframe's about:srcdoc origin all conspire
|
|
9
|
+
* to silently drop font fetches. The icons end up invisible even
|
|
10
|
+
* though the `<i class="fa-…">` tags are present in the markup. The
|
|
11
|
+
* host page (editor-react ships a bundled `@import` of
|
|
12
|
+
* `@fortawesome/fontawesome-free`) already has the font loaded and its
|
|
13
|
+
* woff2 URLs resolve to same-origin assets, so we extract those rules
|
|
14
|
+
* once and pass them into the renderer as inline CSS.
|
|
15
|
+
*
|
|
16
|
+
* Returns `undefined` when no FA rules are found — typical for SSR or
|
|
17
|
+
* for hosts that don't bundle FA — in which case the renderer falls
|
|
18
|
+
* back to its cdnjs `<link>` (still works in plain standalone HTML).
|
|
19
|
+
*/
|
|
20
|
+
export declare function collectInlineFontAwesomeCss(): string | undefined;
|
|
21
|
+
//# sourceMappingURL=collectInlineFontAwesomeCss.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectInlineFontAwesomeCss.d.ts","sourceRoot":"","sources":["../../src/utils/collectInlineFontAwesomeCss.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,GAAG,SAAS,CAyBhE"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collect FontAwesome `@font-face` + utility CSS rules from the host
|
|
3
|
+
* document's loaded stylesheets so we can inline them into a sandboxed
|
|
4
|
+
* iframe preview.
|
|
5
|
+
*
|
|
6
|
+
* Why: an iframe rendered via `srcDoc` cannot reliably load
|
|
7
|
+
* FontAwesome from a cross-origin CDN. Tracking prevention, stricter
|
|
8
|
+
* origin policies, and the iframe's about:srcdoc origin all conspire
|
|
9
|
+
* to silently drop font fetches. The icons end up invisible even
|
|
10
|
+
* though the `<i class="fa-…">` tags are present in the markup. The
|
|
11
|
+
* host page (editor-react ships a bundled `@import` of
|
|
12
|
+
* `@fortawesome/fontawesome-free`) already has the font loaded and its
|
|
13
|
+
* woff2 URLs resolve to same-origin assets, so we extract those rules
|
|
14
|
+
* once and pass them into the renderer as inline CSS.
|
|
15
|
+
*
|
|
16
|
+
* Returns `undefined` when no FA rules are found — typical for SSR or
|
|
17
|
+
* for hosts that don't bundle FA — in which case the renderer falls
|
|
18
|
+
* back to its cdnjs `<link>` (still works in plain standalone HTML).
|
|
19
|
+
*/
|
|
20
|
+
export function collectInlineFontAwesomeCss() {
|
|
21
|
+
if (typeof document === 'undefined')
|
|
22
|
+
return undefined;
|
|
23
|
+
const collected = [];
|
|
24
|
+
for (const sheet of Array.from(document.styleSheets)) {
|
|
25
|
+
let rules = null;
|
|
26
|
+
try {
|
|
27
|
+
rules = sheet.cssRules;
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
// Cross-origin stylesheets throw on `.cssRules` access. We can't
|
|
31
|
+
// read them, but they're also not where editor-react's bundled
|
|
32
|
+
// FA lives, so it's safe to skip them.
|
|
33
|
+
continue;
|
|
34
|
+
}
|
|
35
|
+
if (!rules)
|
|
36
|
+
continue;
|
|
37
|
+
for (const rule of Array.from(rules)) {
|
|
38
|
+
if (isFontAwesomeRule(rule)) {
|
|
39
|
+
collected.push(rule.cssText);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return collected.length > 0 ? collected.join('\n') : undefined;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Match `@font-face` declarations whose family starts with
|
|
47
|
+
* "Font Awesome", plus the FA utility classes (the `.fa-*` rules that
|
|
48
|
+
* set `content: "\fXXX"` and font-family). The former gets the woff2
|
|
49
|
+
* loaded into the iframe, the latter wires the `<i>` markup to it.
|
|
50
|
+
*/
|
|
51
|
+
function isFontAwesomeRule(rule) {
|
|
52
|
+
const text = rule.cssText;
|
|
53
|
+
// `@font-face { font-family: "Font Awesome 6 Brands"; … }`
|
|
54
|
+
if (rule.type === CSSRule.FONT_FACE_RULE) {
|
|
55
|
+
return /font-family:\s*['"]?Font Awesome/i.test(text);
|
|
56
|
+
}
|
|
57
|
+
// `.fa-github::before { content: "\f09b"; }` and the base
|
|
58
|
+
// `.fa-brands { font-family: "Font Awesome 6 Brands"; … }` rules.
|
|
59
|
+
// FA's stylesheet prefixes selectors with `.fa`, `.fas`, `.far`,
|
|
60
|
+
// `.fab`, `.fa-solid`, `.fa-regular`, `.fa-brands`. Match the
|
|
61
|
+
// family name in the declaration block to avoid false positives
|
|
62
|
+
// (e.g. someone else's `.fa-…` class that doesn't use the font).
|
|
63
|
+
if (rule.type === CSSRule.STYLE_RULE) {
|
|
64
|
+
return /Font Awesome/i.test(text) || /content:\s*["']\\[ef]/.test(text);
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=collectInlineFontAwesomeCss.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collectInlineFontAwesomeCss.js","sourceRoot":"","sources":["../../src/utils/collectInlineFontAwesomeCss.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,2BAA2B;IACzC,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IAEtD,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACrD,IAAI,KAAK,GAAuB,IAAI,CAAC;QACrC,IAAI,CAAC;YACH,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;YACjE,+DAA+D;YAC/D,uCAAuC;YACvC,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,IAAa;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;IAC1B,2DAA2D;IAC3D,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC;QACzC,OAAO,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,0DAA0D;IAC1D,kEAAkE;IAClE,iEAAiE;IACjE,8DAA8D;IAC9D,gEAAgE;IAChE,iEAAiE;IACjE,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC;QACrC,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -19,9 +19,28 @@ export declare function partitionFiles(files: File[]): {
|
|
|
19
19
|
};
|
|
20
20
|
/**
|
|
21
21
|
* Add media files to a MediaProvider. Returns the relative paths
|
|
22
|
-
* assigned by the provider
|
|
22
|
+
* assigned by the provider, with `null` slots where a file could not
|
|
23
|
+
* be processed — keeping the result aligned with the input array so
|
|
24
|
+
* callers can correlate indices.
|
|
25
|
+
*
|
|
26
|
+
* Two failure modes are handled defensively:
|
|
27
|
+
*
|
|
28
|
+
* 1. `file.arrayBuffer()` throws (`InvalidStateError` — "An operation
|
|
29
|
+
* that depends on state cached in an interface object was made but
|
|
30
|
+
* the state had changed since it was read from disk"). This happens
|
|
31
|
+
* with virtual drag sources whose File reference goes stale before
|
|
32
|
+
* the async read completes — Phone Link / iOS continuity / certain
|
|
33
|
+
* screenshot tools / etc.
|
|
34
|
+
*
|
|
35
|
+
* 2. `file.arrayBuffer()` returns a 0-byte buffer. Some virtual
|
|
36
|
+
* sources resolve the read successfully but with no payload,
|
|
37
|
+
* leaving an empty file in the media bin. We skip those so the
|
|
38
|
+
* bin doesn't accumulate placeholders.
|
|
39
|
+
*
|
|
40
|
+
* In both cases we warn via console rather than throwing, so a single
|
|
41
|
+
* problematic file doesn't abort a multi-file drop.
|
|
23
42
|
*/
|
|
24
|
-
export declare function processMediaFiles(files: File[], mediaProvider: MediaProvider): Promise<string[]>;
|
|
43
|
+
export declare function processMediaFiles(files: File[], mediaProvider: MediaProvider): Promise<(string | null)[]>;
|
|
25
44
|
/**
|
|
26
45
|
* Read a text-content file and return its content as a markdown string.
|
|
27
46
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropUtils.d.ts","sourceRoot":"","sources":["../../src/utils/dropUtils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEvE,YAAY,EAAE,YAAY,EAAE,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,IAAI,EAAE,IAAI,EAAE,CAAA;CAAE,CAW7E;AAED
|
|
1
|
+
{"version":3,"file":"dropUtils.d.ts","sourceRoot":"","sources":["../../src/utils/dropUtils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEvE,YAAY,EAAE,YAAY,EAAE,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,IAAI,EAAE,IAAI,EAAE,CAAA;CAAE,CAW7E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,IAAI,EAAE,EACb,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAwC5B;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAcjE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CASrE"}
|
package/dist/utils/dropUtils.js
CHANGED
|
@@ -27,15 +27,54 @@ export function partitionFiles(files) {
|
|
|
27
27
|
}
|
|
28
28
|
/**
|
|
29
29
|
* Add media files to a MediaProvider. Returns the relative paths
|
|
30
|
-
* assigned by the provider
|
|
30
|
+
* assigned by the provider, with `null` slots where a file could not
|
|
31
|
+
* be processed — keeping the result aligned with the input array so
|
|
32
|
+
* callers can correlate indices.
|
|
33
|
+
*
|
|
34
|
+
* Two failure modes are handled defensively:
|
|
35
|
+
*
|
|
36
|
+
* 1. `file.arrayBuffer()` throws (`InvalidStateError` — "An operation
|
|
37
|
+
* that depends on state cached in an interface object was made but
|
|
38
|
+
* the state had changed since it was read from disk"). This happens
|
|
39
|
+
* with virtual drag sources whose File reference goes stale before
|
|
40
|
+
* the async read completes — Phone Link / iOS continuity / certain
|
|
41
|
+
* screenshot tools / etc.
|
|
42
|
+
*
|
|
43
|
+
* 2. `file.arrayBuffer()` returns a 0-byte buffer. Some virtual
|
|
44
|
+
* sources resolve the read successfully but with no payload,
|
|
45
|
+
* leaving an empty file in the media bin. We skip those so the
|
|
46
|
+
* bin doesn't accumulate placeholders.
|
|
47
|
+
*
|
|
48
|
+
* In both cases we warn via console rather than throwing, so a single
|
|
49
|
+
* problematic file doesn't abort a multi-file drop.
|
|
31
50
|
*/
|
|
32
51
|
export async function processMediaFiles(files, mediaProvider) {
|
|
33
52
|
const paths = [];
|
|
34
53
|
for (const file of files) {
|
|
35
|
-
|
|
54
|
+
let buffer;
|
|
55
|
+
try {
|
|
56
|
+
buffer = await file.arrayBuffer();
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
console.warn(`[squisq-editor] Skipped dropped file "${file.name}" — could not read its contents.`, 'This is typical for drags from virtual sources (Phone Link, screenshot tools, cross-tab drags) whose File reference goes stale before the async read completes.', err instanceof Error ? err.message : err);
|
|
60
|
+
paths.push(null);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (buffer.byteLength === 0) {
|
|
64
|
+
console.warn(`[squisq-editor] Skipped dropped file "${file.name}" — its contents read as 0 bytes. ` +
|
|
65
|
+
'The drag source likely never materialized the file (try saving it to disk first, then dragging from there).');
|
|
66
|
+
paths.push(null);
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
36
69
|
const mimeType = file.type || 'application/octet-stream';
|
|
37
|
-
|
|
38
|
-
|
|
70
|
+
try {
|
|
71
|
+
const path = await mediaProvider.addMedia(file.name, buffer, mimeType);
|
|
72
|
+
paths.push(path);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
console.warn(`[squisq-editor] Failed to save "${file.name}" via mediaProvider:`, err instanceof Error ? err.message : err);
|
|
76
|
+
paths.push(null);
|
|
77
|
+
}
|
|
39
78
|
}
|
|
40
79
|
return paths;
|
|
41
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropUtils.js","sourceRoot":"","sources":["../../src/utils/dropUtils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAqB,MAAM,sBAAsB,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,IAAI,GAAW,EAAE,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,GAAG,KAAK,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACjC,IAAI,GAAG,KAAK,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED
|
|
1
|
+
{"version":3,"file":"dropUtils.js","sourceRoot":"","sources":["../../src/utils/dropUtils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect image URLs that were malformed by an MS "Save Page As Web Page" /
|
|
3
|
+
* pandoc import: a relative path like `mikehome_files/foo.png` gets
|
|
4
|
+
* `http://` prepended somewhere upstream, so the URL parser interprets
|
|
5
|
+
* `mikehome_files` as a hostname. The browser then either fails to load
|
|
6
|
+
* the image or has it blocked by CSP.
|
|
7
|
+
*
|
|
8
|
+
* Heuristic: hostname has no dots and no port, and ends in `_files` —
|
|
9
|
+
* that's the Word-style asset-folder naming convention, not a real host.
|
|
10
|
+
*
|
|
11
|
+
* Returns the recovered relative path (e.g. `mikehome_files/foo.png`)
|
|
12
|
+
* when the shape matches, or `null` otherwise.
|
|
13
|
+
*/
|
|
14
|
+
export declare function normalizeMalformedAssetUrl(src: string | null | undefined): string | null;
|
|
15
|
+
//# sourceMappingURL=normalizeMalformedAssetUrl.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeMalformedAssetUrl.d.ts","sourceRoot":"","sources":["../../src/utils/normalizeMalformedAssetUrl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAQxF"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detect image URLs that were malformed by an MS "Save Page As Web Page" /
|
|
3
|
+
* pandoc import: a relative path like `mikehome_files/foo.png` gets
|
|
4
|
+
* `http://` prepended somewhere upstream, so the URL parser interprets
|
|
5
|
+
* `mikehome_files` as a hostname. The browser then either fails to load
|
|
6
|
+
* the image or has it blocked by CSP.
|
|
7
|
+
*
|
|
8
|
+
* Heuristic: hostname has no dots and no port, and ends in `_files` —
|
|
9
|
+
* that's the Word-style asset-folder naming convention, not a real host.
|
|
10
|
+
*
|
|
11
|
+
* Returns the recovered relative path (e.g. `mikehome_files/foo.png`)
|
|
12
|
+
* when the shape matches, or `null` otherwise.
|
|
13
|
+
*/
|
|
14
|
+
export function normalizeMalformedAssetUrl(src) {
|
|
15
|
+
if (!src)
|
|
16
|
+
return null;
|
|
17
|
+
const match = src.match(/^https?:\/\/([^/?#]+)\/(.+)$/i);
|
|
18
|
+
if (!match)
|
|
19
|
+
return null;
|
|
20
|
+
const [, host, rest] = match;
|
|
21
|
+
if (host.includes('.') || host.includes(':'))
|
|
22
|
+
return null;
|
|
23
|
+
if (!host.toLowerCase().endsWith('_files'))
|
|
24
|
+
return null;
|
|
25
|
+
return `${host}/${rest}`;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=normalizeMalformedAssetUrl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalizeMalformedAssetUrl.js","sourceRoot":"","sources":["../../src/utils/normalizeMalformedAssetUrl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,0BAA0B,CAAC,GAA8B;IACvE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAC3B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bendyline/squisq-editor-react",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"description": "React editor shell with raw/WYSIWYG/preview modes for Squisq documents",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Bendyline",
|
|
@@ -34,10 +34,11 @@
|
|
|
34
34
|
"types": "./dist/index.d.ts",
|
|
35
35
|
"import": "./dist/index.js"
|
|
36
36
|
},
|
|
37
|
-
"./styles": "./src/styles/
|
|
37
|
+
"./styles": "./src/styles/index.css"
|
|
38
38
|
},
|
|
39
39
|
"scripts": {
|
|
40
40
|
"build": "tsup",
|
|
41
|
+
"dev": "concurrently -n js,dts -c blue,gray -r \"tsup --watch --no-dts --no-clean\" \"tsup --watch --dts-only --no-clean\"",
|
|
41
42
|
"typecheck": "tsc --noEmit"
|
|
42
43
|
},
|
|
43
44
|
"peerDependencies": {
|
|
@@ -46,11 +47,13 @@
|
|
|
46
47
|
"react-dom": "^18.0.0 || ^19.0.0"
|
|
47
48
|
},
|
|
48
49
|
"dependencies": {
|
|
49
|
-
"@bendyline/squisq": "1.
|
|
50
|
-
"@bendyline/squisq-formats": "1.
|
|
51
|
-
"@bendyline/squisq-react": "1.
|
|
50
|
+
"@bendyline/squisq": "1.4.0",
|
|
51
|
+
"@bendyline/squisq-formats": "1.3.0",
|
|
52
|
+
"@bendyline/squisq-react": "1.3.1",
|
|
53
|
+
"@fortawesome/fontawesome-free": "7.2.0",
|
|
52
54
|
"@monaco-editor/react": "4.7.0",
|
|
53
55
|
"@tiptap/extension-image": "2.27.2",
|
|
56
|
+
"@tiptap/extension-link": "2.27.2",
|
|
54
57
|
"@tiptap/extension-mention": "2.27.2",
|
|
55
58
|
"@tiptap/extension-placeholder": "2.27.2",
|
|
56
59
|
"@tiptap/extension-table": "2.27.2",
|