@multiplatform.one/rich-text 6.0.4 → 6.3.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 (649) hide show
  1. package/README.md +60 -0
  2. package/dist/cjs/RichEditor.cjs +84 -9
  3. package/dist/cjs/RichEditor.native.js +422 -35
  4. package/dist/cjs/RichEditor.native.js.map +1 -1
  5. package/dist/cjs/RichTextEditor/index.cjs +18 -2
  6. package/dist/cjs/RichTextEditor/index.native.js +18 -2
  7. package/dist/cjs/RichTextEditor/index.native.js.map +1 -1
  8. package/dist/cjs/constants.cjs +52 -29
  9. package/dist/cjs/constants.native.js +59 -29
  10. package/dist/cjs/constants.native.js.map +1 -1
  11. package/dist/cjs/editor/BlockDragHandle.cjs +22 -7
  12. package/dist/cjs/editor/BlockDragHandle.native.js +41 -7
  13. package/dist/cjs/editor/BlockDragHandle.native.js.map +1 -1
  14. package/dist/cjs/editor/SlashCommands.cjs +249 -293
  15. package/dist/cjs/editor/SlashCommands.native.js +306 -340
  16. package/dist/cjs/editor/SlashCommands.native.js.map +1 -1
  17. package/dist/cjs/editor/TentapEditor.native.js +44 -12
  18. package/dist/cjs/editor/TentapEditor.native.js.map +1 -1
  19. package/dist/cjs/editor/TiptapEditor.cjs +140 -33
  20. package/dist/cjs/editor/TiptapEditor.native.js +153 -33
  21. package/dist/cjs/editor/TiptapEditor.native.js.map +1 -1
  22. package/dist/cjs/editor/blockAnchor.cjs +43 -0
  23. package/dist/cjs/editor/blockAnchor.native.js +68 -0
  24. package/dist/cjs/editor/blockAnchor.native.js.map +1 -0
  25. package/dist/cjs/editor/codeBlockPreview.cjs +230 -0
  26. package/dist/cjs/editor/codeBlockPreview.native.js +265 -0
  27. package/dist/cjs/editor/codeBlockPreview.native.js.map +1 -0
  28. package/dist/cjs/editor/editorStyles.cjs +203 -34
  29. package/dist/cjs/editor/editorStyles.native.js +203 -34
  30. package/dist/cjs/editor/editorStyles.native.js.map +1 -1
  31. package/dist/cjs/editor/emoji.cjs +128 -0
  32. package/dist/cjs/editor/emoji.native.js +184 -0
  33. package/dist/cjs/editor/emoji.native.js.map +1 -0
  34. package/dist/cjs/editor/lazyKatex.cjs +78 -0
  35. package/dist/cjs/editor/lazyKatex.native.js +117 -0
  36. package/dist/cjs/editor/lazyKatex.native.js.map +1 -0
  37. package/dist/cjs/editor/markdown.cjs +216 -0
  38. package/dist/cjs/editor/markdown.native.js +278 -0
  39. package/dist/cjs/editor/markdown.native.js.map +1 -0
  40. package/dist/cjs/editor/mathematics.cjs +168 -0
  41. package/dist/cjs/editor/mathematics.native.js +202 -0
  42. package/dist/cjs/editor/mathematics.native.js.map +1 -0
  43. package/dist/cjs/editor/media.cjs +138 -0
  44. package/dist/cjs/editor/media.native.js +172 -0
  45. package/dist/cjs/editor/media.native.js.map +1 -0
  46. package/dist/cjs/editor/mentions.cjs +73 -0
  47. package/dist/cjs/editor/mentions.native.js +84 -0
  48. package/dist/cjs/editor/mentions.native.js.map +1 -0
  49. package/dist/cjs/editor/pasteCleanup.cjs +83 -0
  50. package/dist/cjs/editor/pasteCleanup.native.js +175 -0
  51. package/dist/cjs/editor/pasteCleanup.native.js.map +1 -0
  52. package/dist/cjs/editor/suggestionPopup.cjs +297 -0
  53. package/dist/cjs/editor/suggestionPopup.native.js +327 -0
  54. package/dist/cjs/editor/suggestionPopup.native.js.map +1 -0
  55. package/dist/cjs/preview.cjs +263 -0
  56. package/dist/cjs/preview.native.js +294 -0
  57. package/dist/cjs/preview.native.js.map +1 -0
  58. package/dist/cjs/shared/t.cjs +53 -0
  59. package/dist/cjs/shared/t.native.js +56 -0
  60. package/dist/cjs/shared/t.native.js.map +1 -0
  61. package/dist/cjs/shared/url.cjs +35 -0
  62. package/dist/cjs/shared/url.native.js +38 -0
  63. package/dist/cjs/shared/url.native.js.map +1 -0
  64. package/dist/cjs/styled.cjs +13 -6
  65. package/dist/cjs/styled.native.js +13 -6
  66. package/dist/cjs/styled.native.js.map +1 -1
  67. package/dist/cjs/toolbar/BubbleToolbar.cjs +10 -8
  68. package/dist/cjs/toolbar/BubbleToolbar.native.js +10 -8
  69. package/dist/cjs/toolbar/BubbleToolbar.native.js.map +1 -1
  70. package/dist/cjs/toolbar/CodeBlockBubble.cjs +59 -23
  71. package/dist/cjs/toolbar/CodeBlockBubble.native.js +71 -25
  72. package/dist/cjs/toolbar/CodeBlockBubble.native.js.map +1 -1
  73. package/dist/cjs/toolbar/ColorPicker.cjs +19 -54
  74. package/dist/cjs/toolbar/ColorPicker.native.js +81 -179
  75. package/dist/cjs/toolbar/ColorPicker.native.js.map +1 -1
  76. package/dist/cjs/toolbar/FixedToolbar.cjs +33 -10
  77. package/dist/cjs/toolbar/FixedToolbar.native.js +46 -54
  78. package/dist/cjs/toolbar/FixedToolbar.native.js.map +1 -1
  79. package/dist/cjs/toolbar/HeadingPicker.cjs +32 -39
  80. package/dist/cjs/toolbar/HeadingPicker.native.js +61 -51
  81. package/dist/cjs/toolbar/HeadingPicker.native.js.map +1 -1
  82. package/dist/cjs/toolbar/ImageBubble.cjs +20 -43
  83. package/dist/cjs/toolbar/ImageBubble.native.js +20 -43
  84. package/dist/cjs/toolbar/ImageBubble.native.js.map +1 -1
  85. package/dist/cjs/toolbar/ImageDialog.cjs +5 -4
  86. package/dist/cjs/toolbar/ImageDialog.native.js +76 -65
  87. package/dist/cjs/toolbar/ImageDialog.native.js.map +1 -1
  88. package/dist/cjs/toolbar/LinkBubble.cjs +23 -70
  89. package/dist/cjs/toolbar/LinkBubble.native.js +23 -70
  90. package/dist/cjs/toolbar/LinkBubble.native.js.map +1 -1
  91. package/dist/cjs/toolbar/LinkDialog.cjs +19 -18
  92. package/dist/cjs/toolbar/LinkDialog.native.js +86 -83
  93. package/dist/cjs/toolbar/LinkDialog.native.js.map +1 -1
  94. package/dist/cjs/toolbar/ListPicker.cjs +32 -43
  95. package/dist/cjs/toolbar/ListPicker.native.js +43 -44
  96. package/dist/cjs/toolbar/ListPicker.native.js.map +1 -1
  97. package/dist/cjs/toolbar/MathBubble.cjs +159 -0
  98. package/dist/cjs/toolbar/MathBubble.native.js +169 -0
  99. package/dist/cjs/toolbar/MathBubble.native.js.map +1 -0
  100. package/dist/cjs/toolbar/MoreDropdown.cjs +51 -98
  101. package/dist/cjs/toolbar/MoreDropdown.native.js +73 -98
  102. package/dist/cjs/toolbar/MoreDropdown.native.js.map +1 -1
  103. package/dist/cjs/toolbar/StatusBar.cjs +19 -10
  104. package/dist/cjs/toolbar/StatusBar.native.js +19 -10
  105. package/dist/cjs/toolbar/StatusBar.native.js.map +1 -1
  106. package/dist/cjs/toolbar/TableBubble.cjs +77 -95
  107. package/dist/cjs/toolbar/TableBubble.native.js +73 -71
  108. package/dist/cjs/toolbar/TableBubble.native.js.map +1 -1
  109. package/dist/cjs/toolbar/ToolbarButton.cjs +86 -21
  110. package/dist/cjs/toolbar/ToolbarButton.native.js +14 -4
  111. package/dist/cjs/toolbar/ToolbarButton.native.js.map +1 -1
  112. package/dist/cjs/toolbar/icons.cjs +111 -468
  113. package/dist/cjs/toolbar/shortcuts.cjs +73 -24
  114. package/dist/cjs/toolbar/shortcuts.native.js +73 -24
  115. package/dist/cjs/toolbar/shortcuts.native.js.map +1 -1
  116. package/dist/cjs/toolbar/useHorizontalScroll.cjs +25 -5
  117. package/dist/cjs/toolbar/useHorizontalScroll.native.js +25 -5
  118. package/dist/cjs/toolbar/useHorizontalScroll.native.js.map +1 -1
  119. package/dist/cjs/toolbar/useRovingFocus.cjs +80 -0
  120. package/dist/cjs/toolbar/useRovingFocus.native.js +113 -0
  121. package/dist/cjs/toolbar/useRovingFocus.native.js.map +1 -0
  122. package/dist/cjs/types.native.js.map +1 -1
  123. package/dist/esm/RichEditor.mjs +85 -10
  124. package/dist/esm/RichEditor.mjs.map +1 -1
  125. package/dist/esm/RichEditor.native.js +425 -38
  126. package/dist/esm/RichEditor.native.js.map +1 -1
  127. package/dist/esm/RichTextEditor/index.mjs +18 -2
  128. package/dist/esm/RichTextEditor/index.mjs.map +1 -1
  129. package/dist/esm/RichTextEditor/index.native.js +18 -2
  130. package/dist/esm/RichTextEditor/index.native.js.map +1 -1
  131. package/dist/esm/constants.mjs +47 -29
  132. package/dist/esm/constants.mjs.map +1 -1
  133. package/dist/esm/constants.native.js +54 -29
  134. package/dist/esm/constants.native.js.map +1 -1
  135. package/dist/esm/editor/BlockDragHandle.mjs +22 -7
  136. package/dist/esm/editor/BlockDragHandle.mjs.map +1 -1
  137. package/dist/esm/editor/BlockDragHandle.native.js +41 -7
  138. package/dist/esm/editor/BlockDragHandle.native.js.map +1 -1
  139. package/dist/esm/editor/SlashCommands.mjs +250 -294
  140. package/dist/esm/editor/SlashCommands.mjs.map +1 -1
  141. package/dist/esm/editor/SlashCommands.native.js +307 -341
  142. package/dist/esm/editor/SlashCommands.native.js.map +1 -1
  143. package/dist/esm/editor/TentapEditor.native.js +45 -13
  144. package/dist/esm/editor/TentapEditor.native.js.map +1 -1
  145. package/dist/esm/editor/TiptapEditor.mjs +142 -35
  146. package/dist/esm/editor/TiptapEditor.mjs.map +1 -1
  147. package/dist/esm/editor/TiptapEditor.native.js +155 -35
  148. package/dist/esm/editor/TiptapEditor.native.js.map +1 -1
  149. package/dist/esm/editor/blockAnchor.mjs +18 -0
  150. package/dist/esm/editor/blockAnchor.mjs.map +1 -0
  151. package/dist/esm/editor/blockAnchor.native.js +40 -0
  152. package/dist/esm/editor/blockAnchor.native.js.map +1 -0
  153. package/dist/esm/editor/codeBlockPreview.mjs +190 -0
  154. package/dist/esm/editor/codeBlockPreview.mjs.map +1 -0
  155. package/dist/esm/editor/codeBlockPreview.native.js +222 -0
  156. package/dist/esm/editor/codeBlockPreview.native.js.map +1 -0
  157. package/dist/esm/editor/editorStyles.mjs +203 -34
  158. package/dist/esm/editor/editorStyles.mjs.map +1 -1
  159. package/dist/esm/editor/editorStyles.native.js +203 -34
  160. package/dist/esm/editor/editorStyles.native.js.map +1 -1
  161. package/dist/esm/editor/emoji.mjs +88 -0
  162. package/dist/esm/editor/emoji.mjs.map +1 -0
  163. package/dist/esm/editor/emoji.native.js +141 -0
  164. package/dist/esm/editor/emoji.native.js.map +1 -0
  165. package/dist/esm/editor/lazyKatex.mjs +40 -0
  166. package/dist/esm/editor/lazyKatex.mjs.map +1 -0
  167. package/dist/esm/editor/lazyKatex.native.js +76 -0
  168. package/dist/esm/editor/lazyKatex.native.js.map +1 -0
  169. package/dist/esm/editor/markdown.mjs +179 -0
  170. package/dist/esm/editor/markdown.mjs.map +1 -0
  171. package/dist/esm/editor/markdown.native.js +238 -0
  172. package/dist/esm/editor/markdown.native.js.map +1 -0
  173. package/dist/esm/editor/mathematics.mjs +142 -0
  174. package/dist/esm/editor/mathematics.mjs.map +1 -0
  175. package/dist/esm/editor/mathematics.native.js +173 -0
  176. package/dist/esm/editor/mathematics.native.js.map +1 -0
  177. package/dist/esm/editor/media.mjs +113 -0
  178. package/dist/esm/editor/media.mjs.map +1 -0
  179. package/dist/esm/editor/media.native.js +144 -0
  180. package/dist/esm/editor/media.native.js.map +1 -0
  181. package/dist/esm/editor/mentions.mjs +37 -0
  182. package/dist/esm/editor/mentions.mjs.map +1 -0
  183. package/dist/esm/editor/mentions.native.js +45 -0
  184. package/dist/esm/editor/mentions.native.js.map +1 -0
  185. package/dist/esm/editor/pasteCleanup.mjs +57 -0
  186. package/dist/esm/editor/pasteCleanup.mjs.map +1 -0
  187. package/dist/esm/editor/pasteCleanup.native.js +146 -0
  188. package/dist/esm/editor/pasteCleanup.native.js.map +1 -0
  189. package/dist/esm/editor/suggestionPopup.mjs +268 -0
  190. package/dist/esm/editor/suggestionPopup.mjs.map +1 -0
  191. package/dist/esm/editor/suggestionPopup.native.js +295 -0
  192. package/dist/esm/editor/suggestionPopup.native.js.map +1 -0
  193. package/dist/esm/preview.mjs +236 -0
  194. package/dist/esm/preview.mjs.map +1 -0
  195. package/dist/esm/preview.native.js +264 -0
  196. package/dist/esm/preview.native.js.map +1 -0
  197. package/dist/esm/shared/t.mjs +17 -0
  198. package/dist/esm/shared/t.mjs.map +1 -0
  199. package/dist/esm/shared/t.native.js +17 -0
  200. package/dist/esm/shared/t.native.js.map +1 -0
  201. package/dist/esm/shared/url.mjs +10 -0
  202. package/dist/esm/shared/url.mjs.map +1 -0
  203. package/dist/esm/shared/url.native.js +10 -0
  204. package/dist/esm/shared/url.native.js.map +1 -0
  205. package/dist/esm/styled.mjs +13 -6
  206. package/dist/esm/styled.mjs.map +1 -1
  207. package/dist/esm/styled.native.js +13 -6
  208. package/dist/esm/styled.native.js.map +1 -1
  209. package/dist/esm/toolbar/BubbleToolbar.mjs +11 -9
  210. package/dist/esm/toolbar/BubbleToolbar.mjs.map +1 -1
  211. package/dist/esm/toolbar/BubbleToolbar.native.js +11 -9
  212. package/dist/esm/toolbar/BubbleToolbar.native.js.map +1 -1
  213. package/dist/esm/toolbar/CodeBlockBubble.mjs +60 -24
  214. package/dist/esm/toolbar/CodeBlockBubble.mjs.map +1 -1
  215. package/dist/esm/toolbar/CodeBlockBubble.native.js +72 -26
  216. package/dist/esm/toolbar/CodeBlockBubble.native.js.map +1 -1
  217. package/dist/esm/toolbar/ColorPicker.mjs +21 -56
  218. package/dist/esm/toolbar/ColorPicker.mjs.map +1 -1
  219. package/dist/esm/toolbar/ColorPicker.native.js +82 -180
  220. package/dist/esm/toolbar/ColorPicker.native.js.map +1 -1
  221. package/dist/esm/toolbar/FixedToolbar.mjs +34 -11
  222. package/dist/esm/toolbar/FixedToolbar.mjs.map +1 -1
  223. package/dist/esm/toolbar/FixedToolbar.native.js +47 -55
  224. package/dist/esm/toolbar/FixedToolbar.native.js.map +1 -1
  225. package/dist/esm/toolbar/HeadingPicker.mjs +34 -41
  226. package/dist/esm/toolbar/HeadingPicker.mjs.map +1 -1
  227. package/dist/esm/toolbar/HeadingPicker.native.js +63 -53
  228. package/dist/esm/toolbar/HeadingPicker.native.js.map +1 -1
  229. package/dist/esm/toolbar/ImageBubble.mjs +20 -43
  230. package/dist/esm/toolbar/ImageBubble.mjs.map +1 -1
  231. package/dist/esm/toolbar/ImageBubble.native.js +20 -43
  232. package/dist/esm/toolbar/ImageBubble.native.js.map +1 -1
  233. package/dist/esm/toolbar/ImageDialog.mjs +5 -4
  234. package/dist/esm/toolbar/ImageDialog.mjs.map +1 -1
  235. package/dist/esm/toolbar/ImageDialog.native.js +75 -64
  236. package/dist/esm/toolbar/ImageDialog.native.js.map +1 -1
  237. package/dist/esm/toolbar/LinkBubble.mjs +23 -70
  238. package/dist/esm/toolbar/LinkBubble.mjs.map +1 -1
  239. package/dist/esm/toolbar/LinkBubble.native.js +23 -70
  240. package/dist/esm/toolbar/LinkBubble.native.js.map +1 -1
  241. package/dist/esm/toolbar/LinkDialog.mjs +17 -16
  242. package/dist/esm/toolbar/LinkDialog.mjs.map +1 -1
  243. package/dist/esm/toolbar/LinkDialog.native.js +84 -80
  244. package/dist/esm/toolbar/LinkDialog.native.js.map +1 -1
  245. package/dist/esm/toolbar/ListPicker.mjs +33 -44
  246. package/dist/esm/toolbar/ListPicker.mjs.map +1 -1
  247. package/dist/esm/toolbar/ListPicker.native.js +44 -45
  248. package/dist/esm/toolbar/ListPicker.native.js.map +1 -1
  249. package/dist/esm/toolbar/MathBubble.mjs +134 -0
  250. package/dist/esm/toolbar/MathBubble.mjs.map +1 -0
  251. package/dist/esm/toolbar/MathBubble.native.js +141 -0
  252. package/dist/esm/toolbar/MathBubble.native.js.map +1 -0
  253. package/dist/esm/toolbar/MoreDropdown.mjs +50 -97
  254. package/dist/esm/toolbar/MoreDropdown.mjs.map +1 -1
  255. package/dist/esm/toolbar/MoreDropdown.native.js +72 -97
  256. package/dist/esm/toolbar/MoreDropdown.native.js.map +1 -1
  257. package/dist/esm/toolbar/StatusBar.mjs +19 -10
  258. package/dist/esm/toolbar/StatusBar.mjs.map +1 -1
  259. package/dist/esm/toolbar/StatusBar.native.js +19 -10
  260. package/dist/esm/toolbar/StatusBar.native.js.map +1 -1
  261. package/dist/esm/toolbar/TableBubble.mjs +77 -95
  262. package/dist/esm/toolbar/TableBubble.mjs.map +1 -1
  263. package/dist/esm/toolbar/TableBubble.native.js +73 -71
  264. package/dist/esm/toolbar/TableBubble.native.js.map +1 -1
  265. package/dist/esm/toolbar/ToolbarButton.mjs +87 -22
  266. package/dist/esm/toolbar/ToolbarButton.mjs.map +1 -1
  267. package/dist/esm/toolbar/ToolbarButton.native.js +14 -4
  268. package/dist/esm/toolbar/ToolbarButton.native.js.map +1 -1
  269. package/dist/esm/toolbar/icons.mjs +109 -469
  270. package/dist/esm/toolbar/icons.mjs.map +1 -1
  271. package/dist/esm/toolbar/shortcuts.mjs +73 -24
  272. package/dist/esm/toolbar/shortcuts.mjs.map +1 -1
  273. package/dist/esm/toolbar/shortcuts.native.js +73 -24
  274. package/dist/esm/toolbar/shortcuts.native.js.map +1 -1
  275. package/dist/esm/toolbar/useHorizontalScroll.mjs +25 -6
  276. package/dist/esm/toolbar/useHorizontalScroll.mjs.map +1 -1
  277. package/dist/esm/toolbar/useHorizontalScroll.native.js +25 -6
  278. package/dist/esm/toolbar/useHorizontalScroll.native.js.map +1 -1
  279. package/dist/esm/toolbar/useRovingFocus.mjs +55 -0
  280. package/dist/esm/toolbar/useRovingFocus.mjs.map +1 -0
  281. package/dist/esm/toolbar/useRovingFocus.native.js +85 -0
  282. package/dist/esm/toolbar/useRovingFocus.native.js.map +1 -0
  283. package/dist/esm/types.mjs.map +1 -1
  284. package/dist/esm/types.native.js.map +1 -1
  285. package/dist/jsx/RichEditor.mjs +85 -10
  286. package/dist/jsx/RichEditor.mjs.map +1 -1
  287. package/dist/jsx/RichEditor.native.js +422 -35
  288. package/dist/jsx/RichEditor.native.js.map +1 -1
  289. package/dist/jsx/RichTextEditor/index.mjs +18 -2
  290. package/dist/jsx/RichTextEditor/index.mjs.map +1 -1
  291. package/dist/jsx/RichTextEditor/index.native.js +18 -2
  292. package/dist/jsx/RichTextEditor/index.native.js.map +1 -1
  293. package/dist/jsx/constants.mjs +47 -29
  294. package/dist/jsx/constants.mjs.map +1 -1
  295. package/dist/jsx/constants.native.js +59 -29
  296. package/dist/jsx/constants.native.js.map +1 -1
  297. package/dist/jsx/editor/BlockDragHandle.mjs +22 -7
  298. package/dist/jsx/editor/BlockDragHandle.mjs.map +1 -1
  299. package/dist/jsx/editor/BlockDragHandle.native.js +41 -7
  300. package/dist/jsx/editor/BlockDragHandle.native.js.map +1 -1
  301. package/dist/jsx/editor/SlashCommands.mjs +250 -294
  302. package/dist/jsx/editor/SlashCommands.mjs.map +1 -1
  303. package/dist/jsx/editor/SlashCommands.native.js +306 -340
  304. package/dist/jsx/editor/SlashCommands.native.js.map +1 -1
  305. package/dist/jsx/editor/TentapEditor.native.js +44 -12
  306. package/dist/jsx/editor/TentapEditor.native.js.map +1 -1
  307. package/dist/jsx/editor/TiptapEditor.mjs +142 -35
  308. package/dist/jsx/editor/TiptapEditor.mjs.map +1 -1
  309. package/dist/jsx/editor/TiptapEditor.native.js +153 -33
  310. package/dist/jsx/editor/TiptapEditor.native.js.map +1 -1
  311. package/dist/jsx/editor/blockAnchor.mjs +18 -0
  312. package/dist/jsx/editor/blockAnchor.mjs.map +1 -0
  313. package/dist/jsx/editor/blockAnchor.native.js +68 -0
  314. package/dist/jsx/editor/blockAnchor.native.js.map +1 -0
  315. package/dist/jsx/editor/codeBlockPreview.mjs +190 -0
  316. package/dist/jsx/editor/codeBlockPreview.mjs.map +1 -0
  317. package/dist/jsx/editor/codeBlockPreview.native.js +265 -0
  318. package/dist/jsx/editor/codeBlockPreview.native.js.map +1 -0
  319. package/dist/jsx/editor/editorStyles.mjs +203 -34
  320. package/dist/jsx/editor/editorStyles.mjs.map +1 -1
  321. package/dist/jsx/editor/editorStyles.native.js +203 -34
  322. package/dist/jsx/editor/editorStyles.native.js.map +1 -1
  323. package/dist/jsx/editor/emoji.mjs +88 -0
  324. package/dist/jsx/editor/emoji.mjs.map +1 -0
  325. package/dist/jsx/editor/emoji.native.js +184 -0
  326. package/dist/jsx/editor/emoji.native.js.map +1 -0
  327. package/dist/jsx/editor/lazyKatex.mjs +40 -0
  328. package/dist/jsx/editor/lazyKatex.mjs.map +1 -0
  329. package/dist/jsx/editor/lazyKatex.native.js +117 -0
  330. package/dist/jsx/editor/lazyKatex.native.js.map +1 -0
  331. package/dist/jsx/editor/markdown.mjs +179 -0
  332. package/dist/jsx/editor/markdown.mjs.map +1 -0
  333. package/dist/jsx/editor/markdown.native.js +278 -0
  334. package/dist/jsx/editor/markdown.native.js.map +1 -0
  335. package/dist/jsx/editor/mathematics.mjs +142 -0
  336. package/dist/jsx/editor/mathematics.mjs.map +1 -0
  337. package/dist/jsx/editor/mathematics.native.js +202 -0
  338. package/dist/jsx/editor/mathematics.native.js.map +1 -0
  339. package/dist/jsx/editor/media.mjs +113 -0
  340. package/dist/jsx/editor/media.mjs.map +1 -0
  341. package/dist/jsx/editor/media.native.js +172 -0
  342. package/dist/jsx/editor/media.native.js.map +1 -0
  343. package/dist/jsx/editor/mentions.mjs +37 -0
  344. package/dist/jsx/editor/mentions.mjs.map +1 -0
  345. package/dist/jsx/editor/mentions.native.js +84 -0
  346. package/dist/jsx/editor/mentions.native.js.map +1 -0
  347. package/dist/jsx/editor/pasteCleanup.mjs +57 -0
  348. package/dist/jsx/editor/pasteCleanup.mjs.map +1 -0
  349. package/dist/jsx/editor/pasteCleanup.native.js +175 -0
  350. package/dist/jsx/editor/pasteCleanup.native.js.map +1 -0
  351. package/dist/jsx/editor/suggestionPopup.mjs +268 -0
  352. package/dist/jsx/editor/suggestionPopup.mjs.map +1 -0
  353. package/dist/jsx/editor/suggestionPopup.native.js +327 -0
  354. package/dist/jsx/editor/suggestionPopup.native.js.map +1 -0
  355. package/dist/jsx/preview.mjs +236 -0
  356. package/dist/jsx/preview.mjs.map +1 -0
  357. package/dist/jsx/preview.native.js +294 -0
  358. package/dist/jsx/preview.native.js.map +1 -0
  359. package/dist/jsx/shared/t.mjs +17 -0
  360. package/dist/jsx/shared/t.mjs.map +1 -0
  361. package/dist/jsx/shared/t.native.js +56 -0
  362. package/dist/jsx/shared/t.native.js.map +1 -0
  363. package/dist/jsx/shared/url.mjs +10 -0
  364. package/dist/jsx/shared/url.mjs.map +1 -0
  365. package/dist/jsx/shared/url.native.js +38 -0
  366. package/dist/jsx/shared/url.native.js.map +1 -0
  367. package/dist/jsx/styled.mjs +13 -6
  368. package/dist/jsx/styled.mjs.map +1 -1
  369. package/dist/jsx/styled.native.js +13 -6
  370. package/dist/jsx/styled.native.js.map +1 -1
  371. package/dist/jsx/toolbar/BubbleToolbar.mjs +11 -9
  372. package/dist/jsx/toolbar/BubbleToolbar.mjs.map +1 -1
  373. package/dist/jsx/toolbar/BubbleToolbar.native.js +10 -8
  374. package/dist/jsx/toolbar/BubbleToolbar.native.js.map +1 -1
  375. package/dist/jsx/toolbar/CodeBlockBubble.mjs +60 -24
  376. package/dist/jsx/toolbar/CodeBlockBubble.mjs.map +1 -1
  377. package/dist/jsx/toolbar/CodeBlockBubble.native.js +71 -25
  378. package/dist/jsx/toolbar/CodeBlockBubble.native.js.map +1 -1
  379. package/dist/jsx/toolbar/ColorPicker.mjs +21 -56
  380. package/dist/jsx/toolbar/ColorPicker.mjs.map +1 -1
  381. package/dist/jsx/toolbar/ColorPicker.native.js +81 -179
  382. package/dist/jsx/toolbar/ColorPicker.native.js.map +1 -1
  383. package/dist/jsx/toolbar/FixedToolbar.mjs +34 -11
  384. package/dist/jsx/toolbar/FixedToolbar.mjs.map +1 -1
  385. package/dist/jsx/toolbar/FixedToolbar.native.js +46 -54
  386. package/dist/jsx/toolbar/FixedToolbar.native.js.map +1 -1
  387. package/dist/jsx/toolbar/HeadingPicker.mjs +34 -41
  388. package/dist/jsx/toolbar/HeadingPicker.mjs.map +1 -1
  389. package/dist/jsx/toolbar/HeadingPicker.native.js +61 -51
  390. package/dist/jsx/toolbar/HeadingPicker.native.js.map +1 -1
  391. package/dist/jsx/toolbar/ImageBubble.mjs +20 -43
  392. package/dist/jsx/toolbar/ImageBubble.mjs.map +1 -1
  393. package/dist/jsx/toolbar/ImageBubble.native.js +20 -43
  394. package/dist/jsx/toolbar/ImageBubble.native.js.map +1 -1
  395. package/dist/jsx/toolbar/ImageDialog.mjs +5 -4
  396. package/dist/jsx/toolbar/ImageDialog.mjs.map +1 -1
  397. package/dist/jsx/toolbar/ImageDialog.native.js +76 -65
  398. package/dist/jsx/toolbar/ImageDialog.native.js.map +1 -1
  399. package/dist/jsx/toolbar/LinkBubble.mjs +23 -70
  400. package/dist/jsx/toolbar/LinkBubble.mjs.map +1 -1
  401. package/dist/jsx/toolbar/LinkBubble.native.js +23 -70
  402. package/dist/jsx/toolbar/LinkBubble.native.js.map +1 -1
  403. package/dist/jsx/toolbar/LinkDialog.mjs +17 -16
  404. package/dist/jsx/toolbar/LinkDialog.mjs.map +1 -1
  405. package/dist/jsx/toolbar/LinkDialog.native.js +86 -83
  406. package/dist/jsx/toolbar/LinkDialog.native.js.map +1 -1
  407. package/dist/jsx/toolbar/ListPicker.mjs +33 -44
  408. package/dist/jsx/toolbar/ListPicker.mjs.map +1 -1
  409. package/dist/jsx/toolbar/ListPicker.native.js +43 -44
  410. package/dist/jsx/toolbar/ListPicker.native.js.map +1 -1
  411. package/dist/jsx/toolbar/MathBubble.mjs +134 -0
  412. package/dist/jsx/toolbar/MathBubble.mjs.map +1 -0
  413. package/dist/jsx/toolbar/MathBubble.native.js +169 -0
  414. package/dist/jsx/toolbar/MathBubble.native.js.map +1 -0
  415. package/dist/jsx/toolbar/MoreDropdown.mjs +50 -97
  416. package/dist/jsx/toolbar/MoreDropdown.mjs.map +1 -1
  417. package/dist/jsx/toolbar/MoreDropdown.native.js +73 -98
  418. package/dist/jsx/toolbar/MoreDropdown.native.js.map +1 -1
  419. package/dist/jsx/toolbar/StatusBar.mjs +19 -10
  420. package/dist/jsx/toolbar/StatusBar.mjs.map +1 -1
  421. package/dist/jsx/toolbar/StatusBar.native.js +19 -10
  422. package/dist/jsx/toolbar/StatusBar.native.js.map +1 -1
  423. package/dist/jsx/toolbar/TableBubble.mjs +77 -95
  424. package/dist/jsx/toolbar/TableBubble.mjs.map +1 -1
  425. package/dist/jsx/toolbar/TableBubble.native.js +73 -71
  426. package/dist/jsx/toolbar/TableBubble.native.js.map +1 -1
  427. package/dist/jsx/toolbar/ToolbarButton.mjs +87 -22
  428. package/dist/jsx/toolbar/ToolbarButton.mjs.map +1 -1
  429. package/dist/jsx/toolbar/ToolbarButton.native.js +14 -4
  430. package/dist/jsx/toolbar/ToolbarButton.native.js.map +1 -1
  431. package/dist/jsx/toolbar/icons.mjs +109 -469
  432. package/dist/jsx/toolbar/icons.mjs.map +1 -1
  433. package/dist/jsx/toolbar/shortcuts.mjs +73 -24
  434. package/dist/jsx/toolbar/shortcuts.mjs.map +1 -1
  435. package/dist/jsx/toolbar/shortcuts.native.js +73 -24
  436. package/dist/jsx/toolbar/shortcuts.native.js.map +1 -1
  437. package/dist/jsx/toolbar/useHorizontalScroll.mjs +25 -6
  438. package/dist/jsx/toolbar/useHorizontalScroll.mjs.map +1 -1
  439. package/dist/jsx/toolbar/useHorizontalScroll.native.js +25 -5
  440. package/dist/jsx/toolbar/useHorizontalScroll.native.js.map +1 -1
  441. package/dist/jsx/toolbar/useRovingFocus.mjs +55 -0
  442. package/dist/jsx/toolbar/useRovingFocus.mjs.map +1 -0
  443. package/dist/jsx/toolbar/useRovingFocus.native.js +113 -0
  444. package/dist/jsx/toolbar/useRovingFocus.native.js.map +1 -0
  445. package/dist/jsx/types.mjs.map +1 -1
  446. package/dist/jsx/types.native.js.map +1 -1
  447. package/package.json +28 -13
  448. package/src/RichEditor.native.tsx +451 -49
  449. package/src/RichEditor.stories.tsx +158 -0
  450. package/src/RichEditor.tsx +121 -7
  451. package/src/RichTextEditor/index.tsx +41 -3
  452. package/src/RichTextEditor/richTextEditor.spec.tsx +11 -4
  453. package/src/constants.ts +86 -24
  454. package/src/editor/BlockDragHandle.ts +30 -5
  455. package/src/editor/SlashCommands.tsx +228 -293
  456. package/src/editor/TentapEditor.native.tsx +68 -17
  457. package/src/editor/TiptapEditor.tsx +187 -22
  458. package/src/editor/blockAnchor.spec.ts +70 -0
  459. package/src/editor/blockAnchor.ts +42 -0
  460. package/src/editor/codeBlockPreview.spec.ts +144 -0
  461. package/src/editor/codeBlockPreview.ts +266 -0
  462. package/src/editor/css.d.ts +2 -0
  463. package/src/editor/details.spec.ts +48 -0
  464. package/src/editor/editorStyles.spec.ts +25 -0
  465. package/src/editor/editorStyles.ts +218 -34
  466. package/src/editor/emoji.spec.ts +88 -0
  467. package/src/editor/emoji.ts +147 -0
  468. package/src/editor/emojilib.d.ts +16 -0
  469. package/src/editor/lazyKatex.spec.ts +38 -0
  470. package/src/editor/lazyKatex.ts +68 -0
  471. package/src/editor/markdown.spec.ts +196 -0
  472. package/src/editor/markdown.ts +249 -0
  473. package/src/editor/mathematics.spec.ts +97 -0
  474. package/src/editor/mathematics.ts +179 -0
  475. package/src/editor/media.spec.ts +121 -0
  476. package/src/editor/media.ts +133 -0
  477. package/src/editor/mentions.spec.ts +41 -0
  478. package/src/editor/mentions.ts +55 -0
  479. package/src/editor/pasteCleanup.spec.ts +84 -0
  480. package/src/editor/pasteCleanup.ts +124 -0
  481. package/src/editor/suggestionPopup.spec.tsx +105 -0
  482. package/src/editor/suggestionPopup.tsx +414 -0
  483. package/src/editor/tiptapEditor.spec.tsx +15 -8
  484. package/src/exports.spec.ts +4 -2
  485. package/src/index.ts +7 -1
  486. package/src/integration.spec.tsx +38 -9
  487. package/src/preview.spec.ts +130 -0
  488. package/src/preview.ts +287 -0
  489. package/src/richEditor.spec.tsx +10 -3
  490. package/src/shared/t.ts +25 -0
  491. package/src/shared/url.ts +16 -0
  492. package/src/styled.ts +13 -6
  493. package/src/toolbar/BubbleToolbar.tsx +11 -8
  494. package/src/toolbar/CodeBlockBubble.tsx +66 -28
  495. package/src/toolbar/ColorPicker.native.tsx +126 -0
  496. package/src/toolbar/ColorPicker.tsx +23 -67
  497. package/src/toolbar/FixedToolbar.native.tsx +51 -51
  498. package/src/toolbar/FixedToolbar.tsx +54 -10
  499. package/src/toolbar/HeadingPicker.tsx +46 -38
  500. package/src/toolbar/ImageBubble.tsx +26 -44
  501. package/src/toolbar/ImageDialog.native.tsx +97 -0
  502. package/src/toolbar/ImageDialog.tsx +5 -4
  503. package/src/toolbar/LinkBubble.tsx +27 -64
  504. package/src/toolbar/LinkDialog.native.tsx +117 -0
  505. package/src/toolbar/LinkDialog.tsx +28 -24
  506. package/src/toolbar/ListPicker.tsx +47 -43
  507. package/src/toolbar/MathBubble.tsx +140 -0
  508. package/src/toolbar/MoreDropdown.tsx +53 -60
  509. package/src/toolbar/StatusBar.tsx +13 -8
  510. package/src/toolbar/TableBubble.tsx +82 -94
  511. package/src/toolbar/ToolbarButton.native.tsx +14 -4
  512. package/src/toolbar/ToolbarButton.tsx +98 -19
  513. package/src/toolbar/bubbleToolbar.spec.tsx +2 -1
  514. package/src/toolbar/fixedToolbar.spec.tsx +4 -2
  515. package/src/toolbar/icons.tsx +113 -323
  516. package/src/toolbar/shortcuts.ts +77 -24
  517. package/src/toolbar/toolbarPrimitives.spec.tsx +29 -1
  518. package/src/toolbar/toolbarSubComponents.spec.tsx +4 -2
  519. package/src/toolbar/useHorizontalScroll.spec.ts +67 -0
  520. package/src/toolbar/useHorizontalScroll.tsx +39 -12
  521. package/src/toolbar/useRovingFocus.spec.tsx +100 -0
  522. package/src/toolbar/useRovingFocus.ts +82 -0
  523. package/src/types.spec.ts +40 -1
  524. package/src/types.ts +28 -0
  525. package/types/RichEditor.d.ts +51 -0
  526. package/types/RichEditor.d.ts.map +1 -0
  527. package/types/RichEditor.native.d.ts +59 -0
  528. package/types/RichEditor.native.d.ts.map +1 -0
  529. package/types/RichTextEditor/index.d.ts +71 -0
  530. package/types/RichTextEditor/index.d.ts.map +1 -0
  531. package/types/constants.d.ts +49 -0
  532. package/types/constants.d.ts.map +1 -0
  533. package/types/context.d.ts +10 -0
  534. package/types/context.d.ts.map +1 -0
  535. package/types/editor/BlockDragHandle.d.ts +8 -0
  536. package/types/editor/BlockDragHandle.d.ts.map +1 -0
  537. package/types/editor/MarkdownPaste.d.ts +8 -0
  538. package/types/editor/MarkdownPaste.d.ts.map +1 -0
  539. package/types/editor/SlashCommands.d.ts +24 -0
  540. package/types/editor/SlashCommands.d.ts.map +1 -0
  541. package/types/editor/TentapEditor.native.d.ts +21 -0
  542. package/types/editor/TentapEditor.native.d.ts.map +1 -0
  543. package/types/editor/TiptapEditor.d.ts +24 -0
  544. package/types/editor/TiptapEditor.d.ts.map +1 -0
  545. package/types/editor/blockAnchor.d.ts +25 -0
  546. package/types/editor/blockAnchor.d.ts.map +1 -0
  547. package/types/editor/codeBlockPreview.d.ts +51 -0
  548. package/types/editor/codeBlockPreview.d.ts.map +1 -0
  549. package/types/editor/editorStyles.d.ts +25 -0
  550. package/types/editor/editorStyles.d.ts.map +1 -0
  551. package/types/editor/emoji.d.ts +45 -0
  552. package/types/editor/emoji.d.ts.map +1 -0
  553. package/types/editor/index.d.ts +11 -0
  554. package/types/editor/index.d.ts.map +1 -0
  555. package/types/editor/lazyKatex.d.ts +33 -0
  556. package/types/editor/lazyKatex.d.ts.map +1 -0
  557. package/types/editor/markdown.d.ts +24 -0
  558. package/types/editor/markdown.d.ts.map +1 -0
  559. package/types/editor/mathematics.d.ts +44 -0
  560. package/types/editor/mathematics.d.ts.map +1 -0
  561. package/types/editor/media.d.ts +32 -0
  562. package/types/editor/media.d.ts.map +1 -0
  563. package/types/editor/mentions.d.ts +15 -0
  564. package/types/editor/mentions.d.ts.map +1 -0
  565. package/types/editor/pasteCleanup.d.ts +24 -0
  566. package/types/editor/pasteCleanup.d.ts.map +1 -0
  567. package/types/editor/suggestionPopup.d.ts +113 -0
  568. package/types/editor/suggestionPopup.d.ts.map +1 -0
  569. package/types/editor/types.d.ts +80 -0
  570. package/types/editor/types.d.ts.map +1 -0
  571. package/types/editor/useEditorState.d.ts +19 -0
  572. package/types/editor/useEditorState.d.ts.map +1 -0
  573. package/types/index.d.ts +11 -0
  574. package/types/index.d.ts.map +1 -0
  575. package/types/preview.d.ts +44 -0
  576. package/types/preview.d.ts.map +1 -0
  577. package/types/shared/t.d.ts +10 -0
  578. package/types/shared/t.d.ts.map +1 -0
  579. package/types/shared/url.d.ts +9 -0
  580. package/types/shared/url.d.ts.map +1 -0
  581. package/types/styled.d.ts +40 -0
  582. package/types/styled.d.ts.map +1 -0
  583. package/types/toolbar/BubbleToolbar.d.ts +23 -0
  584. package/types/toolbar/BubbleToolbar.d.ts.map +1 -0
  585. package/types/toolbar/CodeBlockBubble.d.ts +10 -0
  586. package/types/toolbar/CodeBlockBubble.d.ts.map +1 -0
  587. package/types/toolbar/ColorPicker.d.ts +15 -0
  588. package/types/toolbar/ColorPicker.d.ts.map +1 -0
  589. package/types/toolbar/ColorPicker.native.d.ts +20 -0
  590. package/types/toolbar/ColorPicker.native.d.ts.map +1 -0
  591. package/types/toolbar/FixedToolbar.d.ts +32 -0
  592. package/types/toolbar/FixedToolbar.d.ts.map +1 -0
  593. package/types/toolbar/FixedToolbar.native.d.ts +30 -0
  594. package/types/toolbar/FixedToolbar.native.d.ts.map +1 -0
  595. package/types/toolbar/HeadingPicker.d.ts +14 -0
  596. package/types/toolbar/HeadingPicker.d.ts.map +1 -0
  597. package/types/toolbar/ImageBubble.d.ts +10 -0
  598. package/types/toolbar/ImageBubble.d.ts.map +1 -0
  599. package/types/toolbar/ImageDialog.d.ts +12 -0
  600. package/types/toolbar/ImageDialog.d.ts.map +1 -0
  601. package/types/toolbar/ImageDialog.native.d.ts +15 -0
  602. package/types/toolbar/ImageDialog.native.d.ts.map +1 -0
  603. package/types/toolbar/LinkBubble.d.ts +10 -0
  604. package/types/toolbar/LinkBubble.d.ts.map +1 -0
  605. package/types/toolbar/LinkDialog.d.ts +20 -0
  606. package/types/toolbar/LinkDialog.d.ts.map +1 -0
  607. package/types/toolbar/LinkDialog.native.d.ts +18 -0
  608. package/types/toolbar/LinkDialog.native.d.ts.map +1 -0
  609. package/types/toolbar/ListPicker.d.ts +14 -0
  610. package/types/toolbar/ListPicker.d.ts.map +1 -0
  611. package/types/toolbar/MathBubble.d.ts +11 -0
  612. package/types/toolbar/MathBubble.d.ts.map +1 -0
  613. package/types/toolbar/MoreDropdown.d.ts +13 -0
  614. package/types/toolbar/MoreDropdown.d.ts.map +1 -0
  615. package/types/toolbar/ResizeHandle.d.ts +11 -0
  616. package/types/toolbar/ResizeHandle.d.ts.map +1 -0
  617. package/types/toolbar/StatusBar.d.ts +11 -0
  618. package/types/toolbar/StatusBar.d.ts.map +1 -0
  619. package/types/toolbar/TableBubble.d.ts +10 -0
  620. package/types/toolbar/TableBubble.d.ts.map +1 -0
  621. package/types/toolbar/ToolbarButton.d.ts +35 -0
  622. package/types/toolbar/ToolbarButton.d.ts.map +1 -0
  623. package/types/toolbar/ToolbarButton.native.d.ts +30 -0
  624. package/types/toolbar/ToolbarButton.native.d.ts.map +1 -0
  625. package/types/toolbar/ToolbarGroup.d.ts +14 -0
  626. package/types/toolbar/ToolbarGroup.d.ts.map +1 -0
  627. package/types/toolbar/icons.d.ts +52 -0
  628. package/types/toolbar/icons.d.ts.map +1 -0
  629. package/types/toolbar/icons.native.d.ts +41 -0
  630. package/types/toolbar/icons.native.d.ts.map +1 -0
  631. package/types/toolbar/shortcuts.d.ts +34 -0
  632. package/types/toolbar/shortcuts.d.ts.map +1 -0
  633. package/types/toolbar/useHorizontalScroll.d.ts +43 -0
  634. package/types/toolbar/useHorizontalScroll.d.ts.map +1 -0
  635. package/types/toolbar/useRovingFocus.d.ts +10 -0
  636. package/types/toolbar/useRovingFocus.d.ts.map +1 -0
  637. package/types/types.d.ts +125 -0
  638. package/types/types.d.ts.map +1 -0
  639. package/dist/cjs/RichEditor.stories.cjs +0 -327
  640. package/dist/cjs/RichEditor.stories.native.js +0 -342
  641. package/dist/cjs/RichEditor.stories.native.js.map +0 -1
  642. package/dist/esm/RichEditor.stories.mjs +0 -291
  643. package/dist/esm/RichEditor.stories.mjs.map +0 -1
  644. package/dist/esm/RichEditor.stories.native.js +0 -303
  645. package/dist/esm/RichEditor.stories.native.js.map +0 -1
  646. package/dist/jsx/RichEditor.stories.mjs +0 -291
  647. package/dist/jsx/RichEditor.stories.mjs.map +0 -1
  648. package/dist/jsx/RichEditor.stories.native.js +0 -342
  649. package/dist/jsx/RichEditor.stories.native.js.map +0 -1
@@ -0,0 +1,179 @@
1
+ /**
2
+ * Inline math node (`$x^2$`) rendered with lazy-loaded KaTeX — GitLab
3
+ * parity for dollar math in the rich text editor.
4
+ *
5
+ * - Typing `$latex$` converts to a rendered formula (input rule; prices
6
+ * like "$5 and $10" never convert — content cannot start/end with
7
+ * whitespace).
8
+ * - The node is an inline atom carrying the raw TeX in `data-latex`; the
9
+ * MathBubble edits it in place (updateInlineMath command).
10
+ * - Invalid TeX shows the raw source in an error style with the KaTeX
11
+ * parse message (Axiom 6: show the error, never blank).
12
+ * - Block math (`$$ ... $$`) is a code block with language "math" — see
13
+ * codeBlockPreview.ts — matching GitLab's ```math fence model.
14
+ *
15
+ * Serialization: `<span data-type="inline-math" data-latex="...">` <->
16
+ * `$...$` (editor/markdown.ts), so the source toggle is lossless.
17
+ */
18
+
19
+ import { Node, mergeAttributes, nodeInputRule } from "@tiptap/core";
20
+ import { NodeSelection } from "@tiptap/pm/state";
21
+ import { t } from "../shared/t";
22
+ import { mountKatexHtml, renderKatexHtml } from "./lazyKatex";
23
+
24
+ export interface InlineMathOptions {
25
+ HTMLAttributes: Record<string, any>;
26
+ }
27
+
28
+ declare module "@tiptap/core" {
29
+ interface Commands<ReturnType> {
30
+ inlineMath: {
31
+ /** Inserts an inline math node and selects it (opens the MathBubble) */
32
+ insertInlineMath: (attributes?: { latex?: string }) => ReturnType;
33
+ /** Updates the latex of the selected inline math node */
34
+ updateInlineMath: (attributes: { latex: string }) => ReturnType;
35
+ };
36
+ }
37
+ }
38
+
39
+ /**
40
+ * Matches `$...$` as the last thing typed. match[1] is the dollar span
41
+ * (what the node replaces), match[2] the TeX. The character before the
42
+ * opening `$` must not be another `$` (that is block math), and content
43
+ * cannot start/end with whitespace or contain `$`/newlines.
44
+ */
45
+ export const INLINE_MATH_INPUT_RULE = /(?:^|[^$])(\$([^$\n \t](?:[^$\n]*[^$\n \t])?)\$)$/;
46
+
47
+ export const InlineMath = Node.create<InlineMathOptions>({
48
+ name: "inlineMath",
49
+ inline: true,
50
+ group: "inline",
51
+ atom: true,
52
+ marks: "",
53
+
54
+ addOptions() {
55
+ return { HTMLAttributes: {} };
56
+ },
57
+
58
+ addAttributes() {
59
+ return {
60
+ latex: {
61
+ default: "",
62
+ parseHTML: (element) => element.getAttribute("data-latex") ?? element.textContent ?? "",
63
+ renderHTML: (attributes) => ({ "data-latex": attributes.latex }),
64
+ },
65
+ };
66
+ },
67
+
68
+ parseHTML() {
69
+ return [{ tag: 'span[data-type="inline-math"]' }];
70
+ },
71
+
72
+ renderHTML({ node, HTMLAttributes }) {
73
+ // raw TeX as text content: non-web surfaces (native preview, plain
74
+ // parsers) degrade to readable source
75
+ return [
76
+ "span",
77
+ mergeAttributes({ "data-type": "inline-math" }, this.options.HTMLAttributes, HTMLAttributes),
78
+ node.attrs.latex,
79
+ ];
80
+ },
81
+
82
+ addCommands() {
83
+ return {
84
+ insertInlineMath:
85
+ (attributes) =>
86
+ ({ tr, dispatch }) => {
87
+ if (dispatch) {
88
+ const pos = tr.selection.from;
89
+ tr.replaceSelectionWith(this.type.create({ latex: attributes?.latex ?? "" }), false);
90
+ tr.setSelection(NodeSelection.create(tr.doc, pos));
91
+ tr.scrollIntoView();
92
+ }
93
+ return true;
94
+ },
95
+ updateInlineMath:
96
+ (attributes) =>
97
+ ({ tr, dispatch }) => {
98
+ const { selection } = tr;
99
+ if (!(selection instanceof NodeSelection) || selection.node.type !== this.type) {
100
+ return false;
101
+ }
102
+ if (dispatch) {
103
+ const pos = selection.from;
104
+ tr.setNodeMarkup(pos, undefined, { latex: attributes.latex });
105
+ tr.setSelection(NodeSelection.create(tr.doc, pos));
106
+ }
107
+ return true;
108
+ },
109
+ };
110
+ },
111
+
112
+ addInputRules() {
113
+ return [
114
+ nodeInputRule({
115
+ find: INLINE_MATH_INPUT_RULE,
116
+ type: this.type,
117
+ getAttributes: (match) => ({ latex: match[2] ?? "" }),
118
+ }),
119
+ ];
120
+ },
121
+
122
+ addNodeView() {
123
+ return ({ node }) => {
124
+ const dom = document.createElement("span");
125
+ dom.className = "rt-math-inline";
126
+ dom.setAttribute("data-type", "inline-math");
127
+ dom.contentEditable = "false";
128
+
129
+ let currentLatex: string | null = null;
130
+ let destroyed = false;
131
+
132
+ const render = (latex: string) => {
133
+ if (destroyed || latex === currentLatex) return;
134
+ currentLatex = latex;
135
+ dom.setAttribute("data-latex", latex);
136
+ if (!latex.trim()) {
137
+ dom.classList.add("rt-math-empty");
138
+ dom.classList.remove("rt-math-error");
139
+ dom.removeAttribute("title");
140
+ dom.textContent = t("math");
141
+ return;
142
+ }
143
+ dom.classList.remove("rt-math-empty");
144
+ // raw TeX stays visible while KaTeX loads (first render only)
145
+ dom.textContent = latex;
146
+ void renderKatexHtml(latex).then((result) => {
147
+ if (destroyed || currentLatex !== latex) return;
148
+ if (result.ok) {
149
+ mountKatexHtml(dom, result.html);
150
+ dom.classList.remove("rt-math-error");
151
+ dom.removeAttribute("title");
152
+ dom.setAttribute("role", "img");
153
+ dom.setAttribute("aria-label", latex);
154
+ } else {
155
+ // Axiom 6: raw source + parse message, never a blank chip
156
+ dom.textContent = latex;
157
+ dom.classList.add("rt-math-error");
158
+ dom.title = result.error;
159
+ }
160
+ });
161
+ };
162
+
163
+ render((node.attrs.latex as string) ?? "");
164
+
165
+ return {
166
+ dom,
167
+ update: (updatedNode) => {
168
+ if (updatedNode.type.name !== "inlineMath") return false;
169
+ render((updatedNode.attrs.latex as string) ?? "");
170
+ return true;
171
+ },
172
+ ignoreMutation: () => true,
173
+ destroy: () => {
174
+ destroyed = true;
175
+ },
176
+ };
177
+ };
178
+ },
179
+ });
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Media paste/drop upload behavior against a headless Tiptap editor.
3
+ */
4
+
5
+ import { describe, expect, it, vi } from "vitest";
6
+ import { Editor } from "@tiptap/core";
7
+ import StarterKit from "@tiptap/starter-kit";
8
+ import Image from "@tiptap/extension-image";
9
+ import { MediaUpload } from "./media";
10
+
11
+ function createEditor() {
12
+ return new Editor({
13
+ element: document.createElement("div"),
14
+ extensions: [StarterKit, Image.configure({ inline: true, allowBase64: true }), MediaUpload],
15
+ content: "<p>start</p>",
16
+ });
17
+ }
18
+
19
+ function firePaste(editor: Editor, files: File[]) {
20
+ const event = {
21
+ clipboardData: { files, types: ["Files"], getData: () => "" },
22
+ preventDefault: vi.fn(),
23
+ } as unknown as ClipboardEvent;
24
+ // someProp mirrors ProseMirror dispatch: handlers run in order until one
25
+ // claims the event by returning truthy
26
+ const handled = !!editor.view.someProp("handlePaste", (fn) =>
27
+ fn(editor.view, event, editor.state.tr.doc.slice(0)),
28
+ );
29
+ return { handled, event };
30
+ }
31
+
32
+ async function waitFor(check: () => boolean, timeoutMs = 2000) {
33
+ const start = Date.now();
34
+ while (!check()) {
35
+ if (Date.now() - start > timeoutMs) throw new Error("waitFor timed out");
36
+ await new Promise((r) => setTimeout(r, 10));
37
+ }
38
+ }
39
+
40
+ describe("MediaUpload", () => {
41
+ it("inserts an uploaded image URL when onImageUpload is wired", async () => {
42
+ const editor = createEditor();
43
+ const onImageUpload = vi.fn(async () => "https://cdn.example.com/pic.png");
44
+ editor.storage.mediaUpload.handlers = { onImageUpload };
45
+
46
+ const file = new File(["binary"], "pic.png", { type: "image/png" });
47
+ const { handled, event } = firePaste(editor, [file]);
48
+
49
+ expect(handled).toBe(true);
50
+ expect(event.preventDefault).toHaveBeenCalled();
51
+ await waitFor(() => editor.getHTML().includes("<img"));
52
+ expect(onImageUpload).toHaveBeenCalledWith(file);
53
+ expect(editor.getHTML()).toContain('src="https://cdn.example.com/pic.png"');
54
+ expect(editor.getHTML()).toContain('alt="pic"');
55
+ editor.destroy();
56
+ });
57
+
58
+ it("falls back to base64 data URI without an image handler", async () => {
59
+ const editor = createEditor();
60
+ const file = new File(["binary"], "photo.jpg", { type: "image/jpeg" });
61
+ const { handled } = firePaste(editor, [file]);
62
+
63
+ expect(handled).toBe(true);
64
+ await waitFor(() => editor.getHTML().includes("<img"));
65
+ expect(editor.getHTML()).toContain('src="data:');
66
+ editor.destroy();
67
+ });
68
+
69
+ it("inserts an attachment chip link for non-image files via onFileUpload", async () => {
70
+ const editor = createEditor();
71
+ const onFileUpload = vi.fn(async () => ({
72
+ url: "https://cdn.example.com/report.pdf",
73
+ name: "report.pdf",
74
+ }));
75
+ editor.storage.mediaUpload.handlers = { onFileUpload };
76
+
77
+ const file = new File(["%PDF"], "report.pdf", { type: "application/pdf" });
78
+ const { handled } = firePaste(editor, [file]);
79
+
80
+ expect(handled).toBe(true);
81
+ await waitFor(() => editor.getHTML().includes("<a"));
82
+ const html = editor.getHTML();
83
+ expect(html).toContain('href="https://cdn.example.com/report.pdf"');
84
+ expect(html).toContain("rt-attachment");
85
+ expect(html).toContain("report.pdf");
86
+ editor.destroy();
87
+ });
88
+
89
+ it("ignores non-image files without a file handler (honest no-op)", () => {
90
+ const editor = createEditor();
91
+ const file = new File(["%PDF"], "report.pdf", { type: "application/pdf" });
92
+ const { handled } = firePaste(editor, [file]);
93
+ expect(handled).toBe(false);
94
+ expect(editor.getHTML()).not.toContain("<a");
95
+ editor.destroy();
96
+ });
97
+
98
+ it("does not intercept text-only pastes", () => {
99
+ const editor = createEditor();
100
+ const { handled } = firePaste(editor, []);
101
+ expect(handled).toBeFalsy();
102
+ editor.destroy();
103
+ });
104
+
105
+ it("survives a failing upload without crashing", async () => {
106
+ const editor = createEditor();
107
+ const onImageUpload = vi.fn(async () => {
108
+ throw new Error("upload broke");
109
+ });
110
+ editor.storage.mediaUpload.handlers = { onImageUpload };
111
+ const warn = vi.spyOn(console, "warn").mockImplementation(() => {});
112
+
113
+ const file = new File(["binary"], "pic.png", { type: "image/png" });
114
+ const { handled } = firePaste(editor, [file]);
115
+ expect(handled).toBe(true);
116
+ await waitFor(() => warn.mock.calls.length > 0);
117
+ expect(editor.getHTML()).not.toContain("<img");
118
+ warn.mockRestore();
119
+ editor.destroy();
120
+ });
121
+ });
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Image / attachment paste-and-drop handling (web).
3
+ *
4
+ * Files pasted or dropped into the editor route through prop-driven upload
5
+ * hooks -- the package assumes no backend:
6
+ * - Images: `onImageUpload(file) -> Promise<url>` inserts an image node at
7
+ * the paste/drop position. Without a hook, images fall back to an inline
8
+ * base64 data URI so the flow still works in demos and offline hosts.
9
+ * - Other files: `onFileUpload(file) -> Promise<{ url, name? }>` inserts an
10
+ * attachment chip (a link with `data-attachment`). Without a hook there is
11
+ * no URL to link, so the file is ignored (honest no-op).
12
+ */
13
+
14
+ import { Extension } from "@tiptap/core";
15
+ import type { Editor } from "@tiptap/core";
16
+ import { Plugin, PluginKey } from "@tiptap/pm/state";
17
+
18
+ export interface MediaUploadHandlers {
19
+ /** Uploads a pasted/dropped image and resolves its URL */
20
+ onImageUpload?: (file: File) => Promise<string>;
21
+ /** Uploads a pasted/dropped non-image file and resolves its URL (+ display name) */
22
+ onFileUpload?: (file: File) => Promise<{ url: string; name?: string }>;
23
+ }
24
+
25
+ export interface MediaUploadStorage {
26
+ handlers: MediaUploadHandlers;
27
+ }
28
+
29
+ declare module "@tiptap/core" {
30
+ interface Storage {
31
+ mediaUpload: MediaUploadStorage;
32
+ }
33
+ }
34
+
35
+ function readFileAsDataUrl(file: File): Promise<string> {
36
+ return new Promise((resolve, reject) => {
37
+ const reader = new FileReader();
38
+ reader.onload = () => resolve(String(reader.result));
39
+ reader.onerror = () => reject(reader.error);
40
+ reader.readAsDataURL(file);
41
+ });
42
+ }
43
+
44
+ function insertImage(editor: Editor, src: string, alt: string, pos?: number) {
45
+ const chain = editor.chain().focus();
46
+ if (pos !== undefined) {
47
+ chain.insertContentAt(pos, { type: "image", attrs: { src, alt } }).run();
48
+ } else {
49
+ chain.setImage({ src, alt }).run();
50
+ }
51
+ }
52
+
53
+ function insertAttachment(editor: Editor, url: string, name: string, pos?: number) {
54
+ const content = {
55
+ type: "text",
56
+ text: name,
57
+ marks: [
58
+ {
59
+ type: "link",
60
+ // the Link mark schema only allows href/target/rel/class -- the
61
+ // chip presentation rides on the class
62
+ attrs: { href: url, class: "rt-attachment" },
63
+ },
64
+ ],
65
+ };
66
+ const chain = editor.chain().focus();
67
+ if (pos !== undefined) chain.insertContentAt(pos, content).run();
68
+ else chain.insertContent(content).run();
69
+ }
70
+
71
+ async function handleFiles(editor: Editor, files: File[], pos?: number): Promise<void> {
72
+ const { handlers } = editor.storage.mediaUpload as MediaUploadStorage;
73
+ for (const file of files) {
74
+ try {
75
+ if (file.type.startsWith("image/")) {
76
+ const src = handlers.onImageUpload
77
+ ? await handlers.onImageUpload(file)
78
+ : await readFileAsDataUrl(file);
79
+ insertImage(editor, src, file.name.replace(/\.[a-z0-9]+$/i, ""), pos);
80
+ } else if (handlers.onFileUpload) {
81
+ const { url, name } = await handlers.onFileUpload(file);
82
+ insertAttachment(editor, url, name ?? file.name, pos);
83
+ }
84
+ } catch (err) {
85
+ console.warn("[rich-text] media upload failed:", err);
86
+ }
87
+ }
88
+ }
89
+
90
+ export const MediaUpload = Extension.create({
91
+ name: "mediaUpload",
92
+
93
+ addStorage(): MediaUploadStorage {
94
+ return { handlers: {} };
95
+ },
96
+
97
+ addProseMirrorPlugins() {
98
+ const { editor } = this;
99
+
100
+ return [
101
+ new Plugin({
102
+ key: new PluginKey("mediaUpload"),
103
+ props: {
104
+ handlePaste(_view, event) {
105
+ const files = Array.from(event.clipboardData?.files ?? []);
106
+ if (files.length === 0) return false;
107
+ const { handlers } = editor.storage.mediaUpload as MediaUploadStorage;
108
+ const actionable = files.some(
109
+ (f) => f.type.startsWith("image/") || handlers.onFileUpload,
110
+ );
111
+ if (!actionable) return false;
112
+ event.preventDefault();
113
+ void handleFiles(editor, files);
114
+ return true;
115
+ },
116
+ handleDrop(view, event) {
117
+ const files = Array.from(event.dataTransfer?.files ?? []);
118
+ if (files.length === 0) return false;
119
+ const { handlers } = editor.storage.mediaUpload as MediaUploadStorage;
120
+ const actionable = files.some(
121
+ (f) => f.type.startsWith("image/") || handlers.onFileUpload,
122
+ );
123
+ if (!actionable) return false;
124
+ event.preventDefault();
125
+ const coords = view.posAtCoords({ left: event.clientX, top: event.clientY });
126
+ void handleFiles(editor, files, coords?.pos);
127
+ return true;
128
+ },
129
+ },
130
+ }),
131
+ ];
132
+ },
133
+ });
@@ -0,0 +1,41 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { createMentionExtension } from "./mentions";
3
+
4
+ describe("createMentionExtension", () => {
5
+ it("creates a mention extension with @ as the default trigger", () => {
6
+ const ext = createMentionExtension({ items: () => [] });
7
+ expect(ext.name).toBe("mention");
8
+ expect(ext.options.suggestion.char).toBe("@");
9
+ });
10
+
11
+ it("honors a custom trigger", () => {
12
+ const ext = createMentionExtension({ trigger: "#", items: () => [] });
13
+ expect(ext.options.suggestion.char).toBe("#");
14
+ });
15
+
16
+ it("maps the forms MentionItem contract (display -> label) and caps at 20", async () => {
17
+ const data = Array.from({ length: 30 }, (_, i) => ({
18
+ id: `u${i}`,
19
+ display: `User ${i}`,
20
+ description: `Role ${i}`,
21
+ avatar: `https://a.b/${i}.png`,
22
+ }));
23
+ const ext = createMentionExtension({ items: () => data });
24
+ const items = await ext.options.suggestion.items!({ query: "", editor: null as any });
25
+ expect(items).toHaveLength(20);
26
+ expect(items[0]).toEqual({
27
+ id: "u0",
28
+ label: "User 0",
29
+ description: "Role 0",
30
+ avatar: "https://a.b/0.png",
31
+ });
32
+ });
33
+
34
+ it("supports async item sources", async () => {
35
+ const ext = createMentionExtension({
36
+ items: async (query) => [{ id: "1", display: `match:${query}` }],
37
+ });
38
+ const items = await ext.options.suggestion.items!({ query: "ada", editor: null as any });
39
+ expect(items[0]!.label).toBe("match:ada");
40
+ });
41
+ });
@@ -0,0 +1,55 @@
1
+ /**
2
+ * @ mention support for the rich text editor (web).
3
+ *
4
+ * Reuses the forms `MentionItem` contract (LC-16: same suggestion data
5
+ * shape as `MentionInput`) and the shared suggestion popup (same rows,
6
+ * chrome, and keyboard handling as the slash menu). The host wires data via
7
+ * the `mentions` prop -- the package assumes no backend.
8
+ *
9
+ * Inserted mentions are Tiptap mention nodes rendered as
10
+ * `<span data-type="mention" data-id="...">@label</span>` chips.
11
+ */
12
+
13
+ import Mention from "@tiptap/extension-mention";
14
+ import type { RichTextMentionOptions } from "../types";
15
+ import { t } from "../shared/t";
16
+ import { createSuggestionRenderer, getSuggestionChrome } from "./suggestionPopup";
17
+
18
+ export type { RichTextMentionOptions };
19
+
20
+ /** Internal suggestion payload: Mention's default command reads id + label */
21
+ interface MentionSuggestionItem {
22
+ id: string;
23
+ label: string;
24
+ description?: string;
25
+ avatar?: string;
26
+ }
27
+
28
+ export function createMentionExtension(options: RichTextMentionOptions) {
29
+ return Mention.configure({
30
+ HTMLAttributes: { class: "rt-mention" },
31
+ deleteTriggerWithBackspace: true,
32
+ suggestion: {
33
+ char: options.trigger ?? "@",
34
+ items: async ({ query }: { query: string }): Promise<MentionSuggestionItem[]> => {
35
+ const items = await options.items(query);
36
+ return items.slice(0, 20).map((item) => ({
37
+ id: item.id,
38
+ label: item.display,
39
+ description: item.description,
40
+ avatar: item.avatar,
41
+ }));
42
+ },
43
+ render: createSuggestionRenderer<MentionSuggestionItem>({
44
+ toRow: (item) => ({
45
+ key: item.id,
46
+ title: item.label,
47
+ description: item.description,
48
+ avatarUrl: item.avatar,
49
+ }),
50
+ getChrome: getSuggestionChrome,
51
+ getEmptyLabel: () => t("No results"),
52
+ }),
53
+ },
54
+ });
55
+ }
@@ -0,0 +1,84 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { cleanPastedHtml, isOfficeHtml } from "./pasteCleanup";
3
+
4
+ const GOOGLE_DOCS_HTML =
5
+ '<meta charset="utf-8"><b style="font-weight:normal;" id="docs-internal-guid-abc123">' +
6
+ '<p dir="ltr" style="line-height:1.38;margin-top:0pt;margin-bottom:0pt;">' +
7
+ '<span style="font-size:11pt;font-family:Arial;color:#000000;background-color:transparent;' +
8
+ 'font-weight:400;font-style:normal;">Hello from Docs</span></p>' +
9
+ '<p dir="ltr"><span style="font-weight:700;color:#ff0000;">Red bold</span></p></b>';
10
+
11
+ const WORD_HTML =
12
+ "<html xmlns:o='urn:schemas-microsoft-com:office:office'><body>" +
13
+ "<!--[if gte mso 9]><xml><o:shapedefaults/></xml><![endif]-->" +
14
+ '<p class="MsoNormal" style="mso-margin-top-alt:auto;color:windowtext;">Hello from Word<o:p></o:p></p>' +
15
+ "</body></html>";
16
+
17
+ describe("isOfficeHtml", () => {
18
+ it("detects Google Docs clipboard payloads", () => {
19
+ expect(isOfficeHtml(GOOGLE_DOCS_HTML)).toBe(true);
20
+ });
21
+
22
+ it("detects Microsoft Word clipboard payloads", () => {
23
+ expect(isOfficeHtml(WORD_HTML)).toBe(true);
24
+ });
25
+
26
+ it("returns false for regular web HTML", () => {
27
+ expect(isOfficeHtml("<p><strong>plain</strong> web copy</p>")).toBe(false);
28
+ });
29
+ });
30
+
31
+ describe("cleanPastedHtml", () => {
32
+ it("passes non-office HTML through untouched", () => {
33
+ const html = '<p class="keep-me"><strong>web</strong></p>';
34
+ expect(cleanPastedHtml(html)).toBe(html);
35
+ });
36
+
37
+ it("unwraps the Google Docs non-bold <b> guid wrapper", () => {
38
+ const cleaned = cleanPastedHtml(GOOGLE_DOCS_HTML);
39
+ // The wrapper <b> is gone so content does not become bold
40
+ expect(cleaned).not.toContain("docs-internal-guid");
41
+ expect(cleaned).not.toMatch(/<b[\s>]/);
42
+ expect(cleaned).toContain("Hello from Docs");
43
+ });
44
+
45
+ it("drops font junk but keeps meaningful colors", () => {
46
+ const cleaned = cleanPastedHtml(GOOGLE_DOCS_HTML);
47
+ expect(cleaned).not.toContain("font-family");
48
+ expect(cleaned).not.toContain("font-size");
49
+ // Default black ink is dropped (stays on theme text color)
50
+ expect(cleaned).not.toContain("#000000");
51
+ // Explicit non-default color survives as data (authored hex preserved)
52
+ expect(cleaned).toContain("color: #ff0000");
53
+ });
54
+
55
+ it("keeps span-styled bold (Docs marks bold with font-weight, not <b>)", () => {
56
+ const cleaned = cleanPastedHtml(GOOGLE_DOCS_HTML);
57
+ // Authored bold survives so ProseMirror parses it into a bold mark
58
+ expect(cleaned).toContain("font-weight: 700");
59
+ // The default-weight span (font-weight:400) carries no mark
60
+ expect(cleaned).not.toContain("font-weight: 400");
61
+ expect(cleaned).not.toContain("font-style: normal");
62
+ });
63
+
64
+ it("keeps span-styled italic/underline/strike, drops default values", () => {
65
+ const html =
66
+ '<p class="MsoNormal">' +
67
+ '<span style="font-style:italic;">it</span>' +
68
+ '<span style="text-decoration:underline;">un</span>' +
69
+ '<span style="text-decoration:none;">plain</span></p>';
70
+ const cleaned = cleanPastedHtml(html);
71
+ expect(cleaned).toContain("font-style: italic");
72
+ expect(cleaned).toContain("text-decoration: underline");
73
+ expect(cleaned).not.toContain("text-decoration: none");
74
+ });
75
+
76
+ it("strips Word Mso classes, o:p tags, and conditional comments", () => {
77
+ const cleaned = cleanPastedHtml(WORD_HTML);
78
+ expect(cleaned).not.toContain("MsoNormal");
79
+ expect(cleaned).not.toContain("mso-");
80
+ expect(cleaned).not.toContain("<o:p>");
81
+ expect(cleaned).not.toContain("[if gte mso");
82
+ expect(cleaned).toContain("Hello from Word");
83
+ });
84
+ });