@dxos/react-ui-editor 0.8.4-main.3f58842 → 0.8.4-main.548089c

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 (340) hide show
  1. package/dist/lib/browser/{chunk-22UMM3QJ.mjs → chunk-HL3YF6WC.mjs} +2 -2
  2. package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +8004 -6623
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +71 -1
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/browser/types/index.mjs +1 -1
  9. package/dist/lib/node-esm/{chunk-YXYQPV6R.mjs → chunk-YJZGD3LY.mjs} +2 -2
  10. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +7 -0
  11. package/dist/lib/node-esm/index.mjs +8004 -6623
  12. package/dist/lib/node-esm/index.mjs.map +4 -4
  13. package/dist/lib/node-esm/meta.json +1 -1
  14. package/dist/lib/node-esm/testing/index.mjs +71 -1
  15. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  16. package/dist/lib/node-esm/types/index.mjs +1 -1
  17. package/dist/types/src/components/Editor/Editor.d.ts +24 -9
  18. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  19. package/dist/types/src/components/Editor/Editor.stories.d.ts +27 -0
  20. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +17 -2
  22. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  23. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  24. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  25. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  26. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  27. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  28. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  29. package/dist/types/src/components/EditorToolbar/util.d.ts +8 -22
  30. package/dist/types/src/components/EditorToolbar/util.d.ts.map +1 -1
  31. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +1 -1
  32. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  33. package/dist/types/src/components/index.d.ts +0 -1
  34. package/dist/types/src/components/index.d.ts.map +1 -1
  35. package/dist/types/src/defaults.d.ts.map +1 -1
  36. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +26 -0
  37. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  38. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  39. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  40. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  41. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  42. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  43. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  44. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  45. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  46. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  47. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  48. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +10 -19
  49. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  50. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  51. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  52. package/dist/types/src/extensions/automerge/defs.d.ts +1 -1
  53. package/dist/types/src/extensions/automerge/defs.d.ts.map +1 -1
  54. package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
  55. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  56. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  57. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  58. package/dist/types/src/extensions/autoscroll.d.ts +20 -0
  59. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  60. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
  61. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  62. package/dist/types/src/extensions/blocks.d.ts +2 -0
  63. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  64. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  65. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  66. package/dist/types/src/extensions/comments.d.ts +1 -1
  67. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  68. package/dist/types/src/extensions/dnd.d.ts.map +1 -1
  69. package/dist/types/src/extensions/factories.d.ts +11 -11
  70. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  71. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  72. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  73. package/dist/types/src/extensions/index.d.ts +8 -1
  74. package/dist/types/src/extensions/index.d.ts.map +1 -1
  75. package/dist/types/src/extensions/json.d.ts +1 -1
  76. package/dist/types/src/extensions/json.d.ts.map +1 -1
  77. package/dist/types/src/extensions/listener.d.ts +8 -6
  78. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  79. package/dist/types/src/extensions/markdown/action.d.ts.map +1 -1
  80. package/dist/types/src/extensions/markdown/bundle.d.ts +8 -2
  81. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  82. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  83. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  84. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  85. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  86. package/dist/types/src/extensions/markdown/formatting.d.ts +2 -3
  87. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  88. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +1 -1
  89. package/dist/types/src/extensions/markdown/highlight.d.ts.map +1 -1
  90. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  91. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  92. package/dist/types/src/extensions/modes.d.ts +1 -1
  93. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  94. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  95. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  96. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  97. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  98. package/dist/types/src/extensions/outliner/selection.d.ts.map +1 -1
  99. package/dist/types/src/extensions/outliner/tree.d.ts +2 -2
  100. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  101. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts +36 -0
  102. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts.map +1 -0
  103. package/dist/types/src/extensions/popover/index.d.ts +8 -0
  104. package/dist/types/src/extensions/popover/index.d.ts.map +1 -0
  105. package/dist/types/src/extensions/popover/menu-presets.d.ts +4 -0
  106. package/dist/types/src/extensions/popover/menu-presets.d.ts.map +1 -0
  107. package/dist/types/src/extensions/popover/menu.d.ts +24 -0
  108. package/dist/types/src/extensions/popover/menu.d.ts.map +1 -0
  109. package/dist/types/src/extensions/popover/modal.d.ts +7 -0
  110. package/dist/types/src/extensions/popover/modal.d.ts.map +1 -0
  111. package/dist/types/src/extensions/popover/popover.d.ts +47 -0
  112. package/dist/types/src/extensions/popover/popover.d.ts.map +1 -0
  113. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts +34 -0
  114. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts.map +1 -0
  115. package/dist/types/src/extensions/popover/util.d.ts +8 -0
  116. package/dist/types/src/extensions/popover/util.d.ts.map +1 -0
  117. package/dist/types/src/extensions/preview/preview.d.ts +8 -8
  118. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  119. package/dist/types/src/extensions/replacer.d.ts +21 -0
  120. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  121. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  122. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  123. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  124. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  125. package/dist/types/src/extensions/state.d.ts +2 -0
  126. package/dist/types/src/extensions/state.d.ts.map +1 -0
  127. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  128. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  129. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  130. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  131. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  132. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  133. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  134. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  135. package/dist/types/src/extensions/tags/xml-tags.d.ts +97 -0
  136. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  137. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  138. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  139. package/dist/types/src/hooks/useTextEditor.d.ts +4 -8
  140. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  141. package/dist/types/src/stories/CommandDialog.stories.d.ts +14 -0
  142. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  143. package/dist/types/src/stories/Comments.stories.d.ts +21 -10
  144. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  145. package/dist/types/src/stories/EditorToolbar.stories.d.ts +39 -3
  146. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  147. package/dist/types/src/stories/Experimental.stories.d.ts +22 -13
  148. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  149. package/dist/types/src/stories/Markdown.stories.d.ts +32 -43
  150. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  151. package/dist/types/src/stories/Outliner.stories.d.ts +15 -21
  152. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  153. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  154. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  155. package/dist/types/src/stories/Preview.stories.d.ts +21 -7
  156. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  157. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  158. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  159. package/dist/types/src/stories/TextEditor.stories.d.ts +37 -52
  160. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  161. package/dist/types/src/stories/components/EditorStory.d.ts +6 -9
  162. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  163. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  164. package/dist/types/src/styles/theme.d.ts.map +1 -1
  165. package/dist/types/src/testing/PreviewPopover.d.ts +20 -0
  166. package/dist/types/src/testing/PreviewPopover.d.ts.map +1 -0
  167. package/dist/types/src/testing/index.d.ts +1 -0
  168. package/dist/types/src/testing/index.d.ts.map +1 -1
  169. package/dist/types/src/testing/util.d.ts +1 -0
  170. package/dist/types/src/testing/util.d.ts.map +1 -1
  171. package/dist/types/src/translations.d.ts +1 -1
  172. package/dist/types/src/types/types.d.ts +2 -2
  173. package/dist/types/src/types/types.d.ts.map +1 -1
  174. package/dist/types/src/util/cursor.d.ts.map +1 -1
  175. package/dist/types/src/util/debug.d.ts +1 -1
  176. package/dist/types/src/util/debug.d.ts.map +1 -1
  177. package/dist/types/src/util/decorations.d.ts +4 -0
  178. package/dist/types/src/util/decorations.d.ts.map +1 -0
  179. package/dist/types/src/util/dom.d.ts +2 -12
  180. package/dist/types/src/util/dom.d.ts.map +1 -1
  181. package/dist/types/src/util/index.d.ts +1 -0
  182. package/dist/types/src/util/index.d.ts.map +1 -1
  183. package/dist/types/src/util/react.d.ts +1 -1
  184. package/dist/types/src/util/react.d.ts.map +1 -1
  185. package/dist/types/tsconfig.tsbuildinfo +1 -1
  186. package/package.json +73 -62
  187. package/src/components/Editor/Editor.stories.tsx +69 -0
  188. package/src/components/Editor/Editor.tsx +58 -15
  189. package/src/components/EditorToolbar/EditorToolbar.tsx +106 -95
  190. package/src/components/EditorToolbar/blocks.ts +21 -24
  191. package/src/components/EditorToolbar/formatting.ts +22 -25
  192. package/src/components/EditorToolbar/headings.ts +16 -9
  193. package/src/components/EditorToolbar/image.ts +8 -4
  194. package/src/components/EditorToolbar/lists.ts +16 -19
  195. package/src/components/EditorToolbar/search.ts +8 -4
  196. package/src/components/EditorToolbar/util.ts +20 -25
  197. package/src/components/EditorToolbar/view-mode.ts +11 -6
  198. package/src/components/index.ts +0 -1
  199. package/src/defaults.ts +5 -2
  200. package/src/extensions/autocomplete/autocomplete.ts +220 -0
  201. package/src/extensions/autocomplete/index.ts +8 -0
  202. package/src/extensions/autocomplete/match.ts +46 -0
  203. package/src/extensions/{command → autocomplete}/placeholder.ts +22 -18
  204. package/src/extensions/{command → autocomplete}/typeahead.ts +8 -50
  205. package/src/extensions/automerge/automerge.stories.tsx +32 -25
  206. package/src/extensions/automerge/automerge.ts +31 -11
  207. package/src/extensions/automerge/cursor.ts +1 -1
  208. package/src/extensions/automerge/defs.ts +1 -1
  209. package/src/extensions/automerge/sync.ts +9 -5
  210. package/src/extensions/automerge/update-automerge.ts +2 -2
  211. package/src/extensions/autoscroll.ts +163 -0
  212. package/src/extensions/awareness/awareness-provider.ts +2 -2
  213. package/src/extensions/awareness/awareness.ts +2 -2
  214. package/src/extensions/blocks.ts +131 -0
  215. package/src/extensions/bookmarks.ts +75 -0
  216. package/src/extensions/comments.ts +20 -14
  217. package/src/extensions/dnd.ts +1 -1
  218. package/src/extensions/factories.ts +54 -35
  219. package/src/extensions/focus.ts +5 -4
  220. package/src/extensions/folding.tsx +3 -6
  221. package/src/extensions/hashtag.tsx +2 -2
  222. package/src/extensions/index.ts +8 -1
  223. package/src/extensions/json.ts +1 -1
  224. package/src/extensions/listener.ts +14 -20
  225. package/src/extensions/markdown/action.ts +2 -1
  226. package/src/extensions/markdown/bundle.ts +40 -6
  227. package/src/extensions/markdown/changes.ts +1 -1
  228. package/src/extensions/markdown/decorate.ts +32 -22
  229. package/src/extensions/markdown/formatting.test.ts +6 -6
  230. package/src/extensions/markdown/formatting.ts +11 -11
  231. package/src/extensions/markdown/highlight.ts +2 -2
  232. package/src/extensions/markdown/image.ts +5 -6
  233. package/src/extensions/markdown/link.ts +3 -0
  234. package/src/extensions/markdown/table.ts +13 -7
  235. package/src/extensions/mention.ts +1 -1
  236. package/src/extensions/modes.ts +2 -2
  237. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
  238. package/src/extensions/outliner/outliner.test.ts +3 -2
  239. package/src/extensions/outliner/outliner.ts +7 -6
  240. package/src/extensions/outliner/selection.ts +1 -1
  241. package/src/extensions/outliner/tree.test.ts +2 -1
  242. package/src/extensions/outliner/tree.ts +2 -2
  243. package/src/extensions/popover/PopoverMenuProvider.tsx +220 -0
  244. package/src/extensions/popover/index.ts +12 -0
  245. package/src/extensions/popover/menu-presets.ts +124 -0
  246. package/src/extensions/popover/menu.ts +67 -0
  247. package/src/extensions/popover/modal.ts +24 -0
  248. package/src/extensions/popover/popover.ts +289 -0
  249. package/src/extensions/popover/usePopoverMenu.ts +173 -0
  250. package/src/extensions/popover/util.ts +29 -0
  251. package/src/extensions/preview/index.ts +1 -1
  252. package/src/extensions/preview/preview.ts +69 -69
  253. package/src/extensions/replacer.test.ts +75 -0
  254. package/src/extensions/replacer.ts +93 -0
  255. package/src/extensions/scrolling.ts +189 -0
  256. package/src/extensions/selection.ts +3 -3
  257. package/src/extensions/state.ts +7 -0
  258. package/src/extensions/tags/extended-markdown.test.ts +262 -0
  259. package/src/extensions/tags/extended-markdown.ts +78 -0
  260. package/src/extensions/tags/index.ts +7 -0
  261. package/src/extensions/tags/streamer.ts +243 -0
  262. package/src/extensions/tags/xml-tags.ts +500 -0
  263. package/src/extensions/tags/xml-util.ts +94 -0
  264. package/src/extensions/typewriter.ts +1 -1
  265. package/src/hooks/useTextEditor.ts +27 -39
  266. package/src/stories/CommandDialog.stories.tsx +83 -0
  267. package/src/stories/Comments.stories.tsx +15 -11
  268. package/src/stories/EditorToolbar.stories.tsx +17 -17
  269. package/src/stories/Experimental.stories.tsx +17 -13
  270. package/src/stories/Markdown.stories.tsx +25 -21
  271. package/src/stories/Outliner.stories.tsx +54 -35
  272. package/src/stories/Popover.stories.tsx +161 -0
  273. package/src/stories/Preview.stories.tsx +48 -40
  274. package/src/stories/Tags.stories.tsx +95 -0
  275. package/src/stories/TextEditor.stories.tsx +41 -60
  276. package/src/stories/components/EditorStory.tsx +19 -18
  277. package/src/stories/components/util.tsx +39 -6
  278. package/src/styles/markdown.ts +1 -1
  279. package/src/styles/theme.ts +16 -12
  280. package/src/testing/PreviewPopover.tsx +80 -0
  281. package/src/testing/index.ts +1 -0
  282. package/src/testing/util.ts +2 -0
  283. package/src/translations.ts +1 -1
  284. package/src/types/types.ts +1 -1
  285. package/src/util/cursor.ts +2 -1
  286. package/src/util/debug.ts +2 -2
  287. package/src/util/decorations.ts +21 -0
  288. package/src/util/dom.ts +5 -27
  289. package/src/util/index.ts +1 -0
  290. package/src/util/react.tsx +1 -1
  291. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  292. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  293. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  294. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  295. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  296. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  297. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  298. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  299. package/dist/types/src/components/Popover/index.d.ts +0 -4
  300. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  301. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  302. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  303. package/dist/types/src/extensions/command/action.d.ts +0 -17
  304. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  305. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  306. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  307. package/dist/types/src/extensions/command/command.d.ts +0 -6
  308. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  309. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  310. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  311. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  312. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  313. package/dist/types/src/extensions/command/index.d.ts +0 -7
  314. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  315. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  316. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  317. package/dist/types/src/extensions/command/state.d.ts +0 -16
  318. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  319. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  320. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  321. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  322. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  323. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  324. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  325. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  326. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  327. package/src/components/Popover/CommandMenu.tsx +0 -279
  328. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  329. package/src/components/Popover/RefPopover.tsx +0 -99
  330. package/src/components/Popover/index.ts +0 -7
  331. package/src/extensions/autocomplete.ts +0 -69
  332. package/src/extensions/command/action.ts +0 -56
  333. package/src/extensions/command/command-menu.ts +0 -210
  334. package/src/extensions/command/command.ts +0 -34
  335. package/src/extensions/command/hint.ts +0 -102
  336. package/src/extensions/command/index.ts +0 -10
  337. package/src/extensions/command/state.ts +0 -89
  338. package/src/extensions/command/useCommandMenu.ts +0 -118
  339. package/src/stories/Command.stories.tsx +0 -97
  340. package/src/stories/CommandMenu.stories.tsx +0 -159
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/react-ui-editor",
3
- "version": "0.8.4-main.3f58842",
3
+ "version": "0.8.4-main.548089c",
4
4
  "description": "Document editing experience within a DXOS shell.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -10,16 +10,19 @@
10
10
  "type": "module",
11
11
  "exports": {
12
12
  ".": {
13
+ "source": "./src/index.ts",
13
14
  "types": "./dist/types/src/index.d.ts",
14
15
  "browser": "./dist/lib/browser/index.mjs",
15
16
  "node": "./dist/lib/node-esm/index.mjs"
16
17
  },
17
18
  "./types": {
19
+ "source": "./src/types/index.ts",
18
20
  "types": "./dist/types/src/types/index.d.ts",
19
21
  "browser": "./dist/lib/browser/types/index.mjs",
20
22
  "node": "./dist/lib/node-esm/types/index.mjs"
21
23
  },
22
24
  "./testing": {
25
+ "source": "./src/testing/index.ts",
23
26
  "types": "./dist/types/src/testing/index.d.ts",
24
27
  "browser": "./dist/lib/browser/testing/index.mjs",
25
28
  "node": "./dist/lib/node-esm/testing/index.mjs"
@@ -34,29 +37,34 @@
34
37
  "src"
35
38
  ],
36
39
  "dependencies": {
37
- "@automerge/automerge": "3.0.0",
38
- "@codemirror/autocomplete": "^6.18.1",
39
- "@codemirror/commands": "^6.6.2",
40
- "@codemirror/lang-javascript": "^6.2.2",
41
- "@codemirror/lang-json": "^6.0.1",
42
- "@codemirror/lang-markdown": "^6.3.0",
43
- "@codemirror/language": "^6.10.3",
40
+ "@automerge/automerge": "3.1.2",
41
+ "@codemirror/autocomplete": "^6.19.0",
42
+ "@codemirror/commands": "^6.8.1",
43
+ "@codemirror/lang-html": "^6.4.11",
44
+ "@codemirror/lang-javascript": "^6.2.4",
45
+ "@codemirror/lang-json": "^6.0.2",
46
+ "@codemirror/lang-markdown": "^6.3.4",
47
+ "@codemirror/lang-xml": "^6.1.0",
48
+ "@codemirror/lang-yaml": "^6.1.2",
49
+ "@codemirror/language": "^6.11.3",
44
50
  "@codemirror/language-data": "^6.5.1",
45
- "@codemirror/lint": "^6.8.2",
46
- "@codemirror/search": "^6.5.6",
47
- "@codemirror/state": "^6.4.1",
48
- "@codemirror/theme-one-dark": "^6.1.2",
49
- "@codemirror/view": "^6.34.1",
51
+ "@codemirror/lint": "^6.8.5",
52
+ "@codemirror/search": "^6.5.11",
53
+ "@codemirror/state": "^6.5.2",
54
+ "@codemirror/theme-one-dark": "^6.1.3",
55
+ "@codemirror/view": "^6.38.4",
50
56
  "@fluentui/react-tabster": "^9.24.2",
51
57
  "@lezer/common": "^1.2.2",
52
58
  "@lezer/generator": "^1.7.1",
53
59
  "@lezer/highlight": "^1.2.1",
54
60
  "@lezer/markdown": "^1.3.1",
55
61
  "@preact-signals/safe-react": "^0.9.0",
56
- "@preact/signals-react": "^3.2.0",
62
+ "@preact/signals-react": "^3.3.0",
57
63
  "@radix-ui/react-context": "1.1.1",
64
+ "@radix-ui/react-use-controllable-state": "1.1.0",
58
65
  "@replit/codemirror-vim": "^6.2.1",
59
66
  "@replit/codemirror-vscode-keymap": "^6.0.2",
67
+ "@uiw/codemirror-theme-vscode": "^4.25.2",
60
68
  "ajv": "^8.17.1",
61
69
  "codemirror": "^6.0.1",
62
70
  "lib0": "^0.2.65",
@@ -64,70 +72,73 @@
64
72
  "lodash.merge": "^4.6.2",
65
73
  "lodash.sortby": "^4.7.0",
66
74
  "style-mod": "^4.1.0",
67
- "@dxos/app-graph": "0.8.4-main.3f58842",
68
- "@dxos/async": "0.8.4-main.3f58842",
69
- "@dxos/debug": "0.8.4-main.3f58842",
70
- "@dxos/context": "0.8.4-main.3f58842",
71
- "@dxos/display-name": "0.8.4-main.3f58842",
72
- "@dxos/echo-schema": "0.8.4-main.3f58842",
73
- "@dxos/invariant": "0.8.4-main.3f58842",
74
- "@dxos/lit-ui": "0.8.4-main.3f58842",
75
- "@dxos/live-object": "0.8.4-main.3f58842",
76
- "@dxos/log": "0.8.4-main.3f58842",
77
- "@dxos/react-hooks": "0.8.4-main.3f58842",
78
- "@dxos/protocols": "0.8.4-main.3f58842",
79
- "@dxos/react-ui-menu": "0.8.4-main.3f58842",
80
- "@dxos/react-ui-stack": "0.8.4-main.3f58842",
81
- "@dxos/util": "0.8.4-main.3f58842"
75
+ "@dxos/app-graph": "0.8.4-main.548089c",
76
+ "@dxos/client": "0.8.4-main.548089c",
77
+ "@dxos/async": "0.8.4-main.548089c",
78
+ "@dxos/context": "0.8.4-main.548089c",
79
+ "@dxos/display-name": "0.8.4-main.548089c",
80
+ "@dxos/echo": "0.8.4-main.548089c",
81
+ "@dxos/invariant": "0.8.4-main.548089c",
82
+ "@dxos/debug": "0.8.4-main.548089c",
83
+ "@dxos/live-object": "0.8.4-main.548089c",
84
+ "@dxos/log": "0.8.4-main.548089c",
85
+ "@dxos/lit-ui": "0.8.4-main.548089c",
86
+ "@dxos/protocols": "0.8.4-main.548089c",
87
+ "@dxos/react-hooks": "0.8.4-main.548089c",
88
+ "@dxos/react-ui-menu": "0.8.4-main.548089c",
89
+ "@dxos/react-ui-stack": "0.8.4-main.548089c",
90
+ "@dxos/util": "0.8.4-main.548089c",
91
+ "@dxos/react-ui-types": "0.8.4-main.548089c"
82
92
  },
83
93
  "devDependencies": {
84
- "@automerge/automerge": "3.0.0",
85
- "@automerge/automerge-repo": "2.0.8",
86
- "@automerge/automerge-repo-network-broadcastchannel": "2.0.8",
87
- "@effect-rx/rx-react": "0.38.0",
88
- "@effect/platform": "0.89.0",
94
+ "@automerge/automerge": "3.1.2",
95
+ "@automerge/automerge-repo": "2.4.0",
96
+ "@automerge/automerge-repo-network-broadcastchannel": "2.4.0",
97
+ "@effect-atom/atom-react": "^0.3.4",
98
+ "@effect/platform": "0.92.1",
89
99
  "@types/chai": "^4.2.15",
90
100
  "@types/chai-dom": "^1.11.0",
91
101
  "@types/lodash.defaultsdeep": "^4.6.6",
92
102
  "@types/lodash.merge": "^4.6.6",
93
103
  "@types/lodash.sortby": "^4.7.7",
94
- "@types/react": "~18.2.0",
95
- "@types/react-dom": "~18.2.0",
104
+ "@types/react": "~19.2.2",
105
+ "@types/react-dom": "~19.2.2",
96
106
  "@types/react-test-renderer": "^17.0.2",
97
107
  "chai": "^4.4.1",
98
108
  "chai-dom": "^1.11.0",
99
- "effect": "3.17.0",
109
+ "effect": "3.18.3",
100
110
  "happy-dom": "^13.3.1",
101
- "jsdom": "^24.0.0",
111
+ "jsdom": "^27.0.0",
102
112
  "mocha": "^10.6.0",
103
- "react": "~18.2.0",
104
- "react-dom": "~18.2.0",
105
- "react-test-renderer": "~18.2.0",
106
- "vite": "5.4.7",
107
- "vite-plugin-top-level-await": "^1.4.1",
108
- "vite-plugin-wasm": "^3.3.0",
109
- "@dxos/config": "0.8.4-main.3f58842",
110
- "@dxos/echo": "0.8.4-main.3f58842",
111
- "@dxos/echo-signals": "0.8.4-main.3f58842",
112
- "@dxos/keyboard": "0.8.4-main.3f58842",
113
- "@dxos/random": "0.8.4-main.3f58842",
114
- "@dxos/react-client": "0.8.4-main.3f58842",
115
- "@dxos/react-ui": "0.8.4-main.3f58842",
116
- "@dxos/react-ui-attention": "0.8.4-main.3f58842",
117
- "@dxos/react-ui-syntax-highlighter": "0.8.4-main.3f58842",
118
- "@dxos/schema": "0.8.4-main.3f58842",
119
- "@dxos/react-ui-theme": "0.8.4-main.3f58842",
120
- "@dxos/storybook-utils": "0.8.4-main.3f58842"
113
+ "react": "~19.2.0",
114
+ "react-dom": "~19.2.0",
115
+ "react-test-renderer": "~19.2.0",
116
+ "vite": "7.1.9",
117
+ "vite-plugin-top-level-await": "^1.6.0",
118
+ "vite-plugin-wasm": "^3.5.0",
119
+ "@dxos/config": "0.8.4-main.548089c",
120
+ "@dxos/echo": "0.8.4-main.548089c",
121
+ "@dxos/echo-signals": "0.8.4-main.548089c",
122
+ "@dxos/react-client": "0.8.4-main.548089c",
123
+ "@dxos/random": "0.8.4-main.548089c",
124
+ "@dxos/keyboard": "0.8.4-main.548089c",
125
+ "@dxos/react-ui": "0.8.4-main.548089c",
126
+ "@dxos/react-ui-attention": "0.8.4-main.548089c",
127
+ "@dxos/react-ui-stack": "0.8.4-main.548089c",
128
+ "@dxos/react-ui-syntax-highlighter": "0.8.4-main.548089c",
129
+ "@dxos/react-ui-theme": "0.8.4-main.548089c",
130
+ "@dxos/schema": "0.8.4-main.548089c",
131
+ "@dxos/storybook-utils": "0.8.4-main.548089c"
121
132
  },
122
133
  "peerDependencies": {
123
- "@effect-rx/rx-react": "^0.34.1",
134
+ "@effect-atom/atom-react": "^0.3.4",
124
135
  "@effect/platform": "^0.80.12",
125
136
  "effect": "^3.13.3",
126
- "react": "~18.2.0",
127
- "react-dom": "~18.2.0",
128
- "@dxos/react-client": "0.8.4-main.3f58842",
129
- "@dxos/react-ui": "0.8.4-main.3f58842",
130
- "@dxos/react-ui-theme": "0.8.4-main.3f58842"
137
+ "react": "^19.0.0",
138
+ "react-dom": "^19.0.0",
139
+ "@dxos/react-client": "0.8.4-main.548089c",
140
+ "@dxos/react-ui-theme": "0.8.4-main.548089c",
141
+ "@dxos/react-ui": "0.8.4-main.548089c"
131
142
  },
132
143
  "publishConfig": {
133
144
  "access": "public"
@@ -0,0 +1,69 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+ import { useMemo } from 'react';
8
+
9
+ import { createDocAccessor, createObject } from '@dxos/client/echo';
10
+ import { useThemeContext } from '@dxos/react-ui';
11
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
12
+ import { Text } from '@dxos/schema';
13
+
14
+ import { automerge, createBasicExtensions, createThemeExtensions } from '../../extensions';
15
+ import { Editor } from '../Editor';
16
+
17
+ const meta = {
18
+ title: 'ui/react-ui-editor/Editor',
19
+ component: Editor,
20
+ decorators: [withTheme, withLayout({ container: 'column' })],
21
+ } satisfies Meta<typeof Editor>;
22
+
23
+ export default meta;
24
+
25
+ type Story = StoryObj<typeof meta>;
26
+
27
+ export const Default: Story = {
28
+ render: (args) => {
29
+ const { themeMode } = useThemeContext();
30
+ const extensions = useMemo(
31
+ () => [
32
+ // Basic extensions.
33
+ createBasicExtensions(),
34
+ createThemeExtensions({ themeMode }),
35
+ ],
36
+ [],
37
+ );
38
+
39
+ return <Editor classNames='p-2' {...args} extensions={extensions} />;
40
+ },
41
+ args: {
42
+ moveToEnd: true,
43
+ value: 'Hello world!',
44
+ onChange: (value) => console.log(value),
45
+ },
46
+ };
47
+
48
+ export const Automerge: Story = {
49
+ render: ({ value, ...props }) => {
50
+ const { themeMode } = useThemeContext();
51
+ const extensions = useMemo(
52
+ () => [
53
+ // Basic extensions.
54
+ createBasicExtensions(),
55
+ createThemeExtensions({ themeMode }),
56
+ automerge(createDocAccessor(createObject(Text.make(value)), ['content'])),
57
+ ],
58
+ [],
59
+ );
60
+
61
+ // TODO(burdon): Remove the need for initialValue.
62
+ return <Editor classNames='p-2' {...props} initialValue={value} extensions={extensions} />;
63
+ },
64
+ args: {
65
+ moveToEnd: true,
66
+ value: 'Hello world!',
67
+ onChange: (value) => console.log(value),
68
+ },
69
+ };
@@ -2,38 +2,81 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { type EditorView } from '@codemirror/view';
6
- import React, { forwardRef, useImperativeHandle } from 'react';
5
+ import { Transaction } from '@codemirror/state';
6
+ import { EditorView } from '@codemirror/view';
7
+ import React, { forwardRef, useEffect, useImperativeHandle } from 'react';
7
8
 
8
- import { type ThemedClassName, useThemeContext } from '@dxos/react-ui';
9
+ import { type ThemedClassName } from '@dxos/react-ui';
9
10
  import { mx } from '@dxos/react-ui-theme';
10
- import { type DataType } from '@dxos/schema';
11
11
 
12
- import { useTextEditor, type UseTextEditorProps } from '../../hooks';
12
+ import { initialSync } from '../../extensions';
13
+ import { type UseTextEditorProps, useTextEditor } from '../../hooks';
14
+
15
+ // TODO(burdon): Convert to radix-style (support hooks inside).
16
+ // <Editor.Root>
17
+ // <Editor.Toolbar />
18
+ // <Editor.TextEditor />
19
+ // </Editor.Root>
20
+
21
+ export type EditorController = {
22
+ view: EditorView | null;
23
+ focus: () => void;
24
+ };
13
25
 
14
26
  export type EditorProps = ThemedClassName<
15
27
  {
16
- id: string;
17
- text: DataType.Text;
18
- } & Omit<UseTextEditorProps, 'id'>
28
+ moveToEnd?: boolean;
29
+ value?: string;
30
+ onChange?: (value: string) => void;
31
+ } & UseTextEditorProps
19
32
  >;
20
33
 
21
34
  /**
22
35
  * Minimal text editor.
36
+ * NOTE: This shouold not be used with the automerge extension.
23
37
  */
24
- export const Editor = forwardRef<EditorView | undefined, EditorProps>(
25
- ({ classNames, id, text, ...props }, forwardedRef) => {
26
- const { themeMode } = useThemeContext();
38
+ export const Editor = forwardRef<EditorController, EditorProps>(
39
+ ({ classNames, id, extensions, moveToEnd, value, onChange, ...props }, forwardedRef) => {
27
40
  const { parentRef, focusAttributes, view } = useTextEditor(
28
41
  () => ({
29
42
  id,
30
- initialValue: text.content,
43
+ initialValue: value,
44
+ extensions: [
45
+ extensions ?? [],
46
+ EditorView.updateListener.of(({ view, docChanged, transactions }) => {
47
+ const isInitialSync = transactions.some((tr) => tr.annotation(Transaction.userEvent) === initialSync.value);
48
+ if (!isInitialSync && docChanged) {
49
+ onChange?.(view.state.doc.toString());
50
+ }
51
+ }),
52
+ ],
31
53
  ...props,
32
54
  }),
33
- [id, text, themeMode],
55
+ [id, extensions, onChange],
34
56
  );
35
57
 
36
- useImperativeHandle(forwardedRef, () => view, [view]);
37
- return <div ref={parentRef} className={mx(classNames)} {...focusAttributes} />;
58
+ // External controller.
59
+ useImperativeHandle(
60
+ forwardedRef,
61
+ () => ({
62
+ view,
63
+ focus: () => view?.focus(),
64
+ }),
65
+ [view],
66
+ );
67
+
68
+ // Set initial value and cursor position.
69
+ useEffect(() => {
70
+ requestAnimationFrame(() => {
71
+ view?.dispatch({
72
+ annotations: initialSync,
73
+ changes: value ? [{ from: 0, to: view?.state.doc.length ?? 0, insert: value ?? '' }] : [],
74
+ selection: moveToEnd ? { anchor: view?.state.doc.length ?? 0 } : undefined,
75
+ });
76
+ view?.focus();
77
+ });
78
+ }, [view, value, moveToEnd]);
79
+
80
+ return <div role='none' className={mx('is-full', classNames)} {...focusAttributes} ref={parentRef} />;
38
81
  },
39
82
  );
@@ -2,12 +2,20 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
5
+ import { Atom } from '@effect-atom/atom-react';
6
6
  import React, { memo, useMemo } from 'react';
7
7
 
8
- import { rxFromSignal, type NodeArg } from '@dxos/app-graph';
9
- import { ElevationProvider } from '@dxos/react-ui';
10
- import { MenuProvider, ToolbarMenu, createGapSeparator, useMenuActions } from '@dxos/react-ui-menu';
8
+ import { rxFromSignal } from '@dxos/app-graph';
9
+ import { ElevationProvider, type ThemedClassName } from '@dxos/react-ui';
10
+ import {
11
+ type ActionGraphProps,
12
+ MenuProvider,
13
+ ToolbarMenu,
14
+ createGapSeparator,
15
+ useMenuActions,
16
+ } from '@dxos/react-ui-menu';
17
+
18
+ import { type EditorViewMode } from '../../types';
11
19
 
12
20
  import { createBlocks } from './blocks';
13
21
  import { createFormatting } from './formatting';
@@ -15,110 +23,113 @@ import { createHeadings } from './headings';
15
23
  import { createImageUpload } from './image';
16
24
  import { createLists } from './lists';
17
25
  import { createSearch } from './search';
18
- import { type EditorToolbarActionGraphProps, type EditorToolbarFeatureFlags, type EditorToolbarProps } from './util';
26
+ import { type EditorToolbarActionGraphProps } from './util';
19
27
  import { createViewMode } from './view-mode';
20
28
 
21
- const createToolbar = ({
22
- getView,
29
+ export type EditorToolbarFeatureFlags = Partial<{
30
+ showHeadings: boolean;
31
+ showFormatting: boolean;
32
+ showLists: boolean;
33
+ showBlocks: boolean;
34
+ showSearch: boolean;
35
+
36
+ // TODO(wittjosiah): Factor out (depends on plugin-level capabilities.)
37
+ onImageUpload: () => void;
38
+ onViewModeChange: (mode: EditorViewMode) => void;
39
+ }>;
40
+
41
+ export type EditorToolbarProps = ThemedClassName<
42
+ {
43
+ role?: string;
44
+ attendableId?: string;
45
+ } & (EditorToolbarActionGraphProps & EditorToolbarFeatureFlags)
46
+ >;
47
+
48
+ // TODO(burdon): Remove role dependency.
49
+ export const EditorToolbar = memo(({ classNames, role, attendableId, ...props }: EditorToolbarProps) => {
50
+ const menuProps = useEditorToolbarActionGraph(props);
51
+
52
+ return (
53
+ <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>
54
+ <MenuProvider {...menuProps} attendableId={attendableId}>
55
+ <ToolbarMenu classNames={classNames} textBlockWidth />
56
+ </MenuProvider>
57
+ </ElevationProvider>
58
+ );
59
+ });
60
+
61
+ type ToolbarActionsProps = Pick<EditorToolbarActionGraphProps, 'state' | 'getView' | 'customActions'> &
62
+ EditorToolbarFeatureFlags;
63
+
64
+ // TODO(wittjosiah): Toolbar re-rendering is causing this graph to be recreated and breaking reactivity in some cases.
65
+ // E.g. for toolbar dropdowns which use active icon, the icon is not updated when the active item changes.
66
+ // This is currently only happening in the markdown plugin usage and should be reproduced in an editor story.
67
+ const useEditorToolbarActionGraph = ({ state, getView, customActions, ...features }: ToolbarActionsProps) => {
68
+ const menuCreator = useMemo(
69
+ () => createToolbarActions({ state, getView, customActions, ...features }),
70
+ [
71
+ state,
72
+ getView,
73
+ customActions,
74
+ features?.showHeadings,
75
+ features?.showFormatting,
76
+ features?.showLists,
77
+ features?.showBlocks,
78
+ features?.showSearch,
79
+ features?.onImageUpload,
80
+ features?.onViewModeChange,
81
+ ],
82
+ );
83
+
84
+ return useMenuActions(menuCreator);
85
+ };
86
+
87
+ const createToolbarActions = ({
23
88
  state,
89
+ getView,
24
90
  customActions,
25
91
  ...features
26
- }: EditorToolbarFeatureFlags & Pick<EditorToolbarActionGraphProps, 'getView' | 'state' | 'customActions'>): Rx.Rx<{
27
- nodes: NodeArg<any>[];
28
- edges: { source: string; target: string }[];
29
- }> => {
30
- return Rx.make((get) => {
31
- const nodes = [];
32
- const edges = [];
33
- if (features.headings ?? true) {
34
- const headings = get(rxFromSignal(() => createHeadings(state, getView)));
35
- nodes.push(...headings.nodes);
36
- edges.push(...headings.edges);
92
+ }: ToolbarActionsProps): Atom.Atom<ActionGraphProps> => {
93
+ return Atom.make((get) => {
94
+ const graph: ActionGraphProps = {
95
+ nodes: [],
96
+ edges: [],
97
+ };
98
+
99
+ // TODO(burdon): Builder pattern?
100
+ const addSubGraph = (graph: ActionGraphProps, subGraph: ActionGraphProps) => {
101
+ graph.nodes.push(...subGraph.nodes);
102
+ graph.edges.push(...subGraph.edges);
103
+ };
104
+
105
+ if (features?.showHeadings ?? true) {
106
+ addSubGraph(graph, get(rxFromSignal(() => createHeadings(state, getView))));
37
107
  }
38
- if (features.formatting ?? true) {
39
- const formatting = get(rxFromSignal(() => createFormatting(state, getView)));
40
- nodes.push(...formatting.nodes);
41
- edges.push(...formatting.edges);
108
+ if (features?.showFormatting ?? true) {
109
+ addSubGraph(graph, get(rxFromSignal(() => createFormatting(state, getView))));
42
110
  }
43
- if (features.lists ?? true) {
44
- const lists = get(rxFromSignal(() => createLists(state, getView)));
45
- nodes.push(...lists.nodes);
46
- edges.push(...lists.edges);
111
+ if (features?.showLists ?? true) {
112
+ addSubGraph(graph, get(rxFromSignal(() => createLists(state, getView))));
47
113
  }
48
- if (features.blocks ?? true) {
49
- const blocks = get(rxFromSignal(() => createBlocks(state, getView)));
50
- nodes.push(...blocks.nodes);
51
- edges.push(...blocks.edges);
114
+ if (features?.showBlocks ?? true) {
115
+ addSubGraph(graph, get(rxFromSignal(() => createBlocks(state, getView))));
52
116
  }
53
- if (features.image) {
54
- const image = get(rxFromSignal(() => createImageUpload(features.image!)));
55
- nodes.push(...image.nodes);
56
- edges.push(...image.edges);
117
+ if (features?.onImageUpload) {
118
+ addSubGraph(graph, get(rxFromSignal(() => createImageUpload(features.onImageUpload!))));
57
119
  }
58
- const editorToolbarGap = createGapSeparator();
59
- nodes.push(...editorToolbarGap.nodes);
60
- edges.push(...editorToolbarGap.edges);
120
+
121
+ addSubGraph(graph, createGapSeparator());
122
+
61
123
  if (customActions) {
62
- const custom = get(customActions);
63
- nodes.push(...custom.nodes);
64
- edges.push(...custom.edges);
124
+ addSubGraph(graph, get(customActions));
65
125
  }
66
- if (features.search ?? true) {
67
- const search = get(rxFromSignal(() => createSearch(getView)));
68
- nodes.push(...search.nodes);
69
- edges.push(...search.edges);
126
+ if (features?.showSearch ?? true) {
127
+ addSubGraph(graph, get(rxFromSignal(() => createSearch(getView))));
70
128
  }
71
- if (features.viewMode) {
72
- const viewMode = get(rxFromSignal(() => createViewMode(state, features.viewMode!)));
73
- nodes.push(...viewMode.nodes);
74
- edges.push(...viewMode.edges);
129
+ if (features?.onViewModeChange) {
130
+ addSubGraph(graph, get(rxFromSignal(() => createViewMode(state, features.onViewModeChange!))));
75
131
  }
76
- return { nodes, edges };
77
- });
78
- };
79
132
 
80
- // TODO(wittjosiah): Toolbar re-rendering is causing this graph to be recreated and breaking reactivity in some cases.
81
- // E.g. for toolbar dropdowns which use active icon, the icon is not updated when the active item changes.
82
- // This is currently only happening in the markdown plugin usage and should be reproduced in an editor story.
83
- const useEditorToolbarActionGraph = (props: EditorToolbarProps) => {
84
- const menuCreator = useMemo(
85
- () =>
86
- createToolbar({
87
- getView: props.getView,
88
- state: props.state,
89
- customActions: props.customActions,
90
- headings: props.headings,
91
- formatting: props.formatting,
92
- lists: props.lists,
93
- blocks: props.blocks,
94
- image: props.image,
95
- search: props.search,
96
- viewMode: props.viewMode,
97
- }),
98
- [
99
- props.getView,
100
- props.state,
101
- props.customActions,
102
- props.headings,
103
- props.formatting,
104
- props.lists,
105
- props.blocks,
106
- props.image,
107
- props.search,
108
- props.viewMode,
109
- ],
110
- );
111
-
112
- return useMenuActions(menuCreator);
133
+ return graph;
134
+ });
113
135
  };
114
-
115
- export const EditorToolbar = memo(({ classNames, attendableId, role, ...props }: EditorToolbarProps) => {
116
- const menuProps = useEditorToolbarActionGraph(props);
117
- return (
118
- <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>
119
- <MenuProvider {...menuProps} attendableId={attendableId}>
120
- <ToolbarMenu classNames={classNames} textBlockWidth />
121
- </MenuProvider>
122
- </ElevationProvider>
123
- );
124
- });
@@ -7,8 +7,9 @@ import { type EditorView } from '@codemirror/view';
7
7
  import { type NodeArg } from '@dxos/app-graph';
8
8
  import { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
9
9
 
10
- import { createEditorAction, createEditorActionGroup, type EditorToolbarState } from './util';
11
- import { removeBlockquote, addBlockquote, removeCodeblock, addCodeblock, insertTable } from '../../extensions';
10
+ import { addBlockquote, addCodeblock, insertTable, removeBlockquote, removeCodeblock } from '../../extensions';
11
+
12
+ import { type EditorToolbarState, createEditorAction, createEditorActionGroup } from './util';
12
13
 
13
14
  const createBlockGroupAction = (value: string) =>
14
15
  createEditorActionGroup('block', {
@@ -24,28 +25,24 @@ const createBlockActions = (value: string, getView: () => EditorView, blankLine?
24
25
  table: 'ph--table--regular',
25
26
  }).map(([type, icon]) => {
26
27
  const checked = type === value;
27
- return createEditorAction(
28
- type,
29
- () => {
30
- const view = getView();
31
- if (!view) {
32
- return;
33
- }
34
-
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
- { checked, ...(type === 'table' && { disabled: !!blankLine }), icon },
48
- );
28
+ return createEditorAction(type, { checked, ...(type === 'table' && { disabled: !!blankLine }), icon }, () => {
29
+ const view = getView();
30
+ if (!view) {
31
+ return;
32
+ }
33
+
34
+ switch (type) {
35
+ case 'blockquote':
36
+ checked ? removeBlockquote(view) : addBlockquote(view);
37
+ break;
38
+ case 'codeblock':
39
+ checked ? removeCodeblock(view) : addCodeblock(view);
40
+ break;
41
+ case 'table':
42
+ insertTable(view);
43
+ break;
44
+ }
45
+ });
49
46
  });
50
47
 
51
48
  export const createBlocks = (state: EditorToolbarState, getView: () => EditorView) => {