@bendyline/squisq-editor-react 2.0.1 → 2.2.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.
Files changed (357) hide show
  1. package/LICENSE +21 -0
  2. package/NOTICE.md +40 -0
  3. package/README.md +10 -2
  4. package/dist/index.d.ts +683 -60
  5. package/dist/index.js +9648 -3750
  6. package/dist/monaco.js +0 -1
  7. package/dist/styles/index.css +1160 -241
  8. package/package.json +10 -6
  9. package/dist/index.js.map +0 -1
  10. package/dist/monaco.js.map +0 -1
  11. package/src/BlockCardView.tsx +0 -121
  12. package/src/BlockPreviewPanel.tsx +0 -69
  13. package/src/BlockPropertiesPopover.tsx +0 -222
  14. package/src/DocumentSettingsDialog.tsx +0 -272
  15. package/src/DropZoneOverlay.tsx +0 -137
  16. package/src/EditorContext.tsx +0 -1247
  17. package/src/EditorShell.tsx +0 -1334
  18. package/src/EmojiPicker.tsx +0 -332
  19. package/src/FolderView.tsx +0 -131
  20. package/src/Icon.tsx +0 -26
  21. package/src/ImageEditor.tsx +0 -395
  22. package/src/ImageNodeView.tsx +0 -284
  23. package/src/ImageViewer.tsx +0 -221
  24. package/src/InlineIcon.ts +0 -84
  25. package/src/InlinePreviewGutter.tsx +0 -590
  26. package/src/LinkDialog.tsx +0 -276
  27. package/src/MediaBin.tsx +0 -500
  28. package/src/MentionExtension.tsx +0 -261
  29. package/src/OutlinePanel.tsx +0 -547
  30. package/src/PlainHtmlPreview.tsx +0 -277
  31. package/src/PreviewControls.tsx +0 -1250
  32. package/src/PreviewPanel.tsx +0 -422
  33. package/src/RawEditor.tsx +0 -731
  34. package/src/RecorderEntry.tsx +0 -159
  35. package/src/StatusBar.tsx +0 -51
  36. package/src/TemplateAnnotation.ts +0 -167
  37. package/src/TemplateContentPreview.tsx +0 -56
  38. package/src/TemplatePicker.tsx +0 -1314
  39. package/src/ThemeCustomizerPanel.tsx +0 -304
  40. package/src/ThemePicker.tsx +0 -433
  41. package/src/TimelineBlockPreview.tsx +0 -37
  42. package/src/TimelineTrack.tsx +0 -671
  43. package/src/Toolbar.tsx +0 -2587
  44. package/src/Tooltip.tsx +0 -142
  45. package/src/TransitionPicker.tsx +0 -390
  46. package/src/VersionHistoryPanel.tsx +0 -359
  47. package/src/ViewMenuPanel.tsx +0 -189
  48. package/src/ViewSwitcher.tsx +0 -56
  49. package/src/WysiwygEditor.tsx +0 -792
  50. package/src/__tests__/blockProperties.test.ts +0 -92
  51. package/src/__tests__/blockPropertiesPopoverTheme.test.tsx +0 -33
  52. package/src/__tests__/blockRange.test.ts +0 -105
  53. package/src/__tests__/blockTagActivity.test.ts +0 -183
  54. package/src/__tests__/buildDocumentPreviewMarkdown.test.ts +0 -75
  55. package/src/__tests__/buildPreviewDocContent.test.ts +0 -48
  56. package/src/__tests__/buildPreviewDocTransition.test.ts +0 -92
  57. package/src/__tests__/canvasSurfaceTextEditing.test.tsx +0 -60
  58. package/src/__tests__/codeContextSectionView.test.tsx +0 -97
  59. package/src/__tests__/codeContextZoneManager.test.ts +0 -127
  60. package/src/__tests__/createShapeLayer.test.ts +0 -46
  61. package/src/__tests__/customLayoutManagerTheme.test.tsx +0 -34
  62. package/src/__tests__/detectMarkdown.test.ts +0 -73
  63. package/src/__tests__/diffContextSections.test.ts +0 -39
  64. package/src/__tests__/documentSettingsDialog.test.tsx +0 -197
  65. package/src/__tests__/drawingShapeRoundTrip.test.ts +0 -49
  66. package/src/__tests__/editorScrollHandoff.test.tsx +0 -102
  67. package/src/__tests__/editorScrollSync.test.ts +0 -65
  68. package/src/__tests__/editorShellCodeContext.test.tsx +0 -86
  69. package/src/__tests__/editorShellProps.test.tsx +0 -485
  70. package/src/__tests__/embeddedMedia.test.ts +0 -48
  71. package/src/__tests__/emojiPicker.test.tsx +0 -93
  72. package/src/__tests__/fileKind.test.ts +0 -112
  73. package/src/__tests__/headingTransition.test.ts +0 -176
  74. package/src/__tests__/imageEditAffordance.test.tsx +0 -272
  75. package/src/__tests__/imageEditModalContract.test.tsx +0 -119
  76. package/src/__tests__/imageEditorShell.test.tsx +0 -94
  77. package/src/__tests__/imageEditorState.test.ts +0 -171
  78. package/src/__tests__/inlinePreviewGutter.test.tsx +0 -62
  79. package/src/__tests__/inlinePreviewGutterAllBlocks.test.tsx +0 -103
  80. package/src/__tests__/jsonEditor.test.tsx +0 -223
  81. package/src/__tests__/layersPanel.test.tsx +0 -167
  82. package/src/__tests__/layoutChildRoundTrip.test.ts +0 -71
  83. package/src/__tests__/linkDialogDocPicker.test.tsx +0 -137
  84. package/src/__tests__/majorApiTypes.test.ts +0 -26
  85. package/src/__tests__/mediaAttachmentFlow.test.ts +0 -110
  86. package/src/__tests__/mediaBinDrop.test.tsx +0 -90
  87. package/src/__tests__/mediaReferences.test.ts +0 -82
  88. package/src/__tests__/narrationSave.test.ts +0 -148
  89. package/src/__tests__/outlinePanel.test.tsx +0 -169
  90. package/src/__tests__/outlineSource.test.ts +0 -217
  91. package/src/__tests__/plainHtmlPreview.test.tsx +0 -125
  92. package/src/__tests__/presentationMode.test.tsx +0 -290
  93. package/src/__tests__/previewControls.test.tsx +0 -540
  94. package/src/__tests__/previewPanelAudioFailure.test.tsx +0 -46
  95. package/src/__tests__/previewPanelPresentation.test.tsx +0 -126
  96. package/src/__tests__/previewPanelTransforms.test.tsx +0 -117
  97. package/src/__tests__/propertiesPanel.test.tsx +0 -69
  98. package/src/__tests__/rawEditorModelIsolation.test.ts +0 -19
  99. package/src/__tests__/recorderFormats.test.ts +0 -146
  100. package/src/__tests__/recorderMediaInsert.test.ts +0 -86
  101. package/src/__tests__/recorderTheme.test.tsx +0 -42
  102. package/src/__tests__/recorderTimingJson.test.ts +0 -41
  103. package/src/__tests__/resolveBlockVisual.test.ts +0 -43
  104. package/src/__tests__/selectionConversions.test.ts +0 -80
  105. package/src/__tests__/statusBar.test.tsx +0 -27
  106. package/src/__tests__/teleprompter.test.tsx +0 -190
  107. package/src/__tests__/templateAnnotationRoundTrip.test.ts +0 -99
  108. package/src/__tests__/templateContentPreview.test.ts +0 -101
  109. package/src/__tests__/templatePickerMetadata.test.ts +0 -32
  110. package/src/__tests__/templatePickerPortal.test.tsx +0 -62
  111. package/src/__tests__/timelineSource.test.ts +0 -134
  112. package/src/__tests__/tiptapBridge.test.ts +0 -566
  113. package/src/__tests__/tiptapBridgeConformance.test.ts +0 -47
  114. package/src/__tests__/tiptapCodeBlockRoundTrip.test.ts +0 -109
  115. package/src/__tests__/tiptapImageRoundTrip.test.ts +0 -73
  116. package/src/__tests__/toolbarSelectionConversion.test.tsx +0 -164
  117. package/src/__tests__/tooltip.test.tsx +0 -72
  118. package/src/__tests__/transformStyleId.test.ts +0 -13
  119. package/src/__tests__/transitionCatalog.test.ts +0 -64
  120. package/src/__tests__/useBlockNavigator.test.tsx +0 -67
  121. package/src/__tests__/useImageEditor.test.tsx +0 -226
  122. package/src/__tests__/useJsonEditorTokens.test.ts +0 -59
  123. package/src/__tests__/useMediaRecorder.test.ts +0 -302
  124. package/src/__tests__/useTimelineClock.test.ts +0 -21
  125. package/src/__tests__/versionHistory.test.tsx +0 -197
  126. package/src/__tests__/viewMenuPanel.test.tsx +0 -130
  127. package/src/__tests__/wysiwygImageUpload.test.ts +0 -69
  128. package/src/__tests__/wysiwygTemplateBadgeFocus.test.tsx +0 -56
  129. package/src/asciiDiagram/AsciiDiagramExtension.ts +0 -343
  130. package/src/asciiDiagram/AsciiDiagramWidget.tsx +0 -254
  131. package/src/asciiDiagram/RepairableDiagramExtension.ts +0 -200
  132. package/src/asciiDiagram/__tests__/AsciiDiagramExtension.test.ts +0 -145
  133. package/src/asciiDiagram/__tests__/RepairableDiagramExtension.test.ts +0 -159
  134. package/src/asciiDiagram/__tests__/asciiDiagramCommands.test.ts +0 -284
  135. package/src/asciiDiagram/__tests__/asciiDiagramOps.test.ts +0 -114
  136. package/src/asciiDiagram/__tests__/asciiPaste.test.ts +0 -43
  137. package/src/asciiDiagram/asciiDiagramCommands.ts +0 -174
  138. package/src/asciiDiagram/asciiDiagramData.ts +0 -149
  139. package/src/asciiDiagram/asciiDiagramOps.ts +0 -238
  140. package/src/asciiDiagram/asciiPaste.ts +0 -19
  141. package/src/blockProperties.ts +0 -88
  142. package/src/blockRange.ts +0 -132
  143. package/src/blockSlice.ts +0 -75
  144. package/src/blockTagActivity.ts +0 -233
  145. package/src/buildDocumentPreviewMarkdown.ts +0 -168
  146. package/src/buildPreviewDoc.ts +0 -405
  147. package/src/codeContext/CodeContextSectionView.tsx +0 -124
  148. package/src/codeContext/CodeContextZoneManager.ts +0 -149
  149. package/src/codeContext/CodeContextZones.tsx +0 -121
  150. package/src/codeContext/diffContextSections.ts +0 -38
  151. package/src/codeContext/types.ts +0 -75
  152. package/src/customTemplates/AddBin.tsx +0 -126
  153. package/src/customTemplates/CustomLayoutManager.tsx +0 -234
  154. package/src/customTemplates/CustomTemplateContext.tsx +0 -188
  155. package/src/customTemplates/LayerToolbar.tsx +0 -580
  156. package/src/customTemplates/ShapeGlyph.tsx +0 -47
  157. package/src/customTemplates/TemplateDesigner.tsx +0 -433
  158. package/src/customTemplates/__tests__/library.test.ts +0 -96
  159. package/src/customTemplates/__tests__/normalizePositions.test.ts +0 -109
  160. package/src/customTemplates/__tests__/shapeDefs.test.ts +0 -49
  161. package/src/customTemplates/__tests__/useMemoryLayerAdapter.test.ts +0 -108
  162. package/src/customTemplates/designer.css +0 -732
  163. package/src/customTemplates/index.ts +0 -31
  164. package/src/customTemplates/library.ts +0 -110
  165. package/src/customTemplates/normalizePositions.ts +0 -75
  166. package/src/customTemplates/shapeDefs.ts +0 -131
  167. package/src/customTemplates/thumbnail.tsx +0 -63
  168. package/src/customTemplates/tokenDefs.ts +0 -60
  169. package/src/customTemplates/useDocCustomTemplates.ts +0 -52
  170. package/src/customTemplates/useMemoryLayerAdapter.ts +0 -129
  171. package/src/customThemes/CustomThemeContext.tsx +0 -185
  172. package/src/customThemes/CustomThemeDialog.tsx +0 -316
  173. package/src/customThemes/ImportThemeSection.tsx +0 -178
  174. package/src/customThemes/__tests__/CustomThemeContext.test.tsx +0 -64
  175. package/src/customThemes/__tests__/CustomThemeDialog.test.tsx +0 -47
  176. package/src/customThemes/__tests__/customThemeLibrary.test.ts +0 -60
  177. package/src/customThemes/__tests__/importThemeSection.test.tsx +0 -192
  178. package/src/customThemes/customThemeLibrary.ts +0 -100
  179. package/src/customThemes/index.ts +0 -37
  180. package/src/customThemes/themeControls.tsx +0 -229
  181. package/src/customThemes/themeDraft.ts +0 -288
  182. package/src/customThemes/useDocCustomThemes.ts +0 -49
  183. package/src/detectMarkdown.ts +0 -62
  184. package/src/diagram/DiagramCanvas.tsx +0 -259
  185. package/src/diagram/DiagramMaximizedOverlay.tsx +0 -46
  186. package/src/diagram/diagramCommands.ts +0 -604
  187. package/src/diagram/diagramConstants.ts +0 -17
  188. package/src/diagram/types.ts +0 -35
  189. package/src/editorScrollSync.ts +0 -73
  190. package/src/embeddedMedia.ts +0 -78
  191. package/src/emojiData.ts +0 -1317
  192. package/src/fileKind.ts +0 -158
  193. package/src/frontmatter.ts +0 -29
  194. package/src/frontmatterSettings.ts +0 -23
  195. package/src/headingTransition.ts +0 -291
  196. package/src/hooks/useFileDrop.ts +0 -266
  197. package/src/imageEditor/CanvasSurface.tsx +0 -703
  198. package/src/imageEditor/ImageVersionHistoryDropdown.tsx +0 -396
  199. package/src/imageEditor/LayersPanel.tsx +0 -218
  200. package/src/imageEditor/PropertiesPanel.tsx +0 -474
  201. package/src/imageEditor/Toolbar.tsx +0 -459
  202. package/src/imageEditor/createShapeLayer.ts +0 -280
  203. package/src/imageEditor/icons.tsx +0 -68
  204. package/src/imageEditor/image-editor.css +0 -574
  205. package/src/imageEditor/layers/EditorImageLayer.tsx +0 -45
  206. package/src/imageEditor/layers/EditorShapeLayer.tsx +0 -62
  207. package/src/imageEditor/layers/EditorTextLayer.tsx +0 -45
  208. package/src/imageEditor/layers/SelectionHandles.tsx +0 -86
  209. package/src/imageEditor/state.ts +0 -173
  210. package/src/imageEditor/useImageEditor.ts +0 -385
  211. package/src/imageEditor/useImageEditorTokens.ts +0 -70
  212. package/src/index.ts +0 -470
  213. package/src/jsonEditor/EmbeddedRichTextField.tsx +0 -81
  214. package/src/jsonEditor/JsonEditor.tsx +0 -81
  215. package/src/jsonEditor/JsonEditorContext.tsx +0 -81
  216. package/src/jsonEditor/RenderNode.tsx +0 -87
  217. package/src/jsonEditor/editors.tsx +0 -745
  218. package/src/jsonEditor/index.ts +0 -2
  219. package/src/jsonEditor/json-editor.css +0 -463
  220. package/src/jsonEditor/useJsonEditorTokens.ts +0 -33
  221. package/src/mediaDragMime.ts +0 -32
  222. package/src/mediaEntries.ts +0 -12
  223. package/src/mediaReferences.ts +0 -299
  224. package/src/monaco.ts +0 -35
  225. package/src/monacoWorkers.ts +0 -89
  226. package/src/outlineSource.ts +0 -171
  227. package/src/presentation/PresentationMode.tsx +0 -596
  228. package/src/rawEditorIsolation.ts +0 -18
  229. package/src/recorder/RecorderButton.tsx +0 -80
  230. package/src/recorder/RecorderModal.tsx +0 -706
  231. package/src/recorder/RecorderPanel.tsx +0 -77
  232. package/src/recorder/formats.ts +0 -159
  233. package/src/recorder/hooks/useMediaRecorder.ts +0 -436
  234. package/src/recorder/hooks/useStreamPreview.ts +0 -47
  235. package/src/recorder/insertMediaBlock.ts +0 -30
  236. package/src/recorder/sources/cameraStream.ts +0 -32
  237. package/src/recorder/sources/micStream.ts +0 -25
  238. package/src/recorder/sources/screenStream.ts +0 -162
  239. package/src/recorder/timingJson.ts +0 -66
  240. package/src/resolveBlockVisual.ts +0 -39
  241. package/src/scene/Scene.tsx +0 -616
  242. package/src/scene/SceneBlockExtension.ts +0 -205
  243. package/src/scene/SceneBlockToolbar.tsx +0 -201
  244. package/src/scene/SceneBlockWidget.tsx +0 -441
  245. package/src/scene/ScenePropsBar.tsx +0 -85
  246. package/src/scene/SceneSelection.tsx +0 -111
  247. package/src/scene/SceneSideToolbar.tsx +0 -89
  248. package/src/scene/SceneViewport.tsx +0 -106
  249. package/src/scene/ShapePalette.tsx +0 -196
  250. package/src/scene/__tests__/DiagramAdapter.test.ts +0 -142
  251. package/src/scene/__tests__/SceneBlockExtension.test.ts +0 -33
  252. package/src/scene/__tests__/bezierEdit.test.ts +0 -85
  253. package/src/scene/__tests__/blockLayers.test.ts +0 -57
  254. package/src/scene/__tests__/sceneIsolation.test.tsx +0 -119
  255. package/src/scene/__tests__/shapeLayers.test.ts +0 -106
  256. package/src/scene/__tests__/useSceneHitTest.test.ts +0 -90
  257. package/src/scene/__tests__/useScenePanZoom.test.ts +0 -103
  258. package/src/scene/adapters/DiagramAdapter.ts +0 -79
  259. package/src/scene/adapters/DrawingAdapter.ts +0 -420
  260. package/src/scene/adapters/LayoutAdapter.ts +0 -313
  261. package/src/scene/adapters/blockLayers.ts +0 -159
  262. package/src/scene/commands/SceneCommand.ts +0 -84
  263. package/src/scene/commands/drawingCommands.ts +0 -318
  264. package/src/scene/commands/layoutCommands.ts +0 -301
  265. package/src/scene/hooks/useSceneHitTest.ts +0 -105
  266. package/src/scene/hooks/useScenePanZoom.ts +0 -147
  267. package/src/scene/hooks/useSceneSelection.ts +0 -62
  268. package/src/scene/index.ts +0 -90
  269. package/src/scene/layers/DiagramEdges.tsx +0 -142
  270. package/src/scene/layers/edgeGeometry.ts +0 -104
  271. package/src/scene/layers/nodeCard.tsx +0 -164
  272. package/src/scene/layers/renderLayer.tsx +0 -70
  273. package/src/scene/layers/shapeLayers.ts +0 -201
  274. package/src/scene/paths/bezierEdit.ts +0 -208
  275. package/src/scene/scene.css +0 -792
  276. package/src/scene/text/SceneTextOverlay.tsx +0 -161
  277. package/src/scene/text/sceneTextChannel.ts +0 -46
  278. package/src/scene/text/sceneTextConfig.ts +0 -31
  279. package/src/scene/text/sceneTiptap.ts +0 -36
  280. package/src/scene/text/useSceneTextEditing.ts +0 -39
  281. package/src/scene/tools/ConnectTool.ts +0 -209
  282. package/src/scene/tools/DrawingConnectTool.ts +0 -231
  283. package/src/scene/tools/PathTool.ts +0 -158
  284. package/src/scene/tools/PlaceTool.ts +0 -47
  285. package/src/scene/tools/SceneTool.ts +0 -85
  286. package/src/scene/tools/SelectTool.ts +0 -300
  287. package/src/scene/tools/ShapeTool.ts +0 -143
  288. package/src/scene/tools/TextTool.ts +0 -72
  289. package/src/scene/tools/TokenTool.ts +0 -95
  290. package/src/scene/tools/createDrawShapeTool.ts +0 -82
  291. package/src/selectionConversions.ts +0 -155
  292. package/src/styles/ascii-diagram.css +0 -79
  293. package/src/styles/ascii-timeline.css +0 -596
  294. package/src/styles/code-context.css +0 -155
  295. package/src/styles/diagram.css +0 -183
  296. package/src/styles/editor.css +0 -6811
  297. package/src/styles/folder-view.css +0 -210
  298. package/src/styles/image-edit-affordance.css +0 -201
  299. package/src/styles/index.css +0 -18
  300. package/src/styles/tree-view.css +0 -189
  301. package/src/teleprompter/TeleprompterControls.tsx +0 -218
  302. package/src/teleprompter/TeleprompterSelfView.tsx +0 -22
  303. package/src/teleprompter/TeleprompterSurface.tsx +0 -267
  304. package/src/teleprompter/TeleprompterView.tsx +0 -338
  305. package/src/teleprompter/canvasRenderer.ts +0 -161
  306. package/src/teleprompter/floatingWindow.ts +0 -352
  307. package/src/teleprompter/index.ts +0 -61
  308. package/src/teleprompter/pcmWorklet.ts +0 -62
  309. package/src/teleprompter/recording/insertPreamble.ts +0 -80
  310. package/src/teleprompter/recording/narrationSave.ts +0 -134
  311. package/src/teleprompter/recording/useNarrationRecorder.ts +0 -367
  312. package/src/teleprompter/scrollModel.ts +0 -85
  313. package/src/teleprompter/teleprompterTheme.ts +0 -303
  314. package/src/teleprompter/types.ts +0 -38
  315. package/src/teleprompter/useFloatingWindow.ts +0 -74
  316. package/src/teleprompter/useMicAnalysis.ts +0 -211
  317. package/src/teleprompter/useTeleprompter.ts +0 -421
  318. package/src/templateContentPreviewResolver.ts +0 -360
  319. package/src/timeline/TimelineEditorWidget.tsx +0 -861
  320. package/src/timeline/TimelineViewExtension.ts +0 -252
  321. package/src/timeline/__tests__/TimelineEditorWidget.test.tsx +0 -414
  322. package/src/timeline/__tests__/TimelineViewExtension.test.ts +0 -163
  323. package/src/timeline/__tests__/timelineCommands.test.ts +0 -359
  324. package/src/timeline/__tests__/timelineOps.test.ts +0 -277
  325. package/src/timeline/__tests__/timelinePaste.test.ts +0 -34
  326. package/src/timeline/timelineCommands.ts +0 -421
  327. package/src/timeline/timelineData.ts +0 -54
  328. package/src/timeline/timelineOps.ts +0 -381
  329. package/src/timeline/timelinePaste.ts +0 -8
  330. package/src/timelineSource.ts +0 -244
  331. package/src/tiptap/TiptapAudio.tsx +0 -86
  332. package/src/tiptap/TiptapVideo.tsx +0 -119
  333. package/src/tiptap/useResolvedMediaSrc.ts +0 -47
  334. package/src/tiptapBridge.ts +0 -986
  335. package/src/tooltipPlacement.ts +0 -13
  336. package/src/transformStyleId.ts +0 -17
  337. package/src/transitionCatalog.ts +0 -159
  338. package/src/treeview/TreeOutlineWidget.tsx +0 -390
  339. package/src/treeview/TreeViewExtension.ts +0 -250
  340. package/src/treeview/__tests__/TreeOutlineWidget.test.tsx +0 -156
  341. package/src/treeview/__tests__/TreeViewExtension.test.ts +0 -122
  342. package/src/treeview/__tests__/treeOps.test.ts +0 -177
  343. package/src/treeview/__tests__/treePaste.test.ts +0 -40
  344. package/src/treeview/__tests__/treeViewCommands.test.ts +0 -179
  345. package/src/treeview/treeOps.ts +0 -231
  346. package/src/treeview/treePaste.ts +0 -13
  347. package/src/treeview/treeViewCommands.ts +0 -99
  348. package/src/treeview/treeViewData.ts +0 -41
  349. package/src/types/monaco-shims.d.ts +0 -10
  350. package/src/useBlockNavigator.ts +0 -153
  351. package/src/useHeadingLayout.ts +0 -294
  352. package/src/useMonacoLoader.ts +0 -82
  353. package/src/useTimelineClock.ts +0 -76
  354. package/src/utils/collectInlineFontAwesomeCss.ts +0 -69
  355. package/src/utils/dropUtils.ts +0 -136
  356. package/src/utils/normalizeMalformedAssetUrl.ts +0 -22
  357. package/src/wysiwygImageUpload.ts +0 -113
@@ -1,70 +0,0 @@
1
- /**
2
- * Derive `--squisq-image-editor-*` CSS custom properties from a Theme +
3
- * SurfaceScheme, mirroring `useJsonViewTokens` in squisq-react. Lets the
4
- * ImageEditor re-theme consistently with the rest of Squisq (light/dark
5
- * surface, theme palette, font family overrides).
6
- */
7
-
8
- import { useMemo, type CSSProperties } from 'react';
9
- import {
10
- applySurface,
11
- resolveFontFamily,
12
- type SurfaceScheme,
13
- type Theme,
14
- } from '@bendyline/squisq/schemas';
15
- import { DEFAULT_THEME } from '@bendyline/squisq/doc';
16
- import { useAutoSurface } from '@bendyline/squisq-react';
17
-
18
- export interface ImageEditorTokens {
19
- /** Inline style object to spread onto the root `.squisq-image-editor`. */
20
- style: CSSProperties;
21
- /** The effective theme (after surface application). */
22
- theme: Theme;
23
- }
24
-
25
- export function useImageEditorTokens(
26
- theme: Theme | undefined,
27
- surface: SurfaceScheme | 'auto' | undefined,
28
- ): ImageEditorTokens {
29
- const auto = useAutoSurface(surface === 'auto');
30
- const effectiveSurface = surface === 'auto' ? auto : (surface ?? undefined);
31
-
32
- return useMemo(() => {
33
- const baseTheme = theme ?? DEFAULT_THEME;
34
- const finalTheme = effectiveSurface ? applySurface(baseTheme, effectiveSurface) : baseTheme;
35
-
36
- const bg = finalTheme.colors.background;
37
- const text = finalTheme.colors.text;
38
- const muted = finalTheme.colors.textMuted;
39
- const accent = finalTheme.colors.primary;
40
-
41
- // Panel / control surfaces are derived by mixing toward the opposite
42
- // pole (text color), so the same recipe works for both light and dark
43
- // surfaces without conditional branches.
44
- const panelBg = `color-mix(in srgb, ${bg} 92%, ${text} 8%)`;
45
- const panelBorder = `color-mix(in srgb, ${bg} 80%, ${text} 20%)`;
46
- const controlBg = `color-mix(in srgb, ${bg} 86%, ${text} 14%)`;
47
- const controlBorder = `color-mix(in srgb, ${bg} 72%, ${text} 28%)`;
48
- const workspaceBg = `color-mix(in srgb, ${bg} 95%, ${text} 5%)`;
49
-
50
- const bodyFont = resolveFontFamily(
51
- finalTheme.typography.bodyFont,
52
- 'system-ui, -apple-system, sans-serif',
53
- );
54
-
55
- const style: CSSProperties = {
56
- ['--squisq-image-editor-bg' as string]: bg,
57
- ['--squisq-image-editor-panel-bg' as string]: panelBg,
58
- ['--squisq-image-editor-panel-border' as string]: panelBorder,
59
- ['--squisq-image-editor-text' as string]: text,
60
- ['--squisq-image-editor-text-muted' as string]: muted,
61
- ['--squisq-image-editor-accent' as string]: accent,
62
- ['--squisq-image-editor-control-bg' as string]: controlBg,
63
- ['--squisq-image-editor-control-border' as string]: controlBorder,
64
- ['--squisq-image-editor-workspace-bg' as string]: workspaceBg,
65
- ['--squisq-image-editor-body-font' as string]: bodyFont,
66
- };
67
-
68
- return { style, theme: finalTheme };
69
- }, [theme, effectiveSurface]);
70
- }
package/src/index.ts DELETED
@@ -1,470 +0,0 @@
1
- /**
2
- * @bendyline/squisq-editor-react
3
- *
4
- * React component library for editing markdown content with three views:
5
- * - Raw (Monaco) — Full markdown source editing
6
- * - WYSIWYG (Tiptap) — Rich text editing
7
- * - Preview — Rendered block preview
8
- *
9
- * @example
10
- * ```tsx
11
- * import { EditorShell } from '@bendyline/squisq-editor-react';
12
- * import '@bendyline/squisq-editor-react/styles';
13
- *
14
- * function App() {
15
- * return <EditorShell initialMarkdown="# Hello World" />;
16
- * }
17
- * ```
18
- */
19
-
20
- // Shell (top-level component)
21
- export { EditorShell } from './EditorShell.js';
22
- export type { EditorShellProps, EditorColorScheme } from './EditorShell.js';
23
-
24
- // Code-context sections (host-supplied markdown injected into the code surface)
25
- export { CodeContextZones } from './codeContext/CodeContextZones.js';
26
- export type { CodeContext, CodeContextSection } from './codeContext/types.js';
27
-
28
- // FolderView — standalone folder browser surface (companion to the shell)
29
- export { FolderView } from './FolderView.js';
30
- export type { FolderViewProps, FolderEntry } from './FolderView.js';
31
-
32
- // Context
33
- export { EditorProvider, useEditorContext } from './EditorContext.js';
34
- export type {
35
- EditorView,
36
- EditorMode,
37
- EditorState,
38
- EditorActions,
39
- EditorContextValue,
40
- EditorProviderProps,
41
- ImageDisplayMode,
42
- MentionCandidate,
43
- MentionProvider,
44
- DocumentLinkCandidate,
45
- DocumentLinkProvider,
46
- ViewPreferences,
47
- ThemeInheritance,
48
- BlockTagVisibility,
49
- LayoutMode,
50
- } from './EditorContext.js';
51
-
52
- // Block-at-a-time primitives — reusable outside EditorShell. `useBlockNavigator`
53
- // drives a one-block-at-a-time editing channel from any `(source, setSource)`
54
- // pair; `BlockCardView` is the matching card chrome; the `blockRange` utilities
55
- // are pure source-slicing helpers.
56
- export { useBlockNavigator } from './useBlockNavigator.js';
57
- export type { BlockNavigator, UseBlockNavigatorOptions } from './useBlockNavigator.js';
58
- export { BlockCardView } from './BlockCardView.js';
59
- export type { BlockCardViewProps } from './BlockCardView.js';
60
- export {
61
- getBlockSlices,
62
- spliceBlock,
63
- lineToOffset,
64
- offsetToLine,
65
- sliceIndexAtOffset,
66
- } from './blockRange.js';
67
- export type { BlockRange, BlockSlice } from './blockRange.js';
68
-
69
- // Timeline view — the horizontal block + media track and the line-level
70
- // markdown write-back helpers it commits edits through.
71
- export { TimelineTrack } from './TimelineTrack.js';
72
- export type { TimelineTrackProps } from './TimelineTrack.js';
73
- export { formatSeconds, setBlockDurationInSource, setMediaClipInSource } from './timelineSource.js';
74
- export type { MediaClipPatch } from './timelineSource.js';
75
-
76
- // File-kind detection — useful for hosts that want to pre-decide chrome
77
- // around the editor based on whether a file is markdown or code.
78
- export { resolveFileKind, detectLanguageFromFileName } from './fileKind.js';
79
- export type { FileKind } from './fileKind.js';
80
-
81
- // Image viewer — exported standalone so hosts can use it without the
82
- // full EditorShell when they already have their own chrome.
83
- export { ImageViewer } from './ImageViewer.js';
84
- export type { ImageViewerProps } from './ImageViewer.js';
85
-
86
- // Individual editors (for custom layouts)
87
- export { RawEditor } from './RawEditor.js';
88
- export type { RawEditorProps } from './RawEditor.js';
89
-
90
- export { WysiwygEditor } from './WysiwygEditor.js';
91
- export type { WysiwygEditorProps } from './WysiwygEditor.js';
92
-
93
- export { PreviewPanel } from './PreviewPanel.js';
94
- export type { PreviewPanelProps } from './PreviewPanel.js';
95
- export { PlainHtmlPreview } from './PlainHtmlPreview.js';
96
- export type { PlainHtmlPreviewProps } from './PlainHtmlPreview.js';
97
- export { EmojiPicker } from './EmojiPicker.js';
98
- export type { EmojiPickerProps } from './EmojiPicker.js';
99
- export { DocumentSettingsDialog } from './DocumentSettingsDialog.js';
100
- export type { DocumentSettingsDialogProps } from './DocumentSettingsDialog.js';
101
- export { ThemePicker } from './ThemePicker.js';
102
- export type { ThemePickerProps } from './ThemePicker.js';
103
- export { PICKER_CATEGORIES, ALL_PICKER_ENTRIES, searchPickerEntries } from './emojiData.js';
104
- export type { PickerEntry, PickerCategory } from './emojiData.js';
105
- export {
106
- PreviewSettingsProvider,
107
- PreviewToolbarControls,
108
- PreviewModeMenu,
109
- PreviewModeSwitch,
110
- PreviewFormatSwitch,
111
- usePreviewSettings,
112
- } from './PreviewControls.js';
113
- export type { PreviewSettings } from './PreviewControls.js';
114
-
115
- // Chrome (for custom layouts)
116
- export { ViewSwitcher } from './ViewSwitcher.js';
117
- export type { ViewSwitcherProps } from './ViewSwitcher.js';
118
-
119
- export { Toolbar } from './Toolbar.js';
120
- export type { ToolbarProps } from './Toolbar.js';
121
-
122
- export { VersionHistoryPanel } from './VersionHistoryPanel.js';
123
- export { ViewMenuPanel } from './ViewMenuPanel.js';
124
- export { OutlinePanel } from './OutlinePanel.js';
125
- export type { OutlinePanelProps } from './OutlinePanel.js';
126
- export { ThemeCustomizerPanel } from './ThemeCustomizerPanel.js';
127
- export type { ThemeCustomizerPanelProps } from './ThemeCustomizerPanel.js';
128
- export { TemplatePicker, templateLabel } from './TemplatePicker.js';
129
- export { TransitionPicker } from './TransitionPicker.js';
130
- export type { TransitionPickerProps } from './TransitionPicker.js';
131
- export {
132
- TRANSITION_GROUPS,
133
- TRANSITION_ENTRIES,
134
- transitionLabel,
135
- findTransitionEntry,
136
- } from './transitionCatalog.js';
137
- export type {
138
- TransitionGroup,
139
- TransitionCatalogEntry,
140
- DirectionModel,
141
- } from './transitionCatalog.js';
142
- export {
143
- readHeadingLineTransition,
144
- setHeadingLineTransition,
145
- readBlockAttrsTransition,
146
- setHeadingAttrsTransition,
147
- EMPTY_TRANSITION,
148
- } from './headingTransition.js';
149
- export type { HeadingTransitionAttrs, TransitionFields } from './headingTransition.js';
150
- export {
151
- readBlockAttrsParams,
152
- readBlockAttrsValue,
153
- setBlockAttrsValue,
154
- summarizeBlockProps,
155
- } from './blockProperties.js';
156
- export { BlockPropertiesPopover } from './BlockPropertiesPopover.js';
157
- export type { BlockPropertiesPopoverProps } from './BlockPropertiesPopover.js';
158
- export { InlinePreviewGutter } from './InlinePreviewGutter.js';
159
- export type { InlinePreviewGutterProps } from './InlinePreviewGutter.js';
160
-
161
- export { MediaBin } from './MediaBin.js';
162
- export type { MediaBinProps } from './MediaBin.js';
163
-
164
- export { StatusBar } from './StatusBar.js';
165
- export type { StatusBarProps } from './StatusBar.js';
166
-
167
- export { TooltipLayer } from './Tooltip.js';
168
-
169
- // Drag-and-drop
170
- export { DropZoneOverlay } from './DropZoneOverlay.js';
171
- export type { DropZoneOverlayProps } from './DropZoneOverlay.js';
172
-
173
- export { useFileDrop, classifyFile } from './hooks/useFileDrop.js';
174
- export type {
175
- FileCategory,
176
- DragContentType,
177
- DropTarget,
178
- UseFileDropOptions,
179
- UseFileDropResult,
180
- } from './hooks/useFileDrop.js';
181
-
182
- export {
183
- partitionFiles,
184
- processMediaFiles,
185
- processTextFile,
186
- processTextFiles,
187
- } from './utils/dropUtils.js';
188
-
189
- // Monaco lazy loader — exported so hosts embedding RawEditor-like surfaces
190
- // can share the same load-once Monaco bootstrap.
191
- export { useMonacoLoader } from './useMonacoLoader.js';
192
- export type { UseMonacoLoaderResult } from './useMonacoLoader.js';
193
-
194
- // Monaco language-service worker wiring — the host supplies the `?worker`
195
- // constructors, this owns the label→worker mapping. See monacoWorkers.ts.
196
- export { configureMonacoWorkers } from './monacoWorkers.js';
197
- export type { MonacoWorkerConstructor, MonacoWorkerConstructors } from './monacoWorkers.js';
198
-
199
- // Custom themes — provider stack (doc frontmatter + browser-local library)
200
- export {
201
- CustomThemeProvider,
202
- useCustomThemes,
203
- useDocCustomThemes,
204
- ImportThemeSection,
205
- draftPatchFromImportedTheme,
206
- } from './customThemes/index.js';
207
- export type {
208
- CustomThemeContextValue,
209
- CustomThemeProviderProps,
210
- DocCustomThemes,
211
- ImportThemeSectionProps,
212
- ImportedThemeResult,
213
- ThemeSaveExtras,
214
- } from './customThemes/index.js';
215
-
216
- // Custom templates — provider stack (doc frontmatter + browser-local library)
217
- export {
218
- CustomTemplateProvider,
219
- useCustomTemplates,
220
- useDocCustomTemplates,
221
- } from './customTemplates/index.js';
222
- export type {
223
- CustomTemplateContextValue,
224
- CustomTemplateProviderProps,
225
- DocCustomTemplates,
226
- } from './customTemplates/index.js';
227
-
228
- // Bridge utilities
229
- export { markdownToTiptap, tiptapToMarkdown } from './tiptapBridge.js';
230
-
231
- // Slideshow builder (shared between PreviewPanel and export flows)
232
- export { buildPreviewDoc } from './buildPreviewDoc.js';
233
-
234
- // Tiptap extension: Heading with template annotation support
235
- export { HeadingWithTemplate } from './TemplateAnnotation.js';
236
-
237
- // Diagram editor — ASCII fences are the authored diagram format. The
238
- // AsciiDiagramExtension turns code fences containing box-and-line art
239
- // into interactive canvases; edits re-render the art (the fence stays the
240
- // source of truth). Legacy `{[diagram]}` heading sections still RENDER in
241
- // preview/player via core, but heading-based canvas editing was removed
242
- // (BREAKING: DiagramExtension / DiagramWidget / useDiagramData / the
243
- // heading command helpers are gone).
244
- export { DiagramCanvas } from './diagram/DiagramCanvas.js';
245
- export type { DiagramCommand } from './diagram/DiagramCanvas.js';
246
- export type { DiagramData, DiagramNode, DiagramEdge } from './diagram/types.js';
247
- export {
248
- AsciiDiagramExtension,
249
- findAsciiDiagramBlockPos,
250
- isAsciiSourceVisible,
251
- toggleAsciiSource,
252
- } from './asciiDiagram/AsciiDiagramExtension.js';
253
- export type {
254
- AsciiDiagramBlockEntry,
255
- AsciiDiagramExtensionOptions,
256
- AsciiDiagramPluginState,
257
- } from './asciiDiagram/AsciiDiagramExtension.js';
258
- export { AsciiDiagramWidget } from './asciiDiagram/AsciiDiagramWidget.js';
259
- export { useAsciiDiagramData, asciiDiagramToCanvas } from './asciiDiagram/asciiDiagramData.js';
260
- export type { AsciiDiagramView } from './asciiDiagram/asciiDiagramData.js';
261
- export {
262
- applyAsciiDiagramCommand,
263
- applyRepairCommand,
264
- replaceAsciiFenceText,
265
- } from './asciiDiagram/asciiDiagramCommands.js';
266
- export type { ApplyAsciiDiagramCommandOptions } from './asciiDiagram/asciiDiagramCommands.js';
267
- // RepairableDiagramExtension mounts an inline "Repair as diagram" button on
268
- // code fences holding BROKEN box art — art too misaligned for clean detection
269
- // (so it renders as a faithful code block). One click reconstructs it into
270
- // clean `diagram`-tagged art that the AsciiDiagramExtension turns into a
271
- // canvas. Peer to the diagram/tree editors; claims the fences neither does.
272
- export {
273
- RepairableDiagramExtension,
274
- findRepairableBlockPos,
275
- isRepairableFence,
276
- REPAIRABLE_KEY,
277
- } from './asciiDiagram/RepairableDiagramExtension.js';
278
- export type {
279
- RepairableBlockEntry,
280
- RepairableDiagramExtensionOptions,
281
- RepairablePluginState,
282
- } from './asciiDiagram/RepairableDiagramExtension.js';
283
- export {
284
- addEdgeOp,
285
- addNodeOp,
286
- moveNodeOp,
287
- removeEdgeOp,
288
- removeNodeOp,
289
- renameNodeOp,
290
- resizeNodeOp,
291
- sanitizeAsciiLabel,
292
- translateDiagramOp,
293
- } from './asciiDiagram/asciiDiagramOps.js';
294
- export { shouldPasteAsAsciiFence } from './asciiDiagram/asciiPaste.js';
295
-
296
- // Treeview editor — ASCII file-tree / outline fences get an interactive
297
- // outline widget; edits re-render the tree art (the fence stays the source
298
- // of truth). Peer to the ASCII diagram editor; mutually exclusive with it
299
- // (a fence with boxes is a diagram, not a tree).
300
- export { TreeViewExtension, findTreeBlockPos } from './treeview/TreeViewExtension.js';
301
- export type {
302
- TreeBlockEntry,
303
- TreeViewExtensionOptions,
304
- TreeViewPluginState,
305
- } from './treeview/TreeViewExtension.js';
306
- export { TreeOutlineWidget } from './treeview/TreeOutlineWidget.js';
307
- export { useTreeViewData } from './treeview/treeViewData.js';
308
- export type { TreeViewData } from './treeview/treeViewData.js';
309
- export { applyTreeCommand, replaceTreeFenceText } from './treeview/treeViewCommands.js';
310
- export type { TreeCommand } from './treeview/treeViewCommands.js';
311
- export {
312
- addItemOp,
313
- indentItemOp,
314
- moveItemDownOp,
315
- moveItemUpOp,
316
- outdentItemOp,
317
- removeItemOp,
318
- renameItemOp,
319
- sanitizeTreeLabel,
320
- toggleDirOp,
321
- } from './treeview/treeOps.js';
322
- export { shouldPasteAsTreeFence } from './treeview/treePaste.js';
323
-
324
- // Timeline editor — authored marker-rail fences become an accessible canvas
325
- // with add-point affordances and a selected-point inspector. Semantic edits
326
- // re-render the canonical `timeline` fence in one undoable transaction.
327
- export {
328
- TimelineViewExtension,
329
- TIMELINE_VIEW_KEY,
330
- findTimelineBlockPos,
331
- getTimelineForNode,
332
- parseTimelineForNode,
333
- } from './timeline/TimelineViewExtension.js';
334
- export type {
335
- TimelineBlockEntry,
336
- TimelineViewExtensionOptions,
337
- TimelineViewPluginState,
338
- } from './timeline/TimelineViewExtension.js';
339
- export { TimelineEditorWidget } from './timeline/TimelineEditorWidget.js';
340
- export type { TimelineEditorWidgetProps } from './timeline/TimelineEditorWidget.js';
341
- export { useTimelineData } from './timeline/timelineData.js';
342
- export type { TimelineViewData } from './timeline/timelineData.js';
343
- export {
344
- applyTimelineCommand,
345
- isTimelineSourceSafeForSemanticEdit,
346
- } from './timeline/timelineCommands.js';
347
- export type { TimelineCommand, TimelineCommandResult } from './timeline/timelineCommands.js';
348
- export {
349
- addTimelineEventOp,
350
- nextTimelineEventId,
351
- removeTimelineEventOp,
352
- sanitizeTimelineText,
353
- updateTimelineEventOp,
354
- } from './timeline/timelineOps.js';
355
- export type {
356
- AddTimelineEventOptions,
357
- AddTimelineEventResult,
358
- TimelineEventPatch,
359
- } from './timeline/timelineOps.js';
360
- export { shouldPasteAsTimelineFence } from './timeline/timelinePaste.js';
361
-
362
- // JSON Form — editable component
363
- export { JsonEditor } from './jsonEditor/index.js';
364
- export type { JsonEditorProps } from './jsonEditor/index.js';
365
-
366
- // Recorder — browser-based audio/camera/screen capture. Components and
367
- // hooks for capturing media via `MediaRecorder` and persisting the
368
- // resulting blob into a `ContentContainer` through the host's
369
- // `MediaProvider`. Previously published as `@bendyline/squisq-recorder-react`;
370
- // folded into editor-react so it ships with the editor it's wired into.
371
- export { RecorderModal } from './recorder/RecorderModal.js';
372
- export type {
373
- RecorderColorScheme,
374
- RecorderModalProps,
375
- RecorderSaveResult,
376
- } from './recorder/RecorderModal.js';
377
- export { RecorderButton } from './recorder/RecorderButton.js';
378
- export type { RecorderButtonProps } from './recorder/RecorderButton.js';
379
- export { RecorderPanel } from './recorder/RecorderPanel.js';
380
- export type { RecorderPanelProps } from './recorder/RecorderPanel.js';
381
- export { useMediaRecorder, getCaptureKind } from './recorder/hooks/useMediaRecorder.js';
382
- export type {
383
- UseMediaRecorderOptions,
384
- UseMediaRecorderResult,
385
- RecorderSource,
386
- RecorderState,
387
- } from './recorder/hooks/useMediaRecorder.js';
388
- export { useStreamPreview } from './recorder/hooks/useStreamPreview.js';
389
- export { requestMicStream } from './recorder/sources/micStream.js';
390
- export { requestCameraStream } from './recorder/sources/cameraStream.js';
391
- export type { CameraStreamOptions } from './recorder/sources/cameraStream.js';
392
- export { requestScreenStream } from './recorder/sources/screenStream.js';
393
- export type { ScreenStreamOptions, ScreenStreamHandle } from './recorder/sources/screenStream.js';
394
- export {
395
- resolveFormat,
396
- supportsMediaRecorder,
397
- supportsUserMedia,
398
- supportsDisplayMedia,
399
- buildFilename,
400
- } from './recorder/formats.js';
401
- export type { CaptureKind, ResolvedFormat } from './recorder/formats.js';
402
- export { buildTimingJson, encodeTimingJson, timingPathFor } from './recorder/timingJson.js';
403
- export type { TimingJson, RecordedBookmark } from './recorder/timingJson.js';
404
-
405
- // Teleprompter — the Narrate display mode under the Use tab: voice-paced
406
- // prompter surface, floating-window tiers, and the mic analysis pipeline.
407
- export {
408
- TeleprompterView,
409
- TeleprompterSurface,
410
- TeleprompterControls,
411
- useTeleprompter,
412
- useNarrationRecorder,
413
- buildNarrationSavePlan,
414
- executeNarrationSave,
415
- insertNarrationPreamble,
416
- narrationAnnotationLine,
417
- cameraVideoLine,
418
- vadConfigForSensitivity,
419
- useMicAnalysis,
420
- PCM_WORKLET_SOURCE,
421
- PCM_WORKLET_NAME,
422
- registerPcmWorklet,
423
- createFloatingWindowManager,
424
- detectFloatTiers,
425
- useFloatingWindow,
426
- measureTokenLines,
427
- targetOffsetFor,
428
- stepScroll,
429
- EYE_LINE_FRACTION,
430
- TELEPROMPTER_CSS,
431
- ensureTeleprompterStyles,
432
- prompterVarsFromTheme,
433
- DEFAULT_TELEPROMPTER_PREFS,
434
- } from './teleprompter/index.js';
435
- export type {
436
- TeleprompterViewProps,
437
- TeleprompterSurfaceProps,
438
- TeleprompterControlsProps,
439
- TeleprompterController,
440
- TeleprompterRecordingDeps,
441
- NarrationRecorderController,
442
- NarrationRecorderState,
443
- NarrationTake,
444
- NarrationSavePlan,
445
- NarrationSaveResult,
446
- MicAnalysisHandle,
447
- MicAnalysisStatus,
448
- FloatingWindowManager,
449
- FloatOpenOptions,
450
- CanvasSink,
451
- FloatingWindowHandle,
452
- TokenLineMap,
453
- TeleprompterPrefs,
454
- PrompterTransport,
455
- FloatTier,
456
- } from './teleprompter/index.js';
457
-
458
- // Image editor — layered, sidecar-persisted raster authoring surface.
459
- // Pairs with `ImageViewer` and the `<basename>_files/` sidecar convention.
460
- export { ImageEditor } from './ImageEditor.js';
461
- export type { ImageEditorProps } from './ImageEditor.js';
462
- export { useImageEditor } from './imageEditor/useImageEditor.js';
463
- export type { UseImageEditorOptions, UseImageEditorReturn } from './imageEditor/useImageEditor.js';
464
- export { imageEditorReducer, initialImageEditorState } from './imageEditor/state.js';
465
- export type {
466
- ImageEditorState,
467
- ImageEditorAction,
468
- ImageEditorTool,
469
- CanvasRect,
470
- } from './imageEditor/state.js';
@@ -1,81 +0,0 @@
1
- /**
2
- * Standalone Tiptap-backed rich text field for use inside `<JsonEditor>`.
3
- * Doesn't share `EditorContext` with the document editor — value is a
4
- * controlled markdown string. Reuses `markdownToTiptap` /
5
- * `tiptapToMarkdown` so fidelity matches the WysiwygEditor.
6
- */
7
-
8
- import { useEffect, useRef } from 'react';
9
- import { useEditor, EditorContent } from '@tiptap/react';
10
- import StarterKit from '@tiptap/starter-kit';
11
- import Table from '@tiptap/extension-table';
12
- import TableRow from '@tiptap/extension-table-row';
13
- import TableCell from '@tiptap/extension-table-cell';
14
- import TableHeader from '@tiptap/extension-table-header';
15
- import TaskList from '@tiptap/extension-task-list';
16
- import TaskItem from '@tiptap/extension-task-item';
17
- import Placeholder from '@tiptap/extension-placeholder';
18
- import { markdownToTiptap, tiptapToMarkdown } from '../tiptapBridge';
19
-
20
- export interface EmbeddedRichTextFieldProps {
21
- value: string;
22
- onChange: (next: string) => void;
23
- readOnly?: boolean;
24
- placeholder?: string;
25
- className?: string;
26
- }
27
-
28
- export function EmbeddedRichTextField(props: EmbeddedRichTextFieldProps) {
29
- const { value, onChange, readOnly = false, placeholder, className } = props;
30
- const isExternalUpdate = useRef(false);
31
- const lastValueRef = useRef(value);
32
-
33
- const editor = useEditor({
34
- editable: !readOnly,
35
- extensions: [
36
- StarterKit.configure({
37
- codeBlock: { HTMLAttributes: { class: 'squisq-code-block' } },
38
- }),
39
- Table.configure({ resizable: false }),
40
- TableRow,
41
- TableCell,
42
- TableHeader,
43
- TaskList,
44
- TaskItem.configure({ nested: true }),
45
- Placeholder.configure({ placeholder: placeholder ?? '' }),
46
- ],
47
- content: markdownToTiptap(value),
48
- onUpdate: ({ editor: ed }) => {
49
- if (isExternalUpdate.current) return;
50
- const html = ed.getHTML();
51
- const md = tiptapToMarkdown(html);
52
- lastValueRef.current = md;
53
- onChange(md);
54
- },
55
- editorProps: {
56
- attributes: {
57
- class: 'squisq-jf-richtext-prose',
58
- },
59
- },
60
- });
61
-
62
- // Sync external value changes back into the editor (e.g., undo at the host level).
63
- useEffect(() => {
64
- if (!editor) return;
65
- if (value === lastValueRef.current) return;
66
- isExternalUpdate.current = true;
67
- try {
68
- editor.commands.setContent(markdownToTiptap(value), false);
69
- lastValueRef.current = value;
70
- } finally {
71
- isExternalUpdate.current = false;
72
- }
73
- }, [editor, value]);
74
-
75
- useEffect(() => {
76
- if (editor) editor.setEditable(!readOnly);
77
- }, [editor, readOnly]);
78
-
79
- const cls = 'squisq-jf-richtext' + (className ? ` ${className}` : '');
80
- return <EditorContent editor={editor} className={cls} />;
81
- }