@bendyline/squisq-editor-react 1.4.0 → 1.5.1

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 (446) hide show
  1. package/dist/DocumentSettingsDialog.d.ts +26 -0
  2. package/dist/DocumentSettingsDialog.d.ts.map +1 -0
  3. package/dist/DocumentSettingsDialog.js +115 -0
  4. package/dist/DocumentSettingsDialog.js.map +1 -0
  5. package/dist/EditorContext.d.ts +248 -4
  6. package/dist/EditorContext.d.ts.map +1 -1
  7. package/dist/EditorContext.js +248 -10
  8. package/dist/EditorContext.js.map +1 -1
  9. package/dist/EditorShell.d.ts +173 -4
  10. package/dist/EditorShell.d.ts.map +1 -1
  11. package/dist/EditorShell.js +110 -10
  12. package/dist/EditorShell.js.map +1 -1
  13. package/dist/EmojiPicker.d.ts +50 -0
  14. package/dist/EmojiPicker.d.ts.map +1 -0
  15. package/dist/EmojiPicker.js +182 -0
  16. package/dist/EmojiPicker.js.map +1 -0
  17. package/dist/ImageEditor.d.ts +68 -0
  18. package/dist/ImageEditor.d.ts.map +1 -0
  19. package/dist/ImageEditor.js +166 -0
  20. package/dist/ImageEditor.js.map +1 -0
  21. package/dist/ImageNodeView.d.ts +13 -1
  22. package/dist/ImageNodeView.d.ts.map +1 -1
  23. package/dist/ImageNodeView.js +172 -19
  24. package/dist/ImageNodeView.js.map +1 -1
  25. package/dist/ImageViewer.d.ts +26 -0
  26. package/dist/ImageViewer.d.ts.map +1 -0
  27. package/dist/ImageViewer.js +119 -0
  28. package/dist/ImageViewer.js.map +1 -0
  29. package/dist/InlineIcon.d.ts +17 -0
  30. package/dist/InlineIcon.d.ts.map +1 -0
  31. package/dist/InlineIcon.js +72 -0
  32. package/dist/InlineIcon.js.map +1 -0
  33. package/dist/InlinePreviewGutter.d.ts +52 -0
  34. package/dist/InlinePreviewGutter.d.ts.map +1 -0
  35. package/dist/InlinePreviewGutter.js +397 -0
  36. package/dist/InlinePreviewGutter.js.map +1 -0
  37. package/dist/LinkDialog.d.ts +43 -0
  38. package/dist/LinkDialog.d.ts.map +1 -0
  39. package/dist/LinkDialog.js +102 -0
  40. package/dist/LinkDialog.js.map +1 -0
  41. package/dist/MentionExtension.js +10 -7
  42. package/dist/MentionExtension.js.map +1 -1
  43. package/dist/OutlinePanel.d.ts +17 -0
  44. package/dist/OutlinePanel.d.ts.map +1 -0
  45. package/dist/OutlinePanel.js +167 -0
  46. package/dist/OutlinePanel.js.map +1 -0
  47. package/dist/PlainHtmlPreview.d.ts +50 -0
  48. package/dist/PlainHtmlPreview.d.ts.map +1 -0
  49. package/dist/PlainHtmlPreview.js +155 -0
  50. package/dist/PlainHtmlPreview.js.map +1 -0
  51. package/dist/PreviewControls.d.ts +15 -1
  52. package/dist/PreviewControls.d.ts.map +1 -1
  53. package/dist/PreviewControls.js +75 -18
  54. package/dist/PreviewControls.js.map +1 -1
  55. package/dist/PreviewPanel.d.ts +11 -10
  56. package/dist/PreviewPanel.d.ts.map +1 -1
  57. package/dist/PreviewPanel.js +20 -17
  58. package/dist/PreviewPanel.js.map +1 -1
  59. package/dist/RawEditor.d.ts.map +1 -1
  60. package/dist/RawEditor.js +198 -4
  61. package/dist/RawEditor.js.map +1 -1
  62. package/dist/RecorderEntry.d.ts +24 -0
  63. package/dist/RecorderEntry.d.ts.map +1 -0
  64. package/dist/RecorderEntry.js +139 -0
  65. package/dist/RecorderEntry.js.map +1 -0
  66. package/dist/TemplateAnnotation.d.ts.map +1 -1
  67. package/dist/TemplateAnnotation.js +32 -6
  68. package/dist/TemplateAnnotation.js.map +1 -1
  69. package/dist/TemplatePicker.d.ts +53 -0
  70. package/dist/TemplatePicker.d.ts.map +1 -0
  71. package/dist/TemplatePicker.js +388 -0
  72. package/dist/TemplatePicker.js.map +1 -0
  73. package/dist/ThemeCustomizerPanel.d.ts +32 -0
  74. package/dist/ThemeCustomizerPanel.d.ts.map +1 -0
  75. package/dist/ThemeCustomizerPanel.js +256 -0
  76. package/dist/ThemeCustomizerPanel.js.map +1 -0
  77. package/dist/ThemePicker.d.ts +33 -0
  78. package/dist/ThemePicker.d.ts.map +1 -0
  79. package/dist/ThemePicker.js +148 -0
  80. package/dist/ThemePicker.js.map +1 -0
  81. package/dist/Toolbar.d.ts.map +1 -1
  82. package/dist/Toolbar.js +508 -33
  83. package/dist/Toolbar.js.map +1 -1
  84. package/dist/VersionHistoryPanel.d.ts +14 -0
  85. package/dist/VersionHistoryPanel.d.ts.map +1 -0
  86. package/dist/VersionHistoryPanel.js +147 -0
  87. package/dist/VersionHistoryPanel.js.map +1 -0
  88. package/dist/ViewMenuPanel.d.ts +13 -0
  89. package/dist/ViewMenuPanel.d.ts.map +1 -0
  90. package/dist/ViewMenuPanel.js +58 -0
  91. package/dist/ViewMenuPanel.js.map +1 -0
  92. package/dist/WysiwygEditor.d.ts.map +1 -1
  93. package/dist/WysiwygEditor.js +198 -9
  94. package/dist/WysiwygEditor.js.map +1 -1
  95. package/dist/__tests__/detectMarkdown.test.js +0 -14
  96. package/dist/__tests__/detectMarkdown.test.js.map +1 -1
  97. package/dist/__tests__/documentSettingsDialog.test.d.ts +2 -0
  98. package/dist/__tests__/documentSettingsDialog.test.d.ts.map +1 -0
  99. package/dist/__tests__/documentSettingsDialog.test.js +132 -0
  100. package/dist/__tests__/documentSettingsDialog.test.js.map +1 -0
  101. package/dist/__tests__/emojiPicker.test.d.ts +2 -0
  102. package/dist/__tests__/emojiPicker.test.d.ts.map +1 -0
  103. package/dist/__tests__/emojiPicker.test.js +111 -0
  104. package/dist/__tests__/emojiPicker.test.js.map +1 -0
  105. package/dist/__tests__/fileKind.test.js +13 -0
  106. package/dist/__tests__/fileKind.test.js.map +1 -1
  107. package/dist/__tests__/imageEditAffordance.test.d.ts +2 -0
  108. package/dist/__tests__/imageEditAffordance.test.d.ts.map +1 -0
  109. package/dist/__tests__/imageEditAffordance.test.js +188 -0
  110. package/dist/__tests__/imageEditAffordance.test.js.map +1 -0
  111. package/dist/__tests__/imageEditorShell.test.d.ts +2 -0
  112. package/dist/__tests__/imageEditorShell.test.d.ts.map +1 -0
  113. package/dist/__tests__/imageEditorShell.test.js +52 -0
  114. package/dist/__tests__/imageEditorShell.test.js.map +1 -0
  115. package/dist/__tests__/imageEditorState.test.d.ts +3 -0
  116. package/dist/__tests__/imageEditorState.test.d.ts.map +1 -0
  117. package/dist/__tests__/imageEditorState.test.js +148 -0
  118. package/dist/__tests__/imageEditorState.test.js.map +1 -0
  119. package/dist/__tests__/inlinePreviewGutter.test.d.ts +2 -0
  120. package/dist/__tests__/inlinePreviewGutter.test.d.ts.map +1 -0
  121. package/dist/__tests__/inlinePreviewGutter.test.js +51 -0
  122. package/dist/__tests__/inlinePreviewGutter.test.js.map +1 -0
  123. package/dist/__tests__/inlinePreviewGutterAllBlocks.test.d.ts +2 -0
  124. package/dist/__tests__/inlinePreviewGutterAllBlocks.test.d.ts.map +1 -0
  125. package/dist/__tests__/inlinePreviewGutterAllBlocks.test.js +63 -0
  126. package/dist/__tests__/inlinePreviewGutterAllBlocks.test.js.map +1 -0
  127. package/dist/__tests__/jsonEditor.test.d.ts +2 -0
  128. package/dist/__tests__/jsonEditor.test.d.ts.map +1 -0
  129. package/dist/__tests__/jsonEditor.test.js +134 -0
  130. package/dist/__tests__/jsonEditor.test.js.map +1 -0
  131. package/dist/__tests__/layersPanel.test.d.ts +2 -0
  132. package/dist/__tests__/layersPanel.test.d.ts.map +1 -0
  133. package/dist/__tests__/layersPanel.test.js +84 -0
  134. package/dist/__tests__/layersPanel.test.js.map +1 -0
  135. package/dist/__tests__/linkDialogDocPicker.test.d.ts +7 -0
  136. package/dist/__tests__/linkDialogDocPicker.test.d.ts.map +1 -0
  137. package/dist/__tests__/linkDialogDocPicker.test.js +75 -0
  138. package/dist/__tests__/linkDialogDocPicker.test.js.map +1 -0
  139. package/dist/__tests__/outlinePanel.test.d.ts +2 -0
  140. package/dist/__tests__/outlinePanel.test.d.ts.map +1 -0
  141. package/dist/__tests__/outlinePanel.test.js +68 -0
  142. package/dist/__tests__/outlinePanel.test.js.map +1 -0
  143. package/dist/__tests__/plainHtmlPreview.test.d.ts +2 -0
  144. package/dist/__tests__/plainHtmlPreview.test.d.ts.map +1 -0
  145. package/dist/__tests__/plainHtmlPreview.test.js +87 -0
  146. package/dist/__tests__/plainHtmlPreview.test.js.map +1 -0
  147. package/dist/__tests__/propertiesPanel.test.d.ts +2 -0
  148. package/dist/__tests__/propertiesPanel.test.d.ts.map +1 -0
  149. package/dist/__tests__/propertiesPanel.test.js +64 -0
  150. package/dist/__tests__/propertiesPanel.test.js.map +1 -0
  151. package/dist/__tests__/recorderFormats.test.d.ts +2 -0
  152. package/dist/__tests__/recorderFormats.test.d.ts.map +1 -0
  153. package/dist/__tests__/recorderFormats.test.js +121 -0
  154. package/dist/__tests__/recorderFormats.test.js.map +1 -0
  155. package/dist/__tests__/recorderTimingJson.test.d.ts +2 -0
  156. package/dist/__tests__/recorderTimingJson.test.d.ts.map +1 -0
  157. package/dist/__tests__/recorderTimingJson.test.js +37 -0
  158. package/dist/__tests__/recorderTimingJson.test.js.map +1 -0
  159. package/dist/__tests__/templateAnnotationRoundTrip.test.d.ts +2 -0
  160. package/dist/__tests__/templateAnnotationRoundTrip.test.d.ts.map +1 -0
  161. package/dist/__tests__/templateAnnotationRoundTrip.test.js +31 -0
  162. package/dist/__tests__/templateAnnotationRoundTrip.test.js.map +1 -0
  163. package/dist/__tests__/tiptapBridge.test.js +13 -0
  164. package/dist/__tests__/tiptapBridge.test.js.map +1 -1
  165. package/dist/__tests__/useImageEditor.test.d.ts +2 -0
  166. package/dist/__tests__/useImageEditor.test.d.ts.map +1 -0
  167. package/dist/__tests__/useImageEditor.test.js +131 -0
  168. package/dist/__tests__/useImageEditor.test.js.map +1 -0
  169. package/dist/__tests__/useMediaRecorder.test.d.ts +2 -0
  170. package/dist/__tests__/useMediaRecorder.test.d.ts.map +1 -0
  171. package/dist/__tests__/useMediaRecorder.test.js +153 -0
  172. package/dist/__tests__/useMediaRecorder.test.js.map +1 -0
  173. package/dist/__tests__/versionHistory.test.d.ts +2 -0
  174. package/dist/__tests__/versionHistory.test.d.ts.map +1 -0
  175. package/dist/__tests__/versionHistory.test.js +124 -0
  176. package/dist/__tests__/versionHistory.test.js.map +1 -0
  177. package/dist/blockSlice.d.ts +24 -0
  178. package/dist/blockSlice.d.ts.map +1 -0
  179. package/dist/blockSlice.js +63 -0
  180. package/dist/blockSlice.js.map +1 -0
  181. package/dist/buildPreviewDoc.d.ts.map +1 -1
  182. package/dist/buildPreviewDoc.js +52 -2
  183. package/dist/buildPreviewDoc.js.map +1 -1
  184. package/dist/emojiData.d.ts +81 -0
  185. package/dist/emojiData.d.ts.map +1 -0
  186. package/dist/emojiData.js +1283 -0
  187. package/dist/emojiData.js.map +1 -0
  188. package/dist/fileKind.d.ts +6 -2
  189. package/dist/fileKind.d.ts.map +1 -1
  190. package/dist/fileKind.js +25 -4
  191. package/dist/fileKind.js.map +1 -1
  192. package/dist/hooks/useFileDrop.d.ts.map +1 -1
  193. package/dist/hooks/useFileDrop.js +40 -4
  194. package/dist/hooks/useFileDrop.js.map +1 -1
  195. package/dist/imageEditor/CanvasSurface.d.ts +31 -0
  196. package/dist/imageEditor/CanvasSurface.d.ts.map +1 -0
  197. package/dist/imageEditor/CanvasSurface.js +264 -0
  198. package/dist/imageEditor/CanvasSurface.js.map +1 -0
  199. package/dist/imageEditor/ImageVersionHistoryDropdown.d.ts +39 -0
  200. package/dist/imageEditor/ImageVersionHistoryDropdown.d.ts.map +1 -0
  201. package/dist/imageEditor/ImageVersionHistoryDropdown.js +283 -0
  202. package/dist/imageEditor/ImageVersionHistoryDropdown.js.map +1 -0
  203. package/dist/imageEditor/LayersPanel.d.ts +14 -0
  204. package/dist/imageEditor/LayersPanel.d.ts.map +1 -0
  205. package/dist/imageEditor/LayersPanel.js +43 -0
  206. package/dist/imageEditor/LayersPanel.js.map +1 -0
  207. package/dist/imageEditor/PropertiesPanel.d.ts +14 -0
  208. package/dist/imageEditor/PropertiesPanel.d.ts.map +1 -0
  209. package/dist/imageEditor/PropertiesPanel.js +97 -0
  210. package/dist/imageEditor/PropertiesPanel.js.map +1 -0
  211. package/dist/imageEditor/Toolbar.d.ts +30 -0
  212. package/dist/imageEditor/Toolbar.d.ts.map +1 -0
  213. package/dist/imageEditor/Toolbar.js +108 -0
  214. package/dist/imageEditor/Toolbar.js.map +1 -0
  215. package/dist/imageEditor/icons.d.ts +24 -0
  216. package/dist/imageEditor/icons.d.ts.map +1 -0
  217. package/dist/imageEditor/icons.js +45 -0
  218. package/dist/imageEditor/icons.js.map +1 -0
  219. package/dist/imageEditor/layers/EditorImageLayer.d.ts +16 -0
  220. package/dist/imageEditor/layers/EditorImageLayer.d.ts.map +1 -0
  221. package/dist/imageEditor/layers/EditorImageLayer.js +37 -0
  222. package/dist/imageEditor/layers/EditorImageLayer.js.map +1 -0
  223. package/dist/imageEditor/layers/EditorShapeLayer.d.ts +15 -0
  224. package/dist/imageEditor/layers/EditorShapeLayer.d.ts.map +1 -0
  225. package/dist/imageEditor/layers/EditorShapeLayer.js +20 -0
  226. package/dist/imageEditor/layers/EditorShapeLayer.js.map +1 -0
  227. package/dist/imageEditor/layers/EditorTextLayer.d.ts +18 -0
  228. package/dist/imageEditor/layers/EditorTextLayer.d.ts.map +1 -0
  229. package/dist/imageEditor/layers/EditorTextLayer.js +13 -0
  230. package/dist/imageEditor/layers/EditorTextLayer.js.map +1 -0
  231. package/dist/imageEditor/layers/SelectionHandles.d.ts +17 -0
  232. package/dist/imageEditor/layers/SelectionHandles.d.ts.map +1 -0
  233. package/dist/imageEditor/layers/SelectionHandles.js +19 -0
  234. package/dist/imageEditor/layers/SelectionHandles.js.map +1 -0
  235. package/dist/imageEditor/state.d.ts +76 -0
  236. package/dist/imageEditor/state.d.ts.map +1 -0
  237. package/dist/imageEditor/state.js +87 -0
  238. package/dist/imageEditor/state.js.map +1 -0
  239. package/dist/imageEditor/useImageEditor.d.ts +53 -0
  240. package/dist/imageEditor/useImageEditor.d.ts.map +1 -0
  241. package/dist/imageEditor/useImageEditor.js +244 -0
  242. package/dist/imageEditor/useImageEditor.js.map +1 -0
  243. package/dist/imageEditor/useImageEditorTokens.d.ts +16 -0
  244. package/dist/imageEditor/useImageEditorTokens.d.ts.map +1 -0
  245. package/dist/imageEditor/useImageEditorTokens.js +45 -0
  246. package/dist/imageEditor/useImageEditorTokens.js.map +1 -0
  247. package/dist/index.d.ts +48 -1
  248. package/dist/index.d.ts.map +1 -1
  249. package/dist/index.js +36 -0
  250. package/dist/index.js.map +1 -1
  251. package/dist/jsonEditor/EmbeddedRichTextField.d.ts +15 -0
  252. package/dist/jsonEditor/EmbeddedRichTextField.d.ts.map +1 -0
  253. package/dist/jsonEditor/EmbeddedRichTextField.js +74 -0
  254. package/dist/jsonEditor/EmbeddedRichTextField.js.map +1 -0
  255. package/dist/jsonEditor/JsonEditor.d.ts +36 -0
  256. package/dist/jsonEditor/JsonEditor.d.ts.map +1 -0
  257. package/dist/jsonEditor/JsonEditor.js +15 -0
  258. package/dist/jsonEditor/JsonEditor.js.map +1 -0
  259. package/dist/jsonEditor/JsonEditorContext.d.ts +28 -0
  260. package/dist/jsonEditor/JsonEditorContext.d.ts.map +1 -0
  261. package/dist/jsonEditor/JsonEditorContext.js +41 -0
  262. package/dist/jsonEditor/JsonEditorContext.js.map +1 -0
  263. package/dist/jsonEditor/RenderNode.d.ts +16 -0
  264. package/dist/jsonEditor/RenderNode.d.ts.map +1 -0
  265. package/dist/jsonEditor/RenderNode.js +32 -0
  266. package/dist/jsonEditor/RenderNode.js.map +1 -0
  267. package/dist/jsonEditor/editors.d.ts +36 -0
  268. package/dist/jsonEditor/editors.d.ts.map +1 -0
  269. package/dist/jsonEditor/editors.js +347 -0
  270. package/dist/jsonEditor/editors.js.map +1 -0
  271. package/dist/jsonEditor/index.d.ts +3 -0
  272. package/dist/jsonEditor/index.d.ts.map +1 -0
  273. package/dist/jsonEditor/index.js +2 -0
  274. package/dist/jsonEditor/index.js.map +1 -0
  275. package/dist/jsonEditor/useJsonEditorTokens.d.ts +13 -0
  276. package/dist/jsonEditor/useJsonEditorTokens.d.ts.map +1 -0
  277. package/dist/jsonEditor/useJsonEditorTokens.js +38 -0
  278. package/dist/jsonEditor/useJsonEditorTokens.js.map +1 -0
  279. package/dist/recorder/RecorderButton.d.ts +31 -0
  280. package/dist/recorder/RecorderButton.d.ts.map +1 -0
  281. package/dist/recorder/RecorderButton.js +24 -0
  282. package/dist/recorder/RecorderButton.js.map +1 -0
  283. package/dist/recorder/RecorderModal.d.ts +59 -0
  284. package/dist/recorder/RecorderModal.d.ts.map +1 -0
  285. package/dist/recorder/RecorderModal.js +333 -0
  286. package/dist/recorder/RecorderModal.js.map +1 -0
  287. package/dist/recorder/RecorderPanel.d.ts +25 -0
  288. package/dist/recorder/RecorderPanel.d.ts.map +1 -0
  289. package/dist/recorder/RecorderPanel.js +30 -0
  290. package/dist/recorder/RecorderPanel.js.map +1 -0
  291. package/dist/recorder/formats.d.ts +51 -0
  292. package/dist/recorder/formats.d.ts.map +1 -0
  293. package/dist/recorder/formats.js +144 -0
  294. package/dist/recorder/formats.js.map +1 -0
  295. package/dist/recorder/hooks/useMediaRecorder.d.ts +90 -0
  296. package/dist/recorder/hooks/useMediaRecorder.d.ts.map +1 -0
  297. package/dist/recorder/hooks/useMediaRecorder.js +277 -0
  298. package/dist/recorder/hooks/useMediaRecorder.js.map +1 -0
  299. package/dist/recorder/hooks/useStreamPreview.d.ts +22 -0
  300. package/dist/recorder/hooks/useStreamPreview.d.ts.map +1 -0
  301. package/dist/recorder/hooks/useStreamPreview.js +44 -0
  302. package/dist/recorder/hooks/useStreamPreview.js.map +1 -0
  303. package/dist/recorder/sources/cameraStream.d.ts +22 -0
  304. package/dist/recorder/sources/cameraStream.d.ts.map +1 -0
  305. package/dist/recorder/sources/cameraStream.js +24 -0
  306. package/dist/recorder/sources/cameraStream.js.map +1 -0
  307. package/dist/recorder/sources/micStream.d.ts +15 -0
  308. package/dist/recorder/sources/micStream.d.ts.map +1 -0
  309. package/dist/recorder/sources/micStream.js +24 -0
  310. package/dist/recorder/sources/micStream.js.map +1 -0
  311. package/dist/recorder/sources/screenStream.d.ts +53 -0
  312. package/dist/recorder/sources/screenStream.d.ts.map +1 -0
  313. package/dist/recorder/sources/screenStream.js +114 -0
  314. package/dist/recorder/sources/screenStream.js.map +1 -0
  315. package/dist/recorder/timingJson.d.ts +51 -0
  316. package/dist/recorder/timingJson.d.ts.map +1 -0
  317. package/dist/recorder/timingJson.js +42 -0
  318. package/dist/recorder/timingJson.js.map +1 -0
  319. package/dist/tiptap/TiptapAudio.d.ts +26 -0
  320. package/dist/tiptap/TiptapAudio.d.ts.map +1 -0
  321. package/dist/tiptap/TiptapAudio.js +58 -0
  322. package/dist/tiptap/TiptapAudio.js.map +1 -0
  323. package/dist/tiptap/TiptapVideo.d.ts +30 -0
  324. package/dist/tiptap/TiptapVideo.d.ts.map +1 -0
  325. package/dist/tiptap/TiptapVideo.js +66 -0
  326. package/dist/tiptap/TiptapVideo.js.map +1 -0
  327. package/dist/tiptap/useResolvedMediaSrc.d.ts +2 -0
  328. package/dist/tiptap/useResolvedMediaSrc.d.ts.map +1 -0
  329. package/dist/tiptap/useResolvedMediaSrc.js +42 -0
  330. package/dist/tiptap/useResolvedMediaSrc.js.map +1 -0
  331. package/dist/tiptapBridge.d.ts.map +1 -1
  332. package/dist/tiptapBridge.js +171 -14
  333. package/dist/tiptapBridge.js.map +1 -1
  334. package/dist/useHeadingLayout.d.ts +54 -0
  335. package/dist/useHeadingLayout.d.ts.map +1 -0
  336. package/dist/useHeadingLayout.js +260 -0
  337. package/dist/useHeadingLayout.js.map +1 -0
  338. package/dist/utils/collectInlineFontAwesomeCss.d.ts +21 -0
  339. package/dist/utils/collectInlineFontAwesomeCss.d.ts.map +1 -0
  340. package/dist/utils/collectInlineFontAwesomeCss.js +68 -0
  341. package/dist/utils/collectInlineFontAwesomeCss.js.map +1 -0
  342. package/dist/utils/dropUtils.d.ts +21 -2
  343. package/dist/utils/dropUtils.d.ts.map +1 -1
  344. package/dist/utils/dropUtils.js +43 -4
  345. package/dist/utils/dropUtils.js.map +1 -1
  346. package/dist/utils/normalizeMalformedAssetUrl.d.ts +15 -0
  347. package/dist/utils/normalizeMalformedAssetUrl.d.ts.map +1 -0
  348. package/dist/utils/normalizeMalformedAssetUrl.js +27 -0
  349. package/dist/utils/normalizeMalformedAssetUrl.js.map +1 -0
  350. package/package.json +8 -5
  351. package/src/DocumentSettingsDialog.tsx +266 -0
  352. package/src/EditorContext.tsx +534 -10
  353. package/src/EditorShell.tsx +571 -55
  354. package/src/EmojiPicker.tsx +332 -0
  355. package/src/ImageEditor.tsx +327 -0
  356. package/src/ImageNodeView.tsx +222 -21
  357. package/src/ImageViewer.tsx +221 -0
  358. package/src/InlineIcon.ts +84 -0
  359. package/src/InlinePreviewGutter.tsx +582 -0
  360. package/src/LinkDialog.tsx +276 -0
  361. package/src/MentionExtension.tsx +10 -7
  362. package/src/OutlinePanel.tsx +295 -0
  363. package/src/PlainHtmlPreview.tsx +211 -0
  364. package/src/PreviewControls.tsx +130 -24
  365. package/src/PreviewPanel.tsx +38 -21
  366. package/src/RawEditor.tsx +215 -4
  367. package/src/RecorderEntry.tsx +164 -0
  368. package/src/TemplateAnnotation.ts +32 -6
  369. package/src/TemplatePicker.tsx +818 -0
  370. package/src/ThemeCustomizerPanel.tsx +595 -0
  371. package/src/ThemePicker.tsx +319 -0
  372. package/src/Toolbar.tsx +708 -111
  373. package/src/VersionHistoryPanel.tsx +329 -0
  374. package/src/ViewMenuPanel.tsx +188 -0
  375. package/src/WysiwygEditor.tsx +229 -9
  376. package/src/__tests__/detectMarkdown.test.ts +0 -15
  377. package/src/__tests__/documentSettingsDialog.test.tsx +147 -0
  378. package/src/__tests__/emojiPicker.test.tsx +133 -0
  379. package/src/__tests__/fileKind.test.ts +16 -0
  380. package/src/__tests__/imageEditAffordance.test.tsx +268 -0
  381. package/src/__tests__/imageEditorShell.test.tsx +57 -0
  382. package/src/__tests__/imageEditorState.test.ts +171 -0
  383. package/src/__tests__/inlinePreviewGutter.test.tsx +62 -0
  384. package/src/__tests__/inlinePreviewGutterAllBlocks.test.tsx +103 -0
  385. package/src/__tests__/jsonEditor.test.tsx +168 -0
  386. package/src/__tests__/layersPanel.test.tsx +97 -0
  387. package/src/__tests__/linkDialogDocPicker.test.tsx +137 -0
  388. package/src/__tests__/outlinePanel.test.tsx +79 -0
  389. package/src/__tests__/plainHtmlPreview.test.tsx +107 -0
  390. package/src/__tests__/propertiesPanel.test.tsx +69 -0
  391. package/src/__tests__/recorderFormats.test.ts +146 -0
  392. package/src/__tests__/recorderTimingJson.test.ts +41 -0
  393. package/src/__tests__/templateAnnotationRoundTrip.test.ts +34 -0
  394. package/src/__tests__/tiptapBridge.test.ts +15 -0
  395. package/src/__tests__/useImageEditor.test.tsx +159 -0
  396. package/src/__tests__/useMediaRecorder.test.ts +186 -0
  397. package/src/__tests__/versionHistory.test.tsx +197 -0
  398. package/src/blockSlice.ts +75 -0
  399. package/src/buildPreviewDoc.ts +61 -6
  400. package/src/emojiData.ts +1337 -0
  401. package/src/fileKind.ts +30 -6
  402. package/src/hooks/useFileDrop.ts +40 -4
  403. package/src/imageEditor/CanvasSurface.tsx +402 -0
  404. package/src/imageEditor/ImageVersionHistoryDropdown.tsx +396 -0
  405. package/src/imageEditor/LayersPanel.tsx +143 -0
  406. package/src/imageEditor/PropertiesPanel.tsx +428 -0
  407. package/src/imageEditor/Toolbar.tsx +242 -0
  408. package/src/imageEditor/icons.tsx +144 -0
  409. package/src/imageEditor/image-editor.css +450 -0
  410. package/src/imageEditor/layers/EditorImageLayer.tsx +45 -0
  411. package/src/imageEditor/layers/EditorShapeLayer.tsx +62 -0
  412. package/src/imageEditor/layers/EditorTextLayer.tsx +45 -0
  413. package/src/imageEditor/layers/SelectionHandles.tsx +86 -0
  414. package/src/imageEditor/state.ts +153 -0
  415. package/src/imageEditor/useImageEditor.ts +328 -0
  416. package/src/imageEditor/useImageEditorTokens.ts +70 -0
  417. package/src/index.ts +82 -0
  418. package/src/jsonEditor/EmbeddedRichTextField.tsx +81 -0
  419. package/src/jsonEditor/JsonEditor.tsx +81 -0
  420. package/src/jsonEditor/JsonEditorContext.tsx +75 -0
  421. package/src/jsonEditor/RenderNode.tsx +66 -0
  422. package/src/jsonEditor/editors.tsx +678 -0
  423. package/src/jsonEditor/index.ts +2 -0
  424. package/src/jsonEditor/json-editor.css +463 -0
  425. package/src/jsonEditor/useJsonEditorTokens.ts +63 -0
  426. package/src/recorder/RecorderButton.tsx +72 -0
  427. package/src/recorder/RecorderModal.tsx +596 -0
  428. package/src/recorder/RecorderPanel.tsx +93 -0
  429. package/src/recorder/formats.ts +159 -0
  430. package/src/recorder/hooks/useMediaRecorder.ts +378 -0
  431. package/src/recorder/hooks/useStreamPreview.ts +47 -0
  432. package/src/recorder/sources/cameraStream.ts +32 -0
  433. package/src/recorder/sources/micStream.ts +25 -0
  434. package/src/recorder/sources/screenStream.ts +162 -0
  435. package/src/recorder/timingJson.ts +66 -0
  436. package/src/styles/editor.css +2490 -51
  437. package/src/styles/image-edit-affordance.css +201 -0
  438. package/src/styles/index.css +10 -0
  439. package/src/tiptap/TiptapAudio.tsx +86 -0
  440. package/src/tiptap/TiptapVideo.tsx +119 -0
  441. package/src/tiptap/useResolvedMediaSrc.ts +47 -0
  442. package/src/tiptapBridge.ts +188 -20
  443. package/src/useHeadingLayout.ts +294 -0
  444. package/src/utils/collectInlineFontAwesomeCss.ts +69 -0
  445. package/src/utils/dropUtils.ts +54 -6
  446. package/src/utils/normalizeMalformedAssetUrl.ts +22 -0
@@ -0,0 +1,260 @@
1
+ /**
2
+ * useHeadingLayout
3
+ *
4
+ * Shared positioning hook for the editor gutters (`OutlinePanel` and
5
+ * `InlinePreviewGutter`). Each gutter needs to know:
6
+ * - where every heading sits vertically inside the wrapper
7
+ * - where the editor "page" edges sit horizontally
8
+ * - how to scroll the editor to a particular heading
9
+ *
10
+ * Two backends, picked from `EditorContext.activeView`:
11
+ * - **wysiwyg** — query DOM headings inside `.squisq-wysiwyg-container`,
12
+ * measure with `getBoundingClientRect`, scroll via `scrollIntoView`.
13
+ * Live updates via `ResizeObserver` + `MutationObserver`.
14
+ * - **raw** — walk `doc.blocks`, derive each heading's line number from
15
+ * `MarkdownHeading.position.start.line`, ask Monaco for the line's
16
+ * pixel offset via `getTopForLineNumber`, scroll via
17
+ * `revealLineInCenterIfOutsideViewport` + `setPosition`. Live updates
18
+ * via `onDidScrollChange` + `onDidChangeModelContent`.
19
+ *
20
+ * Both backends produce coordinates in the *wrapper's* reference frame
21
+ * (i.e., `.squisq-editor-with-gutter`), so the rendering layers — cards,
22
+ * extent bars, outline rows — don't care which editor is active.
23
+ */
24
+ import { useCallback, useEffect, useMemo, useState } from 'react';
25
+ import { flattenBlocks, hasTemplate } from '@bendyline/squisq/doc';
26
+ import { useEditorContext } from './EditorContext';
27
+ /**
28
+ * @param refInsideWrapper — any DOM ref under `.squisq-editor-with-gutter`.
29
+ * The hook walks up to find the wrapper.
30
+ */
31
+ export function useHeadingLayout(refInsideWrapper) {
32
+ const { doc, activeView, monacoEditor, tiptapEditor } = useEditorContext();
33
+ const flatBlocks = useMemo(() => (doc ? flattenBlocks(doc.blocks) : []), [doc]);
34
+ const [entries, setEntries] = useState([]);
35
+ const [pageEdges, setPageEdges] = useState(null);
36
+ // ── WYSIWYG backend ────────────────────────────────────────────────
37
+ useEffect(() => {
38
+ if (activeView !== 'wysiwyg')
39
+ return;
40
+ const node = refInsideWrapper.current;
41
+ if (!node)
42
+ return;
43
+ const wrapper = findWrapper(node);
44
+ if (!wrapper)
45
+ return;
46
+ const wysiwygContainer = wrapper.querySelector('.squisq-wysiwyg-container');
47
+ if (!wysiwygContainer)
48
+ return;
49
+ let raf = 0;
50
+ const recompute = () => {
51
+ cancelAnimationFrame(raf);
52
+ raf = requestAnimationFrame(() => {
53
+ const headings = Array.from(wysiwygContainer.querySelectorAll('h1, h2, h3, h4, h5, h6'));
54
+ const wrapperRect = wrapper.getBoundingClientRect();
55
+ const editorRect = wysiwygContainer.getBoundingClientRect();
56
+ const next = [];
57
+ flatBlocks.forEach((block, i) => {
58
+ const h = headings[i];
59
+ if (!h)
60
+ return;
61
+ const top = h.getBoundingClientRect().top - wrapperRect.top;
62
+ const nextH = headings[i + 1];
63
+ const bottom = nextH
64
+ ? nextH.getBoundingClientRect().top - wrapperRect.top
65
+ : editorRect.bottom - wrapperRect.top;
66
+ next.push({
67
+ block,
68
+ top,
69
+ bottom,
70
+ annotated: !!h.getAttribute('data-template'),
71
+ });
72
+ });
73
+ setEntries((prev) => (sameEntries(prev, next) ? prev : next));
74
+ // Page edges — anchor to the .squisq-wysiwyg-editor (the centered "page").
75
+ const page = wysiwygContainer.querySelector('.squisq-wysiwyg-editor');
76
+ if (page) {
77
+ const pageRect = page.getBoundingClientRect();
78
+ const left = pageRect.left - wrapperRect.left;
79
+ const right = pageRect.right - wrapperRect.left;
80
+ setPageEdges((prev) => prev != null && Math.abs(prev.left - left) < 0.5 && Math.abs(prev.right - right) < 0.5
81
+ ? prev
82
+ : { left, right });
83
+ }
84
+ });
85
+ };
86
+ recompute();
87
+ const ro = new ResizeObserver(recompute);
88
+ ro.observe(wysiwygContainer);
89
+ const editorSurface = wysiwygContainer.querySelector('.squisq-wysiwyg-editor');
90
+ if (editorSurface)
91
+ ro.observe(editorSurface);
92
+ const mo = new MutationObserver(recompute);
93
+ mo.observe(wysiwygContainer, {
94
+ childList: true,
95
+ subtree: true,
96
+ characterData: true,
97
+ attributes: true,
98
+ attributeFilter: ['data-template', 'data-template-params'],
99
+ });
100
+ wysiwygContainer.addEventListener('scroll', recompute, { passive: true });
101
+ window.addEventListener('resize', recompute);
102
+ const settle = window.setTimeout(recompute, 250);
103
+ return () => {
104
+ cancelAnimationFrame(raf);
105
+ window.clearTimeout(settle);
106
+ ro.disconnect();
107
+ mo.disconnect();
108
+ wysiwygContainer.removeEventListener('scroll', recompute);
109
+ window.removeEventListener('resize', recompute);
110
+ };
111
+ }, [activeView, flatBlocks, refInsideWrapper]);
112
+ // ── Raw (Monaco) backend ───────────────────────────────────────────
113
+ useEffect(() => {
114
+ if (activeView !== 'raw')
115
+ return;
116
+ if (!monacoEditor)
117
+ return;
118
+ const node = refInsideWrapper.current;
119
+ if (!node)
120
+ return;
121
+ const wrapper = findWrapper(node);
122
+ if (!wrapper)
123
+ return;
124
+ let raf = 0;
125
+ const recompute = () => {
126
+ cancelAnimationFrame(raf);
127
+ raf = requestAnimationFrame(() => {
128
+ const wrapperRect = wrapper.getBoundingClientRect();
129
+ const monacoRoot = monacoEditor.getDomNode();
130
+ if (!monacoRoot)
131
+ return;
132
+ const monacoRect = monacoRoot.getBoundingClientRect();
133
+ // Y of the editor's content top in wrapper coordinates.
134
+ const monacoTop = monacoRect.top - wrapperRect.top;
135
+ const scrollTop = monacoEditor.getScrollTop();
136
+ const layoutInfo = monacoEditor.getLayoutInfo();
137
+ const next = [];
138
+ flatBlocks.forEach((block, i) => {
139
+ const line = block.sourceHeading?.position?.start.line;
140
+ if (typeof line !== 'number')
141
+ return;
142
+ const lineTop = monacoEditor.getTopForLineNumber(line) - scrollTop + monacoTop;
143
+ // Bottom = next block's top, or the visible bottom of the editor.
144
+ const nextBlock = flatBlocks[i + 1];
145
+ const nextLine = nextBlock?.sourceHeading?.position?.start.line;
146
+ const bottom = typeof nextLine === 'number'
147
+ ? monacoEditor.getTopForLineNumber(nextLine) - scrollTop + monacoTop
148
+ : monacoTop + layoutInfo.height;
149
+ const tplName = block.sourceHeading?.templateAnnotation?.template;
150
+ next.push({
151
+ block,
152
+ top: lineTop,
153
+ bottom,
154
+ annotated: !!tplName && hasTemplate(tplName),
155
+ });
156
+ });
157
+ setEntries((prev) => (sameEntries(prev, next) ? prev : next));
158
+ // Page edges — Monaco's editor area extends to its container's
159
+ // box edges; treat the whole editor as the "page".
160
+ const left = monacoRect.left - wrapperRect.left;
161
+ const right = monacoRect.right - wrapperRect.left;
162
+ setPageEdges((prev) => prev != null && Math.abs(prev.left - left) < 0.5 && Math.abs(prev.right - right) < 0.5
163
+ ? prev
164
+ : { left, right });
165
+ });
166
+ };
167
+ recompute();
168
+ const scrollSub = monacoEditor.onDidScrollChange(recompute);
169
+ const contentSub = monacoEditor.onDidChangeModelContent(recompute);
170
+ const layoutSub = monacoEditor.onDidLayoutChange(recompute);
171
+ const ro = new ResizeObserver(recompute);
172
+ const monacoRoot = monacoEditor.getDomNode();
173
+ if (monacoRoot)
174
+ ro.observe(monacoRoot);
175
+ window.addEventListener('resize', recompute);
176
+ const settle = window.setTimeout(recompute, 250);
177
+ return () => {
178
+ cancelAnimationFrame(raf);
179
+ window.clearTimeout(settle);
180
+ scrollSub.dispose();
181
+ contentSub.dispose();
182
+ layoutSub.dispose();
183
+ ro.disconnect();
184
+ window.removeEventListener('resize', recompute);
185
+ };
186
+ }, [activeView, monacoEditor, flatBlocks, refInsideWrapper]);
187
+ // Reset edges when the active view changes — the previous view's
188
+ // measurements don't carry over to the next.
189
+ useEffect(() => {
190
+ setEntries([]);
191
+ setPageEdges(null);
192
+ }, [activeView]);
193
+ // ── scrollToBlock ──────────────────────────────────────────────────
194
+ const scrollToBlock = useCallback((block) => {
195
+ if (activeView === 'wysiwyg') {
196
+ const node = refInsideWrapper.current;
197
+ const wrapper = node ? findWrapper(node) : null;
198
+ const wysiwygContainer = wrapper?.querySelector('.squisq-wysiwyg-container');
199
+ if (!wysiwygContainer)
200
+ return;
201
+ const headings = wysiwygContainer.querySelectorAll('h1, h2, h3, h4, h5, h6');
202
+ const index = flatBlocks.findIndex((b) => b.id === block.id);
203
+ if (index < 0 || index >= headings.length)
204
+ return;
205
+ headings[index].scrollIntoView({ behavior: 'smooth', block: 'start' });
206
+ if (tiptapEditor) {
207
+ try {
208
+ tiptapEditor.chain().focus().run();
209
+ }
210
+ catch {
211
+ // ignore
212
+ }
213
+ }
214
+ return;
215
+ }
216
+ if (activeView === 'raw' && monacoEditor) {
217
+ const line = block.sourceHeading?.position?.start.line;
218
+ if (typeof line !== 'number')
219
+ return;
220
+ monacoEditor.revealLineInCenter(line);
221
+ monacoEditor.setPosition({ lineNumber: line, column: 1 });
222
+ monacoEditor.focus();
223
+ }
224
+ }, [activeView, flatBlocks, monacoEditor, refInsideWrapper, tiptapEditor]);
225
+ return {
226
+ entries,
227
+ pageEdges,
228
+ scrollToBlock,
229
+ ready: entries.length > 0 || pageEdges != null,
230
+ };
231
+ }
232
+ // ── Helpers ────────────────────────────────────────────────────────
233
+ function findWrapper(node) {
234
+ let cur = node.parentElement;
235
+ while (cur) {
236
+ if (cur.classList.contains('squisq-editor-with-gutter'))
237
+ return cur;
238
+ cur = cur.parentElement;
239
+ }
240
+ // Fallback: immediate parent (during transitional renames).
241
+ return node.parentElement;
242
+ }
243
+ function sameEntries(a, b) {
244
+ if (a.length !== b.length)
245
+ return false;
246
+ for (let i = 0; i < a.length; i++) {
247
+ const x = a[i];
248
+ const y = b[i];
249
+ if (x.block.id !== y.block.id)
250
+ return false;
251
+ if (x.annotated !== y.annotated)
252
+ return false;
253
+ if (Math.abs(x.top - y.top) > 0.5)
254
+ return false;
255
+ if (Math.abs(x.bottom - y.bottom) > 0.5)
256
+ return false;
257
+ }
258
+ return true;
259
+ }
260
+ //# sourceMappingURL=useHeadingLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHeadingLayout.js","sourceRoot":"","sources":["../src/useHeadingLayout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Collect FontAwesome `@font-face` + utility CSS rules from the host
3
+ * document's loaded stylesheets so we can inline them into a sandboxed
4
+ * iframe preview.
5
+ *
6
+ * Why: an iframe rendered via `srcDoc` cannot reliably load
7
+ * FontAwesome from a cross-origin CDN. Tracking prevention, stricter
8
+ * origin policies, and the iframe's about:srcdoc origin all conspire
9
+ * to silently drop font fetches. The icons end up invisible even
10
+ * though the `<i class="fa-…">` tags are present in the markup. The
11
+ * host page (editor-react ships a bundled `@import` of
12
+ * `@fortawesome/fontawesome-free`) already has the font loaded and its
13
+ * woff2 URLs resolve to same-origin assets, so we extract those rules
14
+ * once and pass them into the renderer as inline CSS.
15
+ *
16
+ * Returns `undefined` when no FA rules are found — typical for SSR or
17
+ * for hosts that don't bundle FA — in which case the renderer falls
18
+ * back to its cdnjs `<link>` (still works in plain standalone HTML).
19
+ */
20
+ export declare function collectInlineFontAwesomeCss(): string | undefined;
21
+ //# sourceMappingURL=collectInlineFontAwesomeCss.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectInlineFontAwesomeCss.d.ts","sourceRoot":"","sources":["../../src/utils/collectInlineFontAwesomeCss.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,2BAA2B,IAAI,MAAM,GAAG,SAAS,CAyBhE"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Collect FontAwesome `@font-face` + utility CSS rules from the host
3
+ * document's loaded stylesheets so we can inline them into a sandboxed
4
+ * iframe preview.
5
+ *
6
+ * Why: an iframe rendered via `srcDoc` cannot reliably load
7
+ * FontAwesome from a cross-origin CDN. Tracking prevention, stricter
8
+ * origin policies, and the iframe's about:srcdoc origin all conspire
9
+ * to silently drop font fetches. The icons end up invisible even
10
+ * though the `<i class="fa-…">` tags are present in the markup. The
11
+ * host page (editor-react ships a bundled `@import` of
12
+ * `@fortawesome/fontawesome-free`) already has the font loaded and its
13
+ * woff2 URLs resolve to same-origin assets, so we extract those rules
14
+ * once and pass them into the renderer as inline CSS.
15
+ *
16
+ * Returns `undefined` when no FA rules are found — typical for SSR or
17
+ * for hosts that don't bundle FA — in which case the renderer falls
18
+ * back to its cdnjs `<link>` (still works in plain standalone HTML).
19
+ */
20
+ export function collectInlineFontAwesomeCss() {
21
+ if (typeof document === 'undefined')
22
+ return undefined;
23
+ const collected = [];
24
+ for (const sheet of Array.from(document.styleSheets)) {
25
+ let rules = null;
26
+ try {
27
+ rules = sheet.cssRules;
28
+ }
29
+ catch {
30
+ // Cross-origin stylesheets throw on `.cssRules` access. We can't
31
+ // read them, but they're also not where editor-react's bundled
32
+ // FA lives, so it's safe to skip them.
33
+ continue;
34
+ }
35
+ if (!rules)
36
+ continue;
37
+ for (const rule of Array.from(rules)) {
38
+ if (isFontAwesomeRule(rule)) {
39
+ collected.push(rule.cssText);
40
+ }
41
+ }
42
+ }
43
+ return collected.length > 0 ? collected.join('\n') : undefined;
44
+ }
45
+ /**
46
+ * Match `@font-face` declarations whose family starts with
47
+ * "Font Awesome", plus the FA utility classes (the `.fa-*` rules that
48
+ * set `content: "\fXXX"` and font-family). The former gets the woff2
49
+ * loaded into the iframe, the latter wires the `<i>` markup to it.
50
+ */
51
+ function isFontAwesomeRule(rule) {
52
+ const text = rule.cssText;
53
+ // `@font-face { font-family: "Font Awesome 6 Brands"; … }`
54
+ if (rule.type === CSSRule.FONT_FACE_RULE) {
55
+ return /font-family:\s*['"]?Font Awesome/i.test(text);
56
+ }
57
+ // `.fa-github::before { content: "\f09b"; }` and the base
58
+ // `.fa-brands { font-family: "Font Awesome 6 Brands"; … }` rules.
59
+ // FA's stylesheet prefixes selectors with `.fa`, `.fas`, `.far`,
60
+ // `.fab`, `.fa-solid`, `.fa-regular`, `.fa-brands`. Match the
61
+ // family name in the declaration block to avoid false positives
62
+ // (e.g. someone else's `.fa-…` class that doesn't use the font).
63
+ if (rule.type === CSSRule.STYLE_RULE) {
64
+ return /Font Awesome/i.test(text) || /content:\s*["']\\[ef]/.test(text);
65
+ }
66
+ return false;
67
+ }
68
+ //# sourceMappingURL=collectInlineFontAwesomeCss.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collectInlineFontAwesomeCss.js","sourceRoot":"","sources":["../../src/utils/collectInlineFontAwesomeCss.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,2BAA2B;IACzC,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,SAAS,CAAC;IAEtD,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACrD,IAAI,KAAK,GAAuB,IAAI,CAAC;QACrC,IAAI,CAAC;YACH,KAAK,GAAG,KAAK,CAAC,QAAQ,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,iEAAiE;YACjE,+DAA+D;YAC/D,uCAAuC;YACvC,SAAS;QACX,CAAC;QACD,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACrC,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjE,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,IAAa;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;IAC1B,2DAA2D;IAC3D,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC;QACzC,OAAO,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,0DAA0D;IAC1D,kEAAkE;IAClE,iEAAiE;IACjE,8DAA8D;IAC9D,gEAAgE;IAChE,iEAAiE;IACjE,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC;QACrC,OAAO,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -19,9 +19,28 @@ export declare function partitionFiles(files: File[]): {
19
19
  };
20
20
  /**
21
21
  * Add media files to a MediaProvider. Returns the relative paths
22
- * assigned by the provider.
22
+ * assigned by the provider, with `null` slots where a file could not
23
+ * be processed — keeping the result aligned with the input array so
24
+ * callers can correlate indices.
25
+ *
26
+ * Two failure modes are handled defensively:
27
+ *
28
+ * 1. `file.arrayBuffer()` throws (`InvalidStateError` — "An operation
29
+ * that depends on state cached in an interface object was made but
30
+ * the state had changed since it was read from disk"). This happens
31
+ * with virtual drag sources whose File reference goes stale before
32
+ * the async read completes — Phone Link / iOS continuity / certain
33
+ * screenshot tools / etc.
34
+ *
35
+ * 2. `file.arrayBuffer()` returns a 0-byte buffer. Some virtual
36
+ * sources resolve the read successfully but with no payload,
37
+ * leaving an empty file in the media bin. We skip those so the
38
+ * bin doesn't accumulate placeholders.
39
+ *
40
+ * In both cases we warn via console rather than throwing, so a single
41
+ * problematic file doesn't abort a multi-file drop.
23
42
  */
24
- export declare function processMediaFiles(files: File[], mediaProvider: MediaProvider): Promise<string[]>;
43
+ export declare function processMediaFiles(files: File[], mediaProvider: MediaProvider): Promise<(string | null)[]>;
25
44
  /**
26
45
  * Read a text-content file and return its content as a markdown string.
27
46
  *
@@ -1 +1 @@
1
- {"version":3,"file":"dropUtils.d.ts","sourceRoot":"","sources":["../../src/utils/dropUtils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEvE,YAAY,EAAE,YAAY,EAAE,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,IAAI,EAAE,IAAI,EAAE,CAAA;CAAE,CAW7E;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,IAAI,EAAE,EACb,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,MAAM,EAAE,CAAC,CAWnB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAcjE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CASrE"}
1
+ {"version":3,"file":"dropUtils.d.ts","sourceRoot":"","sources":["../../src/utils/dropUtils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAG/D,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEvE,YAAY,EAAE,YAAY,EAAE,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG;IAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAAC,IAAI,EAAE,IAAI,EAAE,CAAA;CAAE,CAW7E;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,IAAI,EAAE,EACb,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAwC5B;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAcjE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CASrE"}
@@ -27,15 +27,54 @@ export function partitionFiles(files) {
27
27
  }
28
28
  /**
29
29
  * Add media files to a MediaProvider. Returns the relative paths
30
- * assigned by the provider.
30
+ * assigned by the provider, with `null` slots where a file could not
31
+ * be processed — keeping the result aligned with the input array so
32
+ * callers can correlate indices.
33
+ *
34
+ * Two failure modes are handled defensively:
35
+ *
36
+ * 1. `file.arrayBuffer()` throws (`InvalidStateError` — "An operation
37
+ * that depends on state cached in an interface object was made but
38
+ * the state had changed since it was read from disk"). This happens
39
+ * with virtual drag sources whose File reference goes stale before
40
+ * the async read completes — Phone Link / iOS continuity / certain
41
+ * screenshot tools / etc.
42
+ *
43
+ * 2. `file.arrayBuffer()` returns a 0-byte buffer. Some virtual
44
+ * sources resolve the read successfully but with no payload,
45
+ * leaving an empty file in the media bin. We skip those so the
46
+ * bin doesn't accumulate placeholders.
47
+ *
48
+ * In both cases we warn via console rather than throwing, so a single
49
+ * problematic file doesn't abort a multi-file drop.
31
50
  */
32
51
  export async function processMediaFiles(files, mediaProvider) {
33
52
  const paths = [];
34
53
  for (const file of files) {
35
- const buffer = await file.arrayBuffer();
54
+ let buffer;
55
+ try {
56
+ buffer = await file.arrayBuffer();
57
+ }
58
+ catch (err) {
59
+ console.warn(`[squisq-editor] Skipped dropped file "${file.name}" — could not read its contents.`, 'This is typical for drags from virtual sources (Phone Link, screenshot tools, cross-tab drags) whose File reference goes stale before the async read completes.', err instanceof Error ? err.message : err);
60
+ paths.push(null);
61
+ continue;
62
+ }
63
+ if (buffer.byteLength === 0) {
64
+ console.warn(`[squisq-editor] Skipped dropped file "${file.name}" — its contents read as 0 bytes. ` +
65
+ 'The drag source likely never materialized the file (try saving it to disk first, then dragging from there).');
66
+ paths.push(null);
67
+ continue;
68
+ }
36
69
  const mimeType = file.type || 'application/octet-stream';
37
- const path = await mediaProvider.addMedia(file.name, buffer, mimeType);
38
- paths.push(path);
70
+ try {
71
+ const path = await mediaProvider.addMedia(file.name, buffer, mimeType);
72
+ paths.push(path);
73
+ }
74
+ catch (err) {
75
+ console.warn(`[squisq-editor] Failed to save "${file.name}" via mediaProvider:`, err instanceof Error ? err.message : err);
76
+ paths.push(null);
77
+ }
39
78
  }
40
79
  return paths;
41
80
  }
@@ -1 +1 @@
1
- {"version":3,"file":"dropUtils.js","sourceRoot":"","sources":["../../src/utils/dropUtils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAqB,MAAM,sBAAsB,CAAC;AAGvE,OAAO,EAAE,YAAY,EAAE,CAAC;AAExB;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,IAAI,GAAW,EAAE,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,GAAG,KAAK,OAAO;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACjC,IAAI,GAAG,KAAK,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,KAAa,EACb,aAA4B;IAE5B,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,0BAA0B,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QACvE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAU;IAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAE5D,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;QAClC,OAAO,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC;QACxC,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,OAAO,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAED,OAAO,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAa;IAClD,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QAC5C,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC"}
1
+ {"version":3,"file":"dropUtils.js","sourceRoot":"","sources":["../../src/utils/dropUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Detect image URLs that were malformed by an MS "Save Page As Web Page" /
3
+ * pandoc import: a relative path like `mikehome_files/foo.png` gets
4
+ * `http://` prepended somewhere upstream, so the URL parser interprets
5
+ * `mikehome_files` as a hostname. The browser then either fails to load
6
+ * the image or has it blocked by CSP.
7
+ *
8
+ * Heuristic: hostname has no dots and no port, and ends in `_files` —
9
+ * that's the Word-style asset-folder naming convention, not a real host.
10
+ *
11
+ * Returns the recovered relative path (e.g. `mikehome_files/foo.png`)
12
+ * when the shape matches, or `null` otherwise.
13
+ */
14
+ export declare function normalizeMalformedAssetUrl(src: string | null | undefined): string | null;
15
+ //# sourceMappingURL=normalizeMalformedAssetUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeMalformedAssetUrl.d.ts","sourceRoot":"","sources":["../../src/utils/normalizeMalformedAssetUrl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,wBAAgB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAQxF"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Detect image URLs that were malformed by an MS "Save Page As Web Page" /
3
+ * pandoc import: a relative path like `mikehome_files/foo.png` gets
4
+ * `http://` prepended somewhere upstream, so the URL parser interprets
5
+ * `mikehome_files` as a hostname. The browser then either fails to load
6
+ * the image or has it blocked by CSP.
7
+ *
8
+ * Heuristic: hostname has no dots and no port, and ends in `_files` —
9
+ * that's the Word-style asset-folder naming convention, not a real host.
10
+ *
11
+ * Returns the recovered relative path (e.g. `mikehome_files/foo.png`)
12
+ * when the shape matches, or `null` otherwise.
13
+ */
14
+ export function normalizeMalformedAssetUrl(src) {
15
+ if (!src)
16
+ return null;
17
+ const match = src.match(/^https?:\/\/([^/?#]+)\/(.+)$/i);
18
+ if (!match)
19
+ return null;
20
+ const [, host, rest] = match;
21
+ if (host.includes('.') || host.includes(':'))
22
+ return null;
23
+ if (!host.toLowerCase().endsWith('_files'))
24
+ return null;
25
+ return `${host}/${rest}`;
26
+ }
27
+ //# sourceMappingURL=normalizeMalformedAssetUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"normalizeMalformedAssetUrl.js","sourceRoot":"","sources":["../../src/utils/normalizeMalformedAssetUrl.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,0BAA0B,CAAC,GAA8B;IACvE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,KAAK,CAAC;IAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,OAAO,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC;AAC3B,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bendyline/squisq-editor-react",
3
- "version": "1.4.0",
3
+ "version": "1.5.1",
4
4
  "description": "React editor shell with raw/WYSIWYG/preview modes for Squisq documents",
5
5
  "license": "MIT",
6
6
  "author": "Bendyline",
@@ -34,10 +34,11 @@
34
34
  "types": "./dist/index.d.ts",
35
35
  "import": "./dist/index.js"
36
36
  },
37
- "./styles": "./src/styles/editor.css"
37
+ "./styles": "./src/styles/index.css"
38
38
  },
39
39
  "scripts": {
40
40
  "build": "tsup",
41
+ "dev": "concurrently -n js,dts -c blue,gray -r \"tsup --watch --no-dts --no-clean\" \"tsup --watch --dts-only --no-clean\"",
41
42
  "typecheck": "tsc --noEmit"
42
43
  },
43
44
  "peerDependencies": {
@@ -46,11 +47,13 @@
46
47
  "react-dom": "^18.0.0 || ^19.0.0"
47
48
  },
48
49
  "dependencies": {
49
- "@bendyline/squisq": "1.3.0",
50
- "@bendyline/squisq-formats": "1.2.3",
51
- "@bendyline/squisq-react": "1.2.0",
50
+ "@bendyline/squisq": "1.4.0",
51
+ "@bendyline/squisq-formats": "1.3.0",
52
+ "@bendyline/squisq-react": "1.3.1",
53
+ "@fortawesome/fontawesome-free": "7.2.0",
52
54
  "@monaco-editor/react": "4.7.0",
53
55
  "@tiptap/extension-image": "2.27.2",
56
+ "@tiptap/extension-link": "2.27.2",
54
57
  "@tiptap/extension-mention": "2.27.2",
55
58
  "@tiptap/extension-placeholder": "2.27.2",
56
59
  "@tiptap/extension-table": "2.27.2",