@dxos/react-ui-editor 0.8.4-main.5ea62a8 → 0.8.4-main.72ec0f3

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 (347) hide show
  1. package/dist/lib/browser/{chunk-22UMM3QJ.mjs → chunk-HL3YF6WC.mjs} +2 -2
  2. package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +5006 -3698
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/types/index.mjs +1 -1
  7. package/dist/lib/node-esm/{chunk-YXYQPV6R.mjs → chunk-YJZGD3LY.mjs} +2 -2
  8. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +7 -0
  9. package/dist/lib/node-esm/index.mjs +5006 -3698
  10. package/dist/lib/node-esm/index.mjs.map +4 -4
  11. package/dist/lib/node-esm/meta.json +1 -1
  12. package/dist/lib/node-esm/types/index.mjs +1 -1
  13. package/dist/types/src/components/Editor/Editor.d.ts +37 -15
  14. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  15. package/dist/types/src/components/Editor/Editor.stories.d.ts +20 -0
  16. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  17. package/dist/types/src/components/EditorContent/EditorContent.d.ts +29 -0
  18. package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +1 -0
  19. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts +26 -0
  20. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorContent/controller.d.ts +10 -0
  22. package/dist/types/src/components/EditorContent/controller.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorContent/index.d.ts +3 -0
  24. package/dist/types/src/components/EditorContent/index.d.ts.map +1 -0
  25. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +36 -0
  26. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorMenuProvider/index.d.ts +7 -0
  28. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  29. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  30. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  32. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  33. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +47 -0
  34. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  35. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  36. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  37. package/dist/types/src/components/EditorMenuProvider/util.d.ts +8 -0
  38. package/dist/types/src/components/EditorMenuProvider/util.d.ts.map +1 -0
  39. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  40. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  41. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  42. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  43. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +26 -2
  44. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/actions.d.ts +39 -0
  46. package/dist/types/src/components/EditorToolbar/actions.d.ts.map +1 -0
  47. package/dist/types/src/components/EditorToolbar/blocks.d.ts +3 -3
  48. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  49. package/dist/types/src/components/EditorToolbar/formatting.d.ts +3 -3
  50. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  51. package/dist/types/src/components/EditorToolbar/headings.d.ts +3 -3
  52. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  53. package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
  54. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  55. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
  56. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
  57. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +3 -3
  58. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  59. package/dist/types/src/components/index.d.ts +4 -2
  60. package/dist/types/src/components/index.d.ts.map +1 -1
  61. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +17 -0
  62. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  63. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  64. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  65. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  66. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  67. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  68. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  69. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  70. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  71. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  72. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  73. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +1 -1
  74. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  75. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  76. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  77. package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
  78. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  79. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  80. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  81. package/dist/types/src/extensions/autoscroll.d.ts +20 -0
  82. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  83. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
  84. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  85. package/dist/types/src/extensions/blocks.d.ts +2 -0
  86. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  87. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  88. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  89. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  90. package/dist/types/src/extensions/factories.d.ts +11 -11
  91. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  92. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  93. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  94. package/dist/types/src/extensions/index.d.ts +10 -1
  95. package/dist/types/src/extensions/index.d.ts.map +1 -1
  96. package/dist/types/src/extensions/json.d.ts +1 -1
  97. package/dist/types/src/extensions/json.d.ts.map +1 -1
  98. package/dist/types/src/extensions/listener.d.ts +8 -6
  99. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  100. package/dist/types/src/extensions/markdown/bundle.d.ts +6 -2
  101. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  102. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  103. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  104. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  105. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  106. package/dist/types/src/extensions/markdown/formatting.d.ts +1 -3
  107. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  108. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  109. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  110. package/dist/types/src/extensions/modal.d.ts +7 -0
  111. package/dist/types/src/extensions/modal.d.ts.map +1 -0
  112. package/dist/types/src/extensions/modes.d.ts +1 -1
  113. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  114. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  115. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  116. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  117. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  118. package/dist/types/src/extensions/outliner/tree.d.ts +1 -1
  119. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  120. package/dist/types/src/extensions/preview/preview.d.ts +8 -8
  121. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  122. package/dist/types/src/extensions/replacer.d.ts +21 -0
  123. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  124. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  125. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  126. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  127. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  128. package/dist/types/src/extensions/state.d.ts +2 -0
  129. package/dist/types/src/extensions/state.d.ts.map +1 -0
  130. package/dist/types/src/extensions/submit.d.ts +10 -0
  131. package/dist/types/src/extensions/submit.d.ts.map +1 -0
  132. package/dist/types/src/extensions/tab.d.ts +4 -0
  133. package/dist/types/src/extensions/tab.d.ts.map +1 -0
  134. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  135. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  136. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  137. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  138. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  139. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  140. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  141. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  142. package/dist/types/src/extensions/tags/xml-tags.d.ts +97 -0
  143. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  144. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  145. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  146. package/dist/types/src/hooks/useTextEditor.d.ts +5 -9
  147. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  148. package/dist/types/src/stories/{Command.stories.d.ts → CommandDialog.stories.d.ts} +2 -3
  149. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  150. package/dist/types/src/stories/Comments.stories.d.ts +3 -4
  151. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  152. package/dist/types/src/stories/EditorToolbar.stories.d.ts +1 -2
  153. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  154. package/dist/types/src/stories/Experimental.stories.d.ts +3 -4
  155. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  156. package/dist/types/src/stories/Markdown.stories.d.ts +3 -4
  157. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  158. package/dist/types/src/stories/Outliner.stories.d.ts +0 -1
  159. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  160. package/dist/types/src/stories/{CommandMenu.stories.d.ts → Popover.stories.d.ts} +6 -6
  161. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  162. package/dist/types/src/stories/Preview.stories.d.ts +4 -4
  163. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  164. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  165. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  166. package/dist/types/src/stories/TextEditor.stories.d.ts +3 -5
  167. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  168. package/dist/types/src/stories/components/EditorStory.d.ts +7 -5
  169. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  170. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  171. package/dist/types/src/styles/theme.d.ts.map +1 -1
  172. package/dist/types/src/types/types.d.ts +2 -2
  173. package/dist/types/src/types/types.d.ts.map +1 -1
  174. package/dist/types/src/util/debug.d.ts +5 -1
  175. package/dist/types/src/util/debug.d.ts.map +1 -1
  176. package/dist/types/src/util/decorations.d.ts +4 -0
  177. package/dist/types/src/util/decorations.d.ts.map +1 -0
  178. package/dist/types/src/util/dom.d.ts +2 -12
  179. package/dist/types/src/util/dom.d.ts.map +1 -1
  180. package/dist/types/src/util/index.d.ts +1 -0
  181. package/dist/types/src/util/index.d.ts.map +1 -1
  182. package/dist/types/src/util/react.d.ts +1 -1
  183. package/dist/types/src/util/react.d.ts.map +1 -1
  184. package/dist/types/tsconfig.tsbuildinfo +1 -1
  185. package/package.json +68 -66
  186. package/src/components/Editor/Editor.stories.tsx +89 -0
  187. package/src/components/Editor/Editor.tsx +160 -25
  188. package/src/components/EditorContent/EditorContent.stories.tsx +70 -0
  189. package/src/components/EditorContent/EditorContent.tsx +70 -0
  190. package/src/components/EditorContent/controller.ts +50 -0
  191. package/src/components/EditorContent/index.ts +6 -0
  192. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +233 -0
  193. package/src/components/EditorMenuProvider/index.ts +11 -0
  194. package/src/components/EditorMenuProvider/menu-presets.ts +123 -0
  195. package/src/components/EditorMenuProvider/menu.ts +71 -0
  196. package/src/components/EditorMenuProvider/popover.ts +287 -0
  197. package/src/components/EditorMenuProvider/useEditorMenu.ts +175 -0
  198. package/src/components/EditorMenuProvider/util.ts +31 -0
  199. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +82 -0
  200. package/src/components/EditorPreviewProvider/index.ts +5 -0
  201. package/src/components/EditorToolbar/EditorToolbar.tsx +101 -91
  202. package/src/components/EditorToolbar/{lists.ts → actions.ts} +46 -16
  203. package/src/components/EditorToolbar/blocks.ts +2 -1
  204. package/src/components/EditorToolbar/formatting.ts +2 -1
  205. package/src/components/EditorToolbar/headings.ts +8 -5
  206. package/src/components/EditorToolbar/image.ts +1 -1
  207. package/src/components/EditorToolbar/index.ts +3 -7
  208. package/src/components/EditorToolbar/search.ts +1 -1
  209. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  210. package/src/components/EditorToolbar/view-mode.ts +2 -1
  211. package/src/components/index.ts +8 -2
  212. package/src/extensions/autocomplete/autocomplete.ts +151 -0
  213. package/src/extensions/autocomplete/index.ts +8 -0
  214. package/src/extensions/autocomplete/match.ts +46 -0
  215. package/src/extensions/{command → autocomplete}/placeholder.ts +21 -17
  216. package/src/extensions/{command → autocomplete}/typeahead.ts +6 -48
  217. package/src/extensions/automerge/automerge.stories.tsx +9 -9
  218. package/src/extensions/automerge/automerge.ts +28 -9
  219. package/src/extensions/automerge/cursor.ts +1 -1
  220. package/src/extensions/automerge/sync.ts +8 -4
  221. package/src/extensions/automerge/update-automerge.ts +1 -1
  222. package/src/extensions/autoscroll.ts +163 -0
  223. package/src/extensions/awareness/awareness-provider.ts +2 -2
  224. package/src/extensions/blocks.ts +131 -0
  225. package/src/extensions/bookmarks.ts +75 -0
  226. package/src/extensions/comments.ts +7 -2
  227. package/src/extensions/factories.ts +50 -32
  228. package/src/extensions/focus.ts +5 -4
  229. package/src/extensions/folding.tsx +3 -6
  230. package/src/extensions/hashtag.tsx +2 -2
  231. package/src/extensions/index.ts +10 -1
  232. package/src/extensions/json.ts +1 -1
  233. package/src/extensions/listener.ts +14 -20
  234. package/src/extensions/markdown/bundle.ts +37 -6
  235. package/src/extensions/markdown/decorate.ts +26 -17
  236. package/src/extensions/markdown/formatting.ts +8 -10
  237. package/src/extensions/markdown/highlight.ts +1 -1
  238. package/src/extensions/markdown/image.ts +5 -6
  239. package/src/extensions/markdown/link.ts +3 -0
  240. package/src/extensions/markdown/table.ts +13 -7
  241. package/src/extensions/modal.ts +24 -0
  242. package/src/extensions/modes.ts +2 -2
  243. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
  244. package/src/extensions/outliner/outliner.test.ts +1 -1
  245. package/src/extensions/outliner/outliner.ts +5 -5
  246. package/src/extensions/outliner/tree.test.ts +1 -1
  247. package/src/extensions/outliner/tree.ts +1 -1
  248. package/src/extensions/preview/index.ts +1 -1
  249. package/src/extensions/preview/preview.ts +69 -69
  250. package/src/extensions/replacer.test.ts +75 -0
  251. package/src/extensions/replacer.ts +93 -0
  252. package/src/extensions/scrolling.ts +189 -0
  253. package/src/extensions/selection.ts +3 -3
  254. package/src/extensions/state.ts +7 -0
  255. package/src/extensions/submit.ts +62 -0
  256. package/src/extensions/tab.ts +29 -0
  257. package/src/extensions/tags/extended-markdown.test.ts +262 -0
  258. package/src/extensions/tags/extended-markdown.ts +78 -0
  259. package/src/extensions/tags/index.ts +7 -0
  260. package/src/extensions/tags/streamer.ts +243 -0
  261. package/src/extensions/tags/xml-tags.ts +500 -0
  262. package/src/extensions/tags/xml-util.ts +94 -0
  263. package/src/extensions/typewriter.ts +1 -1
  264. package/src/hooks/useTextEditor.ts +31 -43
  265. package/src/stories/CommandDialog.stories.tsx +83 -0
  266. package/src/stories/Comments.stories.tsx +8 -9
  267. package/src/stories/EditorToolbar.stories.tsx +15 -14
  268. package/src/stories/Experimental.stories.tsx +7 -7
  269. package/src/stories/Markdown.stories.tsx +6 -6
  270. package/src/stories/Outliner.stories.tsx +40 -32
  271. package/src/stories/Popover.stories.tsx +162 -0
  272. package/src/stories/Preview.stories.tsx +46 -43
  273. package/src/stories/Tags.stories.tsx +95 -0
  274. package/src/stories/TextEditor.stories.tsx +10 -33
  275. package/src/stories/components/EditorStory.tsx +30 -17
  276. package/src/stories/components/util.tsx +40 -8
  277. package/src/styles/markdown.ts +1 -1
  278. package/src/styles/theme.ts +13 -11
  279. package/src/types/types.ts +1 -1
  280. package/src/util/debug.ts +7 -2
  281. package/src/util/decorations.ts +21 -0
  282. package/src/util/dom.ts +5 -27
  283. package/src/util/index.ts +1 -0
  284. package/src/util/react.tsx +1 -1
  285. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  286. package/dist/lib/browser/testing/index.mjs +0 -6
  287. package/dist/lib/browser/testing/index.mjs.map +0 -7
  288. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  289. package/dist/lib/node-esm/testing/index.mjs +0 -8
  290. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  291. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  292. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  293. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  294. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  295. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  296. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  297. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  298. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  299. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  300. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  301. package/dist/types/src/components/Popover/index.d.ts +0 -4
  302. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  303. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  304. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  305. package/dist/types/src/extensions/command/action.d.ts +0 -17
  306. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  307. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  308. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  309. package/dist/types/src/extensions/command/command.d.ts +0 -6
  310. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  311. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  312. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  313. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  314. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  315. package/dist/types/src/extensions/command/index.d.ts +0 -7
  316. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  317. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  318. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  319. package/dist/types/src/extensions/command/state.d.ts +0 -16
  320. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  321. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  322. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  323. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  324. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  325. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  326. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  327. package/dist/types/src/testing/index.d.ts +0 -2
  328. package/dist/types/src/testing/index.d.ts.map +0 -1
  329. package/dist/types/src/testing/util.d.ts +0 -3
  330. package/dist/types/src/testing/util.d.ts.map +0 -1
  331. package/src/components/EditorToolbar/util.ts +0 -76
  332. package/src/components/Popover/CommandMenu.tsx +0 -279
  333. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  334. package/src/components/Popover/RefPopover.tsx +0 -99
  335. package/src/components/Popover/index.ts +0 -7
  336. package/src/extensions/autocomplete.ts +0 -69
  337. package/src/extensions/command/action.ts +0 -56
  338. package/src/extensions/command/command-menu.ts +0 -211
  339. package/src/extensions/command/command.ts +0 -34
  340. package/src/extensions/command/hint.ts +0 -103
  341. package/src/extensions/command/index.ts +0 -10
  342. package/src/extensions/command/state.ts +0 -90
  343. package/src/extensions/command/useCommandMenu.ts +0 -119
  344. package/src/stories/Command.stories.tsx +0 -101
  345. package/src/stories/CommandMenu.stories.tsx +0 -161
  346. package/src/testing/index.ts +0 -5
  347. package/src/testing/util.ts +0 -7
@@ -0,0 +1,93 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Extension } from '@codemirror/state';
6
+ import { EditorView } from '@codemirror/view';
7
+
8
+ type Replacement = {
9
+ input: string;
10
+ output: string;
11
+ };
12
+
13
+ /**
14
+ * Default character replacements for common typography.
15
+ */
16
+ export const defaultReplacements: Replacement[] = [
17
+ { input: '--', output: '—' },
18
+ { input: '...', output: '…' },
19
+ { input: '->', output: '→' },
20
+ { input: '<-', output: '←' },
21
+ { input: '=>', output: '⇒' },
22
+ { input: '<=>', output: '⇔' },
23
+ { input: '+-', output: '±' },
24
+ { input: '!=', output: '≠' },
25
+ { input: '<=', output: '≤' },
26
+ { input: '>=', output: '≥' },
27
+ { input: '(c)', output: '©' },
28
+ { input: 'EUR', output: '€' },
29
+ { input: 'GBP', output: '£' },
30
+ { input: 'BTC', output: '₿' },
31
+ ];
32
+
33
+ /**
34
+ * Options for the replacer extension.
35
+ */
36
+ export interface ReplacerOptions {
37
+ replacements?: Replacement[];
38
+ }
39
+
40
+ /**
41
+ * Creates a CodeMirror extension that automatically replaces typed character sequences.
42
+ */
43
+ export const replacer = ({ replacements = defaultReplacements }: ReplacerOptions = {}): Extension => {
44
+ // Sort replacements by input length (longest first) to handle overlapping patterns correctly.
45
+ const sortedReplacements = [...replacements].sort((a, b) => b.input.length - a.input.length);
46
+
47
+ return EditorView.inputHandler.of((view, from, to, insert) => {
48
+ // Only process single character insertions for performance.
49
+ if (insert.length !== 1) {
50
+ return false;
51
+ }
52
+
53
+ const state = view.state;
54
+ const doc = state.doc;
55
+
56
+ // Get the text before the insertion point to check for patterns.
57
+ const lineStart = doc.lineAt(from).from;
58
+ const textBefore = doc.sliceString(lineStart, from);
59
+ const textWithInsert = textBefore + insert;
60
+
61
+ // Check each replacement pattern.
62
+ for (const replacement of sortedReplacements) {
63
+ if (textWithInsert.endsWith(replacement.input)) {
64
+ const range = {
65
+ from: from - replacement.input.length + 1,
66
+ to: from,
67
+ };
68
+
69
+ // Ensure we don't go before the line start.
70
+ if (range.from < lineStart) {
71
+ continue;
72
+ }
73
+
74
+ // Create the replacement transaction.
75
+ view.dispatch(
76
+ state.update({
77
+ changes: {
78
+ ...range,
79
+ insert: replacement.output,
80
+ },
81
+ selection: {
82
+ anchor: range.from + replacement.output.length,
83
+ },
84
+ }),
85
+ );
86
+
87
+ return true;
88
+ }
89
+ }
90
+
91
+ return false;
92
+ });
93
+ };
@@ -0,0 +1,189 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { StateEffect } from '@codemirror/state';
6
+ import { EditorView, ViewPlugin } from '@codemirror/view';
7
+
8
+ /**
9
+ * Configuration options for smooth scrolling behavior.
10
+ */
11
+ export type SmoothScrollOptions = {
12
+ /**
13
+ * Additional offset from the target line in pixels.
14
+ * Positive values scroll past the line, negative values stop before it.
15
+ * @default 0
16
+ */
17
+ offset?: number;
18
+ /**
19
+ * Position of the target line in the viewport.
20
+ * - 'start': Line appears at the start (top) of the screen
21
+ * - 'end': Line appears at the end (bottom) of the screen
22
+ * @default 'start'
23
+ */
24
+ position?: 'start' | 'end';
25
+ /**
26
+ * Whether to use smooth scrolling.
27
+ * @default 'smooth'
28
+ */
29
+ behavior?: ScrollBehavior;
30
+ };
31
+
32
+ /**
33
+ * Parameters for the scroll to line effect.
34
+ */
35
+ export type ScrollToLineParams = {
36
+ /**
37
+ * The line number to scroll to (1-based).
38
+ */
39
+ line: number;
40
+ /**
41
+ * Optional configuration to override default scroll behavior.
42
+ */
43
+ options?: SmoothScrollOptions;
44
+ };
45
+
46
+ /**
47
+ * StateEffect for triggering smooth scroll to a specific line.
48
+ */
49
+ export const scrollToLineEffect = StateEffect.define<ScrollToLineParams>();
50
+
51
+ /**
52
+ * Extension that provides smooth scrolling to specific lines in the editor.
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * // Add to editor extensions.
57
+ * const extensions = [
58
+ * smoothScroll()
59
+ * ];
60
+ *
61
+ * // Trigger scroll to line 42.
62
+ * view.dispatch({
63
+ * effects: scrollToLineEffect.of({ line: 42 })
64
+ * });
65
+ *
66
+ * // Scroll with custom options.
67
+ * view.dispatch({
68
+ * effects: scrollToLineEffect.of({ line: 100, options: { offset: -50 } })
69
+ * });
70
+ *
71
+ * // Scroll so line appears at end (bottom) of screen.
72
+ * view.dispatch({
73
+ * effects: scrollToLineEffect.of({ line: 50, options: { position: 'end' } })
74
+ * });
75
+ * ```
76
+ */
77
+ export const smoothScroll = ({ offset = 0, position = 'start' }: Partial<SmoothScrollOptions> = {}) => {
78
+ // ViewPlugin to manage scroll animations.
79
+ const scrollPlugin = ViewPlugin.fromClass(
80
+ class SmoothScrollPlugin {
81
+ constructor(private readonly view: EditorView) {}
82
+
83
+ // No-op.
84
+ destroy() {}
85
+
86
+ /**
87
+ * Perform smooth scroll to the specified line.
88
+ */
89
+ scrollToLine(lineNumber: number, options: SmoothScrollOptions) {
90
+ const { offset: animOffset = 0, position: animPosition, behavior } = options;
91
+ const doc = this.view.state.doc;
92
+ const scroller = this.view.scrollDOM;
93
+
94
+ // Convert 1-based line number to 0-based.
95
+ const targetLine = Math.max(0, lineNumber - 1);
96
+ if (behavior === 'instant') {
97
+ requestAnimationFrame(() => {
98
+ this.view.dispatch({
99
+ selection: { anchor: doc.line(targetLine + 1).from },
100
+ scrollIntoView: true,
101
+ });
102
+ });
103
+ return;
104
+ }
105
+
106
+ // Get the position of the target line.
107
+ if (targetLine >= doc.lines) {
108
+ // Line doesn't exist, scroll to end.
109
+ const targetScrollTop = scroller.scrollHeight - scroller.clientHeight + (animOffset || 0);
110
+ this.animateScroll(scroller, targetScrollTop);
111
+ return;
112
+ }
113
+
114
+ const lineStart = doc.line(targetLine + 1).from;
115
+ const coords = this.view.coordsAtPos(lineStart);
116
+ if (!coords) {
117
+ return;
118
+ }
119
+
120
+ // Calculate target scroll position based on position option.
121
+ const currentScrollTop = scroller.scrollTop;
122
+ const scrollerRect = scroller.getBoundingClientRect();
123
+ const maxScrollTop = scroller.scrollHeight - scroller.clientHeight;
124
+
125
+ let targetScrollTop: number;
126
+ if (animPosition === 'end') {
127
+ // Position line at end (bottom) of viewport.
128
+ // Calculate how far down we need to scroll so the line's bottom aligns with viewport bottom.
129
+ targetScrollTop = currentScrollTop + coords.bottom - scrollerRect.bottom + animOffset;
130
+ } else {
131
+ // Default: position line at start (top) of viewport.
132
+ targetScrollTop = currentScrollTop + coords.top - scrollerRect.top + animOffset;
133
+ }
134
+
135
+ // Clamp to valid scroll range.
136
+ const clampedScrollTop = Math.max(0, Math.min(targetScrollTop, maxScrollTop));
137
+ this.animateScroll(scroller, clampedScrollTop);
138
+ }
139
+
140
+ /**
141
+ * Animate scroll using browser's built-in smooth scrolling.
142
+ */
143
+ private animateScroll(element: HTMLElement, targetScrollTop: number) {
144
+ if (Math.abs(targetScrollTop - element.scrollTop) < 1) {
145
+ return;
146
+ }
147
+
148
+ // Use browser's built-in smooth scrolling.
149
+ element.scrollTo({
150
+ top: targetScrollTop,
151
+ behavior: 'smooth',
152
+ });
153
+ }
154
+ },
155
+ );
156
+
157
+ return [
158
+ scrollPlugin,
159
+
160
+ // Update listener to handle scroll effects.
161
+ EditorView.updateListener.of((update) => {
162
+ update.transactions.forEach((transaction) => {
163
+ for (const effect of transaction.effects) {
164
+ if (effect.is(scrollToLineEffect)) {
165
+ const { line, options = {} } = effect.value;
166
+ const plugin = update.view.plugin(scrollPlugin);
167
+ if (plugin) {
168
+ plugin.scrollToLine(line, { offset, position, ...options });
169
+ }
170
+ }
171
+ }
172
+ });
173
+ }),
174
+ ];
175
+ };
176
+
177
+ /**
178
+ * Helper function to scroll to a specific line.
179
+ * This is a convenience function that can be used directly with an EditorView.
180
+ *
181
+ * @param view - The CodeMirror EditorView instance
182
+ * @param line - The line number to scroll to (1-based)
183
+ * @param options - Optional scroll configuration
184
+ */
185
+ export const scrollToLine = (view: EditorView, line: number, options?: SmoothScrollOptions) => {
186
+ view.dispatch({
187
+ effects: scrollToLineEffect.of({ line, options }),
188
+ });
189
+ };
@@ -7,7 +7,7 @@ import { EditorView, keymap } from '@codemirror/view';
7
7
 
8
8
  import { debounce } from '@dxos/async';
9
9
  import { invariant } from '@dxos/invariant';
10
- import { isNotFalsy } from '@dxos/util';
10
+ import { isTruthy } from '@dxos/util';
11
11
 
12
12
  import { singleValueFacet } from '../util';
13
13
 
@@ -86,7 +86,7 @@ export const selectionState = ({ getState, setState }: Partial<EditorStateStore>
86
86
  getState &&
87
87
  keymap.of([
88
88
  {
89
- key: 'ctrl-r', // TODO(burdon): Setting to jump back to selection.
89
+ key: 'Ctrl-r', // TODO(burdon): Setting to jump back to selection.
90
90
  run: (view) => {
91
91
  const state = getState(view.state.facet(documentId));
92
92
  if (state) {
@@ -96,5 +96,5 @@ export const selectionState = ({ getState, setState }: Partial<EditorStateStore>
96
96
  },
97
97
  },
98
98
  ]),
99
- ].filter(isNotFalsy);
99
+ ].filter(isTruthy);
100
100
  };
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { Transaction } from '@codemirror/state';
6
+
7
+ export const initialSync = Transaction.userEvent.of('initial.sync');
@@ -0,0 +1,62 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Extension, Prec } from '@codemirror/state';
6
+ import { keymap } from '@codemirror/view';
7
+
8
+ export type SubmitOptions = {
9
+ fireIfEmpty?: boolean;
10
+ onSubmit?: (text: string) => boolean | void;
11
+ };
12
+
13
+ /**
14
+ * Handles Enter and Shift-Enter.
15
+ */
16
+ export const submit = ({ fireIfEmpty = false, onSubmit }: SubmitOptions = {}): Extension => {
17
+ return [
18
+ Prec.highest(
19
+ keymap.of([
20
+ {
21
+ key: 'Enter',
22
+ preventDefault: true,
23
+ run: (view) => {
24
+ const text = view.state.doc.toString().trim();
25
+ if (onSubmit && (fireIfEmpty || text.length > 0)) {
26
+ const reset = onSubmit(text);
27
+ if (reset) {
28
+ // Clear the document after calling onEnter.
29
+ view.dispatch({
30
+ changes: {
31
+ from: 0,
32
+ to: view.state.doc.length,
33
+ insert: '',
34
+ },
35
+ });
36
+ }
37
+ }
38
+
39
+ return true;
40
+ },
41
+ },
42
+ {
43
+ key: 'Shift-Enter',
44
+ preventDefault: true,
45
+ run: (view) => {
46
+ view.dispatch({
47
+ changes: {
48
+ from: view.state.selection.main.head,
49
+ insert: '\n',
50
+ },
51
+ selection: {
52
+ anchor: view.state.selection.main.head + 1,
53
+ head: view.state.selection.main.head + 1,
54
+ },
55
+ });
56
+ return true;
57
+ },
58
+ },
59
+ ]),
60
+ ),
61
+ ];
62
+ };
@@ -0,0 +1,29 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Extension } from '@codemirror/state';
6
+ import { keymap } from '@codemirror/view';
7
+ import { type useFocusFinders } from '@fluentui/react-tabster';
8
+
9
+ export const tab = ({
10
+ findNextFocusable,
11
+ findPrevFocusable,
12
+ // findFirstFocusable,
13
+ // findLastFocusable,
14
+ }: ReturnType<typeof useFocusFinders>): Extension => {
15
+ return keymap.of([
16
+ {
17
+ key: 'Tab',
18
+ preventDefault: true,
19
+ run: (view) => {
20
+ findNextFocusable(view.dom)?.focus();
21
+ return true;
22
+ },
23
+ shift: (view) => {
24
+ findPrevFocusable(view.dom)?.focus();
25
+ return true;
26
+ },
27
+ },
28
+ ]);
29
+ };
@@ -0,0 +1,262 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { syntaxTree } from '@codemirror/language';
6
+ import { EditorState } from '@codemirror/state';
7
+ import { type SyntaxNode } from '@lezer/common';
8
+ import { describe, test } from 'vitest';
9
+
10
+ import { trim } from '@dxos/util';
11
+
12
+ import { extendedMarkdown } from './extended-markdown';
13
+ import { nodeToJson } from './xml-util';
14
+
15
+ describe('extended-markdown', () => {
16
+ const createEditorState = (doc: string) => {
17
+ return EditorState.create({
18
+ doc,
19
+ extensions: [extendedMarkdown()],
20
+ });
21
+ };
22
+
23
+ test('tree', async ({ expect }) => {
24
+ const doc = trim`
25
+ <prompt>
26
+ Hello
27
+ </prompt>
28
+
29
+ Hi there!
30
+
31
+ What can I do for you?
32
+
33
+ <suggestion>Summarize tools</suggestion>
34
+
35
+ <choice>
36
+ <option>Summarize tools</option>
37
+ <option>Retry</option>
38
+ </choice>
39
+
40
+ <toolkit />
41
+ `;
42
+
43
+ const state = createEditorState(doc);
44
+
45
+ const nodes: SyntaxNode[] = [];
46
+ const tree = syntaxTree(state);
47
+ tree.iterate({
48
+ enter: (node) => {
49
+ if (node.type.name === 'Element') {
50
+ nodes.push(node.node);
51
+ return false; // Stop traversal.
52
+ }
53
+ },
54
+ });
55
+
56
+ expect(nodes).toHaveLength(4);
57
+ expect(
58
+ nodes.map((node) => ({
59
+ content: doc.slice(node.from, node.to),
60
+ data: nodeToJson(state, node.node),
61
+ })),
62
+ ).toEqual([
63
+ {
64
+ content: '<prompt>\n Hello\n</prompt>',
65
+ data: {
66
+ _tag: 'prompt',
67
+ children: ['Hello'],
68
+ },
69
+ },
70
+ {
71
+ content: '<suggestion>Summarize tools</suggestion>',
72
+ data: {
73
+ _tag: 'suggestion',
74
+ children: ['Summarize tools'],
75
+ },
76
+ },
77
+ {
78
+ content: '<choice>\n <option>Summarize tools</option>\n <option>Retry</option>\n</choice>',
79
+ data: {
80
+ _tag: 'choice',
81
+ children: [
82
+ {
83
+ _tag: 'option',
84
+ children: ['Summarize tools'],
85
+ },
86
+ {
87
+ _tag: 'option',
88
+ children: ['Retry'],
89
+ },
90
+ ],
91
+ },
92
+ },
93
+ {
94
+ content: '<toolkit />',
95
+ data: {
96
+ _tag: 'toolkit',
97
+ },
98
+ },
99
+ ]);
100
+ });
101
+
102
+ test('setext heading disabled', () => {
103
+ const doc = trim`
104
+ This should NOT be a heading
105
+ =
106
+
107
+ Another line that should NOT be a heading
108
+ -
109
+ `;
110
+
111
+ const state = createEditorState(doc);
112
+ const tree = syntaxTree(state);
113
+
114
+ tree.iterate({
115
+ enter: (node) => {
116
+ if (node.type.name === 'SetextHeading') {
117
+ throw new Error('SetextHeading should be disabled!');
118
+ }
119
+ },
120
+ });
121
+ });
122
+
123
+ //
124
+ // TODO(burdon): All tests below should test the tree.
125
+ //
126
+
127
+ test('should parse standard markdown elements', ({ expect }) => {
128
+ const doc = trim`
129
+ # Heading 1
130
+ ## Heading 2
131
+ ### Heading 3
132
+
133
+ This is a paragraph with **bold** and *italic* text.
134
+
135
+ \`\`\`javascript
136
+ const code = 'block';
137
+ \`\`\`
138
+ `;
139
+
140
+ const state = createEditorState(doc);
141
+ const tree = state.sliceDoc(0, state.doc.length);
142
+
143
+ // Verify the document is parsed without errors.
144
+ expect(tree).toBe(doc);
145
+ expect(state.doc.lines).toBeGreaterThan(1);
146
+ });
147
+
148
+ test('should parse custom XML tags', ({ expect }) => {
149
+ const doc = trim`
150
+ # Document with Custom Tags
151
+
152
+ <prompt>This is a custom prompt block</prompt>
153
+
154
+ Regular paragraph text.
155
+
156
+ <prompt />
157
+
158
+ Regular paragraph text.
159
+
160
+ <prompt>
161
+ Multi-line
162
+ prompt content
163
+ </prompt>
164
+ `;
165
+
166
+ const state = createEditorState(doc);
167
+ const tree = state.sliceDoc(0, state.doc.length);
168
+
169
+ // Verify the document contains custom tags.
170
+ expect(tree).toContain('<prompt>');
171
+ expect(tree).toContain('<prompt />');
172
+ expect(tree).toContain('</prompt>');
173
+ });
174
+
175
+ test('should handle mixed markdown and XML content', ({ expect }) => {
176
+ const doc = trim`
177
+ # Mixed Content
178
+
179
+ This is a paragraph with a <prompt>inline prompt</prompt> tag.
180
+
181
+ ## Section 2
182
+
183
+ <prompt>
184
+ This prompt contains **markdown** formatting
185
+ </prompt>
186
+
187
+ \`\`\`
188
+ <prompt>This should not be parsed as XML inside code block</prompt>
189
+ \`\`\`
190
+ `;
191
+
192
+ const state = createEditorState(doc);
193
+ const tree = state.sliceDoc(0, state.doc.length);
194
+
195
+ // Verify mixed content is preserved.
196
+ expect(tree).toBe(doc);
197
+ });
198
+
199
+ test('should not parse XML tags in code blocks', ({ expect }) => {
200
+ const doc = trim`
201
+ \`\`\`xml
202
+ <prompt>This is inside a code block</prompt>
203
+ \`\`\`
204
+
205
+ \`<prompt>inline code</prompt>\`
206
+ `;
207
+
208
+ const state = createEditorState(doc);
209
+ const tree = state.sliceDoc(0, state.doc.length);
210
+
211
+ // Verify code blocks are preserved as-is.
212
+ expect(tree).toContain('```xml');
213
+ expect(tree).toContain('<prompt>This is inside a code block</prompt>');
214
+ });
215
+
216
+ test('should handle nested and complex structures', ({ expect }) => {
217
+ const doc = trim`
218
+ # Complex Document
219
+
220
+ <prompt>
221
+ First prompt with some content
222
+ </prompt>
223
+
224
+ ## Lists and Prompts
225
+
226
+ - Item 1
227
+ - Item 2 with <prompt>embedded prompt</prompt>
228
+ - Item 3
229
+
230
+ <prompt>
231
+ Another prompt after the list
232
+ </prompt>
233
+
234
+ ### Code Example
235
+
236
+ \`\`\`typescript
237
+ const example = '<prompt>not parsed</prompt>';
238
+ \`\`\`
239
+ `;
240
+
241
+ const state = createEditorState(doc);
242
+ const tree = state.sliceDoc(0, state.doc.length);
243
+
244
+ // Verify complex structures are handled.
245
+ expect(tree).toBe(doc);
246
+ expect(tree).toMatch(/Item 2 with <prompt>embedded prompt<\/prompt>/);
247
+ });
248
+
249
+ test('should handle empty and edge cases', ({ expect }) => {
250
+ const emptyDoc = '';
251
+ const emptyState = createEditorState(emptyDoc);
252
+ expect(emptyState.doc.length).toBe(0);
253
+
254
+ const onlyPromptDoc = '<prompt>Only prompt content</prompt>';
255
+ const onlyPromptState = createEditorState(onlyPromptDoc);
256
+ expect(onlyPromptState.sliceDoc(0)).toBe(onlyPromptDoc);
257
+
258
+ const unclosedPromptDoc = '<prompt>Unclosed prompt';
259
+ const unclosedState = createEditorState(unclosedPromptDoc);
260
+ expect(unclosedState.sliceDoc(0)).toBe(unclosedPromptDoc);
261
+ });
262
+ });