@bendyline/squisq-editor-react 1.6.1 → 2.0.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/README.md +12 -3
- package/dist/index.d.ts +1304 -208
- package/dist/index.js +22838 -14494
- package/dist/index.js.map +1 -1
- package/dist/monaco.d.ts +1 -0
- package/dist/monaco.js +4 -0
- package/dist/monaco.js.map +1 -0
- package/dist/styles/index.css +2384 -408
- package/package.json +9 -5
- package/src/BlockPropertiesPopover.tsx +48 -17
- package/src/DocumentSettingsDialog.tsx +13 -21
- package/src/EditorContext.tsx +199 -42
- package/src/EditorShell.tsx +403 -270
- package/src/ImageEditor.tsx +22 -1
- package/src/InlinePreviewGutter.tsx +16 -8
- package/src/MediaBin.tsx +276 -40
- package/src/OutlinePanel.tsx +202 -7
- package/src/PlainHtmlPreview.tsx +40 -1
- package/src/PreviewControls.tsx +466 -93
- package/src/PreviewPanel.tsx +313 -77
- package/src/RawEditor.tsx +13 -2
- package/src/StatusBar.tsx +5 -2
- package/src/TemplateAnnotation.ts +34 -10
- package/src/TemplateContentPreview.tsx +56 -0
- package/src/TemplatePicker.tsx +355 -134
- package/src/ThemeCustomizerPanel.tsx +30 -15
- package/src/ThemePicker.tsx +10 -5
- package/src/TimelineBlockPreview.tsx +1 -1
- package/src/Toolbar.tsx +719 -238
- package/src/TransitionPicker.tsx +44 -5
- package/src/ViewMenuPanel.tsx +12 -14
- package/src/ViewSwitcher.tsx +4 -4
- package/src/WysiwygEditor.tsx +167 -92
- package/src/__tests__/blockPropertiesPopoverTheme.test.tsx +33 -0
- package/src/__tests__/blockTagActivity.test.ts +183 -0
- package/src/__tests__/buildDocumentPreviewMarkdown.test.ts +75 -0
- package/src/__tests__/buildPreviewDocContent.test.ts +48 -0
- package/src/__tests__/buildPreviewDocTransition.test.ts +22 -3
- package/src/__tests__/canvasSurfaceTextEditing.test.tsx +60 -0
- package/src/__tests__/customLayoutManagerTheme.test.tsx +34 -0
- package/src/__tests__/documentSettingsDialog.test.tsx +29 -1
- package/src/__tests__/editorScrollHandoff.test.tsx +102 -0
- package/src/__tests__/editorScrollSync.test.ts +65 -0
- package/src/__tests__/editorShellProps.test.tsx +390 -1
- package/src/__tests__/emojiPicker.test.tsx +2 -42
- package/src/__tests__/headingTransition.test.ts +53 -15
- package/src/__tests__/imageEditAffordance.test.tsx +5 -1
- package/src/__tests__/imageEditModalContract.test.tsx +119 -0
- package/src/__tests__/imageEditorShell.test.tsx +38 -1
- package/src/__tests__/jsonEditor.test.tsx +56 -1
- package/src/__tests__/layersPanel.test.tsx +75 -5
- package/src/__tests__/majorApiTypes.test.ts +26 -0
- package/src/__tests__/mediaBinDrop.test.tsx +90 -0
- package/src/__tests__/mediaReferences.test.ts +82 -0
- package/src/__tests__/narrationSave.test.ts +148 -0
- package/src/__tests__/outlinePanel.test.tsx +93 -3
- package/src/__tests__/outlineSource.test.ts +217 -0
- package/src/__tests__/plainHtmlPreview.test.tsx +17 -1
- package/src/__tests__/presentationMode.test.tsx +290 -0
- package/src/__tests__/previewControls.test.tsx +312 -6
- package/src/__tests__/previewPanelAudioFailure.test.tsx +46 -0
- package/src/__tests__/previewPanelPresentation.test.tsx +126 -0
- package/src/__tests__/previewPanelTransforms.test.tsx +117 -0
- package/src/__tests__/rawEditorModelIsolation.test.ts +19 -0
- package/src/__tests__/resolveBlockVisual.test.ts +43 -0
- package/src/__tests__/statusBar.test.tsx +27 -0
- package/src/__tests__/teleprompter.test.tsx +190 -0
- package/src/__tests__/templateAnnotationRoundTrip.test.ts +49 -2
- package/src/__tests__/templateContentPreview.test.ts +101 -0
- package/src/__tests__/templatePickerPortal.test.tsx +62 -0
- package/src/__tests__/tiptapBridge.test.ts +70 -0
- package/src/__tests__/tiptapCodeBlockRoundTrip.test.ts +109 -0
- package/src/__tests__/transformStyleId.test.ts +13 -0
- package/src/__tests__/useImageEditor.test.tsx +67 -0
- package/src/__tests__/useMediaRecorder.test.ts +75 -0
- package/src/__tests__/viewMenuPanel.test.tsx +130 -0
- package/src/__tests__/wysiwygImageUpload.test.ts +69 -0
- package/src/__tests__/wysiwygTemplateBadgeFocus.test.tsx +56 -0
- package/src/asciiDiagram/AsciiDiagramExtension.ts +343 -0
- package/src/asciiDiagram/AsciiDiagramWidget.tsx +224 -0
- package/src/asciiDiagram/RepairableDiagramExtension.ts +200 -0
- package/src/asciiDiagram/__tests__/AsciiDiagramExtension.test.ts +145 -0
- package/src/asciiDiagram/__tests__/RepairableDiagramExtension.test.ts +159 -0
- package/src/asciiDiagram/__tests__/asciiDiagramCommands.test.ts +227 -0
- package/src/asciiDiagram/__tests__/asciiDiagramOps.test.ts +114 -0
- package/src/asciiDiagram/__tests__/asciiPaste.test.ts +43 -0
- package/src/asciiDiagram/asciiDiagramCommands.ts +148 -0
- package/src/asciiDiagram/asciiDiagramData.ts +116 -0
- package/src/asciiDiagram/asciiDiagramOps.ts +219 -0
- package/src/asciiDiagram/asciiPaste.ts +19 -0
- package/src/blockTagActivity.ts +233 -0
- package/src/buildDocumentPreviewMarkdown.ts +168 -0
- package/src/buildPreviewDoc.ts +19 -12
- package/src/customTemplates/CustomLayoutManager.tsx +3 -2
- package/src/customTemplates/CustomTemplateContext.tsx +6 -0
- package/src/customTemplates/TemplateDesigner.tsx +7 -4
- package/src/customTemplates/__tests__/library.test.ts +8 -0
- package/src/customTemplates/designer.css +158 -99
- package/src/customTemplates/library.ts +16 -3
- package/src/customThemes/CustomThemeContext.tsx +6 -0
- package/src/customThemes/CustomThemeDialog.tsx +35 -5
- package/src/customThemes/ImportThemeSection.tsx +178 -0
- package/src/customThemes/__tests__/customThemeLibrary.test.ts +9 -0
- package/src/customThemes/__tests__/importThemeSection.test.tsx +192 -0
- package/src/customThemes/customThemeLibrary.ts +7 -4
- package/src/customThemes/index.ts +7 -1
- package/src/customThemes/themeDraft.ts +23 -7
- package/src/diagram/DiagramCanvas.tsx +9 -4
- package/src/diagram/types.ts +35 -0
- package/src/editorScrollSync.ts +73 -0
- package/src/emojiData.ts +3 -23
- package/src/headingTransition.ts +85 -25
- package/src/imageEditor/CanvasSurface.tsx +29 -23
- package/src/imageEditor/LayersPanel.tsx +78 -3
- package/src/imageEditor/Toolbar.tsx +5 -1
- package/src/imageEditor/icons.tsx +4 -0
- package/src/imageEditor/image-editor.css +75 -0
- package/src/imageEditor/layers/SelectionHandles.tsx +1 -1
- package/src/imageEditor/useImageEditor.ts +71 -14
- package/src/index.ts +193 -20
- package/src/jsonEditor/JsonEditorContext.tsx +12 -6
- package/src/jsonEditor/RenderNode.tsx +24 -3
- package/src/jsonEditor/editors.tsx +86 -19
- package/src/mediaEntries.ts +12 -0
- package/src/mediaReferences.ts +299 -0
- package/src/monaco.ts +35 -0
- package/src/monacoWorkers.ts +89 -0
- package/src/outlineSource.ts +171 -0
- package/src/presentation/PresentationMode.tsx +596 -0
- package/src/rawEditorIsolation.ts +18 -0
- package/src/recorder/hooks/useMediaRecorder.ts +97 -53
- package/src/resolveBlockVisual.ts +10 -4
- package/src/scene/Scene.tsx +101 -25
- package/src/scene/SceneBlockExtension.ts +17 -10
- package/src/scene/SceneBlockWidget.tsx +11 -4
- package/src/scene/SceneSelection.tsx +19 -15
- package/src/scene/SceneSideToolbar.tsx +89 -0
- package/src/scene/SceneViewport.tsx +7 -3
- package/src/scene/ShapePalette.tsx +17 -2
- package/src/scene/__tests__/DiagramAdapter.test.ts +86 -0
- package/src/scene/__tests__/SceneBlockExtension.test.ts +33 -0
- package/src/scene/__tests__/sceneIsolation.test.tsx +93 -0
- package/src/scene/adapters/DiagramAdapter.ts +12 -101
- package/src/scene/commands/SceneCommand.ts +4 -1
- package/src/scene/index.ts +1 -6
- package/src/scene/layers/DiagramEdges.tsx +24 -9
- package/src/scene/layers/edgeGeometry.ts +31 -4
- package/src/scene/layers/nodeCard.tsx +27 -8
- package/src/scene/scene.css +145 -2
- package/src/scene/text/SceneTextOverlay.tsx +5 -5
- package/src/scene/text/sceneTextChannel.ts +26 -20
- package/src/scene/text/sceneTextConfig.ts +4 -0
- package/src/scene/tools/ConnectTool.ts +126 -28
- package/src/scene/tools/DrawingConnectTool.ts +86 -16
- package/src/scene/tools/SceneTool.ts +10 -0
- package/src/scene/tools/SelectTool.ts +34 -18
- package/src/scene/tools/ShapeTool.ts +2 -3
- package/src/styles/ascii-diagram.css +79 -0
- package/src/styles/ascii-timeline.css +499 -0
- package/src/styles/editor.css +1566 -219
- package/src/styles/index.css +3 -0
- package/src/styles/tree-view.css +139 -0
- package/src/teleprompter/TeleprompterControls.tsx +218 -0
- package/src/teleprompter/TeleprompterSelfView.tsx +22 -0
- package/src/teleprompter/TeleprompterSurface.tsx +267 -0
- package/src/teleprompter/TeleprompterView.tsx +338 -0
- package/src/teleprompter/canvasRenderer.ts +161 -0
- package/src/teleprompter/floatingWindow.ts +352 -0
- package/src/teleprompter/index.ts +61 -0
- package/src/teleprompter/pcmWorklet.ts +62 -0
- package/src/teleprompter/recording/insertPreamble.ts +80 -0
- package/src/teleprompter/recording/narrationSave.ts +134 -0
- package/src/teleprompter/recording/useNarrationRecorder.ts +367 -0
- package/src/teleprompter/scrollModel.ts +85 -0
- package/src/teleprompter/teleprompterTheme.ts +303 -0
- package/src/teleprompter/types.ts +38 -0
- package/src/teleprompter/useFloatingWindow.ts +74 -0
- package/src/teleprompter/useMicAnalysis.ts +211 -0
- package/src/teleprompter/useTeleprompter.ts +421 -0
- package/src/templateContentPreviewResolver.ts +360 -0
- package/src/timeline/TimelineEditorWidget.tsx +702 -0
- package/src/timeline/TimelineViewExtension.ts +252 -0
- package/src/timeline/__tests__/TimelineEditorWidget.test.tsx +355 -0
- package/src/timeline/__tests__/TimelineViewExtension.test.ts +163 -0
- package/src/timeline/__tests__/timelineCommands.test.ts +327 -0
- package/src/timeline/__tests__/timelineOps.test.ts +222 -0
- package/src/timeline/__tests__/timelinePaste.test.ts +34 -0
- package/src/timeline/timelineCommands.ts +367 -0
- package/src/timeline/timelineData.ts +54 -0
- package/src/timeline/timelineOps.ts +277 -0
- package/src/timeline/timelinePaste.ts +8 -0
- package/src/tiptapBridge.ts +84 -49
- package/src/transformStyleId.ts +17 -0
- package/src/treeview/TreeOutlineWidget.tsx +240 -0
- package/src/treeview/TreeViewExtension.ts +250 -0
- package/src/treeview/__tests__/TreeViewExtension.test.ts +122 -0
- package/src/treeview/__tests__/treeOps.test.ts +125 -0
- package/src/treeview/__tests__/treePaste.test.ts +40 -0
- package/src/treeview/__tests__/treeViewCommands.test.ts +163 -0
- package/src/treeview/treeOps.ts +172 -0
- package/src/treeview/treePaste.ts +13 -0
- package/src/treeview/treeViewCommands.ts +94 -0
- package/src/treeview/treeViewData.ts +41 -0
- package/src/useMonacoLoader.ts +11 -34
- package/src/wysiwygImageUpload.ts +113 -0
- package/src/diagram/DiagramExtension.ts +0 -209
- package/src/diagram/DiagramWidget.tsx +0 -270
- package/src/diagram/useDiagramData.ts +0 -126
|
@@ -1,126 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Read diagram nodes + edges from the live Tiptap state.
|
|
3
|
-
*
|
|
4
|
-
* For a given parent heading position, walks the diagram section's child
|
|
5
|
-
* headings, builds synthetic `Block` objects from their text + Pandoc
|
|
6
|
-
* attributes, runs `computeDiagramLayout` from core to fill in missing
|
|
7
|
-
* positions, and returns the result in the shape React Flow consumes.
|
|
8
|
-
*
|
|
9
|
-
* The hook re-derives on every editor transaction — no caching layer
|
|
10
|
-
* means there's nothing to invalidate when the user types or the markdown
|
|
11
|
-
* is reloaded from disk.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import { useEffect, useMemo, useState } from 'react';
|
|
15
|
-
import type { Editor } from '@tiptap/react';
|
|
16
|
-
import type { Block } from '@bendyline/squisq/schemas';
|
|
17
|
-
import { computeDiagramLayout } from '@bendyline/squisq/doc';
|
|
18
|
-
import { listDiagramChildren } from './diagramCommands';
|
|
19
|
-
|
|
20
|
-
export interface DiagramRFNode {
|
|
21
|
-
id: string;
|
|
22
|
-
position: { x: number; y: number };
|
|
23
|
-
data: { label: string };
|
|
24
|
-
type?: string;
|
|
25
|
-
/** Per-node width override (from the heading's `w=` Pandoc param). */
|
|
26
|
-
width?: number;
|
|
27
|
-
/** Per-node height override (from the heading's `h=` Pandoc param). */
|
|
28
|
-
height?: number;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export interface DiagramRFEdge {
|
|
32
|
-
id: string;
|
|
33
|
-
source: string;
|
|
34
|
-
target: string;
|
|
35
|
-
label?: string;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
export interface DiagramData {
|
|
39
|
-
nodes: DiagramRFNode[];
|
|
40
|
-
edges: DiagramRFEdge[];
|
|
41
|
-
warnings: string[];
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export function useDiagramData(editor: Editor, parentPos: number): DiagramData {
|
|
45
|
-
// Track a version counter that bumps on every editor transaction so the
|
|
46
|
-
// hook re-renders. We avoid storing the full doc to keep references
|
|
47
|
-
// stable for React Flow's internal memoisation.
|
|
48
|
-
const [version, setVersion] = useState(0);
|
|
49
|
-
useEffect(() => {
|
|
50
|
-
const onUpdate = () => setVersion((v) => v + 1);
|
|
51
|
-
editor.on('transaction', onUpdate);
|
|
52
|
-
return () => {
|
|
53
|
-
editor.off('transaction', onUpdate);
|
|
54
|
-
};
|
|
55
|
-
}, [editor]);
|
|
56
|
-
|
|
57
|
-
return useMemo(() => {
|
|
58
|
-
const children = listDiagramChildren(editor, parentPos);
|
|
59
|
-
// Per-node size overrides keyed by id, so the post-layout pass can
|
|
60
|
-
// re-attach them without polluting the Block schema used by SSR.
|
|
61
|
-
const sizeOverrides = new Map<string, { width?: number; height?: number }>();
|
|
62
|
-
// Build synthetic Blocks for the layout helper.
|
|
63
|
-
const syntheticBlocks: Block[] = children.map((c) => {
|
|
64
|
-
const params = c.attrs.params ?? {};
|
|
65
|
-
const xRaw = params.x;
|
|
66
|
-
const yRaw = params.y;
|
|
67
|
-
const x = xRaw != null ? Number(xRaw) : undefined;
|
|
68
|
-
const y = yRaw != null ? Number(yRaw) : undefined;
|
|
69
|
-
const wRaw = params.w;
|
|
70
|
-
const hRaw = params.h;
|
|
71
|
-
const w = wRaw != null ? Number(wRaw) : undefined;
|
|
72
|
-
const h = hRaw != null ? Number(hRaw) : undefined;
|
|
73
|
-
if (Number.isFinite(w) || Number.isFinite(h)) {
|
|
74
|
-
sizeOverrides.set(c.id, {
|
|
75
|
-
...(Number.isFinite(w) ? { width: w as number } : {}),
|
|
76
|
-
...(Number.isFinite(h) ? { height: h as number } : {}),
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
|
-
const blockMeta = c.attrs.blockMeta;
|
|
80
|
-
const text = getHeadingText(c.node);
|
|
81
|
-
return {
|
|
82
|
-
id: c.id,
|
|
83
|
-
startTime: 0,
|
|
84
|
-
duration: 0,
|
|
85
|
-
audioSegment: 0,
|
|
86
|
-
title: text || c.id,
|
|
87
|
-
...(Number.isFinite(x) ? { x: x as number } : {}),
|
|
88
|
-
...(Number.isFinite(y) ? { y: y as number } : {}),
|
|
89
|
-
...(blockMeta?.connectsTo ? { connectsTo: blockMeta.connectsTo } : {}),
|
|
90
|
-
...(c.attrs.classes ? { classes: c.attrs.classes } : {}),
|
|
91
|
-
};
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
const layout = computeDiagramLayout(syntheticBlocks);
|
|
95
|
-
|
|
96
|
-
const nodes: DiagramRFNode[] = layout.nodes.map((n) => {
|
|
97
|
-
const size = sizeOverrides.get(n.id);
|
|
98
|
-
return {
|
|
99
|
-
id: n.id,
|
|
100
|
-
position: { x: n.x, y: n.y },
|
|
101
|
-
data: { label: n.label },
|
|
102
|
-
...(size?.width != null ? { width: size.width } : {}),
|
|
103
|
-
...(size?.height != null ? { height: size.height } : {}),
|
|
104
|
-
};
|
|
105
|
-
});
|
|
106
|
-
const edges: DiagramRFEdge[] = layout.edges.map((e) => ({
|
|
107
|
-
id: e.id,
|
|
108
|
-
source: e.source,
|
|
109
|
-
target: e.target,
|
|
110
|
-
...(e.type ? { label: e.type } : {}),
|
|
111
|
-
}));
|
|
112
|
-
|
|
113
|
-
return { nodes, edges, warnings: layout.warnings };
|
|
114
|
-
// `version` is the dependency we track for transactions; editor and
|
|
115
|
-
// parentPos shouldn't change on re-render.
|
|
116
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
117
|
-
}, [editor, parentPos, version]);
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
function getHeadingText(node: import('@tiptap/pm/model').Node): string {
|
|
121
|
-
let text = '';
|
|
122
|
-
node.content.forEach((child) => {
|
|
123
|
-
if (child.isText) text += child.text ?? '';
|
|
124
|
-
});
|
|
125
|
-
return text;
|
|
126
|
-
}
|