@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,213 +0,0 @@
|
|
|
1
|
-
import mermaid from 'mermaid';
|
|
2
|
-
import { beforeAll, describe, expect, it } from 'vitest';
|
|
3
|
-
import type { MermaidFlowchartModel } from '../mermaidModel';
|
|
4
|
-
import {
|
|
5
|
-
addMermaidNode,
|
|
6
|
-
changeMermaidNodeShape,
|
|
7
|
-
connectMermaidNodes,
|
|
8
|
-
deleteMermaidNode,
|
|
9
|
-
disconnectMermaidEdge,
|
|
10
|
-
duplicateMermaidNode,
|
|
11
|
-
renameMermaidNode,
|
|
12
|
-
setMermaidEdgeLabel,
|
|
13
|
-
setMermaidFlowchartDirection,
|
|
14
|
-
upsertMermaidNode,
|
|
15
|
-
} from '../mermaidSourceOps';
|
|
16
|
-
import { MERMAID_FLOWCHART_SHAPES } from '../mermaidShapes';
|
|
17
|
-
|
|
18
|
-
const source = 'flowchart LR\n start["Start"] --> next["Next"]';
|
|
19
|
-
const model: MermaidFlowchartModel = {
|
|
20
|
-
kind: 'flowchart',
|
|
21
|
-
direction: 'LR',
|
|
22
|
-
nodes: [
|
|
23
|
-
{ id: 'start', domId: 'flowchart-start-0', label: 'Start', shape: 'rect', classes: [] },
|
|
24
|
-
{ id: 'next', domId: 'flowchart-next-1', label: 'Next', shape: 'rect', classes: [] },
|
|
25
|
-
],
|
|
26
|
-
edges: [
|
|
27
|
-
{ id: 'L_start_next_0', source: 'start', target: 'next', label: '', type: 'arrow_point' },
|
|
28
|
-
],
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
beforeAll(() => {
|
|
32
|
-
mermaid.initialize({
|
|
33
|
-
startOnLoad: false,
|
|
34
|
-
securityLevel: 'strict',
|
|
35
|
-
suppressErrorRendering: true,
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
describe('Mermaid shape coverage', () => {
|
|
40
|
-
it('covers every ordinary shape in Mermaid 11.16’s documented expanded catalog', () => {
|
|
41
|
-
expect(MERMAID_FLOWCHART_SHAPES).toHaveLength(48);
|
|
42
|
-
expect(new Set(MERMAID_FLOWCHART_SHAPES.map((shape) => shape.id)).size).toBe(48);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('round-trips all 48 shapes through the pinned Mermaid parser', async () => {
|
|
46
|
-
const shapeSource = [
|
|
47
|
-
'flowchart TB',
|
|
48
|
-
...MERMAID_FLOWCHART_SHAPES.map(
|
|
49
|
-
(shape, index) =>
|
|
50
|
-
` node${index}@{ shape: ${shape.id}, label: ${JSON.stringify(shape.label)} }`,
|
|
51
|
-
),
|
|
52
|
-
].join('\n');
|
|
53
|
-
await expect(mermaid.parse(shapeSource)).resolves.toMatchObject({
|
|
54
|
-
diagramType: expect.stringMatching(/^flowchart/),
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
|
|
59
|
-
describe('Mermaid source operations', () => {
|
|
60
|
-
it('updates one managed declaration for repeated rename and shape edits', async () => {
|
|
61
|
-
const renamed = renameMermaidNode(source, model.nodes[0], 'Begin');
|
|
62
|
-
expect(renamed.ok).toBe(true);
|
|
63
|
-
const shaped = changeMermaidNodeShape(
|
|
64
|
-
renamed.source,
|
|
65
|
-
{ ...model.nodes[0], label: 'Begin' },
|
|
66
|
-
'cloud',
|
|
67
|
-
);
|
|
68
|
-
expect(shaped.source.match(/%% squisq:node start/g)).toHaveLength(1);
|
|
69
|
-
expect(shaped.source).toContain('start@{ shape: cloud, label: "Begin" }');
|
|
70
|
-
await expect(mermaid.parse(shaped.source)).resolves.toBeTruthy();
|
|
71
|
-
});
|
|
72
|
-
|
|
73
|
-
it('adds, duplicates, and connects nodes as ordinary Mermaid statements', async () => {
|
|
74
|
-
const added = addMermaidNode(source, model, 'doc');
|
|
75
|
-
expect(added.nodeId).toBe('node');
|
|
76
|
-
const duplicated = duplicateMermaidNode(added.source, model, model.nodes[1]);
|
|
77
|
-
expect(duplicated.nodeId).toBe('next_copy');
|
|
78
|
-
const expandedModel: MermaidFlowchartModel = {
|
|
79
|
-
...model,
|
|
80
|
-
nodes: [
|
|
81
|
-
...model.nodes,
|
|
82
|
-
{ id: 'node', domId: 'node', label: 'New node', shape: 'doc', classes: [] },
|
|
83
|
-
],
|
|
84
|
-
};
|
|
85
|
-
const connected = connectMermaidNodes(duplicated.source, expandedModel, 'next', 'node');
|
|
86
|
-
expect(connected.source).toContain('next --> node');
|
|
87
|
-
await expect(mermaid.parse(connected.source)).resolves.toBeTruthy();
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
it('deletes a node from a simple edge while preserving its peer declaration', async () => {
|
|
91
|
-
const deleted = deleteMermaidNode(source, model, 'start');
|
|
92
|
-
expect(deleted.ok).toBe(true);
|
|
93
|
-
expect(deleted.source).not.toContain('start');
|
|
94
|
-
expect(deleted.source).toContain('next@{ shape: rect, label: "Next" }');
|
|
95
|
-
await expect(mermaid.parse(deleted.source)).resolves.toBeTruthy();
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it('disconnects a simple edge while preserving both endpoint declarations', async () => {
|
|
99
|
-
const disconnected = disconnectMermaidEdge(source, model, model.edges[0]);
|
|
100
|
-
expect(disconnected.ok).toBe(true);
|
|
101
|
-
expect(disconnected.source).not.toContain('-->');
|
|
102
|
-
expect(disconnected.source).toContain('start@{ shape: rect, label: "Start" }');
|
|
103
|
-
expect(disconnected.source).toContain('next@{ shape: rect, label: "Next" }');
|
|
104
|
-
await expect(mermaid.parse(disconnected.source)).resolves.toBeTruthy();
|
|
105
|
-
});
|
|
106
|
-
|
|
107
|
-
it('adds, updates, and removes an ordinary Mermaid connection label', async () => {
|
|
108
|
-
const labeled = setMermaidEdgeLabel(source, model, model.edges[0], 'continues');
|
|
109
|
-
expect(labeled.ok).toBe(true);
|
|
110
|
-
expect(labeled.source).toContain('-->|"continues"| next["Next"]');
|
|
111
|
-
await expect(mermaid.parse(labeled.source)).resolves.toBeTruthy();
|
|
112
|
-
|
|
113
|
-
const labeledEdge = { ...model.edges[0], label: 'continues' };
|
|
114
|
-
const updated = setMermaidEdgeLabel(labeled.source, model, labeledEdge, 'when ready');
|
|
115
|
-
expect(updated.ok).toBe(true);
|
|
116
|
-
expect(updated.source).toContain('-->|"when ready"| next["Next"]');
|
|
117
|
-
await expect(mermaid.parse(updated.source)).resolves.toBeTruthy();
|
|
118
|
-
|
|
119
|
-
const cleared = setMermaidEdgeLabel(
|
|
120
|
-
updated.source,
|
|
121
|
-
model,
|
|
122
|
-
{ ...model.edges[0], label: 'when ready' },
|
|
123
|
-
'',
|
|
124
|
-
);
|
|
125
|
-
expect(cleared.ok).toBe(true);
|
|
126
|
-
expect(cleared.source).toBe(source);
|
|
127
|
-
await expect(mermaid.parse(cleared.source)).resolves.toBeTruthy();
|
|
128
|
-
});
|
|
129
|
-
|
|
130
|
-
it('labels Squisq-managed connections without adding a second edge statement', async () => {
|
|
131
|
-
const expandedModel: MermaidFlowchartModel = {
|
|
132
|
-
...model,
|
|
133
|
-
nodes: [
|
|
134
|
-
...model.nodes,
|
|
135
|
-
{ id: 'third', domId: 'third', label: 'Third', shape: 'rect', classes: [] },
|
|
136
|
-
],
|
|
137
|
-
};
|
|
138
|
-
const connected = connectMermaidNodes(source, expandedModel, 'next', 'third');
|
|
139
|
-
const managedEdge = {
|
|
140
|
-
id: 'managed',
|
|
141
|
-
source: 'next',
|
|
142
|
-
target: 'third',
|
|
143
|
-
label: '',
|
|
144
|
-
};
|
|
145
|
-
const labeled = setMermaidEdgeLabel(connected.source, expandedModel, managedEdge, 'handoff');
|
|
146
|
-
expect(labeled.ok).toBe(true);
|
|
147
|
-
expect(labeled.source.match(/next -->/g)).toHaveLength(1);
|
|
148
|
-
expect(labeled.source).toContain('next -->|"handoff"| third');
|
|
149
|
-
await expect(mermaid.parse(labeled.source)).resolves.toBeTruthy();
|
|
150
|
-
});
|
|
151
|
-
|
|
152
|
-
it('refuses to label an edge inside a compact statement', () => {
|
|
153
|
-
const denseSource = 'flowchart LR\n start & next --> third';
|
|
154
|
-
const denseModel: MermaidFlowchartModel = {
|
|
155
|
-
kind: 'flowchart',
|
|
156
|
-
direction: 'LR',
|
|
157
|
-
nodes: ['start', 'next', 'third'].map((id) => ({
|
|
158
|
-
id,
|
|
159
|
-
domId: id,
|
|
160
|
-
label: id,
|
|
161
|
-
shape: 'rect' as const,
|
|
162
|
-
classes: [],
|
|
163
|
-
})),
|
|
164
|
-
edges: [
|
|
165
|
-
{ id: '1', source: 'start', target: 'third', label: '' },
|
|
166
|
-
{ id: '2', source: 'next', target: 'third', label: '' },
|
|
167
|
-
],
|
|
168
|
-
};
|
|
169
|
-
const result = setMermaidEdgeLabel(denseSource, denseModel, denseModel.edges[0], 'unsafe');
|
|
170
|
-
expect(result.ok).toBe(false);
|
|
171
|
-
expect(result.source).toBe(denseSource);
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
it('refuses a destructive edit that would erase unrelated compact edges', () => {
|
|
175
|
-
const denseSource = 'flowchart LR\n start & next --> third & fourth';
|
|
176
|
-
const denseModel: MermaidFlowchartModel = {
|
|
177
|
-
kind: 'flowchart',
|
|
178
|
-
direction: 'LR',
|
|
179
|
-
nodes: ['start', 'next', 'third', 'fourth'].map((id) => ({
|
|
180
|
-
id,
|
|
181
|
-
domId: id,
|
|
182
|
-
label: id,
|
|
183
|
-
shape: 'rect' as const,
|
|
184
|
-
classes: [],
|
|
185
|
-
})),
|
|
186
|
-
edges: [
|
|
187
|
-
{ id: '1', source: 'start', target: 'third', label: '' },
|
|
188
|
-
{ id: '2', source: 'start', target: 'fourth', label: '' },
|
|
189
|
-
{ id: '3', source: 'next', target: 'third', label: '' },
|
|
190
|
-
{ id: '4', source: 'next', target: 'fourth', label: '' },
|
|
191
|
-
],
|
|
192
|
-
};
|
|
193
|
-
const result = deleteMermaidNode(denseSource, denseModel, 'next');
|
|
194
|
-
expect(result.ok).toBe(false);
|
|
195
|
-
expect(result.source).toBe(denseSource);
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
it('changes the diagram direction without touching the body', () => {
|
|
199
|
-
const result = setMermaidFlowchartDirection(source, 'TB');
|
|
200
|
-
expect(result.source).toBe('flowchart TB\n start["Start"] --> next["Next"]');
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
it('rejects ids that cannot be safely emitted in general node syntax', () => {
|
|
204
|
-
expect(
|
|
205
|
-
upsertMermaidNode(source, {
|
|
206
|
-
id: 'not safe',
|
|
207
|
-
label: 'Nope',
|
|
208
|
-
shape: 'rect',
|
|
209
|
-
classes: [],
|
|
210
|
-
}).ok,
|
|
211
|
-
).toBe(false);
|
|
212
|
-
});
|
|
213
|
-
});
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import mermaid from 'mermaid';
|
|
2
|
-
import { beforeAll, describe, expect, it } from 'vitest';
|
|
3
|
-
import { inspectMermaidSource } from '../mermaidRenderer';
|
|
4
|
-
|
|
5
|
-
const COMPLEX_FLOWCHART = [
|
|
6
|
-
'flowchart LR',
|
|
7
|
-
' client["MCP client"] <--> transport["Local stdio transport"]',
|
|
8
|
-
' transport <--> sdk["MCP SDK server"]',
|
|
9
|
-
'',
|
|
10
|
-
' subgraph docblocks["DocBlocks MCP process"]',
|
|
11
|
-
' sdk --> tools["19 strict tools"]',
|
|
12
|
-
' tools --> guard["Guarded expensive operations"]',
|
|
13
|
-
' guard --> documents["DocumentService: source resolution and normalization"]',
|
|
14
|
-
' guard --> intelligence["Inspect, validate, compare, preview"]',
|
|
15
|
-
' guard --> conversion["Fidelity and conversion orchestration"]',
|
|
16
|
-
' tools --> authority["McpFileAuthority: granted roots and containment"]',
|
|
17
|
-
' tools --> artifacts["Session ArtifactStore and reports"]',
|
|
18
|
-
' documents --> conversion',
|
|
19
|
-
' conversion --> artifacts',
|
|
20
|
-
' intelligence --> artifacts',
|
|
21
|
-
' end',
|
|
22
|
-
'',
|
|
23
|
-
' documents --> squisq["Linked Squisq parser, Doc model, formats, themes, templates"]',
|
|
24
|
-
' conversion --> squisq',
|
|
25
|
-
' intelligence --> squisq',
|
|
26
|
-
' artifacts --> resources["Artifact and report resources"]',
|
|
27
|
-
' authority --> filesystem["Explicitly granted local roots"]',
|
|
28
|
-
].join('\n');
|
|
29
|
-
|
|
30
|
-
beforeAll(() => {
|
|
31
|
-
mermaid.initialize({
|
|
32
|
-
startOnLoad: false,
|
|
33
|
-
securityLevel: 'strict',
|
|
34
|
-
suppressErrorRendering: true,
|
|
35
|
-
});
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
describe('pinned Mermaid syntax integration', () => {
|
|
39
|
-
it('accepts the requested complex flowchart through Mermaid itself', async () => {
|
|
40
|
-
await expect(mermaid.parse(COMPLEX_FLOWCHART)).resolves.toMatchObject({
|
|
41
|
-
diagramType: expect.stringMatching(/^flowchart/),
|
|
42
|
-
});
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
it('exposes Mermaid node and edge ids for structured canvas gestures', async () => {
|
|
46
|
-
const model = await inspectMermaidSource(
|
|
47
|
-
'flowchart LR\n start["Start"] --> decision@{ shape: diam, label: "Ready?" }',
|
|
48
|
-
);
|
|
49
|
-
expect(model).toMatchObject({
|
|
50
|
-
kind: 'flowchart',
|
|
51
|
-
direction: 'LR',
|
|
52
|
-
nodes: [
|
|
53
|
-
{ id: 'start', label: 'Start', shape: 'rect' },
|
|
54
|
-
{ id: 'decision', label: 'Ready?', shape: 'diam' },
|
|
55
|
-
],
|
|
56
|
-
edges: [{ source: 'start', target: 'decision' }],
|
|
57
|
-
});
|
|
58
|
-
expect(model?.nodes.every((node) => node.domId.startsWith('flowchart-'))).toBe(true);
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it.each([
|
|
62
|
-
['sequence', 'sequenceDiagram\n Alice->>Bob: Hello'],
|
|
63
|
-
['state', 'stateDiagram-v2\n [*] --> Ready'],
|
|
64
|
-
['class', 'classDiagram\n Animal <|-- Duck'],
|
|
65
|
-
['er', 'erDiagram\n CUSTOMER ||--o{ ORDER : places'],
|
|
66
|
-
['gantt', 'gantt\n title Plan\n section Work\n Task :a1, 2026-01-01, 1d'],
|
|
67
|
-
['mindmap', 'mindmap\n root((Squisq))\n Core\n Editor'],
|
|
68
|
-
])('accepts %s diagrams without a Squisq-specific parser', async (_name, source) => {
|
|
69
|
-
await expect(mermaid.parse(source)).resolves.toBeTruthy();
|
|
70
|
-
});
|
|
71
|
-
});
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/** ProseMirror write boundary for Mermaid source-backed diagram gestures. */
|
|
2
|
-
|
|
3
|
-
import type { Editor } from '@tiptap/react';
|
|
4
|
-
import { findMermaidDiagramBlockPos, isMermaidDiagramNode } from './MermaidDiagramExtension';
|
|
5
|
-
import type { MermaidSourceEditResult } from './mermaidSourceOps';
|
|
6
|
-
|
|
7
|
-
export function replaceMermaidFenceSource(
|
|
8
|
-
editor: Editor,
|
|
9
|
-
blockId: string,
|
|
10
|
-
nextSource: string,
|
|
11
|
-
): boolean {
|
|
12
|
-
const pos = findMermaidDiagramBlockPos(editor, blockId);
|
|
13
|
-
if (pos === null) return false;
|
|
14
|
-
return editor
|
|
15
|
-
.chain()
|
|
16
|
-
.command(({ tr, state }) => {
|
|
17
|
-
const node = tr.doc.nodeAt(pos);
|
|
18
|
-
if (!node || !isMermaidDiagramNode(node) || node.textContent === nextSource) return false;
|
|
19
|
-
const from = pos + 1;
|
|
20
|
-
const to = pos + node.nodeSize - 1;
|
|
21
|
-
if (nextSource) tr.replaceWith(from, to, state.schema.text(nextSource));
|
|
22
|
-
else tr.delete(from, to);
|
|
23
|
-
return true;
|
|
24
|
-
})
|
|
25
|
-
.run();
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export function applyMermaidSourceEdit(
|
|
29
|
-
editor: Editor,
|
|
30
|
-
blockId: string,
|
|
31
|
-
edit: MermaidSourceEditResult,
|
|
32
|
-
): boolean {
|
|
33
|
-
return edit.ok && replaceMermaidFenceSource(editor, blockId, edit.source);
|
|
34
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
/** Live source view for one registered Mermaid code fence. */
|
|
2
|
-
|
|
3
|
-
import { useEffect, useMemo, useState } from 'react';
|
|
4
|
-
import type { Editor } from '@tiptap/react';
|
|
5
|
-
import { findMermaidDiagramBlockPos, isMermaidDiagramNode } from './MermaidDiagramExtension';
|
|
6
|
-
|
|
7
|
-
export interface MermaidDiagramData {
|
|
8
|
-
/** Mermaid source exactly as stored inside the code block. */
|
|
9
|
-
source: string;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export function useMermaidDiagramData(editor: Editor, blockId: string): MermaidDiagramData | null {
|
|
13
|
-
const [version, setVersion] = useState(0);
|
|
14
|
-
useEffect(() => {
|
|
15
|
-
const onTransaction = () => setVersion((value) => value + 1);
|
|
16
|
-
editor.on('transaction', onTransaction);
|
|
17
|
-
return () => {
|
|
18
|
-
editor.off('transaction', onTransaction);
|
|
19
|
-
};
|
|
20
|
-
}, [editor]);
|
|
21
|
-
|
|
22
|
-
return useMemo(() => {
|
|
23
|
-
const pos = findMermaidDiagramBlockPos(editor, blockId);
|
|
24
|
-
if (pos === null) return null;
|
|
25
|
-
const node = editor.state.doc.nodeAt(pos);
|
|
26
|
-
if (!node || !isMermaidDiagramNode(node)) return null;
|
|
27
|
-
return { source: node.textContent };
|
|
28
|
-
// `version` is the transaction-backed invalidation token.
|
|
29
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
30
|
-
}, [editor, blockId, version]);
|
|
31
|
-
}
|
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
/** Curated starter gallery for the diagram grammars supported by Mermaid 11.16. */
|
|
2
|
-
|
|
3
|
-
export type MermaidDiagramCategory = 'Structure' | 'Planning' | 'Data';
|
|
4
|
-
|
|
5
|
-
export type MermaidDiagramPreview =
|
|
6
|
-
| 'flowchart'
|
|
7
|
-
| 'sequence'
|
|
8
|
-
| 'state'
|
|
9
|
-
| 'class'
|
|
10
|
-
| 'er'
|
|
11
|
-
| 'mindmap'
|
|
12
|
-
| 'c4'
|
|
13
|
-
| 'architecture'
|
|
14
|
-
| 'gantt'
|
|
15
|
-
| 'timeline'
|
|
16
|
-
| 'journey'
|
|
17
|
-
| 'kanban'
|
|
18
|
-
| 'git'
|
|
19
|
-
| 'pie'
|
|
20
|
-
| 'quadrant'
|
|
21
|
-
| 'sankey'
|
|
22
|
-
| 'xy'
|
|
23
|
-
| 'requirement';
|
|
24
|
-
|
|
25
|
-
export interface MermaidDiagramType {
|
|
26
|
-
readonly id: string;
|
|
27
|
-
readonly label: string;
|
|
28
|
-
readonly description: string;
|
|
29
|
-
readonly category: MermaidDiagramCategory;
|
|
30
|
-
readonly preview: MermaidDiagramPreview;
|
|
31
|
-
readonly starter: string;
|
|
32
|
-
/** Mermaid marks this grammar as beta or otherwise experimental. */
|
|
33
|
-
readonly badge?: 'Beta' | 'Experimental';
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
const lines = (...source: string[]) => source.join('\n');
|
|
37
|
-
|
|
38
|
-
export const MERMAID_DIAGRAM_TYPES: readonly MermaidDiagramType[] = [
|
|
39
|
-
{
|
|
40
|
-
id: 'flowchart',
|
|
41
|
-
label: 'Flowchart',
|
|
42
|
-
description: 'Processes, decisions, and connected shapes.',
|
|
43
|
-
category: 'Structure',
|
|
44
|
-
preview: 'flowchart',
|
|
45
|
-
starter: lines(
|
|
46
|
-
'flowchart LR',
|
|
47
|
-
' start["Start"] --> decision{"Ready?"}',
|
|
48
|
-
' decision -->|Yes| done["Done"]',
|
|
49
|
-
' decision -->|No| start',
|
|
50
|
-
),
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
id: 'sequence',
|
|
54
|
-
label: 'Sequence',
|
|
55
|
-
description: 'Messages exchanged between participants over time.',
|
|
56
|
-
category: 'Structure',
|
|
57
|
-
preview: 'sequence',
|
|
58
|
-
starter: lines(
|
|
59
|
-
'sequenceDiagram',
|
|
60
|
-
' participant Client',
|
|
61
|
-
' participant Service',
|
|
62
|
-
' Client->>Service: Request',
|
|
63
|
-
' Service-->>Client: Response',
|
|
64
|
-
),
|
|
65
|
-
},
|
|
66
|
-
{
|
|
67
|
-
id: 'state',
|
|
68
|
-
label: 'State',
|
|
69
|
-
description: 'States, transitions, choices, and lifecycles.',
|
|
70
|
-
category: 'Structure',
|
|
71
|
-
preview: 'state',
|
|
72
|
-
starter: lines(
|
|
73
|
-
'stateDiagram-v2',
|
|
74
|
-
' [*] --> Idle',
|
|
75
|
-
' Idle --> Working : start',
|
|
76
|
-
' Working --> Idle : finish',
|
|
77
|
-
' Working --> [*] : stop',
|
|
78
|
-
),
|
|
79
|
-
},
|
|
80
|
-
{
|
|
81
|
-
id: 'class',
|
|
82
|
-
label: 'Class',
|
|
83
|
-
description: 'Classes, members, inheritance, and relationships.',
|
|
84
|
-
category: 'Structure',
|
|
85
|
-
preview: 'class',
|
|
86
|
-
starter: lines(
|
|
87
|
-
'classDiagram',
|
|
88
|
-
' class Animal {',
|
|
89
|
-
' +String name',
|
|
90
|
-
' +speak()',
|
|
91
|
-
' }',
|
|
92
|
-
' Animal <|-- Dog',
|
|
93
|
-
' Dog : +fetch()',
|
|
94
|
-
),
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
id: 'entity-relationship',
|
|
98
|
-
label: 'Entity Relationship',
|
|
99
|
-
description: 'Entities, cardinality, and data relationships.',
|
|
100
|
-
category: 'Structure',
|
|
101
|
-
preview: 'er',
|
|
102
|
-
starter: lines(
|
|
103
|
-
'erDiagram',
|
|
104
|
-
' CUSTOMER ||--o{ ORDER : places',
|
|
105
|
-
' ORDER ||--|{ LINE_ITEM : contains',
|
|
106
|
-
' PRODUCT ||--o{ LINE_ITEM : appears_in',
|
|
107
|
-
),
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
id: 'mindmap',
|
|
111
|
-
label: 'Mind Map',
|
|
112
|
-
description: 'Ideas arranged radially around a central topic.',
|
|
113
|
-
category: 'Structure',
|
|
114
|
-
preview: 'mindmap',
|
|
115
|
-
starter: lines(
|
|
116
|
-
'mindmap',
|
|
117
|
-
' root((Project))',
|
|
118
|
-
' Product',
|
|
119
|
-
' Research',
|
|
120
|
-
' Design',
|
|
121
|
-
' Delivery',
|
|
122
|
-
' Build',
|
|
123
|
-
' Launch',
|
|
124
|
-
),
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
id: 'c4-context',
|
|
128
|
-
label: 'C4 Context',
|
|
129
|
-
description: 'People, systems, containers, and dependencies.',
|
|
130
|
-
category: 'Structure',
|
|
131
|
-
preview: 'c4',
|
|
132
|
-
badge: 'Experimental',
|
|
133
|
-
starter: lines(
|
|
134
|
-
'C4Context',
|
|
135
|
-
' title System context',
|
|
136
|
-
' Person(user, "User")',
|
|
137
|
-
' System(app, "Application")',
|
|
138
|
-
' System_Ext(api, "External API")',
|
|
139
|
-
' Rel(user, app, "Uses")',
|
|
140
|
-
' Rel(app, api, "Calls")',
|
|
141
|
-
),
|
|
142
|
-
},
|
|
143
|
-
{
|
|
144
|
-
id: 'architecture',
|
|
145
|
-
label: 'Architecture',
|
|
146
|
-
description: 'Cloud services, resources, groups, and ports.',
|
|
147
|
-
category: 'Structure',
|
|
148
|
-
preview: 'architecture',
|
|
149
|
-
badge: 'Beta',
|
|
150
|
-
starter: lines(
|
|
151
|
-
'architecture-beta',
|
|
152
|
-
' group api(cloud)[API]',
|
|
153
|
-
' service client(internet)[Client]',
|
|
154
|
-
' service server(server)[Service] in api',
|
|
155
|
-
' service db(database)[Database] in api',
|
|
156
|
-
' client:R --> L:server',
|
|
157
|
-
' server:R --> L:db',
|
|
158
|
-
),
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
id: 'gantt',
|
|
162
|
-
label: 'Gantt',
|
|
163
|
-
description: 'Tasks, dependencies, milestones, and dates.',
|
|
164
|
-
category: 'Planning',
|
|
165
|
-
preview: 'gantt',
|
|
166
|
-
starter: lines(
|
|
167
|
-
'gantt',
|
|
168
|
-
' title Project plan',
|
|
169
|
-
' dateFormat YYYY-MM-DD',
|
|
170
|
-
' section Build',
|
|
171
|
-
' Design :done, design, 2026-01-01, 3d',
|
|
172
|
-
' Implement :active, build, after design, 5d',
|
|
173
|
-
' Ship :milestone, after build, 0d',
|
|
174
|
-
),
|
|
175
|
-
},
|
|
176
|
-
{
|
|
177
|
-
id: 'timeline',
|
|
178
|
-
label: 'Timeline',
|
|
179
|
-
description: 'Events and milestones arranged chronologically.',
|
|
180
|
-
category: 'Planning',
|
|
181
|
-
preview: 'timeline',
|
|
182
|
-
starter: lines(
|
|
183
|
-
'timeline',
|
|
184
|
-
' title Product launch',
|
|
185
|
-
' Q1 : Research',
|
|
186
|
-
' Q2 : Build : Test',
|
|
187
|
-
' Q3 : Launch',
|
|
188
|
-
),
|
|
189
|
-
},
|
|
190
|
-
{
|
|
191
|
-
id: 'journey',
|
|
192
|
-
label: 'User Journey',
|
|
193
|
-
description: 'Experiences, actors, stages, and satisfaction.',
|
|
194
|
-
category: 'Planning',
|
|
195
|
-
preview: 'journey',
|
|
196
|
-
starter: lines(
|
|
197
|
-
'journey',
|
|
198
|
-
' title Customer journey',
|
|
199
|
-
' section Discover',
|
|
200
|
-
' Find product: 5: Customer',
|
|
201
|
-
' Compare options: 3: Customer',
|
|
202
|
-
' section Buy',
|
|
203
|
-
' Checkout: 4: Customer',
|
|
204
|
-
),
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
id: 'kanban',
|
|
208
|
-
label: 'Kanban',
|
|
209
|
-
description: 'Work items organized into workflow columns.',
|
|
210
|
-
category: 'Planning',
|
|
211
|
-
preview: 'kanban',
|
|
212
|
-
starter: lines(
|
|
213
|
-
'kanban',
|
|
214
|
-
' todo[To do]',
|
|
215
|
-
' task1[Plan the work]',
|
|
216
|
-
' doing[In progress]',
|
|
217
|
-
' task2[Build the feature]',
|
|
218
|
-
' done[Done]',
|
|
219
|
-
' task3[Ship it]',
|
|
220
|
-
),
|
|
221
|
-
},
|
|
222
|
-
{
|
|
223
|
-
id: 'git-graph',
|
|
224
|
-
label: 'Git Graph',
|
|
225
|
-
description: 'Branches, commits, merges, and releases.',
|
|
226
|
-
category: 'Planning',
|
|
227
|
-
preview: 'git',
|
|
228
|
-
starter: lines(
|
|
229
|
-
'gitGraph',
|
|
230
|
-
' commit id: "Plan"',
|
|
231
|
-
' branch feature',
|
|
232
|
-
' checkout feature',
|
|
233
|
-
' commit id: "Build"',
|
|
234
|
-
' checkout main',
|
|
235
|
-
' merge feature',
|
|
236
|
-
' commit id: "Ship"',
|
|
237
|
-
),
|
|
238
|
-
},
|
|
239
|
-
{
|
|
240
|
-
id: 'pie',
|
|
241
|
-
label: 'Pie Chart',
|
|
242
|
-
description: 'A compact part-to-whole comparison.',
|
|
243
|
-
category: 'Data',
|
|
244
|
-
preview: 'pie',
|
|
245
|
-
starter: lines(
|
|
246
|
-
'pie showData',
|
|
247
|
-
' title Work allocation',
|
|
248
|
-
' "Build" : 45',
|
|
249
|
-
' "Test" : 30',
|
|
250
|
-
' "Plan" : 25',
|
|
251
|
-
),
|
|
252
|
-
},
|
|
253
|
-
{
|
|
254
|
-
id: 'quadrant',
|
|
255
|
-
label: 'Quadrant',
|
|
256
|
-
description: 'Items positioned against two dimensions.',
|
|
257
|
-
category: 'Data',
|
|
258
|
-
preview: 'quadrant',
|
|
259
|
-
starter: lines(
|
|
260
|
-
'quadrantChart',
|
|
261
|
-
' title Impact and effort',
|
|
262
|
-
' x-axis Low effort --> High effort',
|
|
263
|
-
' y-axis Low impact --> High impact',
|
|
264
|
-
' "Quick win": [0.25, 0.80]',
|
|
265
|
-
' "Big bet": [0.75, 0.85]',
|
|
266
|
-
),
|
|
267
|
-
},
|
|
268
|
-
{
|
|
269
|
-
id: 'sankey',
|
|
270
|
-
label: 'Sankey',
|
|
271
|
-
description: 'Weighted flows between sources and destinations.',
|
|
272
|
-
category: 'Data',
|
|
273
|
-
preview: 'sankey',
|
|
274
|
-
badge: 'Beta',
|
|
275
|
-
starter: lines(
|
|
276
|
-
'sankey-beta',
|
|
277
|
-
' Source,Process,80',
|
|
278
|
-
' Source,Loss,20',
|
|
279
|
-
' Process,Output,70',
|
|
280
|
-
' Process,Waste,10',
|
|
281
|
-
),
|
|
282
|
-
},
|
|
283
|
-
{
|
|
284
|
-
id: 'xy-chart',
|
|
285
|
-
label: 'XY Chart',
|
|
286
|
-
description: 'Bar and line series on numeric axes.',
|
|
287
|
-
category: 'Data',
|
|
288
|
-
preview: 'xy',
|
|
289
|
-
badge: 'Beta',
|
|
290
|
-
starter: lines(
|
|
291
|
-
'xychart-beta',
|
|
292
|
-
' title "Delivery trend"',
|
|
293
|
-
' x-axis [Jan, Feb, Mar, Apr]',
|
|
294
|
-
' y-axis "Items" 0 --> 100',
|
|
295
|
-
' bar [30, 55, 70, 90]',
|
|
296
|
-
' line [25, 45, 75, 85]',
|
|
297
|
-
),
|
|
298
|
-
},
|
|
299
|
-
{
|
|
300
|
-
id: 'requirement',
|
|
301
|
-
label: 'Requirement',
|
|
302
|
-
description: 'Requirements, elements, risks, and verification.',
|
|
303
|
-
category: 'Data',
|
|
304
|
-
preview: 'requirement',
|
|
305
|
-
starter: lines(
|
|
306
|
-
'requirementDiagram',
|
|
307
|
-
' requirement secure_auth {',
|
|
308
|
-
' id: 1',
|
|
309
|
-
' text: Users must authenticate',
|
|
310
|
-
' risk: high',
|
|
311
|
-
' verifymethod: test',
|
|
312
|
-
' }',
|
|
313
|
-
' element app {',
|
|
314
|
-
' type: system',
|
|
315
|
-
' }',
|
|
316
|
-
' app - satisfies -> secure_auth',
|
|
317
|
-
),
|
|
318
|
-
},
|
|
319
|
-
];
|
|
320
|
-
|
|
321
|
-
export const DEFAULT_MERMAID_DIAGRAM_TYPE = MERMAID_DIAGRAM_TYPES[0];
|
|
322
|
-
|
|
323
|
-
export function mermaidDiagramMarkdown(source: string): string {
|
|
324
|
-
return `\n\`\`\`mermaid\n${source}\n\`\`\`\n`;
|
|
325
|
-
}
|