@multiplatform.one/rich-text 6.1.0 → 6.4.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 (691) hide show
  1. package/README.md +60 -0
  2. package/dist/cjs/RichEditor.cjs +89 -9
  3. package/dist/cjs/RichEditor.native.js +444 -35
  4. package/dist/cjs/RichEditor.native.js.map +1 -1
  5. package/dist/cjs/RichTextEditor/index.cjs +20 -2
  6. package/dist/cjs/RichTextEditor/index.native.js +20 -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 +257 -294
  15. package/dist/cjs/editor/SlashCommands.native.js +320 -341
  16. package/dist/cjs/editor/SlashCommands.native.js.map +1 -1
  17. package/dist/cjs/editor/TentapEditor.native.js +59 -12
  18. package/dist/cjs/editor/TentapEditor.native.js.map +1 -1
  19. package/dist/cjs/editor/TiptapEditor.cjs +143 -240
  20. package/dist/cjs/editor/TiptapEditor.native.js +163 -289
  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/capabilities.cjs +37 -0
  26. package/dist/cjs/editor/capabilities.native.js +41 -0
  27. package/dist/cjs/editor/capabilities.native.js.map +1 -0
  28. package/dist/cjs/editor/codeBlockPreview.cjs +230 -0
  29. package/dist/cjs/editor/codeBlockPreview.native.js +265 -0
  30. package/dist/cjs/editor/codeBlockPreview.native.js.map +1 -0
  31. package/dist/cjs/editor/editorStyles.cjs +203 -34
  32. package/dist/cjs/editor/editorStyles.native.js +203 -34
  33. package/dist/cjs/editor/editorStyles.native.js.map +1 -1
  34. package/dist/cjs/editor/emoji.cjs +128 -0
  35. package/dist/cjs/editor/emoji.native.js +184 -0
  36. package/dist/cjs/editor/emoji.native.js.map +1 -0
  37. package/dist/cjs/editor/extensions.cjs +275 -0
  38. package/dist/cjs/editor/extensions.native.js +328 -0
  39. package/dist/cjs/editor/extensions.native.js.map +1 -0
  40. package/dist/cjs/editor/lazyKatex.cjs +78 -0
  41. package/dist/cjs/editor/lazyKatex.native.js +117 -0
  42. package/dist/cjs/editor/lazyKatex.native.js.map +1 -0
  43. package/dist/cjs/editor/markdown.cjs +216 -0
  44. package/dist/cjs/editor/markdown.native.js +278 -0
  45. package/dist/cjs/editor/markdown.native.js.map +1 -0
  46. package/dist/cjs/editor/mathematics.cjs +168 -0
  47. package/dist/cjs/editor/mathematics.native.js +202 -0
  48. package/dist/cjs/editor/mathematics.native.js.map +1 -0
  49. package/dist/cjs/editor/media.cjs +138 -0
  50. package/dist/cjs/editor/media.native.js +172 -0
  51. package/dist/cjs/editor/media.native.js.map +1 -0
  52. package/dist/cjs/editor/mentions.cjs +73 -0
  53. package/dist/cjs/editor/mentions.native.js +84 -0
  54. package/dist/cjs/editor/mentions.native.js.map +1 -0
  55. package/dist/cjs/editor/pasteCleanup.cjs +83 -0
  56. package/dist/cjs/editor/pasteCleanup.native.js +175 -0
  57. package/dist/cjs/editor/pasteCleanup.native.js.map +1 -0
  58. package/dist/cjs/editor/suggestionPopup.cjs +297 -0
  59. package/dist/cjs/editor/suggestionPopup.native.js +327 -0
  60. package/dist/cjs/editor/suggestionPopup.native.js.map +1 -0
  61. package/dist/cjs/index.cjs +5 -2
  62. package/dist/cjs/index.native.js +4 -1
  63. package/dist/cjs/index.native.js.map +1 -1
  64. package/dist/cjs/preview.cjs +263 -0
  65. package/dist/cjs/preview.native.js +294 -0
  66. package/dist/cjs/preview.native.js.map +1 -0
  67. package/dist/cjs/shared/t.cjs +53 -0
  68. package/dist/cjs/shared/t.native.js +56 -0
  69. package/dist/cjs/shared/t.native.js.map +1 -0
  70. package/dist/cjs/shared/url.cjs +35 -0
  71. package/dist/cjs/shared/url.native.js +38 -0
  72. package/dist/cjs/shared/url.native.js.map +1 -0
  73. package/dist/cjs/styled.cjs +13 -6
  74. package/dist/cjs/styled.native.js +13 -6
  75. package/dist/cjs/styled.native.js.map +1 -1
  76. package/dist/cjs/toolbar/BubbleToolbar.cjs +19 -14
  77. package/dist/cjs/toolbar/BubbleToolbar.native.js +22 -15
  78. package/dist/cjs/toolbar/BubbleToolbar.native.js.map +1 -1
  79. package/dist/cjs/toolbar/CodeBlockBubble.cjs +59 -23
  80. package/dist/cjs/toolbar/CodeBlockBubble.native.js +71 -25
  81. package/dist/cjs/toolbar/CodeBlockBubble.native.js.map +1 -1
  82. package/dist/cjs/toolbar/ColorPicker.cjs +19 -54
  83. package/dist/cjs/toolbar/ColorPicker.native.js +81 -179
  84. package/dist/cjs/toolbar/ColorPicker.native.js.map +1 -1
  85. package/dist/cjs/toolbar/FixedToolbar.cjs +39 -13
  86. package/dist/cjs/toolbar/FixedToolbar.native.js +46 -54
  87. package/dist/cjs/toolbar/FixedToolbar.native.js.map +1 -1
  88. package/dist/cjs/toolbar/HeadingPicker.cjs +32 -39
  89. package/dist/cjs/toolbar/HeadingPicker.native.js +61 -51
  90. package/dist/cjs/toolbar/HeadingPicker.native.js.map +1 -1
  91. package/dist/cjs/toolbar/ImageBubble.cjs +20 -43
  92. package/dist/cjs/toolbar/ImageBubble.native.js +20 -43
  93. package/dist/cjs/toolbar/ImageBubble.native.js.map +1 -1
  94. package/dist/cjs/toolbar/ImageDialog.cjs +5 -4
  95. package/dist/cjs/toolbar/ImageDialog.native.js +76 -65
  96. package/dist/cjs/toolbar/ImageDialog.native.js.map +1 -1
  97. package/dist/cjs/toolbar/LinkBubble.cjs +23 -70
  98. package/dist/cjs/toolbar/LinkBubble.native.js +23 -70
  99. package/dist/cjs/toolbar/LinkBubble.native.js.map +1 -1
  100. package/dist/cjs/toolbar/LinkDialog.cjs +19 -18
  101. package/dist/cjs/toolbar/LinkDialog.native.js +86 -83
  102. package/dist/cjs/toolbar/LinkDialog.native.js.map +1 -1
  103. package/dist/cjs/toolbar/ListPicker.cjs +32 -43
  104. package/dist/cjs/toolbar/ListPicker.native.js +43 -44
  105. package/dist/cjs/toolbar/ListPicker.native.js.map +1 -1
  106. package/dist/cjs/toolbar/MathBubble.cjs +159 -0
  107. package/dist/cjs/toolbar/MathBubble.native.js +169 -0
  108. package/dist/cjs/toolbar/MathBubble.native.js.map +1 -0
  109. package/dist/cjs/toolbar/MoreDropdown.cjs +54 -93
  110. package/dist/cjs/toolbar/MoreDropdown.native.js +80 -93
  111. package/dist/cjs/toolbar/MoreDropdown.native.js.map +1 -1
  112. package/dist/cjs/toolbar/StatusBar.cjs +19 -10
  113. package/dist/cjs/toolbar/StatusBar.native.js +19 -10
  114. package/dist/cjs/toolbar/StatusBar.native.js.map +1 -1
  115. package/dist/cjs/toolbar/TableBubble.cjs +91 -96
  116. package/dist/cjs/toolbar/TableBubble.native.js +90 -73
  117. package/dist/cjs/toolbar/TableBubble.native.js.map +1 -1
  118. package/dist/cjs/toolbar/ToolbarButton.cjs +86 -21
  119. package/dist/cjs/toolbar/ToolbarButton.native.js +14 -4
  120. package/dist/cjs/toolbar/ToolbarButton.native.js.map +1 -1
  121. package/dist/cjs/toolbar/icons.cjs +111 -468
  122. package/dist/cjs/toolbar/shortcuts.cjs +73 -24
  123. package/dist/cjs/toolbar/shortcuts.native.js +73 -24
  124. package/dist/cjs/toolbar/shortcuts.native.js.map +1 -1
  125. package/dist/cjs/toolbar/useHorizontalScroll.cjs +25 -5
  126. package/dist/cjs/toolbar/useHorizontalScroll.native.js +25 -5
  127. package/dist/cjs/toolbar/useHorizontalScroll.native.js.map +1 -1
  128. package/dist/cjs/toolbar/useRovingFocus.cjs +80 -0
  129. package/dist/cjs/toolbar/useRovingFocus.native.js +113 -0
  130. package/dist/cjs/toolbar/useRovingFocus.native.js.map +1 -0
  131. package/dist/cjs/types.native.js.map +1 -1
  132. package/dist/esm/RichEditor.mjs +90 -10
  133. package/dist/esm/RichEditor.mjs.map +1 -1
  134. package/dist/esm/RichEditor.native.js +447 -38
  135. package/dist/esm/RichEditor.native.js.map +1 -1
  136. package/dist/esm/RichTextEditor/index.mjs +20 -2
  137. package/dist/esm/RichTextEditor/index.mjs.map +1 -1
  138. package/dist/esm/RichTextEditor/index.native.js +20 -2
  139. package/dist/esm/RichTextEditor/index.native.js.map +1 -1
  140. package/dist/esm/constants.mjs +47 -29
  141. package/dist/esm/constants.mjs.map +1 -1
  142. package/dist/esm/constants.native.js +54 -29
  143. package/dist/esm/constants.native.js.map +1 -1
  144. package/dist/esm/editor/BlockDragHandle.mjs +22 -7
  145. package/dist/esm/editor/BlockDragHandle.mjs.map +1 -1
  146. package/dist/esm/editor/BlockDragHandle.native.js +41 -7
  147. package/dist/esm/editor/BlockDragHandle.native.js.map +1 -1
  148. package/dist/esm/editor/SlashCommands.mjs +258 -295
  149. package/dist/esm/editor/SlashCommands.mjs.map +1 -1
  150. package/dist/esm/editor/SlashCommands.native.js +321 -342
  151. package/dist/esm/editor/SlashCommands.native.js.map +1 -1
  152. package/dist/esm/editor/TentapEditor.native.js +60 -13
  153. package/dist/esm/editor/TentapEditor.native.js.map +1 -1
  154. package/dist/esm/editor/TiptapEditor.mjs +145 -231
  155. package/dist/esm/editor/TiptapEditor.mjs.map +1 -1
  156. package/dist/esm/editor/TiptapEditor.native.js +165 -280
  157. package/dist/esm/editor/TiptapEditor.native.js.map +1 -1
  158. package/dist/esm/editor/blockAnchor.mjs +18 -0
  159. package/dist/esm/editor/blockAnchor.mjs.map +1 -0
  160. package/dist/esm/editor/blockAnchor.native.js +40 -0
  161. package/dist/esm/editor/blockAnchor.native.js.map +1 -0
  162. package/dist/esm/editor/capabilities.mjs +10 -0
  163. package/dist/esm/editor/capabilities.mjs.map +1 -0
  164. package/dist/esm/editor/capabilities.native.js +11 -0
  165. package/dist/esm/editor/capabilities.native.js.map +1 -0
  166. package/dist/esm/editor/codeBlockPreview.mjs +190 -0
  167. package/dist/esm/editor/codeBlockPreview.mjs.map +1 -0
  168. package/dist/esm/editor/codeBlockPreview.native.js +222 -0
  169. package/dist/esm/editor/codeBlockPreview.native.js.map +1 -0
  170. package/dist/esm/editor/editorStyles.mjs +203 -34
  171. package/dist/esm/editor/editorStyles.mjs.map +1 -1
  172. package/dist/esm/editor/editorStyles.native.js +203 -34
  173. package/dist/esm/editor/editorStyles.native.js.map +1 -1
  174. package/dist/esm/editor/emoji.mjs +88 -0
  175. package/dist/esm/editor/emoji.mjs.map +1 -0
  176. package/dist/esm/editor/emoji.native.js +141 -0
  177. package/dist/esm/editor/emoji.native.js.map +1 -0
  178. package/dist/esm/editor/extensions.mjs +236 -0
  179. package/dist/esm/editor/extensions.mjs.map +1 -0
  180. package/dist/esm/editor/extensions.native.js +286 -0
  181. package/dist/esm/editor/extensions.native.js.map +1 -0
  182. package/dist/esm/editor/lazyKatex.mjs +40 -0
  183. package/dist/esm/editor/lazyKatex.mjs.map +1 -0
  184. package/dist/esm/editor/lazyKatex.native.js +76 -0
  185. package/dist/esm/editor/lazyKatex.native.js.map +1 -0
  186. package/dist/esm/editor/markdown.mjs +179 -0
  187. package/dist/esm/editor/markdown.mjs.map +1 -0
  188. package/dist/esm/editor/markdown.native.js +238 -0
  189. package/dist/esm/editor/markdown.native.js.map +1 -0
  190. package/dist/esm/editor/mathematics.mjs +142 -0
  191. package/dist/esm/editor/mathematics.mjs.map +1 -0
  192. package/dist/esm/editor/mathematics.native.js +173 -0
  193. package/dist/esm/editor/mathematics.native.js.map +1 -0
  194. package/dist/esm/editor/media.mjs +113 -0
  195. package/dist/esm/editor/media.mjs.map +1 -0
  196. package/dist/esm/editor/media.native.js +144 -0
  197. package/dist/esm/editor/media.native.js.map +1 -0
  198. package/dist/esm/editor/mentions.mjs +37 -0
  199. package/dist/esm/editor/mentions.mjs.map +1 -0
  200. package/dist/esm/editor/mentions.native.js +45 -0
  201. package/dist/esm/editor/mentions.native.js.map +1 -0
  202. package/dist/esm/editor/pasteCleanup.mjs +57 -0
  203. package/dist/esm/editor/pasteCleanup.mjs.map +1 -0
  204. package/dist/esm/editor/pasteCleanup.native.js +146 -0
  205. package/dist/esm/editor/pasteCleanup.native.js.map +1 -0
  206. package/dist/esm/editor/suggestionPopup.mjs +268 -0
  207. package/dist/esm/editor/suggestionPopup.mjs.map +1 -0
  208. package/dist/esm/editor/suggestionPopup.native.js +295 -0
  209. package/dist/esm/editor/suggestionPopup.native.js.map +1 -0
  210. package/dist/esm/index.mjs +2 -1
  211. package/dist/esm/index.mjs.map +1 -1
  212. package/dist/esm/index.native.js +2 -1
  213. package/dist/esm/index.native.js.map +1 -1
  214. package/dist/esm/preview.mjs +236 -0
  215. package/dist/esm/preview.mjs.map +1 -0
  216. package/dist/esm/preview.native.js +264 -0
  217. package/dist/esm/preview.native.js.map +1 -0
  218. package/dist/esm/shared/t.mjs +17 -0
  219. package/dist/esm/shared/t.mjs.map +1 -0
  220. package/dist/esm/shared/t.native.js +17 -0
  221. package/dist/esm/shared/t.native.js.map +1 -0
  222. package/dist/esm/shared/url.mjs +10 -0
  223. package/dist/esm/shared/url.mjs.map +1 -0
  224. package/dist/esm/shared/url.native.js +10 -0
  225. package/dist/esm/shared/url.native.js.map +1 -0
  226. package/dist/esm/styled.mjs +13 -6
  227. package/dist/esm/styled.mjs.map +1 -1
  228. package/dist/esm/styled.native.js +13 -6
  229. package/dist/esm/styled.native.js.map +1 -1
  230. package/dist/esm/toolbar/BubbleToolbar.mjs +20 -15
  231. package/dist/esm/toolbar/BubbleToolbar.mjs.map +1 -1
  232. package/dist/esm/toolbar/BubbleToolbar.native.js +23 -16
  233. package/dist/esm/toolbar/BubbleToolbar.native.js.map +1 -1
  234. package/dist/esm/toolbar/CodeBlockBubble.mjs +60 -24
  235. package/dist/esm/toolbar/CodeBlockBubble.mjs.map +1 -1
  236. package/dist/esm/toolbar/CodeBlockBubble.native.js +72 -26
  237. package/dist/esm/toolbar/CodeBlockBubble.native.js.map +1 -1
  238. package/dist/esm/toolbar/ColorPicker.mjs +21 -56
  239. package/dist/esm/toolbar/ColorPicker.mjs.map +1 -1
  240. package/dist/esm/toolbar/ColorPicker.native.js +82 -180
  241. package/dist/esm/toolbar/ColorPicker.native.js.map +1 -1
  242. package/dist/esm/toolbar/FixedToolbar.mjs +40 -14
  243. package/dist/esm/toolbar/FixedToolbar.mjs.map +1 -1
  244. package/dist/esm/toolbar/FixedToolbar.native.js +47 -55
  245. package/dist/esm/toolbar/FixedToolbar.native.js.map +1 -1
  246. package/dist/esm/toolbar/HeadingPicker.mjs +34 -41
  247. package/dist/esm/toolbar/HeadingPicker.mjs.map +1 -1
  248. package/dist/esm/toolbar/HeadingPicker.native.js +63 -53
  249. package/dist/esm/toolbar/HeadingPicker.native.js.map +1 -1
  250. package/dist/esm/toolbar/ImageBubble.mjs +20 -43
  251. package/dist/esm/toolbar/ImageBubble.mjs.map +1 -1
  252. package/dist/esm/toolbar/ImageBubble.native.js +20 -43
  253. package/dist/esm/toolbar/ImageBubble.native.js.map +1 -1
  254. package/dist/esm/toolbar/ImageDialog.mjs +5 -4
  255. package/dist/esm/toolbar/ImageDialog.mjs.map +1 -1
  256. package/dist/esm/toolbar/ImageDialog.native.js +75 -64
  257. package/dist/esm/toolbar/ImageDialog.native.js.map +1 -1
  258. package/dist/esm/toolbar/LinkBubble.mjs +23 -70
  259. package/dist/esm/toolbar/LinkBubble.mjs.map +1 -1
  260. package/dist/esm/toolbar/LinkBubble.native.js +23 -70
  261. package/dist/esm/toolbar/LinkBubble.native.js.map +1 -1
  262. package/dist/esm/toolbar/LinkDialog.mjs +17 -16
  263. package/dist/esm/toolbar/LinkDialog.mjs.map +1 -1
  264. package/dist/esm/toolbar/LinkDialog.native.js +84 -80
  265. package/dist/esm/toolbar/LinkDialog.native.js.map +1 -1
  266. package/dist/esm/toolbar/ListPicker.mjs +33 -44
  267. package/dist/esm/toolbar/ListPicker.mjs.map +1 -1
  268. package/dist/esm/toolbar/ListPicker.native.js +44 -45
  269. package/dist/esm/toolbar/ListPicker.native.js.map +1 -1
  270. package/dist/esm/toolbar/MathBubble.mjs +134 -0
  271. package/dist/esm/toolbar/MathBubble.mjs.map +1 -0
  272. package/dist/esm/toolbar/MathBubble.native.js +141 -0
  273. package/dist/esm/toolbar/MathBubble.native.js.map +1 -0
  274. package/dist/esm/toolbar/MoreDropdown.mjs +53 -92
  275. package/dist/esm/toolbar/MoreDropdown.mjs.map +1 -1
  276. package/dist/esm/toolbar/MoreDropdown.native.js +79 -92
  277. package/dist/esm/toolbar/MoreDropdown.native.js.map +1 -1
  278. package/dist/esm/toolbar/StatusBar.mjs +19 -10
  279. package/dist/esm/toolbar/StatusBar.mjs.map +1 -1
  280. package/dist/esm/toolbar/StatusBar.native.js +19 -10
  281. package/dist/esm/toolbar/StatusBar.native.js.map +1 -1
  282. package/dist/esm/toolbar/TableBubble.mjs +91 -96
  283. package/dist/esm/toolbar/TableBubble.mjs.map +1 -1
  284. package/dist/esm/toolbar/TableBubble.native.js +90 -73
  285. package/dist/esm/toolbar/TableBubble.native.js.map +1 -1
  286. package/dist/esm/toolbar/ToolbarButton.mjs +87 -22
  287. package/dist/esm/toolbar/ToolbarButton.mjs.map +1 -1
  288. package/dist/esm/toolbar/ToolbarButton.native.js +14 -4
  289. package/dist/esm/toolbar/ToolbarButton.native.js.map +1 -1
  290. package/dist/esm/toolbar/icons.mjs +109 -469
  291. package/dist/esm/toolbar/icons.mjs.map +1 -1
  292. package/dist/esm/toolbar/shortcuts.mjs +73 -24
  293. package/dist/esm/toolbar/shortcuts.mjs.map +1 -1
  294. package/dist/esm/toolbar/shortcuts.native.js +73 -24
  295. package/dist/esm/toolbar/shortcuts.native.js.map +1 -1
  296. package/dist/esm/toolbar/useHorizontalScroll.mjs +25 -6
  297. package/dist/esm/toolbar/useHorizontalScroll.mjs.map +1 -1
  298. package/dist/esm/toolbar/useHorizontalScroll.native.js +25 -6
  299. package/dist/esm/toolbar/useHorizontalScroll.native.js.map +1 -1
  300. package/dist/esm/toolbar/useRovingFocus.mjs +55 -0
  301. package/dist/esm/toolbar/useRovingFocus.mjs.map +1 -0
  302. package/dist/esm/toolbar/useRovingFocus.native.js +85 -0
  303. package/dist/esm/toolbar/useRovingFocus.native.js.map +1 -0
  304. package/dist/esm/types.mjs.map +1 -1
  305. package/dist/esm/types.native.js.map +1 -1
  306. package/dist/jsx/RichEditor.mjs +90 -10
  307. package/dist/jsx/RichEditor.mjs.map +1 -1
  308. package/dist/jsx/RichEditor.native.js +444 -35
  309. package/dist/jsx/RichEditor.native.js.map +1 -1
  310. package/dist/jsx/RichTextEditor/index.mjs +20 -2
  311. package/dist/jsx/RichTextEditor/index.mjs.map +1 -1
  312. package/dist/jsx/RichTextEditor/index.native.js +20 -2
  313. package/dist/jsx/RichTextEditor/index.native.js.map +1 -1
  314. package/dist/jsx/constants.mjs +47 -29
  315. package/dist/jsx/constants.mjs.map +1 -1
  316. package/dist/jsx/constants.native.js +59 -29
  317. package/dist/jsx/constants.native.js.map +1 -1
  318. package/dist/jsx/editor/BlockDragHandle.mjs +22 -7
  319. package/dist/jsx/editor/BlockDragHandle.mjs.map +1 -1
  320. package/dist/jsx/editor/BlockDragHandle.native.js +41 -7
  321. package/dist/jsx/editor/BlockDragHandle.native.js.map +1 -1
  322. package/dist/jsx/editor/SlashCommands.mjs +258 -295
  323. package/dist/jsx/editor/SlashCommands.mjs.map +1 -1
  324. package/dist/jsx/editor/SlashCommands.native.js +320 -341
  325. package/dist/jsx/editor/SlashCommands.native.js.map +1 -1
  326. package/dist/jsx/editor/TentapEditor.native.js +59 -12
  327. package/dist/jsx/editor/TentapEditor.native.js.map +1 -1
  328. package/dist/jsx/editor/TiptapEditor.mjs +145 -231
  329. package/dist/jsx/editor/TiptapEditor.mjs.map +1 -1
  330. package/dist/jsx/editor/TiptapEditor.native.js +163 -289
  331. package/dist/jsx/editor/TiptapEditor.native.js.map +1 -1
  332. package/dist/jsx/editor/blockAnchor.mjs +18 -0
  333. package/dist/jsx/editor/blockAnchor.mjs.map +1 -0
  334. package/dist/jsx/editor/blockAnchor.native.js +68 -0
  335. package/dist/jsx/editor/blockAnchor.native.js.map +1 -0
  336. package/dist/jsx/editor/capabilities.mjs +10 -0
  337. package/dist/jsx/editor/capabilities.mjs.map +1 -0
  338. package/dist/jsx/editor/capabilities.native.js +41 -0
  339. package/dist/jsx/editor/capabilities.native.js.map +1 -0
  340. package/dist/jsx/editor/codeBlockPreview.mjs +190 -0
  341. package/dist/jsx/editor/codeBlockPreview.mjs.map +1 -0
  342. package/dist/jsx/editor/codeBlockPreview.native.js +265 -0
  343. package/dist/jsx/editor/codeBlockPreview.native.js.map +1 -0
  344. package/dist/jsx/editor/editorStyles.mjs +203 -34
  345. package/dist/jsx/editor/editorStyles.mjs.map +1 -1
  346. package/dist/jsx/editor/editorStyles.native.js +203 -34
  347. package/dist/jsx/editor/editorStyles.native.js.map +1 -1
  348. package/dist/jsx/editor/emoji.mjs +88 -0
  349. package/dist/jsx/editor/emoji.mjs.map +1 -0
  350. package/dist/jsx/editor/emoji.native.js +184 -0
  351. package/dist/jsx/editor/emoji.native.js.map +1 -0
  352. package/dist/jsx/editor/extensions.mjs +236 -0
  353. package/dist/jsx/editor/extensions.mjs.map +1 -0
  354. package/dist/jsx/editor/extensions.native.js +328 -0
  355. package/dist/jsx/editor/extensions.native.js.map +1 -0
  356. package/dist/jsx/editor/lazyKatex.mjs +40 -0
  357. package/dist/jsx/editor/lazyKatex.mjs.map +1 -0
  358. package/dist/jsx/editor/lazyKatex.native.js +117 -0
  359. package/dist/jsx/editor/lazyKatex.native.js.map +1 -0
  360. package/dist/jsx/editor/markdown.mjs +179 -0
  361. package/dist/jsx/editor/markdown.mjs.map +1 -0
  362. package/dist/jsx/editor/markdown.native.js +278 -0
  363. package/dist/jsx/editor/markdown.native.js.map +1 -0
  364. package/dist/jsx/editor/mathematics.mjs +142 -0
  365. package/dist/jsx/editor/mathematics.mjs.map +1 -0
  366. package/dist/jsx/editor/mathematics.native.js +202 -0
  367. package/dist/jsx/editor/mathematics.native.js.map +1 -0
  368. package/dist/jsx/editor/media.mjs +113 -0
  369. package/dist/jsx/editor/media.mjs.map +1 -0
  370. package/dist/jsx/editor/media.native.js +172 -0
  371. package/dist/jsx/editor/media.native.js.map +1 -0
  372. package/dist/jsx/editor/mentions.mjs +37 -0
  373. package/dist/jsx/editor/mentions.mjs.map +1 -0
  374. package/dist/jsx/editor/mentions.native.js +84 -0
  375. package/dist/jsx/editor/mentions.native.js.map +1 -0
  376. package/dist/jsx/editor/pasteCleanup.mjs +57 -0
  377. package/dist/jsx/editor/pasteCleanup.mjs.map +1 -0
  378. package/dist/jsx/editor/pasteCleanup.native.js +175 -0
  379. package/dist/jsx/editor/pasteCleanup.native.js.map +1 -0
  380. package/dist/jsx/editor/suggestionPopup.mjs +268 -0
  381. package/dist/jsx/editor/suggestionPopup.mjs.map +1 -0
  382. package/dist/jsx/editor/suggestionPopup.native.js +327 -0
  383. package/dist/jsx/editor/suggestionPopup.native.js.map +1 -0
  384. package/dist/jsx/index.js +2 -1
  385. package/dist/jsx/index.js.map +1 -1
  386. package/dist/jsx/index.mjs +2 -1
  387. package/dist/jsx/index.mjs.map +1 -1
  388. package/dist/jsx/index.native.js +4 -1
  389. package/dist/jsx/index.native.js.map +1 -1
  390. package/dist/jsx/preview.mjs +236 -0
  391. package/dist/jsx/preview.mjs.map +1 -0
  392. package/dist/jsx/preview.native.js +294 -0
  393. package/dist/jsx/preview.native.js.map +1 -0
  394. package/dist/jsx/shared/t.mjs +17 -0
  395. package/dist/jsx/shared/t.mjs.map +1 -0
  396. package/dist/jsx/shared/t.native.js +56 -0
  397. package/dist/jsx/shared/t.native.js.map +1 -0
  398. package/dist/jsx/shared/url.mjs +10 -0
  399. package/dist/jsx/shared/url.mjs.map +1 -0
  400. package/dist/jsx/shared/url.native.js +38 -0
  401. package/dist/jsx/shared/url.native.js.map +1 -0
  402. package/dist/jsx/styled.mjs +13 -6
  403. package/dist/jsx/styled.mjs.map +1 -1
  404. package/dist/jsx/styled.native.js +13 -6
  405. package/dist/jsx/styled.native.js.map +1 -1
  406. package/dist/jsx/toolbar/BubbleToolbar.mjs +20 -15
  407. package/dist/jsx/toolbar/BubbleToolbar.mjs.map +1 -1
  408. package/dist/jsx/toolbar/BubbleToolbar.native.js +22 -15
  409. package/dist/jsx/toolbar/BubbleToolbar.native.js.map +1 -1
  410. package/dist/jsx/toolbar/CodeBlockBubble.mjs +60 -24
  411. package/dist/jsx/toolbar/CodeBlockBubble.mjs.map +1 -1
  412. package/dist/jsx/toolbar/CodeBlockBubble.native.js +71 -25
  413. package/dist/jsx/toolbar/CodeBlockBubble.native.js.map +1 -1
  414. package/dist/jsx/toolbar/ColorPicker.mjs +21 -56
  415. package/dist/jsx/toolbar/ColorPicker.mjs.map +1 -1
  416. package/dist/jsx/toolbar/ColorPicker.native.js +81 -179
  417. package/dist/jsx/toolbar/ColorPicker.native.js.map +1 -1
  418. package/dist/jsx/toolbar/FixedToolbar.mjs +40 -14
  419. package/dist/jsx/toolbar/FixedToolbar.mjs.map +1 -1
  420. package/dist/jsx/toolbar/FixedToolbar.native.js +46 -54
  421. package/dist/jsx/toolbar/FixedToolbar.native.js.map +1 -1
  422. package/dist/jsx/toolbar/HeadingPicker.mjs +34 -41
  423. package/dist/jsx/toolbar/HeadingPicker.mjs.map +1 -1
  424. package/dist/jsx/toolbar/HeadingPicker.native.js +61 -51
  425. package/dist/jsx/toolbar/HeadingPicker.native.js.map +1 -1
  426. package/dist/jsx/toolbar/ImageBubble.mjs +20 -43
  427. package/dist/jsx/toolbar/ImageBubble.mjs.map +1 -1
  428. package/dist/jsx/toolbar/ImageBubble.native.js +20 -43
  429. package/dist/jsx/toolbar/ImageBubble.native.js.map +1 -1
  430. package/dist/jsx/toolbar/ImageDialog.mjs +5 -4
  431. package/dist/jsx/toolbar/ImageDialog.mjs.map +1 -1
  432. package/dist/jsx/toolbar/ImageDialog.native.js +76 -65
  433. package/dist/jsx/toolbar/ImageDialog.native.js.map +1 -1
  434. package/dist/jsx/toolbar/LinkBubble.mjs +23 -70
  435. package/dist/jsx/toolbar/LinkBubble.mjs.map +1 -1
  436. package/dist/jsx/toolbar/LinkBubble.native.js +23 -70
  437. package/dist/jsx/toolbar/LinkBubble.native.js.map +1 -1
  438. package/dist/jsx/toolbar/LinkDialog.mjs +17 -16
  439. package/dist/jsx/toolbar/LinkDialog.mjs.map +1 -1
  440. package/dist/jsx/toolbar/LinkDialog.native.js +86 -83
  441. package/dist/jsx/toolbar/LinkDialog.native.js.map +1 -1
  442. package/dist/jsx/toolbar/ListPicker.mjs +33 -44
  443. package/dist/jsx/toolbar/ListPicker.mjs.map +1 -1
  444. package/dist/jsx/toolbar/ListPicker.native.js +43 -44
  445. package/dist/jsx/toolbar/ListPicker.native.js.map +1 -1
  446. package/dist/jsx/toolbar/MathBubble.mjs +134 -0
  447. package/dist/jsx/toolbar/MathBubble.mjs.map +1 -0
  448. package/dist/jsx/toolbar/MathBubble.native.js +169 -0
  449. package/dist/jsx/toolbar/MathBubble.native.js.map +1 -0
  450. package/dist/jsx/toolbar/MoreDropdown.mjs +53 -92
  451. package/dist/jsx/toolbar/MoreDropdown.mjs.map +1 -1
  452. package/dist/jsx/toolbar/MoreDropdown.native.js +80 -93
  453. package/dist/jsx/toolbar/MoreDropdown.native.js.map +1 -1
  454. package/dist/jsx/toolbar/StatusBar.mjs +19 -10
  455. package/dist/jsx/toolbar/StatusBar.mjs.map +1 -1
  456. package/dist/jsx/toolbar/StatusBar.native.js +19 -10
  457. package/dist/jsx/toolbar/StatusBar.native.js.map +1 -1
  458. package/dist/jsx/toolbar/TableBubble.mjs +91 -96
  459. package/dist/jsx/toolbar/TableBubble.mjs.map +1 -1
  460. package/dist/jsx/toolbar/TableBubble.native.js +90 -73
  461. package/dist/jsx/toolbar/TableBubble.native.js.map +1 -1
  462. package/dist/jsx/toolbar/ToolbarButton.mjs +87 -22
  463. package/dist/jsx/toolbar/ToolbarButton.mjs.map +1 -1
  464. package/dist/jsx/toolbar/ToolbarButton.native.js +14 -4
  465. package/dist/jsx/toolbar/ToolbarButton.native.js.map +1 -1
  466. package/dist/jsx/toolbar/icons.mjs +109 -469
  467. package/dist/jsx/toolbar/icons.mjs.map +1 -1
  468. package/dist/jsx/toolbar/shortcuts.mjs +73 -24
  469. package/dist/jsx/toolbar/shortcuts.mjs.map +1 -1
  470. package/dist/jsx/toolbar/shortcuts.native.js +73 -24
  471. package/dist/jsx/toolbar/shortcuts.native.js.map +1 -1
  472. package/dist/jsx/toolbar/useHorizontalScroll.mjs +25 -6
  473. package/dist/jsx/toolbar/useHorizontalScroll.mjs.map +1 -1
  474. package/dist/jsx/toolbar/useHorizontalScroll.native.js +25 -5
  475. package/dist/jsx/toolbar/useHorizontalScroll.native.js.map +1 -1
  476. package/dist/jsx/toolbar/useRovingFocus.mjs +55 -0
  477. package/dist/jsx/toolbar/useRovingFocus.mjs.map +1 -0
  478. package/dist/jsx/toolbar/useRovingFocus.native.js +113 -0
  479. package/dist/jsx/toolbar/useRovingFocus.native.js.map +1 -0
  480. package/dist/jsx/types.mjs.map +1 -1
  481. package/dist/jsx/types.native.js.map +1 -1
  482. package/package.json +28 -13
  483. package/src/RichEditor.native.tsx +471 -49
  484. package/src/RichEditor.stories.tsx +190 -0
  485. package/src/RichEditor.tsx +126 -7
  486. package/src/RichTextEditor/index.tsx +54 -3
  487. package/src/RichTextEditor/richTextEditor.spec.tsx +11 -4
  488. package/src/constants.ts +86 -24
  489. package/src/editor/BlockDragHandle.ts +30 -5
  490. package/src/editor/SlashCommands.tsx +238 -293
  491. package/src/editor/TentapEditor.native.tsx +81 -17
  492. package/src/editor/TiptapEditor.tsx +202 -265
  493. package/src/editor/blockAnchor.spec.ts +70 -0
  494. package/src/editor/blockAnchor.ts +42 -0
  495. package/src/editor/capabilities.spec.ts +190 -0
  496. package/src/editor/capabilities.ts +76 -0
  497. package/src/editor/codeBlockPreview.spec.ts +144 -0
  498. package/src/editor/codeBlockPreview.ts +266 -0
  499. package/src/editor/css.d.ts +2 -0
  500. package/src/editor/details.spec.ts +48 -0
  501. package/src/editor/editorStyles.spec.ts +25 -0
  502. package/src/editor/editorStyles.ts +218 -34
  503. package/src/editor/emoji.spec.ts +88 -0
  504. package/src/editor/emoji.ts +147 -0
  505. package/src/editor/emojilib.d.ts +16 -0
  506. package/src/editor/extensions.ts +315 -0
  507. package/src/editor/lazyKatex.spec.ts +38 -0
  508. package/src/editor/lazyKatex.ts +68 -0
  509. package/src/editor/markdown.spec.ts +196 -0
  510. package/src/editor/markdown.ts +249 -0
  511. package/src/editor/mathematics.spec.ts +97 -0
  512. package/src/editor/mathematics.ts +179 -0
  513. package/src/editor/media.spec.ts +121 -0
  514. package/src/editor/media.ts +133 -0
  515. package/src/editor/mentions.spec.ts +41 -0
  516. package/src/editor/mentions.ts +55 -0
  517. package/src/editor/pasteCleanup.spec.ts +84 -0
  518. package/src/editor/pasteCleanup.ts +124 -0
  519. package/src/editor/suggestionPopup.spec.tsx +105 -0
  520. package/src/editor/suggestionPopup.tsx +414 -0
  521. package/src/editor/tiptapEditor.spec.tsx +15 -8
  522. package/src/exports.spec.ts +4 -2
  523. package/src/index.ts +10 -1
  524. package/src/integration.spec.tsx +38 -9
  525. package/src/preview.spec.ts +130 -0
  526. package/src/preview.ts +287 -0
  527. package/src/richEditor.spec.tsx +10 -3
  528. package/src/shared/t.ts +25 -0
  529. package/src/shared/url.ts +16 -0
  530. package/src/styled.ts +13 -6
  531. package/src/toolbar/BubbleToolbar.tsx +48 -33
  532. package/src/toolbar/CodeBlockBubble.tsx +66 -28
  533. package/src/toolbar/ColorPicker.native.tsx +126 -0
  534. package/src/toolbar/ColorPicker.tsx +23 -67
  535. package/src/toolbar/FixedToolbar.native.tsx +51 -51
  536. package/src/toolbar/FixedToolbar.tsx +73 -21
  537. package/src/toolbar/HeadingPicker.tsx +46 -38
  538. package/src/toolbar/ImageBubble.tsx +26 -44
  539. package/src/toolbar/ImageDialog.native.tsx +97 -0
  540. package/src/toolbar/ImageDialog.tsx +5 -4
  541. package/src/toolbar/LinkBubble.tsx +27 -64
  542. package/src/toolbar/LinkDialog.native.tsx +117 -0
  543. package/src/toolbar/LinkDialog.tsx +28 -24
  544. package/src/toolbar/ListPicker.tsx +47 -43
  545. package/src/toolbar/MathBubble.tsx +140 -0
  546. package/src/toolbar/MoreDropdown.tsx +79 -62
  547. package/src/toolbar/StatusBar.tsx +13 -8
  548. package/src/toolbar/TableBubble.tsx +136 -95
  549. package/src/toolbar/ToolbarButton.native.tsx +14 -4
  550. package/src/toolbar/ToolbarButton.tsx +98 -19
  551. package/src/toolbar/bubbleToolbar.spec.tsx +2 -1
  552. package/src/toolbar/fixedToolbar.spec.tsx +4 -2
  553. package/src/toolbar/icons.tsx +113 -323
  554. package/src/toolbar/shortcuts.ts +77 -24
  555. package/src/toolbar/toolbarPrimitives.spec.tsx +29 -1
  556. package/src/toolbar/toolbarSubComponents.spec.tsx +4 -2
  557. package/src/toolbar/useHorizontalScroll.spec.ts +67 -0
  558. package/src/toolbar/useHorizontalScroll.tsx +39 -12
  559. package/src/toolbar/useRovingFocus.spec.tsx +100 -0
  560. package/src/toolbar/useRovingFocus.ts +82 -0
  561. package/src/types.spec.ts +40 -1
  562. package/src/types.ts +56 -1
  563. package/types/RichEditor.d.ts +51 -0
  564. package/types/RichEditor.d.ts.map +1 -0
  565. package/types/RichEditor.native.d.ts +59 -0
  566. package/types/RichEditor.native.d.ts.map +1 -0
  567. package/types/RichTextEditor/index.d.ts +77 -0
  568. package/types/RichTextEditor/index.d.ts.map +1 -0
  569. package/types/constants.d.ts +49 -0
  570. package/types/constants.d.ts.map +1 -0
  571. package/types/context.d.ts +10 -0
  572. package/types/context.d.ts.map +1 -0
  573. package/types/editor/BlockDragHandle.d.ts +8 -0
  574. package/types/editor/BlockDragHandle.d.ts.map +1 -0
  575. package/types/editor/MarkdownPaste.d.ts +8 -0
  576. package/types/editor/MarkdownPaste.d.ts.map +1 -0
  577. package/types/editor/SlashCommands.d.ts +24 -0
  578. package/types/editor/SlashCommands.d.ts.map +1 -0
  579. package/types/editor/TentapEditor.native.d.ts +21 -0
  580. package/types/editor/TentapEditor.native.d.ts.map +1 -0
  581. package/types/editor/TiptapEditor.d.ts +24 -0
  582. package/types/editor/TiptapEditor.d.ts.map +1 -0
  583. package/types/editor/blockAnchor.d.ts +25 -0
  584. package/types/editor/blockAnchor.d.ts.map +1 -0
  585. package/types/editor/capabilities.d.ts +29 -0
  586. package/types/editor/capabilities.d.ts.map +1 -0
  587. package/types/editor/codeBlockPreview.d.ts +51 -0
  588. package/types/editor/codeBlockPreview.d.ts.map +1 -0
  589. package/types/editor/editorStyles.d.ts +25 -0
  590. package/types/editor/editorStyles.d.ts.map +1 -0
  591. package/types/editor/emoji.d.ts +45 -0
  592. package/types/editor/emoji.d.ts.map +1 -0
  593. package/types/editor/extensions.d.ts +41 -0
  594. package/types/editor/extensions.d.ts.map +1 -0
  595. package/types/editor/index.d.ts +11 -0
  596. package/types/editor/index.d.ts.map +1 -0
  597. package/types/editor/lazyKatex.d.ts +33 -0
  598. package/types/editor/lazyKatex.d.ts.map +1 -0
  599. package/types/editor/markdown.d.ts +24 -0
  600. package/types/editor/markdown.d.ts.map +1 -0
  601. package/types/editor/mathematics.d.ts +44 -0
  602. package/types/editor/mathematics.d.ts.map +1 -0
  603. package/types/editor/media.d.ts +32 -0
  604. package/types/editor/media.d.ts.map +1 -0
  605. package/types/editor/mentions.d.ts +15 -0
  606. package/types/editor/mentions.d.ts.map +1 -0
  607. package/types/editor/pasteCleanup.d.ts +24 -0
  608. package/types/editor/pasteCleanup.d.ts.map +1 -0
  609. package/types/editor/suggestionPopup.d.ts +113 -0
  610. package/types/editor/suggestionPopup.d.ts.map +1 -0
  611. package/types/editor/types.d.ts +80 -0
  612. package/types/editor/types.d.ts.map +1 -0
  613. package/types/editor/useEditorState.d.ts +19 -0
  614. package/types/editor/useEditorState.d.ts.map +1 -0
  615. package/types/index.d.ts +12 -0
  616. package/types/index.d.ts.map +1 -0
  617. package/types/preview.d.ts +44 -0
  618. package/types/preview.d.ts.map +1 -0
  619. package/types/shared/t.d.ts +10 -0
  620. package/types/shared/t.d.ts.map +1 -0
  621. package/types/shared/url.d.ts +9 -0
  622. package/types/shared/url.d.ts.map +1 -0
  623. package/types/styled.d.ts +40 -0
  624. package/types/styled.d.ts.map +1 -0
  625. package/types/toolbar/BubbleToolbar.d.ts +25 -0
  626. package/types/toolbar/BubbleToolbar.d.ts.map +1 -0
  627. package/types/toolbar/CodeBlockBubble.d.ts +10 -0
  628. package/types/toolbar/CodeBlockBubble.d.ts.map +1 -0
  629. package/types/toolbar/ColorPicker.d.ts +15 -0
  630. package/types/toolbar/ColorPicker.d.ts.map +1 -0
  631. package/types/toolbar/ColorPicker.native.d.ts +20 -0
  632. package/types/toolbar/ColorPicker.native.d.ts.map +1 -0
  633. package/types/toolbar/FixedToolbar.d.ts +34 -0
  634. package/types/toolbar/FixedToolbar.d.ts.map +1 -0
  635. package/types/toolbar/FixedToolbar.native.d.ts +30 -0
  636. package/types/toolbar/FixedToolbar.native.d.ts.map +1 -0
  637. package/types/toolbar/HeadingPicker.d.ts +14 -0
  638. package/types/toolbar/HeadingPicker.d.ts.map +1 -0
  639. package/types/toolbar/ImageBubble.d.ts +10 -0
  640. package/types/toolbar/ImageBubble.d.ts.map +1 -0
  641. package/types/toolbar/ImageDialog.d.ts +12 -0
  642. package/types/toolbar/ImageDialog.d.ts.map +1 -0
  643. package/types/toolbar/ImageDialog.native.d.ts +15 -0
  644. package/types/toolbar/ImageDialog.native.d.ts.map +1 -0
  645. package/types/toolbar/LinkBubble.d.ts +10 -0
  646. package/types/toolbar/LinkBubble.d.ts.map +1 -0
  647. package/types/toolbar/LinkDialog.d.ts +20 -0
  648. package/types/toolbar/LinkDialog.d.ts.map +1 -0
  649. package/types/toolbar/LinkDialog.native.d.ts +18 -0
  650. package/types/toolbar/LinkDialog.native.d.ts.map +1 -0
  651. package/types/toolbar/ListPicker.d.ts +14 -0
  652. package/types/toolbar/ListPicker.d.ts.map +1 -0
  653. package/types/toolbar/MathBubble.d.ts +11 -0
  654. package/types/toolbar/MathBubble.d.ts.map +1 -0
  655. package/types/toolbar/MoreDropdown.d.ts +15 -0
  656. package/types/toolbar/MoreDropdown.d.ts.map +1 -0
  657. package/types/toolbar/ResizeHandle.d.ts +11 -0
  658. package/types/toolbar/ResizeHandle.d.ts.map +1 -0
  659. package/types/toolbar/StatusBar.d.ts +11 -0
  660. package/types/toolbar/StatusBar.d.ts.map +1 -0
  661. package/types/toolbar/TableBubble.d.ts +13 -0
  662. package/types/toolbar/TableBubble.d.ts.map +1 -0
  663. package/types/toolbar/ToolbarButton.d.ts +35 -0
  664. package/types/toolbar/ToolbarButton.d.ts.map +1 -0
  665. package/types/toolbar/ToolbarButton.native.d.ts +30 -0
  666. package/types/toolbar/ToolbarButton.native.d.ts.map +1 -0
  667. package/types/toolbar/ToolbarGroup.d.ts +14 -0
  668. package/types/toolbar/ToolbarGroup.d.ts.map +1 -0
  669. package/types/toolbar/icons.d.ts +52 -0
  670. package/types/toolbar/icons.d.ts.map +1 -0
  671. package/types/toolbar/icons.native.d.ts +41 -0
  672. package/types/toolbar/icons.native.d.ts.map +1 -0
  673. package/types/toolbar/shortcuts.d.ts +34 -0
  674. package/types/toolbar/shortcuts.d.ts.map +1 -0
  675. package/types/toolbar/useHorizontalScroll.d.ts +43 -0
  676. package/types/toolbar/useHorizontalScroll.d.ts.map +1 -0
  677. package/types/toolbar/useRovingFocus.d.ts +10 -0
  678. package/types/toolbar/useRovingFocus.d.ts.map +1 -0
  679. package/types/types.d.ts +147 -0
  680. package/types/types.d.ts.map +1 -0
  681. package/dist/cjs/RichEditor.stories.cjs +0 -327
  682. package/dist/cjs/RichEditor.stories.native.js +0 -342
  683. package/dist/cjs/RichEditor.stories.native.js.map +0 -1
  684. package/dist/esm/RichEditor.stories.mjs +0 -291
  685. package/dist/esm/RichEditor.stories.mjs.map +0 -1
  686. package/dist/esm/RichEditor.stories.native.js +0 -303
  687. package/dist/esm/RichEditor.stories.native.js.map +0 -1
  688. package/dist/jsx/RichEditor.stories.mjs +0 -291
  689. package/dist/jsx/RichEditor.stories.mjs.map +0 -1
  690. package/dist/jsx/RichEditor.stories.native.js +0 -342
  691. package/dist/jsx/RichEditor.stories.native.js.map +0 -1
@@ -0,0 +1,414 @@
1
+ /**
2
+ * Shared suggestion popup for editor typeahead menus (slash commands and
3
+ * @ mentions).
4
+ *
5
+ * One implementation (LC-16): both menus render the same row anatomy with
6
+ * the shared menu-row geometry (SP-EDGE -- the container owns only its
7
+ * border, rows own all padding and span edge-to-edge, matching
8
+ * SelectRow / DropdownMenuItemFrame / MentionSuggestionItem: 12px
9
+ * horizontal x 8px vertical padding, 8px in-row gap, flat corners).
10
+ *
11
+ * The popup is portaled to document.body (it must escape the editor frame
12
+ * and the fullscreen z-index), which puts it OUTSIDE the Tamagui theme
13
+ * scope -- so no Tamagui components and no raw CSS fallbacks. Every color
14
+ * and structural role comes from `SuggestionChrome`, resolved from the
15
+ * live theme + knobs by the editor and pushed through editor storage.
16
+ * Enter/exit motion (LC-24) fades through `motionMs`, which is 0 when the
17
+ * animation knob is "none".
18
+ */
19
+
20
+ import {
21
+ forwardRef,
22
+ useCallback,
23
+ useEffect,
24
+ useImperativeHandle,
25
+ useRef,
26
+ useState,
27
+ type CSSProperties,
28
+ type ReactNode,
29
+ } from "react";
30
+ import { Extension } from "@tiptap/core";
31
+ import { ReactRenderer } from "@tiptap/react";
32
+
33
+ // ===========================================================================
34
+ // Chrome (resolved theme + knob values, no raw fallbacks)
35
+ // ===========================================================================
36
+
37
+ export interface SuggestionChrome {
38
+ /** Panel surface color (theme background) */
39
+ background: string;
40
+ /** Panel border color */
41
+ borderColor: string;
42
+ /** Row highlight surface (active/hover) */
43
+ activeBackground: string;
44
+ /** Leading icon tile surface */
45
+ iconTileBackground: string;
46
+ /** Primary row text color */
47
+ titleColor: string;
48
+ /** Secondary row text color */
49
+ descriptionColor: string;
50
+ /** Panel corner radius in px */
51
+ radius: number;
52
+ /** Shared floating-panel shadow (Axiom 14/15 light source) */
53
+ shadow: string;
54
+ /** Enter/exit fade duration in ms (0 = animation none) */
55
+ motionMs: number;
56
+ /**
57
+ * Row horizontal padding in px, resolved from the shared LC-16
58
+ * `menuRowFrame` recipe (theme) by the editor host — the DOM popup never
59
+ * invents its own geometry.
60
+ */
61
+ rowPaddingX: number;
62
+ }
63
+
64
+ /**
65
+ * Chrome used only when the editor has not pushed resolved values yet
66
+ * (first paint edge — a popup cannot open before the host's push effect
67
+ * runs). Colors reference the tamagui `:root` default-theme custom
68
+ * properties rather than literal values, so even this edge stays sourced
69
+ * from the theme system (Axiom 5).
70
+ */
71
+ export const fallbackSuggestionChrome: SuggestionChrome = {
72
+ background: "var(--background)",
73
+ borderColor: "var(--borderColor)",
74
+ activeBackground: "var(--color4)",
75
+ iconTileBackground: "var(--color3)",
76
+ titleColor: "var(--color12)",
77
+ descriptionColor: "var(--color11)",
78
+ radius: 8,
79
+ shadow: "0px 8px 28px var(--shadow2), 0px 2px 6px var(--shadow1)",
80
+ motionMs: 120,
81
+ rowPaddingX: 12,
82
+ };
83
+
84
+ declare module "@tiptap/core" {
85
+ interface Storage {
86
+ suggestionChrome: { value: SuggestionChrome };
87
+ }
88
+ }
89
+
90
+ /**
91
+ * Storage-only extension carrying the resolved suggestion chrome. The
92
+ * editor host (TiptapEditor) resolves theme + knob values in React land and
93
+ * pushes them here so the DOM-portaled popups never invent their own colors.
94
+ */
95
+ export const SuggestionChromeStore = Extension.create({
96
+ name: "suggestionChrome",
97
+ addStorage(): { value: SuggestionChrome } {
98
+ return { value: fallbackSuggestionChrome };
99
+ },
100
+ });
101
+
102
+ /** Reads the resolved chrome pushed by the editor host */
103
+ export function getSuggestionChrome(editor: any): SuggestionChrome {
104
+ return editor?.storage?.suggestionChrome?.value ?? fallbackSuggestionChrome;
105
+ }
106
+
107
+ // ===========================================================================
108
+ // Rows
109
+ // ===========================================================================
110
+
111
+ export interface SuggestionRow {
112
+ key: string;
113
+ title: string;
114
+ description?: string;
115
+ /** Leading glyph rendered inside the icon tile */
116
+ icon?: ReactNode;
117
+ /** Avatar image URL (mentions); takes the icon tile slot */
118
+ avatarUrl?: string;
119
+ }
120
+
121
+ export interface SuggestionListProps {
122
+ rows: SuggestionRow[];
123
+ chrome: SuggestionChrome;
124
+ emptyLabel: string;
125
+ onSelect: (index: number) => void;
126
+ }
127
+
128
+ export interface SuggestionListRef {
129
+ onKeyDown: (props: { event: KeyboardEvent }) => boolean;
130
+ }
131
+
132
+ export const SuggestionList = forwardRef<SuggestionListRef, SuggestionListProps>(
133
+ ({ rows, chrome, emptyLabel, onSelect }, ref) => {
134
+ const [selectedIndex, setSelectedIndex] = useState(0);
135
+ const listRef = useRef<HTMLDivElement>(null);
136
+
137
+ useEffect(() => {
138
+ setSelectedIndex(0);
139
+ }, [rows]);
140
+
141
+ useEffect(() => {
142
+ const el = listRef.current?.children[selectedIndex] as HTMLElement | undefined;
143
+ el?.scrollIntoView({ block: "nearest" });
144
+ }, [selectedIndex]);
145
+
146
+ const selectItem = useCallback(
147
+ (index: number) => {
148
+ if (rows[index]) onSelect(index);
149
+ },
150
+ [rows, onSelect],
151
+ );
152
+
153
+ useImperativeHandle(ref, () => ({
154
+ onKeyDown: ({ event }: { event: KeyboardEvent }) => {
155
+ if (rows.length === 0) return false;
156
+ if (event.key === "ArrowUp") {
157
+ setSelectedIndex((i) => (i + rows.length - 1) % rows.length);
158
+ return true;
159
+ }
160
+ if (event.key === "ArrowDown") {
161
+ setSelectedIndex((i) => (i + 1) % rows.length);
162
+ return true;
163
+ }
164
+ if (event.key === "Enter" || event.key === "Tab") {
165
+ selectItem(selectedIndex);
166
+ return true;
167
+ }
168
+ return false;
169
+ },
170
+ }));
171
+
172
+ const containerStyle: CSSProperties = {
173
+ background: chrome.background,
174
+ border: `1px solid ${chrome.borderColor}`,
175
+ borderRadius: `${chrome.radius}px`,
176
+ boxShadow: chrome.shadow,
177
+ // SP-EDGE: container owns only its border -- rows own all padding
178
+ padding: 0,
179
+ maxHeight: "320px",
180
+ overflowY: "auto",
181
+ minWidth: "220px",
182
+ maxWidth: "320px",
183
+ };
184
+
185
+ if (rows.length === 0) {
186
+ return (
187
+ <div style={containerStyle} data-suggestion-popup="true">
188
+ <div
189
+ style={{
190
+ padding: `8px ${chrome.rowPaddingX}px`,
191
+ color: chrome.descriptionColor,
192
+ fontSize: "13px",
193
+ }}
194
+ >
195
+ {emptyLabel}
196
+ </div>
197
+ </div>
198
+ );
199
+ }
200
+
201
+ return (
202
+ <div style={containerStyle} ref={listRef} role="listbox" data-suggestion-popup="true">
203
+ {rows.map((row, index) => (
204
+ <button
205
+ key={row.key}
206
+ role="option"
207
+ aria-selected={index === selectedIndex}
208
+ type="button"
209
+ style={{
210
+ // LC-16 shared menu-row geometry (menuRowFrame): horizontal
211
+ // padding resolved from the theme recipe, 8px vertical, 8px
212
+ // in-row gap, full-width flat rows (SP-EDGE)
213
+ display: "flex",
214
+ alignItems: "center",
215
+ gap: "8px",
216
+ padding: `8px ${chrome.rowPaddingX}px`,
217
+ border: "none",
218
+ background: index === selectedIndex ? chrome.activeBackground : "none",
219
+ width: "100%",
220
+ textAlign: "start",
221
+ cursor: "pointer",
222
+ borderRadius: 0,
223
+ fontSize: "13px",
224
+ lineHeight: "1.3",
225
+ fontFamily: "inherit",
226
+ }}
227
+ onClick={() => selectItem(index)}
228
+ onMouseEnter={() => setSelectedIndex(index)}
229
+ >
230
+ {row.avatarUrl ? (
231
+ <img
232
+ src={row.avatarUrl}
233
+ alt=""
234
+ style={{
235
+ width: "24px",
236
+ height: "24px",
237
+ borderRadius: "50%",
238
+ flexShrink: 0,
239
+ objectFit: "cover",
240
+ }}
241
+ />
242
+ ) : row.icon !== undefined && row.icon !== null ? (
243
+ <span
244
+ aria-hidden="true"
245
+ style={{
246
+ width: "28px",
247
+ height: "28px",
248
+ display: "flex",
249
+ alignItems: "center",
250
+ justifyContent: "center",
251
+ borderRadius: "4px",
252
+ background: chrome.iconTileBackground,
253
+ color: chrome.titleColor,
254
+ fontWeight: 700,
255
+ fontSize: "12px",
256
+ flexShrink: 0,
257
+ }}
258
+ >
259
+ {row.icon}
260
+ </span>
261
+ ) : null}
262
+ <span style={{ display: "flex", flexDirection: "column", gap: "1px", minWidth: 0 }}>
263
+ <span
264
+ style={{
265
+ fontWeight: 600,
266
+ color: chrome.titleColor,
267
+ whiteSpace: "nowrap",
268
+ overflow: "hidden",
269
+ textOverflow: "ellipsis",
270
+ }}
271
+ >
272
+ {row.title}
273
+ </span>
274
+ {row.description ? (
275
+ <span style={{ fontSize: "11px", color: chrome.descriptionColor }}>
276
+ {row.description}
277
+ </span>
278
+ ) : null}
279
+ </span>
280
+ </button>
281
+ ))}
282
+ </div>
283
+ );
284
+ },
285
+ );
286
+
287
+ SuggestionList.displayName = "SuggestionList";
288
+
289
+ // ===========================================================================
290
+ // Popup lifecycle (shared tiptap suggestion render())
291
+ // ===========================================================================
292
+
293
+ interface PopupHandle {
294
+ element: HTMLDivElement;
295
+ destroy: (immediate?: boolean) => void;
296
+ position: (clientRect?: (() => DOMRect | null) | null) => void;
297
+ }
298
+
299
+ function createPopup(editorDom: HTMLElement, motionMs: number): PopupHandle {
300
+ const popup = document.createElement("div");
301
+ popup.style.position = "fixed";
302
+ // above the fullscreen editor frame (zIndex 100000), which the
303
+ // body-portaled popup would otherwise render underneath
304
+ popup.style.zIndex = "100001";
305
+ // Portal lives on document.body, outside the app font scope; inherit the
306
+ // editor's computed font so the menu matches the app
307
+ popup.style.fontFamily = getComputedStyle(editorDom).fontFamily;
308
+ if (motionMs > 0) {
309
+ popup.style.opacity = "0";
310
+ popup.style.transform = "translateY(4px)";
311
+ popup.style.transition = `opacity ${motionMs}ms ease, transform ${motionMs}ms ease`;
312
+ requestAnimationFrame(() => {
313
+ popup.style.opacity = "1";
314
+ popup.style.transform = "translateY(0)";
315
+ });
316
+ }
317
+ document.body.appendChild(popup);
318
+
319
+ return {
320
+ element: popup,
321
+ position: (clientRect) => {
322
+ const rect = clientRect?.();
323
+ if (!rect) return;
324
+ const menuHeight = Math.min(popup.offsetHeight || 320, 320);
325
+ const below = rect.bottom + 4;
326
+ const flip = below + menuHeight > window.innerHeight && rect.top - menuHeight - 4 > 0;
327
+ popup.style.left = `${Math.min(rect.left, Math.max(8, window.innerWidth - popup.offsetWidth - 8))}px`;
328
+ popup.style.top = flip ? `${rect.top - menuHeight - 4}px` : `${below}px`;
329
+ },
330
+ destroy: (immediate = false) => {
331
+ if (immediate || motionMs === 0) {
332
+ popup.remove();
333
+ return;
334
+ }
335
+ popup.style.opacity = "0";
336
+ popup.style.transform = "translateY(4px)";
337
+ popup.style.pointerEvents = "none";
338
+ window.setTimeout(() => popup.remove(), motionMs);
339
+ },
340
+ };
341
+ }
342
+
343
+ export interface SuggestionRendererOptions<ItemType> {
344
+ /** Maps suggestion items to shared rows */
345
+ toRow: (item: ItemType) => SuggestionRow;
346
+ /** Reads resolved chrome (editor storage) at open time */
347
+ getChrome: (editor: any) => SuggestionChrome;
348
+ /** Copy for the empty state */
349
+ getEmptyLabel: () => string;
350
+ }
351
+
352
+ /**
353
+ * Builds the `render()` lifecycle for a tiptap Suggestion configuration,
354
+ * portaling the shared SuggestionList and wiring keyboard navigation,
355
+ * Escape (consumed -- it must not reach outer handlers like fullscreen
356
+ * exit), repositioning, and enter/exit motion.
357
+ */
358
+ export function createSuggestionRenderer<ItemType>({
359
+ toRow,
360
+ getChrome,
361
+ getEmptyLabel,
362
+ }: SuggestionRendererOptions<ItemType>) {
363
+ return () => {
364
+ let component: ReactRenderer<SuggestionListRef> | null = null;
365
+ let popup: PopupHandle | null = null;
366
+
367
+ const makeProps = (props: any) => ({
368
+ rows: (props.items as ItemType[]).map(toRow),
369
+ chrome: getChrome(props.editor),
370
+ emptyLabel: getEmptyLabel(),
371
+ onSelect: (index: number) => {
372
+ const item = (props.items as ItemType[])[index];
373
+ if (item !== undefined) props.command(item);
374
+ },
375
+ });
376
+
377
+ return {
378
+ onStart: (props: any) => {
379
+ component = new ReactRenderer(SuggestionList, {
380
+ props: makeProps(props),
381
+ editor: props.editor,
382
+ });
383
+ popup = createPopup(props.editor.view.dom, getChrome(props.editor).motionMs);
384
+ popup.element.appendChild(component.element);
385
+ popup.position(props.clientRect);
386
+ // reposition once content has laid out (flip needs real height)
387
+ requestAnimationFrame(() => popup?.position(props.clientRect));
388
+ },
389
+ onUpdate: (props: any) => {
390
+ component?.updateProps(makeProps(props));
391
+ popup?.position(props.clientRect);
392
+ },
393
+ onKeyDown: (props: any) => {
394
+ if (props.event.key === "Escape") {
395
+ // consume the Escape entirely: closing the menu must not also
396
+ // trigger outer Escape handlers (e.g. fullscreen exit)
397
+ props.event.stopPropagation();
398
+ popup?.destroy();
399
+ component?.destroy();
400
+ popup = null;
401
+ component = null;
402
+ return true;
403
+ }
404
+ return component?.ref?.onKeyDown(props) ?? false;
405
+ },
406
+ onExit: () => {
407
+ popup?.destroy();
408
+ component?.destroy();
409
+ popup = null;
410
+ component = null;
411
+ },
412
+ };
413
+ };
414
+ }
@@ -1,6 +1,7 @@
1
1
  import { describe, it, expect, vi } from "vitest";
2
2
 
3
- vi.mock("@multiplatform.one/forms", () => ({
3
+ vi.mock("@multiplatform.one/forms", async (importOriginal) => ({
4
+ ...(await importOriginal<Record<string, unknown>>()),
4
5
  Button: (props: any) => (
5
6
  <button
6
7
  role="button"
@@ -13,7 +14,8 @@ vi.mock("@multiplatform.one/forms", () => ({
13
14
  ),
14
15
  }));
15
16
 
16
- vi.mock("@multiplatform.one/components", () => ({
17
+ vi.mock("@multiplatform.one/components", async (importOriginal) => ({
18
+ ...(await importOriginal<Record<string, unknown>>()),
17
19
  Tooltip: ({ children }: any) => children,
18
20
  }));
19
21
 
@@ -39,6 +41,10 @@ const mockEditor = {
39
41
  blur: vi.fn(),
40
42
  },
41
43
  setEditable: vi.fn(),
44
+ storage: {
45
+ mediaUpload: { handlers: {} },
46
+ suggestionChrome: { value: null },
47
+ },
42
48
  };
43
49
 
44
50
  vi.mock("@tiptap/react", () => ({
@@ -127,18 +133,19 @@ describe("TiptapEditor", () => {
127
133
  expect(container.querySelector("[data-testid='editor-content']")).toBeTruthy();
128
134
  });
129
135
 
130
- it("renders BubbleToolbar when showBubbleToolbar is true and does not when false", () => {
131
- // With showBubbleToolbar={true}
136
+ it("gates the formatting bubbles behind showBubbleToolbar (math bubble stays)", () => {
137
+ // With showBubbleToolbar={true}: formatting bubbles + math bubble
132
138
  const { container: withBubble } = renderWithProviders(
133
139
  withContext(<TiptapEditor showBubbleToolbar />),
134
140
  );
135
- expect(withBubble.querySelector("[data-testid='bubble-menu']")).toBeTruthy();
141
+ expect(withBubble.querySelectorAll("[data-testid='bubble-menu']").length).toBeGreaterThan(1);
136
142
 
137
- // With showBubbleToolbar={false} (default)
143
+ // With showBubbleToolbar={false} (default): only the MathBubble stays
144
+ // mounted — it is the only edit path for inline math atoms.
138
145
  const { container: withoutBubble } = renderWithProviders(
139
146
  withContext(<TiptapEditor showBubbleToolbar={false} />),
140
147
  );
141
- expect(withoutBubble.querySelector("[data-testid='bubble-menu']")).toBeNull();
148
+ expect(withoutBubble.querySelectorAll("[data-testid='bubble-menu']").length).toBe(1);
142
149
  });
143
150
 
144
151
  it("exposes RichEditorRef methods via forwardRef and useImperativeHandle", () => {
@@ -164,6 +171,6 @@ describe("TiptapEditor", () => {
164
171
  const cssContent = styleTag?.textContent ?? "";
165
172
  // Should use CSS custom properties for theme-aware colors
166
173
  expect(cssContent).toContain("var(--color12)");
167
- expect(cssContent).toContain("var(--color8");
174
+ expect(cssContent).toContain("var(--color10");
168
175
  });
169
176
  });
@@ -4,7 +4,8 @@ import { describe, it, expect, vi } from "vitest";
4
4
  // Mocks -- must come before imports to prevent Tiptap module errors
5
5
  // ---------------------------------------------------------------------------
6
6
 
7
- vi.mock("@multiplatform.one/forms", () => ({
7
+ vi.mock("@multiplatform.one/forms", async (importOriginal) => ({
8
+ ...(await importOriginal<Record<string, unknown>>()),
8
9
  Field: () => null,
9
10
  FieldLayout: ({ children }: any) => children,
10
11
  Skeleton: () => null,
@@ -35,7 +36,8 @@ vi.mock("@multiplatform.one/components", () => ({
35
36
  Tooltip: ({ children }: any) => children,
36
37
  }));
37
38
 
38
- vi.mock("@multiplatform.one/theme", () => ({
39
+ vi.mock("@multiplatform.one/theme", async (importOriginal) => ({
40
+ ...(await importOriginal<Record<string, unknown>>()),
39
41
  useResolvedKnobs: () => ({
40
42
  knobProps: {
41
43
  body: {},
package/src/index.ts CHANGED
@@ -10,4 +10,13 @@ export type { RichEditorCombinedProps } from "./RichEditor";
10
10
  export { RichTextEditor } from "./RichTextEditor";
11
11
  export type { RichTextEditorProps } from "./RichTextEditor";
12
12
 
13
- export type { RichEditorRef, RichEditorProps, EditorCommand, EditorState } from "./types";
13
+ export type {
14
+ RichEditorRef,
15
+ RichEditorProps,
16
+ EditorCapabilities,
17
+ EditorCommand,
18
+ EditorState,
19
+ RichTextMentionOptions,
20
+ } from "./types";
21
+
22
+ export { MARKDOWN_COMMANDS, isCommandInCapabilities } from "./editor/capabilities";
@@ -59,11 +59,13 @@ describe("getEditorCSS defaults", () => {
59
59
  // 3. ToolbarButton disabled state from context
60
60
  // ===========================================================================
61
61
 
62
- vi.mock("@multiplatform.one/forms", () => ({
62
+ vi.mock("@multiplatform.one/forms", async (importOriginal) => ({
63
+ ...(await importOriginal<Record<string, unknown>>()),
63
64
  Button: (props: any) => (
64
65
  <button
65
66
  role="button"
66
67
  aria-label={props["aria-label"]}
68
+ aria-disabled={props["aria-disabled"]}
67
69
  disabled={props.disabled}
68
70
  onClick={props.onPress}
69
71
  data-active={props.theme === "active" ? "true" : undefined}
@@ -117,7 +119,7 @@ vi.mock("@multiplatform.one/forms", () => ({
117
119
  isEmpty?: (v: unknown) => boolean,
118
120
  ) => {
119
121
  if (!required) return validators;
120
- const check = isEmpty || ((v: unknown) => v == null || v === "");
122
+ const check = isEmpty || ((v: unknown) => v === null || v === undefined || v === "");
121
123
  const requiredValidator = ({ value }: { value: unknown }) =>
122
124
  check(value)
123
125
  ? `${typeof label === "string" ? label : name || "Field"} is required`
@@ -142,11 +144,13 @@ vi.mock("@multiplatform.one/forms", () => ({
142
144
  },
143
145
  }));
144
146
 
145
- vi.mock("@multiplatform.one/components", () => ({
147
+ vi.mock("@multiplatform.one/components", async (importOriginal) => ({
148
+ ...(await importOriginal<Record<string, unknown>>()),
146
149
  Tooltip: ({ children }: any) => children,
147
150
  }));
148
151
 
149
- vi.mock("@multiplatform.one/theme", () => ({
152
+ vi.mock("@multiplatform.one/theme", async (importOriginal) => ({
153
+ ...(await importOriginal<Record<string, unknown>>()),
150
154
  useResolvedKnobs: () => ({
151
155
  knobProps: {
152
156
  body: {},
@@ -189,6 +193,10 @@ const mockEditor = {
189
193
  blur: vi.fn(),
190
194
  },
191
195
  setEditable: vi.fn(),
196
+ storage: {
197
+ mediaUpload: { handlers: {} },
198
+ suggestionChrome: { value: null },
199
+ },
192
200
  };
193
201
 
194
202
  vi.mock("@tiptap/react", () => ({
@@ -225,6 +233,7 @@ vi.mock("@tiptap/extension-image", () => ({
225
233
  }));
226
234
 
227
235
  import { renderWithProviders } from "@multiplatform.one/test-utils";
236
+ import { fireEvent } from "@testing-library/react";
228
237
  import { RichEditorContext } from "./context";
229
238
  import { defaultEditorState } from "./types";
230
239
  import type { EditorCommand, EditorState, ToolbarSection } from "./types";
@@ -236,15 +245,21 @@ const { RichTextEditor } = await import("./RichTextEditor/index");
236
245
 
237
246
  describe("ToolbarButton disabled state from context", () => {
238
247
  it("inherits disabled state from RichEditorContext", () => {
248
+ const onPress = vi.fn();
239
249
  const { getByRole } = renderWithProviders(
240
250
  <RichEditorContext.Provider size="$true" compact={false} disabled>
241
- <ToolbarButton onPress={() => {}} aria-label="Test">
251
+ <ToolbarButton onPress={onPress} aria-label="Test">
242
252
  T
243
253
  </ToolbarButton>
244
254
  </RichEditorContext.Provider>,
245
255
  );
246
256
  const button = getByRole("button");
247
- expect(button.getAttribute("disabled")).not.toBeNull();
257
+ // DG-ST-03 / LC-40: an unavailable toolbar action is aria-disabled
258
+ // (stays focusable, swallows presses), never bare-`disabled`.
259
+ expect(button.getAttribute("aria-disabled")).toBe("true");
260
+ expect(button.getAttribute("disabled")).toBeNull();
261
+ fireEvent.click(button);
262
+ expect(onPress).not.toHaveBeenCalled();
248
263
  });
249
264
  });
250
265
 
@@ -394,6 +409,17 @@ describe("NATIVE_SUPPORTED_COMMANDS completeness", () => {
394
409
  "highlight",
395
410
  "horizontalRule",
396
411
  "clearFormatting",
412
+ "insertTable",
413
+ "addColumnBefore",
414
+ "addColumnAfter",
415
+ "deleteColumn",
416
+ "addRowBefore",
417
+ "addRowAfter",
418
+ "deleteRow",
419
+ "deleteTable",
420
+ "mergeCells",
421
+ "splitCell",
422
+ "toggleHeaderRow",
397
423
  ];
398
424
 
399
425
  for (const cmd of allCommands) {
@@ -421,10 +447,13 @@ describe("RichEditor passes showBubbleToolbar to TiptapEditor", () => {
421
447
  expect(bubbleMenu).toBeTruthy();
422
448
  });
423
449
 
424
- it("does not render BubbleMenu when showBubbleToolbar is false", () => {
450
+ it("renders only the always-on MathBubble when showBubbleToolbar is false", () => {
425
451
  const { container } = renderWithProviders(<RichEditor showBubbleToolbar={false} />);
426
452
 
427
- const bubbleMenu = container.querySelector("[data-testid='bubble-menu']");
428
- expect(bubbleMenu).toBeNull();
453
+ // showBubbleToolbar gates the OPTIONAL formatting bubbles; the math
454
+ // bubble stays mounted because it is the only edit path for inline
455
+ // math atoms (a typed $x$ would otherwise be a dead end).
456
+ const bubbleMenus = container.querySelectorAll("[data-testid='bubble-menu']");
457
+ expect(bubbleMenus.length).toBe(1);
429
458
  });
430
459
  });