@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
package/src/fileKind.ts DELETED
@@ -1,158 +0,0 @@
1
- /**
2
- * fileKind
3
- *
4
- * Maps a file name (or bare extension) to a Monaco language ID and decides
5
- * whether the editor shell should operate in markdown mode (full WYSIWYG +
6
- * Preview experience) or code mode (Monaco-only view with formatting
7
- * buttons hidden).
8
- *
9
- * The mapping favors common web / systems languages that Monaco ships with
10
- * out of the box. Unknown extensions fall back to markdown mode so the
11
- * existing UX remains the default for anything we don't recognize.
12
- */
13
-
14
- export interface FileKind {
15
- /**
16
- * 'markdown' keeps the full editor (WYSIWYG + Preview tabs); 'code' is
17
- * Monaco-only; 'image' renders a dedicated image viewer with no text
18
- * editing surface.
19
- */
20
- mode: 'markdown' | 'code' | 'image';
21
- /** Monaco language ID — passed to `<Editor defaultLanguage={...} />`. */
22
- language: string;
23
- }
24
-
25
- /**
26
- * Extension → Monaco language ID. Keys are lowercase, no leading dot.
27
- * Extend as needed; unknown extensions fall back to markdown mode.
28
- */
29
- const EXT_TO_LANGUAGE: Record<string, string> = {
30
- md: 'markdown',
31
- markdown: 'markdown',
32
- mdown: 'markdown',
33
- txt: 'plaintext',
34
- ts: 'typescript',
35
- tsx: 'typescript',
36
- js: 'javascript',
37
- jsx: 'javascript',
38
- mjs: 'javascript',
39
- cjs: 'javascript',
40
- json: 'json',
41
- jsonc: 'json',
42
- html: 'html',
43
- htm: 'html',
44
- css: 'css',
45
- scss: 'scss',
46
- less: 'less',
47
- py: 'python',
48
- go: 'go',
49
- rs: 'rust',
50
- rb: 'ruby',
51
- java: 'java',
52
- c: 'c',
53
- h: 'c',
54
- cpp: 'cpp',
55
- hpp: 'cpp',
56
- cc: 'cpp',
57
- cs: 'csharp',
58
- php: 'php',
59
- sh: 'shell',
60
- bash: 'shell',
61
- zsh: 'shell',
62
- yml: 'yaml',
63
- yaml: 'yaml',
64
- toml: 'ini',
65
- ini: 'ini',
66
- xml: 'xml',
67
- svg: 'xml',
68
- sql: 'sql',
69
- lua: 'lua',
70
- swift: 'swift',
71
- kt: 'kotlin',
72
- kts: 'kotlin',
73
- dockerfile: 'dockerfile',
74
- png: 'image',
75
- jpg: 'image',
76
- jpeg: 'image',
77
- gif: 'image',
78
- webp: 'image',
79
- bmp: 'image',
80
- ico: 'image',
81
- avif: 'image',
82
- };
83
-
84
- /**
85
- * Languages that keep the full markdown shell (WYSIWYG + Preview). Anything
86
- * outside this set is treated as code, except for languages in
87
- * `IMAGE_MODE_LANGUAGES`.
88
- */
89
- const MARKDOWN_MODE_LANGUAGES = new Set(['markdown', 'plaintext']);
90
-
91
- /**
92
- * Languages that switch the shell into image-viewer mode — no text editing
93
- * surface, no markdown chrome.
94
- */
95
- const IMAGE_MODE_LANGUAGES = new Set(['image']);
96
-
97
- /**
98
- * Pull the lowercase extension (no leading dot) from a file name or bare
99
- * extension string. Returns null when none is discernible.
100
- *
101
- * Examples:
102
- * "foo.ts" → "ts"
103
- * "foo.tar.gz" → "gz"
104
- * ".ts" → "ts"
105
- * "ts" → "ts"
106
- * "Dockerfile" → "dockerfile" (full name match for extensionless files)
107
- * "" → null
108
- */
109
- function extractExtension(fileName: string): string | null {
110
- const trimmed = fileName.trim();
111
- if (!trimmed) return null;
112
-
113
- // Strip any leading path — take only the basename.
114
- const base = trimmed.replace(/^.*[/\\]/, '');
115
- if (!base) return null;
116
-
117
- const dotIdx = base.lastIndexOf('.');
118
- if (dotIdx === -1) {
119
- // No dot — could still be a recognized bare name (Dockerfile) or a bare
120
- // extension passed by a caller like "ts". Lower-case and return.
121
- return base.toLowerCase();
122
- }
123
- if (dotIdx === base.length - 1) return null; // Trailing dot, no extension.
124
- return base.slice(dotIdx + 1).toLowerCase();
125
- }
126
-
127
- /**
128
- * Detect a Monaco language ID from a file name. Returns null when the
129
- * extension (or bare name) is not in the mapping.
130
- */
131
- export function detectLanguageFromFileName(fileName: string): string | null {
132
- const ext = extractExtension(fileName);
133
- if (!ext) return null;
134
- return EXT_TO_LANGUAGE[ext] ?? null;
135
- }
136
-
137
- /**
138
- * Resolve the editor mode + Monaco language for a given file. The explicit
139
- * `language` argument, if provided, wins over any detection from
140
- * `fileName`. When nothing matches, falls back to markdown mode.
141
- */
142
- export function resolveFileKind(fileName?: string, language?: string): FileKind {
143
- const resolvedLanguage = language ?? (fileName ? detectLanguageFromFileName(fileName) : null);
144
-
145
- if (!resolvedLanguage) {
146
- return { mode: 'markdown', language: 'markdown' };
147
- }
148
-
149
- let mode: FileKind['mode'];
150
- if (IMAGE_MODE_LANGUAGES.has(resolvedLanguage)) {
151
- mode = 'image';
152
- } else if (MARKDOWN_MODE_LANGUAGES.has(resolvedLanguage)) {
153
- mode = 'markdown';
154
- } else {
155
- mode = 'code';
156
- }
157
- return { mode, language: resolvedLanguage };
158
- }
@@ -1,29 +0,0 @@
1
- /**
2
- * frontmatter
3
- *
4
- * Small helpers for the YAML frontmatter block at the top of a markdown
5
- * document. The WYSIWYG editor hides frontmatter from its editing surface
6
- * (and re-prepends it on save), and the block-at-a-time slicer
7
- * (`blockRange.ts`) needs to know where the body starts so it never folds
8
- * frontmatter into a block slice. Both share this one definition.
9
- */
10
-
11
- /** Regex matching a YAML frontmatter block at the start of the document. */
12
- export const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/;
13
-
14
- /** Strip YAML frontmatter from markdown, returning both parts. */
15
- export function stripFrontmatter(md: string): { body: string; frontmatter: string } {
16
- const m = md.match(FRONTMATTER_RE);
17
- if (!m) return { body: md, frontmatter: '' };
18
- return { body: md.slice(m[0].length), frontmatter: m[0] };
19
- }
20
-
21
- /**
22
- * Character offset where the document body begins — i.e. the length of the
23
- * leading frontmatter block (including its trailing newline), or 0 when the
24
- * source has no frontmatter.
25
- */
26
- export function frontmatterEndOffset(source: string): number {
27
- const m = source.match(FRONTMATTER_RE);
28
- return m ? m[0].length : 0;
29
- }
@@ -1,23 +0,0 @@
1
- /** Canonical and legacy keys for frontmatter settings managed by the editor. */
2
- export const FRONTMATTER_SETTING_KEYS = {
3
- theme: { canonical: 'squisq-theme', legacy: ['themeId', 'theme'] as const },
4
- transform: { canonical: 'squisq-transform', legacy: 'transform-style' as const },
5
- captions: { canonical: 'squisq-captions', legacy: 'caption-style' as const },
6
- coverSlide: { canonical: 'squisq-cover-slide', legacy: 'cover-slide' as const },
7
- } as const;
8
-
9
- /** Runtime defaults whose equivalent frontmatter entries can be omitted. */
10
- export const FRONTMATTER_SETTING_DEFAULTS = {
11
- theme: 'standard',
12
- transform: '',
13
- captions: 'standard',
14
- coverSlide: true,
15
- } as const;
16
-
17
- /** Return `null` when a setting matches its runtime default so writers remove it. */
18
- export function omitFrontmatterDefault<T extends string | number | boolean>(
19
- value: T,
20
- defaultValue: T,
21
- ): T | null {
22
- return value === defaultValue ? null : value;
23
- }
@@ -1,291 +0,0 @@
1
- /**
2
- * headingTransition
3
- *
4
- * Read and write a block's transition (`transition` / `transitionDirection` /
5
- * `transitionDuration`) on a heading, in both editing surfaces:
6
- *
7
- * - Markdown (Monaco): operate on the raw heading line string.
8
- * - WYSIWYG (Tiptap): operate on the heading node's `dataBlockAttrs` string
9
- * (Pandoc `{…}` inner) and `dataTemplateParams` string (the params inside
10
- * the squisq-native `{[…]}` annotation).
11
- *
12
- * The editor writes transitions to the squisq-native `{[…]}` annotation by
13
- * default. It still reads legacy Pandoc `{transition=…}` attributes and
14
- * removes/migrates those keys when rewriting, so the two channels cannot drift
15
- * after a toolbar edit.
16
- *
17
- * All the brace-matching / tokenizing / serializing is delegated to the
18
- * shared core helpers so this stays in lockstep with the parser by import
19
- * rather than by copied regexes.
20
- */
21
-
22
- import {
23
- matchTrailingTemplateAnnotation,
24
- matchTrailingPandocAttr,
25
- parsePandocAttrTokens,
26
- serializePandocAttributes,
27
- tokenizeAttrTokens,
28
- splitKeyValueToken,
29
- quoteAttrValue,
30
- type HeadingAttributes,
31
- } from '@bendyline/squisq/markdown';
32
-
33
- /** Raw (un-coerced) transition attribute values for one block. */
34
- export interface TransitionFields {
35
- /** `transition` value. Empty string means "none" (`cut`). */
36
- type: string;
37
- /** `transitionDirection` value, or '' when unset. */
38
- direction: string;
39
- /** `transitionDuration` value (raw, e.g. `0.7` or `700ms`), or '' when unset. */
40
- duration: string;
41
- }
42
-
43
- export const EMPTY_TRANSITION: TransitionFields = { type: '', direction: '', duration: '' };
44
-
45
- /** The three keys this module owns, in canonical emit order. */
46
- const TRANSITION_KEYS = ['transition', 'transitionDirection', 'transitionDuration'] as const;
47
-
48
- const HEADING_LINE_RE = /^(#{1,6}\s+)([\s\S]*)$/;
49
-
50
- // ============================================
51
- // params map ⇄ fields
52
- // ============================================
53
-
54
- function fieldsFromParams(params: Record<string, string> | undefined): TransitionFields {
55
- if (!params) return { ...EMPTY_TRANSITION };
56
- return {
57
- type: params.transition ?? '',
58
- direction: params.transitionDirection ?? '',
59
- duration: params.transitionDuration ?? '',
60
- };
61
- }
62
-
63
- /**
64
- * Return a new params map with the transition keys rewritten from `next`,
65
- * preserving every other key in its original order. When `type` is empty
66
- * (none), all three transition keys are dropped; direction/duration are only
67
- * written when a type is present (they're meaningless on their own).
68
- */
69
- function applyFieldsToParams(
70
- params: Record<string, string>,
71
- next: TransitionFields,
72
- ): Record<string, string> {
73
- const out: Record<string, string> = {};
74
- for (const [key, value] of Object.entries(params)) {
75
- if ((TRANSITION_KEYS as readonly string[]).includes(key)) continue;
76
- out[key] = value;
77
- }
78
- if (next.type) {
79
- out.transition = next.type;
80
- if (next.direction) out.transitionDirection = next.direction;
81
- if (next.duration) out.transitionDuration = next.duration;
82
- }
83
- return out;
84
- }
85
-
86
- function removeFieldsFromAttrs(attrs: HeadingAttributes): HeadingAttributes {
87
- if (!attrs.params) return attrs;
88
- const params = applyFieldsToParams(attrs.params, EMPTY_TRANSITION);
89
- if (Object.keys(params).length > 0) attrs.params = params;
90
- else delete attrs.params;
91
- return attrs;
92
- }
93
-
94
- /** Parse a bare `key=value …` token string into a params map. */
95
- function paramsFromTokenString(input: string, skipFirstToken: boolean): Record<string, string> {
96
- const tokens = tokenizeAttrTokens(input);
97
- const params: Record<string, string> = {};
98
- for (const token of skipFirstToken ? tokens.slice(1) : tokens) {
99
- const kv = splitKeyValueToken(token);
100
- if (kv) params[kv.key] = kv.value;
101
- }
102
- return params;
103
- }
104
-
105
- function templatePartsFromInner(inner: string | null | undefined): {
106
- template: string | undefined;
107
- params: Record<string, string>;
108
- } {
109
- if (!inner) return { template: undefined, params: {} };
110
- const tokens = tokenizeAttrTokens(inner);
111
- const firstIsParam = tokens.length > 0 && tokens[0].indexOf('=') > 0;
112
- const template = firstIsParam || tokens.length === 0 ? undefined : tokens[0];
113
- const startIdx = template ? 1 : 0;
114
- const params: Record<string, string> = {};
115
- for (const token of tokens.slice(startIdx)) {
116
- const kv = splitKeyValueToken(token);
117
- if (kv) params[kv.key] = kv.value;
118
- }
119
- return { template, params };
120
- }
121
-
122
- function paramsToInner(params: Record<string, string>): string | null {
123
- const parts = Object.entries(params).map(([key, value]) => `${key}=${quoteAttrValue(value)}`);
124
- return parts.length > 0 ? parts.join(' ') : null;
125
- }
126
-
127
- function templateAnnotationOrNull(
128
- template: string | undefined,
129
- params: Record<string, string>,
130
- ): string | null {
131
- const parts: string[] = [];
132
- if (template) parts.push(template);
133
- const paramInner = paramsToInner(params);
134
- if (paramInner) parts.push(paramInner);
135
- return parts.length > 0 ? `{[${parts.join(' ')}]}` : null;
136
- }
137
-
138
- // ============================================
139
- // Heading line (Markdown / Monaco view)
140
- // ============================================
141
-
142
- interface SplitHeadingLine {
143
- /** `## ` */
144
- prefix: string;
145
- /** Bare heading text (trailing whitespace stripped). */
146
- text: string;
147
- /** Inner of the trailing Pandoc `{…}` block, or null. */
148
- pandocInner: string | null;
149
- /** Verbatim trailing `{[…]}` template annotation (no leading space), or ''. */
150
- templateText: string;
151
- }
152
-
153
- /**
154
- * Split a heading line into its prefix, bare text, and trailing annotation
155
- * blocks. Mirrors the peel-off order in `tiptapBridge` / core's parser:
156
- * the `{[…]}` template annotation sits at the very end, the Pandoc `{…}`
157
- * block just before it. Returns null when `line` is not a heading.
158
- */
159
- function splitHeadingLine(line: string): SplitHeadingLine | null {
160
- const m = line.match(HEADING_LINE_RE);
161
- if (!m) return null;
162
- let rest = m[2];
163
-
164
- let templateText = '';
165
- const tm = matchTrailingTemplateAnnotation(rest);
166
- if (tm) {
167
- templateText = rest.slice(tm.index).trim();
168
- rest = rest.slice(0, tm.index);
169
- }
170
-
171
- let pandocInner: string | null = null;
172
- const pm = matchTrailingPandocAttr(rest);
173
- if (pm) {
174
- pandocInner = pm.inner;
175
- rest = rest.slice(0, pm.index);
176
- }
177
-
178
- return { prefix: m[1], text: rest.replace(/\s+$/, ''), pandocInner, templateText };
179
- }
180
-
181
- /**
182
- * Read the transition fields off a heading line. Looks in both the Pandoc
183
- * `{…}` block (legacy) and the `{[…]}` template params (canonical),
184
- * with the Pandoc block taking precedence. Returns the empty transition for
185
- * non-heading lines.
186
- */
187
- export function readHeadingLineTransition(line: string): TransitionFields {
188
- const split = splitHeadingLine(line);
189
- if (!split) return { ...EMPTY_TRANSITION };
190
- const fromTemplate = split.templateText
191
- ? templatePartsFromInner(stripTemplateBraces(split.templateText)).params
192
- : {};
193
- const fromPandoc = split.pandocInner
194
- ? (parsePandocAttrTokens(split.pandocInner).params ?? {})
195
- : {};
196
- return fieldsFromParams({ ...fromTemplate, ...fromPandoc });
197
- }
198
-
199
- /**
200
- * Return `line` with its transition rewritten from `next`, writing into the
201
- * squisq-native `{[…]}` annotation. Legacy Pandoc transition keys are removed
202
- * while preserving ids, classes, and other Pandoc params. Non-heading lines are
203
- * returned unchanged.
204
- */
205
- export function setHeadingLineTransition(line: string, next: TransitionFields): string {
206
- const split = splitHeadingLine(line);
207
- if (!split) return line;
208
- const attrs: HeadingAttributes = split.pandocInner
209
- ? parsePandocAttrTokens(split.pandocInner)
210
- : {};
211
- removeFieldsFromAttrs(attrs);
212
- const pandoc = pandocBlockOrNull(attrs);
213
-
214
- const templateParts = templatePartsFromInner(
215
- split.templateText ? stripTemplateBraces(split.templateText) : null,
216
- );
217
- const templateParams = applyFieldsToParams(templateParts.params, next);
218
- const template = templateAnnotationOrNull(templateParts.template, templateParams);
219
-
220
- let out = split.prefix + split.text;
221
- if (pandoc) out += ` ${pandoc}`;
222
- if (template) out += ` ${template}`;
223
- return out;
224
- }
225
-
226
- /** Strip the outer `{[` … `]}` from a verbatim template annotation. */
227
- function stripTemplateBraces(templateText: string): string {
228
- const m = templateText.match(/^\{\[([\s\S]*)\]\}[\s\]}]*$/);
229
- return m ? m[1] : templateText;
230
- }
231
-
232
- // ============================================
233
- // data-block-attrs (WYSIWYG / Tiptap view)
234
- // ============================================
235
-
236
- /**
237
- * Read the transition fields from a heading node's `dataBlockAttrs` (legacy
238
- * Pandoc inner) plus `dataTemplateParams` (canonical `{[…]}` params). Pandoc
239
- * wins so the picker mirrors the value that `markdownToDoc` will render when
240
- * both channels are present.
241
- */
242
- export function readBlockAttrsTransition(
243
- blockAttrsInner: string | null | undefined,
244
- templateParams: string | null | undefined,
245
- ): TransitionFields {
246
- const fromTemplate = templateParams ? paramsFromTokenString(templateParams, false) : {};
247
- const fromPandoc = blockAttrsInner ? (parsePandocAttrTokens(blockAttrsInner).params ?? {}) : {};
248
- return fieldsFromParams({ ...fromTemplate, ...fromPandoc });
249
- }
250
-
251
- export interface HeadingTransitionAttrs {
252
- /** Inner of the Pandoc `{…}` block, without braces. */
253
- blockAttrsInner: string | null;
254
- /** Param string inside the `{[…]}` annotation, without the template token. */
255
- templateParams: string | null;
256
- }
257
-
258
- /**
259
- * Rewrite a heading node's transition for Tiptap, writing the transition
260
- * family into `dataTemplateParams` and removing any legacy transition keys
261
- * from `dataBlockAttrs`.
262
- */
263
- export function setHeadingAttrsTransition(
264
- blockAttrsInner: string | null | undefined,
265
- templateParams: string | null | undefined,
266
- next: TransitionFields,
267
- ): HeadingTransitionAttrs {
268
- const attrs: HeadingAttributes = blockAttrsInner ? parsePandocAttrTokens(blockAttrsInner) : {};
269
- removeFieldsFromAttrs(attrs);
270
- const pandoc = pandocBlockOrNull(attrs);
271
-
272
- const params = applyFieldsToParams(paramsFromTokenString(templateParams ?? '', false), next);
273
- return {
274
- blockAttrsInner: pandoc ? pandoc.slice(1, -1) : null,
275
- templateParams: paramsToInner(params),
276
- };
277
- }
278
-
279
- // ============================================
280
- // shared
281
- // ============================================
282
-
283
- /**
284
- * Serialize `attrs` to a `{…}` block, or null when there's nothing to emit.
285
- * `serializePandocAttributes` returns the literal `{}` marker for an empty
286
- * attribute set; we treat that as "no block".
287
- */
288
- function pandocBlockOrNull(attrs: HeadingAttributes): string | null {
289
- const raw = serializePandocAttributes(attrs);
290
- return raw == null || raw === '{}' ? null : raw;
291
- }