@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/ThemePicker.tsx
DELETED
|
@@ -1,433 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* ThemePicker
|
|
3
|
-
*
|
|
4
|
-
* Custom theme dropdown that replaces a plain `<select>` with a popover
|
|
5
|
-
* showing each theme as a card: the theme name rendered in the theme's
|
|
6
|
-
* own background / foreground / title font, plus three color swatches
|
|
7
|
-
* (primary, secondary, highlight). Used by both the play-mode preview
|
|
8
|
-
* toolbar and the Document Settings dialog so authors see a
|
|
9
|
-
* preview-on-hover style listing rather than a wall of names.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
import { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';
|
|
13
|
-
import { createPortal } from 'react-dom';
|
|
14
|
-
import {
|
|
15
|
-
getThemeSummaries,
|
|
16
|
-
resolveTheme,
|
|
17
|
-
resolveFontFamily,
|
|
18
|
-
FONT_FALLBACKS,
|
|
19
|
-
} from '@bendyline/squisq/schemas';
|
|
20
|
-
import type { Theme } from '@bendyline/squisq/schemas';
|
|
21
|
-
|
|
22
|
-
// ── Props ─────────────────────────────────────────────────────────
|
|
23
|
-
|
|
24
|
-
export interface ThemePickerProps {
|
|
25
|
-
/** Currently selected theme id. Empty string represents "default". */
|
|
26
|
-
value: string;
|
|
27
|
-
/** Called with the new theme id. The empty string is emitted when the
|
|
28
|
-
* user picks the "Default" option (only available with
|
|
29
|
-
* `includeDefault`). */
|
|
30
|
-
onChange: (id: string) => void;
|
|
31
|
-
/**
|
|
32
|
-
* Show a "Default" entry at the top of the popover that emits an empty
|
|
33
|
-
* string. Used by the Document Settings dialog so the user can choose
|
|
34
|
-
* "no explicit theme" (frontmatter omits the key entirely).
|
|
35
|
-
*/
|
|
36
|
-
includeDefault?: boolean;
|
|
37
|
-
/**
|
|
38
|
-
* `'compact'` (default) renders a small toolbar trigger; `'full'`
|
|
39
|
-
* stretches to fill the parent and is sized for dialog layouts.
|
|
40
|
-
*/
|
|
41
|
-
variant?: 'compact' | 'full';
|
|
42
|
-
/** Accessible label, e.g. "Theme". */
|
|
43
|
-
ariaLabel?: string;
|
|
44
|
-
/**
|
|
45
|
-
* User-authored themes to list in a "Custom" group (doc + library, from
|
|
46
|
-
* `useCustomThemes().allThemes`). When omitted, only built-ins show — so
|
|
47
|
-
* the base-theme picker and other embeds stay built-ins only.
|
|
48
|
-
*/
|
|
49
|
-
customThemes?: Theme[];
|
|
50
|
-
/** When provided, renders a "+ Create custom theme" row that calls this. */
|
|
51
|
-
onCreateCustom?: () => void;
|
|
52
|
-
/** Per-custom-card edit affordance (opens the designer for that theme). */
|
|
53
|
-
onEditCustom?: (id: string) => void;
|
|
54
|
-
/** Per-custom-card delete affordance. */
|
|
55
|
-
onDeleteCustom?: (id: string) => void;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// ── Helpers ───────────────────────────────────────────────────────
|
|
59
|
-
|
|
60
|
-
const SUMMARIES = getThemeSummaries();
|
|
61
|
-
|
|
62
|
-
interface ThemeEntry {
|
|
63
|
-
id: string;
|
|
64
|
-
name: string;
|
|
65
|
-
description?: string;
|
|
66
|
-
theme: Theme;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
const THEME_ENTRIES: ThemeEntry[] = SUMMARIES.map((s) => ({
|
|
70
|
-
id: s.id,
|
|
71
|
-
name: s.name,
|
|
72
|
-
description: s.description,
|
|
73
|
-
theme: resolveTheme(s.id),
|
|
74
|
-
}));
|
|
75
|
-
|
|
76
|
-
function entryById(id: string): ThemeEntry | undefined {
|
|
77
|
-
return THEME_ENTRIES.find((e) => e.id === id);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
function previewFont(theme: Theme): string {
|
|
81
|
-
return resolveFontFamily(theme.typography.titleFont, FONT_FALLBACKS.sans);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// ── Trigger button ────────────────────────────────────────────────
|
|
85
|
-
|
|
86
|
-
function ThemeNameChip({
|
|
87
|
-
theme,
|
|
88
|
-
label,
|
|
89
|
-
className,
|
|
90
|
-
}: {
|
|
91
|
-
theme: Theme;
|
|
92
|
-
label: string;
|
|
93
|
-
className?: string;
|
|
94
|
-
}) {
|
|
95
|
-
return (
|
|
96
|
-
<span
|
|
97
|
-
className={`squisq-theme-picker-name-chip${className ? ` ${className}` : ''}`}
|
|
98
|
-
data-theme-id={theme.id}
|
|
99
|
-
style={{
|
|
100
|
-
background: theme.colors.background,
|
|
101
|
-
color: theme.colors.text,
|
|
102
|
-
fontFamily: previewFont(theme),
|
|
103
|
-
borderColor: theme.colors.backgroundLight,
|
|
104
|
-
}}
|
|
105
|
-
>
|
|
106
|
-
<span className="squisq-theme-picker-name-chip-label">{label}</span>
|
|
107
|
-
</span>
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
function Swatches({ theme }: { theme: Theme }) {
|
|
112
|
-
return (
|
|
113
|
-
<span className="squisq-theme-picker-swatches" aria-hidden="true">
|
|
114
|
-
<span className="squisq-theme-picker-swatch" style={{ background: theme.colors.primary }} />
|
|
115
|
-
<span className="squisq-theme-picker-swatch" style={{ background: theme.colors.secondary }} />
|
|
116
|
-
<span className="squisq-theme-picker-swatch" style={{ background: theme.colors.highlight }} />
|
|
117
|
-
</span>
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// ── Component ─────────────────────────────────────────────────────
|
|
122
|
-
|
|
123
|
-
export function ThemePicker({
|
|
124
|
-
value,
|
|
125
|
-
onChange,
|
|
126
|
-
includeDefault,
|
|
127
|
-
variant = 'compact',
|
|
128
|
-
ariaLabel = 'Theme',
|
|
129
|
-
customThemes,
|
|
130
|
-
onCreateCustom,
|
|
131
|
-
onEditCustom,
|
|
132
|
-
onDeleteCustom,
|
|
133
|
-
}: ThemePickerProps) {
|
|
134
|
-
const [open, setOpen] = useState(false);
|
|
135
|
-
const [popoverStyle, setPopoverStyle] = useState<React.CSSProperties>({});
|
|
136
|
-
const triggerRef = useRef<HTMLButtonElement>(null);
|
|
137
|
-
const popoverRef = useRef<HTMLDivElement>(null);
|
|
138
|
-
const popoverId = `squisq-theme-picker-popover-${useId().replace(/:/g, '')}`;
|
|
139
|
-
|
|
140
|
-
// Custom entries are computed per-render (built-ins stay static at module
|
|
141
|
-
// load). A custom theme is already a full Theme, so it becomes an entry
|
|
142
|
-
// directly — no `resolveTheme` needed.
|
|
143
|
-
const customEntries = useMemo<ThemeEntry[]>(
|
|
144
|
-
() =>
|
|
145
|
-
(customThemes ?? []).map((t) => ({
|
|
146
|
-
id: t.id,
|
|
147
|
-
name: t.name,
|
|
148
|
-
description: t.description,
|
|
149
|
-
theme: t,
|
|
150
|
-
})),
|
|
151
|
-
[customThemes],
|
|
152
|
-
);
|
|
153
|
-
const findEntry = useCallback(
|
|
154
|
-
(id: string): ThemeEntry | undefined => entryById(id) ?? customEntries.find((e) => e.id === id),
|
|
155
|
-
[customEntries],
|
|
156
|
-
);
|
|
157
|
-
|
|
158
|
-
const selectedEntry = useMemo<ThemeEntry | null>(() => {
|
|
159
|
-
if (!value) return null;
|
|
160
|
-
return findEntry(value) ?? null;
|
|
161
|
-
}, [value, findEntry]);
|
|
162
|
-
|
|
163
|
-
// The trigger always wants *something* to preview. When `includeDefault`
|
|
164
|
-
// is on and the value is empty, we treat the selection as the implicit
|
|
165
|
-
// "Default" — the chip uses plain OS styling (white bg, dark text,
|
|
166
|
-
// italic) rather than the standard theme's actual dark-navy palette.
|
|
167
|
-
const isDefault = !selectedEntry && includeDefault === true;
|
|
168
|
-
const previewEntry = selectedEntry ?? entryById('standard') ?? THEME_ENTRIES[0];
|
|
169
|
-
const triggerLabel = selectedEntry
|
|
170
|
-
? selectedEntry.name
|
|
171
|
-
: includeDefault
|
|
172
|
-
? 'Default'
|
|
173
|
-
: (previewEntry?.name ?? 'Theme');
|
|
174
|
-
|
|
175
|
-
const updatePosition = useCallback(() => {
|
|
176
|
-
if (!triggerRef.current) return;
|
|
177
|
-
const rect = triggerRef.current.getBoundingClientRect();
|
|
178
|
-
const margin = 8;
|
|
179
|
-
const gap = 4;
|
|
180
|
-
const vw = window.innerWidth;
|
|
181
|
-
const vh = window.innerHeight;
|
|
182
|
-
// Aim for a multi-column popover, but never wider than the viewport.
|
|
183
|
-
// The CSS grid packs as many theme cards per row as this width allows,
|
|
184
|
-
// so clamping to the available width makes a narrow window collapse to
|
|
185
|
-
// fewer columns (down to one) instead of overrunning the edge.
|
|
186
|
-
const available = vw - margin * 2;
|
|
187
|
-
const popoverWidth = Math.min(available, Math.max(560, rect.width));
|
|
188
|
-
const maxLeft = Math.max(margin, vw - popoverWidth - margin);
|
|
189
|
-
const left = Math.min(Math.max(margin, rect.left), maxLeft);
|
|
190
|
-
|
|
191
|
-
// Measure the rendered popover so we know whether it fits below the
|
|
192
|
-
// trigger as-is. On the first open it doesn't exist yet — we'll
|
|
193
|
-
// re-run after mount via the requestAnimationFrame in the open
|
|
194
|
-
// effect, so estimate generously for paint #1.
|
|
195
|
-
const popoverEl = popoverRef.current;
|
|
196
|
-
const measured = popoverEl?.scrollHeight ?? 520;
|
|
197
|
-
const spaceBelow = vh - rect.bottom - margin - gap;
|
|
198
|
-
const spaceAbove = rect.top - margin - gap;
|
|
199
|
-
|
|
200
|
-
// Prefer below when it fits; flip above when below is too tight AND
|
|
201
|
-
// above has more room. Either way, clamp maxHeight to the available
|
|
202
|
-
// space so the internal scroll handles oversized lists.
|
|
203
|
-
let top: number;
|
|
204
|
-
let maxHeight: number;
|
|
205
|
-
if (measured <= spaceBelow || spaceBelow >= spaceAbove) {
|
|
206
|
-
top = rect.bottom + gap;
|
|
207
|
-
maxHeight = spaceBelow;
|
|
208
|
-
} else {
|
|
209
|
-
maxHeight = Math.min(measured, spaceAbove);
|
|
210
|
-
top = rect.top - gap - maxHeight;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
setPopoverStyle({
|
|
214
|
-
position: 'fixed',
|
|
215
|
-
top,
|
|
216
|
-
left,
|
|
217
|
-
width: popoverWidth,
|
|
218
|
-
maxHeight,
|
|
219
|
-
overflowY: 'auto',
|
|
220
|
-
zIndex: 9999,
|
|
221
|
-
});
|
|
222
|
-
}, []);
|
|
223
|
-
|
|
224
|
-
const handleToggle = () => {
|
|
225
|
-
if (!open) updatePosition();
|
|
226
|
-
setOpen((v) => !v);
|
|
227
|
-
};
|
|
228
|
-
|
|
229
|
-
// Close on outside click / Esc; reposition on scroll/resize while open.
|
|
230
|
-
useEffect(() => {
|
|
231
|
-
if (!open) return;
|
|
232
|
-
const onDown = (e: MouseEvent) => {
|
|
233
|
-
const target = e.target as Node;
|
|
234
|
-
if (triggerRef.current?.contains(target)) return;
|
|
235
|
-
const popoverEl = popoverRef.current;
|
|
236
|
-
if (popoverEl?.contains(target)) return;
|
|
237
|
-
setOpen(false);
|
|
238
|
-
};
|
|
239
|
-
const onKey = (e: KeyboardEvent) => {
|
|
240
|
-
if (e.key === 'Escape') setOpen(false);
|
|
241
|
-
};
|
|
242
|
-
const onReposition = () => updatePosition();
|
|
243
|
-
document.addEventListener('mousedown', onDown);
|
|
244
|
-
document.addEventListener('keydown', onKey);
|
|
245
|
-
window.addEventListener('scroll', onReposition, true);
|
|
246
|
-
window.addEventListener('resize', onReposition);
|
|
247
|
-
requestAnimationFrame(updatePosition);
|
|
248
|
-
return () => {
|
|
249
|
-
document.removeEventListener('mousedown', onDown);
|
|
250
|
-
document.removeEventListener('keydown', onKey);
|
|
251
|
-
window.removeEventListener('scroll', onReposition, true);
|
|
252
|
-
window.removeEventListener('resize', onReposition);
|
|
253
|
-
};
|
|
254
|
-
}, [open, updatePosition]);
|
|
255
|
-
|
|
256
|
-
const handleSelect = (id: string) => {
|
|
257
|
-
onChange(id);
|
|
258
|
-
setOpen(false);
|
|
259
|
-
};
|
|
260
|
-
|
|
261
|
-
const popover = open
|
|
262
|
-
? createPortal(
|
|
263
|
-
<div
|
|
264
|
-
ref={popoverRef}
|
|
265
|
-
id={popoverId}
|
|
266
|
-
className="squisq-theme-picker-popover"
|
|
267
|
-
role="listbox"
|
|
268
|
-
aria-label={ariaLabel}
|
|
269
|
-
style={popoverStyle}
|
|
270
|
-
>
|
|
271
|
-
{includeDefault && (
|
|
272
|
-
<button
|
|
273
|
-
type="button"
|
|
274
|
-
role="option"
|
|
275
|
-
aria-selected={value === ''}
|
|
276
|
-
aria-label="Default"
|
|
277
|
-
className={`squisq-theme-picker-row${value === '' ? ' squisq-theme-picker-row--selected' : ''}`}
|
|
278
|
-
onClick={() => handleSelect('')}
|
|
279
|
-
>
|
|
280
|
-
<ThemeNameChip
|
|
281
|
-
theme={resolveTheme('standard')}
|
|
282
|
-
label="Default"
|
|
283
|
-
className="squisq-theme-picker-name-chip--default"
|
|
284
|
-
/>
|
|
285
|
-
<span className="squisq-theme-picker-row-meta">
|
|
286
|
-
<span className="squisq-theme-picker-row-name">No explicit theme</span>
|
|
287
|
-
<span className="squisq-theme-picker-row-desc">
|
|
288
|
-
Uses the document's default styling.
|
|
289
|
-
</span>
|
|
290
|
-
</span>
|
|
291
|
-
</button>
|
|
292
|
-
)}
|
|
293
|
-
{THEME_ENTRIES.map((entry) => (
|
|
294
|
-
<button
|
|
295
|
-
key={entry.id}
|
|
296
|
-
type="button"
|
|
297
|
-
role="option"
|
|
298
|
-
aria-selected={value === entry.id}
|
|
299
|
-
aria-label={entry.name}
|
|
300
|
-
className={`squisq-theme-picker-row${value === entry.id ? ' squisq-theme-picker-row--selected' : ''}`}
|
|
301
|
-
onClick={() => handleSelect(entry.id)}
|
|
302
|
-
title={entry.description ?? entry.name}
|
|
303
|
-
>
|
|
304
|
-
<ThemeNameChip theme={entry.theme} label={entry.name} />
|
|
305
|
-
<span className="squisq-theme-picker-row-meta">
|
|
306
|
-
<Swatches theme={entry.theme} />
|
|
307
|
-
{entry.description && (
|
|
308
|
-
<span className="squisq-theme-picker-row-desc">{entry.description}</span>
|
|
309
|
-
)}
|
|
310
|
-
</span>
|
|
311
|
-
</button>
|
|
312
|
-
))}
|
|
313
|
-
{customEntries.length > 0 && (
|
|
314
|
-
<div className="squisq-theme-picker-group-label">Custom</div>
|
|
315
|
-
)}
|
|
316
|
-
{customEntries.map((entry) => (
|
|
317
|
-
<div key={entry.id} className="squisq-theme-picker-custom-wrap">
|
|
318
|
-
<button
|
|
319
|
-
type="button"
|
|
320
|
-
role="option"
|
|
321
|
-
aria-selected={value === entry.id}
|
|
322
|
-
aria-label={entry.name}
|
|
323
|
-
className={`squisq-theme-picker-row${value === entry.id ? ' squisq-theme-picker-row--selected' : ''}`}
|
|
324
|
-
onClick={() => handleSelect(entry.id)}
|
|
325
|
-
title={entry.description ?? entry.name}
|
|
326
|
-
>
|
|
327
|
-
<ThemeNameChip theme={entry.theme} label={entry.name} />
|
|
328
|
-
<span className="squisq-theme-picker-row-meta">
|
|
329
|
-
<Swatches theme={entry.theme} />
|
|
330
|
-
{entry.description && (
|
|
331
|
-
<span className="squisq-theme-picker-row-desc">{entry.description}</span>
|
|
332
|
-
)}
|
|
333
|
-
</span>
|
|
334
|
-
</button>
|
|
335
|
-
{(onEditCustom || onDeleteCustom) && (
|
|
336
|
-
<span className="squisq-theme-picker-card-actions">
|
|
337
|
-
{onEditCustom && (
|
|
338
|
-
<button
|
|
339
|
-
type="button"
|
|
340
|
-
className="squisq-theme-picker-card-action"
|
|
341
|
-
onClick={() => onEditCustom(entry.id)}
|
|
342
|
-
aria-label={`Edit ${entry.name}`}
|
|
343
|
-
title="Edit theme"
|
|
344
|
-
>
|
|
345
|
-
✎
|
|
346
|
-
</button>
|
|
347
|
-
)}
|
|
348
|
-
{onDeleteCustom && (
|
|
349
|
-
<button
|
|
350
|
-
type="button"
|
|
351
|
-
className="squisq-theme-picker-card-action"
|
|
352
|
-
onClick={() => onDeleteCustom(entry.id)}
|
|
353
|
-
aria-label={`Delete ${entry.name}`}
|
|
354
|
-
title="Delete theme"
|
|
355
|
-
>
|
|
356
|
-
×
|
|
357
|
-
</button>
|
|
358
|
-
)}
|
|
359
|
-
</span>
|
|
360
|
-
)}
|
|
361
|
-
</div>
|
|
362
|
-
))}
|
|
363
|
-
{onCreateCustom && (
|
|
364
|
-
<button
|
|
365
|
-
type="button"
|
|
366
|
-
className="squisq-theme-picker-row squisq-theme-picker-create"
|
|
367
|
-
onClick={() => {
|
|
368
|
-
setOpen(false);
|
|
369
|
-
onCreateCustom();
|
|
370
|
-
}}
|
|
371
|
-
>
|
|
372
|
-
<span className="squisq-theme-picker-create-plus" aria-hidden="true">
|
|
373
|
-
+
|
|
374
|
-
</span>
|
|
375
|
-
<span className="squisq-theme-picker-row-meta">
|
|
376
|
-
<span className="squisq-theme-picker-row-name">Create custom theme…</span>
|
|
377
|
-
<span className="squisq-theme-picker-row-desc">
|
|
378
|
-
Design your own colors, accents, and fonts.
|
|
379
|
-
</span>
|
|
380
|
-
</span>
|
|
381
|
-
</button>
|
|
382
|
-
)}
|
|
383
|
-
</div>,
|
|
384
|
-
document.body,
|
|
385
|
-
)
|
|
386
|
-
: null;
|
|
387
|
-
|
|
388
|
-
return (
|
|
389
|
-
<>
|
|
390
|
-
<button
|
|
391
|
-
ref={triggerRef}
|
|
392
|
-
type="button"
|
|
393
|
-
className={`squisq-theme-picker-trigger squisq-theme-picker-trigger--${variant}${
|
|
394
|
-
open ? ' squisq-theme-picker-trigger--open' : ''
|
|
395
|
-
}`}
|
|
396
|
-
onClick={handleToggle}
|
|
397
|
-
aria-haspopup="listbox"
|
|
398
|
-
aria-expanded={open}
|
|
399
|
-
aria-controls={open ? popoverId : undefined}
|
|
400
|
-
aria-label={ariaLabel}
|
|
401
|
-
>
|
|
402
|
-
{previewEntry && (
|
|
403
|
-
<ThemeNameChip
|
|
404
|
-
theme={previewEntry.theme}
|
|
405
|
-
label={triggerLabel}
|
|
406
|
-
className={`squisq-theme-picker-name-chip--trigger${
|
|
407
|
-
isDefault ? ' squisq-theme-picker-name-chip--default' : ''
|
|
408
|
-
}`}
|
|
409
|
-
/>
|
|
410
|
-
)}
|
|
411
|
-
{previewEntry && variant === 'full' && !isDefault && (
|
|
412
|
-
<Swatches theme={previewEntry.theme} />
|
|
413
|
-
)}
|
|
414
|
-
<svg
|
|
415
|
-
className="squisq-theme-picker-caret"
|
|
416
|
-
width="10"
|
|
417
|
-
height="10"
|
|
418
|
-
viewBox="0 0 10 10"
|
|
419
|
-
aria-hidden="true"
|
|
420
|
-
>
|
|
421
|
-
<path
|
|
422
|
-
d="M2 3.5l3 3 3-3"
|
|
423
|
-
stroke="currentColor"
|
|
424
|
-
strokeWidth="1.5"
|
|
425
|
-
strokeLinecap="round"
|
|
426
|
-
fill="none"
|
|
427
|
-
/>
|
|
428
|
-
</svg>
|
|
429
|
-
</button>
|
|
430
|
-
{popover}
|
|
431
|
-
</>
|
|
432
|
-
);
|
|
433
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TimelineBlockPreview
|
|
3
|
-
*
|
|
4
|
-
* Renders a tiny slideshow-style thumbnail of a single block, used to fill each
|
|
5
|
-
* bar on the timeline. Reuses the same rendering path as the inline preview
|
|
6
|
-
* gutter and the slideshow: `buildPreviewDoc` → `materializeBlockLayers` → `BlockRenderer`.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { memo } from 'react';
|
|
10
|
-
import type { Block, ViewportConfig, MediaProvider } from '@bendyline/squisq/schemas';
|
|
11
|
-
import { VIEWPORT_PRESETS } from '@bendyline/squisq/schemas';
|
|
12
|
-
import { BlockRenderer, MediaContext } from '@bendyline/squisq-react';
|
|
13
|
-
|
|
14
|
-
export interface BlockThumbnailProps {
|
|
15
|
-
/** A block already resolved via `resolveBlockVisual`. */
|
|
16
|
-
visual: Block;
|
|
17
|
-
viewport?: ViewportConfig;
|
|
18
|
-
basePath?: string;
|
|
19
|
-
mediaProvider?: MediaProvider | null;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Memoized so the SVG only re-renders when the resolved block changes — keeps
|
|
24
|
-
* the timeline smooth while dragging (where bar geometry updates every frame).
|
|
25
|
-
*/
|
|
26
|
-
export const BlockThumbnail = memo(function BlockThumbnail({
|
|
27
|
-
visual,
|
|
28
|
-
viewport = VIEWPORT_PRESETS.landscape,
|
|
29
|
-
basePath = '/',
|
|
30
|
-
mediaProvider = null,
|
|
31
|
-
}: BlockThumbnailProps) {
|
|
32
|
-
return (
|
|
33
|
-
<MediaContext.Provider value={mediaProvider}>
|
|
34
|
-
<BlockRenderer block={visual} blockTime={0} basePath={basePath} viewport={viewport} />
|
|
35
|
-
</MediaContext.Provider>
|
|
36
|
-
);
|
|
37
|
-
});
|