@multiplatform.one/rich-text 6.1.0 → 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
@@ -5,7 +5,8 @@ import { defaultEditorState } from "../types";
5
5
  import { TEXT_COLORS, HIGHLIGHT_COLORS } from "../constants";
6
6
  import { normalizeUrl } from "./LinkDialog";
7
7
 
8
- vi.mock("@multiplatform.one/forms", () => ({
8
+ vi.mock("@multiplatform.one/forms", async (importOriginal) => ({
9
+ ...(await importOriginal<Record<string, unknown>>()),
9
10
  Button: (props: any) => (
10
11
  <button
11
12
  role="button"
@@ -18,7 +19,8 @@ vi.mock("@multiplatform.one/forms", () => ({
18
19
  ),
19
20
  }));
20
21
 
21
- vi.mock("@multiplatform.one/components", () => ({
22
+ vi.mock("@multiplatform.one/components", async (importOriginal) => ({
23
+ ...(await importOriginal<Record<string, unknown>>()),
22
24
  Tooltip: ({ children }: any) => children,
23
25
  }));
24
26
 
@@ -0,0 +1,67 @@
1
+ /**
2
+ * ScrollArrow direction math (rtl-audit U1-class residual): CSSOM flips the
3
+ * scrollLeft range under RTL (0 → −(scrollWidth − clientWidth)), so the raw
4
+ * LTR reading inverted both arrow visibility and the remaining-distance
5
+ * clamp. `horizontalScrollEdges` is the direction-normalized primitive both
6
+ * the visibility hook and the hover-scroll loop consume.
7
+ */
8
+ import { describe, expect, it, vi } from "vitest";
9
+
10
+ // The module under test imports useDirection (house RTL pattern); the pure
11
+ // edge math is exercised with explicit directions (same wholesale-mock
12
+ // precedent as toolbarPrimitives.spec).
13
+ vi.mock("@multiplatform.one/components", () => ({
14
+ useDirection: () => "ltr",
15
+ }));
16
+
17
+ const { horizontalScrollEdges } = await import("./useHorizontalScroll");
18
+
19
+ const scroller = (scrollLeft: number) => ({ scrollLeft, scrollWidth: 500, clientWidth: 300 });
20
+
21
+ describe("horizontalScrollEdges", () => {
22
+ it("LTR: scrollLeft is the distance from the left edge", () => {
23
+ expect(horizontalScrollEdges(scroller(0), "ltr")).toEqual({
24
+ fromLeftEdge: 0,
25
+ fromRightEdge: 200,
26
+ });
27
+ expect(horizontalScrollEdges(scroller(120), "ltr")).toEqual({
28
+ fromLeftEdge: 120,
29
+ fromRightEdge: 80,
30
+ });
31
+ expect(horizontalScrollEdges(scroller(200), "ltr")).toEqual({
32
+ fromLeftEdge: 200,
33
+ fromRightEdge: 0,
34
+ });
35
+ });
36
+
37
+ it("RTL: scrollLeft runs 0 → −range, distances normalize per edge", () => {
38
+ // Start position (flush right): everything overflows to the LEFT.
39
+ expect(horizontalScrollEdges(scroller(0), "rtl")).toEqual({
40
+ fromLeftEdge: 200,
41
+ fromRightEdge: 0,
42
+ });
43
+ expect(horizontalScrollEdges(scroller(-120), "rtl")).toEqual({
44
+ fromLeftEdge: 80,
45
+ fromRightEdge: 120,
46
+ });
47
+ // Fully scrolled (flush left): nothing further left, all content right.
48
+ expect(horizontalScrollEdges(scroller(-200), "rtl")).toEqual({
49
+ fromLeftEdge: 0,
50
+ fromRightEdge: 200,
51
+ });
52
+ });
53
+
54
+ it("no overflow: both distances collapse to zero in both directions", () => {
55
+ const flat = { scrollLeft: 0, scrollWidth: 300, clientWidth: 300 };
56
+ expect(horizontalScrollEdges(flat, "ltr")).toEqual({ fromLeftEdge: 0, fromRightEdge: 0 });
57
+ expect(horizontalScrollEdges(flat, "rtl")).toEqual({ fromLeftEdge: 0, fromRightEdge: 0 });
58
+ });
59
+
60
+ it("pre-fix regression: raw scrollLeft sign misreads RTL edges", () => {
61
+ // The old visibility math (scrollLeft > threshold) at the RTL start
62
+ // position read 0 → no left arrow, while 200px actually overflowed left.
63
+ const atRtlStart = horizontalScrollEdges(scroller(0), "rtl");
64
+ expect(atRtlStart.fromLeftEdge).toBeGreaterThan(8);
65
+ expect(atRtlStart.fromRightEdge).toBeLessThanOrEqual(8);
66
+ });
67
+ });
@@ -8,9 +8,31 @@ import { useCallback, useEffect, useRef, useState } from "react";
8
8
  import { View } from "tamagui";
9
9
  import { LinearGradient } from "@tamagui/linear-gradient";
10
10
  import { CaretLeftIcon, CaretRightIcon } from "@phosphor-icons/react";
11
+ import { useDirection } from "@multiplatform.one/components";
11
12
 
12
13
  const scrollArrowThreshold = 8;
13
14
 
15
+ /**
16
+ * Physical px distances from each horizontal scroll edge. The arrows are
17
+ * physically-anchored edge overlays (left:0 / right:0), but CSSOM flips the
18
+ * `scrollLeft` range under RTL: an RTL scroller runs 0 → −(scrollWidth −
19
+ * clientWidth), so the LTR reading (`scrollLeft` = distance from the left
20
+ * edge) inverts and both arrow visibility and the remaining-distance clamp
21
+ * break. Normalize per `useDirection()` (house RTL pattern) instead of
22
+ * reading the raw sign.
23
+ */
24
+ export function horizontalScrollEdges(
25
+ element: Pick<HTMLElement, "scrollLeft" | "scrollWidth" | "clientWidth">,
26
+ direction: "ltr" | "rtl",
27
+ ): { fromLeftEdge: number; fromRightEdge: number } {
28
+ const range = Math.max(element.scrollWidth - element.clientWidth, 0);
29
+ const minScrollLeft = direction === "rtl" ? -range : 0;
30
+ return {
31
+ fromLeftEdge: element.scrollLeft - minScrollLeft,
32
+ fromRightEdge: minScrollLeft + range - element.scrollLeft,
33
+ };
34
+ }
35
+
14
36
  // ===========================================================================
15
37
  // useHorizontalScroll
16
38
  // ===========================================================================
@@ -98,17 +120,21 @@ export function useHorizontalScroll(ref: React.RefObject<HTMLDivElement | null>)
98
120
  * Hook to track horizontal scroll arrows visibility
99
121
  */
100
122
  export function useHorizontalScrollArrows() {
123
+ const direction = useDirection();
101
124
  const [arrowLeft, setArrowLeft] = useState(false);
102
125
  const [arrowRight, setArrowRight] = useState(false);
103
126
  const arrowScrollDirRef = useRef<"left" | "right" | null>(null);
104
127
 
105
- const updateArrows = useCallback((element: HTMLElement) => {
106
- const left = element.scrollLeft > scrollArrowThreshold;
107
- const right =
108
- element.scrollLeft < element.scrollWidth - element.clientWidth - scrollArrowThreshold;
109
- setArrowLeft((prev) => (prev !== left ? left : prev));
110
- setArrowRight((prev) => (prev !== right ? right : prev));
111
- }, []);
128
+ const updateArrows = useCallback(
129
+ (element: HTMLElement) => {
130
+ const { fromLeftEdge, fromRightEdge } = horizontalScrollEdges(element, direction);
131
+ const left = fromLeftEdge > scrollArrowThreshold;
132
+ const right = fromRightEdge > scrollArrowThreshold;
133
+ setArrowLeft((prev) => (prev !== left ? left : prev));
134
+ setArrowRight((prev) => (prev !== right ? right : prev));
135
+ },
136
+ [direction],
137
+ );
112
138
 
113
139
  return { arrowLeft, arrowRight, arrowScrollDirRef, updateArrows };
114
140
  }
@@ -136,6 +162,7 @@ export function HorizontalScrollArrow({
136
162
  transition,
137
163
  }: HorizontalScrollArrowProps) {
138
164
  const isLeft = direction === "left";
165
+ const textDirection = useDirection();
139
166
  const animationFrameRef = useRef(0);
140
167
  const lastTimeRef = useRef(0);
141
168
  const resumeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
@@ -163,10 +190,10 @@ export function HorizontalScrollArrow({
163
190
  const now = performance.now();
164
191
  const elapsed = now - lastTimeRef.current;
165
192
  lastTimeRef.current = now;
166
- const px = Math.min(
167
- elapsed / 2,
168
- Math.max(isLeft ? el.scrollLeft : el.scrollWidth - el.clientWidth - el.scrollLeft, 0),
169
- );
193
+ // Remaining distance to this arrow's physical edge (RTL-normalized);
194
+ // the step itself stays physical: scrollLeft always decreases leftward.
195
+ const { fromLeftEdge, fromRightEdge } = horizontalScrollEdges(el, textDirection);
196
+ const px = Math.min(elapsed / 2, Math.max(isLeft ? fromLeftEdge : fromRightEdge, 0));
170
197
  if (px > 0) {
171
198
  selfScrollingRef.current = true;
172
199
  arrowScrollDirRef.current = isLeft ? "left" : "right";
@@ -175,7 +202,7 @@ export function HorizontalScrollArrow({
175
202
  animationFrameRef.current = requestAnimationFrame(tick);
176
203
  };
177
204
  animationFrameRef.current = requestAnimationFrame(tick);
178
- }, [isLeft, scrollRef, arrowScrollDirRef]);
205
+ }, [isLeft, scrollRef, arrowScrollDirRef, textDirection]);
179
206
 
180
207
  const openTimestampRef = useRef(0);
181
208
  useEffect(() => {
@@ -0,0 +1,100 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { useRef } from "react";
3
+ import { fireEvent, render } from "@testing-library/react";
4
+ import { useRovingFocus } from "./useRovingFocus";
5
+
6
+ function Toolbar({ disabledSecond = false }: { disabledSecond?: boolean }) {
7
+ const ref = useRef<HTMLDivElement>(null);
8
+ useRovingFocus(ref);
9
+ return (
10
+ <div ref={ref} role="toolbar" aria-label="Test toolbar">
11
+ <button type="button">one</button>
12
+ <button type="button" disabled={disabledSecond}>
13
+ two
14
+ </button>
15
+ <button type="button">three</button>
16
+ </div>
17
+ );
18
+ }
19
+
20
+ /** Tamagui Buttons render as <div role="button">, not <button> */
21
+ function DivToolbar() {
22
+ const ref = useRef<HTMLDivElement>(null);
23
+ useRovingFocus(ref);
24
+ return (
25
+ <div ref={ref} role="toolbar" aria-label="Div toolbar">
26
+ <div role="button" tabIndex={0}>
27
+ bold
28
+ </div>
29
+ <div role="button" tabIndex={0}>
30
+ italic
31
+ </div>
32
+ <div role="button" tabIndex={0} aria-disabled="true">
33
+ redo
34
+ </div>
35
+ <div role="button" tabIndex={0}>
36
+ undo
37
+ </div>
38
+ </div>
39
+ );
40
+ }
41
+
42
+ describe("useRovingFocus", () => {
43
+ it("handles div[role=button] controls (Tamagui Button shape)", () => {
44
+ const { getAllByRole, getByRole } = render(<DivToolbar />);
45
+ const buttons = getAllByRole("button");
46
+ // aria-disabled control is excluded from the roving order entirely
47
+ expect(buttons.map((b) => b.tabIndex)).toEqual([0, -1, 0, -1]);
48
+ buttons[0]!.focus();
49
+ fireEvent.keyDown(getByRole("toolbar"), { key: "ArrowRight" });
50
+ expect(document.activeElement).toBe(buttons[1]);
51
+ fireEvent.keyDown(getByRole("toolbar"), { key: "ArrowRight" });
52
+ // skips the aria-disabled control
53
+ expect(document.activeElement).toBe(buttons[3]);
54
+ });
55
+
56
+ it("makes the toolbar a single tab stop (first button 0, rest -1)", () => {
57
+ const { getAllByRole } = render(<Toolbar />);
58
+ const buttons = getAllByRole("button");
59
+ expect(buttons.map((b) => b.tabIndex)).toEqual([0, -1, -1]);
60
+ });
61
+
62
+ it("moves focus with ArrowRight and wraps", () => {
63
+ const { getAllByRole, getByRole } = render(<Toolbar />);
64
+ const [first, second, third] = getAllByRole("button");
65
+ first!.focus();
66
+ fireEvent.keyDown(getByRole("toolbar"), { key: "ArrowRight" });
67
+ expect(document.activeElement).toBe(second);
68
+ fireEvent.keyDown(getByRole("toolbar"), { key: "ArrowRight" });
69
+ expect(document.activeElement).toBe(third);
70
+ fireEvent.keyDown(getByRole("toolbar"), { key: "ArrowRight" });
71
+ expect(document.activeElement).toBe(first);
72
+ });
73
+
74
+ it("moves focus with ArrowLeft (reverse) and Home/End", () => {
75
+ const { getAllByRole, getByRole } = render(<Toolbar />);
76
+ const [first, _second, third] = getAllByRole("button");
77
+ first!.focus();
78
+ fireEvent.keyDown(getByRole("toolbar"), { key: "ArrowLeft" });
79
+ expect(document.activeElement).toBe(third);
80
+ fireEvent.keyDown(getByRole("toolbar"), { key: "Home" });
81
+ expect(document.activeElement).toBe(first);
82
+ fireEvent.keyDown(getByRole("toolbar"), { key: "End" });
83
+ expect(document.activeElement).toBe(third);
84
+ });
85
+
86
+ it("skips disabled controls", () => {
87
+ const { getAllByRole, getByRole } = render(<Toolbar disabledSecond />);
88
+ const [first, _second, third] = getAllByRole("button");
89
+ first!.focus();
90
+ fireEvent.keyDown(getByRole("toolbar"), { key: "ArrowRight" });
91
+ expect(document.activeElement).toBe(third);
92
+ });
93
+
94
+ it("updates the tab stop when focus lands on a control", () => {
95
+ const { getAllByRole } = render(<Toolbar />);
96
+ const buttons = getAllByRole("button");
97
+ fireEvent.focusIn(buttons[2]!);
98
+ expect(buttons.map((b) => b.tabIndex)).toEqual([-1, -1, 0]);
99
+ });
100
+ });
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Roving tabindex for the toolbar (WAI-ARIA toolbar pattern).
3
+ *
4
+ * The toolbar is ONE tab stop: Tab enters at the last-active control and
5
+ * leaves on the next Tab; ArrowLeft/ArrowRight (direction-aware for RTL),
6
+ * Home, and End move between enabled controls.
7
+ */
8
+
9
+ import { useEffect } from "react";
10
+ import type { RefObject } from "react";
11
+
12
+ // Tamagui Buttons render as <div role="button">, so match by role as well
13
+ // as by tag; disabled controls drop out of the roving order either way.
14
+ const FOCUSABLE = [
15
+ 'button:not([disabled]):not([aria-disabled="true"])',
16
+ '[role="button"]:not([disabled]):not([aria-disabled="true"])',
17
+ ].join(", ");
18
+
19
+ export function useRovingFocus(containerRef: RefObject<HTMLElement | null>) {
20
+ useEffect(() => {
21
+ const container = containerRef.current;
22
+ if (!container) return undefined;
23
+
24
+ const controls = () => Array.from(container.querySelectorAll<HTMLElement>(FOCUSABLE));
25
+
26
+ const setTabStops = (active?: HTMLElement) => {
27
+ const list = controls();
28
+ if (list.length === 0) return;
29
+ const current =
30
+ active && list.includes(active) ? active : (list.find((b) => b.tabIndex === 0) ?? list[0]!);
31
+ for (const control of list) control.tabIndex = control === current ? 0 : -1;
32
+ };
33
+
34
+ setTabStops();
35
+
36
+ const handleKeyDown = (event: KeyboardEvent) => {
37
+ if (!["ArrowLeft", "ArrowRight", "Home", "End"].includes(event.key)) return;
38
+ const list = controls();
39
+ if (list.length === 0) return;
40
+ const current = document.activeElement as HTMLElement | null;
41
+ let index = current ? list.indexOf(current) : -1;
42
+ if (index === -1) return;
43
+
44
+ const isRtl =
45
+ (container.closest("[dir]") as HTMLElement | null)?.dir === "rtl" || document.dir === "rtl";
46
+ const forward = isRtl ? -1 : 1;
47
+
48
+ if (event.key === "ArrowRight") index = (index + forward + list.length) % list.length;
49
+ else if (event.key === "ArrowLeft") index = (index - forward + list.length) % list.length;
50
+ else if (event.key === "Home") index = 0;
51
+ else index = list.length - 1;
52
+
53
+ event.preventDefault();
54
+ const next = list[index]!;
55
+ setTabStops(next);
56
+ next.focus();
57
+ next.scrollIntoView({ block: "nearest", inline: "nearest" });
58
+ };
59
+
60
+ const handleFocusIn = (event: FocusEvent) => {
61
+ const target = event.target as HTMLElement;
62
+ if (target.matches?.(FOCUSABLE)) setTabStops(target);
63
+ };
64
+
65
+ // Buttons mount/unmount (sections, disabled flips) -- keep stops valid
66
+ const observer = new MutationObserver(() => setTabStops());
67
+ observer.observe(container, {
68
+ childList: true,
69
+ subtree: true,
70
+ attributes: true,
71
+ attributeFilter: ["disabled", "aria-disabled"],
72
+ });
73
+
74
+ container.addEventListener("keydown", handleKeyDown);
75
+ container.addEventListener("focusin", handleFocusIn);
76
+ return () => {
77
+ observer.disconnect();
78
+ container.removeEventListener("keydown", handleKeyDown);
79
+ container.removeEventListener("focusin", handleFocusIn);
80
+ };
81
+ }, [containerRef]);
82
+ }
package/src/types.spec.ts CHANGED
@@ -1,6 +1,12 @@
1
1
  import { describe, it, expect } from "vitest";
2
2
  import { defaultEditorState } from "./types";
3
- import { NATIVE_SUPPORTED_COMMANDS, TEXT_COLORS, HIGHLIGHT_COLORS } from "./constants";
3
+ import {
4
+ NATIVE_SUPPORTED_COMMANDS,
5
+ TEXT_COLORS,
6
+ TEXT_COLORS_DARK,
7
+ HIGHLIGHT_COLORS,
8
+ PALETTE_THEME_TOKENS,
9
+ } from "./constants";
4
10
 
5
11
  describe("types and constants", () => {
6
12
  it("defaultEditorState has expected shape and default values", () => {
@@ -56,6 +62,28 @@ describe("types and constants", () => {
56
62
  expect(noneEntry?.name).toBe("None");
57
63
  });
58
64
 
65
+ it("palette values are theme custom properties, never raw hex (Axiom 5 / DG-COL-01)", () => {
66
+ for (const entry of [...TEXT_COLORS, ...TEXT_COLORS_DARK, ...HIGHLIGHT_COLORS]) {
67
+ if (entry.value === null) continue;
68
+ expect(entry.value).toMatch(/^var\(--[a-zA-Z0-9]+\)$/);
69
+ }
70
+ });
71
+
72
+ it("light and dark text palettes share tokens; only the neutral ink label flips", () => {
73
+ expect(TEXT_COLORS_DARK.map((c) => c.value)).toEqual(TEXT_COLORS.map((c) => c.value));
74
+ expect(TEXT_COLORS.find((c) => c.value === "var(--color12)")?.name).toBe("Black");
75
+ expect(TEXT_COLORS_DARK.find((c) => c.value === "var(--color12)")?.name).toBe("White");
76
+ });
77
+
78
+ it("PALETTE_THEME_TOKENS covers every token referenced by the palettes", () => {
79
+ expect(PALETTE_THEME_TOKENS.length).toBeGreaterThan(0);
80
+ for (const entry of [...TEXT_COLORS, ...HIGHLIGHT_COLORS]) {
81
+ if (entry.value === null) continue;
82
+ const token = entry.value.replace(/^var\(--/, "").replace(/\)$/, "");
83
+ expect(PALETTE_THEME_TOKENS).toContain(token);
84
+ }
85
+ });
86
+
59
87
  it("NativeCapability covers all EditorCommand values", () => {
60
88
  const commands: string[] = [
61
89
  "bold",
@@ -89,6 +117,17 @@ describe("types and constants", () => {
89
117
  "highlight",
90
118
  "horizontalRule",
91
119
  "clearFormatting",
120
+ "insertTable",
121
+ "addColumnBefore",
122
+ "addColumnAfter",
123
+ "deleteColumn",
124
+ "addRowBefore",
125
+ "addRowAfter",
126
+ "deleteRow",
127
+ "deleteTable",
128
+ "mergeCells",
129
+ "splitCell",
130
+ "toggleHeaderRow",
92
131
  ];
93
132
 
94
133
  for (const cmd of commands) {
package/src/types.ts CHANGED
@@ -3,6 +3,22 @@
3
3
  */
4
4
 
5
5
  import type { FontSizeTokens } from "tamagui";
6
+ import type { MentionItem } from "@multiplatform.one/forms";
7
+
8
+ // ===========================================================================
9
+ // Mentions
10
+ // ===========================================================================
11
+
12
+ /**
13
+ * Mention wiring for the @ suggestion popup (web). Uses the forms
14
+ * `MentionItem` contract (LC-16: same data shape as MentionInput).
15
+ */
16
+ export interface RichTextMentionOptions {
17
+ /** Trigger character (default "@") */
18
+ trigger?: string;
19
+ /** Returns suggestion items for a query (sync or async) */
20
+ items: (query: string) => MentionItem[] | Promise<MentionItem[]>;
21
+ }
6
22
 
7
23
  // ===========================================================================
8
24
  // Editor Command
@@ -170,6 +186,18 @@ export interface RichEditorProps {
170
186
  maxHeight?: number;
171
187
  /** Show error state */
172
188
  hasError?: boolean;
189
+ /**
190
+ * Uploads a pasted/dropped image and resolves its URL (web). Without it,
191
+ * images are inlined as base64 data URIs.
192
+ */
193
+ onImageUpload?: (file: File) => Promise<string>;
194
+ /**
195
+ * Uploads a pasted/dropped non-image file and resolves its URL (web).
196
+ * Inserts an attachment chip link; without it, non-image files are ignored.
197
+ */
198
+ onFileUpload?: (file: File) => Promise<{ url: string; name?: string }>;
199
+ /** Enables the @ mention suggestion popup (web) */
200
+ mentions?: RichTextMentionOptions;
173
201
  }
174
202
 
175
203
  // ===========================================================================
@@ -0,0 +1,51 @@
1
+ /**
2
+ * RichEditor compound component (web)
3
+ *
4
+ * Combines the TiptapEditor, FixedToolbar, and BubbleToolbar into a compound
5
+ * component with static properties:
6
+ * - RichEditor.FixedToolbar
7
+ * - RichEditor.BubbleToolbar
8
+ * - RichEditor.Editor
9
+ *
10
+ * Root provides RichEditorContext with resolved size, compact, and disabled.
11
+ * Uses useResolvedKnobs for knobs integration and clampRadiusForLargeComponent
12
+ * for radius clamping (max $4).
13
+ */
14
+ import type { SizeTokens } from "tamagui";
15
+ import type { RichEditorProps, RichEditorRef, ToolbarSection } from "./types";
16
+ import { FixedToolbar } from "./toolbar/FixedToolbar";
17
+ import { BubbleToolbar } from "./toolbar/BubbleToolbar";
18
+ export interface RichEditorCombinedProps extends RichEditorProps {
19
+ /** Size token for the editor */
20
+ size?: SizeTokens;
21
+ /** Use compact sizing for tighter controls */
22
+ compact?: boolean;
23
+ /** Show the fixed toolbar (default: true) */
24
+ showToolbar?: boolean;
25
+ /** Show the bubble toolbar on text selection (default: false, web only) */
26
+ showBubbleToolbar?: boolean;
27
+ /** Toolbar sections to display (shows all when omitted) */
28
+ sections?: ToolbarSection[];
29
+ /** Show a drag handle to resize the editor vertically (default: true) */
30
+ resizable?: boolean;
31
+ /** Show word/character count status bar (default: true) */
32
+ showStatusBar?: boolean;
33
+ /** Controlled fullscreen state (uncontrolled when omitted) */
34
+ fullscreen?: boolean;
35
+ /** Initial fullscreen state when uncontrolled (default: false) */
36
+ defaultFullscreen?: boolean;
37
+ /** Called when the fullscreen state changes */
38
+ onFullscreenChange?: (fullscreen: boolean) => void;
39
+ /**
40
+ * Native only: render the embedded inline editor instead of the
41
+ * preview + fullscreen edit modal. Ignored on web (the web editor is
42
+ * always inline; fullscreen is the toolbar toggle).
43
+ */
44
+ inlineEditing?: boolean;
45
+ }
46
+ export declare const RichEditor: import("react").ForwardRefExoticComponent<RichEditorCombinedProps & import("react").RefAttributes<RichEditorRef>> & {
47
+ FixedToolbar: typeof FixedToolbar;
48
+ BubbleToolbar: typeof BubbleToolbar;
49
+ Editor: import("react").NamedExoticComponent<import("./editor").TiptapEditorProps & import("react").RefAttributes<RichEditorRef>>;
50
+ };
51
+ //# sourceMappingURL=RichEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichEditor.d.ts","sourceRoot":"","sources":["../src/RichEditor.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAYH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAI1C,OAAO,KAAK,EAGV,eAAe,EACf,aAAa,EACb,cAAc,EACf,MAAM,SAAS,CAAC;AAKjB,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAQxD,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,gCAAgC;IAChC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,yEAAyE;IACzE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,2DAA2D;IAC3D,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AA2ND,eAAO,MAAM,UAAU;;;;CAIrB,CAAC"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * RichEditor compound component (native)
3
+ *
4
+ * Mobile editing model (Notion / Gmail convention):
5
+ *
6
+ * - INLINE (default): a compact PREVIEW surface themed like an input --
7
+ * the committed content rendered as styled text (or the placeholder),
8
+ * with a subtle edit affordance. Tapping it does not type inline; it
9
+ * opens the fullscreen editor.
10
+ * - FULLSCREEN EDIT: a safe-area-aware RN Modal. Header bar with Cancel
11
+ * (left, discards the draft back to the pre-open value) and Done (right,
12
+ * commits via onChange) -- draft-until-commit. The Tentap editor fills
13
+ * the screen and the FixedToolbar docks ABOVE the keyboard via
14
+ * KeyboardAvoidingView.
15
+ * - `inlineEditing` opts back into the embedded inline editor for hosts
16
+ * that truly want the old behavior.
17
+ *
18
+ * The web `fullscreen` / `defaultFullscreen` / `onFullscreenChange` props
19
+ * map to the modal here, so the public API is one surface.
20
+ *
21
+ * No BubbleToolbar sub-component (10Tap does not support floating menus).
22
+ * The BubbleToolbar property is still present on the compound component
23
+ * to maintain the same public interface, but renders nothing on native.
24
+ */
25
+ import type { SizeTokens } from "tamagui";
26
+ import type { RichEditorProps, RichEditorRef, ToolbarSection } from "./types";
27
+ import { FixedToolbar } from "./toolbar/FixedToolbar";
28
+ export interface RichEditorCombinedProps extends RichEditorProps {
29
+ /** Size token for the editor */
30
+ size?: SizeTokens;
31
+ /** Use compact sizing for tighter controls */
32
+ compact?: boolean;
33
+ /** Show the fixed toolbar (default: true) */
34
+ showToolbar?: boolean;
35
+ /** Show the bubble toolbar on text selection (not supported on native, ignored) */
36
+ showBubbleToolbar?: boolean;
37
+ /** Toolbar sections to display (shows all when omitted) */
38
+ sections?: ToolbarSection[];
39
+ /** Controlled fullscreen state (opens the fullscreen edit modal) */
40
+ fullscreen?: boolean;
41
+ /** Initial fullscreen state when uncontrolled (default: false) */
42
+ defaultFullscreen?: boolean;
43
+ /** Called when the fullscreen state changes */
44
+ onFullscreenChange?: (fullscreen: boolean) => void;
45
+ /**
46
+ * Escape hatch: render the old embedded inline editor instead of the
47
+ * preview + fullscreen modal (default: false)
48
+ */
49
+ inlineEditing?: boolean;
50
+ }
51
+ /** No-op BubbleToolbar for native -- 10Tap does not support floating menus */
52
+ declare function NativeBubbleToolbar(): null;
53
+ export declare const RichEditor: import("react").ForwardRefExoticComponent<RichEditorCombinedProps & import("react").RefAttributes<RichEditorRef>> & {
54
+ FixedToolbar: typeof FixedToolbar;
55
+ BubbleToolbar: typeof NativeBubbleToolbar;
56
+ Editor: any;
57
+ };
58
+ export {};
59
+ //# sourceMappingURL=RichEditor.native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RichEditor.native.d.ts","sourceRoot":"","sources":["../src/RichEditor.native.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAWH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAI1C,OAAO,KAAK,EAAe,eAAe,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAI3F,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAStD,MAAM,WAAW,uBAAwB,SAAQ,eAAe;IAC9D,gCAAgC;IAChC,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,mFAAmF;IACnF,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,oEAAoE;IACpE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAMD,8EAA8E;AAC9E,iBAAS,mBAAmB,SAE3B;AA4dD,eAAO,MAAM,UAAU;;;;CAIrB,CAAC"}
@@ -0,0 +1,71 @@
1
+ /**
2
+ * RichTextEditor with form integration
3
+ *
4
+ * Three-branch architecture following field architecture standard:
5
+ * - Branch 1: Skeleton loading state
6
+ * - Branch 2: Standalone (no form context)
7
+ * - Branch 3: Form-integrated (with TanStack Form)
8
+ *
9
+ * Wraps RichEditor compound component with FieldLayout and validation.
10
+ * Uses custom empty check for '<p></p>' which is Tiptap's empty state.
11
+ */
12
+ import type { DeepKeys, DeepValue } from "@tanstack/form-core";
13
+ import type React from "react";
14
+ import type { LabelProps, SizeTokens } from "tamagui";
15
+ import { type FormFieldProps, type FieldComponentProps, type Validator } from "@multiplatform.one/forms";
16
+ import type { RichTextMentionOptions, ToolbarSection } from "../types";
17
+ export type RichTextEditorProps<TParentData = any, TName extends DeepKeys<TParentData> = any, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>> = Omit<FormFieldProps<TParentData, TName, TFieldValidator, TFormValidator, TData>, "children" | "field"> & Partial<Omit<FieldComponentProps<TParentData, TName, TFieldValidator, TFormValidator, TData>, "children">> & {
18
+ value?: string;
19
+ defaultValue?: string;
20
+ onChange?: (value: string) => void;
21
+ onBlur?: (...args: any[]) => void;
22
+ placeholder?: string;
23
+ disabled?: boolean;
24
+ readOnly?: boolean;
25
+ minHeight?: number;
26
+ maxHeight?: number;
27
+ label?: React.ReactNode;
28
+ labelProps?: Omit<LabelProps, "htmlFor" | "ref">;
29
+ helperText?: string;
30
+ error?: string | boolean;
31
+ required?: boolean;
32
+ size?: SizeTokens;
33
+ /** Show the formatting toolbar (default: true) */
34
+ showToolbar?: boolean;
35
+ /** Use compact sizing for toolbar (default: false) */
36
+ compact?: boolean;
37
+ /** Show the bubble toolbar on text selection (default: false, web only) */
38
+ showBubbleToolbar?: boolean;
39
+ /** Toolbar sections to display (shows all when omitted) */
40
+ sections?: ToolbarSection[];
41
+ /** When true, renders a skeleton placeholder instead of the editor */
42
+ skeleton?: boolean;
43
+ /** Controlled fullscreen state (web; uncontrolled when omitted) */
44
+ fullscreen?: boolean;
45
+ /** Initial fullscreen state when uncontrolled (default: false) */
46
+ defaultFullscreen?: boolean;
47
+ /** Called when the fullscreen state changes */
48
+ onFullscreenChange?: (fullscreen: boolean) => void;
49
+ /**
50
+ * Native only: render the embedded inline editor instead of the
51
+ * preview + fullscreen edit modal (ignored on web)
52
+ */
53
+ inlineEditing?: boolean;
54
+ /**
55
+ * Uploads a pasted/dropped image and resolves its URL (web). Without it,
56
+ * images are inlined as base64 data URIs.
57
+ */
58
+ onImageUpload?: (file: File) => Promise<string>;
59
+ /**
60
+ * Uploads a pasted/dropped non-image file and resolves its URL (web).
61
+ * Inserts an attachment chip link; without it, non-image files are ignored.
62
+ */
63
+ onFileUpload?: (file: File) => Promise<{
64
+ url: string;
65
+ name?: string;
66
+ }>;
67
+ /** Enables the @ mention suggestion popup (web) */
68
+ mentions?: RichTextMentionOptions;
69
+ };
70
+ export declare function RichTextEditor<TParentData, TName extends DeepKeys<TParentData>, TFieldValidator extends Validator<DeepValue<TParentData, TName>, unknown> | undefined = undefined, TFormValidator extends Validator<TParentData, unknown> | undefined = undefined, TData extends DeepValue<TParentData, TName> = DeepValue<TParentData, TName>>(props: RichTextEditorProps<TParentData, TName, TFieldValidator, TFormValidator, TData>): import("react/jsx-runtime").JSX.Element;
71
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/RichTextEditor/index.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGtD,OAAO,EAQL,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACf,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAiB,sBAAsB,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAkBtF,MAAM,MAAM,mBAAmB,CAC7B,WAAW,GAAG,GAAG,EACjB,KAAK,SAAS,QAAQ,CAAC,WAAW,CAAC,GAAG,GAAG,EACzC,eAAe,SAAS,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EACjG,cAAc,SAAS,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EAC9E,KAAK,SAAS,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,IACzE,IAAI,CACN,cAAc,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,EAC1E,UAAU,GAAG,OAAO,CACrB,GACC,OAAO,CACL,IAAI,CACF,mBAAmB,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,EAC/E,UAAU,CACX,CACF,GAAG;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,KAAK,CAAC,CAAC;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,sDAAsD;IACtD,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,2EAA2E;IAC3E,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,sEAAsE;IACtE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mEAAmE;IACnE,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,kEAAkE;IAClE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,+CAA+C;IAC/C,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;IACnD;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD;;;OAGG;IACH,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvE,mDAAmD;IACnD,QAAQ,CAAC,EAAE,sBAAsB,CAAC;CACnC,CAAC;AAMJ,wBAAgB,cAAc,CAC5B,WAAW,EACX,KAAK,SAAS,QAAQ,CAAC,WAAW,CAAC,EACnC,eAAe,SAAS,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EACjG,cAAc,SAAS,SAAS,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,SAAS,EAC9E,KAAK,SAAS,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,CAAC,EAC3E,KAAK,EAAE,mBAAmB,CAAC,WAAW,EAAE,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,CAAC,2CA+JvF"}