@bendyline/squisq-editor-react 1.3.0 → 1.5.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 (461) 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 +184 -4
  10. package/dist/EditorShell.d.ts.map +1 -1
  11. package/dist/EditorShell.js +184 -12
  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/MediaBin.d.ts +12 -1
  42. package/dist/MediaBin.d.ts.map +1 -1
  43. package/dist/MediaBin.js +13 -3
  44. package/dist/MediaBin.js.map +1 -1
  45. package/dist/MentionExtension.js +10 -7
  46. package/dist/MentionExtension.js.map +1 -1
  47. package/dist/OutlinePanel.d.ts +17 -0
  48. package/dist/OutlinePanel.d.ts.map +1 -0
  49. package/dist/OutlinePanel.js +167 -0
  50. package/dist/OutlinePanel.js.map +1 -0
  51. package/dist/PlainHtmlPreview.d.ts +50 -0
  52. package/dist/PlainHtmlPreview.d.ts.map +1 -0
  53. package/dist/PlainHtmlPreview.js +155 -0
  54. package/dist/PlainHtmlPreview.js.map +1 -0
  55. package/dist/PreviewControls.d.ts +15 -1
  56. package/dist/PreviewControls.d.ts.map +1 -1
  57. package/dist/PreviewControls.js +75 -18
  58. package/dist/PreviewControls.js.map +1 -1
  59. package/dist/PreviewPanel.d.ts +11 -10
  60. package/dist/PreviewPanel.d.ts.map +1 -1
  61. package/dist/PreviewPanel.js +20 -17
  62. package/dist/PreviewPanel.js.map +1 -1
  63. package/dist/RawEditor.d.ts.map +1 -1
  64. package/dist/RawEditor.js +198 -4
  65. package/dist/RawEditor.js.map +1 -1
  66. package/dist/RecorderEntry.d.ts +24 -0
  67. package/dist/RecorderEntry.d.ts.map +1 -0
  68. package/dist/RecorderEntry.js +139 -0
  69. package/dist/RecorderEntry.js.map +1 -0
  70. package/dist/TemplateAnnotation.d.ts.map +1 -1
  71. package/dist/TemplateAnnotation.js +32 -6
  72. package/dist/TemplateAnnotation.js.map +1 -1
  73. package/dist/TemplatePicker.d.ts +53 -0
  74. package/dist/TemplatePicker.d.ts.map +1 -0
  75. package/dist/TemplatePicker.js +388 -0
  76. package/dist/TemplatePicker.js.map +1 -0
  77. package/dist/ThemeCustomizerPanel.d.ts +32 -0
  78. package/dist/ThemeCustomizerPanel.d.ts.map +1 -0
  79. package/dist/ThemeCustomizerPanel.js +256 -0
  80. package/dist/ThemeCustomizerPanel.js.map +1 -0
  81. package/dist/ThemePicker.d.ts +33 -0
  82. package/dist/ThemePicker.d.ts.map +1 -0
  83. package/dist/ThemePicker.js +148 -0
  84. package/dist/ThemePicker.js.map +1 -0
  85. package/dist/Toolbar.d.ts.map +1 -1
  86. package/dist/Toolbar.js +508 -33
  87. package/dist/Toolbar.js.map +1 -1
  88. package/dist/VersionHistoryPanel.d.ts +14 -0
  89. package/dist/VersionHistoryPanel.d.ts.map +1 -0
  90. package/dist/VersionHistoryPanel.js +147 -0
  91. package/dist/VersionHistoryPanel.js.map +1 -0
  92. package/dist/ViewMenuPanel.d.ts +13 -0
  93. package/dist/ViewMenuPanel.d.ts.map +1 -0
  94. package/dist/ViewMenuPanel.js +58 -0
  95. package/dist/ViewMenuPanel.js.map +1 -0
  96. package/dist/WysiwygEditor.d.ts.map +1 -1
  97. package/dist/WysiwygEditor.js +198 -9
  98. package/dist/WysiwygEditor.js.map +1 -1
  99. package/dist/__tests__/detectMarkdown.test.js +0 -14
  100. package/dist/__tests__/detectMarkdown.test.js.map +1 -1
  101. package/dist/__tests__/documentSettingsDialog.test.d.ts +2 -0
  102. package/dist/__tests__/documentSettingsDialog.test.d.ts.map +1 -0
  103. package/dist/__tests__/documentSettingsDialog.test.js +132 -0
  104. package/dist/__tests__/documentSettingsDialog.test.js.map +1 -0
  105. package/dist/__tests__/emojiPicker.test.d.ts +2 -0
  106. package/dist/__tests__/emojiPicker.test.d.ts.map +1 -0
  107. package/dist/__tests__/emojiPicker.test.js +111 -0
  108. package/dist/__tests__/emojiPicker.test.js.map +1 -0
  109. package/dist/__tests__/fileKind.test.js +13 -0
  110. package/dist/__tests__/fileKind.test.js.map +1 -1
  111. package/dist/__tests__/imageEditAffordance.test.d.ts +2 -0
  112. package/dist/__tests__/imageEditAffordance.test.d.ts.map +1 -0
  113. package/dist/__tests__/imageEditAffordance.test.js +188 -0
  114. package/dist/__tests__/imageEditAffordance.test.js.map +1 -0
  115. package/dist/__tests__/imageEditorShell.test.d.ts +2 -0
  116. package/dist/__tests__/imageEditorShell.test.d.ts.map +1 -0
  117. package/dist/__tests__/imageEditorShell.test.js +52 -0
  118. package/dist/__tests__/imageEditorShell.test.js.map +1 -0
  119. package/dist/__tests__/imageEditorState.test.d.ts +3 -0
  120. package/dist/__tests__/imageEditorState.test.d.ts.map +1 -0
  121. package/dist/__tests__/imageEditorState.test.js +148 -0
  122. package/dist/__tests__/imageEditorState.test.js.map +1 -0
  123. package/dist/__tests__/inlinePreviewGutter.test.d.ts +2 -0
  124. package/dist/__tests__/inlinePreviewGutter.test.d.ts.map +1 -0
  125. package/dist/__tests__/inlinePreviewGutter.test.js +51 -0
  126. package/dist/__tests__/inlinePreviewGutter.test.js.map +1 -0
  127. package/dist/__tests__/inlinePreviewGutterAllBlocks.test.d.ts +2 -0
  128. package/dist/__tests__/inlinePreviewGutterAllBlocks.test.d.ts.map +1 -0
  129. package/dist/__tests__/inlinePreviewGutterAllBlocks.test.js +63 -0
  130. package/dist/__tests__/inlinePreviewGutterAllBlocks.test.js.map +1 -0
  131. package/dist/__tests__/jsonEditor.test.d.ts +2 -0
  132. package/dist/__tests__/jsonEditor.test.d.ts.map +1 -0
  133. package/dist/__tests__/jsonEditor.test.js +134 -0
  134. package/dist/__tests__/jsonEditor.test.js.map +1 -0
  135. package/dist/__tests__/layersPanel.test.d.ts +2 -0
  136. package/dist/__tests__/layersPanel.test.d.ts.map +1 -0
  137. package/dist/__tests__/layersPanel.test.js +84 -0
  138. package/dist/__tests__/layersPanel.test.js.map +1 -0
  139. package/dist/__tests__/linkDialogDocPicker.test.d.ts +7 -0
  140. package/dist/__tests__/linkDialogDocPicker.test.d.ts.map +1 -0
  141. package/dist/__tests__/linkDialogDocPicker.test.js +75 -0
  142. package/dist/__tests__/linkDialogDocPicker.test.js.map +1 -0
  143. package/dist/__tests__/mediaAttachmentFlow.test.d.ts +2 -0
  144. package/dist/__tests__/mediaAttachmentFlow.test.d.ts.map +1 -0
  145. package/dist/__tests__/mediaAttachmentFlow.test.js +99 -0
  146. package/dist/__tests__/mediaAttachmentFlow.test.js.map +1 -0
  147. package/dist/__tests__/outlinePanel.test.d.ts +2 -0
  148. package/dist/__tests__/outlinePanel.test.d.ts.map +1 -0
  149. package/dist/__tests__/outlinePanel.test.js +68 -0
  150. package/dist/__tests__/outlinePanel.test.js.map +1 -0
  151. package/dist/__tests__/plainHtmlPreview.test.d.ts +2 -0
  152. package/dist/__tests__/plainHtmlPreview.test.d.ts.map +1 -0
  153. package/dist/__tests__/plainHtmlPreview.test.js +87 -0
  154. package/dist/__tests__/plainHtmlPreview.test.js.map +1 -0
  155. package/dist/__tests__/propertiesPanel.test.d.ts +2 -0
  156. package/dist/__tests__/propertiesPanel.test.d.ts.map +1 -0
  157. package/dist/__tests__/propertiesPanel.test.js +64 -0
  158. package/dist/__tests__/propertiesPanel.test.js.map +1 -0
  159. package/dist/__tests__/recorderFormats.test.d.ts +2 -0
  160. package/dist/__tests__/recorderFormats.test.d.ts.map +1 -0
  161. package/dist/__tests__/recorderFormats.test.js +121 -0
  162. package/dist/__tests__/recorderFormats.test.js.map +1 -0
  163. package/dist/__tests__/recorderTimingJson.test.d.ts +2 -0
  164. package/dist/__tests__/recorderTimingJson.test.d.ts.map +1 -0
  165. package/dist/__tests__/recorderTimingJson.test.js +37 -0
  166. package/dist/__tests__/recorderTimingJson.test.js.map +1 -0
  167. package/dist/__tests__/templateAnnotationRoundTrip.test.d.ts +2 -0
  168. package/dist/__tests__/templateAnnotationRoundTrip.test.d.ts.map +1 -0
  169. package/dist/__tests__/templateAnnotationRoundTrip.test.js +31 -0
  170. package/dist/__tests__/templateAnnotationRoundTrip.test.js.map +1 -0
  171. package/dist/__tests__/tiptapBridge.test.js +26 -0
  172. package/dist/__tests__/tiptapBridge.test.js.map +1 -1
  173. package/dist/__tests__/tiptapImageRoundTrip.test.d.ts +2 -0
  174. package/dist/__tests__/tiptapImageRoundTrip.test.d.ts.map +1 -0
  175. package/dist/__tests__/tiptapImageRoundTrip.test.js +68 -0
  176. package/dist/__tests__/tiptapImageRoundTrip.test.js.map +1 -0
  177. package/dist/__tests__/useImageEditor.test.d.ts +2 -0
  178. package/dist/__tests__/useImageEditor.test.d.ts.map +1 -0
  179. package/dist/__tests__/useImageEditor.test.js +131 -0
  180. package/dist/__tests__/useImageEditor.test.js.map +1 -0
  181. package/dist/__tests__/useMediaRecorder.test.d.ts +2 -0
  182. package/dist/__tests__/useMediaRecorder.test.d.ts.map +1 -0
  183. package/dist/__tests__/useMediaRecorder.test.js +153 -0
  184. package/dist/__tests__/useMediaRecorder.test.js.map +1 -0
  185. package/dist/__tests__/versionHistory.test.d.ts +2 -0
  186. package/dist/__tests__/versionHistory.test.d.ts.map +1 -0
  187. package/dist/__tests__/versionHistory.test.js +124 -0
  188. package/dist/__tests__/versionHistory.test.js.map +1 -0
  189. package/dist/blockSlice.d.ts +24 -0
  190. package/dist/blockSlice.d.ts.map +1 -0
  191. package/dist/blockSlice.js +63 -0
  192. package/dist/blockSlice.js.map +1 -0
  193. package/dist/buildPreviewDoc.d.ts.map +1 -1
  194. package/dist/buildPreviewDoc.js +52 -2
  195. package/dist/buildPreviewDoc.js.map +1 -1
  196. package/dist/emojiData.d.ts +81 -0
  197. package/dist/emojiData.d.ts.map +1 -0
  198. package/dist/emojiData.js +1283 -0
  199. package/dist/emojiData.js.map +1 -0
  200. package/dist/fileKind.d.ts +6 -2
  201. package/dist/fileKind.d.ts.map +1 -1
  202. package/dist/fileKind.js +25 -4
  203. package/dist/fileKind.js.map +1 -1
  204. package/dist/hooks/useFileDrop.d.ts.map +1 -1
  205. package/dist/hooks/useFileDrop.js +40 -4
  206. package/dist/hooks/useFileDrop.js.map +1 -1
  207. package/dist/imageEditor/CanvasSurface.d.ts +31 -0
  208. package/dist/imageEditor/CanvasSurface.d.ts.map +1 -0
  209. package/dist/imageEditor/CanvasSurface.js +264 -0
  210. package/dist/imageEditor/CanvasSurface.js.map +1 -0
  211. package/dist/imageEditor/ImageVersionHistoryDropdown.d.ts +39 -0
  212. package/dist/imageEditor/ImageVersionHistoryDropdown.d.ts.map +1 -0
  213. package/dist/imageEditor/ImageVersionHistoryDropdown.js +283 -0
  214. package/dist/imageEditor/ImageVersionHistoryDropdown.js.map +1 -0
  215. package/dist/imageEditor/LayersPanel.d.ts +14 -0
  216. package/dist/imageEditor/LayersPanel.d.ts.map +1 -0
  217. package/dist/imageEditor/LayersPanel.js +43 -0
  218. package/dist/imageEditor/LayersPanel.js.map +1 -0
  219. package/dist/imageEditor/PropertiesPanel.d.ts +14 -0
  220. package/dist/imageEditor/PropertiesPanel.d.ts.map +1 -0
  221. package/dist/imageEditor/PropertiesPanel.js +97 -0
  222. package/dist/imageEditor/PropertiesPanel.js.map +1 -0
  223. package/dist/imageEditor/Toolbar.d.ts +30 -0
  224. package/dist/imageEditor/Toolbar.d.ts.map +1 -0
  225. package/dist/imageEditor/Toolbar.js +108 -0
  226. package/dist/imageEditor/Toolbar.js.map +1 -0
  227. package/dist/imageEditor/icons.d.ts +24 -0
  228. package/dist/imageEditor/icons.d.ts.map +1 -0
  229. package/dist/imageEditor/icons.js +45 -0
  230. package/dist/imageEditor/icons.js.map +1 -0
  231. package/dist/imageEditor/layers/EditorImageLayer.d.ts +16 -0
  232. package/dist/imageEditor/layers/EditorImageLayer.d.ts.map +1 -0
  233. package/dist/imageEditor/layers/EditorImageLayer.js +37 -0
  234. package/dist/imageEditor/layers/EditorImageLayer.js.map +1 -0
  235. package/dist/imageEditor/layers/EditorShapeLayer.d.ts +15 -0
  236. package/dist/imageEditor/layers/EditorShapeLayer.d.ts.map +1 -0
  237. package/dist/imageEditor/layers/EditorShapeLayer.js +20 -0
  238. package/dist/imageEditor/layers/EditorShapeLayer.js.map +1 -0
  239. package/dist/imageEditor/layers/EditorTextLayer.d.ts +18 -0
  240. package/dist/imageEditor/layers/EditorTextLayer.d.ts.map +1 -0
  241. package/dist/imageEditor/layers/EditorTextLayer.js +13 -0
  242. package/dist/imageEditor/layers/EditorTextLayer.js.map +1 -0
  243. package/dist/imageEditor/layers/SelectionHandles.d.ts +17 -0
  244. package/dist/imageEditor/layers/SelectionHandles.d.ts.map +1 -0
  245. package/dist/imageEditor/layers/SelectionHandles.js +19 -0
  246. package/dist/imageEditor/layers/SelectionHandles.js.map +1 -0
  247. package/dist/imageEditor/state.d.ts +76 -0
  248. package/dist/imageEditor/state.d.ts.map +1 -0
  249. package/dist/imageEditor/state.js +87 -0
  250. package/dist/imageEditor/state.js.map +1 -0
  251. package/dist/imageEditor/useImageEditor.d.ts +53 -0
  252. package/dist/imageEditor/useImageEditor.d.ts.map +1 -0
  253. package/dist/imageEditor/useImageEditor.js +244 -0
  254. package/dist/imageEditor/useImageEditor.js.map +1 -0
  255. package/dist/imageEditor/useImageEditorTokens.d.ts +16 -0
  256. package/dist/imageEditor/useImageEditorTokens.d.ts.map +1 -0
  257. package/dist/imageEditor/useImageEditorTokens.js +45 -0
  258. package/dist/imageEditor/useImageEditorTokens.js.map +1 -0
  259. package/dist/index.d.ts +48 -1
  260. package/dist/index.d.ts.map +1 -1
  261. package/dist/index.js +36 -0
  262. package/dist/index.js.map +1 -1
  263. package/dist/jsonEditor/EmbeddedRichTextField.d.ts +15 -0
  264. package/dist/jsonEditor/EmbeddedRichTextField.d.ts.map +1 -0
  265. package/dist/jsonEditor/EmbeddedRichTextField.js +74 -0
  266. package/dist/jsonEditor/EmbeddedRichTextField.js.map +1 -0
  267. package/dist/jsonEditor/JsonEditor.d.ts +36 -0
  268. package/dist/jsonEditor/JsonEditor.d.ts.map +1 -0
  269. package/dist/jsonEditor/JsonEditor.js +15 -0
  270. package/dist/jsonEditor/JsonEditor.js.map +1 -0
  271. package/dist/jsonEditor/JsonEditorContext.d.ts +28 -0
  272. package/dist/jsonEditor/JsonEditorContext.d.ts.map +1 -0
  273. package/dist/jsonEditor/JsonEditorContext.js +41 -0
  274. package/dist/jsonEditor/JsonEditorContext.js.map +1 -0
  275. package/dist/jsonEditor/RenderNode.d.ts +16 -0
  276. package/dist/jsonEditor/RenderNode.d.ts.map +1 -0
  277. package/dist/jsonEditor/RenderNode.js +32 -0
  278. package/dist/jsonEditor/RenderNode.js.map +1 -0
  279. package/dist/jsonEditor/editors.d.ts +36 -0
  280. package/dist/jsonEditor/editors.d.ts.map +1 -0
  281. package/dist/jsonEditor/editors.js +347 -0
  282. package/dist/jsonEditor/editors.js.map +1 -0
  283. package/dist/jsonEditor/index.d.ts +3 -0
  284. package/dist/jsonEditor/index.d.ts.map +1 -0
  285. package/dist/jsonEditor/index.js +2 -0
  286. package/dist/jsonEditor/index.js.map +1 -0
  287. package/dist/jsonEditor/useJsonEditorTokens.d.ts +13 -0
  288. package/dist/jsonEditor/useJsonEditorTokens.d.ts.map +1 -0
  289. package/dist/jsonEditor/useJsonEditorTokens.js +38 -0
  290. package/dist/jsonEditor/useJsonEditorTokens.js.map +1 -0
  291. package/dist/recorder/RecorderButton.d.ts +31 -0
  292. package/dist/recorder/RecorderButton.d.ts.map +1 -0
  293. package/dist/recorder/RecorderButton.js +24 -0
  294. package/dist/recorder/RecorderButton.js.map +1 -0
  295. package/dist/recorder/RecorderModal.d.ts +59 -0
  296. package/dist/recorder/RecorderModal.d.ts.map +1 -0
  297. package/dist/recorder/RecorderModal.js +333 -0
  298. package/dist/recorder/RecorderModal.js.map +1 -0
  299. package/dist/recorder/RecorderPanel.d.ts +25 -0
  300. package/dist/recorder/RecorderPanel.d.ts.map +1 -0
  301. package/dist/recorder/RecorderPanel.js +30 -0
  302. package/dist/recorder/RecorderPanel.js.map +1 -0
  303. package/dist/recorder/formats.d.ts +51 -0
  304. package/dist/recorder/formats.d.ts.map +1 -0
  305. package/dist/recorder/formats.js +144 -0
  306. package/dist/recorder/formats.js.map +1 -0
  307. package/dist/recorder/hooks/useMediaRecorder.d.ts +90 -0
  308. package/dist/recorder/hooks/useMediaRecorder.d.ts.map +1 -0
  309. package/dist/recorder/hooks/useMediaRecorder.js +277 -0
  310. package/dist/recorder/hooks/useMediaRecorder.js.map +1 -0
  311. package/dist/recorder/hooks/useStreamPreview.d.ts +22 -0
  312. package/dist/recorder/hooks/useStreamPreview.d.ts.map +1 -0
  313. package/dist/recorder/hooks/useStreamPreview.js +44 -0
  314. package/dist/recorder/hooks/useStreamPreview.js.map +1 -0
  315. package/dist/recorder/sources/cameraStream.d.ts +22 -0
  316. package/dist/recorder/sources/cameraStream.d.ts.map +1 -0
  317. package/dist/recorder/sources/cameraStream.js +24 -0
  318. package/dist/recorder/sources/cameraStream.js.map +1 -0
  319. package/dist/recorder/sources/micStream.d.ts +15 -0
  320. package/dist/recorder/sources/micStream.d.ts.map +1 -0
  321. package/dist/recorder/sources/micStream.js +24 -0
  322. package/dist/recorder/sources/micStream.js.map +1 -0
  323. package/dist/recorder/sources/screenStream.d.ts +53 -0
  324. package/dist/recorder/sources/screenStream.d.ts.map +1 -0
  325. package/dist/recorder/sources/screenStream.js +114 -0
  326. package/dist/recorder/sources/screenStream.js.map +1 -0
  327. package/dist/recorder/timingJson.d.ts +51 -0
  328. package/dist/recorder/timingJson.d.ts.map +1 -0
  329. package/dist/recorder/timingJson.js +42 -0
  330. package/dist/recorder/timingJson.js.map +1 -0
  331. package/dist/tiptap/TiptapAudio.d.ts +26 -0
  332. package/dist/tiptap/TiptapAudio.d.ts.map +1 -0
  333. package/dist/tiptap/TiptapAudio.js +58 -0
  334. package/dist/tiptap/TiptapAudio.js.map +1 -0
  335. package/dist/tiptap/TiptapVideo.d.ts +30 -0
  336. package/dist/tiptap/TiptapVideo.d.ts.map +1 -0
  337. package/dist/tiptap/TiptapVideo.js +66 -0
  338. package/dist/tiptap/TiptapVideo.js.map +1 -0
  339. package/dist/tiptap/useResolvedMediaSrc.d.ts +2 -0
  340. package/dist/tiptap/useResolvedMediaSrc.d.ts.map +1 -0
  341. package/dist/tiptap/useResolvedMediaSrc.js +42 -0
  342. package/dist/tiptap/useResolvedMediaSrc.js.map +1 -0
  343. package/dist/tiptapBridge.d.ts.map +1 -1
  344. package/dist/tiptapBridge.js +210 -16
  345. package/dist/tiptapBridge.js.map +1 -1
  346. package/dist/useHeadingLayout.d.ts +54 -0
  347. package/dist/useHeadingLayout.d.ts.map +1 -0
  348. package/dist/useHeadingLayout.js +260 -0
  349. package/dist/useHeadingLayout.js.map +1 -0
  350. package/dist/utils/collectInlineFontAwesomeCss.d.ts +21 -0
  351. package/dist/utils/collectInlineFontAwesomeCss.d.ts.map +1 -0
  352. package/dist/utils/collectInlineFontAwesomeCss.js +68 -0
  353. package/dist/utils/collectInlineFontAwesomeCss.js.map +1 -0
  354. package/dist/utils/dropUtils.d.ts +21 -2
  355. package/dist/utils/dropUtils.d.ts.map +1 -1
  356. package/dist/utils/dropUtils.js +43 -4
  357. package/dist/utils/dropUtils.js.map +1 -1
  358. package/dist/utils/normalizeMalformedAssetUrl.d.ts +15 -0
  359. package/dist/utils/normalizeMalformedAssetUrl.d.ts.map +1 -0
  360. package/dist/utils/normalizeMalformedAssetUrl.js +27 -0
  361. package/dist/utils/normalizeMalformedAssetUrl.js.map +1 -0
  362. package/package.json +8 -5
  363. package/src/DocumentSettingsDialog.tsx +266 -0
  364. package/src/EditorContext.tsx +534 -10
  365. package/src/EditorShell.tsx +691 -63
  366. package/src/EmojiPicker.tsx +332 -0
  367. package/src/ImageEditor.tsx +327 -0
  368. package/src/ImageNodeView.tsx +222 -21
  369. package/src/ImageViewer.tsx +221 -0
  370. package/src/InlineIcon.ts +84 -0
  371. package/src/InlinePreviewGutter.tsx +582 -0
  372. package/src/LinkDialog.tsx +276 -0
  373. package/src/MediaBin.tsx +22 -3
  374. package/src/MentionExtension.tsx +10 -7
  375. package/src/OutlinePanel.tsx +295 -0
  376. package/src/PlainHtmlPreview.tsx +211 -0
  377. package/src/PreviewControls.tsx +130 -24
  378. package/src/PreviewPanel.tsx +38 -21
  379. package/src/RawEditor.tsx +215 -4
  380. package/src/RecorderEntry.tsx +164 -0
  381. package/src/TemplateAnnotation.ts +32 -6
  382. package/src/TemplatePicker.tsx +818 -0
  383. package/src/ThemeCustomizerPanel.tsx +595 -0
  384. package/src/ThemePicker.tsx +319 -0
  385. package/src/Toolbar.tsx +708 -111
  386. package/src/VersionHistoryPanel.tsx +329 -0
  387. package/src/ViewMenuPanel.tsx +188 -0
  388. package/src/WysiwygEditor.tsx +229 -9
  389. package/src/__tests__/detectMarkdown.test.ts +0 -15
  390. package/src/__tests__/documentSettingsDialog.test.tsx +147 -0
  391. package/src/__tests__/emojiPicker.test.tsx +133 -0
  392. package/src/__tests__/fileKind.test.ts +16 -0
  393. package/src/__tests__/imageEditAffordance.test.tsx +268 -0
  394. package/src/__tests__/imageEditorShell.test.tsx +57 -0
  395. package/src/__tests__/imageEditorState.test.ts +171 -0
  396. package/src/__tests__/inlinePreviewGutter.test.tsx +62 -0
  397. package/src/__tests__/inlinePreviewGutterAllBlocks.test.tsx +103 -0
  398. package/src/__tests__/jsonEditor.test.tsx +168 -0
  399. package/src/__tests__/layersPanel.test.tsx +97 -0
  400. package/src/__tests__/linkDialogDocPicker.test.tsx +137 -0
  401. package/src/__tests__/mediaAttachmentFlow.test.ts +110 -0
  402. package/src/__tests__/outlinePanel.test.tsx +79 -0
  403. package/src/__tests__/plainHtmlPreview.test.tsx +107 -0
  404. package/src/__tests__/propertiesPanel.test.tsx +69 -0
  405. package/src/__tests__/recorderFormats.test.ts +146 -0
  406. package/src/__tests__/recorderTimingJson.test.ts +41 -0
  407. package/src/__tests__/templateAnnotationRoundTrip.test.ts +34 -0
  408. package/src/__tests__/tiptapBridge.test.ts +29 -0
  409. package/src/__tests__/tiptapImageRoundTrip.test.ts +73 -0
  410. package/src/__tests__/useImageEditor.test.tsx +159 -0
  411. package/src/__tests__/useMediaRecorder.test.ts +186 -0
  412. package/src/__tests__/versionHistory.test.tsx +197 -0
  413. package/src/blockSlice.ts +75 -0
  414. package/src/buildPreviewDoc.ts +61 -6
  415. package/src/emojiData.ts +1337 -0
  416. package/src/fileKind.ts +30 -6
  417. package/src/hooks/useFileDrop.ts +40 -4
  418. package/src/imageEditor/CanvasSurface.tsx +402 -0
  419. package/src/imageEditor/ImageVersionHistoryDropdown.tsx +396 -0
  420. package/src/imageEditor/LayersPanel.tsx +143 -0
  421. package/src/imageEditor/PropertiesPanel.tsx +428 -0
  422. package/src/imageEditor/Toolbar.tsx +242 -0
  423. package/src/imageEditor/icons.tsx +144 -0
  424. package/src/imageEditor/image-editor.css +450 -0
  425. package/src/imageEditor/layers/EditorImageLayer.tsx +45 -0
  426. package/src/imageEditor/layers/EditorShapeLayer.tsx +62 -0
  427. package/src/imageEditor/layers/EditorTextLayer.tsx +45 -0
  428. package/src/imageEditor/layers/SelectionHandles.tsx +86 -0
  429. package/src/imageEditor/state.ts +153 -0
  430. package/src/imageEditor/useImageEditor.ts +328 -0
  431. package/src/imageEditor/useImageEditorTokens.ts +70 -0
  432. package/src/index.ts +82 -0
  433. package/src/jsonEditor/EmbeddedRichTextField.tsx +81 -0
  434. package/src/jsonEditor/JsonEditor.tsx +81 -0
  435. package/src/jsonEditor/JsonEditorContext.tsx +75 -0
  436. package/src/jsonEditor/RenderNode.tsx +66 -0
  437. package/src/jsonEditor/editors.tsx +678 -0
  438. package/src/jsonEditor/index.ts +2 -0
  439. package/src/jsonEditor/json-editor.css +463 -0
  440. package/src/jsonEditor/useJsonEditorTokens.ts +63 -0
  441. package/src/recorder/RecorderButton.tsx +72 -0
  442. package/src/recorder/RecorderModal.tsx +596 -0
  443. package/src/recorder/RecorderPanel.tsx +93 -0
  444. package/src/recorder/formats.ts +159 -0
  445. package/src/recorder/hooks/useMediaRecorder.ts +378 -0
  446. package/src/recorder/hooks/useStreamPreview.ts +47 -0
  447. package/src/recorder/sources/cameraStream.ts +32 -0
  448. package/src/recorder/sources/micStream.ts +25 -0
  449. package/src/recorder/sources/screenStream.ts +162 -0
  450. package/src/recorder/timingJson.ts +66 -0
  451. package/src/styles/editor.css +2490 -51
  452. package/src/styles/image-edit-affordance.css +201 -0
  453. package/src/styles/index.css +10 -0
  454. package/src/tiptap/TiptapAudio.tsx +86 -0
  455. package/src/tiptap/TiptapVideo.tsx +119 -0
  456. package/src/tiptap/useResolvedMediaSrc.ts +47 -0
  457. package/src/tiptapBridge.ts +227 -22
  458. package/src/useHeadingLayout.ts +294 -0
  459. package/src/utils/collectInlineFontAwesomeCss.ts +69 -0
  460. package/src/utils/dropUtils.ts +54 -6
  461. package/src/utils/normalizeMalformedAssetUrl.ts +22 -0
@@ -0,0 +1,463 @@
1
+ /**
2
+ * <JsonEditor> — editable form styles.
3
+ *
4
+ * Theme tokens are injected as scoped `--squisq-jsonform-*` CSS custom
5
+ * properties on the root, mirroring the JsonView pattern. Editor-only
6
+ * tokens use a separate prefix from the read-only viewer so the two
7
+ * components can compose on the same page without bleeding styles.
8
+ */
9
+
10
+ .squisq-jsonform {
11
+ font-family: var(--squisq-jsonform-body-font, var(--squisq-ux-font, system-ui, sans-serif));
12
+ color: var(--squisq-jsonform-text);
13
+ background: var(--squisq-jsonform-bg);
14
+ border-radius: var(--squisq-jsonform-radius, 8px);
15
+ padding: 16px;
16
+ display: flex;
17
+ flex-direction: column;
18
+ gap: 16px;
19
+ container-type: inline-size;
20
+ }
21
+
22
+ .squisq-jsonform--compact {
23
+ padding: 8px;
24
+ gap: 8px;
25
+ }
26
+
27
+ .squisq-jf-group {
28
+ display: flex;
29
+ flex-direction: column;
30
+ gap: 12px;
31
+ background: color-mix(in srgb, var(--squisq-jsonform-bg) 92%, var(--squisq-jsonform-text) 8%);
32
+ border: 1px solid var(--squisq-jsonform-border);
33
+ border-radius: var(--squisq-jsonform-radius, 8px);
34
+ padding: 14px 16px;
35
+ }
36
+
37
+ .squisq-jf-group__title {
38
+ font-family: var(--squisq-jsonform-title-font, inherit);
39
+ font-size: 1.05em;
40
+ font-weight: 600;
41
+ color: var(--squisq-jsonform-text);
42
+ margin: 0;
43
+ }
44
+
45
+ .squisq-jf-group__help {
46
+ font-size: 0.85em;
47
+ color: var(--squisq-jsonform-muted);
48
+ margin: -6px 0 0 0;
49
+ }
50
+
51
+ .squisq-jf-field {
52
+ display: flex;
53
+ flex-direction: column;
54
+ gap: 4px;
55
+ }
56
+
57
+ .squisq-jf-field__label {
58
+ font-size: 0.85em;
59
+ font-weight: 500;
60
+ color: var(--squisq-jsonform-muted);
61
+ }
62
+
63
+ .squisq-jf-field__help {
64
+ font-size: 0.8em;
65
+ color: var(--squisq-jsonform-muted);
66
+ }
67
+
68
+ .squisq-jf-field__error {
69
+ font-size: 0.8em;
70
+ color: var(--squisq-jsonform-warning, #d4351c);
71
+ }
72
+
73
+ .squisq-jf-field--disabled {
74
+ opacity: 0.55;
75
+ pointer-events: none;
76
+ }
77
+
78
+ /* Inputs share a base look so the form feels cohesive. */
79
+ .squisq-jf-input,
80
+ .squisq-jf-textarea,
81
+ .squisq-jf-select {
82
+ font: inherit;
83
+ color: var(--squisq-jsonform-text);
84
+ background: var(--squisq-jsonform-input-bg, var(--squisq-jsonform-bg));
85
+ border: 1px solid var(--squisq-jsonform-border);
86
+ border-radius: 6px;
87
+ padding: 8px 10px;
88
+ outline: none;
89
+ transition:
90
+ border-color 120ms ease,
91
+ box-shadow 120ms ease;
92
+ width: 100%;
93
+ box-sizing: border-box;
94
+ }
95
+
96
+ .squisq-jf-input:focus,
97
+ .squisq-jf-textarea:focus,
98
+ .squisq-jf-select:focus {
99
+ border-color: var(--squisq-jsonform-primary);
100
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--squisq-jsonform-primary) 25%, transparent);
101
+ }
102
+
103
+ .squisq-jf-textarea {
104
+ min-height: 70px;
105
+ resize: vertical;
106
+ line-height: 1.45;
107
+ }
108
+
109
+ /* Number stepper: tight inline group. */
110
+ .squisq-jf-stepper {
111
+ display: inline-flex;
112
+ align-items: stretch;
113
+ border: 1px solid var(--squisq-jsonform-border);
114
+ border-radius: 6px;
115
+ overflow: hidden;
116
+ background: var(--squisq-jsonform-input-bg, var(--squisq-jsonform-bg));
117
+ }
118
+
119
+ .squisq-jf-stepper__input {
120
+ width: 80px;
121
+ padding: 6px 8px;
122
+ border: none;
123
+ background: transparent;
124
+ color: var(--squisq-jsonform-text);
125
+ font: inherit;
126
+ text-align: center;
127
+ outline: none;
128
+ }
129
+
130
+ .squisq-jf-stepper__btn {
131
+ background: transparent;
132
+ border: none;
133
+ color: var(--squisq-jsonform-muted);
134
+ padding: 0 10px;
135
+ cursor: pointer;
136
+ font: inherit;
137
+ }
138
+
139
+ .squisq-jf-stepper__btn:hover {
140
+ color: var(--squisq-jsonform-primary);
141
+ }
142
+
143
+ /* Slider */
144
+ .squisq-jf-slider-row {
145
+ display: flex;
146
+ align-items: center;
147
+ gap: 12px;
148
+ }
149
+
150
+ .squisq-jf-slider {
151
+ flex: 1;
152
+ accent-color: var(--squisq-jsonform-primary);
153
+ }
154
+
155
+ .squisq-jf-slider-readout {
156
+ font-family: var(--squisq-jsonform-mono-font, ui-monospace, Consolas, monospace);
157
+ min-width: 4ch;
158
+ text-align: right;
159
+ color: var(--squisq-jsonform-muted);
160
+ }
161
+
162
+ /* Toggle switch. Selector matches both `<button>` (ToggleEditor) and
163
+ `<label>` (CheckboxEditor) — buttons need explicit chrome resets or
164
+ the user agent paints them as opaque pills (the bright white shape
165
+ that doesn't match the surrounding theme). */
166
+ .squisq-jf-toggle {
167
+ display: inline-flex;
168
+ align-items: center;
169
+ gap: 8px;
170
+ cursor: pointer;
171
+ user-select: none;
172
+ background: transparent;
173
+ border: none;
174
+ padding: 0;
175
+ color: inherit;
176
+ font: inherit;
177
+ text-align: left;
178
+ }
179
+
180
+ .squisq-jf-toggle:disabled {
181
+ cursor: not-allowed;
182
+ }
183
+
184
+ .squisq-jf-toggle:focus-visible {
185
+ outline: 2px solid var(--squisq-jsonform-primary);
186
+ outline-offset: 2px;
187
+ border-radius: 4px;
188
+ }
189
+
190
+ .squisq-jf-toggle__track {
191
+ width: 36px;
192
+ height: 20px;
193
+ border-radius: 999px;
194
+ background: color-mix(in srgb, var(--squisq-jsonform-muted) 35%, transparent);
195
+ position: relative;
196
+ transition: background 150ms ease;
197
+ }
198
+
199
+ .squisq-jf-toggle__thumb {
200
+ position: absolute;
201
+ top: 2px;
202
+ left: 2px;
203
+ width: 16px;
204
+ height: 16px;
205
+ background: #fff;
206
+ border-radius: 50%;
207
+ transition: transform 150ms ease;
208
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
209
+ }
210
+
211
+ .squisq-jf-toggle--on .squisq-jf-toggle__track {
212
+ background: var(--squisq-jsonform-primary);
213
+ }
214
+
215
+ .squisq-jf-toggle--on .squisq-jf-toggle__thumb {
216
+ transform: translateX(16px);
217
+ }
218
+
219
+ .squisq-jf-toggle__label {
220
+ font-size: 0.9em;
221
+ }
222
+
223
+ /* Segmented */
224
+ .squisq-jf-segmented {
225
+ display: inline-flex;
226
+ border: 1px solid var(--squisq-jsonform-border);
227
+ border-radius: 999px;
228
+ overflow: hidden;
229
+ background: var(--squisq-jsonform-input-bg, var(--squisq-jsonform-bg));
230
+ }
231
+
232
+ .squisq-jf-segmented__btn {
233
+ border: none;
234
+ background: transparent;
235
+ color: var(--squisq-jsonform-text);
236
+ font: inherit;
237
+ padding: 6px 14px;
238
+ cursor: pointer;
239
+ transition:
240
+ background 100ms ease,
241
+ color 100ms ease;
242
+ }
243
+
244
+ .squisq-jf-segmented__btn--active {
245
+ background: var(--squisq-jsonform-primary);
246
+ color: #fff;
247
+ }
248
+
249
+ .squisq-jf-radio {
250
+ display: flex;
251
+ flex-direction: column;
252
+ gap: 4px;
253
+ }
254
+
255
+ .squisq-jf-radio__option {
256
+ display: flex;
257
+ gap: 8px;
258
+ align-items: baseline;
259
+ cursor: pointer;
260
+ }
261
+
262
+ /* Color picker */
263
+ .squisq-jf-color {
264
+ display: inline-flex;
265
+ align-items: center;
266
+ gap: 8px;
267
+ }
268
+
269
+ .squisq-jf-color__input {
270
+ width: 36px;
271
+ height: 28px;
272
+ border: 1px solid var(--squisq-jsonform-border);
273
+ border-radius: 6px;
274
+ padding: 0;
275
+ background: none;
276
+ cursor: pointer;
277
+ }
278
+
279
+ .squisq-jf-color__hex {
280
+ font-family: var(--squisq-jsonform-mono-font, ui-monospace, Consolas, monospace);
281
+ font-size: 0.9em;
282
+ width: 8ch;
283
+ }
284
+
285
+ /* Chip bin */
286
+ .squisq-jf-chip-bin {
287
+ display: flex;
288
+ flex-wrap: wrap;
289
+ gap: 6px;
290
+ align-items: center;
291
+ }
292
+
293
+ .squisq-jf-chip {
294
+ display: inline-flex;
295
+ align-items: center;
296
+ gap: 4px;
297
+ padding: 3px 4px 3px 10px;
298
+ font-size: 0.85em;
299
+ background: color-mix(in srgb, var(--squisq-jsonform-primary) 16%, transparent);
300
+ color: var(--squisq-jsonform-text);
301
+ border-radius: 999px;
302
+ border: 1px solid color-mix(in srgb, var(--squisq-jsonform-primary) 30%, transparent);
303
+ }
304
+
305
+ .squisq-jf-chip__remove {
306
+ border: none;
307
+ background: transparent;
308
+ color: var(--squisq-jsonform-muted);
309
+ font-size: 1em;
310
+ line-height: 1;
311
+ cursor: pointer;
312
+ padding: 0 4px;
313
+ border-radius: 50%;
314
+ }
315
+
316
+ .squisq-jf-chip__remove:hover {
317
+ color: var(--squisq-jsonform-warning, #d4351c);
318
+ }
319
+
320
+ .squisq-jf-chip-bin__add-input {
321
+ flex: 1;
322
+ min-width: 100px;
323
+ border: none;
324
+ background: transparent;
325
+ color: var(--squisq-jsonform-text);
326
+ font: inherit;
327
+ outline: none;
328
+ padding: 4px;
329
+ }
330
+
331
+ /* Card stack */
332
+ .squisq-jf-card-stack {
333
+ display: flex;
334
+ flex-direction: column;
335
+ gap: 10px;
336
+ }
337
+
338
+ .squisq-jf-card {
339
+ background: color-mix(in srgb, var(--squisq-jsonform-bg) 95%, var(--squisq-jsonform-text) 5%);
340
+ border: 1px solid var(--squisq-jsonform-border);
341
+ border-radius: var(--squisq-jsonform-radius, 6px);
342
+ padding: 12px 14px;
343
+ display: flex;
344
+ flex-direction: column;
345
+ gap: 8px;
346
+ }
347
+
348
+ .squisq-jf-card__header {
349
+ display: flex;
350
+ align-items: center;
351
+ gap: 8px;
352
+ }
353
+
354
+ .squisq-jf-card__title {
355
+ font-family: var(--squisq-jsonform-title-font, inherit);
356
+ font-weight: 600;
357
+ font-size: 0.95em;
358
+ color: var(--squisq-jsonform-text);
359
+ margin: 0;
360
+ flex: 1;
361
+ }
362
+
363
+ .squisq-jf-card__actions {
364
+ display: flex;
365
+ gap: 4px;
366
+ }
367
+
368
+ .squisq-jf-icon-btn {
369
+ border: none;
370
+ background: transparent;
371
+ color: var(--squisq-jsonform-muted);
372
+ width: 28px;
373
+ height: 28px;
374
+ border-radius: 4px;
375
+ cursor: pointer;
376
+ font-size: 1em;
377
+ display: inline-flex;
378
+ align-items: center;
379
+ justify-content: center;
380
+ }
381
+
382
+ .squisq-jf-icon-btn:hover {
383
+ background: color-mix(in srgb, var(--squisq-jsonform-text) 8%, transparent);
384
+ }
385
+
386
+ .squisq-jf-icon-btn--danger:hover {
387
+ color: var(--squisq-jsonform-warning, #d4351c);
388
+ }
389
+
390
+ .squisq-jf-add-btn {
391
+ align-self: flex-start;
392
+ padding: 6px 12px;
393
+ border: 1px dashed var(--squisq-jsonform-border);
394
+ background: transparent;
395
+ color: var(--squisq-jsonform-muted);
396
+ border-radius: 6px;
397
+ cursor: pointer;
398
+ font: inherit;
399
+ font-size: 0.9em;
400
+ }
401
+
402
+ .squisq-jf-add-btn:hover {
403
+ color: var(--squisq-jsonform-primary);
404
+ border-color: var(--squisq-jsonform-primary);
405
+ }
406
+
407
+ .squisq-jf-tabs__strip {
408
+ display: flex;
409
+ gap: 4px;
410
+ border-bottom: 1px solid var(--squisq-jsonform-border);
411
+ margin-bottom: 8px;
412
+ }
413
+
414
+ .squisq-jf-tabs__tab {
415
+ padding: 6px 12px;
416
+ border: none;
417
+ background: transparent;
418
+ color: var(--squisq-jsonform-muted);
419
+ font: inherit;
420
+ cursor: pointer;
421
+ border-bottom: 2px solid transparent;
422
+ }
423
+
424
+ .squisq-jf-tabs__tab--active {
425
+ color: var(--squisq-jsonform-text);
426
+ border-bottom-color: var(--squisq-jsonform-primary);
427
+ }
428
+
429
+ /* Embedded rich text editor */
430
+ .squisq-jf-richtext {
431
+ border: 1px solid var(--squisq-jsonform-border);
432
+ border-radius: 6px;
433
+ padding: 8px 12px;
434
+ background: var(--squisq-jsonform-input-bg, var(--squisq-jsonform-bg));
435
+ min-height: 110px;
436
+ }
437
+
438
+ .squisq-jf-richtext .ProseMirror {
439
+ outline: none;
440
+ min-height: 90px;
441
+ font-family: var(--squisq-jsonform-body-font, inherit);
442
+ color: var(--squisq-jsonform-text);
443
+ line-height: 1.5;
444
+ }
445
+
446
+ .squisq-jf-richtext .ProseMirror p {
447
+ margin: 0.4em 0;
448
+ }
449
+
450
+ .squisq-jf-richtext .ProseMirror h1,
451
+ .squisq-jf-richtext .ProseMirror h2,
452
+ .squisq-jf-richtext .ProseMirror h3 {
453
+ font-family: var(--squisq-jsonform-title-font, inherit);
454
+ margin: 0.5em 0 0.3em;
455
+ font-weight: 600;
456
+ }
457
+
458
+ .squisq-jf-richtext .ProseMirror code {
459
+ font-family: var(--squisq-jsonform-mono-font, ui-monospace, Consolas, monospace);
460
+ background: color-mix(in srgb, var(--squisq-jsonform-text) 10%, transparent);
461
+ padding: 1px 4px;
462
+ border-radius: 3px;
463
+ }
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Derive the CSS custom-property bag for `<JsonEditor>` from a Theme +
3
+ * Surface. Mirrors the JsonView token hook in the react package, but
4
+ * uses an editor-specific prefix so the two can coexist on a page.
5
+ */
6
+
7
+ import { useMemo } from 'react';
8
+ import type { CSSProperties } from 'react';
9
+ import {
10
+ applySurface,
11
+ resolveFontFamily,
12
+ type SurfaceScheme,
13
+ type Theme,
14
+ DEFAULT_THEME,
15
+ DARK_SURFACE,
16
+ LIGHT_SURFACE,
17
+ } from '@bendyline/squisq/schemas';
18
+
19
+ export interface JsonEditorTokens {
20
+ style: CSSProperties;
21
+ theme: Theme;
22
+ }
23
+
24
+ export function useJsonEditorTokens(
25
+ theme: Theme | undefined,
26
+ surface: SurfaceScheme | 'auto' | undefined,
27
+ ): JsonEditorTokens {
28
+ return useMemo(() => {
29
+ const baseTheme = theme ?? DEFAULT_THEME;
30
+ const resolvedSurface =
31
+ surface === 'auto'
32
+ ? typeof window !== 'undefined' &&
33
+ window.matchMedia?.('(prefers-color-scheme: dark)').matches
34
+ ? DARK_SURFACE
35
+ : LIGHT_SURFACE
36
+ : (surface ?? undefined);
37
+ const finalTheme = resolvedSurface ? applySurface(baseTheme, resolvedSurface) : baseTheme;
38
+
39
+ const titleFont = resolveFontFamily(finalTheme.typography.titleFont, 'system-ui, sans-serif');
40
+ const bodyFont = resolveFontFamily(finalTheme.typography.bodyFont, 'system-ui, sans-serif');
41
+ const monoFont = resolveFontFamily(
42
+ finalTheme.typography.monoFont,
43
+ 'ui-monospace, Consolas, monospace',
44
+ );
45
+
46
+ const style: CSSProperties = {
47
+ ['--squisq-jsonform-bg' as string]: finalTheme.colors.background,
48
+ ['--squisq-jsonform-text' as string]: finalTheme.colors.text,
49
+ ['--squisq-jsonform-muted' as string]: finalTheme.colors.textMuted,
50
+ ['--squisq-jsonform-primary' as string]: finalTheme.colors.primary,
51
+ ['--squisq-jsonform-accent' as string]: finalTheme.colors.secondary,
52
+ ['--squisq-jsonform-warning' as string]: finalTheme.colors.warning,
53
+ ['--squisq-jsonform-border' as string]: `color-mix(in srgb, ${finalTheme.colors.textMuted} 35%, transparent)`,
54
+ ['--squisq-jsonform-input-bg' as string]: finalTheme.colors.backgroundLight,
55
+ ['--squisq-jsonform-title-font' as string]: titleFont,
56
+ ['--squisq-jsonform-body-font' as string]: bodyFont,
57
+ ['--squisq-jsonform-mono-font' as string]: monoFont,
58
+ ['--squisq-jsonform-radius' as string]: `${finalTheme.style.borderRadius ?? 8}px`,
59
+ };
60
+
61
+ return { style, theme: finalTheme };
62
+ }, [theme, surface]);
63
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * RecorderButton — drop-in button that opens the {@link RecorderModal}
3
+ * in a portal anchored to `document.body`. Convenience wrapper for
4
+ * hosts that don't need to manage modal open/close state themselves.
5
+ *
6
+ * Mirrors the consumption pattern of `VideoExportButton` in
7
+ * `@bendyline/squisq-video-react`.
8
+ */
9
+
10
+ import { useCallback, useState, type CSSProperties } from 'react';
11
+ import { createPortal } from 'react-dom';
12
+ import type { MediaProvider } from '@bendyline/squisq/schemas';
13
+ import type { ContentContainer } from '@bendyline/squisq/storage';
14
+ import { RecorderModal, type RecorderSaveResult } from './RecorderModal.js';
15
+ import type { RecorderSource } from './hooks/useMediaRecorder.js';
16
+
17
+ export interface RecorderButtonProps {
18
+ /** Where to write the resulting recording. Required. */
19
+ mediaProvider: MediaProvider;
20
+ /** Optional container for narration `.timing.json` sidecar writes. */
21
+ container?: ContentContainer | null;
22
+ /** Initial capture source. Defaults to `'mic'`. */
23
+ initialMode?: RecorderSource;
24
+ /** Fired after a successful save. */
25
+ onSave?: (result: RecorderSaveResult) => void;
26
+ /** Button label. Defaults to `'Record'`. */
27
+ label?: string;
28
+ /** Optional inline button styles. */
29
+ style?: CSSProperties;
30
+ /** Whether the button is disabled. */
31
+ disabled?: boolean;
32
+ }
33
+
34
+ export function RecorderButton({
35
+ mediaProvider,
36
+ container = null,
37
+ initialMode = 'mic',
38
+ onSave,
39
+ label = 'Record',
40
+ style,
41
+ disabled,
42
+ }: RecorderButtonProps) {
43
+ const [open, setOpen] = useState(false);
44
+ const handleOpen = useCallback(() => setOpen(true), []);
45
+ const handleClose = useCallback(() => setOpen(false), []);
46
+ const handleSave = useCallback(
47
+ (result: RecorderSaveResult) => {
48
+ onSave?.(result);
49
+ },
50
+ [onSave],
51
+ );
52
+
53
+ return (
54
+ <>
55
+ <button type="button" onClick={handleOpen} style={style} disabled={disabled}>
56
+ {label}
57
+ </button>
58
+ {open &&
59
+ typeof document !== 'undefined' &&
60
+ createPortal(
61
+ <RecorderModal
62
+ mediaProvider={mediaProvider}
63
+ container={container}
64
+ initialMode={initialMode}
65
+ onClose={handleClose}
66
+ onSave={handleSave}
67
+ />,
68
+ document.body,
69
+ )}
70
+ </>
71
+ );
72
+ }