@dxos/react-ui-editor 0.8.4-main.fd6878d → 0.8.4-main.fffef41

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 (356) 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 +7471 -5897
  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 +7471 -5897
  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/image.d.ts.map +1 -1
  54. package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
  55. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  56. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  57. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
  58. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
  59. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +3 -3
  60. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  61. package/dist/types/src/components/index.d.ts +4 -2
  62. package/dist/types/src/components/index.d.ts.map +1 -1
  63. package/dist/types/src/defaults.d.ts.map +1 -1
  64. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +17 -0
  65. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  66. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  67. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  68. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  69. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  70. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  71. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  72. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  73. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  74. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  75. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  76. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +10 -19
  77. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  78. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  79. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  80. package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
  81. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  82. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  83. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  84. package/dist/types/src/extensions/autoscroll.d.ts +20 -0
  85. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  86. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
  87. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  88. package/dist/types/src/extensions/blocks.d.ts +2 -0
  89. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  90. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  91. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  92. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  93. package/dist/types/src/extensions/factories.d.ts +11 -11
  94. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  95. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  96. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  97. package/dist/types/src/extensions/index.d.ts +10 -1
  98. package/dist/types/src/extensions/index.d.ts.map +1 -1
  99. package/dist/types/src/extensions/json.d.ts +1 -1
  100. package/dist/types/src/extensions/json.d.ts.map +1 -1
  101. package/dist/types/src/extensions/listener.d.ts +8 -6
  102. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  103. package/dist/types/src/extensions/markdown/bundle.d.ts +8 -2
  104. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  105. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  106. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  107. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  108. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  109. package/dist/types/src/extensions/markdown/formatting.d.ts +1 -3
  110. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  111. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  112. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  113. package/dist/types/src/extensions/modal.d.ts +7 -0
  114. package/dist/types/src/extensions/modal.d.ts.map +1 -0
  115. package/dist/types/src/extensions/modes.d.ts +1 -1
  116. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  117. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  118. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  119. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  120. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  121. package/dist/types/src/extensions/outliner/tree.d.ts +1 -1
  122. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  123. package/dist/types/src/extensions/preview/preview.d.ts +8 -8
  124. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  125. package/dist/types/src/extensions/replacer.d.ts +21 -0
  126. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  127. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  128. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  129. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  130. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  131. package/dist/types/src/extensions/state.d.ts +2 -0
  132. package/dist/types/src/extensions/state.d.ts.map +1 -0
  133. package/dist/types/src/extensions/submit.d.ts +10 -0
  134. package/dist/types/src/extensions/submit.d.ts.map +1 -0
  135. package/dist/types/src/extensions/tab.d.ts +4 -0
  136. package/dist/types/src/extensions/tab.d.ts.map +1 -0
  137. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  138. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  139. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  140. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  141. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  142. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  143. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  144. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  145. package/dist/types/src/extensions/tags/xml-tags.d.ts +97 -0
  146. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  147. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  148. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  149. package/dist/types/src/hooks/useTextEditor.d.ts +5 -9
  150. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  151. package/dist/types/src/stories/CommandDialog.stories.d.ts +14 -0
  152. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  153. package/dist/types/src/stories/Comments.stories.d.ts +21 -10
  154. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  155. package/dist/types/src/stories/EditorToolbar.stories.d.ts +39 -3
  156. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  157. package/dist/types/src/stories/Experimental.stories.d.ts +22 -13
  158. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  159. package/dist/types/src/stories/Markdown.stories.d.ts +32 -43
  160. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  161. package/dist/types/src/stories/Outliner.stories.d.ts +15 -21
  162. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  163. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  164. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  165. package/dist/types/src/stories/Preview.stories.d.ts +22 -7
  166. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  167. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  168. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  169. package/dist/types/src/stories/TextEditor.stories.d.ts +37 -52
  170. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  171. package/dist/types/src/stories/components/EditorStory.d.ts +8 -9
  172. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  173. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  174. package/dist/types/src/styles/theme.d.ts.map +1 -1
  175. package/dist/types/src/translations.d.ts +1 -1
  176. package/dist/types/src/types/types.d.ts +2 -2
  177. package/dist/types/src/types/types.d.ts.map +1 -1
  178. package/dist/types/src/util/debug.d.ts +5 -1
  179. package/dist/types/src/util/debug.d.ts.map +1 -1
  180. package/dist/types/src/util/decorations.d.ts +4 -0
  181. package/dist/types/src/util/decorations.d.ts.map +1 -0
  182. package/dist/types/src/util/dom.d.ts +2 -12
  183. package/dist/types/src/util/dom.d.ts.map +1 -1
  184. package/dist/types/src/util/index.d.ts +1 -0
  185. package/dist/types/src/util/index.d.ts.map +1 -1
  186. package/dist/types/src/util/react.d.ts +1 -1
  187. package/dist/types/src/util/react.d.ts.map +1 -1
  188. package/dist/types/tsconfig.tsbuildinfo +1 -1
  189. package/package.json +70 -68
  190. package/src/components/Editor/Editor.stories.tsx +89 -0
  191. package/src/components/Editor/Editor.tsx +160 -25
  192. package/src/components/EditorContent/EditorContent.stories.tsx +70 -0
  193. package/src/components/EditorContent/EditorContent.tsx +70 -0
  194. package/src/components/EditorContent/controller.ts +50 -0
  195. package/src/components/EditorContent/index.ts +6 -0
  196. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +233 -0
  197. package/src/components/EditorMenuProvider/index.ts +11 -0
  198. package/src/components/EditorMenuProvider/menu-presets.ts +123 -0
  199. package/src/components/EditorMenuProvider/menu.ts +71 -0
  200. package/src/components/EditorMenuProvider/popover.ts +287 -0
  201. package/src/components/EditorMenuProvider/useEditorMenu.ts +175 -0
  202. package/src/components/EditorMenuProvider/util.ts +31 -0
  203. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +82 -0
  204. package/src/components/EditorPreviewProvider/index.ts +5 -0
  205. package/src/components/EditorToolbar/EditorToolbar.tsx +116 -96
  206. package/src/components/EditorToolbar/actions.ts +86 -0
  207. package/src/components/EditorToolbar/blocks.ts +20 -23
  208. package/src/components/EditorToolbar/formatting.ts +21 -24
  209. package/src/components/EditorToolbar/headings.ts +16 -9
  210. package/src/components/EditorToolbar/image.ts +9 -5
  211. package/src/components/EditorToolbar/index.ts +3 -7
  212. package/src/components/EditorToolbar/search.ts +9 -5
  213. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  214. package/src/components/EditorToolbar/view-mode.ts +11 -6
  215. package/src/components/index.ts +8 -2
  216. package/src/defaults.ts +5 -2
  217. package/src/extensions/autocomplete/autocomplete.ts +151 -0
  218. package/src/extensions/autocomplete/index.ts +8 -0
  219. package/src/extensions/autocomplete/match.ts +46 -0
  220. package/src/extensions/{command → autocomplete}/placeholder.ts +21 -17
  221. package/src/extensions/{command → autocomplete}/typeahead.ts +6 -48
  222. package/src/extensions/automerge/automerge.stories.tsx +28 -21
  223. package/src/extensions/automerge/automerge.ts +28 -9
  224. package/src/extensions/automerge/cursor.ts +1 -1
  225. package/src/extensions/automerge/sync.ts +8 -4
  226. package/src/extensions/automerge/update-automerge.ts +1 -1
  227. package/src/extensions/autoscroll.ts +163 -0
  228. package/src/extensions/awareness/awareness-provider.ts +2 -2
  229. package/src/extensions/blocks.ts +131 -0
  230. package/src/extensions/bookmarks.ts +75 -0
  231. package/src/extensions/comments.ts +13 -8
  232. package/src/extensions/factories.ts +50 -32
  233. package/src/extensions/focus.ts +5 -4
  234. package/src/extensions/folding.tsx +3 -6
  235. package/src/extensions/hashtag.tsx +2 -2
  236. package/src/extensions/index.ts +10 -1
  237. package/src/extensions/json.ts +1 -1
  238. package/src/extensions/listener.ts +14 -20
  239. package/src/extensions/markdown/bundle.ts +39 -5
  240. package/src/extensions/markdown/decorate.ts +26 -17
  241. package/src/extensions/markdown/formatting.ts +8 -10
  242. package/src/extensions/markdown/highlight.ts +1 -1
  243. package/src/extensions/markdown/image.ts +5 -6
  244. package/src/extensions/markdown/link.ts +3 -0
  245. package/src/extensions/markdown/table.ts +13 -7
  246. package/src/extensions/modal.ts +24 -0
  247. package/src/extensions/modes.ts +2 -2
  248. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
  249. package/src/extensions/outliner/outliner.test.ts +1 -1
  250. package/src/extensions/outliner/outliner.ts +5 -5
  251. package/src/extensions/outliner/tree.test.ts +1 -1
  252. package/src/extensions/outliner/tree.ts +1 -1
  253. package/src/extensions/preview/index.ts +1 -1
  254. package/src/extensions/preview/preview.ts +69 -69
  255. package/src/extensions/replacer.test.ts +75 -0
  256. package/src/extensions/replacer.ts +93 -0
  257. package/src/extensions/scrolling.ts +189 -0
  258. package/src/extensions/selection.ts +3 -3
  259. package/src/extensions/state.ts +7 -0
  260. package/src/extensions/submit.ts +62 -0
  261. package/src/extensions/tab.ts +29 -0
  262. package/src/extensions/tags/extended-markdown.test.ts +262 -0
  263. package/src/extensions/tags/extended-markdown.ts +78 -0
  264. package/src/extensions/tags/index.ts +7 -0
  265. package/src/extensions/tags/streamer.ts +243 -0
  266. package/src/extensions/tags/xml-tags.ts +500 -0
  267. package/src/extensions/tags/xml-util.ts +94 -0
  268. package/src/extensions/typewriter.ts +1 -1
  269. package/src/hooks/useTextEditor.ts +31 -43
  270. package/src/stories/CommandDialog.stories.tsx +83 -0
  271. package/src/stories/Comments.stories.tsx +15 -13
  272. package/src/stories/EditorToolbar.stories.tsx +18 -17
  273. package/src/stories/Experimental.stories.tsx +15 -12
  274. package/src/stories/Markdown.stories.tsx +24 -21
  275. package/src/stories/Outliner.stories.tsx +50 -39
  276. package/src/stories/Popover.stories.tsx +162 -0
  277. package/src/stories/Preview.stories.tsx +52 -46
  278. package/src/stories/Tags.stories.tsx +95 -0
  279. package/src/stories/TextEditor.stories.tsx +30 -50
  280. package/src/stories/components/EditorStory.tsx +32 -20
  281. package/src/stories/components/util.tsx +40 -8
  282. package/src/styles/markdown.ts +1 -1
  283. package/src/styles/theme.ts +16 -13
  284. package/src/translations.ts +1 -1
  285. package/src/types/types.ts +1 -1
  286. package/src/util/debug.ts +7 -2
  287. package/src/util/decorations.ts +21 -0
  288. package/src/util/dom.ts +5 -27
  289. package/src/util/index.ts +1 -0
  290. package/src/util/react.tsx +1 -1
  291. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  292. package/dist/lib/browser/testing/index.mjs +0 -6
  293. package/dist/lib/browser/testing/index.mjs.map +0 -7
  294. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  295. package/dist/lib/node-esm/testing/index.mjs +0 -8
  296. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  297. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  298. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  299. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  300. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  301. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  302. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  303. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  304. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  305. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  306. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  307. package/dist/types/src/components/Popover/index.d.ts +0 -4
  308. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  309. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  310. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  311. package/dist/types/src/extensions/command/action.d.ts +0 -17
  312. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  313. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  314. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  315. package/dist/types/src/extensions/command/command.d.ts +0 -6
  316. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  317. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  318. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  319. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  320. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  321. package/dist/types/src/extensions/command/index.d.ts +0 -7
  322. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  323. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  324. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  325. package/dist/types/src/extensions/command/state.d.ts +0 -16
  326. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  327. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  328. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  329. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  330. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  331. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  332. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  333. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  334. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  335. package/dist/types/src/testing/index.d.ts +0 -2
  336. package/dist/types/src/testing/index.d.ts.map +0 -1
  337. package/dist/types/src/testing/util.d.ts +0 -3
  338. package/dist/types/src/testing/util.d.ts.map +0 -1
  339. package/src/components/EditorToolbar/lists.ts +0 -60
  340. package/src/components/EditorToolbar/util.ts +0 -65
  341. package/src/components/Popover/CommandMenu.tsx +0 -279
  342. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  343. package/src/components/Popover/RefPopover.tsx +0 -99
  344. package/src/components/Popover/index.ts +0 -7
  345. package/src/extensions/autocomplete.ts +0 -69
  346. package/src/extensions/command/action.ts +0 -56
  347. package/src/extensions/command/command-menu.ts +0 -211
  348. package/src/extensions/command/command.ts +0 -34
  349. package/src/extensions/command/hint.ts +0 -103
  350. package/src/extensions/command/index.ts +0 -10
  351. package/src/extensions/command/state.ts +0 -90
  352. package/src/extensions/command/useCommandMenu.ts +0 -119
  353. package/src/stories/Command.stories.tsx +0 -98
  354. package/src/stories/CommandMenu.stories.tsx +0 -160
  355. package/src/testing/index.ts +0 -5
  356. package/src/testing/util.ts +0 -7
@@ -0,0 +1,233 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type EditorView } from '@codemirror/view';
6
+ import { useControllableState } from '@radix-ui/react-use-controllable-state';
7
+ import React, { Fragment, type PropsWithChildren, useCallback, useEffect, useRef, useState } from 'react';
8
+
9
+ import { addEventListener } from '@dxos/async';
10
+ import { invariant } from '@dxos/invariant';
11
+ import {
12
+ DX_ANCHOR_ACTIVATE,
13
+ type DxAnchorActivate,
14
+ Icon,
15
+ Popover,
16
+ toLocalizedString,
17
+ useDynamicRef,
18
+ useThemeContext,
19
+ useTranslation,
20
+ } from '@dxos/react-ui';
21
+
22
+ import { type EditorMenuGroup, type EditorMenuItem } from './menu';
23
+
24
+ export type EditorMenuProviderProps = PropsWithChildren<{
25
+ view?: EditorView | null;
26
+ groups?: EditorMenuGroup[];
27
+ currentItem?: string;
28
+ open?: boolean;
29
+ defaultOpen?: boolean;
30
+ numItems?: number;
31
+ onOpenChange?: (event: { view: EditorView; open: boolean; trigger?: string }) => void;
32
+ onActivate?: (event: { view: EditorView; trigger?: string }) => void;
33
+ onSelect?: (event: { view: EditorView; item: EditorMenuItem }) => void;
34
+ onCancel?: (event: { view: EditorView }) => void;
35
+ }>;
36
+
37
+ /**
38
+ * Implements the Popover and listens for the `dx-anchor-activate` event from the
39
+ * `popover` extension's decoration.
40
+ *
41
+ * NOTE: We don't use DropdownMenu because the command menu needs to manage focus explicitly.
42
+ * I.e., focus must remain in the editor while displaying the menu (for type-ahead).
43
+ */
44
+ export const EditorMenuProvider = ({
45
+ children,
46
+ view,
47
+ groups,
48
+ currentItem,
49
+ open: openParam,
50
+ defaultOpen,
51
+ numItems = 8,
52
+ onOpenChange,
53
+ onActivate,
54
+ onSelect,
55
+ onCancel,
56
+ }: EditorMenuProviderProps) => {
57
+ const { tx } = useThemeContext();
58
+ const triggerRef = useRef<HTMLButtonElement | null>(null);
59
+
60
+ const viewRef = useDynamicRef(view);
61
+ const [open, setOpen] = useControllableState({
62
+ prop: openParam,
63
+ defaultProp: defaultOpen,
64
+ onChange: (open) => {
65
+ invariant(viewRef.current);
66
+ onOpenChange?.({ view: viewRef.current, open });
67
+ },
68
+ });
69
+
70
+ const [root, setRoot] = useState<HTMLDivElement | null>(null);
71
+ useEffect(() => {
72
+ if (!root) {
73
+ return;
74
+ }
75
+
76
+ // Listen for trigger.
77
+ return addEventListener(
78
+ root,
79
+ DX_ANCHOR_ACTIVATE as any,
80
+ (event: DxAnchorActivate) => {
81
+ const { trigger, refId } = event;
82
+
83
+ // If this has a `refId`, then it’s probably a URL or DXN and out of scope for this component.
84
+ if (!refId) {
85
+ triggerRef.current = trigger as HTMLButtonElement;
86
+ if (onActivate) {
87
+ onActivate({ view: viewRef.current!, trigger: trigger.getAttribute('data-trigger') ?? undefined });
88
+ } else {
89
+ requestAnimationFrame(() => setOpen(true));
90
+ }
91
+ }
92
+ },
93
+ {
94
+ capture: true,
95
+ passive: false,
96
+ },
97
+ );
98
+ }, [root, onActivate]);
99
+
100
+ const handleSelect = useCallback<NonNullable<MenuProps['onSelect']>>(
101
+ (item) => {
102
+ invariant(viewRef.current);
103
+ onSelect?.({ view: viewRef.current, item });
104
+ },
105
+ [viewRef, onSelect],
106
+ );
107
+
108
+ const menuGroups = groups?.filter((group) => group.items.length > 0) ?? [];
109
+
110
+ return (
111
+ <Popover.Root modal={false} open={open} onOpenChange={setOpen}>
112
+ <Popover.VirtualTrigger virtualRef={triggerRef} />
113
+
114
+ {/* Menu. */}
115
+ <Popover.Portal>
116
+ <Popover.Content
117
+ align='start'
118
+ classNames={tx('menu.content', 'menu--exotic-unfocusable', { elevation: 'positioned' }, [
119
+ 'overflow-y-auto',
120
+ !menuGroups.length && 'hidden',
121
+ ])}
122
+ style={{
123
+ maxBlockSize: 36 * numItems + 10,
124
+ }}
125
+ /**
126
+ * NOTE: We keep the focus in the editor, but Radix routes escape key.
127
+ */
128
+ onEscapeKeyDown={() => {
129
+ // NOTE: Able to cancel if not in valid state.
130
+ // event.preventDefault();
131
+ onCancel?.({ view: view! });
132
+ }}
133
+ onOpenAutoFocus={(event) => event.preventDefault()}
134
+ >
135
+ <Popover.Viewport classNames={tx('menu.viewport', 'menu__viewport--exotic-unfocusable', {})}>
136
+ <Menu groups={menuGroups} currentItem={currentItem} onSelect={handleSelect} />
137
+ </Popover.Viewport>
138
+ <Popover.Arrow />
139
+ </Popover.Content>
140
+ </Popover.Portal>
141
+
142
+ {/* Content */}
143
+ <div ref={setRoot} role='none' className='contents'>
144
+ {children}
145
+ </div>
146
+ </Popover.Root>
147
+ );
148
+ };
149
+
150
+ //
151
+ // Menu
152
+ //
153
+
154
+ type MenuProps = {
155
+ groups: EditorMenuGroup[];
156
+ } & Pick<MenuGroupProps, 'currentItem' | 'onSelect'>;
157
+
158
+ const Menu = ({ groups, currentItem, onSelect }: MenuProps) => {
159
+ const { tx } = useThemeContext();
160
+ return (
161
+ <ul>
162
+ {groups.map((group, index) => (
163
+ <Fragment key={group.id}>
164
+ <MenuGroup group={group} currentItem={currentItem} onSelect={onSelect} />
165
+ {index < groups.length - 1 && <div className={tx('menu.separator', 'menu__item', {})} />}
166
+ </Fragment>
167
+ ))}
168
+ </ul>
169
+ );
170
+ };
171
+
172
+ //
173
+ // Menu Group
174
+ //
175
+
176
+ type MenuGroupProps = {
177
+ group: EditorMenuGroup;
178
+ currentItem?: string;
179
+ } & Pick<MenuItemProps, 'onSelect'>;
180
+
181
+ const MenuGroup = ({ group, currentItem, onSelect }: MenuGroupProps) => {
182
+ const { tx } = useThemeContext();
183
+ const { t } = useTranslation();
184
+
185
+ return (
186
+ <>
187
+ {group.label && (
188
+ <div className={tx('menu.groupLabel', 'menu__group__label', {})}>
189
+ <span>{toLocalizedString(group.label, t)}</span>
190
+ </div>
191
+ )}
192
+
193
+ {group.items.map((item) => (
194
+ <MenuItem key={item.id} item={item} current={currentItem === item.id} onSelect={onSelect} />
195
+ ))}
196
+ </>
197
+ );
198
+ };
199
+
200
+ //
201
+ // Menu Item
202
+ //
203
+
204
+ type MenuItemProps = {
205
+ item: EditorMenuItem;
206
+ current: boolean;
207
+ onSelect?: (item: EditorMenuItem) => void;
208
+ };
209
+
210
+ const MenuItem = ({ item, current, onSelect }: MenuItemProps) => {
211
+ const { tx } = useThemeContext();
212
+ const { t } = useTranslation();
213
+
214
+ const listRef = useRef<HTMLLIElement>(null);
215
+ useEffect(() => {
216
+ if (current && listRef.current) {
217
+ listRef.current.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
218
+ }
219
+ }, [current]);
220
+
221
+ const handleSelect = useCallback(() => onSelect?.(item), [item, onSelect]);
222
+
223
+ return (
224
+ <li
225
+ ref={listRef}
226
+ className={tx('menu.item', 'menu__item--exotic-unfocusable', {}, [current && 'bg-hoverSurface'])}
227
+ onClick={handleSelect}
228
+ >
229
+ {item.icon && <Icon icon={item.icon} size={5} />}
230
+ <span className='grow truncate'>{toLocalizedString(item.label, t)}</span>
231
+ </li>
232
+ );
233
+ };
@@ -0,0 +1,11 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ export * from './menu';
6
+ export * from './menu-presets';
7
+ export * from './popover';
8
+ export * from './util';
9
+
10
+ export * from './EditorMenuProvider';
11
+ export * from './useEditorMenu';
@@ -0,0 +1,123 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type EditorMenuGroup } from './menu';
6
+ import { popoverRangeEffect } from './popover';
7
+ import { insertAtLineStart } from './util';
8
+
9
+ export const formattingCommands: EditorMenuGroup = {
10
+ id: 'markdown',
11
+ label: 'Markdown',
12
+ items: [
13
+ {
14
+ id: 'heading-1',
15
+ label: 'Heading 1',
16
+ icon: 'ph--text-h-one--regular',
17
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '# '),
18
+ },
19
+ {
20
+ id: 'heading-2',
21
+ label: 'Heading 2',
22
+ icon: 'ph--text-h-two--regular',
23
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '## '),
24
+ },
25
+ {
26
+ id: 'heading-3',
27
+ label: 'Heading 3',
28
+ icon: 'ph--text-h-three--regular',
29
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '### '),
30
+ },
31
+ {
32
+ id: 'heading-4',
33
+ label: 'Heading 4',
34
+ icon: 'ph--text-h-four--regular',
35
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '#### '),
36
+ },
37
+ {
38
+ id: 'heading-5',
39
+ label: 'Heading 5',
40
+ icon: 'ph--text-h-five--regular',
41
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '##### '),
42
+ },
43
+ {
44
+ id: 'heading-6',
45
+ label: 'Heading 6',
46
+ icon: 'ph--text-h-six--regular',
47
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '###### '),
48
+ },
49
+ {
50
+ id: 'bullet-list',
51
+ label: 'Bullet List',
52
+ icon: 'ph--list-bullets--regular',
53
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '- '),
54
+ },
55
+ {
56
+ id: 'numbered-list',
57
+ label: 'Numbered List',
58
+ icon: 'ph--list-numbers--regular',
59
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '1. '),
60
+ },
61
+ {
62
+ id: 'task-list',
63
+ label: 'Task List',
64
+ icon: 'ph--list-checks--regular',
65
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '- [ ] '),
66
+ },
67
+ {
68
+ id: 'quote',
69
+ label: 'Quote',
70
+ icon: 'ph--quotes--regular',
71
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '> '),
72
+ },
73
+ {
74
+ id: 'code-block',
75
+ label: 'Code Block',
76
+ icon: 'ph--code-block--regular',
77
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '```\n\n```'),
78
+ },
79
+ {
80
+ id: 'table',
81
+ label: 'Table',
82
+ icon: 'ph--table--regular',
83
+ onSelect: ({ view, head }) => insertAtLineStart(view, head, '| | | |\n|---|---|---|\n| | | |'),
84
+ },
85
+ ],
86
+ };
87
+
88
+ export const linkSlashCommands: EditorMenuGroup = {
89
+ id: 'link',
90
+ label: 'Link',
91
+ items: [
92
+ {
93
+ id: 'inline-link',
94
+ label: 'Inline link',
95
+ icon: 'ph--link--regular',
96
+ onSelect: ({ view, head }) => {
97
+ view.dispatch({
98
+ changes: { from: head, insert: '@' },
99
+ selection: { anchor: head + 1, head: head + 1 },
100
+ effects: popoverRangeEffect.of({
101
+ trigger: '@',
102
+ range: { from: head, to: head + 1 },
103
+ }),
104
+ });
105
+ },
106
+ },
107
+ {
108
+ id: 'block-embed',
109
+ label: 'Block embed',
110
+ icon: 'ph--lego--regular',
111
+ onSelect: ({ view, head }) => {
112
+ view.dispatch({
113
+ changes: { from: head, insert: '@@' },
114
+ selection: { anchor: head + 2, head: head + 2 },
115
+ effects: popoverRangeEffect.of({
116
+ trigger: '@',
117
+ range: { from: head, to: head + 2 },
118
+ }),
119
+ });
120
+ },
121
+ },
122
+ ],
123
+ };
@@ -0,0 +1,71 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type EditorView } from '@codemirror/view';
6
+
7
+ import { type Label } from '@dxos/react-ui';
8
+ import { type MaybePromise } from '@dxos/util';
9
+
10
+ import { insertAtCursor } from './util';
11
+
12
+ export type EditorMenuGroup = {
13
+ id: string;
14
+ label?: Label;
15
+ items: EditorMenuItem[];
16
+ };
17
+
18
+ export type EditorMenuItem = {
19
+ id: string;
20
+ label: Label;
21
+ icon?: string;
22
+ onSelect?: (event: { view: EditorView; head: number }) => MaybePromise<void>;
23
+ };
24
+
25
+ export const getMenuItem = (groups: EditorMenuGroup[], id?: string): EditorMenuItem | undefined => {
26
+ return groups.flatMap((group) => group.items).find((item) => item.id === id);
27
+ };
28
+
29
+ export const getNextMenuItem = (groups: EditorMenuGroup[], id?: string): EditorMenuItem => {
30
+ const items = groups.flatMap((group) => group.items);
31
+ const index = items.findIndex((item) => item.id === id);
32
+ return index < items.length - 1 ? items[index + 1] : items[index];
33
+ };
34
+
35
+ export const getPreviousMenuItem = (groups: EditorMenuGroup[], id?: string): EditorMenuItem => {
36
+ const items = groups.flatMap((group) => group.items);
37
+ const index = items.findIndex((item) => item.id === id);
38
+ return index > 0 ? items[index - 1] : items[index];
39
+ };
40
+
41
+ export const createMenuGroup = ({
42
+ id = 'menu',
43
+ label,
44
+ filter,
45
+ items,
46
+ }: {
47
+ id?: string;
48
+ label?: Label;
49
+ filter?: string;
50
+ items: string[];
51
+ }): EditorMenuGroup => ({
52
+ id,
53
+ label,
54
+ items: items
55
+ .filter((item) => !filter || item.toLowerCase().includes(filter.toLowerCase()))
56
+ .map((item, i) => ({
57
+ id: `${id}-${i}`,
58
+ label: item,
59
+ onSelect: ({ view, head }) => insertAtCursor(view, head, item),
60
+ })),
61
+ });
62
+
63
+ export const filterMenuGroups = (
64
+ groups: EditorMenuGroup[],
65
+ filter: (item: EditorMenuItem) => boolean,
66
+ ): EditorMenuGroup[] => {
67
+ return groups.map((group) => ({
68
+ ...group,
69
+ items: group.items.filter(filter),
70
+ }));
71
+ };