@dxos/react-ui-editor 0.8.4-main.72ec0f3 → 0.8.4-main.74a063c4e0

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 (404) hide show
  1. package/dist/lib/browser/index.mjs +718 -8598
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +711 -8590
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/components/Editor/Editor.d.ts +8 -2
  8. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  9. package/dist/types/src/components/Editor/Editor.stories.d.ts +4 -1
  10. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -1
  11. package/dist/types/src/components/EditorContent/EditorContent.d.ts +4 -2
  12. package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +1 -1
  13. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +2 -4
  14. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -1
  15. package/dist/types/src/components/EditorMenuProvider/index.d.ts +0 -1
  16. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -1
  17. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -1
  18. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -1
  19. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +1 -2
  20. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -1
  21. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -1
  22. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +1 -1
  23. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -1
  24. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +7 -5
  25. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  26. package/dist/types/src/components/EditorToolbar/blocks.d.ts +3 -16
  27. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  28. package/dist/types/src/components/EditorToolbar/formatting.d.ts +3 -16
  29. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  30. package/dist/types/src/components/EditorToolbar/headings.d.ts +3 -16
  31. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  32. package/dist/types/src/components/EditorToolbar/image.d.ts +3 -15
  33. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  34. package/dist/types/src/components/EditorToolbar/index.d.ts +0 -1
  35. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  36. package/dist/types/src/components/EditorToolbar/lists.d.ts +6 -0
  37. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -0
  38. package/dist/types/src/components/EditorToolbar/search.d.ts +3 -15
  39. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  40. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +4 -4
  41. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -1
  42. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +4 -17
  43. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  44. package/dist/types/src/components/index.d.ts.map +1 -1
  45. package/dist/types/src/hooks/useTextEditor.d.ts +1 -1
  46. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  47. package/dist/types/src/index.d.ts +0 -8
  48. package/dist/types/src/index.d.ts.map +1 -1
  49. package/dist/types/src/stories/Automerge.stories.d.ts +44 -0
  50. package/dist/types/src/stories/Automerge.stories.d.ts.map +1 -0
  51. package/dist/types/src/stories/Comments.stories.d.ts +3 -2
  52. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  53. package/dist/types/src/stories/EditorToolbar.stories.d.ts +27 -27
  54. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  55. package/dist/types/src/stories/Experimental.stories.d.ts +3 -2
  56. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  57. package/dist/types/src/stories/Markdown.stories.d.ts +3 -2
  58. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  59. package/dist/types/src/stories/Outliner.stories.d.ts +2 -2
  60. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  61. package/dist/types/src/stories/Popover.stories.d.ts +2 -2
  62. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -1
  63. package/dist/types/src/stories/Preview.stories.d.ts +3 -2
  64. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  65. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -1
  66. package/dist/types/src/stories/TextEditor.stories.d.ts +3 -2
  67. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  68. package/dist/types/src/stories/Theme.stories.d.ts +8 -0
  69. package/dist/types/src/stories/Theme.stories.d.ts.map +1 -0
  70. package/dist/types/src/stories/components/EditorStory.d.ts +9 -20
  71. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  72. package/dist/types/src/stories/components/util.d.ts +3 -3
  73. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  74. package/dist/types/src/translations.d.ts +26 -26
  75. package/dist/types/src/translations.d.ts.map +1 -1
  76. package/dist/types/src/util/index.d.ts +0 -5
  77. package/dist/types/src/util/index.d.ts.map +1 -1
  78. package/dist/types/src/util/react.d.ts +6 -5
  79. package/dist/types/src/util/react.d.ts.map +1 -1
  80. package/dist/types/tsconfig.tsbuildinfo +1 -1
  81. package/package.json +65 -66
  82. package/src/components/Editor/Editor.stories.tsx +17 -12
  83. package/src/components/Editor/Editor.tsx +21 -10
  84. package/src/components/EditorContent/EditorContent.tsx +19 -7
  85. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +23 -30
  86. package/src/components/EditorMenuProvider/index.ts +0 -1
  87. package/src/components/EditorMenuProvider/menu-presets.ts +3 -1
  88. package/src/components/EditorMenuProvider/menu.ts +1 -2
  89. package/src/components/EditorMenuProvider/popover.ts +1 -3
  90. package/src/components/EditorMenuProvider/useEditorMenu.ts +9 -4
  91. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +6 -9
  92. package/src/components/EditorToolbar/EditorToolbar.tsx +33 -66
  93. package/src/components/EditorToolbar/blocks.ts +54 -48
  94. package/src/components/EditorToolbar/formatting.ts +45 -48
  95. package/src/components/EditorToolbar/headings.ts +43 -50
  96. package/src/components/EditorToolbar/image.ts +16 -14
  97. package/src/components/EditorToolbar/index.ts +0 -1
  98. package/src/components/EditorToolbar/lists.ts +57 -0
  99. package/src/components/EditorToolbar/search.ts +16 -14
  100. package/src/components/EditorToolbar/useEditorToolbar.ts +6 -6
  101. package/src/components/EditorToolbar/view-mode.ts +35 -42
  102. package/src/components/index.ts +0 -2
  103. package/src/hooks/useTextEditor.ts +9 -3
  104. package/src/index.ts +0 -10
  105. package/src/stories/Automerge.stories.tsx +173 -0
  106. package/src/stories/Comments.stories.tsx +47 -43
  107. package/src/stories/EditorToolbar.stories.tsx +57 -27
  108. package/src/stories/Experimental.stories.tsx +10 -12
  109. package/src/stories/Markdown.stories.tsx +16 -16
  110. package/src/stories/Outliner.stories.tsx +8 -10
  111. package/src/stories/Popover.stories.tsx +27 -32
  112. package/src/stories/Preview.stories.tsx +67 -53
  113. package/src/stories/Tags.stories.tsx +24 -15
  114. package/src/stories/TextEditor.stories.tsx +13 -19
  115. package/src/stories/Theme.stories.tsx +61 -0
  116. package/src/stories/components/EditorStory.tsx +31 -30
  117. package/src/stories/components/util.tsx +51 -52
  118. package/src/translations.ts +30 -25
  119. package/src/util/index.ts +1 -6
  120. package/src/util/react.tsx +8 -13
  121. package/dist/lib/browser/chunk-HL3YF6WC.mjs +0 -22
  122. package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +0 -7
  123. package/dist/lib/browser/types/index.mjs +0 -13
  124. package/dist/lib/browser/types/index.mjs.map +0 -7
  125. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs +0 -24
  126. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +0 -7
  127. package/dist/lib/node-esm/types/index.mjs +0 -14
  128. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  129. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts +0 -26
  130. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts.map +0 -1
  131. package/dist/types/src/components/EditorMenuProvider/util.d.ts +0 -8
  132. package/dist/types/src/components/EditorMenuProvider/util.d.ts.map +0 -1
  133. package/dist/types/src/components/EditorToolbar/actions.d.ts +0 -39
  134. package/dist/types/src/components/EditorToolbar/actions.d.ts.map +0 -1
  135. package/dist/types/src/defaults.d.ts +0 -14
  136. package/dist/types/src/defaults.d.ts.map +0 -1
  137. package/dist/types/src/extensions/annotations.d.ts +0 -9
  138. package/dist/types/src/extensions/annotations.d.ts.map +0 -1
  139. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +0 -17
  140. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +0 -1
  141. package/dist/types/src/extensions/autocomplete/index.d.ts +0 -5
  142. package/dist/types/src/extensions/autocomplete/index.d.ts.map +0 -1
  143. package/dist/types/src/extensions/autocomplete/match.d.ts +0 -13
  144. package/dist/types/src/extensions/autocomplete/match.d.ts.map +0 -1
  145. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +0 -20
  146. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +0 -1
  147. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +0 -10
  148. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +0 -1
  149. package/dist/types/src/extensions/automerge/automerge.d.ts +0 -4
  150. package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
  151. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +0 -47
  152. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +0 -1
  153. package/dist/types/src/extensions/automerge/automerge.test.d.ts +0 -2
  154. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
  155. package/dist/types/src/extensions/automerge/cursor.d.ts +0 -4
  156. package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
  157. package/dist/types/src/extensions/automerge/defs.d.ts +0 -17
  158. package/dist/types/src/extensions/automerge/defs.d.ts.map +0 -1
  159. package/dist/types/src/extensions/automerge/index.d.ts +0 -2
  160. package/dist/types/src/extensions/automerge/index.d.ts.map +0 -1
  161. package/dist/types/src/extensions/automerge/sync.d.ts +0 -17
  162. package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
  163. package/dist/types/src/extensions/automerge/update-automerge.d.ts +0 -6
  164. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
  165. package/dist/types/src/extensions/automerge/update-codemirror.d.ts +0 -5
  166. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
  167. package/dist/types/src/extensions/autoscroll.d.ts +0 -20
  168. package/dist/types/src/extensions/autoscroll.d.ts.map +0 -1
  169. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +0 -31
  170. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
  171. package/dist/types/src/extensions/awareness/awareness.d.ts +0 -46
  172. package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
  173. package/dist/types/src/extensions/awareness/index.d.ts +0 -3
  174. package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
  175. package/dist/types/src/extensions/blast.d.ts +0 -25
  176. package/dist/types/src/extensions/blast.d.ts.map +0 -1
  177. package/dist/types/src/extensions/blocks.d.ts +0 -2
  178. package/dist/types/src/extensions/blocks.d.ts.map +0 -1
  179. package/dist/types/src/extensions/bookmarks.d.ts +0 -12
  180. package/dist/types/src/extensions/bookmarks.d.ts.map +0 -1
  181. package/dist/types/src/extensions/comments.d.ts +0 -95
  182. package/dist/types/src/extensions/comments.d.ts.map +0 -1
  183. package/dist/types/src/extensions/debug.d.ts +0 -3
  184. package/dist/types/src/extensions/debug.d.ts.map +0 -1
  185. package/dist/types/src/extensions/dnd.d.ts +0 -9
  186. package/dist/types/src/extensions/dnd.d.ts.map +0 -1
  187. package/dist/types/src/extensions/factories.d.ts +0 -83
  188. package/dist/types/src/extensions/factories.d.ts.map +0 -1
  189. package/dist/types/src/extensions/focus.d.ts +0 -7
  190. package/dist/types/src/extensions/focus.d.ts.map +0 -1
  191. package/dist/types/src/extensions/folding.d.ts +0 -7
  192. package/dist/types/src/extensions/folding.d.ts.map +0 -1
  193. package/dist/types/src/extensions/hashtag.d.ts +0 -3
  194. package/dist/types/src/extensions/hashtag.d.ts.map +0 -1
  195. package/dist/types/src/extensions/index.d.ts +0 -32
  196. package/dist/types/src/extensions/index.d.ts.map +0 -1
  197. package/dist/types/src/extensions/json.d.ts +0 -7
  198. package/dist/types/src/extensions/json.d.ts.map +0 -1
  199. package/dist/types/src/extensions/listener.d.ts +0 -13
  200. package/dist/types/src/extensions/listener.d.ts.map +0 -1
  201. package/dist/types/src/extensions/markdown/action.d.ts +0 -12
  202. package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
  203. package/dist/types/src/extensions/markdown/bundle.d.ts +0 -22
  204. package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
  205. package/dist/types/src/extensions/markdown/changes.d.ts +0 -10
  206. package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
  207. package/dist/types/src/extensions/markdown/changes.test.d.ts +0 -2
  208. package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
  209. package/dist/types/src/extensions/markdown/debug.d.ts +0 -11
  210. package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
  211. package/dist/types/src/extensions/markdown/decorate.d.ts +0 -25
  212. package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
  213. package/dist/types/src/extensions/markdown/formatting.d.ts +0 -61
  214. package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
  215. package/dist/types/src/extensions/markdown/formatting.test.d.ts +0 -3
  216. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
  217. package/dist/types/src/extensions/markdown/highlight.d.ts +0 -37
  218. package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
  219. package/dist/types/src/extensions/markdown/image.d.ts +0 -7
  220. package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
  221. package/dist/types/src/extensions/markdown/index.d.ts +0 -10
  222. package/dist/types/src/extensions/markdown/index.d.ts.map +0 -1
  223. package/dist/types/src/extensions/markdown/link.d.ts +0 -7
  224. package/dist/types/src/extensions/markdown/link.d.ts.map +0 -1
  225. package/dist/types/src/extensions/markdown/parser.test.d.ts +0 -2
  226. package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
  227. package/dist/types/src/extensions/markdown/styles.d.ts +0 -4
  228. package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
  229. package/dist/types/src/extensions/markdown/table.d.ts +0 -8
  230. package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
  231. package/dist/types/src/extensions/mention.d.ts +0 -7
  232. package/dist/types/src/extensions/mention.d.ts.map +0 -1
  233. package/dist/types/src/extensions/modal.d.ts +0 -7
  234. package/dist/types/src/extensions/modal.d.ts.map +0 -1
  235. package/dist/types/src/extensions/modes.d.ts +0 -10
  236. package/dist/types/src/extensions/modes.d.ts.map +0 -1
  237. package/dist/types/src/extensions/outliner/commands.d.ts +0 -10
  238. package/dist/types/src/extensions/outliner/commands.d.ts.map +0 -1
  239. package/dist/types/src/extensions/outliner/editor.d.ts +0 -5
  240. package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
  241. package/dist/types/src/extensions/outliner/editor.test.d.ts +0 -2
  242. package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
  243. package/dist/types/src/extensions/outliner/index.d.ts +0 -4
  244. package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
  245. package/dist/types/src/extensions/outliner/menu.d.ts +0 -8
  246. package/dist/types/src/extensions/outliner/menu.d.ts.map +0 -1
  247. package/dist/types/src/extensions/outliner/outliner.d.ts +0 -11
  248. package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
  249. package/dist/types/src/extensions/outliner/outliner.test.d.ts +0 -2
  250. package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +0 -1
  251. package/dist/types/src/extensions/outliner/selection.d.ts +0 -12
  252. package/dist/types/src/extensions/outliner/selection.d.ts.map +0 -1
  253. package/dist/types/src/extensions/outliner/tree.d.ts +0 -79
  254. package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
  255. package/dist/types/src/extensions/outliner/tree.test.d.ts +0 -2
  256. package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
  257. package/dist/types/src/extensions/preview/index.d.ts +0 -2
  258. package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
  259. package/dist/types/src/extensions/preview/preview.d.ts +0 -32
  260. package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
  261. package/dist/types/src/extensions/replacer.d.ts +0 -21
  262. package/dist/types/src/extensions/replacer.d.ts.map +0 -1
  263. package/dist/types/src/extensions/replacer.test.d.ts +0 -2
  264. package/dist/types/src/extensions/replacer.test.d.ts.map +0 -1
  265. package/dist/types/src/extensions/scrolling.d.ts +0 -78
  266. package/dist/types/src/extensions/scrolling.d.ts.map +0 -1
  267. package/dist/types/src/extensions/selection.d.ts +0 -24
  268. package/dist/types/src/extensions/selection.d.ts.map +0 -1
  269. package/dist/types/src/extensions/state.d.ts +0 -2
  270. package/dist/types/src/extensions/state.d.ts.map +0 -1
  271. package/dist/types/src/extensions/submit.d.ts +0 -10
  272. package/dist/types/src/extensions/submit.d.ts.map +0 -1
  273. package/dist/types/src/extensions/tab.d.ts +0 -4
  274. package/dist/types/src/extensions/tab.d.ts.map +0 -1
  275. package/dist/types/src/extensions/tags/extended-markdown.d.ts +0 -10
  276. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +0 -1
  277. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +0 -2
  278. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +0 -1
  279. package/dist/types/src/extensions/tags/index.d.ts +0 -4
  280. package/dist/types/src/extensions/tags/index.d.ts.map +0 -1
  281. package/dist/types/src/extensions/tags/streamer.d.ts +0 -12
  282. package/dist/types/src/extensions/tags/streamer.d.ts.map +0 -1
  283. package/dist/types/src/extensions/tags/xml-tags.d.ts +0 -97
  284. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +0 -1
  285. package/dist/types/src/extensions/tags/xml-util.d.ts +0 -10
  286. package/dist/types/src/extensions/tags/xml-util.d.ts.map +0 -1
  287. package/dist/types/src/extensions/typewriter.d.ts +0 -10
  288. package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
  289. package/dist/types/src/stories/CommandDialog.stories.d.ts +0 -14
  290. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +0 -1
  291. package/dist/types/src/styles/index.d.ts +0 -4
  292. package/dist/types/src/styles/index.d.ts.map +0 -1
  293. package/dist/types/src/styles/markdown.d.ts +0 -8
  294. package/dist/types/src/styles/markdown.d.ts.map +0 -1
  295. package/dist/types/src/styles/theme.d.ts +0 -38
  296. package/dist/types/src/styles/theme.d.ts.map +0 -1
  297. package/dist/types/src/styles/tokens.d.ts +0 -3
  298. package/dist/types/src/styles/tokens.d.ts.map +0 -1
  299. package/dist/types/src/types/index.d.ts +0 -2
  300. package/dist/types/src/types/index.d.ts.map +0 -1
  301. package/dist/types/src/types/types.d.ts +0 -21
  302. package/dist/types/src/types/types.d.ts.map +0 -1
  303. package/dist/types/src/util/cursor.d.ts +0 -31
  304. package/dist/types/src/util/cursor.d.ts.map +0 -1
  305. package/dist/types/src/util/debug.d.ts +0 -21
  306. package/dist/types/src/util/debug.d.ts.map +0 -1
  307. package/dist/types/src/util/decorations.d.ts +0 -4
  308. package/dist/types/src/util/decorations.d.ts.map +0 -1
  309. package/dist/types/src/util/dom.d.ts +0 -10
  310. package/dist/types/src/util/dom.d.ts.map +0 -1
  311. package/dist/types/src/util/facet.d.ts +0 -3
  312. package/dist/types/src/util/facet.d.ts.map +0 -1
  313. package/src/components/EditorContent/EditorContent.stories.tsx +0 -70
  314. package/src/components/EditorMenuProvider/util.ts +0 -31
  315. package/src/components/EditorToolbar/actions.ts +0 -86
  316. package/src/defaults.ts +0 -52
  317. package/src/extensions/annotations.ts +0 -55
  318. package/src/extensions/autocomplete/autocomplete.ts +0 -151
  319. package/src/extensions/autocomplete/index.ts +0 -8
  320. package/src/extensions/autocomplete/match.ts +0 -46
  321. package/src/extensions/autocomplete/placeholder.ts +0 -117
  322. package/src/extensions/autocomplete/typeahead.ts +0 -87
  323. package/src/extensions/automerge/automerge.stories.tsx +0 -149
  324. package/src/extensions/automerge/automerge.test.tsx +0 -78
  325. package/src/extensions/automerge/automerge.ts +0 -105
  326. package/src/extensions/automerge/cursor.ts +0 -28
  327. package/src/extensions/automerge/defs.ts +0 -31
  328. package/src/extensions/automerge/index.ts +0 -5
  329. package/src/extensions/automerge/sync.ts +0 -79
  330. package/src/extensions/automerge/update-automerge.ts +0 -50
  331. package/src/extensions/automerge/update-codemirror.ts +0 -115
  332. package/src/extensions/autoscroll.ts +0 -163
  333. package/src/extensions/awareness/awareness-provider.ts +0 -127
  334. package/src/extensions/awareness/awareness.ts +0 -315
  335. package/src/extensions/awareness/index.ts +0 -6
  336. package/src/extensions/blast.ts +0 -363
  337. package/src/extensions/blocks.ts +0 -131
  338. package/src/extensions/bookmarks.ts +0 -75
  339. package/src/extensions/comments.ts +0 -598
  340. package/src/extensions/debug.ts +0 -15
  341. package/src/extensions/dnd.ts +0 -37
  342. package/src/extensions/factories.ts +0 -278
  343. package/src/extensions/focus.ts +0 -36
  344. package/src/extensions/folding.tsx +0 -43
  345. package/src/extensions/hashtag.tsx +0 -68
  346. package/src/extensions/index.ts +0 -35
  347. package/src/extensions/json.ts +0 -57
  348. package/src/extensions/listener.ts +0 -32
  349. package/src/extensions/markdown/action.ts +0 -117
  350. package/src/extensions/markdown/bundle.ts +0 -105
  351. package/src/extensions/markdown/changes.test.ts +0 -26
  352. package/src/extensions/markdown/changes.ts +0 -149
  353. package/src/extensions/markdown/debug.ts +0 -44
  354. package/src/extensions/markdown/decorate.ts +0 -601
  355. package/src/extensions/markdown/formatting.test.ts +0 -498
  356. package/src/extensions/markdown/formatting.ts +0 -1265
  357. package/src/extensions/markdown/highlight.ts +0 -183
  358. package/src/extensions/markdown/image.ts +0 -118
  359. package/src/extensions/markdown/index.ts +0 -13
  360. package/src/extensions/markdown/link.ts +0 -50
  361. package/src/extensions/markdown/parser.test.ts +0 -75
  362. package/src/extensions/markdown/styles.ts +0 -135
  363. package/src/extensions/markdown/table.ts +0 -150
  364. package/src/extensions/mention.ts +0 -41
  365. package/src/extensions/modal.ts +0 -24
  366. package/src/extensions/modes.ts +0 -41
  367. package/src/extensions/outliner/commands.ts +0 -270
  368. package/src/extensions/outliner/editor.test.ts +0 -33
  369. package/src/extensions/outliner/editor.ts +0 -184
  370. package/src/extensions/outliner/index.ts +0 -7
  371. package/src/extensions/outliner/menu.ts +0 -128
  372. package/src/extensions/outliner/outliner.test.ts +0 -100
  373. package/src/extensions/outliner/outliner.ts +0 -167
  374. package/src/extensions/outliner/selection.ts +0 -50
  375. package/src/extensions/outliner/tree.test.ts +0 -168
  376. package/src/extensions/outliner/tree.ts +0 -317
  377. package/src/extensions/preview/index.ts +0 -5
  378. package/src/extensions/preview/preview.ts +0 -193
  379. package/src/extensions/replacer.test.ts +0 -75
  380. package/src/extensions/replacer.ts +0 -93
  381. package/src/extensions/scrolling.ts +0 -189
  382. package/src/extensions/selection.ts +0 -100
  383. package/src/extensions/state.ts +0 -7
  384. package/src/extensions/submit.ts +0 -62
  385. package/src/extensions/tab.ts +0 -29
  386. package/src/extensions/tags/extended-markdown.test.ts +0 -262
  387. package/src/extensions/tags/extended-markdown.ts +0 -78
  388. package/src/extensions/tags/index.ts +0 -7
  389. package/src/extensions/tags/streamer.ts +0 -243
  390. package/src/extensions/tags/xml-tags.ts +0 -500
  391. package/src/extensions/tags/xml-util.ts +0 -94
  392. package/src/extensions/typewriter.ts +0 -68
  393. package/src/stories/CommandDialog.stories.tsx +0 -83
  394. package/src/styles/index.ts +0 -7
  395. package/src/styles/markdown.ts +0 -26
  396. package/src/styles/theme.ts +0 -269
  397. package/src/styles/tokens.ts +0 -17
  398. package/src/types/index.ts +0 -5
  399. package/src/types/types.ts +0 -32
  400. package/src/util/cursor.ts +0 -56
  401. package/src/util/debug.ts +0 -69
  402. package/src/util/decorations.ts +0 -21
  403. package/src/util/dom.ts +0 -34
  404. package/src/util/facet.ts +0 -13
@@ -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 role='none' className='contents' ref={setRoot}>
75
72
  {children}
76
73
  </div>
77
74
  </Popover.Root>
@@ -6,27 +6,19 @@ 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';
19
-
20
- import { type EditorViewMode } from '../../types';
21
-
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';
11
+ import { type ActionGraphProps, Menu, type MenuAction, MenuBuilder, useMenuActions } from '@dxos/react-ui-menu';
12
+ import { type EditorViewMode } from '@dxos/ui-editor';
13
+
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';
28
20
  import { type EditorToolbarState } from './useEditorToolbar';
29
- import { createViewMode } from './view-mode';
21
+ import { addViewMode } from './view-mode';
30
22
 
31
23
  export type EditorToolbarFeatureFlags = Partial<{
32
24
  showHeadings: boolean;
@@ -41,7 +33,7 @@ export type EditorToolbarFeatureFlags = Partial<{
41
33
  }>;
42
34
 
43
35
  export type EditorToolbarActionGraphProps = {
44
- state: Live<EditorToolbarState>;
36
+ state: Atom.Atom<EditorToolbarState>;
45
37
  getView: () => EditorView;
46
38
  // TODO(wittjosiah): Control positioning.
47
39
  customActions?: Atom.Atom<ActionGraphProps>;
@@ -51,18 +43,19 @@ export type EditorToolbarProps = ThemedClassName<
51
43
  {
52
44
  role?: string;
53
45
  attendableId?: string;
46
+ /** Handler for executing actions. Required when customActions use Operation.invoke. */
47
+ onAction?: (action: MenuAction, params: Node.InvokeProps) => void;
54
48
  } & (EditorToolbarActionGraphProps & EditorToolbarFeatureFlags)
55
49
  >;
56
50
 
57
- // TODO(burdon): Remove role dependency.
58
- export const EditorToolbar = memo(({ classNames, role, attendableId, ...props }: EditorToolbarProps) => {
59
- const menuProps = useEditorToolbarActionGraph(props);
51
+ export const EditorToolbar = memo(({ classNames, role, attendableId, onAction, ...props }: EditorToolbarProps) => {
52
+ const menuActions = useEditorToolbarActionGraph(props);
60
53
 
61
54
  return (
62
55
  <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>
63
- <MenuProvider {...menuProps} attendableId={attendableId}>
64
- <ToolbarMenu classNames={classNames} textBlockWidth />
65
- </MenuProvider>
56
+ <Menu.Root {...menuActions} attendableId={attendableId} onAction={onAction}>
57
+ <Menu.Toolbar classNames={classNames} />
58
+ </Menu.Root>
66
59
  </ElevationProvider>
67
60
  );
68
61
  });
@@ -73,6 +66,7 @@ type ToolbarActionsProps = Pick<EditorToolbarActionGraphProps, 'state' | 'getVie
73
66
  // TODO(wittjosiah): Toolbar re-rendering is causing this graph to be recreated and breaking reactivity in some cases.
74
67
  // E.g. for toolbar dropdowns which use active icon, the icon is not updated when the active item changes.
75
68
  // This is currently only happening in the markdown plugin usage and should be reproduced in an editor story.
69
+ // TODO(burdon): Some actions should toggle the state (e.g., toggle bullets on/off depending on the current state).
76
70
  const useEditorToolbarActionGraph = ({ state, getView, customActions, ...features }: ToolbarActionsProps) => {
77
71
  const menuCreator = useMemo(
78
72
  () => createToolbarActions({ state, getView, customActions, ...features }),
@@ -100,45 +94,18 @@ const createToolbarActions = ({
100
94
  ...features
101
95
  }: ToolbarActionsProps): Atom.Atom<ActionGraphProps> => {
102
96
  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;
97
+ // Subscribe to state changes.
98
+ const stateSnapshot = get(state);
99
+ return MenuBuilder.make()
100
+ .subgraph(features?.showHeadings !== false && addHeadings(stateSnapshot, getView))
101
+ .subgraph(features?.showFormatting !== false && addFormatting(stateSnapshot, getView))
102
+ .subgraph(features?.showLists !== false && addLists(stateSnapshot, getView))
103
+ .subgraph(features?.showBlocks !== false && addBlocks(stateSnapshot, getView))
104
+ .subgraph(features?.onImageUpload && addImageUpload(features.onImageUpload))
105
+ .separator('gap')
106
+ .subgraph(customActions && get(customActions))
107
+ .subgraph(features?.showSearch !== false && addSearch(getView))
108
+ .subgraph(features?.onViewModeChange && addViewMode(stateSnapshot, features.onViewModeChange))
109
+ .build();
143
110
  });
144
111
  };
@@ -4,57 +4,63 @@
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';
11
-
12
- import { createEditorAction, createEditorActionGroup } from './actions';
10
+ import { translationKey } from '../../translations';
13
11
  import { type EditorToolbarState } from './useEditorToolbar';
14
12
 
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
- }
13
+ const blockTypes = {
14
+ blockquote: 'ph--quotes--regular',
15
+ codeblock: 'ph--code-block--regular',
16
+ table: 'ph--table--regular',
17
+ };
34
18
 
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
- });
19
+ /** Add block actions to the builder. */
20
+ export const addBlocks =
21
+ (state: EditorToolbarState, getView: () => EditorView): ActionGroupBuilderFn =>
22
+ (builder) => {
23
+ const value = state?.blockQuote ? 'blockquote' : (state.blockType ?? '');
24
+ builder.group(
25
+ 'block',
26
+ {
27
+ label: ['block.label', { ns: translationKey }],
28
+ iconOnly: true,
29
+ variant: 'toggleGroup',
30
+ selectCardinality: 'single',
31
+ value,
32
+ } as ToolbarMenuActionGroupProperties,
33
+ (group) => {
34
+ for (const [type, icon] of Object.entries(blockTypes)) {
35
+ const checked = type === value;
36
+ group.action(
37
+ type,
38
+ {
39
+ label: [`block.${type}.label`, { ns: translationKey }],
40
+ checked,
41
+ ...(type === 'table' && { disabled: !!state.blankLine }),
42
+ icon,
43
+ },
44
+ () => {
45
+ const view = getView();
46
+ if (!view) {
47
+ return;
48
+ }
48
49
 
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
- ],
50
+ switch (type) {
51
+ case 'blockquote':
52
+ checked ? removeBlockquote(view) : addBlockquote(view);
53
+ break;
54
+ case 'codeblock':
55
+ checked ? removeCodeblock(view) : addCodeblock(view);
56
+ break;
57
+ case 'table':
58
+ insertTable(view);
59
+ break;
60
+ }
61
+ },
62
+ );
63
+ }
64
+ },
65
+ );
59
66
  };
60
- };
@@ -4,12 +4,10 @@
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';
11
-
12
- import { createEditorAction, createEditorActionGroup } from './actions';
10
+ import { translationKey } from '../../translations';
13
11
  import { type EditorToolbarState } from './useEditorToolbar';
14
12
 
15
13
  const formats = {
@@ -20,47 +18,46 @@ const formats = {
20
18
  link: 'ph--link--regular',
21
19
  };
22
20
 
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);
29
-
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
- }
38
-
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
- ],
21
+ /** Add formatting actions to the builder. */
22
+ export const addFormatting =
23
+ (state: EditorToolbarState, getView: () => EditorView): ActionGroupBuilderFn =>
24
+ (builder) => {
25
+ const formatting: Formatting = state;
26
+ builder.group(
27
+ 'formatting',
28
+ {
29
+ label: ['formatting.label', { ns: translationKey }],
30
+ iconOnly: true,
31
+ variant: 'toggleGroup',
32
+ selectCardinality: 'multiple',
33
+ value: Object.keys(formats).filter((key) => !!formatting[key as keyof Formatting]),
34
+ } as ToolbarMenuActionGroupProperties,
35
+ (group) => {
36
+ for (const [type, icon] of Object.entries(formats)) {
37
+ const checked = !!formatting[type as keyof Formatting];
38
+ group.action(type, { label: [`formatting.${type}.label`, { ns: translationKey }], checked, icon }, () => {
39
+ const view = getView();
40
+ if (!view) {
41
+ return;
42
+ }
43
+
44
+ if (type === 'link') {
45
+ checked ? removeLink(view) : addLink()(view);
46
+ return;
47
+ }
48
+
49
+ setStyle(
50
+ type === 'strong'
51
+ ? Inline.Strong
52
+ : type === 'emphasis'
53
+ ? Inline.Emphasis
54
+ : type === 'strikethrough'
55
+ ? Inline.Strikethrough
56
+ : Inline.Code,
57
+ !checked,
58
+ )(view);
59
+ });
60
+ }
61
+ },
62
+ );
65
63
  };
66
- };
@@ -4,49 +4,21 @@
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 { setHeading } from '@dxos/ui-editor';
9
9
 
10
- import { setHeading } from '../../extensions';
11
10
  import { translationKey } from '../../translations';
12
-
13
- import { createEditorAction, createEditorActionGroup } from './actions';
14
11
  import { type EditorToolbarState } from './useEditorToolbar';
15
12
 
16
- const createHeadingGroupAction = (value: string) =>
17
- createEditorActionGroup(
18
- 'heading',
19
- {
20
- variant: 'dropdownMenu',
21
- applyActive: true,
22
- selectCardinality: 'single',
23
- // TODO(wittjosiah): Remove? Not sure this does anything.
24
- value,
25
- } as ToolbarMenuActionGroupProperties,
26
- 'ph--text-h--regular',
27
- );
28
-
29
- const createHeadingActions = (currentLevel: string, getView: () => EditorView) =>
30
- Object.entries({
31
- '0': 'ph--paragraph--regular',
32
- '1': 'ph--text-h-one--regular',
33
- '2': 'ph--text-h-two--regular',
34
- '3': 'ph--text-h-three--regular',
35
- '4': 'ph--text-h-four--regular',
36
- '5': 'ph--text-h-five--regular',
37
- '6': 'ph--text-h-six--regular',
38
- }).map(([levelStr, icon]) => {
39
- const level = parseInt(levelStr);
40
- return createEditorAction(
41
- `heading--${levelStr}`,
42
- {
43
- label: ['heading level label', { count: level, ns: translationKey }],
44
- icon,
45
- checked: levelStr === currentLevel,
46
- },
47
- () => setHeading(level)(getView()),
48
- );
49
- });
13
+ const headingIcons: Record<string, string> = {
14
+ 0: 'ph--paragraph--regular',
15
+ 1: 'ph--text-h-one--regular',
16
+ 2: 'ph--text-h-two--regular',
17
+ 3: 'ph--text-h-three--regular',
18
+ 4: 'ph--text-h-four--regular',
19
+ 5: 'ph--text-h-five--regular',
20
+ 6: 'ph--text-h-six--regular',
21
+ };
50
22
 
51
23
  const computeHeadingValue = (state: EditorToolbarState) => {
52
24
  const blockType = state ? state.blockType : 'paragraph';
@@ -54,15 +26,36 @@ const computeHeadingValue = (state: EditorToolbarState) => {
54
26
  return heading ? heading[1] : blockType === 'paragraph' || !blockType ? '0' : '';
55
27
  };
56
28
 
57
- export const createHeadings = (state: EditorToolbarState, getView: () => EditorView) => {
58
- const headingValue = computeHeadingValue(state);
59
- const headingGroupAction = createHeadingGroupAction(headingValue);
60
- const headingActions = createHeadingActions(headingValue, getView);
61
- return {
62
- nodes: [headingGroupAction as NodeArg<any>, ...headingActions],
63
- edges: [
64
- { source: 'root', target: 'heading' },
65
- ...headingActions.map(({ id }) => ({ source: headingGroupAction.id, target: id })),
66
- ],
29
+ /** Add heading actions to the builder. */
30
+ export const addHeadings =
31
+ (state: EditorToolbarState, getView: () => EditorView): ActionGroupBuilderFn =>
32
+ (builder) => {
33
+ const headingValue = computeHeadingValue(state);
34
+ builder.group(
35
+ 'heading',
36
+ {
37
+ label: ['heading.label', { ns: translationKey }],
38
+ icon: 'ph--text-h--regular',
39
+ iconOnly: true,
40
+ variant: 'dropdownMenu',
41
+ applyActive: true,
42
+ selectCardinality: 'single',
43
+ // TODO(wittjosiah): Remove? Not sure this does anything.
44
+ value: headingValue,
45
+ } as ToolbarMenuActionGroupProperties,
46
+ (group) => {
47
+ for (const [levelStr, icon] of Object.entries(headingIcons)) {
48
+ const level = parseInt(levelStr);
49
+ group.action(
50
+ `heading--${levelStr}`,
51
+ {
52
+ label: ['heading-level.label', { count: level, ns: translationKey }],
53
+ icon,
54
+ checked: levelStr === headingValue,
55
+ },
56
+ () => setHeading(level)(getView()),
57
+ );
58
+ }
59
+ },
60
+ );
67
61
  };
68
- };
@@ -2,19 +2,21 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { createEditorAction } from './actions';
5
+ import { type ActionGroupBuilderFn } from '@dxos/react-ui-menu';
6
6
 
7
- const createImageUploadAction = (onImageUpload: () => void) =>
8
- createEditorAction(
9
- 'image',
10
- {
11
- testId: 'editor.toolbar.image',
12
- icon: 'ph--image-square--regular',
13
- },
14
- onImageUpload,
15
- );
7
+ import { translationKey } from '../../translations';
16
8
 
17
- export const createImageUpload = (onImageUpload: () => void) => ({
18
- nodes: [createImageUploadAction(onImageUpload)],
19
- edges: [{ source: 'root', target: 'image' }],
20
- });
9
+ /** Add image upload action to the builder. */
10
+ export const addImageUpload =
11
+ (onImageUpload: () => void): ActionGroupBuilderFn =>
12
+ (builder) => {
13
+ builder.action(
14
+ 'image',
15
+ {
16
+ label: ['image.label', { ns: translationKey }],
17
+ testId: 'editor.toolbar.image',
18
+ icon: 'ph--image-square--regular',
19
+ },
20
+ onImageUpload,
21
+ );
22
+ };
@@ -5,4 +5,3 @@
5
5
  export * from './EditorToolbar';
6
6
 
7
7
  export { type EditorToolbarState, useEditorToolbar } from './useEditorToolbar';
8
- export { createEditorAction, createEditorActionGroup } from './actions';
@@ -0,0 +1,57 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type EditorView } from '@codemirror/view';
6
+
7
+ import { type ActionGroupBuilderFn, type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
8
+ import { List, addList, removeList } from '@dxos/ui-editor';
9
+
10
+ import { translationKey } from '../../translations';
11
+ import { type EditorToolbarState } from './useEditorToolbar';
12
+
13
+ const listStyles = {
14
+ bullet: 'ph--list-bullets--regular',
15
+ ordered: 'ph--list-numbers--regular',
16
+ task: 'ph--list-checks--regular',
17
+ };
18
+
19
+ /** Add list actions to the builder. */
20
+ export const addLists =
21
+ (state: EditorToolbarState, getView: () => EditorView): ActionGroupBuilderFn =>
22
+ (builder) => {
23
+ const value = state.listStyle ?? '';
24
+ builder.group(
25
+ 'list',
26
+ {
27
+ label: ['list.label', { ns: translationKey }],
28
+ iconOnly: true,
29
+ variant: 'toggleGroup',
30
+ selectCardinality: 'single',
31
+ value,
32
+ } as ToolbarMenuActionGroupProperties,
33
+ (group) => {
34
+ for (const [listStyle, icon] of Object.entries(listStyles)) {
35
+ const checked = value === listStyle;
36
+ group.action(
37
+ `list-${listStyle}`,
38
+ { label: [`list.${listStyle}.label`, { ns: translationKey }], checked, icon },
39
+ () => {
40
+ const view = getView();
41
+ if (!view) {
42
+ return;
43
+ }
44
+
45
+ const listType =
46
+ listStyle === 'ordered' ? List.Ordered : listStyle === 'bullet' ? List.Bullet : List.Task;
47
+ if (checked) {
48
+ removeList(listType)(view);
49
+ } else {
50
+ addList(listType)(view);
51
+ }
52
+ },
53
+ );
54
+ }
55
+ },
56
+ );
57
+ };