@bendyline/squisq-editor-react 2.1.0 → 2.3.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/chunk-54UGTQBO.js +862 -0
- package/dist/chunk-5JMHFAVW.js +2408 -0
- package/dist/chunk-5Q4JN4I5.js +132 -0
- package/dist/chunk-6VDYKI3L.js +49 -0
- package/dist/chunk-GS7QWYFT.js +9 -0
- package/dist/chunk-MJJK7YQB.js +949 -0
- package/dist/chunk-NITZVAXL.js +986 -0
- package/dist/chunk-TRCKHRBS.js +35234 -0
- package/dist/chunk-V44VP242.js +3256 -0
- package/dist/image-editor/index.d.ts +223 -0
- package/dist/image-editor/index.js +15 -0
- package/dist/index.d.ts +2060 -4040
- package/dist/index.js +496 -40014
- package/dist/json-editor/index.d.ts +27 -0
- package/dist/json-editor/index.js +7 -0
- package/dist/monaco.d.ts +1 -1
- package/dist/monaco.js +1 -2
- package/dist/recorder/index.d.ts +407 -0
- package/dist/recorder/index.js +43 -0
- package/dist/shell/index.d.ts +9 -0
- package/dist/shell/index.js +22 -0
- package/dist/shell-BxSCBm4H.d.ts +1064 -0
- package/dist/styles/index.css +598 -161
- package/dist/teleprompter/index.d.ts +497 -0
- package/dist/teleprompter/index.js +57 -0
- package/package.json +34 -8
- 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,359 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* VersionHistoryPanel
|
|
3
|
-
*
|
|
4
|
-
* Toolbar-anchored popover that lists prior version snapshots and lets
|
|
5
|
-
* the user revert to one. When a snapshot is selected, a Monaco diff
|
|
6
|
-
* view appears to the left of the list comparing the snapshot (original,
|
|
7
|
-
* left) with the current editor content (modified, right).
|
|
8
|
-
*
|
|
9
|
-
* Wraps the toolbar trigger button + popover surface. Versioning state
|
|
10
|
-
* is read from the EditorContext — render this component anywhere inside
|
|
11
|
-
* a provider that has `allowVersioning` and a `container`.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { useCallback, useEffect, useMemo, useRef, useState, type CSSProperties } from 'react';
|
|
15
|
-
import { DiffEditor } from '@monaco-editor/react';
|
|
16
|
-
import type { Version } from '@bendyline/squisq/versions';
|
|
17
|
-
import { useEditorContext } from './EditorContext';
|
|
18
|
-
import { useMonacoLoader } from './useMonacoLoader';
|
|
19
|
-
import { Icon } from './Icon';
|
|
20
|
-
|
|
21
|
-
interface LazyDiffEditorProps {
|
|
22
|
-
original: string;
|
|
23
|
-
modified: string;
|
|
24
|
-
theme: 'vs' | 'vs-dark';
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
const lazyLoadingStyle: CSSProperties = {
|
|
28
|
-
display: 'flex',
|
|
29
|
-
alignItems: 'center',
|
|
30
|
-
justifyContent: 'center',
|
|
31
|
-
width: '100%',
|
|
32
|
-
height: '100%',
|
|
33
|
-
color: 'var(--squisq-editor-muted-foreground, #6a6258)',
|
|
34
|
-
fontSize: 12,
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Defers the `<DiffEditor>` mount until the lazy monaco namespace +
|
|
39
|
-
* `loader.config()` are in place. Without the gate, the
|
|
40
|
-
* `@monaco-editor/react` singleton loader would fall back to its CDN
|
|
41
|
-
* default for any consumer that hasn't already mounted `<RawEditor>`.
|
|
42
|
-
*
|
|
43
|
-
* This wrapper is what makes `useMonacoLoader` worth using here —
|
|
44
|
-
* VersionHistoryPanel itself is always present in the toolbar, so
|
|
45
|
-
* subscribing at its level would defeat the lazy-load. The hook only
|
|
46
|
-
* fires when a snapshot is actually selected.
|
|
47
|
-
*/
|
|
48
|
-
function LazyDiffEditor({ original, modified, theme }: LazyDiffEditorProps) {
|
|
49
|
-
const { ready } = useMonacoLoader();
|
|
50
|
-
if (!ready) {
|
|
51
|
-
return <div style={lazyLoadingStyle}>Loading diff…</div>;
|
|
52
|
-
}
|
|
53
|
-
return (
|
|
54
|
-
<DiffEditor
|
|
55
|
-
original={original}
|
|
56
|
-
modified={modified}
|
|
57
|
-
language="markdown"
|
|
58
|
-
theme={theme}
|
|
59
|
-
options={{
|
|
60
|
-
readOnly: true,
|
|
61
|
-
renderSideBySide: true,
|
|
62
|
-
minimap: { enabled: false },
|
|
63
|
-
scrollBeyondLastLine: false,
|
|
64
|
-
wordWrap: 'on',
|
|
65
|
-
automaticLayout: true,
|
|
66
|
-
fontSize: 12,
|
|
67
|
-
lineNumbers: 'off',
|
|
68
|
-
glyphMargin: false,
|
|
69
|
-
folding: false,
|
|
70
|
-
overviewRulerLanes: 0,
|
|
71
|
-
renderOverviewRuler: false,
|
|
72
|
-
}}
|
|
73
|
-
/>
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
interface PanelState {
|
|
78
|
-
loading: boolean;
|
|
79
|
-
versions: Version[];
|
|
80
|
-
/** The snapshot currently shown in the diff view, with its content. */
|
|
81
|
-
selected: { version: Version; content: string } | null;
|
|
82
|
-
pendingRevert: Version | null;
|
|
83
|
-
error: string | null;
|
|
84
|
-
/** Stamp captured each time the popover opens — labels the synthetic
|
|
85
|
-
* "Current" row so it reads as a moment in time alongside the
|
|
86
|
-
* snapshots. */
|
|
87
|
-
currentStamp: Date;
|
|
88
|
-
/** Cached content of the most recent snapshot, used to detect (and
|
|
89
|
-
* hide) a snapshot that's byte-identical to the current draft so the
|
|
90
|
-
* synthetic Current row alone represents that state. Compared against
|
|
91
|
-
* the live `markdownSource` on every render, so the suppressed row
|
|
92
|
-
* re-appears as soon as the user types. */
|
|
93
|
-
latestSnapshotContent: string | null;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
const initialState: PanelState = {
|
|
97
|
-
loading: false,
|
|
98
|
-
versions: [],
|
|
99
|
-
selected: null,
|
|
100
|
-
pendingRevert: null,
|
|
101
|
-
error: null,
|
|
102
|
-
currentStamp: new Date(),
|
|
103
|
-
latestSnapshotContent: null,
|
|
104
|
-
};
|
|
105
|
-
|
|
106
|
-
const dateFormatter = new Intl.DateTimeFormat(undefined, {
|
|
107
|
-
dateStyle: 'medium',
|
|
108
|
-
timeStyle: 'short',
|
|
109
|
-
});
|
|
110
|
-
|
|
111
|
-
function formatBytes(n: number): string {
|
|
112
|
-
if (n < 1024) return `${n} B`;
|
|
113
|
-
if (n < 1024 * 1024) return `${(n / 1024).toFixed(1)} KB`;
|
|
114
|
-
return `${(n / (1024 * 1024)).toFixed(1)} MB`;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
export function VersionHistoryPanel() {
|
|
118
|
-
const { versioning, replaceAll, markdownSource, colorScheme } = useEditorContext();
|
|
119
|
-
const [open, setOpen] = useState(false);
|
|
120
|
-
const [state, setState] = useState<PanelState>(initialState);
|
|
121
|
-
const containerRef = useRef<HTMLDivElement>(null);
|
|
122
|
-
|
|
123
|
-
const refresh = useCallback(async () => {
|
|
124
|
-
if (!versioning) return;
|
|
125
|
-
setState((s) => ({ ...s, loading: true, error: null }));
|
|
126
|
-
try {
|
|
127
|
-
const versions = await versioning.listVersions();
|
|
128
|
-
// Cache the latest snapshot's content so we can hide it when it
|
|
129
|
-
// matches the live draft (the Current row already represents it).
|
|
130
|
-
const latest = versions[0];
|
|
131
|
-
const latestSnapshotContent = latest ? await versioning.readVersion(latest) : null;
|
|
132
|
-
setState((s) => ({ ...s, loading: false, versions, latestSnapshotContent }));
|
|
133
|
-
} catch (err: unknown) {
|
|
134
|
-
const message = err instanceof Error ? err.message : 'Failed to list versions';
|
|
135
|
-
setState((s) => ({ ...s, loading: false, error: message }));
|
|
136
|
-
}
|
|
137
|
-
}, [versioning]);
|
|
138
|
-
|
|
139
|
-
// Refresh the list whenever the popover opens.
|
|
140
|
-
useEffect(() => {
|
|
141
|
-
if (open) {
|
|
142
|
-
setState((s) => ({ ...s, currentStamp: new Date() }));
|
|
143
|
-
void refresh();
|
|
144
|
-
} else {
|
|
145
|
-
// Reset transient UI when closing so the next open is clean.
|
|
146
|
-
setState((s) => ({ ...s, selected: null, pendingRevert: null }));
|
|
147
|
-
}
|
|
148
|
-
}, [open, refresh]);
|
|
149
|
-
|
|
150
|
-
// Click-outside to close, mirroring the toolbar overflow menu.
|
|
151
|
-
useEffect(() => {
|
|
152
|
-
if (!open) return;
|
|
153
|
-
const handler = (e: MouseEvent) => {
|
|
154
|
-
if (containerRef.current && !containerRef.current.contains(e.target as Node)) {
|
|
155
|
-
setOpen(false);
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
document.addEventListener('mousedown', handler);
|
|
159
|
-
return () => document.removeEventListener('mousedown', handler);
|
|
160
|
-
}, [open]);
|
|
161
|
-
|
|
162
|
-
const handleSelect = useCallback(
|
|
163
|
-
async (version: Version) => {
|
|
164
|
-
if (!versioning) return;
|
|
165
|
-
// Toggle off if this version is already selected.
|
|
166
|
-
if (state.selected?.version.path === version.path) {
|
|
167
|
-
setState((s) => ({ ...s, selected: null }));
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
const content = await versioning.readVersion(version);
|
|
171
|
-
if (content === null) {
|
|
172
|
-
setState((s) => ({ ...s, error: 'Snapshot is no longer available.' }));
|
|
173
|
-
return;
|
|
174
|
-
}
|
|
175
|
-
setState((s) => ({ ...s, selected: { version, content }, error: null }));
|
|
176
|
-
},
|
|
177
|
-
[versioning, state.selected],
|
|
178
|
-
);
|
|
179
|
-
|
|
180
|
-
const handleRevertConfirm = useCallback(
|
|
181
|
-
async (version: Version) => {
|
|
182
|
-
if (!versioning) return;
|
|
183
|
-
try {
|
|
184
|
-
const result = await versioning.revertToVersion(version, { snapshotCurrent: true });
|
|
185
|
-
if (!result.reverted) {
|
|
186
|
-
setState((s) => ({ ...s, error: 'Revert failed — snapshot missing.' }));
|
|
187
|
-
return;
|
|
188
|
-
}
|
|
189
|
-
const reverted = await versioning.readVersion(version);
|
|
190
|
-
if (reverted !== null) {
|
|
191
|
-
replaceAll(reverted);
|
|
192
|
-
}
|
|
193
|
-
setState((s) => ({ ...s, pendingRevert: null, selected: null }));
|
|
194
|
-
await refresh();
|
|
195
|
-
} catch (err: unknown) {
|
|
196
|
-
const message = err instanceof Error ? err.message : 'Revert failed';
|
|
197
|
-
setState((s) => ({ ...s, error: message }));
|
|
198
|
-
}
|
|
199
|
-
},
|
|
200
|
-
[versioning, replaceAll, refresh],
|
|
201
|
-
);
|
|
202
|
-
|
|
203
|
-
// Hide the most recent snapshot when its content is byte-identical to
|
|
204
|
-
// the live draft — the Current row already represents that state, and
|
|
205
|
-
// the diff against it would be empty anyway.
|
|
206
|
-
const latestMatchesCurrent =
|
|
207
|
-
state.latestSnapshotContent !== null && state.latestSnapshotContent === markdownSource;
|
|
208
|
-
const visibleVersions = useMemo(
|
|
209
|
-
() => (latestMatchesCurrent ? state.versions.slice(1) : state.versions),
|
|
210
|
-
[state.versions, latestMatchesCurrent],
|
|
211
|
-
);
|
|
212
|
-
const currentSize = useMemo(
|
|
213
|
-
() => new TextEncoder().encode(markdownSource).byteLength,
|
|
214
|
-
[markdownSource],
|
|
215
|
-
);
|
|
216
|
-
const hasDiff = state.selected !== null;
|
|
217
|
-
const diffTheme = colorScheme === 'dark' ? 'vs-dark' : 'vs';
|
|
218
|
-
|
|
219
|
-
if (!versioning) return null;
|
|
220
|
-
|
|
221
|
-
return (
|
|
222
|
-
<div className="squisq-version-history" ref={containerRef}>
|
|
223
|
-
<button
|
|
224
|
-
type="button"
|
|
225
|
-
className={`squisq-toolbar-button squisq-version-history-trigger${
|
|
226
|
-
open ? ' squisq-toolbar-button--active' : ''
|
|
227
|
-
}`}
|
|
228
|
-
data-tooltip="Version history"
|
|
229
|
-
aria-label="Version history"
|
|
230
|
-
aria-expanded={open}
|
|
231
|
-
onClick={() => setOpen((v) => !v)}
|
|
232
|
-
>
|
|
233
|
-
<Icon icon="fa-solid fa-clock-rotate-left" />
|
|
234
|
-
</button>
|
|
235
|
-
{open && (
|
|
236
|
-
<div
|
|
237
|
-
className={`squisq-version-history-popover${
|
|
238
|
-
hasDiff ? ' squisq-version-history-popover--with-diff' : ''
|
|
239
|
-
}`}
|
|
240
|
-
role="dialog"
|
|
241
|
-
aria-label="Version history"
|
|
242
|
-
>
|
|
243
|
-
{hasDiff && state.selected && (
|
|
244
|
-
<div className="squisq-version-history-diff">
|
|
245
|
-
<div className="squisq-version-history-diff-header">
|
|
246
|
-
<span className="squisq-version-history-diff-label">
|
|
247
|
-
<strong>Snapshot</strong> {dateFormatter.format(state.selected.version.timestamp)}
|
|
248
|
-
</span>
|
|
249
|
-
<span className="squisq-version-history-diff-label">
|
|
250
|
-
<strong>Current</strong>
|
|
251
|
-
</span>
|
|
252
|
-
</div>
|
|
253
|
-
<div className="squisq-version-history-diff-body">
|
|
254
|
-
<LazyDiffEditor
|
|
255
|
-
original={state.selected.content}
|
|
256
|
-
modified={markdownSource}
|
|
257
|
-
theme={diffTheme}
|
|
258
|
-
/>
|
|
259
|
-
</div>
|
|
260
|
-
</div>
|
|
261
|
-
)}
|
|
262
|
-
<div className="squisq-version-history-list-pane">
|
|
263
|
-
<div className="squisq-version-history-header">
|
|
264
|
-
<span className="squisq-version-history-title">Version history</span>
|
|
265
|
-
</div>
|
|
266
|
-
{state.error && <div className="squisq-version-history-error">{state.error}</div>}
|
|
267
|
-
{state.loading ? (
|
|
268
|
-
<div className="squisq-version-history-empty">Loading…</div>
|
|
269
|
-
) : visibleVersions.length === 0 ? (
|
|
270
|
-
<div className="squisq-version-history-empty">
|
|
271
|
-
No versions yet. Versions are saved automatically as you edit.
|
|
272
|
-
</div>
|
|
273
|
-
) : (
|
|
274
|
-
<ul className="squisq-version-history-list">
|
|
275
|
-
<li
|
|
276
|
-
className={`squisq-version-history-row squisq-version-history-row--current${
|
|
277
|
-
state.selected === null ? ' squisq-version-history-row--selected' : ''
|
|
278
|
-
}`}
|
|
279
|
-
>
|
|
280
|
-
<button
|
|
281
|
-
type="button"
|
|
282
|
-
className="squisq-version-history-row-select"
|
|
283
|
-
onClick={() => setState((s) => ({ ...s, selected: null }))}
|
|
284
|
-
>
|
|
285
|
-
<span className="squisq-version-history-row__time">
|
|
286
|
-
<strong>Current</strong> · {dateFormatter.format(state.currentStamp)}
|
|
287
|
-
</span>
|
|
288
|
-
<span className="squisq-version-history-row__size">
|
|
289
|
-
{formatBytes(currentSize)}
|
|
290
|
-
</span>
|
|
291
|
-
</button>
|
|
292
|
-
</li>
|
|
293
|
-
{visibleVersions.map((v) => {
|
|
294
|
-
const pending =
|
|
295
|
-
state.pendingRevert !== null && state.pendingRevert.path === v.path;
|
|
296
|
-
const selected = state.selected?.version.path === v.path;
|
|
297
|
-
return (
|
|
298
|
-
<li
|
|
299
|
-
key={v.path}
|
|
300
|
-
className={`squisq-version-history-row${
|
|
301
|
-
selected ? ' squisq-version-history-row--selected' : ''
|
|
302
|
-
}`}
|
|
303
|
-
>
|
|
304
|
-
<button
|
|
305
|
-
type="button"
|
|
306
|
-
className="squisq-version-history-row-select"
|
|
307
|
-
onClick={() => void handleSelect(v)}
|
|
308
|
-
>
|
|
309
|
-
<span className="squisq-version-history-row__time">
|
|
310
|
-
{dateFormatter.format(v.timestamp)}
|
|
311
|
-
</span>
|
|
312
|
-
<span className="squisq-version-history-row__size">
|
|
313
|
-
{formatBytes(v.size)}
|
|
314
|
-
</span>
|
|
315
|
-
</button>
|
|
316
|
-
<span className="squisq-version-history-row__actions">
|
|
317
|
-
<button
|
|
318
|
-
type="button"
|
|
319
|
-
className="squisq-version-history-link"
|
|
320
|
-
onClick={() => setState((s) => ({ ...s, pendingRevert: v }))}
|
|
321
|
-
>
|
|
322
|
-
Revert
|
|
323
|
-
</button>
|
|
324
|
-
</span>
|
|
325
|
-
{pending && (
|
|
326
|
-
<div className="squisq-version-history-confirm">
|
|
327
|
-
<span>
|
|
328
|
-
Revert to this version? Your current draft will be saved as a new
|
|
329
|
-
snapshot first. Reverting will reset your editor undo state.
|
|
330
|
-
</span>
|
|
331
|
-
<span className="squisq-version-history-confirm-actions">
|
|
332
|
-
<button
|
|
333
|
-
type="button"
|
|
334
|
-
className="squisq-version-history-link"
|
|
335
|
-
onClick={() => setState((s) => ({ ...s, pendingRevert: null }))}
|
|
336
|
-
>
|
|
337
|
-
Cancel
|
|
338
|
-
</button>
|
|
339
|
-
<button
|
|
340
|
-
type="button"
|
|
341
|
-
className="squisq-version-history-link squisq-version-history-link--primary"
|
|
342
|
-
onClick={() => handleRevertConfirm(v)}
|
|
343
|
-
>
|
|
344
|
-
Revert
|
|
345
|
-
</button>
|
|
346
|
-
</span>
|
|
347
|
-
</div>
|
|
348
|
-
)}
|
|
349
|
-
</li>
|
|
350
|
-
);
|
|
351
|
-
})}
|
|
352
|
-
</ul>
|
|
353
|
-
)}
|
|
354
|
-
</div>
|
|
355
|
-
</div>
|
|
356
|
-
)}
|
|
357
|
-
</div>
|
|
358
|
-
);
|
|
359
|
-
}
|
package/src/ViewMenuPanel.tsx
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ViewMenuPanel
|
|
3
|
-
*
|
|
4
|
-
* Toolbar overflow menu (`…` button) for view-related toggles. Currently
|
|
5
|
-
* houses the inline preview gutter toggle; new view options can be added
|
|
6
|
-
* as additional `<MenuToggle>` rows without restructuring.
|
|
7
|
-
*
|
|
8
|
-
* State lives in EditorContext so the toggle survives view switches and
|
|
9
|
-
* the host doesn't need to manage it. The initial value comes from the
|
|
10
|
-
* EditorShell `inlinePreview` prop.
|
|
11
|
-
*/
|
|
12
|
-
|
|
13
|
-
import { useCallback, useEffect, useId, useRef, useState } from 'react';
|
|
14
|
-
import { useEditorContext, type ThemeInheritance, type LayoutMode } from './EditorContext';
|
|
15
|
-
import { Icon } from './Icon';
|
|
16
|
-
|
|
17
|
-
export function ViewMenuPanel() {
|
|
18
|
-
const {
|
|
19
|
-
inlinePreviewVisible,
|
|
20
|
-
setInlinePreviewVisible,
|
|
21
|
-
statusBarVisible,
|
|
22
|
-
setStatusBarVisible,
|
|
23
|
-
outlineVisible,
|
|
24
|
-
setOutlineVisible,
|
|
25
|
-
blockTagVisibility,
|
|
26
|
-
setBlockTagVisibility,
|
|
27
|
-
themeInheritance,
|
|
28
|
-
setThemeInheritance,
|
|
29
|
-
layoutMode,
|
|
30
|
-
setLayoutMode,
|
|
31
|
-
} = useEditorContext();
|
|
32
|
-
const [open, setOpen] = useState(false);
|
|
33
|
-
const containerRef = useRef<HTMLDivElement>(null);
|
|
34
|
-
|
|
35
|
-
// Click-outside to close, mirroring VersionHistoryPanel.
|
|
36
|
-
useEffect(() => {
|
|
37
|
-
if (!open) return;
|
|
38
|
-
const handler = (e: MouseEvent) => {
|
|
39
|
-
if (containerRef.current && !containerRef.current.contains(e.target as Node)) {
|
|
40
|
-
setOpen(false);
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
document.addEventListener('mousedown', handler);
|
|
44
|
-
return () => document.removeEventListener('mousedown', handler);
|
|
45
|
-
}, [open]);
|
|
46
|
-
|
|
47
|
-
const toggleInlinePreview = useCallback(() => {
|
|
48
|
-
setInlinePreviewVisible(!inlinePreviewVisible);
|
|
49
|
-
}, [inlinePreviewVisible, setInlinePreviewVisible]);
|
|
50
|
-
|
|
51
|
-
const toggleStatusBar = useCallback(() => {
|
|
52
|
-
setStatusBarVisible(!statusBarVisible);
|
|
53
|
-
}, [statusBarVisible, setStatusBarVisible]);
|
|
54
|
-
|
|
55
|
-
const toggleOutline = useCallback(() => {
|
|
56
|
-
setOutlineVisible(!outlineVisible);
|
|
57
|
-
}, [outlineVisible, setOutlineVisible]);
|
|
58
|
-
|
|
59
|
-
return (
|
|
60
|
-
<div className="squisq-view-menu" ref={containerRef}>
|
|
61
|
-
<button
|
|
62
|
-
type="button"
|
|
63
|
-
className={`squisq-toolbar-button squisq-view-menu-trigger${
|
|
64
|
-
open ? ' squisq-toolbar-button--active' : ''
|
|
65
|
-
}`}
|
|
66
|
-
data-tooltip="View options"
|
|
67
|
-
aria-label="View options"
|
|
68
|
-
aria-expanded={open}
|
|
69
|
-
aria-haspopup="menu"
|
|
70
|
-
onClick={() => setOpen((v) => !v)}
|
|
71
|
-
>
|
|
72
|
-
<Icon icon="fa-solid fa-eye" />
|
|
73
|
-
</button>
|
|
74
|
-
{open && (
|
|
75
|
-
<div className="squisq-view-menu-popover" role="menu" aria-label="View options">
|
|
76
|
-
<MenuRadioGroup
|
|
77
|
-
label="View"
|
|
78
|
-
value={layoutMode}
|
|
79
|
-
onChange={(v) => setLayoutMode(v as LayoutMode)}
|
|
80
|
-
options={[
|
|
81
|
-
{ value: 'document', label: 'Document' },
|
|
82
|
-
{ value: 'block', label: 'Block-at-a-time' },
|
|
83
|
-
{ value: 'timeline', label: 'Timeline' },
|
|
84
|
-
]}
|
|
85
|
-
/>
|
|
86
|
-
<div className="squisq-view-menu-separator" role="separator" />
|
|
87
|
-
<MenuToggle label="Show outline" checked={outlineVisible} onChange={toggleOutline} />
|
|
88
|
-
<MenuToggle
|
|
89
|
-
label="Show block previews"
|
|
90
|
-
checked={inlinePreviewVisible}
|
|
91
|
-
onChange={toggleInlinePreview}
|
|
92
|
-
/>
|
|
93
|
-
<MenuRadioGroup
|
|
94
|
-
label="Show block tags"
|
|
95
|
-
value={blockTagVisibility}
|
|
96
|
-
onChange={(v) => setBlockTagVisibility(v as typeof blockTagVisibility)}
|
|
97
|
-
options={[
|
|
98
|
-
{ value: 'none', label: 'No inline block tags' },
|
|
99
|
-
{ value: 'active', label: 'Selected/hovered block' },
|
|
100
|
-
{ value: 'always', label: 'Always show' },
|
|
101
|
-
]}
|
|
102
|
-
/>
|
|
103
|
-
<MenuToggle
|
|
104
|
-
label="Show status bar"
|
|
105
|
-
checked={statusBarVisible}
|
|
106
|
-
onChange={toggleStatusBar}
|
|
107
|
-
/>
|
|
108
|
-
<div className="squisq-view-menu-separator" role="separator" />
|
|
109
|
-
<MenuRadioGroup
|
|
110
|
-
label="Editor styling from theme"
|
|
111
|
-
value={themeInheritance}
|
|
112
|
-
onChange={(v) => setThemeInheritance(v as ThemeInheritance)}
|
|
113
|
-
options={[
|
|
114
|
-
{ value: 'none', label: "Don't inherit" },
|
|
115
|
-
{ value: 'fonts', label: 'Fonts only' },
|
|
116
|
-
{ value: 'fonts-colors', label: 'Fonts & colors' },
|
|
117
|
-
]}
|
|
118
|
-
/>
|
|
119
|
-
</div>
|
|
120
|
-
)}
|
|
121
|
-
</div>
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
function MenuToggle({
|
|
126
|
-
label,
|
|
127
|
-
checked,
|
|
128
|
-
onChange,
|
|
129
|
-
}: {
|
|
130
|
-
label: string;
|
|
131
|
-
checked: boolean;
|
|
132
|
-
onChange: () => void;
|
|
133
|
-
}) {
|
|
134
|
-
return (
|
|
135
|
-
<label className="squisq-view-menu-row" role="menuitemcheckbox" aria-checked={checked}>
|
|
136
|
-
<input
|
|
137
|
-
type="checkbox"
|
|
138
|
-
className="squisq-view-menu-checkbox"
|
|
139
|
-
checked={checked}
|
|
140
|
-
onChange={onChange}
|
|
141
|
-
/>
|
|
142
|
-
<span className="squisq-view-menu-label">{label}</span>
|
|
143
|
-
</label>
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
function MenuRadioGroup({
|
|
148
|
-
label,
|
|
149
|
-
value,
|
|
150
|
-
onChange,
|
|
151
|
-
options,
|
|
152
|
-
}: {
|
|
153
|
-
label: string;
|
|
154
|
-
value: string;
|
|
155
|
-
onChange: (next: string) => void;
|
|
156
|
-
options: readonly { value: string; label: string }[];
|
|
157
|
-
}) {
|
|
158
|
-
const name = useId();
|
|
159
|
-
return (
|
|
160
|
-
<div
|
|
161
|
-
className="squisq-view-menu-row squisq-view-menu-row--radios"
|
|
162
|
-
role="radiogroup"
|
|
163
|
-
aria-label={label}
|
|
164
|
-
>
|
|
165
|
-
<span className="squisq-view-menu-label">{label}</span>
|
|
166
|
-
{options.map((o) => {
|
|
167
|
-
const checked = o.value === value;
|
|
168
|
-
return (
|
|
169
|
-
<label
|
|
170
|
-
key={o.value}
|
|
171
|
-
className="squisq-view-menu-radio-row"
|
|
172
|
-
role="menuitemradio"
|
|
173
|
-
aria-checked={checked}
|
|
174
|
-
>
|
|
175
|
-
<input
|
|
176
|
-
type="radio"
|
|
177
|
-
className="squisq-view-menu-radio"
|
|
178
|
-
name={name}
|
|
179
|
-
value={o.value}
|
|
180
|
-
checked={checked}
|
|
181
|
-
onChange={() => onChange(o.value)}
|
|
182
|
-
/>
|
|
183
|
-
<span className="squisq-view-menu-radio-label">{o.label}</span>
|
|
184
|
-
</label>
|
|
185
|
-
);
|
|
186
|
-
})}
|
|
187
|
-
</div>
|
|
188
|
-
);
|
|
189
|
-
}
|
package/src/ViewSwitcher.tsx
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ViewSwitcher
|
|
3
|
-
*
|
|
4
|
-
* Tab bar for switching between Write, Source, and Use editor views.
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { useEditorContext, type EditorView } from './EditorContext';
|
|
8
|
-
|
|
9
|
-
const VIEWS: { id: EditorView; label: string; shortLabel?: string; shortcut: string }[] = [
|
|
10
|
-
{ id: 'wysiwyg', label: 'Write', shortcut: '⌘1' },
|
|
11
|
-
{ id: 'raw', label: 'Source', shortcut: '⌘2' },
|
|
12
|
-
{ id: 'preview', label: 'Use', shortcut: '⌘3' },
|
|
13
|
-
];
|
|
14
|
-
|
|
15
|
-
export interface ViewSwitcherProps {
|
|
16
|
-
/** Additional class name */
|
|
17
|
-
className?: string;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Tab-style view switcher for the three editor modes.
|
|
22
|
-
*/
|
|
23
|
-
export function ViewSwitcher({ className }: ViewSwitcherProps) {
|
|
24
|
-
const { activeView, setActiveView, editorMode } = useEditorContext();
|
|
25
|
-
// In code mode, only the raw view is meaningful. With just one entry in
|
|
26
|
-
// the tab list there's nothing to switch between, so suppress the whole
|
|
27
|
-
// switcher rather than render a single lonely tab.
|
|
28
|
-
const visibleViews = editorMode === 'code' ? VIEWS.filter((v) => v.id === 'raw') : VIEWS;
|
|
29
|
-
if (visibleViews.length <= 1) return null;
|
|
30
|
-
|
|
31
|
-
return (
|
|
32
|
-
<div
|
|
33
|
-
className={`squisq-view-switcher ${className || ''}`}
|
|
34
|
-
role="tablist"
|
|
35
|
-
aria-label="Editor view"
|
|
36
|
-
>
|
|
37
|
-
{visibleViews.map((view) => (
|
|
38
|
-
<button
|
|
39
|
-
key={view.id}
|
|
40
|
-
role="tab"
|
|
41
|
-
aria-selected={activeView === view.id}
|
|
42
|
-
className={`squisq-view-tab ${activeView === view.id ? 'squisq-view-tab--active' : ''}`}
|
|
43
|
-
onClick={() => setActiveView(view.id)}
|
|
44
|
-
title={`${view.label} (${view.shortcut})`}
|
|
45
|
-
>
|
|
46
|
-
<span className="squisq-view-tab-label squisq-view-tab-label--long">{view.label}</span>
|
|
47
|
-
{view.shortLabel && view.shortLabel !== view.label && (
|
|
48
|
-
<span className="squisq-view-tab-label squisq-view-tab-label--short">
|
|
49
|
-
{view.shortLabel}
|
|
50
|
-
</span>
|
|
51
|
-
)}
|
|
52
|
-
</button>
|
|
53
|
-
))}
|
|
54
|
-
</div>
|
|
55
|
-
);
|
|
56
|
-
}
|