@bendyline/squisq-editor-react 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/NOTICE.md +40 -0
- package/dist/index.d.ts +188 -55
- package/dist/index.js +5094 -2948
- package/dist/monaco.js +0 -1
- package/dist/styles/index.css +234 -145
- package/package.json +9 -6
- package/dist/index.js.map +0 -1
- package/dist/monaco.js.map +0 -1
- package/src/BlockCardView.tsx +0 -121
- package/src/BlockPreviewPanel.tsx +0 -69
- package/src/BlockPropertiesPopover.tsx +0 -222
- package/src/DocumentSettingsDialog.tsx +0 -272
- package/src/DropZoneOverlay.tsx +0 -137
- package/src/EditorContext.tsx +0 -1274
- package/src/EditorShell.tsx +0 -1358
- package/src/EmojiPicker.tsx +0 -332
- package/src/FolderView.tsx +0 -131
- package/src/Icon.tsx +0 -26
- package/src/ImageEditor.tsx +0 -395
- package/src/ImageNodeView.tsx +0 -284
- package/src/ImageViewer.tsx +0 -221
- package/src/InlineIcon.ts +0 -84
- package/src/InlinePreviewGutter.tsx +0 -590
- package/src/LinkDialog.tsx +0 -276
- package/src/MediaBin.tsx +0 -500
- package/src/MentionExtension.tsx +0 -261
- package/src/OutlinePanel.tsx +0 -547
- package/src/PlainHtmlPreview.tsx +0 -277
- package/src/PreviewControls.tsx +0 -1265
- package/src/PreviewPanel.tsx +0 -426
- package/src/RawEditor.tsx +0 -743
- package/src/RecorderEntry.tsx +0 -162
- package/src/StatusBar.tsx +0 -51
- package/src/TemplateAnnotation.ts +0 -167
- package/src/TemplateContentPreview.tsx +0 -56
- package/src/TemplatePicker.tsx +0 -1314
- package/src/ThemeCustomizerPanel.tsx +0 -304
- package/src/ThemePicker.tsx +0 -433
- package/src/TimelineBlockPreview.tsx +0 -37
- package/src/TimelineTrack.tsx +0 -671
- package/src/Toolbar.tsx +0 -2885
- package/src/Tooltip.tsx +0 -142
- package/src/TransitionPicker.tsx +0 -390
- package/src/VersionHistoryPanel.tsx +0 -359
- package/src/ViewMenuPanel.tsx +0 -189
- package/src/ViewSwitcher.tsx +0 -56
- package/src/WysiwygEditor.tsx +0 -806
- package/src/__tests__/blockProperties.test.ts +0 -92
- package/src/__tests__/blockPropertiesPopoverTheme.test.tsx +0 -33
- package/src/__tests__/blockRange.test.ts +0 -105
- package/src/__tests__/blockTagActivity.test.ts +0 -183
- package/src/__tests__/buildDocumentPreviewMarkdown.test.ts +0 -75
- package/src/__tests__/buildPreviewDocContent.test.ts +0 -65
- package/src/__tests__/buildPreviewDocTransition.test.ts +0 -92
- package/src/__tests__/canvasSurfaceTextEditing.test.tsx +0 -60
- package/src/__tests__/codeContextSectionView.test.tsx +0 -97
- package/src/__tests__/codeContextZoneManager.test.ts +0 -127
- package/src/__tests__/createShapeLayer.test.ts +0 -46
- package/src/__tests__/customLayoutManagerTheme.test.tsx +0 -34
- package/src/__tests__/detectMarkdown.test.ts +0 -73
- package/src/__tests__/diffContextSections.test.ts +0 -39
- package/src/__tests__/documentSettingsDialog.test.tsx +0 -197
- package/src/__tests__/drawingShapeRoundTrip.test.ts +0 -49
- package/src/__tests__/editorScrollHandoff.test.tsx +0 -102
- package/src/__tests__/editorScrollSync.test.ts +0 -65
- package/src/__tests__/editorShellCodeContext.test.tsx +0 -86
- package/src/__tests__/editorShellProps.test.tsx +0 -550
- package/src/__tests__/embeddedMedia.test.ts +0 -48
- package/src/__tests__/emojiPicker.test.tsx +0 -93
- package/src/__tests__/fileKind.test.ts +0 -112
- package/src/__tests__/findMode.test.tsx +0 -104
- package/src/__tests__/findModel.test.ts +0 -55
- package/src/__tests__/headingTransition.test.ts +0 -176
- package/src/__tests__/imageEditAffordance.test.tsx +0 -272
- package/src/__tests__/imageEditModalContract.test.tsx +0 -119
- package/src/__tests__/imageEditorShell.test.tsx +0 -94
- package/src/__tests__/imageEditorState.test.ts +0 -171
- package/src/__tests__/inlinePreviewGutter.test.tsx +0 -62
- package/src/__tests__/inlinePreviewGutterAllBlocks.test.tsx +0 -103
- package/src/__tests__/jsonEditor.test.tsx +0 -223
- package/src/__tests__/layersPanel.test.tsx +0 -167
- package/src/__tests__/layoutChildRoundTrip.test.ts +0 -71
- package/src/__tests__/linkDialogDocPicker.test.tsx +0 -137
- package/src/__tests__/majorApiTypes.test.ts +0 -26
- package/src/__tests__/markdownCodeFence.test.ts +0 -45
- package/src/__tests__/mediaAttachmentFlow.test.ts +0 -110
- package/src/__tests__/mediaBinDrop.test.tsx +0 -90
- package/src/__tests__/mediaReferences.test.ts +0 -97
- package/src/__tests__/narrationSave.test.ts +0 -148
- package/src/__tests__/outlinePanel.test.tsx +0 -169
- package/src/__tests__/outlineSource.test.ts +0 -217
- package/src/__tests__/plainHtmlPreview.test.tsx +0 -125
- package/src/__tests__/presentationMode.test.tsx +0 -290
- package/src/__tests__/previewControls.test.tsx +0 -571
- package/src/__tests__/previewPanelAudioFailure.test.tsx +0 -46
- package/src/__tests__/previewPanelPresentation.test.tsx +0 -126
- package/src/__tests__/previewPanelTransforms.test.tsx +0 -117
- package/src/__tests__/propertiesPanel.test.tsx +0 -69
- package/src/__tests__/rawEditorModelIsolation.test.ts +0 -19
- package/src/__tests__/recorderFormats.test.ts +0 -146
- package/src/__tests__/recorderMediaInsert.test.ts +0 -86
- package/src/__tests__/recorderTheme.test.tsx +0 -42
- package/src/__tests__/recorderTimingJson.test.ts +0 -41
- package/src/__tests__/resolveBlockVisual.test.ts +0 -43
- package/src/__tests__/selectionConversions.test.ts +0 -80
- package/src/__tests__/statusBar.test.tsx +0 -27
- package/src/__tests__/teleprompter.test.tsx +0 -190
- package/src/__tests__/templateAnnotationRoundTrip.test.ts +0 -99
- package/src/__tests__/templateContentPreview.test.ts +0 -101
- package/src/__tests__/templatePickerMetadata.test.ts +0 -32
- package/src/__tests__/templatePickerPortal.test.tsx +0 -62
- package/src/__tests__/timelineSource.test.ts +0 -134
- package/src/__tests__/tiptapBridge.test.ts +0 -575
- package/src/__tests__/tiptapBridgeConformance.test.ts +0 -47
- package/src/__tests__/tiptapCodeBlockRoundTrip.test.ts +0 -109
- package/src/__tests__/tiptapImageRoundTrip.test.ts +0 -73
- package/src/__tests__/toolbarSelectionConversion.test.tsx +0 -190
- package/src/__tests__/tooltip.test.tsx +0 -72
- package/src/__tests__/transformStyleId.test.ts +0 -13
- package/src/__tests__/transitionCatalog.test.ts +0 -64
- package/src/__tests__/useBlockNavigator.test.tsx +0 -67
- package/src/__tests__/useImageEditor.test.tsx +0 -226
- package/src/__tests__/useJsonEditorTokens.test.ts +0 -59
- package/src/__tests__/useMediaRecorder.test.ts +0 -302
- package/src/__tests__/useTimelineClock.test.ts +0 -21
- package/src/__tests__/versionHistory.test.tsx +0 -197
- package/src/__tests__/viewMenuPanel.test.tsx +0 -130
- package/src/__tests__/writeCanvasSettings.test.ts +0 -15
- package/src/__tests__/wysiwygImageUpload.test.ts +0 -69
- package/src/__tests__/wysiwygTemplateBadgeFocus.test.tsx +0 -56
- package/src/asciiDiagram/AsciiDiagramExtension.ts +0 -343
- package/src/asciiDiagram/AsciiDiagramWidget.tsx +0 -254
- package/src/asciiDiagram/RepairableDiagramExtension.ts +0 -200
- package/src/asciiDiagram/__tests__/AsciiDiagramExtension.test.ts +0 -164
- package/src/asciiDiagram/__tests__/RepairableDiagramExtension.test.ts +0 -159
- package/src/asciiDiagram/__tests__/asciiDiagramCommands.test.ts +0 -284
- package/src/asciiDiagram/__tests__/asciiDiagramOps.test.ts +0 -114
- package/src/asciiDiagram/__tests__/asciiPaste.test.ts +0 -43
- package/src/asciiDiagram/asciiDiagramCommands.ts +0 -174
- package/src/asciiDiagram/asciiDiagramData.ts +0 -149
- package/src/asciiDiagram/asciiDiagramOps.ts +0 -238
- package/src/asciiDiagram/asciiPaste.ts +0 -19
- package/src/blockProperties.ts +0 -88
- package/src/blockRange.ts +0 -132
- package/src/blockSlice.ts +0 -75
- package/src/blockTagActivity.ts +0 -233
- package/src/buildDocumentPreviewMarkdown.ts +0 -168
- package/src/buildPreviewDoc.ts +0 -407
- package/src/codeContext/CodeContextSectionView.tsx +0 -124
- package/src/codeContext/CodeContextZoneManager.ts +0 -149
- package/src/codeContext/CodeContextZones.tsx +0 -121
- package/src/codeContext/diffContextSections.ts +0 -38
- package/src/codeContext/types.ts +0 -75
- package/src/codeSnippet/CodeSnippetExtension.ts +0 -205
- package/src/codeSnippet/CodeSnippetWidget.tsx +0 -109
- package/src/codeSnippet/__tests__/CodeSnippetExtension.test.ts +0 -95
- package/src/codeSnippet/__tests__/codeSnippetLanguages.test.ts +0 -50
- package/src/codeSnippet/codeSnippetCommands.ts +0 -21
- package/src/codeSnippet/codeSnippetData.ts +0 -43
- package/src/codeSnippet/codeSnippetLanguages.ts +0 -216
- package/src/customTemplates/AddBin.tsx +0 -126
- package/src/customTemplates/CustomLayoutManager.tsx +0 -234
- package/src/customTemplates/CustomTemplateContext.tsx +0 -188
- package/src/customTemplates/LayerToolbar.tsx +0 -580
- package/src/customTemplates/ShapeGlyph.tsx +0 -47
- package/src/customTemplates/TemplateDesigner.tsx +0 -433
- package/src/customTemplates/__tests__/library.test.ts +0 -96
- package/src/customTemplates/__tests__/normalizePositions.test.ts +0 -109
- package/src/customTemplates/__tests__/shapeDefs.test.ts +0 -49
- package/src/customTemplates/__tests__/useMemoryLayerAdapter.test.ts +0 -108
- package/src/customTemplates/designer.css +0 -732
- package/src/customTemplates/index.ts +0 -31
- package/src/customTemplates/library.ts +0 -110
- package/src/customTemplates/normalizePositions.ts +0 -75
- package/src/customTemplates/shapeDefs.ts +0 -131
- package/src/customTemplates/thumbnail.tsx +0 -63
- package/src/customTemplates/tokenDefs.ts +0 -60
- package/src/customTemplates/useDocCustomTemplates.ts +0 -52
- package/src/customTemplates/useMemoryLayerAdapter.ts +0 -129
- package/src/customThemes/CustomThemeContext.tsx +0 -185
- package/src/customThemes/CustomThemeDialog.tsx +0 -316
- package/src/customThemes/ImportThemeSection.tsx +0 -178
- package/src/customThemes/__tests__/CustomThemeContext.test.tsx +0 -64
- package/src/customThemes/__tests__/CustomThemeDialog.test.tsx +0 -47
- package/src/customThemes/__tests__/customThemeLibrary.test.ts +0 -60
- package/src/customThemes/__tests__/importThemeSection.test.tsx +0 -192
- package/src/customThemes/customThemeLibrary.ts +0 -100
- package/src/customThemes/index.ts +0 -37
- package/src/customThemes/themeControls.tsx +0 -229
- package/src/customThemes/themeDraft.ts +0 -288
- package/src/customThemes/useDocCustomThemes.ts +0 -49
- package/src/detectMarkdown.ts +0 -62
- package/src/diagram/DiagramCanvas.tsx +0 -260
- package/src/diagram/DiagramMaximizedOverlay.tsx +0 -46
- package/src/diagram/diagramCommands.ts +0 -604
- package/src/diagram/diagramConstants.ts +0 -17
- package/src/diagram/types.ts +0 -35
- package/src/editorScrollSync.ts +0 -73
- package/src/embeddedMedia.ts +0 -78
- package/src/emojiData.ts +0 -1317
- package/src/fileKind.ts +0 -158
- package/src/find/FindHighlightExtension.ts +0 -81
- package/src/find/FindToolbar.tsx +0 -314
- package/src/find/findModel.ts +0 -77
- package/src/frontmatter.ts +0 -29
- package/src/frontmatterSettings.ts +0 -23
- package/src/headingTransition.ts +0 -291
- package/src/hooks/useFileDrop.ts +0 -266
- package/src/imageEditor/CanvasSurface.tsx +0 -703
- package/src/imageEditor/ImageVersionHistoryDropdown.tsx +0 -396
- package/src/imageEditor/LayersPanel.tsx +0 -218
- package/src/imageEditor/PropertiesPanel.tsx +0 -474
- package/src/imageEditor/Toolbar.tsx +0 -459
- package/src/imageEditor/createShapeLayer.ts +0 -280
- package/src/imageEditor/icons.tsx +0 -68
- package/src/imageEditor/image-editor.css +0 -574
- package/src/imageEditor/layers/EditorImageLayer.tsx +0 -45
- package/src/imageEditor/layers/EditorShapeLayer.tsx +0 -62
- package/src/imageEditor/layers/EditorTextLayer.tsx +0 -45
- package/src/imageEditor/layers/SelectionHandles.tsx +0 -86
- package/src/imageEditor/state.ts +0 -173
- package/src/imageEditor/useImageEditor.ts +0 -385
- package/src/imageEditor/useImageEditorTokens.ts +0 -70
- package/src/index.ts +0 -559
- package/src/jsonEditor/EmbeddedRichTextField.tsx +0 -81
- package/src/jsonEditor/JsonEditor.tsx +0 -81
- package/src/jsonEditor/JsonEditorContext.tsx +0 -81
- package/src/jsonEditor/RenderNode.tsx +0 -87
- package/src/jsonEditor/editors.tsx +0 -745
- package/src/jsonEditor/index.ts +0 -2
- package/src/jsonEditor/json-editor.css +0 -463
- package/src/jsonEditor/useJsonEditorTokens.ts +0 -33
- package/src/markdownCodeFence.ts +0 -72
- package/src/mediaDragMime.ts +0 -32
- package/src/mediaEntries.ts +0 -12
- package/src/mediaReferences.ts +0 -301
- package/src/mermaid/MermaidDiagramCanvas.tsx +0 -693
- package/src/mermaid/MermaidDiagramExtension.ts +0 -243
- package/src/mermaid/MermaidDiagramTypeThumbnail.tsx +0 -184
- package/src/mermaid/MermaidDiagramWidget.tsx +0 -653
- package/src/mermaid/MermaidShapePalette.tsx +0 -245
- package/src/mermaid/__tests__/MermaidDiagramExtension.test.ts +0 -361
- package/src/mermaid/__tests__/mermaidDiagramTypes.test.ts +0 -35
- package/src/mermaid/__tests__/mermaidRenderer.test.ts +0 -49
- package/src/mermaid/__tests__/mermaidSourceOps.test.ts +0 -213
- package/src/mermaid/__tests__/mermaidSyntax.test.ts +0 -71
- package/src/mermaid/mermaidCommands.ts +0 -34
- package/src/mermaid/mermaidData.ts +0 -31
- package/src/mermaid/mermaidDiagramTypes.ts +0 -325
- package/src/mermaid/mermaidModel.ts +0 -31
- package/src/mermaid/mermaidRenderer.ts +0 -181
- package/src/mermaid/mermaidShapes.ts +0 -113
- package/src/mermaid/mermaidSourceOps.ts +0 -454
- package/src/monaco.ts +0 -35
- package/src/monacoWorkers.ts +0 -89
- package/src/outlineSource.ts +0 -171
- package/src/presentation/PresentationMode.tsx +0 -596
- package/src/rawEditorIsolation.ts +0 -18
- package/src/recorder/RecorderButton.tsx +0 -80
- package/src/recorder/RecorderModal.tsx +0 -706
- package/src/recorder/RecorderPanel.tsx +0 -77
- package/src/recorder/formats.ts +0 -159
- package/src/recorder/hooks/useMediaRecorder.ts +0 -436
- package/src/recorder/hooks/useStreamPreview.ts +0 -47
- package/src/recorder/insertMediaBlock.ts +0 -30
- package/src/recorder/sources/cameraStream.ts +0 -32
- package/src/recorder/sources/micStream.ts +0 -25
- package/src/recorder/sources/screenStream.ts +0 -162
- package/src/recorder/timingJson.ts +0 -66
- package/src/resolveBlockVisual.ts +0 -39
- package/src/scene/Scene.tsx +0 -647
- package/src/scene/SceneBlockExtension.ts +0 -205
- package/src/scene/SceneBlockToolbar.tsx +0 -216
- package/src/scene/SceneBlockWidget.tsx +0 -441
- package/src/scene/ScenePropsBar.tsx +0 -85
- package/src/scene/SceneSelection.tsx +0 -111
- package/src/scene/SceneSideToolbar.tsx +0 -89
- package/src/scene/SceneViewControls.tsx +0 -43
- package/src/scene/SceneViewport.tsx +0 -106
- package/src/scene/ShapePalette.tsx +0 -196
- package/src/scene/__tests__/DiagramAdapter.test.ts +0 -142
- package/src/scene/__tests__/SceneBlockExtension.test.ts +0 -33
- package/src/scene/__tests__/bezierEdit.test.ts +0 -85
- package/src/scene/__tests__/blockLayers.test.ts +0 -57
- package/src/scene/__tests__/fitScale.test.ts +0 -19
- package/src/scene/__tests__/sceneIsolation.test.tsx +0 -119
- package/src/scene/__tests__/shapeLayers.test.ts +0 -106
- package/src/scene/__tests__/useSceneHitTest.test.ts +0 -90
- package/src/scene/__tests__/useScenePanZoom.test.ts +0 -130
- package/src/scene/adapters/DiagramAdapter.ts +0 -79
- package/src/scene/adapters/DrawingAdapter.ts +0 -420
- package/src/scene/adapters/LayoutAdapter.ts +0 -313
- package/src/scene/adapters/blockLayers.ts +0 -159
- package/src/scene/commands/SceneCommand.ts +0 -84
- package/src/scene/commands/drawingCommands.ts +0 -318
- package/src/scene/commands/layoutCommands.ts +0 -301
- package/src/scene/fitScale.ts +0 -17
- package/src/scene/hooks/useSceneHitTest.ts +0 -105
- package/src/scene/hooks/useScenePanZoom.ts +0 -154
- package/src/scene/hooks/useSceneSelection.ts +0 -62
- package/src/scene/index.ts +0 -90
- package/src/scene/layers/DiagramEdges.tsx +0 -142
- package/src/scene/layers/edgeGeometry.ts +0 -104
- package/src/scene/layers/nodeCard.tsx +0 -164
- package/src/scene/layers/renderLayer.tsx +0 -70
- package/src/scene/layers/shapeLayers.ts +0 -201
- package/src/scene/paths/bezierEdit.ts +0 -208
- package/src/scene/scene.css +0 -874
- package/src/scene/text/SceneTextOverlay.tsx +0 -161
- package/src/scene/text/sceneTextChannel.ts +0 -46
- package/src/scene/text/sceneTextConfig.ts +0 -31
- package/src/scene/text/sceneTiptap.ts +0 -36
- package/src/scene/text/useSceneTextEditing.ts +0 -39
- package/src/scene/tools/ConnectTool.ts +0 -209
- package/src/scene/tools/DrawingConnectTool.ts +0 -231
- package/src/scene/tools/PathTool.ts +0 -158
- package/src/scene/tools/PlaceTool.ts +0 -47
- package/src/scene/tools/SceneTool.ts +0 -85
- package/src/scene/tools/SelectTool.ts +0 -300
- package/src/scene/tools/ShapeTool.ts +0 -143
- package/src/scene/tools/TextTool.ts +0 -72
- package/src/scene/tools/TokenTool.ts +0 -95
- package/src/scene/tools/createDrawShapeTool.ts +0 -82
- package/src/selectionConversions.ts +0 -155
- package/src/styles/ascii-diagram.css +0 -79
- package/src/styles/ascii-timeline.css +0 -596
- package/src/styles/code-context.css +0 -155
- package/src/styles/code-snippet.css +0 -76
- package/src/styles/diagram.css +0 -183
- package/src/styles/editor.css +0 -7131
- package/src/styles/folder-view.css +0 -210
- package/src/styles/image-edit-affordance.css +0 -201
- package/src/styles/index.css +0 -20
- package/src/styles/mermaid-diagram.css +0 -487
- package/src/styles/tree-view.css +0 -189
- package/src/teleprompter/TeleprompterControls.tsx +0 -218
- package/src/teleprompter/TeleprompterSelfView.tsx +0 -22
- package/src/teleprompter/TeleprompterSurface.tsx +0 -267
- package/src/teleprompter/TeleprompterView.tsx +0 -338
- package/src/teleprompter/canvasRenderer.ts +0 -161
- package/src/teleprompter/floatingWindow.ts +0 -352
- package/src/teleprompter/index.ts +0 -61
- package/src/teleprompter/pcmWorklet.ts +0 -62
- package/src/teleprompter/recording/insertPreamble.ts +0 -80
- package/src/teleprompter/recording/narrationSave.ts +0 -134
- package/src/teleprompter/recording/useNarrationRecorder.ts +0 -367
- package/src/teleprompter/scrollModel.ts +0 -85
- package/src/teleprompter/teleprompterTheme.ts +0 -303
- package/src/teleprompter/types.ts +0 -38
- package/src/teleprompter/useFloatingWindow.ts +0 -74
- package/src/teleprompter/useMicAnalysis.ts +0 -211
- package/src/teleprompter/useTeleprompter.ts +0 -421
- package/src/templateContentPreviewResolver.ts +0 -360
- package/src/timeline/TimelineEditorWidget.tsx +0 -861
- package/src/timeline/TimelineViewExtension.ts +0 -252
- package/src/timeline/__tests__/TimelineEditorWidget.test.tsx +0 -414
- package/src/timeline/__tests__/TimelineViewExtension.test.ts +0 -163
- package/src/timeline/__tests__/timelineCommands.test.ts +0 -359
- package/src/timeline/__tests__/timelineOps.test.ts +0 -277
- package/src/timeline/__tests__/timelinePaste.test.ts +0 -34
- package/src/timeline/timelineCommands.ts +0 -421
- package/src/timeline/timelineData.ts +0 -54
- package/src/timeline/timelineOps.ts +0 -381
- package/src/timeline/timelinePaste.ts +0 -8
- package/src/timelineSource.ts +0 -244
- package/src/tiptap/TiptapAudio.tsx +0 -86
- package/src/tiptap/TiptapVideo.tsx +0 -119
- package/src/tiptap/useResolvedMediaSrc.ts +0 -47
- package/src/tiptapBridge.ts +0 -986
- package/src/tooltipPlacement.ts +0 -13
- package/src/transformStyleId.ts +0 -17
- package/src/transitionCatalog.ts +0 -159
- package/src/treeview/TreeOutlineWidget.tsx +0 -390
- package/src/treeview/TreeViewExtension.ts +0 -250
- package/src/treeview/__tests__/TreeOutlineWidget.test.tsx +0 -156
- package/src/treeview/__tests__/TreeViewExtension.test.ts +0 -122
- package/src/treeview/__tests__/treeOps.test.ts +0 -177
- package/src/treeview/__tests__/treePaste.test.ts +0 -40
- package/src/treeview/__tests__/treeViewCommands.test.ts +0 -179
- package/src/treeview/treeOps.ts +0 -231
- package/src/treeview/treePaste.ts +0 -13
- package/src/treeview/treeViewCommands.ts +0 -99
- package/src/treeview/treeViewData.ts +0 -41
- package/src/types/monaco-shims.d.ts +0 -10
- package/src/useBlockNavigator.ts +0 -153
- package/src/useHeadingLayout.ts +0 -294
- package/src/useMonacoLoader.ts +0 -82
- package/src/useTimelineClock.ts +0 -76
- package/src/utils/collectInlineFontAwesomeCss.ts +0 -69
- package/src/utils/dropUtils.ts +0 -136
- package/src/utils/normalizeMalformedAssetUrl.ts +0 -22
- package/src/writeCanvasSettings.ts +0 -30
- package/src/wysiwygImageUpload.ts +0 -113
|
@@ -1,197 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it, vi, beforeEach, afterEach } from 'vitest';
|
|
2
|
-
import { act, fireEvent, render, screen, waitFor } from '@testing-library/react';
|
|
3
|
-
import { MemoryContentContainer } from '@bendyline/squisq/storage';
|
|
4
|
-
import { DocumentVersionManager, VERSIONS_PREFIX } from '@bendyline/squisq/versions';
|
|
5
|
-
import type { SaveVersionResult } from '@bendyline/squisq/versions';
|
|
6
|
-
import { EditorProvider, useEditorContext } from '../EditorContext';
|
|
7
|
-
import { VersionHistoryPanel } from '../VersionHistoryPanel';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* The full EditorShell mounts Tiptap and Monaco, both heavy and
|
|
11
|
-
* jsdom-hostile. These tests instead exercise the smallest moving
|
|
12
|
-
* pieces: the EditorContext's versioning wiring and the
|
|
13
|
-
* VersionHistoryPanel UI. Tiptap/Monaco coverage lives elsewhere.
|
|
14
|
-
*/
|
|
15
|
-
|
|
16
|
-
function Harness({ fixedNow }: { fixedNow?: Date } = {}) {
|
|
17
|
-
const ctx = useEditorContext();
|
|
18
|
-
return (
|
|
19
|
-
<div>
|
|
20
|
-
<button
|
|
21
|
-
type="button"
|
|
22
|
-
data-testid="set-source"
|
|
23
|
-
onClick={() => ctx.setMarkdownSource(`# updated ${Math.random()}`)}
|
|
24
|
-
>
|
|
25
|
-
Set source
|
|
26
|
-
</button>
|
|
27
|
-
<button
|
|
28
|
-
type="button"
|
|
29
|
-
data-testid="manual-save"
|
|
30
|
-
onClick={() => {
|
|
31
|
-
void ctx.saveVersion(fixedNow ? { now: fixedNow } : undefined);
|
|
32
|
-
}}
|
|
33
|
-
>
|
|
34
|
-
Manual save
|
|
35
|
-
</button>
|
|
36
|
-
<span data-testid="versioning-active">{ctx.versioning ? 'yes' : 'no'}</span>
|
|
37
|
-
<VersionHistoryPanel />
|
|
38
|
-
</div>
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
describe('versioning wiring + VersionHistoryPanel', () => {
|
|
43
|
-
let warnSpy: ReturnType<typeof vi.spyOn>;
|
|
44
|
-
|
|
45
|
-
beforeEach(() => {
|
|
46
|
-
warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
afterEach(() => {
|
|
50
|
-
warnSpy.mockRestore();
|
|
51
|
-
vi.useRealTimers();
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('exposes versioning + saveVersion when allowVersioning + container are set', async () => {
|
|
55
|
-
const container = new MemoryContentContainer();
|
|
56
|
-
await container.writeDocument('# hi', 'index.md');
|
|
57
|
-
|
|
58
|
-
render(
|
|
59
|
-
<EditorProvider workspaceContainer={container} allowVersioning>
|
|
60
|
-
<Harness />
|
|
61
|
-
</EditorProvider>,
|
|
62
|
-
);
|
|
63
|
-
|
|
64
|
-
expect(screen.getByTestId('versioning-active').textContent).toBe('yes');
|
|
65
|
-
// Trigger button visible.
|
|
66
|
-
expect(screen.getByRole('button', { name: 'Version history' })).toBeTruthy();
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
it('omits the toolbar trigger when versioning is off', () => {
|
|
70
|
-
const container = new MemoryContentContainer();
|
|
71
|
-
render(
|
|
72
|
-
<EditorProvider workspaceContainer={container}>
|
|
73
|
-
<Harness />
|
|
74
|
-
</EditorProvider>,
|
|
75
|
-
);
|
|
76
|
-
expect(screen.getByTestId('versioning-active').textContent).toBe('no');
|
|
77
|
-
expect(screen.queryByRole('button', { name: 'Version history' })).toBeNull();
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it('warns and stays disabled when allowVersioning is set without a container', () => {
|
|
81
|
-
render(
|
|
82
|
-
<EditorProvider allowVersioning>
|
|
83
|
-
<Harness />
|
|
84
|
-
</EditorProvider>,
|
|
85
|
-
);
|
|
86
|
-
expect(screen.getByTestId('versioning-active').textContent).toBe('no');
|
|
87
|
-
expect(warnSpy).toHaveBeenCalled();
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it('opens the popover, lists empty state, then shows snapshots after a save', async () => {
|
|
91
|
-
const container = new MemoryContentContainer();
|
|
92
|
-
await container.writeDocument('# hi', 'index.md');
|
|
93
|
-
const onSaveVersion = vi.fn<(r: SaveVersionResult) => void>();
|
|
94
|
-
|
|
95
|
-
render(
|
|
96
|
-
<EditorProvider
|
|
97
|
-
workspaceContainer={container}
|
|
98
|
-
allowVersioning
|
|
99
|
-
versioningAutoSaveIdleMs={0}
|
|
100
|
-
onSaveVersion={onSaveVersion}
|
|
101
|
-
>
|
|
102
|
-
<Harness fixedNow={new Date(Date.UTC(2026, 3, 30, 15, 20, 30))} />
|
|
103
|
-
</EditorProvider>,
|
|
104
|
-
);
|
|
105
|
-
|
|
106
|
-
const trigger = () => screen.getByRole('button', { name: 'Version history' });
|
|
107
|
-
|
|
108
|
-
// Open popover — empty state initially.
|
|
109
|
-
fireEvent.click(trigger());
|
|
110
|
-
await waitFor(() => {
|
|
111
|
-
expect(screen.getByText(/No versions yet/i)).toBeTruthy();
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
// Close, then save, then re-open so the list effect re-runs.
|
|
115
|
-
fireEvent.click(trigger());
|
|
116
|
-
await act(async () => {
|
|
117
|
-
fireEvent.click(screen.getByTestId('manual-save'));
|
|
118
|
-
});
|
|
119
|
-
await waitFor(() => {
|
|
120
|
-
expect(onSaveVersion).toHaveBeenCalled();
|
|
121
|
-
});
|
|
122
|
-
const calls = onSaveVersion.mock.calls;
|
|
123
|
-
const last = calls[calls.length - 1]![0];
|
|
124
|
-
expect(last.saved).toBe(true);
|
|
125
|
-
expect(last.reason).toBe('saved');
|
|
126
|
-
|
|
127
|
-
fireEvent.click(trigger());
|
|
128
|
-
// The saved snapshot renders as a non-current row whose "Revert" button
|
|
129
|
-
// distinguishes it from the synthetic Current row (Current has no actions).
|
|
130
|
-
await waitFor(() => {
|
|
131
|
-
expect(screen.getByRole('button', { name: 'Revert' })).toBeTruthy();
|
|
132
|
-
});
|
|
133
|
-
});
|
|
134
|
-
|
|
135
|
-
it('deduplicates identical saves', async () => {
|
|
136
|
-
const container = new MemoryContentContainer();
|
|
137
|
-
await container.writeDocument('# hi', 'index.md');
|
|
138
|
-
const manager = new DocumentVersionManager(container);
|
|
139
|
-
|
|
140
|
-
const r1 = await manager.saveVersion({ now: new Date(Date.UTC(2026, 3, 30, 10, 0, 0)) });
|
|
141
|
-
const r2 = await manager.saveVersion({ now: new Date(Date.UTC(2026, 3, 30, 10, 0, 1)) });
|
|
142
|
-
|
|
143
|
-
expect(r1.saved).toBe(true);
|
|
144
|
-
expect(r2.saved).toBe(false);
|
|
145
|
-
expect(r2.reason).toBe('unchanged');
|
|
146
|
-
expect(await manager.listVersions()).toHaveLength(1);
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it('keep-last-n prune policy keeps the count bounded after auto-saves', async () => {
|
|
150
|
-
const container = new MemoryContentContainer();
|
|
151
|
-
await container.writeDocument('# hi', 'index.md');
|
|
152
|
-
const onSaveVersion = vi.fn<(r: SaveVersionResult) => void>();
|
|
153
|
-
|
|
154
|
-
render(
|
|
155
|
-
<EditorProvider
|
|
156
|
-
workspaceContainer={container}
|
|
157
|
-
allowVersioning
|
|
158
|
-
versioningAutoSaveIdleMs={0}
|
|
159
|
-
versioningPrunePolicy={{ type: 'keep-last-n', n: 2 }}
|
|
160
|
-
onSaveVersion={onSaveVersion}
|
|
161
|
-
>
|
|
162
|
-
<Harness fixedNow={new Date(Date.UTC(2026, 3, 30, 15, 20, 30))} />
|
|
163
|
-
</EditorProvider>,
|
|
164
|
-
);
|
|
165
|
-
|
|
166
|
-
const seedTimes = [
|
|
167
|
-
new Date(Date.UTC(2026, 3, 30, 10, 0, 0)),
|
|
168
|
-
new Date(Date.UTC(2026, 3, 30, 11, 0, 0)),
|
|
169
|
-
new Date(Date.UTC(2026, 3, 30, 12, 0, 0)),
|
|
170
|
-
new Date(Date.UTC(2026, 3, 30, 13, 0, 0)),
|
|
171
|
-
];
|
|
172
|
-
|
|
173
|
-
for (let i = 0; i < seedTimes.length; i++) {
|
|
174
|
-
await container.writeDocument(`# rev-${i}`, 'index.md');
|
|
175
|
-
// Wait for prune (fire-and-forget) by polling the file list.
|
|
176
|
-
await act(async () => {
|
|
177
|
-
await onSaveVersionDirect(container, seedTimes[i]!);
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
|
-
// Pruning is fire-and-forget inside the editor's saveVersion; for the
|
|
181
|
-
// test we run prune explicitly to make the behavior deterministic.
|
|
182
|
-
const list = await container.listFiles(VERSIONS_PREFIX);
|
|
183
|
-
expect(list.length).toBeGreaterThanOrEqual(2);
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
/**
|
|
188
|
-
* Runs the manager directly against the same container the editor sees.
|
|
189
|
-
* Lets us seed ordered snapshots without depending on the auto-save
|
|
190
|
-
* timer. The editor's own `saveVersion` would also do this — but we'd
|
|
191
|
-
* have to thread the timestamp through, which the public API doesn't
|
|
192
|
-
* expose to the host (only to the internal manager).
|
|
193
|
-
*/
|
|
194
|
-
async function onSaveVersionDirect(container: MemoryContentContainer, now: Date): Promise<void> {
|
|
195
|
-
const manager = new DocumentVersionManager(container);
|
|
196
|
-
await manager.saveVersion({ now });
|
|
197
|
-
}
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @vitest-environment jsdom
|
|
3
|
-
*/
|
|
4
|
-
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
-
import { cleanup, fireEvent, render, screen, within } from '@testing-library/react';
|
|
6
|
-
import {
|
|
7
|
-
EditorProvider,
|
|
8
|
-
useEditorContext,
|
|
9
|
-
type BlockTagVisibility,
|
|
10
|
-
type ViewPreferences,
|
|
11
|
-
} from '../EditorContext';
|
|
12
|
-
import { ViewMenuPanel } from '../ViewMenuPanel';
|
|
13
|
-
|
|
14
|
-
afterEach(cleanup);
|
|
15
|
-
|
|
16
|
-
function BlockTagVisibilityProbe() {
|
|
17
|
-
const { blockTagVisibility } = useEditorContext();
|
|
18
|
-
return <output data-testid="block-tag-visibility">{blockTagVisibility}</output>;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
function renderViewMenu({
|
|
22
|
-
blockTags,
|
|
23
|
-
blockTagVisibility,
|
|
24
|
-
viewPreferences,
|
|
25
|
-
onViewPreferencesChange,
|
|
26
|
-
}: {
|
|
27
|
-
blockTags?: boolean;
|
|
28
|
-
blockTagVisibility?: BlockTagVisibility;
|
|
29
|
-
viewPreferences?: ViewPreferences;
|
|
30
|
-
onViewPreferencesChange?: (preferences: ViewPreferences) => void;
|
|
31
|
-
} = {}) {
|
|
32
|
-
render(
|
|
33
|
-
<EditorProvider
|
|
34
|
-
initialMarkdown="# One\n\nFirst block.\n\n## Two\n\nSecond block.\n"
|
|
35
|
-
initialView="wysiwyg"
|
|
36
|
-
blockTags={blockTags}
|
|
37
|
-
blockTagVisibility={blockTagVisibility}
|
|
38
|
-
viewPreferences={viewPreferences}
|
|
39
|
-
onViewPreferencesChange={onViewPreferencesChange}
|
|
40
|
-
>
|
|
41
|
-
<ViewMenuPanel />
|
|
42
|
-
<BlockTagVisibilityProbe />
|
|
43
|
-
</EditorProvider>,
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
fireEvent.click(screen.getByRole('button', { name: 'View options' }));
|
|
47
|
-
return screen.getByRole('radiogroup', { name: 'Show block tags' });
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
describe('ViewMenuPanel block-tag visibility', () => {
|
|
51
|
-
it('offers the three visibility choices and defaults to the selected/hovered block', () => {
|
|
52
|
-
const group = renderViewMenu();
|
|
53
|
-
|
|
54
|
-
const items = within(group).getAllByRole('menuitemradio');
|
|
55
|
-
expect(items.map((item) => item.textContent?.trim())).toEqual([
|
|
56
|
-
'No inline block tags',
|
|
57
|
-
'Selected/hovered block',
|
|
58
|
-
'Always show',
|
|
59
|
-
]);
|
|
60
|
-
expect(
|
|
61
|
-
within(group)
|
|
62
|
-
.getByRole('menuitemradio', { name: 'Selected/hovered block' })
|
|
63
|
-
.getAttribute('aria-checked'),
|
|
64
|
-
).toBe('true');
|
|
65
|
-
expect(screen.getByTestId('block-tag-visibility').textContent).toBe('active');
|
|
66
|
-
});
|
|
67
|
-
|
|
68
|
-
it('switches to active and none and emits both new and legacy preferences', () => {
|
|
69
|
-
const onViewPreferencesChange = vi.fn<(preferences: ViewPreferences) => void>();
|
|
70
|
-
const group = renderViewMenu({ onViewPreferencesChange });
|
|
71
|
-
|
|
72
|
-
fireEvent.click(within(group).getByRole('menuitemradio', { name: 'Always show' }));
|
|
73
|
-
expect(screen.getByTestId('block-tag-visibility').textContent).toBe('always');
|
|
74
|
-
|
|
75
|
-
fireEvent.click(within(group).getByRole('menuitemradio', { name: 'Selected/hovered block' }));
|
|
76
|
-
expect(screen.getByTestId('block-tag-visibility').textContent).toBe('active');
|
|
77
|
-
expect(onViewPreferencesChange).toHaveBeenLastCalledWith(
|
|
78
|
-
expect.objectContaining({
|
|
79
|
-
blockTagVisibility: 'active',
|
|
80
|
-
blockTags: true,
|
|
81
|
-
}),
|
|
82
|
-
);
|
|
83
|
-
|
|
84
|
-
fireEvent.click(within(group).getByRole('menuitemradio', { name: 'No inline block tags' }));
|
|
85
|
-
expect(screen.getByTestId('block-tag-visibility').textContent).toBe('none');
|
|
86
|
-
expect(onViewPreferencesChange).toHaveBeenLastCalledWith(
|
|
87
|
-
expect.objectContaining({
|
|
88
|
-
blockTagVisibility: 'none',
|
|
89
|
-
blockTags: false,
|
|
90
|
-
}),
|
|
91
|
-
);
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('maps the legacy blockTags={false} prop to no inline block tags', () => {
|
|
95
|
-
const group = renderViewMenu({ blockTags: false });
|
|
96
|
-
|
|
97
|
-
expect(screen.getByTestId('block-tag-visibility').textContent).toBe('none');
|
|
98
|
-
expect(
|
|
99
|
-
within(group)
|
|
100
|
-
.getByRole('menuitemradio', { name: 'No inline block tags' })
|
|
101
|
-
.getAttribute('aria-checked'),
|
|
102
|
-
).toBe('true');
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
it('maps the legacy blockTags={true} prop to always show', () => {
|
|
106
|
-
const group = renderViewMenu({ blockTags: true });
|
|
107
|
-
|
|
108
|
-
expect(screen.getByTestId('block-tag-visibility').textContent).toBe('always');
|
|
109
|
-
expect(
|
|
110
|
-
within(group)
|
|
111
|
-
.getByRole('menuitemradio', { name: 'Always show' })
|
|
112
|
-
.getAttribute('aria-checked'),
|
|
113
|
-
).toBe('true');
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
it('restores the active mode from bundled view preferences', () => {
|
|
117
|
-
const group = renderViewMenu({
|
|
118
|
-
blockTags: false,
|
|
119
|
-
blockTagVisibility: 'always',
|
|
120
|
-
viewPreferences: { blockTags: false, blockTagVisibility: 'active' },
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
expect(screen.getByTestId('block-tag-visibility').textContent).toBe('active');
|
|
124
|
-
expect(
|
|
125
|
-
within(group)
|
|
126
|
-
.getByRole('menuitemradio', { name: 'Selected/hovered block' })
|
|
127
|
-
.getAttribute('aria-checked'),
|
|
128
|
-
).toBe('true');
|
|
129
|
-
});
|
|
130
|
-
});
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { writeCanvasSettingsStyle } from '../writeCanvasSettings';
|
|
3
|
-
|
|
4
|
-
describe('writeCanvasSettingsStyle', () => {
|
|
5
|
-
it('maps serializable settings to Write canvas CSS variables', () => {
|
|
6
|
-
expect(writeCanvasSettingsStyle({ textSize: 18, lineSpacing: 1.9 })).toEqual({
|
|
7
|
-
'--squisq-write-text-size': '18px',
|
|
8
|
-
'--squisq-write-line-spacing': '1.9',
|
|
9
|
-
});
|
|
10
|
-
});
|
|
11
|
-
|
|
12
|
-
it('ignores invalid host values instead of emitting broken CSS', () => {
|
|
13
|
-
expect(writeCanvasSettingsStyle({ textSize: 0, lineSpacing: Number.NaN })).toEqual({});
|
|
14
|
-
});
|
|
15
|
-
});
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { Schema } from '@tiptap/pm/model';
|
|
2
|
-
import { EditorState, TextSelection } from '@tiptap/pm/state';
|
|
3
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
4
|
-
import type { MediaProvider } from '@bendyline/squisq/schemas';
|
|
5
|
-
import { uploadAndInsertImages } from '../wysiwygImageUpload';
|
|
6
|
-
|
|
7
|
-
const schema = new Schema({
|
|
8
|
-
nodes: {
|
|
9
|
-
doc: { content: 'paragraph+' },
|
|
10
|
-
paragraph: { content: 'inline*', group: 'block' },
|
|
11
|
-
text: { group: 'inline' },
|
|
12
|
-
image: {
|
|
13
|
-
inline: true,
|
|
14
|
-
group: 'inline',
|
|
15
|
-
atom: true,
|
|
16
|
-
attrs: {
|
|
17
|
-
src: {},
|
|
18
|
-
alt: { default: null },
|
|
19
|
-
title: { default: null },
|
|
20
|
-
},
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
describe('asynchronous WYSIWYG image upload', () => {
|
|
26
|
-
it('replaces a mapped placeholder instead of the user’s later selection', async () => {
|
|
27
|
-
const doc = schema.node('doc', null, [
|
|
28
|
-
schema.node('paragraph', null, schema.text('before after')),
|
|
29
|
-
]);
|
|
30
|
-
let state = EditorState.create({
|
|
31
|
-
schema,
|
|
32
|
-
doc,
|
|
33
|
-
selection: TextSelection.create(doc, 8),
|
|
34
|
-
});
|
|
35
|
-
const view = {
|
|
36
|
-
get state() {
|
|
37
|
-
return state;
|
|
38
|
-
},
|
|
39
|
-
dispatch(tr: typeof state.tr) {
|
|
40
|
-
state = state.apply(tr);
|
|
41
|
-
},
|
|
42
|
-
};
|
|
43
|
-
let finishUpload!: (path: string) => void;
|
|
44
|
-
const upload = new Promise<string>((resolve) => {
|
|
45
|
-
finishUpload = resolve;
|
|
46
|
-
});
|
|
47
|
-
const provider = {
|
|
48
|
-
addMedia: vi.fn(() => upload),
|
|
49
|
-
} as unknown as MediaProvider;
|
|
50
|
-
const file = {
|
|
51
|
-
name: 'photo.png',
|
|
52
|
-
type: 'image/png',
|
|
53
|
-
arrayBuffer: async () => new Uint8Array([1]).buffer,
|
|
54
|
-
} as File;
|
|
55
|
-
|
|
56
|
-
const pending = uploadAndInsertImages(view, [file], provider);
|
|
57
|
-
// Keep editing elsewhere while storage is pending.
|
|
58
|
-
view.dispatch(state.tr.insertText(' tail', state.doc.content.size - 1));
|
|
59
|
-
finishUpload('assets/photo.png');
|
|
60
|
-
await pending;
|
|
61
|
-
|
|
62
|
-
const paragraph = state.doc.firstChild!;
|
|
63
|
-
expect(paragraph.childCount).toBe(3);
|
|
64
|
-
expect(paragraph.child(0).text).toBe('before ');
|
|
65
|
-
expect(paragraph.child(1).type.name).toBe('image');
|
|
66
|
-
expect(paragraph.child(1).attrs.src).toBe('assets/photo.png');
|
|
67
|
-
expect(paragraph.child(2).text).toBe('after tail');
|
|
68
|
-
});
|
|
69
|
-
});
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { cleanup, fireEvent, render, screen, waitFor } from '@testing-library/react';
|
|
2
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
3
|
-
import { EditorProvider } from '../EditorContext';
|
|
4
|
-
import { WysiwygEditor } from '../WysiwygEditor';
|
|
5
|
-
|
|
6
|
-
const originalElementsFromPoint = document.elementsFromPoint;
|
|
7
|
-
const originalElementFromPoint = document.elementFromPoint;
|
|
8
|
-
|
|
9
|
-
beforeEach(() => {
|
|
10
|
-
Object.defineProperty(document, 'elementsFromPoint', {
|
|
11
|
-
configurable: true,
|
|
12
|
-
value: () => [],
|
|
13
|
-
});
|
|
14
|
-
Object.defineProperty(document, 'elementFromPoint', {
|
|
15
|
-
configurable: true,
|
|
16
|
-
value: () => null,
|
|
17
|
-
});
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
afterEach(() => {
|
|
21
|
-
cleanup();
|
|
22
|
-
Object.defineProperty(document, 'elementsFromPoint', {
|
|
23
|
-
configurable: true,
|
|
24
|
-
value: originalElementsFromPoint,
|
|
25
|
-
});
|
|
26
|
-
Object.defineProperty(document, 'elementFromPoint', {
|
|
27
|
-
configurable: true,
|
|
28
|
-
value: originalElementFromPoint,
|
|
29
|
-
});
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
describe('WysiwygEditor inline block-type picker focus', () => {
|
|
33
|
-
it('restores document focus after choosing a block type', async () => {
|
|
34
|
-
render(
|
|
35
|
-
<EditorProvider
|
|
36
|
-
initialMarkdown={'# Heading {[title]}\n\nBody text.\n'}
|
|
37
|
-
initialView="wysiwyg"
|
|
38
|
-
blockTagVisibility="always"
|
|
39
|
-
>
|
|
40
|
-
<WysiwygEditor />
|
|
41
|
-
</EditorProvider>,
|
|
42
|
-
);
|
|
43
|
-
|
|
44
|
-
const editor = await screen.findByTestId('wysiwyg-editor');
|
|
45
|
-
const badge = await screen.findByTitle('Change block type');
|
|
46
|
-
fireEvent.mouseDown(badge);
|
|
47
|
-
|
|
48
|
-
const search = await screen.findByRole('searchbox', { name: 'Search block types' });
|
|
49
|
-
await waitFor(() => expect(document.activeElement).toBe(search));
|
|
50
|
-
|
|
51
|
-
fireEvent.click(screen.getByRole('option', { name: /^Quote\b/ }));
|
|
52
|
-
|
|
53
|
-
await waitFor(() => expect(screen.queryByRole('dialog')).toBeNull());
|
|
54
|
-
await waitFor(() => expect(document.activeElement).toBe(editor));
|
|
55
|
-
});
|
|
56
|
-
});
|