@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
package/src/PreviewPanel.tsx
DELETED
|
@@ -1,426 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PreviewPanel
|
|
3
|
-
*
|
|
4
|
-
* Renders a live preview of the current markdown document as a slideshow
|
|
5
|
-
* using the DocPlayer component from @bendyline/squisq-react. The
|
|
6
|
-
* markdown → player-Doc conversion is delegated to the shared
|
|
7
|
-
* `buildPreviewDoc` helper so live preview and the export pipeline stay
|
|
8
|
-
* in sync.
|
|
9
|
-
*/
|
|
10
|
-
|
|
11
|
-
import { useState, useEffect, useMemo, useCallback, useRef } from 'react';
|
|
12
|
-
import type { ReactNode } from 'react';
|
|
13
|
-
import { createPortal } from 'react-dom';
|
|
14
|
-
import { DocPlayer, LinearDocView, useMediaProvider } from '@bendyline/squisq-react';
|
|
15
|
-
import type { AudioController, PlaybackState } from '@bendyline/squisq-react';
|
|
16
|
-
import type { Doc } from '@bendyline/squisq/schemas';
|
|
17
|
-
import { applyTransform, resolveTransformStyle } from '@bendyline/squisq/transform';
|
|
18
|
-
import { resolveAudioMapping } from '@bendyline/squisq/doc';
|
|
19
|
-
import type { ContentContainer } from '@bendyline/squisq/storage';
|
|
20
|
-
import { useEditorContext } from './EditorContext';
|
|
21
|
-
import { usePreviewSettings } from './PreviewControls';
|
|
22
|
-
import { buildPreviewDoc } from './buildPreviewDoc';
|
|
23
|
-
import { buildDocumentPreviewMarkdown } from './buildDocumentPreviewMarkdown';
|
|
24
|
-
import { PlainHtmlPreview } from './PlainHtmlPreview';
|
|
25
|
-
import { TeleprompterView } from './teleprompter/TeleprompterView';
|
|
26
|
-
import { usePresentationModeOptional } from './presentation/PresentationMode';
|
|
27
|
-
|
|
28
|
-
export interface PreviewPanelProps {
|
|
29
|
-
/** Base path for resolving media URLs in DocPlayer */
|
|
30
|
-
basePath?: string;
|
|
31
|
-
/** Additional class name for the container */
|
|
32
|
-
className?: string;
|
|
33
|
-
/**
|
|
34
|
-
* Workspace-scoped `ContentContainer` (the folder holding the doc and
|
|
35
|
-
* its siblings). Used here for audio mapping — MP3 discovery and
|
|
36
|
-
* `timing.json` reading.
|
|
37
|
-
*/
|
|
38
|
-
workspaceContainer?: ContentContainer | null;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
// ── Component ──────────────────────────────────────────────────────
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Live preview panel that renders the current document as a slideshow
|
|
45
|
-
* or document view. Controls (viewport, mode, theme, transform, captions)
|
|
46
|
-
* are rendered in the main toolbar via PreviewToolbarControls.
|
|
47
|
-
*/
|
|
48
|
-
export function PreviewPanel({ basePath = '/', className, workspaceContainer }: PreviewPanelProps) {
|
|
49
|
-
const {
|
|
50
|
-
doc,
|
|
51
|
-
parseError,
|
|
52
|
-
isParsing,
|
|
53
|
-
markdownSource,
|
|
54
|
-
mediaRevision,
|
|
55
|
-
setMarkdownSource,
|
|
56
|
-
bumpMediaRevision,
|
|
57
|
-
allowRecording,
|
|
58
|
-
colorScheme,
|
|
59
|
-
} = useEditorContext();
|
|
60
|
-
const mediaProvider = useMediaProvider();
|
|
61
|
-
const presentation = usePresentationModeOptional();
|
|
62
|
-
const {
|
|
63
|
-
activeViewport,
|
|
64
|
-
activeDisplayMode,
|
|
65
|
-
activeTheme,
|
|
66
|
-
activeTransformStyle,
|
|
67
|
-
activeCaptionStyle,
|
|
68
|
-
activeCaptionsEnabled,
|
|
69
|
-
activeCoverSlide,
|
|
70
|
-
} = usePreviewSettings();
|
|
71
|
-
const mainSurfaceRef = useRef<HTMLDivElement>(null);
|
|
72
|
-
const popupSurfaceRef = useRef<HTMLDivElement>(null);
|
|
73
|
-
const [playbackState, setPlaybackState] = useState<PlaybackState | null>(null);
|
|
74
|
-
|
|
75
|
-
const handlePlaybackStateChange = useCallback((next: PlaybackState) => {
|
|
76
|
-
setPlaybackState(next);
|
|
77
|
-
}, []);
|
|
78
|
-
|
|
79
|
-
// Build the player-ready Doc whenever the parsed doc changes.
|
|
80
|
-
// Transform runs on the ORIGINAL doc (which has block.contents with
|
|
81
|
-
// markdown body text) so the content extractor can analyze it.
|
|
82
|
-
// Then buildPreviewDoc converts the result for DocPlayer.
|
|
83
|
-
//
|
|
84
|
-
// Audio mapping is async (reads container files), so we use a two-phase
|
|
85
|
-
// approach: first build the base doc synchronously, then resolve audio
|
|
86
|
-
// in an effect and update the state.
|
|
87
|
-
const [previewProjection, setPreviewProjection] = useState<{
|
|
88
|
-
/** Transformed content model shared by Page and Document. */
|
|
89
|
-
contentDoc: Doc;
|
|
90
|
-
/** Flattened/timed player model shared by Slideshow and Video. */
|
|
91
|
-
playerDoc: Doc;
|
|
92
|
-
} | null>(null);
|
|
93
|
-
|
|
94
|
-
useEffect(() => {
|
|
95
|
-
if (!doc || !doc.blocks.length) {
|
|
96
|
-
setPreviewProjection(null);
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
// Audio resolution runs BEFORE the transform: a document-anchored
|
|
101
|
-
// narration take re-times the SOURCE blocks, and the transform's
|
|
102
|
-
// provenance (`sourceStartTime` in seconds) is derived from those
|
|
103
|
-
// times — so summarized slides land where the words are spoken.
|
|
104
|
-
const build = (sourceDoc: Doc) => {
|
|
105
|
-
const contentDoc = activeTransformStyle
|
|
106
|
-
? applyTransform(sourceDoc, activeTransformStyle).doc
|
|
107
|
-
: sourceDoc;
|
|
108
|
-
return { contentDoc, playerDoc: buildPreviewDoc(contentDoc) };
|
|
109
|
-
};
|
|
110
|
-
|
|
111
|
-
if (workspaceContainer) {
|
|
112
|
-
let cancelled = false;
|
|
113
|
-
resolveAudioMapping(doc, workspaceContainer).then(
|
|
114
|
-
(audioDoc) => {
|
|
115
|
-
if (!cancelled) setPreviewProjection(build(audioDoc));
|
|
116
|
-
},
|
|
117
|
-
() => {
|
|
118
|
-
// The synchronous preview below remains valid when optional audio
|
|
119
|
-
// discovery fails; consume the rejection rather than leaking it.
|
|
120
|
-
},
|
|
121
|
-
);
|
|
122
|
-
// Set an immediate preview without audio while mapping resolves
|
|
123
|
-
setPreviewProjection(build(doc));
|
|
124
|
-
return () => {
|
|
125
|
-
cancelled = true;
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
setPreviewProjection(build(doc));
|
|
130
|
-
}, [doc, activeTransformStyle, workspaceContainer]);
|
|
131
|
-
|
|
132
|
-
const previewDoc = previewProjection?.playerDoc ?? null;
|
|
133
|
-
const contentDoc = previewProjection?.contentDoc ?? null;
|
|
134
|
-
|
|
135
|
-
// The popup owns no clock, audio, or transport. It follows the primary
|
|
136
|
-
// player's published state while all actions remain inert, keeping the
|
|
137
|
-
// opener the single source of truth.
|
|
138
|
-
const followerAudioController = useMemo<AudioController | null>(() => {
|
|
139
|
-
if (!playbackState || !previewDoc) return null;
|
|
140
|
-
const noOp = () => Promise.resolve();
|
|
141
|
-
return {
|
|
142
|
-
currentTime: playbackState.currentTime,
|
|
143
|
-
isPlaying: playbackState.isPlaying,
|
|
144
|
-
currentSegment: playbackState.currentSegmentIndex,
|
|
145
|
-
totalDuration: playbackState.totalDuration,
|
|
146
|
-
isEnded:
|
|
147
|
-
playbackState.totalDuration > 0 && playbackState.currentTime >= playbackState.totalDuration,
|
|
148
|
-
isReady: true,
|
|
149
|
-
isAvailable: true,
|
|
150
|
-
play: noOp,
|
|
151
|
-
pause: noOp,
|
|
152
|
-
toggle: noOp,
|
|
153
|
-
seekTo: noOp,
|
|
154
|
-
skipToSegment: noOp,
|
|
155
|
-
restart: noOp,
|
|
156
|
-
};
|
|
157
|
-
}, [playbackState, previewDoc]);
|
|
158
|
-
|
|
159
|
-
const documentMarkdown = useMemo(
|
|
160
|
-
() =>
|
|
161
|
-
activeTransformStyle && contentDoc
|
|
162
|
-
? buildDocumentPreviewMarkdown(contentDoc)
|
|
163
|
-
: markdownSource,
|
|
164
|
-
[activeTransformStyle, contentDoc, markdownSource],
|
|
165
|
-
);
|
|
166
|
-
|
|
167
|
-
// The public DisplayMode values predate the current labels: raw `page`
|
|
168
|
-
// is the plain Document preview, while raw `linear` is the styled Page view.
|
|
169
|
-
const isDocumentMode = activeDisplayMode === 'page';
|
|
170
|
-
const isPageMode = activeDisplayMode === 'linear';
|
|
171
|
-
const isNarrateMode = activeDisplayMode === 'narrate';
|
|
172
|
-
|
|
173
|
-
useEffect(() => {
|
|
174
|
-
if (presentation?.activeTarget === 'window') return;
|
|
175
|
-
setPlaybackState(null);
|
|
176
|
-
}, [presentation?.activeTarget]);
|
|
177
|
-
|
|
178
|
-
// Page and Document have no playback clock, so mirror their normalized
|
|
179
|
-
// scroll position instead. The popup remains pointer-inert: the editor view
|
|
180
|
-
// is the controller and the audience window follows it.
|
|
181
|
-
useEffect(() => {
|
|
182
|
-
if (presentation?.activeTarget !== 'window' || !presentation.popupRoot) return;
|
|
183
|
-
const mainRoot = mainSurfaceRef.current;
|
|
184
|
-
const followerRoot = popupSurfaceRef.current;
|
|
185
|
-
if (!mainRoot || !followerRoot) return;
|
|
186
|
-
|
|
187
|
-
if (isPageMode) {
|
|
188
|
-
const source = mainRoot.querySelector<HTMLElement>('.squisq-linear');
|
|
189
|
-
const follower = followerRoot.querySelector<HTMLElement>('.squisq-linear');
|
|
190
|
-
if (!source || !follower) return;
|
|
191
|
-
const sync = () => {
|
|
192
|
-
const sourceRange = Math.max(1, source.scrollHeight - source.clientHeight);
|
|
193
|
-
const followerRange = Math.max(0, follower.scrollHeight - follower.clientHeight);
|
|
194
|
-
follower.scrollTop = (source.scrollTop / sourceRange) * followerRange;
|
|
195
|
-
};
|
|
196
|
-
source.addEventListener('scroll', sync, { passive: true });
|
|
197
|
-
sync();
|
|
198
|
-
return () => source.removeEventListener('scroll', sync);
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
if (isDocumentMode) {
|
|
202
|
-
const sourceFrame = mainRoot.querySelector<HTMLIFrameElement>('iframe');
|
|
203
|
-
const followerFrame = followerRoot.querySelector<HTMLIFrameElement>('iframe');
|
|
204
|
-
if (!sourceFrame || !followerFrame) return;
|
|
205
|
-
let detachScroll: (() => void) | null = null;
|
|
206
|
-
const attach = () => {
|
|
207
|
-
detachScroll?.();
|
|
208
|
-
try {
|
|
209
|
-
const sourceWindow = sourceFrame.contentWindow;
|
|
210
|
-
const followerWindow = followerFrame.contentWindow;
|
|
211
|
-
if (!sourceWindow || !followerWindow) return;
|
|
212
|
-
const sync = () => {
|
|
213
|
-
const sourceDoc = sourceWindow.document.documentElement;
|
|
214
|
-
const followerDoc = followerWindow.document.documentElement;
|
|
215
|
-
const sourceRange = Math.max(1, sourceDoc.scrollHeight - sourceWindow.innerHeight);
|
|
216
|
-
const followerRange = Math.max(
|
|
217
|
-
0,
|
|
218
|
-
followerDoc.scrollHeight - followerWindow.innerHeight,
|
|
219
|
-
);
|
|
220
|
-
followerWindow.scrollTo(0, (sourceWindow.scrollY / sourceRange) * followerRange);
|
|
221
|
-
};
|
|
222
|
-
sourceWindow.addEventListener('scroll', sync, { passive: true });
|
|
223
|
-
detachScroll = () => sourceWindow.removeEventListener('scroll', sync);
|
|
224
|
-
sync();
|
|
225
|
-
} catch {
|
|
226
|
-
// The srcDoc frames are same-origin, but a host may tighten their
|
|
227
|
-
// sandbox. In that case the duplicate content remains useful even
|
|
228
|
-
// though scroll mirroring is unavailable.
|
|
229
|
-
}
|
|
230
|
-
};
|
|
231
|
-
sourceFrame.addEventListener('load', attach);
|
|
232
|
-
followerFrame.addEventListener('load', attach);
|
|
233
|
-
attach();
|
|
234
|
-
return () => {
|
|
235
|
-
sourceFrame.removeEventListener('load', attach);
|
|
236
|
-
followerFrame.removeEventListener('load', attach);
|
|
237
|
-
detachScroll?.();
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
}, [
|
|
241
|
-
contentDoc,
|
|
242
|
-
documentMarkdown,
|
|
243
|
-
isDocumentMode,
|
|
244
|
-
isPageMode,
|
|
245
|
-
presentation?.activeTarget,
|
|
246
|
-
presentation?.popupRoot,
|
|
247
|
-
]);
|
|
248
|
-
|
|
249
|
-
// Status overlays for non-ready states. Narrate is exempt: the
|
|
250
|
-
// teleprompter holds live state (mic capture, an in-flight recording,
|
|
251
|
-
// pacing position) that an unmount would destroy — e.g. saving a take
|
|
252
|
-
// rewrites the markdown, which triggers exactly this reparse. It keeps
|
|
253
|
-
// rendering the last-good doc until the new parse lands.
|
|
254
|
-
if (isParsing && !isNarrateMode) {
|
|
255
|
-
return (
|
|
256
|
-
<div className={`squisq-preview-status ${className || ''}`} data-testid="preview-panel">
|
|
257
|
-
<p>Parsing…</p>
|
|
258
|
-
</div>
|
|
259
|
-
);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
if (parseError && !isNarrateMode) {
|
|
263
|
-
return (
|
|
264
|
-
<div className={`squisq-preview-status ${className || ''}`} data-testid="preview-panel">
|
|
265
|
-
<h3>Parse Error</h3>
|
|
266
|
-
<pre>{parseError}</pre>
|
|
267
|
-
</div>
|
|
268
|
-
);
|
|
269
|
-
}
|
|
270
|
-
|
|
271
|
-
// Document mode renders a text-first markdown projection, and Narrate
|
|
272
|
-
// builds its script from the parsed source doc (showing its own empty
|
|
273
|
-
// state). Neither depends on the player projection, so let them fall
|
|
274
|
-
// through even when that isn't ready yet.
|
|
275
|
-
if (!previewDoc && !isDocumentMode && !isNarrateMode) {
|
|
276
|
-
return (
|
|
277
|
-
<div className={`squisq-preview-status ${className || ''}`} data-testid="preview-panel">
|
|
278
|
-
<p>No content to preview. Start typing in the editor.</p>
|
|
279
|
-
</div>
|
|
280
|
-
);
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
const fillsContainer = isDocumentMode || isPageMode || isNarrateMode ? 'stretch' : 'center';
|
|
284
|
-
const audienceWindowOpen = presentation?.activeTarget === 'window';
|
|
285
|
-
|
|
286
|
-
const renderSurface = (audience: boolean): ReactNode => {
|
|
287
|
-
if (isDocumentMode) {
|
|
288
|
-
return (
|
|
289
|
-
<PlainHtmlPreview
|
|
290
|
-
markdown={documentMarkdown}
|
|
291
|
-
title={(contentDoc?.frontmatter?.title as string | undefined) ?? undefined}
|
|
292
|
-
mediaProvider={mediaProvider}
|
|
293
|
-
mediaRevision={mediaRevision}
|
|
294
|
-
theme={activeTheme}
|
|
295
|
-
globalKeyboardShortcuts={!audience}
|
|
296
|
-
/>
|
|
297
|
-
);
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
if (isNarrateMode) {
|
|
301
|
-
if (audience) return null;
|
|
302
|
-
// Narrate keeps one controller/microphone session in the main view and
|
|
303
|
-
// portals only its display surface to the audience window.
|
|
304
|
-
return (
|
|
305
|
-
<TeleprompterView
|
|
306
|
-
doc={doc}
|
|
307
|
-
theme={activeTheme}
|
|
308
|
-
workspaceContainer={workspaceContainer ?? null}
|
|
309
|
-
basePath={basePath}
|
|
310
|
-
presentationTarget={
|
|
311
|
-
presentation?.activeTarget === 'window' ? presentation.popupRoot : null
|
|
312
|
-
}
|
|
313
|
-
recording={
|
|
314
|
-
allowRecording && mediaProvider
|
|
315
|
-
? {
|
|
316
|
-
mediaProvider,
|
|
317
|
-
container: workspaceContainer ?? null,
|
|
318
|
-
markdownSource,
|
|
319
|
-
setMarkdownSource,
|
|
320
|
-
bumpMediaRevision,
|
|
321
|
-
}
|
|
322
|
-
: null
|
|
323
|
-
}
|
|
324
|
-
/>
|
|
325
|
-
);
|
|
326
|
-
}
|
|
327
|
-
|
|
328
|
-
if (isPageMode) {
|
|
329
|
-
return (
|
|
330
|
-
<LinearDocView
|
|
331
|
-
doc={contentDoc ?? doc!}
|
|
332
|
-
basePath={basePath}
|
|
333
|
-
viewport={activeViewport}
|
|
334
|
-
theme={activeTheme}
|
|
335
|
-
globalKeyboardShortcuts={!audience}
|
|
336
|
-
showCover={activeCoverSlide}
|
|
337
|
-
transformPage={
|
|
338
|
-
activeTransformStyle ? resolveTransformStyle(activeTransformStyle).page : undefined
|
|
339
|
-
}
|
|
340
|
-
/>
|
|
341
|
-
);
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
if (audience && !followerAudioController) {
|
|
345
|
-
return <div className="squisq-presentation-connecting">Connecting presentation...</div>;
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
const audienceCaptionMode = playbackState?.captionMode;
|
|
349
|
-
return (
|
|
350
|
-
<DocPlayer
|
|
351
|
-
// A style change replaces the slide sequence. Remounting clears state
|
|
352
|
-
// belonging to the previous transformed deck in both render targets.
|
|
353
|
-
key={`${audience ? 'audience' : 'primary'}-${activeTransformStyle || 'none'}`}
|
|
354
|
-
doc={previewDoc!}
|
|
355
|
-
basePath={basePath}
|
|
356
|
-
showControls={!audience}
|
|
357
|
-
muted
|
|
358
|
-
forceViewport={activeViewport}
|
|
359
|
-
displayMode={activeDisplayMode}
|
|
360
|
-
theme={activeTheme}
|
|
361
|
-
captionStyle={audienceCaptionMode === 'social' ? 'social' : activeCaptionStyle}
|
|
362
|
-
captionsEnabled={
|
|
363
|
-
audience && audienceCaptionMode ? audienceCaptionMode !== 'off' : activeCaptionsEnabled
|
|
364
|
-
}
|
|
365
|
-
showCoverSlide={activeCoverSlide}
|
|
366
|
-
coverVisible={audience ? playbackState?.isCoverVisible : undefined}
|
|
367
|
-
audioController={audience ? followerAudioController! : undefined}
|
|
368
|
-
enableSwipe={!audience}
|
|
369
|
-
globalKeyboardShortcuts={!audience}
|
|
370
|
-
onPlaybackStateChange={
|
|
371
|
-
!audience && audienceWindowOpen ? handlePlaybackStateChange : undefined
|
|
372
|
-
}
|
|
373
|
-
/>
|
|
374
|
-
);
|
|
375
|
-
};
|
|
376
|
-
|
|
377
|
-
const surfaceStyle = {
|
|
378
|
-
flex: 1,
|
|
379
|
-
display: 'flex',
|
|
380
|
-
alignItems: fillsContainer,
|
|
381
|
-
justifyContent: 'center',
|
|
382
|
-
overflow: 'hidden',
|
|
383
|
-
minHeight: 0,
|
|
384
|
-
} as const;
|
|
385
|
-
|
|
386
|
-
return (
|
|
387
|
-
<>
|
|
388
|
-
<div
|
|
389
|
-
className={`squisq-preview-container ${className || ''}`}
|
|
390
|
-
data-testid="preview-panel"
|
|
391
|
-
style={{
|
|
392
|
-
width: '100%',
|
|
393
|
-
height: '100%',
|
|
394
|
-
display: 'flex',
|
|
395
|
-
flexDirection: 'column',
|
|
396
|
-
overflow: 'hidden',
|
|
397
|
-
background: 'var(--squisq-bg, #f5f5f5)',
|
|
398
|
-
}}
|
|
399
|
-
>
|
|
400
|
-
<div ref={mainSurfaceRef} className="squisq-preview-player" style={surfaceStyle}>
|
|
401
|
-
{renderSurface(false)}
|
|
402
|
-
</div>
|
|
403
|
-
</div>
|
|
404
|
-
{audienceWindowOpen && presentation?.popupRoot && !isNarrateMode
|
|
405
|
-
? createPortal(
|
|
406
|
-
<div
|
|
407
|
-
className="squisq-editor-shell squisq-presentation-window"
|
|
408
|
-
data-theme={colorScheme}
|
|
409
|
-
>
|
|
410
|
-
<div className="squisq-preview-container squisq-presentation-window-preview">
|
|
411
|
-
<div
|
|
412
|
-
ref={popupSurfaceRef}
|
|
413
|
-
className="squisq-preview-player squisq-presentation-window-surface"
|
|
414
|
-
style={surfaceStyle}
|
|
415
|
-
aria-label="Audience presentation"
|
|
416
|
-
>
|
|
417
|
-
{renderSurface(true)}
|
|
418
|
-
</div>
|
|
419
|
-
</div>
|
|
420
|
-
</div>,
|
|
421
|
-
presentation.popupRoot,
|
|
422
|
-
)
|
|
423
|
-
: null}
|
|
424
|
-
</>
|
|
425
|
-
);
|
|
426
|
-
}
|