@dxos/react-ui-editor 0.8.4-main.72ec0f3 → 0.8.4-main.765dc60934

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 (435) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/index.mjs +1080 -8837
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/translations.mjs +39 -0
  7. package/dist/lib/browser/translations.mjs.map +7 -0
  8. package/dist/lib/node-esm/index.mjs +1080 -8836
  9. package/dist/lib/node-esm/index.mjs.map +4 -4
  10. package/dist/lib/node-esm/meta.json +1 -1
  11. package/dist/lib/node-esm/translations.mjs +41 -0
  12. package/dist/lib/node-esm/translations.mjs.map +7 -0
  13. package/dist/types/src/components/Editor/Editor.d.ts +41 -24
  14. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  15. package/dist/types/src/components/Editor/Editor.stories.d.ts +7 -4
  16. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -1
  17. package/dist/types/src/components/{EditorContent/EditorContent.d.ts → Editor/EditorView.d.ts} +9 -7
  18. package/dist/types/src/components/Editor/EditorView.d.ts.map +1 -0
  19. package/dist/types/src/components/Editor/controller.d.ts.map +1 -0
  20. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +2 -4
  21. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -1
  22. package/dist/types/src/components/EditorMenuProvider/index.d.ts +0 -1
  23. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -1
  24. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -1
  25. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -1
  26. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +2 -2
  27. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -1
  28. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -1
  29. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +1 -1
  30. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -1
  31. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +8 -6
  32. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  33. package/dist/types/src/components/EditorToolbar/blocks.d.ts +4 -17
  34. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  35. package/dist/types/src/components/EditorToolbar/formatting.d.ts +4 -17
  36. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  37. package/dist/types/src/components/EditorToolbar/headings.d.ts +4 -17
  38. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  39. package/dist/types/src/components/EditorToolbar/image.d.ts +3 -15
  40. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  41. package/dist/types/src/components/EditorToolbar/index.d.ts +1 -2
  42. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  43. package/dist/types/src/components/EditorToolbar/lists.d.ts +6 -0
  44. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -0
  45. package/dist/types/src/components/EditorToolbar/search.d.ts +3 -15
  46. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  47. package/dist/types/src/components/EditorToolbar/types.d.ts +6 -0
  48. package/dist/types/src/components/EditorToolbar/types.d.ts.map +1 -0
  49. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +5 -18
  50. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  51. package/dist/types/src/components/index.d.ts +0 -2
  52. package/dist/types/src/components/index.d.ts.map +1 -1
  53. package/dist/types/src/extensions/Assistant.stories.d.ts +10 -0
  54. package/dist/types/src/extensions/Assistant.stories.d.ts.map +1 -0
  55. package/dist/types/src/extensions/assistant-extension.d.ts +24 -0
  56. package/dist/types/src/extensions/assistant-extension.d.ts.map +1 -0
  57. package/dist/types/src/extensions/index.d.ts +1 -31
  58. package/dist/types/src/extensions/index.d.ts.map +1 -1
  59. package/dist/types/src/hooks/index.d.ts +1 -0
  60. package/dist/types/src/hooks/index.d.ts.map +1 -1
  61. package/dist/types/src/hooks/useBasicMarkdownExtensions.d.ts +25 -0
  62. package/dist/types/src/hooks/useBasicMarkdownExtensions.d.ts.map +1 -0
  63. package/dist/types/src/hooks/useTextEditor.d.ts +1 -1
  64. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  65. package/dist/types/src/index.d.ts +0 -9
  66. package/dist/types/src/index.d.ts.map +1 -1
  67. package/dist/types/src/stories/Automerge.stories.d.ts +44 -0
  68. package/dist/types/src/stories/Automerge.stories.d.ts.map +1 -0
  69. package/dist/types/src/stories/Comments.stories.d.ts +3 -2
  70. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  71. package/dist/types/src/stories/EditorToolbar.stories.d.ts +29 -27
  72. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  73. package/dist/types/src/stories/Experimental.stories.d.ts +4 -3
  74. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  75. package/dist/types/src/stories/Markdown.stories.d.ts +3 -2
  76. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  77. package/dist/types/src/stories/Outliner.stories.d.ts +2 -2
  78. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  79. package/dist/types/src/stories/Popover.stories.d.ts +2 -2
  80. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -1
  81. package/dist/types/src/stories/Preview.stories.d.ts +3 -2
  82. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  83. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -1
  84. package/dist/types/src/stories/TextEditor.stories.d.ts +3 -2
  85. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  86. package/dist/types/src/stories/Theme.stories.d.ts +8 -0
  87. package/dist/types/src/stories/Theme.stories.d.ts.map +1 -0
  88. package/dist/types/src/stories/components/EditorStory.d.ts +9 -20
  89. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  90. package/dist/types/src/stories/components/util.d.ts +4 -3
  91. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  92. package/dist/types/src/translations.d.ts +26 -26
  93. package/dist/types/src/translations.d.ts.map +1 -1
  94. package/dist/types/src/util/index.d.ts +0 -5
  95. package/dist/types/src/util/index.d.ts.map +1 -1
  96. package/dist/types/src/util/react.d.ts +6 -5
  97. package/dist/types/src/util/react.d.ts.map +1 -1
  98. package/dist/types/tsconfig.tsbuildinfo +1 -1
  99. package/package.json +79 -71
  100. package/src/components/Editor/Editor.stories.tsx +26 -26
  101. package/src/components/Editor/Editor.tsx +67 -55
  102. package/src/components/Editor/EditorView.tsx +102 -0
  103. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +23 -30
  104. package/src/components/EditorMenuProvider/index.ts +0 -1
  105. package/src/components/EditorMenuProvider/menu-presets.ts +3 -1
  106. package/src/components/EditorMenuProvider/menu.ts +1 -2
  107. package/src/components/EditorMenuProvider/popover.ts +3 -3
  108. package/src/components/EditorMenuProvider/useEditorMenu.ts +9 -4
  109. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +6 -9
  110. package/src/components/EditorToolbar/EditorToolbar.tsx +37 -68
  111. package/src/components/EditorToolbar/blocks.ts +55 -48
  112. package/src/components/EditorToolbar/formatting.ts +44 -46
  113. package/src/components/EditorToolbar/headings.ts +45 -51
  114. package/src/components/EditorToolbar/image.ts +16 -14
  115. package/src/components/EditorToolbar/index.ts +2 -3
  116. package/src/components/EditorToolbar/lists.ts +58 -0
  117. package/src/components/EditorToolbar/search.ts +16 -14
  118. package/src/components/EditorToolbar/types.ts +8 -0
  119. package/src/components/EditorToolbar/view-mode.ts +37 -43
  120. package/src/components/index.ts +0 -5
  121. package/src/extensions/Assistant.stories.tsx +112 -0
  122. package/src/extensions/assistant-extension.tsx +223 -0
  123. package/src/extensions/index.ts +2 -32
  124. package/src/hooks/index.ts +1 -0
  125. package/src/hooks/useBasicMarkdownExtensions.ts +55 -0
  126. package/src/hooks/useTextEditor.ts +9 -3
  127. package/src/index.ts +0 -13
  128. package/src/stories/Automerge.stories.tsx +177 -0
  129. package/src/stories/Comments.stories.tsx +48 -43
  130. package/src/stories/EditorToolbar.stories.tsx +40 -53
  131. package/src/stories/Experimental.stories.tsx +14 -16
  132. package/src/stories/Markdown.stories.tsx +16 -16
  133. package/src/stories/Outliner.stories.tsx +8 -10
  134. package/src/stories/Popover.stories.tsx +27 -32
  135. package/src/stories/Preview.stories.tsx +67 -53
  136. package/src/stories/Tags.stories.tsx +24 -15
  137. package/src/stories/TextEditor.stories.tsx +13 -19
  138. package/src/stories/Theme.stories.tsx +61 -0
  139. package/src/stories/components/EditorStory.tsx +33 -30
  140. package/src/stories/components/util.tsx +51 -52
  141. package/src/translations.ts +30 -25
  142. package/src/util/index.ts +1 -6
  143. package/src/util/react.tsx +8 -13
  144. package/dist/lib/browser/chunk-HL3YF6WC.mjs +0 -22
  145. package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +0 -7
  146. package/dist/lib/browser/types/index.mjs +0 -13
  147. package/dist/lib/browser/types/index.mjs.map +0 -7
  148. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs +0 -24
  149. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +0 -7
  150. package/dist/lib/node-esm/types/index.mjs +0 -14
  151. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  152. package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +0 -1
  153. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts +0 -26
  154. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts.map +0 -1
  155. package/dist/types/src/components/EditorContent/controller.d.ts.map +0 -1
  156. package/dist/types/src/components/EditorContent/index.d.ts +0 -3
  157. package/dist/types/src/components/EditorContent/index.d.ts.map +0 -1
  158. package/dist/types/src/components/EditorMenuProvider/util.d.ts +0 -8
  159. package/dist/types/src/components/EditorMenuProvider/util.d.ts.map +0 -1
  160. package/dist/types/src/components/EditorToolbar/actions.d.ts +0 -39
  161. package/dist/types/src/components/EditorToolbar/actions.d.ts.map +0 -1
  162. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +0 -11
  163. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +0 -1
  164. package/dist/types/src/defaults.d.ts +0 -14
  165. package/dist/types/src/defaults.d.ts.map +0 -1
  166. package/dist/types/src/extensions/annotations.d.ts +0 -9
  167. package/dist/types/src/extensions/annotations.d.ts.map +0 -1
  168. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +0 -17
  169. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +0 -1
  170. package/dist/types/src/extensions/autocomplete/index.d.ts +0 -5
  171. package/dist/types/src/extensions/autocomplete/index.d.ts.map +0 -1
  172. package/dist/types/src/extensions/autocomplete/match.d.ts +0 -13
  173. package/dist/types/src/extensions/autocomplete/match.d.ts.map +0 -1
  174. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +0 -20
  175. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +0 -1
  176. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +0 -10
  177. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +0 -1
  178. package/dist/types/src/extensions/automerge/automerge.d.ts +0 -4
  179. package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
  180. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +0 -47
  181. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +0 -1
  182. package/dist/types/src/extensions/automerge/automerge.test.d.ts +0 -2
  183. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
  184. package/dist/types/src/extensions/automerge/cursor.d.ts +0 -4
  185. package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
  186. package/dist/types/src/extensions/automerge/defs.d.ts +0 -17
  187. package/dist/types/src/extensions/automerge/defs.d.ts.map +0 -1
  188. package/dist/types/src/extensions/automerge/index.d.ts +0 -2
  189. package/dist/types/src/extensions/automerge/index.d.ts.map +0 -1
  190. package/dist/types/src/extensions/automerge/sync.d.ts +0 -17
  191. package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
  192. package/dist/types/src/extensions/automerge/update-automerge.d.ts +0 -6
  193. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
  194. package/dist/types/src/extensions/automerge/update-codemirror.d.ts +0 -5
  195. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
  196. package/dist/types/src/extensions/autoscroll.d.ts +0 -20
  197. package/dist/types/src/extensions/autoscroll.d.ts.map +0 -1
  198. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +0 -31
  199. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
  200. package/dist/types/src/extensions/awareness/awareness.d.ts +0 -46
  201. package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
  202. package/dist/types/src/extensions/awareness/index.d.ts +0 -3
  203. package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
  204. package/dist/types/src/extensions/blast.d.ts +0 -25
  205. package/dist/types/src/extensions/blast.d.ts.map +0 -1
  206. package/dist/types/src/extensions/blocks.d.ts +0 -2
  207. package/dist/types/src/extensions/blocks.d.ts.map +0 -1
  208. package/dist/types/src/extensions/bookmarks.d.ts +0 -12
  209. package/dist/types/src/extensions/bookmarks.d.ts.map +0 -1
  210. package/dist/types/src/extensions/comments.d.ts +0 -95
  211. package/dist/types/src/extensions/comments.d.ts.map +0 -1
  212. package/dist/types/src/extensions/debug.d.ts +0 -3
  213. package/dist/types/src/extensions/debug.d.ts.map +0 -1
  214. package/dist/types/src/extensions/dnd.d.ts +0 -9
  215. package/dist/types/src/extensions/dnd.d.ts.map +0 -1
  216. package/dist/types/src/extensions/factories.d.ts +0 -83
  217. package/dist/types/src/extensions/factories.d.ts.map +0 -1
  218. package/dist/types/src/extensions/focus.d.ts +0 -7
  219. package/dist/types/src/extensions/focus.d.ts.map +0 -1
  220. package/dist/types/src/extensions/folding.d.ts +0 -7
  221. package/dist/types/src/extensions/folding.d.ts.map +0 -1
  222. package/dist/types/src/extensions/hashtag.d.ts +0 -3
  223. package/dist/types/src/extensions/hashtag.d.ts.map +0 -1
  224. package/dist/types/src/extensions/json.d.ts +0 -7
  225. package/dist/types/src/extensions/json.d.ts.map +0 -1
  226. package/dist/types/src/extensions/listener.d.ts +0 -13
  227. package/dist/types/src/extensions/listener.d.ts.map +0 -1
  228. package/dist/types/src/extensions/markdown/action.d.ts +0 -12
  229. package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
  230. package/dist/types/src/extensions/markdown/bundle.d.ts +0 -22
  231. package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
  232. package/dist/types/src/extensions/markdown/changes.d.ts +0 -10
  233. package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
  234. package/dist/types/src/extensions/markdown/changes.test.d.ts +0 -2
  235. package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
  236. package/dist/types/src/extensions/markdown/debug.d.ts +0 -11
  237. package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
  238. package/dist/types/src/extensions/markdown/decorate.d.ts +0 -25
  239. package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
  240. package/dist/types/src/extensions/markdown/formatting.d.ts +0 -61
  241. package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
  242. package/dist/types/src/extensions/markdown/formatting.test.d.ts +0 -3
  243. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
  244. package/dist/types/src/extensions/markdown/highlight.d.ts +0 -37
  245. package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
  246. package/dist/types/src/extensions/markdown/image.d.ts +0 -7
  247. package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
  248. package/dist/types/src/extensions/markdown/index.d.ts +0 -10
  249. package/dist/types/src/extensions/markdown/index.d.ts.map +0 -1
  250. package/dist/types/src/extensions/markdown/link.d.ts +0 -7
  251. package/dist/types/src/extensions/markdown/link.d.ts.map +0 -1
  252. package/dist/types/src/extensions/markdown/parser.test.d.ts +0 -2
  253. package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
  254. package/dist/types/src/extensions/markdown/styles.d.ts +0 -4
  255. package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
  256. package/dist/types/src/extensions/markdown/table.d.ts +0 -8
  257. package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
  258. package/dist/types/src/extensions/mention.d.ts +0 -7
  259. package/dist/types/src/extensions/mention.d.ts.map +0 -1
  260. package/dist/types/src/extensions/modal.d.ts +0 -7
  261. package/dist/types/src/extensions/modal.d.ts.map +0 -1
  262. package/dist/types/src/extensions/modes.d.ts +0 -10
  263. package/dist/types/src/extensions/modes.d.ts.map +0 -1
  264. package/dist/types/src/extensions/outliner/commands.d.ts +0 -10
  265. package/dist/types/src/extensions/outliner/commands.d.ts.map +0 -1
  266. package/dist/types/src/extensions/outliner/editor.d.ts +0 -5
  267. package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
  268. package/dist/types/src/extensions/outliner/editor.test.d.ts +0 -2
  269. package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
  270. package/dist/types/src/extensions/outliner/index.d.ts +0 -4
  271. package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
  272. package/dist/types/src/extensions/outliner/menu.d.ts +0 -8
  273. package/dist/types/src/extensions/outliner/menu.d.ts.map +0 -1
  274. package/dist/types/src/extensions/outliner/outliner.d.ts +0 -11
  275. package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
  276. package/dist/types/src/extensions/outliner/outliner.test.d.ts +0 -2
  277. package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +0 -1
  278. package/dist/types/src/extensions/outliner/selection.d.ts +0 -12
  279. package/dist/types/src/extensions/outliner/selection.d.ts.map +0 -1
  280. package/dist/types/src/extensions/outliner/tree.d.ts +0 -79
  281. package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
  282. package/dist/types/src/extensions/outliner/tree.test.d.ts +0 -2
  283. package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
  284. package/dist/types/src/extensions/preview/index.d.ts +0 -2
  285. package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
  286. package/dist/types/src/extensions/preview/preview.d.ts +0 -32
  287. package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
  288. package/dist/types/src/extensions/replacer.d.ts +0 -21
  289. package/dist/types/src/extensions/replacer.d.ts.map +0 -1
  290. package/dist/types/src/extensions/replacer.test.d.ts +0 -2
  291. package/dist/types/src/extensions/replacer.test.d.ts.map +0 -1
  292. package/dist/types/src/extensions/scrolling.d.ts +0 -78
  293. package/dist/types/src/extensions/scrolling.d.ts.map +0 -1
  294. package/dist/types/src/extensions/selection.d.ts +0 -24
  295. package/dist/types/src/extensions/selection.d.ts.map +0 -1
  296. package/dist/types/src/extensions/state.d.ts +0 -2
  297. package/dist/types/src/extensions/state.d.ts.map +0 -1
  298. package/dist/types/src/extensions/submit.d.ts +0 -10
  299. package/dist/types/src/extensions/submit.d.ts.map +0 -1
  300. package/dist/types/src/extensions/tab.d.ts +0 -4
  301. package/dist/types/src/extensions/tab.d.ts.map +0 -1
  302. package/dist/types/src/extensions/tags/extended-markdown.d.ts +0 -10
  303. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +0 -1
  304. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +0 -2
  305. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +0 -1
  306. package/dist/types/src/extensions/tags/index.d.ts +0 -4
  307. package/dist/types/src/extensions/tags/index.d.ts.map +0 -1
  308. package/dist/types/src/extensions/tags/streamer.d.ts +0 -12
  309. package/dist/types/src/extensions/tags/streamer.d.ts.map +0 -1
  310. package/dist/types/src/extensions/tags/xml-tags.d.ts +0 -97
  311. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +0 -1
  312. package/dist/types/src/extensions/tags/xml-util.d.ts +0 -10
  313. package/dist/types/src/extensions/tags/xml-util.d.ts.map +0 -1
  314. package/dist/types/src/extensions/typewriter.d.ts +0 -10
  315. package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
  316. package/dist/types/src/stories/CommandDialog.stories.d.ts +0 -14
  317. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +0 -1
  318. package/dist/types/src/styles/index.d.ts +0 -4
  319. package/dist/types/src/styles/index.d.ts.map +0 -1
  320. package/dist/types/src/styles/markdown.d.ts +0 -8
  321. package/dist/types/src/styles/markdown.d.ts.map +0 -1
  322. package/dist/types/src/styles/theme.d.ts +0 -38
  323. package/dist/types/src/styles/theme.d.ts.map +0 -1
  324. package/dist/types/src/styles/tokens.d.ts +0 -3
  325. package/dist/types/src/styles/tokens.d.ts.map +0 -1
  326. package/dist/types/src/types/index.d.ts +0 -2
  327. package/dist/types/src/types/index.d.ts.map +0 -1
  328. package/dist/types/src/types/types.d.ts +0 -21
  329. package/dist/types/src/types/types.d.ts.map +0 -1
  330. package/dist/types/src/util/cursor.d.ts +0 -31
  331. package/dist/types/src/util/cursor.d.ts.map +0 -1
  332. package/dist/types/src/util/debug.d.ts +0 -21
  333. package/dist/types/src/util/debug.d.ts.map +0 -1
  334. package/dist/types/src/util/decorations.d.ts +0 -4
  335. package/dist/types/src/util/decorations.d.ts.map +0 -1
  336. package/dist/types/src/util/dom.d.ts +0 -10
  337. package/dist/types/src/util/dom.d.ts.map +0 -1
  338. package/dist/types/src/util/facet.d.ts +0 -3
  339. package/dist/types/src/util/facet.d.ts.map +0 -1
  340. package/src/components/EditorContent/EditorContent.stories.tsx +0 -70
  341. package/src/components/EditorContent/EditorContent.tsx +0 -70
  342. package/src/components/EditorContent/index.ts +0 -6
  343. package/src/components/EditorMenuProvider/util.ts +0 -31
  344. package/src/components/EditorToolbar/actions.ts +0 -86
  345. package/src/components/EditorToolbar/useEditorToolbar.ts +0 -20
  346. package/src/defaults.ts +0 -52
  347. package/src/extensions/annotations.ts +0 -55
  348. package/src/extensions/autocomplete/autocomplete.ts +0 -151
  349. package/src/extensions/autocomplete/index.ts +0 -8
  350. package/src/extensions/autocomplete/match.ts +0 -46
  351. package/src/extensions/autocomplete/placeholder.ts +0 -117
  352. package/src/extensions/autocomplete/typeahead.ts +0 -87
  353. package/src/extensions/automerge/automerge.stories.tsx +0 -149
  354. package/src/extensions/automerge/automerge.test.tsx +0 -78
  355. package/src/extensions/automerge/automerge.ts +0 -105
  356. package/src/extensions/automerge/cursor.ts +0 -28
  357. package/src/extensions/automerge/defs.ts +0 -31
  358. package/src/extensions/automerge/index.ts +0 -5
  359. package/src/extensions/automerge/sync.ts +0 -79
  360. package/src/extensions/automerge/update-automerge.ts +0 -50
  361. package/src/extensions/automerge/update-codemirror.ts +0 -115
  362. package/src/extensions/autoscroll.ts +0 -163
  363. package/src/extensions/awareness/awareness-provider.ts +0 -127
  364. package/src/extensions/awareness/awareness.ts +0 -315
  365. package/src/extensions/awareness/index.ts +0 -6
  366. package/src/extensions/blast.ts +0 -363
  367. package/src/extensions/blocks.ts +0 -131
  368. package/src/extensions/bookmarks.ts +0 -75
  369. package/src/extensions/comments.ts +0 -598
  370. package/src/extensions/debug.ts +0 -15
  371. package/src/extensions/dnd.ts +0 -37
  372. package/src/extensions/factories.ts +0 -278
  373. package/src/extensions/focus.ts +0 -36
  374. package/src/extensions/folding.tsx +0 -43
  375. package/src/extensions/hashtag.tsx +0 -68
  376. package/src/extensions/json.ts +0 -57
  377. package/src/extensions/listener.ts +0 -32
  378. package/src/extensions/markdown/action.ts +0 -117
  379. package/src/extensions/markdown/bundle.ts +0 -105
  380. package/src/extensions/markdown/changes.test.ts +0 -26
  381. package/src/extensions/markdown/changes.ts +0 -149
  382. package/src/extensions/markdown/debug.ts +0 -44
  383. package/src/extensions/markdown/decorate.ts +0 -601
  384. package/src/extensions/markdown/formatting.test.ts +0 -498
  385. package/src/extensions/markdown/formatting.ts +0 -1265
  386. package/src/extensions/markdown/highlight.ts +0 -183
  387. package/src/extensions/markdown/image.ts +0 -118
  388. package/src/extensions/markdown/index.ts +0 -13
  389. package/src/extensions/markdown/link.ts +0 -50
  390. package/src/extensions/markdown/parser.test.ts +0 -75
  391. package/src/extensions/markdown/styles.ts +0 -135
  392. package/src/extensions/markdown/table.ts +0 -150
  393. package/src/extensions/mention.ts +0 -41
  394. package/src/extensions/modal.ts +0 -24
  395. package/src/extensions/modes.ts +0 -41
  396. package/src/extensions/outliner/commands.ts +0 -270
  397. package/src/extensions/outliner/editor.test.ts +0 -33
  398. package/src/extensions/outliner/editor.ts +0 -184
  399. package/src/extensions/outliner/index.ts +0 -7
  400. package/src/extensions/outliner/menu.ts +0 -128
  401. package/src/extensions/outliner/outliner.test.ts +0 -100
  402. package/src/extensions/outliner/outliner.ts +0 -167
  403. package/src/extensions/outliner/selection.ts +0 -50
  404. package/src/extensions/outliner/tree.test.ts +0 -168
  405. package/src/extensions/outliner/tree.ts +0 -317
  406. package/src/extensions/preview/index.ts +0 -5
  407. package/src/extensions/preview/preview.ts +0 -193
  408. package/src/extensions/replacer.test.ts +0 -75
  409. package/src/extensions/replacer.ts +0 -93
  410. package/src/extensions/scrolling.ts +0 -189
  411. package/src/extensions/selection.ts +0 -100
  412. package/src/extensions/state.ts +0 -7
  413. package/src/extensions/submit.ts +0 -62
  414. package/src/extensions/tab.ts +0 -29
  415. package/src/extensions/tags/extended-markdown.test.ts +0 -262
  416. package/src/extensions/tags/extended-markdown.ts +0 -78
  417. package/src/extensions/tags/index.ts +0 -7
  418. package/src/extensions/tags/streamer.ts +0 -243
  419. package/src/extensions/tags/xml-tags.ts +0 -500
  420. package/src/extensions/tags/xml-util.ts +0 -94
  421. package/src/extensions/typewriter.ts +0 -68
  422. package/src/stories/CommandDialog.stories.tsx +0 -83
  423. package/src/styles/index.ts +0 -7
  424. package/src/styles/markdown.ts +0 -26
  425. package/src/styles/theme.ts +0 -269
  426. package/src/styles/tokens.ts +0 -17
  427. package/src/types/index.ts +0 -5
  428. package/src/types/types.ts +0 -32
  429. package/src/util/cursor.ts +0 -56
  430. package/src/util/debug.ts +0 -69
  431. package/src/util/decorations.ts +0 -21
  432. package/src/util/dom.ts +0 -34
  433. package/src/util/facet.ts +0 -13
  434. /package/dist/types/src/components/{EditorContent → Editor}/controller.d.ts +0 -0
  435. /package/src/components/{EditorContent → Editor}/controller.ts +0 -0
@@ -13,6 +13,7 @@ import {
13
13
  type DxAnchorActivate,
14
14
  Icon,
15
15
  Popover,
16
+ ScrollArea,
16
17
  toLocalizedString,
17
18
  useDynamicRef,
18
19
  useThemeContext,
@@ -35,9 +36,7 @@ export type EditorMenuProviderProps = PropsWithChildren<{
35
36
  }>;
36
37
 
37
38
  /**
38
- * Implements the Popover and listens for the `dx-anchor-activate` event from the
39
- * `popover` extension's decoration.
40
- *
39
+ * Implements the Popover and listens for the `dx-anchor-activate` event from the `popover` extension's decoration.
41
40
  * NOTE: We don't use DropdownMenu because the command menu needs to manage focus explicitly.
42
41
  * I.e., focus must remain in the editor while displaying the menu (for type-ahead).
43
42
  */
@@ -46,7 +45,7 @@ export const EditorMenuProvider = ({
46
45
  view,
47
46
  groups,
48
47
  currentItem,
49
- open: openParam,
48
+ open: openProp,
50
49
  defaultOpen,
51
50
  numItems = 8,
52
51
  onOpenChange,
@@ -59,7 +58,7 @@ export const EditorMenuProvider = ({
59
58
 
60
59
  const viewRef = useDynamicRef(view);
61
60
  const [open, setOpen] = useControllableState({
62
- prop: openParam,
61
+ prop: openProp,
63
62
  defaultProp: defaultOpen,
64
63
  onChange: (open) => {
65
64
  invariant(viewRef.current);
@@ -78,10 +77,8 @@ export const EditorMenuProvider = ({
78
77
  root,
79
78
  DX_ANCHOR_ACTIVATE as any,
80
79
  (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) {
80
+ const { trigger, dxn } = event;
81
+ if (!dxn) {
85
82
  triggerRef.current = trigger as HTMLButtonElement;
86
83
  if (onActivate) {
87
84
  onActivate({ view: viewRef.current!, trigger: trigger.getAttribute('data-trigger') ?? undefined });
@@ -115,32 +112,32 @@ export const EditorMenuProvider = ({
115
112
  <Popover.Portal>
116
113
  <Popover.Content
117
114
  align='start'
118
- classNames={tx('menu.content', 'menu--exotic-unfocusable', { elevation: 'positioned' }, [
119
- 'overflow-y-auto',
120
- !menuGroups.length && 'hidden',
121
- ])}
115
+ classNames={['flex flex-col', !menuGroups.length && 'hidden']}
122
116
  style={{
123
117
  maxBlockSize: 36 * numItems + 10,
124
118
  }}
125
- /**
126
- * NOTE: We keep the focus in the editor, but Radix routes escape key.
127
- */
119
+ // NOTE: We keep the focus in the editor, but Radix routes escape key.
128
120
  onEscapeKeyDown={() => {
129
- // NOTE: Able to cancel if not in valid state.
130
- // event.preventDefault();
131
- onCancel?.({ view: view! });
121
+ const currentView = viewRef.current;
122
+ if (currentView) {
123
+ onCancel?.({ view: currentView });
124
+ }
132
125
  }}
133
126
  onOpenAutoFocus={(event) => event.preventDefault()}
134
127
  >
135
- <Popover.Viewport classNames={tx('menu.viewport', 'menu__viewport--exotic-unfocusable', {})}>
136
- <Menu groups={menuGroups} currentItem={currentItem} onSelect={handleSelect} />
128
+ <Popover.Viewport asChild classNames='dx-container'>
129
+ <ScrollArea.Root thin>
130
+ <ScrollArea.Viewport>
131
+ <Menu groups={menuGroups} currentItem={currentItem} onSelect={handleSelect} />
132
+ </ScrollArea.Viewport>
133
+ </ScrollArea.Root>
137
134
  </Popover.Viewport>
138
135
  <Popover.Arrow />
139
136
  </Popover.Content>
140
137
  </Popover.Portal>
141
138
 
142
139
  {/* Content */}
143
- <div ref={setRoot} role='none' className='contents'>
140
+ <div className='contents' ref={setRoot}>
144
141
  {children}
145
142
  </div>
146
143
  </Popover.Root>
@@ -162,7 +159,7 @@ const Menu = ({ groups, currentItem, onSelect }: MenuProps) => {
162
159
  {groups.map((group, index) => (
163
160
  <Fragment key={group.id}>
164
161
  <MenuGroup group={group} currentItem={currentItem} onSelect={onSelect} />
165
- {index < groups.length - 1 && <div className={tx('menu.separator', 'menu__item', {})} />}
162
+ {index < groups.length - 1 && <div className={tx('menu.separator', {})} />}
166
163
  </Fragment>
167
164
  ))}
168
165
  </ul>
@@ -185,7 +182,7 @@ const MenuGroup = ({ group, currentItem, onSelect }: MenuGroupProps) => {
185
182
  return (
186
183
  <>
187
184
  {group.label && (
188
- <div className={tx('menu.groupLabel', 'menu__group__label', {})}>
185
+ <div className={tx('menu.groupLabel', {})}>
189
186
  <span>{toLocalizedString(group.label, t)}</span>
190
187
  </div>
191
188
  )}
@@ -221,12 +218,8 @@ const MenuItem = ({ item, current, onSelect }: MenuItemProps) => {
221
218
  const handleSelect = useCallback(() => onSelect?.(item), [item, onSelect]);
222
219
 
223
220
  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} />}
221
+ <li ref={listRef} className={tx('menu.item', {}, [current && 'bg-hover-surface'])} onClick={handleSelect}>
222
+ {item.icon && <Icon icon={item.icon} />}
230
223
  <span className='grow truncate'>{toLocalizedString(item.label, t)}</span>
231
224
  </li>
232
225
  );
@@ -5,7 +5,6 @@
5
5
  export * from './menu';
6
6
  export * from './menu-presets';
7
7
  export * from './popover';
8
- export * from './util';
9
8
 
10
9
  export * from './EditorMenuProvider';
11
10
  export * from './useEditorMenu';
@@ -2,9 +2,10 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
+ import { insertAtLineStart } from '@dxos/ui-editor';
6
+
5
7
  import { type EditorMenuGroup } from './menu';
6
8
  import { popoverRangeEffect } from './popover';
7
- import { insertAtLineStart } from './util';
8
9
 
9
10
  export const formattingCommands: EditorMenuGroup = {
10
11
  id: 'markdown',
@@ -109,6 +110,7 @@ export const linkSlashCommands: EditorMenuGroup = {
109
110
  label: 'Block embed',
110
111
  icon: 'ph--lego--regular',
111
112
  onSelect: ({ view, head }) => {
113
+ // Seed the same query shape as typing "@@" manually.
112
114
  view.dispatch({
113
115
  changes: { from: head, insert: '@@' },
114
116
  selection: { anchor: head + 2, head: head + 2 },
@@ -5,10 +5,9 @@
5
5
  import { type EditorView } from '@codemirror/view';
6
6
 
7
7
  import { type Label } from '@dxos/react-ui';
8
+ import { insertAtCursor } from '@dxos/ui-editor';
8
9
  import { type MaybePromise } from '@dxos/util';
9
10
 
10
- import { insertAtCursor } from './util';
11
-
12
11
  export type EditorMenuGroup = {
13
12
  id: string;
14
13
  label?: Label;
@@ -13,11 +13,10 @@ import {
13
13
  keymap,
14
14
  } from '@codemirror/view';
15
15
 
16
+ import { type PlaceholderOptions, modalStateField, placeholder } from '@dxos/ui-editor';
17
+ import { type Range } from '@dxos/ui-editor/types';
16
18
  import { isNonNullable, isTruthy } from '@dxos/util';
17
19
 
18
- import { type PlaceholderOptions, modalStateField, placeholder } from '../../extensions';
19
- import { type Range } from '../../types';
20
-
21
20
  const DELIMITERS = [' ', ':'];
22
21
 
23
22
  export type PopoverOptions = {
@@ -54,6 +53,7 @@ export const popover = (options: PopoverOptions = {}): Extension => {
54
53
  placeholder({
55
54
  // TODO(burdon): Translations.
56
55
  content: `Press '${Array.isArray(options.trigger) ? options.trigger[0] : options.trigger}' for commands`,
56
+ focusOnly: true,
57
57
  ...options.placeholder,
58
58
  }),
59
59
  ].filter(isTruthy);
@@ -7,10 +7,9 @@ import { type EditorState } from '@codemirror/state';
7
7
  import { type RefObject, useCallback, useMemo, useRef, useState } from 'react';
8
8
 
9
9
  import { invariant } from '@dxos/invariant';
10
+ import { modalStateEffect } from '@dxos/ui-editor';
10
11
  import { type MaybePromise } from '@dxos/util';
11
12
 
12
- import { modalStateEffect } from '../../extensions';
13
-
14
13
  import { type EditorMenuProviderProps } from './EditorMenuProvider';
15
14
  import { type EditorMenuGroup, type EditorMenuItem } from './menu';
16
15
  import { filterMenuGroups, getMenuItem, getNextMenuItem, getPreviousMenuItem } from './menu';
@@ -63,7 +62,8 @@ export const useEditorMenu = ({
63
62
  const getMenuOptions = useCallback<NonNullable<UseEditorMenuProps['getMenu']>>(
64
63
  async ({ text, trigger, ...props }) => {
65
64
  const groups = (await getMenu?.({ text, trigger, ...props })) ?? [];
66
- return filter
65
+ // The "@" menu can use "@@" as syntax for block embeds, so it owns its own query filtering.
66
+ return filter && trigger !== '@'
67
67
  ? filterMenuGroups(groups, (item) =>
68
68
  text ? (item.label as string).toLowerCase().startsWith(text.toLowerCase()) : true,
69
69
  )
@@ -74,7 +74,6 @@ export const useEditorMenu = ({
74
74
 
75
75
  const handleOpenChange = useCallback<NonNullable<UseEditorMenu['onOpenChange']>>(
76
76
  async ({ view, open }) => {
77
- console.log(view, open);
78
77
  invariant(view);
79
78
  setOpen(open);
80
79
  if (!open) {
@@ -110,7 +109,13 @@ export const useEditorMenu = ({
110
109
  );
111
110
 
112
111
  const handleSelect = useCallback<NonNullable<UseEditorMenu['onSelect']>>(({ view, item }) => {
112
+ // Delete trigger range (e.g., "/" and any typed filter text).
113
+ const { range } = view.state.field(popoverStateField) ?? {};
114
+ if (range) {
115
+ view.dispatch({ changes: { from: range.from, to: range.to, insert: '' } });
116
+ }
113
117
  void item.onSelect?.({ view, head: view.state.selection.main.head });
118
+ view.focus();
114
119
  }, []);
115
120
 
116
121
  const handleCancel = useCallback<NonNullable<UseEditorMenu['onCancel']>>(({ view }) => {
@@ -7,8 +7,7 @@ import React, { type PropsWithChildren, type RefObject, useCallback, useEffect,
7
7
 
8
8
  import { addEventListener } from '@dxos/async';
9
9
  import { DX_ANCHOR_ACTIVATE, type DxAnchorActivate, Popover } from '@dxos/react-ui';
10
-
11
- import { type PreviewLinkRef, type PreviewLinkTarget } from '../../extensions';
10
+ import { type PreviewLinkRef, type PreviewLinkTarget } from '@dxos/ui-editor';
12
11
 
13
12
  type EditorPreviewPopoverValue = Partial<{
14
13
  link: PreviewLinkRef;
@@ -33,16 +32,16 @@ export const EditorPreviewProvider = ({ children, onLookup }: EditorPreviewProvi
33
32
 
34
33
  const handleActivate = useCallback(
35
34
  (event: DxAnchorActivate) => {
36
- const { refId, label, trigger: dxTrigger } = event;
35
+ const { dxn, label, trigger } = event;
37
36
  setValue((value) => ({
38
37
  ...value,
39
- link: { label, ref: refId },
38
+ link: { label, dxn },
40
39
  pending: true,
41
40
  }));
42
41
 
43
- triggerRef.current = dxTrigger;
42
+ triggerRef.current = trigger;
44
43
  queueMicrotask(() => setOpen(true));
45
- void onLookup?.({ label, ref: refId }).then((target) =>
44
+ void onLookup?.({ label, dxn }).then((target) =>
46
45
  setValue((value) => ({
47
46
  ...value,
48
47
  target: target ?? undefined,
@@ -69,9 +68,7 @@ export const EditorPreviewProvider = ({ children, onLookup }: EditorPreviewProvi
69
68
  <EditorPreviewContextProvider pending={value.pending} link={value.link} target={value.target}>
70
69
  <Popover.Root open={open} onOpenChange={setOpen}>
71
70
  <Popover.VirtualTrigger virtualRef={triggerRef as unknown as RefObject<HTMLButtonElement>} />
72
-
73
- {/* Content */}
74
- <div ref={setRoot} role='none' className='contents'>
71
+ <div className='contents' ref={setRoot}>
75
72
  {children}
76
73
  </div>
77
74
  </Popover.Root>
@@ -6,27 +6,21 @@ import { type EditorView } from '@codemirror/view';
6
6
  import { Atom } from '@effect-atom/atom-react';
7
7
  import React, { memo, useMemo } from 'react';
8
8
 
9
- import { atomFromSignal } from '@dxos/app-graph';
10
- import { type Live } from '@dxos/live-object';
9
+ import { type Node } from '@dxos/app-graph';
11
10
  import { ElevationProvider, type ThemedClassName } from '@dxos/react-ui';
12
- import {
13
- type ActionGraphProps,
14
- MenuProvider,
15
- ToolbarMenu,
16
- createGapSeparator,
17
- useMenuActions,
18
- } from '@dxos/react-ui-menu';
11
+ import { type ActionGraphProps, Menu, type MenuAction, MenuBuilder, useMenuActions } from '@dxos/react-ui-menu';
12
+ import { type EditorViewMode } from '@dxos/ui-editor/types';
19
13
 
20
- import { type EditorViewMode } from '../../types';
14
+ import { addBlocks } from './blocks';
15
+ import { addFormatting } from './formatting';
16
+ import { addHeadings } from './headings';
17
+ import { addImageUpload } from './image';
18
+ import { addLists } from './lists';
19
+ import { addSearch } from './search';
20
+ import { type EditorToolbarState } from './types';
21
+ import { addViewMode } from './view-mode';
21
22
 
22
- import { createLists } from './actions';
23
- import { createBlocks } from './blocks';
24
- import { createFormatting } from './formatting';
25
- import { createHeadings } from './headings';
26
- import { createImageUpload } from './image';
27
- import { createSearch } from './search';
28
- import { type EditorToolbarState } from './useEditorToolbar';
29
- import { createViewMode } from './view-mode';
23
+ // TODO(burdon): Enable toolbar variants (e.g., markdown, code).
30
24
 
31
25
  export type EditorToolbarFeatureFlags = Partial<{
32
26
  showHeadings: boolean;
@@ -41,7 +35,7 @@ export type EditorToolbarFeatureFlags = Partial<{
41
35
  }>;
42
36
 
43
37
  export type EditorToolbarActionGraphProps = {
44
- state: Live<EditorToolbarState>;
38
+ state: Atom.Atom<EditorToolbarState>;
45
39
  getView: () => EditorView;
46
40
  // TODO(wittjosiah): Control positioning.
47
41
  customActions?: Atom.Atom<ActionGraphProps>;
@@ -51,18 +45,19 @@ export type EditorToolbarProps = ThemedClassName<
51
45
  {
52
46
  role?: string;
53
47
  attendableId?: string;
48
+ /** Handler for executing actions. Required when customActions use Operation.invoke. */
49
+ onAction?: (action: MenuAction, params: Node.InvokeProps) => void;
54
50
  } & (EditorToolbarActionGraphProps & EditorToolbarFeatureFlags)
55
51
  >;
56
52
 
57
- // TODO(burdon): Remove role dependency.
58
- export const EditorToolbar = memo(({ classNames, role, attendableId, ...props }: EditorToolbarProps) => {
59
- const menuProps = useEditorToolbarActionGraph(props);
53
+ export const EditorToolbar = memo(({ classNames, role, attendableId, onAction, ...props }: EditorToolbarProps) => {
54
+ const menuActions = useMarkdownMenuActions(props);
60
55
 
61
56
  return (
62
57
  <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>
63
- <MenuProvider {...menuProps} attendableId={attendableId}>
64
- <ToolbarMenu classNames={classNames} textBlockWidth />
65
- </MenuProvider>
58
+ <Menu.Root {...menuActions} attendableId={attendableId} onAction={onAction}>
59
+ <Menu.Toolbar classNames={classNames} />
60
+ </Menu.Root>
66
61
  </ElevationProvider>
67
62
  );
68
63
  });
@@ -70,12 +65,13 @@ export const EditorToolbar = memo(({ classNames, role, attendableId, ...props }:
70
65
  type ToolbarActionsProps = Pick<EditorToolbarActionGraphProps, 'state' | 'getView' | 'customActions'> &
71
66
  EditorToolbarFeatureFlags;
72
67
 
68
+ // TODO(burdon): Some actions should toggle the state (e.g., toggle bullets on/off depending on the current state).
73
69
  // TODO(wittjosiah): Toolbar re-rendering is causing this graph to be recreated and breaking reactivity in some cases.
74
70
  // E.g. for toolbar dropdowns which use active icon, the icon is not updated when the active item changes.
75
71
  // This is currently only happening in the markdown plugin usage and should be reproduced in an editor story.
76
- const useEditorToolbarActionGraph = ({ state, getView, customActions, ...features }: ToolbarActionsProps) => {
72
+ const useMarkdownMenuActions = ({ state, getView, customActions, ...features }: ToolbarActionsProps) => {
77
73
  const menuCreator = useMemo(
78
- () => createToolbarActions({ state, getView, customActions, ...features }),
74
+ () => createMarkdownActions({ state, getView, customActions, ...features }),
79
75
  [
80
76
  state,
81
77
  getView,
@@ -93,52 +89,25 @@ const useEditorToolbarActionGraph = ({ state, getView, customActions, ...feature
93
89
  return useMenuActions(menuCreator);
94
90
  };
95
91
 
96
- const createToolbarActions = ({
92
+ const createMarkdownActions = ({
97
93
  state,
98
94
  getView,
99
95
  customActions,
100
96
  ...features
101
97
  }: ToolbarActionsProps): Atom.Atom<ActionGraphProps> => {
102
98
  return Atom.make((get) => {
103
- const graph: ActionGraphProps = {
104
- nodes: [],
105
- edges: [],
106
- };
107
-
108
- // TODO(burdon): Builder pattern?
109
- const addSubGraph = (graph: ActionGraphProps, subGraph: ActionGraphProps) => {
110
- graph.nodes.push(...subGraph.nodes);
111
- graph.edges.push(...subGraph.edges);
112
- };
113
-
114
- if (features?.showHeadings ?? true) {
115
- addSubGraph(graph, get(atomFromSignal(() => createHeadings(state, getView))));
116
- }
117
- if (features?.showFormatting ?? true) {
118
- addSubGraph(graph, get(atomFromSignal(() => createFormatting(state, getView))));
119
- }
120
- if (features?.showLists ?? true) {
121
- addSubGraph(graph, get(atomFromSignal(() => createLists(state, getView))));
122
- }
123
- if (features?.showBlocks ?? true) {
124
- addSubGraph(graph, get(atomFromSignal(() => createBlocks(state, getView))));
125
- }
126
- if (features?.onImageUpload) {
127
- addSubGraph(graph, get(atomFromSignal(() => createImageUpload(features.onImageUpload!))));
128
- }
129
-
130
- addSubGraph(graph, createGapSeparator());
131
-
132
- if (customActions) {
133
- addSubGraph(graph, get(customActions));
134
- }
135
- if (features?.showSearch ?? true) {
136
- addSubGraph(graph, get(atomFromSignal(() => createSearch(getView))));
137
- }
138
- if (features?.onViewModeChange) {
139
- addSubGraph(graph, get(atomFromSignal(() => createViewMode(state, features.onViewModeChange!))));
140
- }
141
-
142
- return graph;
99
+ // Subscribe to state changes.
100
+ const stateSnapshot = get(state);
101
+ return MenuBuilder.make()
102
+ .subgraph(features?.showHeadings !== false && addHeadings(stateSnapshot, getView))
103
+ .subgraph(features?.showFormatting !== false && addFormatting(stateSnapshot, getView))
104
+ .subgraph(features?.showLists !== false && addLists(stateSnapshot, getView))
105
+ .subgraph(features?.showBlocks !== false && addBlocks(stateSnapshot, getView))
106
+ .subgraph(features?.onImageUpload && addImageUpload(features.onImageUpload))
107
+ .separator('gap')
108
+ .subgraph(customActions && get(customActions))
109
+ .subgraph(features?.showSearch !== false && addSearch(getView))
110
+ .subgraph(features?.onViewModeChange && addViewMode(stateSnapshot, features.onViewModeChange))
111
+ .build();
143
112
  });
144
113
  };
@@ -4,57 +4,64 @@
4
4
 
5
5
  import { type EditorView } from '@codemirror/view';
6
6
 
7
- import { type NodeArg } from '@dxos/app-graph';
8
- import { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
7
+ import { type ActionGroupBuilderFn, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
8
+ import { addBlockquote, addCodeblock, insertTable, removeBlockquote, removeCodeblock } from '@dxos/ui-editor';
9
9
 
10
- import { addBlockquote, addCodeblock, insertTable, removeBlockquote, removeCodeblock } from '../../extensions';
10
+ import { translationKey } from '#translations';
11
11
 
12
- import { createEditorAction, createEditorActionGroup } from './actions';
13
- import { type EditorToolbarState } from './useEditorToolbar';
12
+ import { type EditorToolbarState } from './types';
14
13
 
15
- const createBlockGroupAction = (value: string) =>
16
- createEditorActionGroup('block', {
17
- variant: 'toggleGroup',
18
- selectCardinality: 'single',
19
- value,
20
- } as ToolbarMenuActionGroupProperties);
21
-
22
- const createBlockActions = (value: string, getView: () => EditorView, blankLine?: boolean) =>
23
- Object.entries({
24
- blockquote: 'ph--quotes--regular',
25
- codeblock: 'ph--code-block--regular',
26
- table: 'ph--table--regular',
27
- }).map(([type, icon]) => {
28
- const checked = type === value;
29
- return createEditorAction(type, { checked, ...(type === 'table' && { disabled: !!blankLine }), icon }, () => {
30
- const view = getView();
31
- if (!view) {
32
- return;
33
- }
14
+ const blockTypes = {
15
+ blockquote: 'ph--quotes--regular',
16
+ codeblock: 'ph--code-block--regular',
17
+ table: 'ph--table--regular',
18
+ };
34
19
 
35
- switch (type) {
36
- case 'blockquote':
37
- checked ? removeBlockquote(view) : addBlockquote(view);
38
- break;
39
- case 'codeblock':
40
- checked ? removeCodeblock(view) : addCodeblock(view);
41
- break;
42
- case 'table':
43
- insertTable(view);
44
- break;
45
- }
46
- });
47
- });
20
+ /** Add block actions to the builder. */
21
+ export const addBlocks =
22
+ (state: EditorToolbarState, getView: () => EditorView): ActionGroupBuilderFn =>
23
+ (builder) => {
24
+ const value = state?.blockQuote ? 'blockquote' : (state.blockType ?? '');
25
+ builder.group(
26
+ 'block',
27
+ {
28
+ label: ['block.label', { ns: translationKey }],
29
+ iconOnly: true,
30
+ variant: 'toggleGroup',
31
+ selectCardinality: 'single',
32
+ value,
33
+ } as ToolbarMenuActionGroupProperties,
34
+ (group) => {
35
+ for (const [type, icon] of Object.entries(blockTypes)) {
36
+ const checked = type === value;
37
+ group.action(
38
+ type,
39
+ {
40
+ label: [`block.${type}.label`, { ns: translationKey }],
41
+ checked,
42
+ ...(type === 'table' && { disabled: !!state.blankLine }),
43
+ icon,
44
+ },
45
+ () => {
46
+ const view = getView();
47
+ if (!view) {
48
+ return;
49
+ }
48
50
 
49
- export const createBlocks = (state: EditorToolbarState, getView: () => EditorView) => {
50
- const value = state?.blockQuote ? 'blockquote' : (state.blockType ?? '');
51
- const blockGroupAction = createBlockGroupAction(value);
52
- const blockActions = createBlockActions(value, getView, state.blankLine);
53
- return {
54
- nodes: [blockGroupAction as NodeArg<any>, ...blockActions],
55
- edges: [
56
- { source: 'root', target: 'block' },
57
- ...blockActions.map(({ id }) => ({ source: blockGroupAction.id, target: id })),
58
- ],
51
+ switch (type) {
52
+ case 'blockquote':
53
+ checked ? removeBlockquote(view) : addBlockquote(view);
54
+ break;
55
+ case 'codeblock':
56
+ checked ? removeCodeblock(view) : addCodeblock(view);
57
+ break;
58
+ case 'table':
59
+ insertTable(view);
60
+ break;
61
+ }
62
+ },
63
+ );
64
+ }
65
+ },
66
+ );
59
67
  };
60
- };
@@ -4,13 +4,12 @@
4
4
 
5
5
  import { type EditorView } from '@codemirror/view';
6
6
 
7
- import { type NodeArg } from '@dxos/app-graph';
8
- import { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
7
+ import { type ActionGroupBuilderFn, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
8
+ import { type Formatting, Inline, addLink, removeLink, setStyle } from '@dxos/ui-editor';
9
9
 
10
- import { type Formatting, Inline, addLink, removeLink, setStyle } from '../../extensions';
10
+ import { translationKey } from '#translations';
11
11
 
12
- import { createEditorAction, createEditorActionGroup } from './actions';
13
- import { type EditorToolbarState } from './useEditorToolbar';
12
+ import { type EditorToolbarState } from './types';
14
13
 
15
14
  const formats = {
16
15
  strong: 'ph--text-b--regular',
@@ -20,47 +19,46 @@ const formats = {
20
19
  link: 'ph--link--regular',
21
20
  };
22
21
 
23
- const createFormattingGroup = (formatting: Formatting) =>
24
- createEditorActionGroup('formatting', {
25
- variant: 'toggleGroup',
26
- selectCardinality: 'multiple',
27
- value: Object.keys(formats).filter((key) => !!formatting[key as keyof Formatting]),
28
- } as ToolbarMenuActionGroupProperties);
22
+ /** Add formatting actions to the builder. */
23
+ export const addFormatting =
24
+ (state: EditorToolbarState, getView: () => EditorView): ActionGroupBuilderFn =>
25
+ (builder) => {
26
+ const formatting: Formatting = state;
27
+ builder.group(
28
+ 'formatting',
29
+ {
30
+ label: ['formatting.label', { ns: translationKey }],
31
+ iconOnly: true,
32
+ variant: 'toggleGroup',
33
+ selectCardinality: 'multiple',
34
+ value: Object.keys(formats).filter((key) => !!formatting[key as keyof Formatting]),
35
+ } as ToolbarMenuActionGroupProperties,
36
+ (group) => {
37
+ for (const [type, icon] of Object.entries(formats)) {
38
+ const checked = !!formatting[type as keyof Formatting];
39
+ group.action(type, { label: [`formatting.${type}.label`, { ns: translationKey }], checked, icon }, () => {
40
+ const view = getView();
41
+ if (!view) {
42
+ return;
43
+ }
29
44
 
30
- const createFormattingActions = (formatting: Formatting, getView: () => EditorView) =>
31
- Object.entries(formats).map(([type, icon]) => {
32
- const checked = !!formatting[type as keyof Formatting];
33
- return createEditorAction(type, { checked, icon }, () => {
34
- const view = getView();
35
- if (!view) {
36
- return;
37
- }
45
+ if (type === 'link') {
46
+ checked ? removeLink(view) : addLink()(view);
47
+ return;
48
+ }
38
49
 
39
- if (type === 'link') {
40
- checked ? removeLink(view) : addLink()(view);
41
- return;
42
- }
43
-
44
- const inlineType =
45
- type === 'strong'
46
- ? Inline.Strong
47
- : type === 'emphasis'
48
- ? Inline.Emphasis
49
- : type === 'strikethrough'
50
- ? Inline.Strikethrough
51
- : Inline.Code;
52
- setStyle(inlineType, !checked)(view);
53
- });
54
- });
55
-
56
- export const createFormatting = (state: EditorToolbarState, getView: () => EditorView) => {
57
- const formattingGroupAction = createFormattingGroup(state);
58
- const formattingActions = createFormattingActions(state, getView);
59
- return {
60
- nodes: [formattingGroupAction as NodeArg<any>, ...formattingActions],
61
- edges: [
62
- { source: 'root', target: 'formatting' },
63
- ...formattingActions.map(({ id }) => ({ source: formattingGroupAction.id, target: id })),
64
- ],
50
+ setStyle(
51
+ type === 'strong'
52
+ ? Inline.Strong
53
+ : type === 'emphasis'
54
+ ? Inline.Emphasis
55
+ : type === 'strikethrough'
56
+ ? Inline.Strikethrough
57
+ : Inline.Code,
58
+ !checked,
59
+ )(view);
60
+ });
61
+ }
62
+ },
63
+ );
65
64
  };
66
- };