@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/Tooltip.tsx
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TooltipLayer
|
|
3
|
-
*
|
|
4
|
-
* A single portal-mounted tooltip that activates on hover over any element
|
|
5
|
-
* with a `data-tooltip` attribute. Shorter delay than native browser
|
|
6
|
-
* tooltips and fires regardless of window focus, making toolbar hints feel
|
|
7
|
-
* immediate. Mount once near the root of the editor shell.
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
import { useEffect, useLayoutEffect, useRef, useState } from 'react';
|
|
11
|
-
import { createPortal } from 'react-dom';
|
|
12
|
-
import { clampTooltipLeft } from './tooltipPlacement';
|
|
13
|
-
|
|
14
|
-
const SHOW_DELAY_MS = 180;
|
|
15
|
-
|
|
16
|
-
interface TooltipState {
|
|
17
|
-
label: string;
|
|
18
|
-
top: number;
|
|
19
|
-
anchorX: number;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
export function TooltipLayer() {
|
|
23
|
-
const [state, setState] = useState<TooltipState | null>(null);
|
|
24
|
-
const tooltipRef = useRef<HTMLDivElement | null>(null);
|
|
25
|
-
const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
26
|
-
const currentTargetRef = useRef<HTMLElement | null>(null);
|
|
27
|
-
// Visibility tracked in a ref so `handleOver` can decide whether to swap
|
|
28
|
-
// the label immediately vs. re-delay — reading it from state would force
|
|
29
|
-
// the effect to re-run (and re-register all listeners) on every change.
|
|
30
|
-
const visibleRef = useRef(false);
|
|
31
|
-
|
|
32
|
-
useLayoutEffect(() => {
|
|
33
|
-
if (!state) return;
|
|
34
|
-
const node = tooltipRef.current;
|
|
35
|
-
if (!node) return;
|
|
36
|
-
|
|
37
|
-
const rect = node.getBoundingClientRect();
|
|
38
|
-
const tooltipWidth = rect.width || node.offsetWidth;
|
|
39
|
-
const viewportWidth = window.innerWidth || document.documentElement.clientWidth;
|
|
40
|
-
const left = clampTooltipLeft(state.anchorX, tooltipWidth, viewportWidth);
|
|
41
|
-
|
|
42
|
-
node.style.left = `${left}px`;
|
|
43
|
-
node.style.visibility = 'visible';
|
|
44
|
-
}, [state]);
|
|
45
|
-
|
|
46
|
-
useEffect(() => {
|
|
47
|
-
const clearTimer = () => {
|
|
48
|
-
if (timerRef.current) {
|
|
49
|
-
clearTimeout(timerRef.current);
|
|
50
|
-
timerRef.current = null;
|
|
51
|
-
}
|
|
52
|
-
};
|
|
53
|
-
|
|
54
|
-
const hide = () => {
|
|
55
|
-
clearTimer();
|
|
56
|
-
currentTargetRef.current = null;
|
|
57
|
-
visibleRef.current = false;
|
|
58
|
-
setState(null);
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
const show = (el: HTMLElement, label: string) => {
|
|
62
|
-
const rect = el.getBoundingClientRect();
|
|
63
|
-
visibleRef.current = true;
|
|
64
|
-
setState({
|
|
65
|
-
label,
|
|
66
|
-
top: rect.bottom + 6,
|
|
67
|
-
anchorX: rect.left + rect.width / 2,
|
|
68
|
-
});
|
|
69
|
-
};
|
|
70
|
-
|
|
71
|
-
const handleOver = (e: MouseEvent) => {
|
|
72
|
-
const el = (e.target as Element | null)?.closest?.<HTMLElement>('[data-tooltip]');
|
|
73
|
-
if (!el) return;
|
|
74
|
-
if (el === currentTargetRef.current) return;
|
|
75
|
-
const label = el.getAttribute('data-tooltip');
|
|
76
|
-
if (!label) return;
|
|
77
|
-
|
|
78
|
-
// Switching from one tooltip target to another: if a tooltip is
|
|
79
|
-
// already visible, swap the label immediately (no re-delay).
|
|
80
|
-
const wasVisible = visibleRef.current;
|
|
81
|
-
currentTargetRef.current = el;
|
|
82
|
-
clearTimer();
|
|
83
|
-
|
|
84
|
-
if (wasVisible) {
|
|
85
|
-
show(el, label);
|
|
86
|
-
} else {
|
|
87
|
-
timerRef.current = setTimeout(() => {
|
|
88
|
-
if (currentTargetRef.current === el && document.body.contains(el)) {
|
|
89
|
-
show(el, label);
|
|
90
|
-
}
|
|
91
|
-
}, SHOW_DELAY_MS);
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
const handleOut = (e: MouseEvent) => {
|
|
96
|
-
const target = currentTargetRef.current;
|
|
97
|
-
if (!target) return;
|
|
98
|
-
const related = e.relatedTarget as Node | null;
|
|
99
|
-
// Still hovering inside the same target (e.g. moved over a child)
|
|
100
|
-
if (related && target.contains(related)) return;
|
|
101
|
-
// Moving to another element with a tooltip — handleOver will swap in.
|
|
102
|
-
const relatedTooltip = (related as Element | null)?.closest?.('[data-tooltip]');
|
|
103
|
-
if (relatedTooltip) return;
|
|
104
|
-
hide();
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
const handleScroll = () => hide();
|
|
108
|
-
const handleBlur = () => hide();
|
|
109
|
-
|
|
110
|
-
document.addEventListener('mouseover', handleOver);
|
|
111
|
-
document.addEventListener('mouseout', handleOut);
|
|
112
|
-
document.addEventListener('scroll', handleScroll, true);
|
|
113
|
-
window.addEventListener('blur', handleBlur);
|
|
114
|
-
|
|
115
|
-
return () => {
|
|
116
|
-
clearTimer();
|
|
117
|
-
document.removeEventListener('mouseover', handleOver);
|
|
118
|
-
document.removeEventListener('mouseout', handleOut);
|
|
119
|
-
document.removeEventListener('scroll', handleScroll, true);
|
|
120
|
-
window.removeEventListener('blur', handleBlur);
|
|
121
|
-
};
|
|
122
|
-
}, []);
|
|
123
|
-
|
|
124
|
-
if (!state) return null;
|
|
125
|
-
|
|
126
|
-
return createPortal(
|
|
127
|
-
<div
|
|
128
|
-
role="tooltip"
|
|
129
|
-
className="squisq-tooltip"
|
|
130
|
-
ref={tooltipRef}
|
|
131
|
-
style={{
|
|
132
|
-
position: 'fixed',
|
|
133
|
-
top: state.top,
|
|
134
|
-
left: state.anchorX,
|
|
135
|
-
visibility: 'hidden',
|
|
136
|
-
}}
|
|
137
|
-
>
|
|
138
|
-
{state.label}
|
|
139
|
-
</div>,
|
|
140
|
-
document.body,
|
|
141
|
-
);
|
|
142
|
-
}
|
package/src/TransitionPicker.tsx
DELETED
|
@@ -1,390 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* TransitionPicker
|
|
3
|
-
*
|
|
4
|
-
* Toolbar control shown when a block (heading) is active. A trigger button
|
|
5
|
-
* opens a portal flyout with a curated, grouped, searchable menu of block
|
|
6
|
-
* transitions, plus direction and duration sub-controls. Selecting a
|
|
7
|
-
* transition writes `transition=` (and optionally `transitionDirection=` /
|
|
8
|
-
* `transitionDuration=`) onto the block — the parent does the actual edit
|
|
9
|
-
* via `onChange`; this component is purely presentational.
|
|
10
|
-
*
|
|
11
|
-
* Positioning/portal/outside-click logic mirrors `TemplatePicker` so the two
|
|
12
|
-
* toolbar popovers behave identically.
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import { useEffect, useMemo, useRef, useState } from 'react';
|
|
16
|
-
import { createPortal } from 'react-dom';
|
|
17
|
-
import { getTransitionClass } from '@bendyline/squisq-react';
|
|
18
|
-
import type { TransitionDirection, TransitionType } from '@bendyline/squisq/schemas';
|
|
19
|
-
import type { TransitionFields } from './headingTransition';
|
|
20
|
-
import { EMPTY_TRANSITION } from './headingTransition';
|
|
21
|
-
import {
|
|
22
|
-
TRANSITION_GROUPS,
|
|
23
|
-
TRANSITION_ENTRIES,
|
|
24
|
-
DIRECTION_OPTIONS,
|
|
25
|
-
findTransitionEntry,
|
|
26
|
-
transitionLabel,
|
|
27
|
-
type TransitionCatalogEntry,
|
|
28
|
-
} from './transitionCatalog';
|
|
29
|
-
|
|
30
|
-
export interface TransitionPickerProps {
|
|
31
|
-
value: TransitionFields;
|
|
32
|
-
onChange: (next: TransitionFields) => void;
|
|
33
|
-
/** Surface scheme copied onto the portaled flyout so it can style independently of the shell. */
|
|
34
|
-
colorScheme?: 'light' | 'dark';
|
|
35
|
-
/** Active document-theme accent used for open and selected states. */
|
|
36
|
-
accentColor?: string;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* DOM id of the portaled transition flyout. Exported so hosts that embed the
|
|
41
|
-
* picker inside their own popovers (e.g. the toolbar overflow menu) can treat
|
|
42
|
-
* clicks inside the flyout as "inside" in their outside-click handling.
|
|
43
|
-
*/
|
|
44
|
-
export const TRANSITION_FLYOUT_PORTAL_ID = 'squisq-transition-flyout-portal';
|
|
45
|
-
|
|
46
|
-
const FLYOUT_ID = TRANSITION_FLYOUT_PORTAL_ID;
|
|
47
|
-
|
|
48
|
-
export function TransitionPicker({
|
|
49
|
-
value,
|
|
50
|
-
onChange,
|
|
51
|
-
colorScheme = 'light',
|
|
52
|
-
accentColor,
|
|
53
|
-
}: TransitionPickerProps) {
|
|
54
|
-
const [open, setOpen] = useState(false);
|
|
55
|
-
const [style, setStyle] = useState<React.CSSProperties>({});
|
|
56
|
-
const triggerRef = useRef<HTMLButtonElement>(null);
|
|
57
|
-
|
|
58
|
-
const updatePosition = () => {
|
|
59
|
-
if (!triggerRef.current) return;
|
|
60
|
-
const rect = triggerRef.current.getBoundingClientRect();
|
|
61
|
-
const flyout = document.getElementById(FLYOUT_ID);
|
|
62
|
-
const flyoutRect = flyout?.getBoundingClientRect();
|
|
63
|
-
const width = flyoutRect?.width ?? 460;
|
|
64
|
-
// Natural content height (the list scrolls inside, so scrollHeight is the
|
|
65
|
-
// full unclamped height we'd like to show).
|
|
66
|
-
const contentHeight = flyout?.scrollHeight ?? 520;
|
|
67
|
-
const margin = 8;
|
|
68
|
-
const gap = 6;
|
|
69
|
-
const vw = window.innerWidth;
|
|
70
|
-
const vh = window.innerHeight;
|
|
71
|
-
|
|
72
|
-
const left = Math.min(Math.max(margin, rect.left), Math.max(margin, vw - width - margin));
|
|
73
|
-
|
|
74
|
-
// Prefer opening below the trigger; flip above when there's clearly more
|
|
75
|
-
// room there. Either way cap the height to the available space so the
|
|
76
|
-
// panel never runs off the viewport — the list scrolls within it.
|
|
77
|
-
const spaceBelow = vh - rect.bottom - gap - margin;
|
|
78
|
-
const spaceAbove = rect.top - gap - margin;
|
|
79
|
-
const openDown = spaceBelow >= contentHeight || spaceBelow >= spaceAbove;
|
|
80
|
-
const top = openDown
|
|
81
|
-
? rect.bottom + gap
|
|
82
|
-
: Math.max(margin, rect.top - gap - Math.min(contentHeight, spaceAbove));
|
|
83
|
-
const maxHeight = Math.max(140, openDown ? spaceBelow : spaceAbove);
|
|
84
|
-
|
|
85
|
-
setStyle({ position: 'fixed', top, left, maxHeight, zIndex: 9999 });
|
|
86
|
-
};
|
|
87
|
-
|
|
88
|
-
const handleOpen = () => {
|
|
89
|
-
updatePosition();
|
|
90
|
-
setOpen((v) => !v);
|
|
91
|
-
};
|
|
92
|
-
|
|
93
|
-
// Close on outside click
|
|
94
|
-
useEffect(() => {
|
|
95
|
-
if (!open) return;
|
|
96
|
-
const handler = (e: MouseEvent) => {
|
|
97
|
-
const target = e.target as Node;
|
|
98
|
-
const inTrigger = triggerRef.current?.contains(target);
|
|
99
|
-
const inFlyout = document.getElementById(FLYOUT_ID)?.contains(target);
|
|
100
|
-
if (!inTrigger && !inFlyout) setOpen(false);
|
|
101
|
-
};
|
|
102
|
-
document.addEventListener('mousedown', handler);
|
|
103
|
-
return () => document.removeEventListener('mousedown', handler);
|
|
104
|
-
}, [open]);
|
|
105
|
-
|
|
106
|
-
// Close on Escape
|
|
107
|
-
useEffect(() => {
|
|
108
|
-
if (!open) return;
|
|
109
|
-
const handler = (e: KeyboardEvent) => {
|
|
110
|
-
if (e.key === 'Escape') setOpen(false);
|
|
111
|
-
};
|
|
112
|
-
document.addEventListener('keydown', handler);
|
|
113
|
-
return () => document.removeEventListener('keydown', handler);
|
|
114
|
-
}, [open]);
|
|
115
|
-
|
|
116
|
-
// Reposition on scroll/resize while open (and once after mount for width)
|
|
117
|
-
useEffect(() => {
|
|
118
|
-
if (!open) return;
|
|
119
|
-
requestAnimationFrame(updatePosition);
|
|
120
|
-
const handler = () => updatePosition();
|
|
121
|
-
window.addEventListener('scroll', handler, true);
|
|
122
|
-
window.addEventListener('resize', handler);
|
|
123
|
-
return () => {
|
|
124
|
-
window.removeEventListener('scroll', handler, true);
|
|
125
|
-
window.removeEventListener('resize', handler);
|
|
126
|
-
};
|
|
127
|
-
}, [open]);
|
|
128
|
-
|
|
129
|
-
const flyout = open
|
|
130
|
-
? createPortal(
|
|
131
|
-
<TransitionFlyout
|
|
132
|
-
style={{ ...style, ...blockAccentStyle(accentColor) }}
|
|
133
|
-
value={value}
|
|
134
|
-
onChange={onChange}
|
|
135
|
-
colorScheme={colorScheme}
|
|
136
|
-
/>,
|
|
137
|
-
document.body,
|
|
138
|
-
)
|
|
139
|
-
: null;
|
|
140
|
-
|
|
141
|
-
return (
|
|
142
|
-
<div
|
|
143
|
-
className="squisq-transition-picker"
|
|
144
|
-
data-theme={colorScheme}
|
|
145
|
-
style={blockAccentStyle(accentColor)}
|
|
146
|
-
>
|
|
147
|
-
<button
|
|
148
|
-
ref={triggerRef}
|
|
149
|
-
type="button"
|
|
150
|
-
className={`squisq-transition-picker-trigger${open ? ' squisq-transition-picker-trigger--open' : ''}`}
|
|
151
|
-
onClick={handleOpen}
|
|
152
|
-
aria-haspopup="menu"
|
|
153
|
-
aria-expanded={open}
|
|
154
|
-
title="Block transition"
|
|
155
|
-
>
|
|
156
|
-
<span className="squisq-transition-picker-trigger-label">Transition:</span>
|
|
157
|
-
<span className="squisq-transition-picker-trigger-value">
|
|
158
|
-
{transitionLabel(value.type)}
|
|
159
|
-
</span>
|
|
160
|
-
<svg width="10" height="10" viewBox="0 0 10 10" aria-hidden="true">
|
|
161
|
-
<path
|
|
162
|
-
d="M2 3.5l3 3 3-3"
|
|
163
|
-
stroke="currentColor"
|
|
164
|
-
strokeWidth="1.5"
|
|
165
|
-
strokeLinecap="round"
|
|
166
|
-
fill="none"
|
|
167
|
-
/>
|
|
168
|
-
</svg>
|
|
169
|
-
</button>
|
|
170
|
-
{flyout}
|
|
171
|
-
</div>
|
|
172
|
-
);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
function TransitionFlyout({
|
|
176
|
-
style,
|
|
177
|
-
value,
|
|
178
|
-
onChange,
|
|
179
|
-
colorScheme,
|
|
180
|
-
}: {
|
|
181
|
-
style: React.CSSProperties;
|
|
182
|
-
value: TransitionFields;
|
|
183
|
-
onChange: (next: TransitionFields) => void;
|
|
184
|
-
colorScheme: 'light' | 'dark';
|
|
185
|
-
}) {
|
|
186
|
-
const [query, setQuery] = useState('');
|
|
187
|
-
const searchRef = useRef<HTMLInputElement>(null);
|
|
188
|
-
|
|
189
|
-
useEffect(() => {
|
|
190
|
-
searchRef.current?.focus();
|
|
191
|
-
}, []);
|
|
192
|
-
|
|
193
|
-
const trimmed = query.trim().toLowerCase();
|
|
194
|
-
const hasQuery = trimmed.length > 0;
|
|
195
|
-
|
|
196
|
-
// Flat, filtered list when searching; grouped otherwise.
|
|
197
|
-
const filtered = useMemo(
|
|
198
|
-
() =>
|
|
199
|
-
hasQuery
|
|
200
|
-
? TRANSITION_ENTRIES.filter(
|
|
201
|
-
(e) =>
|
|
202
|
-
e.label.toLowerCase().includes(trimmed) || e.value.toLowerCase().includes(trimmed),
|
|
203
|
-
)
|
|
204
|
-
: null,
|
|
205
|
-
[hasQuery, trimmed],
|
|
206
|
-
);
|
|
207
|
-
|
|
208
|
-
const activeEntry = findTransitionEntry(value.type);
|
|
209
|
-
|
|
210
|
-
// Selecting a transition keeps the duration but drops a now-meaningless
|
|
211
|
-
// direction (only directional transitions carry one).
|
|
212
|
-
const selectType = (next: TransitionCatalogEntry | null) => {
|
|
213
|
-
if (!next) {
|
|
214
|
-
onChange({ ...EMPTY_TRANSITION });
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
onChange({
|
|
218
|
-
type: next.value,
|
|
219
|
-
direction: next.direction ? value.direction : '',
|
|
220
|
-
duration: value.duration,
|
|
221
|
-
});
|
|
222
|
-
};
|
|
223
|
-
|
|
224
|
-
const selectDirection = (dir: string) => {
|
|
225
|
-
// Toggle off when re-clicking the active direction.
|
|
226
|
-
onChange({ ...value, direction: value.direction === dir ? '' : dir });
|
|
227
|
-
};
|
|
228
|
-
|
|
229
|
-
const setDuration = (raw: string) => {
|
|
230
|
-
onChange({ ...value, duration: raw.trim() });
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
return (
|
|
234
|
-
<div
|
|
235
|
-
id={FLYOUT_ID}
|
|
236
|
-
className="squisq-transition-flyout"
|
|
237
|
-
data-theme={colorScheme}
|
|
238
|
-
role="menu"
|
|
239
|
-
style={style}
|
|
240
|
-
>
|
|
241
|
-
<div className="squisq-transition-flyout-search">
|
|
242
|
-
<input
|
|
243
|
-
ref={searchRef}
|
|
244
|
-
type="search"
|
|
245
|
-
className="squisq-transition-flyout-search-input"
|
|
246
|
-
placeholder="Search transitions…"
|
|
247
|
-
value={query}
|
|
248
|
-
onChange={(e) => setQuery(e.target.value)}
|
|
249
|
-
aria-label="Search transitions"
|
|
250
|
-
/>
|
|
251
|
-
</div>
|
|
252
|
-
|
|
253
|
-
<div className="squisq-transition-flyout-list">
|
|
254
|
-
<button
|
|
255
|
-
type="button"
|
|
256
|
-
role="menuitemradio"
|
|
257
|
-
aria-checked={value.type === ''}
|
|
258
|
-
className={`squisq-transition-option${value.type === '' ? ' squisq-transition-option--selected' : ''}`}
|
|
259
|
-
onClick={() => selectType(null)}
|
|
260
|
-
>
|
|
261
|
-
None
|
|
262
|
-
</button>
|
|
263
|
-
|
|
264
|
-
{hasQuery ? (
|
|
265
|
-
filtered && filtered.length > 0 ? (
|
|
266
|
-
<div className="squisq-transition-flyout-grid">
|
|
267
|
-
{filtered.map((entry) => (
|
|
268
|
-
<TransitionOption
|
|
269
|
-
key={entry.value}
|
|
270
|
-
entry={entry}
|
|
271
|
-
selected={value.type === entry.value}
|
|
272
|
-
direction={value.type === entry.value ? value.direction : undefined}
|
|
273
|
-
onSelect={() => selectType(entry)}
|
|
274
|
-
/>
|
|
275
|
-
))}
|
|
276
|
-
</div>
|
|
277
|
-
) : (
|
|
278
|
-
<div className="squisq-transition-flyout-empty">No transitions match “{query}”.</div>
|
|
279
|
-
)
|
|
280
|
-
) : (
|
|
281
|
-
TRANSITION_GROUPS.map((group) => (
|
|
282
|
-
<div key={group.title} className="squisq-transition-flyout-group">
|
|
283
|
-
<h4 className="squisq-transition-flyout-group-title">{group.title}</h4>
|
|
284
|
-
<div className="squisq-transition-flyout-grid">
|
|
285
|
-
{group.entries.map((entry) => (
|
|
286
|
-
<TransitionOption
|
|
287
|
-
key={entry.value}
|
|
288
|
-
entry={entry}
|
|
289
|
-
selected={value.type === entry.value}
|
|
290
|
-
direction={value.type === entry.value ? value.direction : undefined}
|
|
291
|
-
onSelect={() => selectType(entry)}
|
|
292
|
-
/>
|
|
293
|
-
))}
|
|
294
|
-
</div>
|
|
295
|
-
</div>
|
|
296
|
-
))
|
|
297
|
-
)}
|
|
298
|
-
</div>
|
|
299
|
-
|
|
300
|
-
{/* Direction + duration only apply once a transition is chosen. */}
|
|
301
|
-
{value.type && (
|
|
302
|
-
<div className="squisq-transition-flyout-controls">
|
|
303
|
-
{activeEntry?.direction && (
|
|
304
|
-
<div className="squisq-transition-flyout-control">
|
|
305
|
-
<span className="squisq-transition-flyout-control-label">Direction</span>
|
|
306
|
-
<div className="squisq-transition-direction-row">
|
|
307
|
-
{DIRECTION_OPTIONS[activeEntry.direction].map((opt) => (
|
|
308
|
-
<button
|
|
309
|
-
key={opt.value}
|
|
310
|
-
type="button"
|
|
311
|
-
className={`squisq-transition-direction-button${value.direction === opt.value ? ' squisq-transition-direction-button--selected' : ''}`}
|
|
312
|
-
onClick={() => selectDirection(opt.value)}
|
|
313
|
-
>
|
|
314
|
-
{opt.label}
|
|
315
|
-
</button>
|
|
316
|
-
))}
|
|
317
|
-
</div>
|
|
318
|
-
</div>
|
|
319
|
-
)}
|
|
320
|
-
<div className="squisq-transition-flyout-control">
|
|
321
|
-
<span className="squisq-transition-flyout-control-label">Duration</span>
|
|
322
|
-
<div className="squisq-transition-duration-row">
|
|
323
|
-
<input
|
|
324
|
-
type="number"
|
|
325
|
-
min="0"
|
|
326
|
-
step="0.1"
|
|
327
|
-
className="squisq-transition-duration-input"
|
|
328
|
-
placeholder="0.7"
|
|
329
|
-
value={value.duration}
|
|
330
|
-
onChange={(e) => setDuration(e.target.value)}
|
|
331
|
-
aria-label="Transition duration in seconds"
|
|
332
|
-
/>
|
|
333
|
-
<span className="squisq-transition-duration-unit">sec</span>
|
|
334
|
-
</div>
|
|
335
|
-
</div>
|
|
336
|
-
</div>
|
|
337
|
-
)}
|
|
338
|
-
</div>
|
|
339
|
-
);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
function blockAccentStyle(accentColor: string | undefined): React.CSSProperties {
|
|
343
|
-
return accentColor
|
|
344
|
-
? ({ ['--squisq-block-props-accent' as string]: accentColor } as React.CSSProperties)
|
|
345
|
-
: {};
|
|
346
|
-
}
|
|
347
|
-
|
|
348
|
-
function TransitionOption({
|
|
349
|
-
entry,
|
|
350
|
-
selected,
|
|
351
|
-
direction,
|
|
352
|
-
onSelect,
|
|
353
|
-
}: {
|
|
354
|
-
entry: TransitionCatalogEntry;
|
|
355
|
-
selected: boolean;
|
|
356
|
-
/** Direction to preview (for the active entry); falls back to the default. */
|
|
357
|
-
direction?: string;
|
|
358
|
-
onSelect: () => void;
|
|
359
|
-
}) {
|
|
360
|
-
// Play the real entering transition on the label while hovered. Local
|
|
361
|
-
// state (rather than a flyout-wide hover map) keeps the rerender to the
|
|
362
|
-
// single option, and toggling the class off on leave lets the animation
|
|
363
|
-
// restart cleanly on the next hover. `getTransitionClass` is the same
|
|
364
|
-
// mapping the player uses; if a consumer hasn't loaded the transition CSS
|
|
365
|
-
// the class simply matches no rule and the label stays static.
|
|
366
|
-
const [previewing, setPreviewing] = useState(false);
|
|
367
|
-
// `entry.value` is a real `TransitionType` (guarded by transitionCatalog.test).
|
|
368
|
-
const animClass =
|
|
369
|
-
previewing && entry.value
|
|
370
|
-
? getTransitionClass(entry.value as TransitionType, true, normalizeDir(direction))
|
|
371
|
-
: '';
|
|
372
|
-
return (
|
|
373
|
-
<button
|
|
374
|
-
type="button"
|
|
375
|
-
role="menuitemradio"
|
|
376
|
-
aria-checked={selected}
|
|
377
|
-
className={`squisq-transition-option${selected ? ' squisq-transition-option--selected' : ''}`}
|
|
378
|
-
onClick={onSelect}
|
|
379
|
-
onMouseEnter={() => setPreviewing(true)}
|
|
380
|
-
onMouseLeave={() => setPreviewing(false)}
|
|
381
|
-
>
|
|
382
|
-
<span className={`squisq-transition-option-label ${animClass}`}>{entry.label}</span>
|
|
383
|
-
</button>
|
|
384
|
-
);
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
/** `getTransitionClass` wants a `TransitionDirection | undefined`; '' → undefined. */
|
|
388
|
-
function normalizeDir(direction: string | undefined): TransitionDirection | undefined {
|
|
389
|
-
return direction ? (direction as TransitionDirection) : undefined;
|
|
390
|
-
}
|