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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (356) hide show
  1. package/dist/lib/browser/{chunk-22UMM3QJ.mjs → chunk-HL3YF6WC.mjs} +2 -2
  2. package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +7471 -5897
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/types/index.mjs +1 -1
  7. package/dist/lib/node-esm/{chunk-YXYQPV6R.mjs → chunk-YJZGD3LY.mjs} +2 -2
  8. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +7 -0
  9. package/dist/lib/node-esm/index.mjs +7471 -5897
  10. package/dist/lib/node-esm/index.mjs.map +4 -4
  11. package/dist/lib/node-esm/meta.json +1 -1
  12. package/dist/lib/node-esm/types/index.mjs +1 -1
  13. package/dist/types/src/components/Editor/Editor.d.ts +37 -15
  14. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  15. package/dist/types/src/components/Editor/Editor.stories.d.ts +20 -0
  16. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  17. package/dist/types/src/components/EditorContent/EditorContent.d.ts +29 -0
  18. package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +1 -0
  19. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts +26 -0
  20. package/dist/types/src/components/EditorContent/EditorContent.stories.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorContent/controller.d.ts +10 -0
  22. package/dist/types/src/components/EditorContent/controller.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorContent/index.d.ts +3 -0
  24. package/dist/types/src/components/EditorContent/index.d.ts.map +1 -0
  25. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +36 -0
  26. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorMenuProvider/index.d.ts +7 -0
  28. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  29. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  30. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  32. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  33. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +47 -0
  34. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  35. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  36. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  37. package/dist/types/src/components/EditorMenuProvider/util.d.ts +8 -0
  38. package/dist/types/src/components/EditorMenuProvider/util.d.ts.map +1 -0
  39. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  40. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  41. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  42. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  43. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +26 -2
  44. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/actions.d.ts +39 -0
  46. package/dist/types/src/components/EditorToolbar/actions.d.ts.map +1 -0
  47. package/dist/types/src/components/EditorToolbar/blocks.d.ts +3 -3
  48. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  49. package/dist/types/src/components/EditorToolbar/formatting.d.ts +3 -3
  50. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  51. package/dist/types/src/components/EditorToolbar/headings.d.ts +3 -3
  52. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  53. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  54. package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
  55. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  56. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  57. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
  58. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
  59. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +3 -3
  60. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  61. package/dist/types/src/components/index.d.ts +4 -2
  62. package/dist/types/src/components/index.d.ts.map +1 -1
  63. package/dist/types/src/defaults.d.ts.map +1 -1
  64. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +17 -0
  65. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +1 -0
  66. package/dist/types/src/extensions/autocomplete/index.d.ts +5 -0
  67. package/dist/types/src/extensions/autocomplete/index.d.ts.map +1 -0
  68. package/dist/types/src/extensions/autocomplete/match.d.ts +13 -0
  69. package/dist/types/src/extensions/autocomplete/match.d.ts.map +1 -0
  70. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +20 -0
  71. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +1 -0
  72. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +10 -0
  73. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +1 -0
  74. package/dist/types/src/extensions/automerge/automerge.d.ts +1 -1
  75. package/dist/types/src/extensions/automerge/automerge.d.ts.map +1 -1
  76. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +10 -19
  77. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +1 -1
  78. package/dist/types/src/extensions/automerge/cursor.d.ts +1 -1
  79. package/dist/types/src/extensions/automerge/cursor.d.ts.map +1 -1
  80. package/dist/types/src/extensions/automerge/sync.d.ts +3 -3
  81. package/dist/types/src/extensions/automerge/sync.d.ts.map +1 -1
  82. package/dist/types/src/extensions/automerge/update-automerge.d.ts +1 -1
  83. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +1 -1
  84. package/dist/types/src/extensions/autoscroll.d.ts +20 -0
  85. package/dist/types/src/extensions/autoscroll.d.ts.map +1 -0
  86. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +1 -1
  87. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +1 -1
  88. package/dist/types/src/extensions/blocks.d.ts +2 -0
  89. package/dist/types/src/extensions/blocks.d.ts.map +1 -0
  90. package/dist/types/src/extensions/bookmarks.d.ts +12 -0
  91. package/dist/types/src/extensions/bookmarks.d.ts.map +1 -0
  92. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  93. package/dist/types/src/extensions/factories.d.ts +11 -11
  94. package/dist/types/src/extensions/factories.d.ts.map +1 -1
  95. package/dist/types/src/extensions/focus.d.ts.map +1 -1
  96. package/dist/types/src/extensions/folding.d.ts.map +1 -1
  97. package/dist/types/src/extensions/index.d.ts +10 -1
  98. package/dist/types/src/extensions/index.d.ts.map +1 -1
  99. package/dist/types/src/extensions/json.d.ts +1 -1
  100. package/dist/types/src/extensions/json.d.ts.map +1 -1
  101. package/dist/types/src/extensions/listener.d.ts +8 -6
  102. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  103. package/dist/types/src/extensions/markdown/bundle.d.ts +8 -2
  104. package/dist/types/src/extensions/markdown/bundle.d.ts.map +1 -1
  105. package/dist/types/src/extensions/markdown/changes.d.ts +1 -1
  106. package/dist/types/src/extensions/markdown/changes.d.ts.map +1 -1
  107. package/dist/types/src/extensions/markdown/decorate.d.ts +9 -1
  108. package/dist/types/src/extensions/markdown/decorate.d.ts.map +1 -1
  109. package/dist/types/src/extensions/markdown/formatting.d.ts +1 -3
  110. package/dist/types/src/extensions/markdown/formatting.d.ts.map +1 -1
  111. package/dist/types/src/extensions/markdown/image.d.ts.map +1 -1
  112. package/dist/types/src/extensions/markdown/link.d.ts.map +1 -1
  113. package/dist/types/src/extensions/modal.d.ts +7 -0
  114. package/dist/types/src/extensions/modal.d.ts.map +1 -0
  115. package/dist/types/src/extensions/modes.d.ts +1 -1
  116. package/dist/types/src/extensions/modes.d.ts.map +1 -1
  117. package/dist/types/src/extensions/outliner/menu.d.ts +8 -0
  118. package/dist/types/src/extensions/outliner/menu.d.ts.map +1 -0
  119. package/dist/types/src/extensions/outliner/outliner.d.ts +1 -1
  120. package/dist/types/src/extensions/outliner/outliner.d.ts.map +1 -1
  121. package/dist/types/src/extensions/outliner/tree.d.ts +1 -1
  122. package/dist/types/src/extensions/outliner/tree.d.ts.map +1 -1
  123. package/dist/types/src/extensions/preview/preview.d.ts +8 -8
  124. package/dist/types/src/extensions/preview/preview.d.ts.map +1 -1
  125. package/dist/types/src/extensions/replacer.d.ts +21 -0
  126. package/dist/types/src/extensions/replacer.d.ts.map +1 -0
  127. package/dist/types/src/extensions/replacer.test.d.ts +2 -0
  128. package/dist/types/src/extensions/replacer.test.d.ts.map +1 -0
  129. package/dist/types/src/extensions/scrolling.d.ts +78 -0
  130. package/dist/types/src/extensions/scrolling.d.ts.map +1 -0
  131. package/dist/types/src/extensions/state.d.ts +2 -0
  132. package/dist/types/src/extensions/state.d.ts.map +1 -0
  133. package/dist/types/src/extensions/submit.d.ts +10 -0
  134. package/dist/types/src/extensions/submit.d.ts.map +1 -0
  135. package/dist/types/src/extensions/tab.d.ts +4 -0
  136. package/dist/types/src/extensions/tab.d.ts.map +1 -0
  137. package/dist/types/src/extensions/tags/extended-markdown.d.ts +10 -0
  138. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +1 -0
  139. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +2 -0
  140. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +1 -0
  141. package/dist/types/src/extensions/tags/index.d.ts +4 -0
  142. package/dist/types/src/extensions/tags/index.d.ts.map +1 -0
  143. package/dist/types/src/extensions/tags/streamer.d.ts +12 -0
  144. package/dist/types/src/extensions/tags/streamer.d.ts.map +1 -0
  145. package/dist/types/src/extensions/tags/xml-tags.d.ts +97 -0
  146. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +1 -0
  147. package/dist/types/src/extensions/tags/xml-util.d.ts +10 -0
  148. package/dist/types/src/extensions/tags/xml-util.d.ts.map +1 -0
  149. package/dist/types/src/hooks/useTextEditor.d.ts +5 -9
  150. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  151. package/dist/types/src/stories/CommandDialog.stories.d.ts +14 -0
  152. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  153. package/dist/types/src/stories/Comments.stories.d.ts +21 -10
  154. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  155. package/dist/types/src/stories/EditorToolbar.stories.d.ts +39 -3
  156. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  157. package/dist/types/src/stories/Experimental.stories.d.ts +22 -13
  158. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  159. package/dist/types/src/stories/Markdown.stories.d.ts +32 -43
  160. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  161. package/dist/types/src/stories/Outliner.stories.d.ts +15 -21
  162. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  163. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  164. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  165. package/dist/types/src/stories/Preview.stories.d.ts +22 -7
  166. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  167. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  168. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  169. package/dist/types/src/stories/TextEditor.stories.d.ts +37 -52
  170. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  171. package/dist/types/src/stories/components/EditorStory.d.ts +8 -9
  172. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  173. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  174. package/dist/types/src/styles/theme.d.ts.map +1 -1
  175. package/dist/types/src/translations.d.ts +1 -1
  176. package/dist/types/src/types/types.d.ts +2 -2
  177. package/dist/types/src/types/types.d.ts.map +1 -1
  178. package/dist/types/src/util/debug.d.ts +5 -1
  179. package/dist/types/src/util/debug.d.ts.map +1 -1
  180. package/dist/types/src/util/decorations.d.ts +4 -0
  181. package/dist/types/src/util/decorations.d.ts.map +1 -0
  182. package/dist/types/src/util/dom.d.ts +2 -12
  183. package/dist/types/src/util/dom.d.ts.map +1 -1
  184. package/dist/types/src/util/index.d.ts +1 -0
  185. package/dist/types/src/util/index.d.ts.map +1 -1
  186. package/dist/types/src/util/react.d.ts +1 -1
  187. package/dist/types/src/util/react.d.ts.map +1 -1
  188. package/dist/types/tsconfig.tsbuildinfo +1 -1
  189. package/package.json +70 -68
  190. package/src/components/Editor/Editor.stories.tsx +89 -0
  191. package/src/components/Editor/Editor.tsx +160 -25
  192. package/src/components/EditorContent/EditorContent.stories.tsx +70 -0
  193. package/src/components/EditorContent/EditorContent.tsx +70 -0
  194. package/src/components/EditorContent/controller.ts +50 -0
  195. package/src/components/EditorContent/index.ts +6 -0
  196. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +233 -0
  197. package/src/components/EditorMenuProvider/index.ts +11 -0
  198. package/src/components/EditorMenuProvider/menu-presets.ts +123 -0
  199. package/src/components/EditorMenuProvider/menu.ts +71 -0
  200. package/src/components/EditorMenuProvider/popover.ts +287 -0
  201. package/src/components/EditorMenuProvider/useEditorMenu.ts +175 -0
  202. package/src/components/EditorMenuProvider/util.ts +31 -0
  203. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +82 -0
  204. package/src/components/EditorPreviewProvider/index.ts +5 -0
  205. package/src/components/EditorToolbar/EditorToolbar.tsx +116 -96
  206. package/src/components/EditorToolbar/actions.ts +86 -0
  207. package/src/components/EditorToolbar/blocks.ts +20 -23
  208. package/src/components/EditorToolbar/formatting.ts +21 -24
  209. package/src/components/EditorToolbar/headings.ts +16 -9
  210. package/src/components/EditorToolbar/image.ts +9 -5
  211. package/src/components/EditorToolbar/index.ts +3 -7
  212. package/src/components/EditorToolbar/search.ts +9 -5
  213. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  214. package/src/components/EditorToolbar/view-mode.ts +11 -6
  215. package/src/components/index.ts +8 -2
  216. package/src/defaults.ts +5 -2
  217. package/src/extensions/autocomplete/autocomplete.ts +151 -0
  218. package/src/extensions/autocomplete/index.ts +8 -0
  219. package/src/extensions/autocomplete/match.ts +46 -0
  220. package/src/extensions/{command → autocomplete}/placeholder.ts +21 -17
  221. package/src/extensions/{command → autocomplete}/typeahead.ts +6 -48
  222. package/src/extensions/automerge/automerge.stories.tsx +28 -21
  223. package/src/extensions/automerge/automerge.ts +28 -9
  224. package/src/extensions/automerge/cursor.ts +1 -1
  225. package/src/extensions/automerge/sync.ts +8 -4
  226. package/src/extensions/automerge/update-automerge.ts +1 -1
  227. package/src/extensions/autoscroll.ts +163 -0
  228. package/src/extensions/awareness/awareness-provider.ts +2 -2
  229. package/src/extensions/blocks.ts +131 -0
  230. package/src/extensions/bookmarks.ts +75 -0
  231. package/src/extensions/comments.ts +13 -8
  232. package/src/extensions/factories.ts +50 -32
  233. package/src/extensions/focus.ts +5 -4
  234. package/src/extensions/folding.tsx +3 -6
  235. package/src/extensions/hashtag.tsx +2 -2
  236. package/src/extensions/index.ts +10 -1
  237. package/src/extensions/json.ts +1 -1
  238. package/src/extensions/listener.ts +14 -20
  239. package/src/extensions/markdown/bundle.ts +39 -5
  240. package/src/extensions/markdown/decorate.ts +26 -17
  241. package/src/extensions/markdown/formatting.ts +8 -10
  242. package/src/extensions/markdown/highlight.ts +1 -1
  243. package/src/extensions/markdown/image.ts +5 -6
  244. package/src/extensions/markdown/link.ts +3 -0
  245. package/src/extensions/markdown/table.ts +13 -7
  246. package/src/extensions/modal.ts +24 -0
  247. package/src/extensions/modes.ts +2 -2
  248. package/src/extensions/{command/floating-menu.ts → outliner/menu.ts} +16 -21
  249. package/src/extensions/outliner/outliner.test.ts +1 -1
  250. package/src/extensions/outliner/outliner.ts +5 -5
  251. package/src/extensions/outliner/tree.test.ts +1 -1
  252. package/src/extensions/outliner/tree.ts +1 -1
  253. package/src/extensions/preview/index.ts +1 -1
  254. package/src/extensions/preview/preview.ts +69 -69
  255. package/src/extensions/replacer.test.ts +75 -0
  256. package/src/extensions/replacer.ts +93 -0
  257. package/src/extensions/scrolling.ts +189 -0
  258. package/src/extensions/selection.ts +3 -3
  259. package/src/extensions/state.ts +7 -0
  260. package/src/extensions/submit.ts +62 -0
  261. package/src/extensions/tab.ts +29 -0
  262. package/src/extensions/tags/extended-markdown.test.ts +262 -0
  263. package/src/extensions/tags/extended-markdown.ts +78 -0
  264. package/src/extensions/tags/index.ts +7 -0
  265. package/src/extensions/tags/streamer.ts +243 -0
  266. package/src/extensions/tags/xml-tags.ts +500 -0
  267. package/src/extensions/tags/xml-util.ts +94 -0
  268. package/src/extensions/typewriter.ts +1 -1
  269. package/src/hooks/useTextEditor.ts +31 -43
  270. package/src/stories/CommandDialog.stories.tsx +83 -0
  271. package/src/stories/Comments.stories.tsx +15 -13
  272. package/src/stories/EditorToolbar.stories.tsx +18 -17
  273. package/src/stories/Experimental.stories.tsx +15 -12
  274. package/src/stories/Markdown.stories.tsx +24 -21
  275. package/src/stories/Outliner.stories.tsx +50 -39
  276. package/src/stories/Popover.stories.tsx +162 -0
  277. package/src/stories/Preview.stories.tsx +52 -46
  278. package/src/stories/Tags.stories.tsx +95 -0
  279. package/src/stories/TextEditor.stories.tsx +30 -50
  280. package/src/stories/components/EditorStory.tsx +32 -20
  281. package/src/stories/components/util.tsx +40 -8
  282. package/src/styles/markdown.ts +1 -1
  283. package/src/styles/theme.ts +16 -13
  284. package/src/translations.ts +1 -1
  285. package/src/types/types.ts +1 -1
  286. package/src/util/debug.ts +7 -2
  287. package/src/util/decorations.ts +21 -0
  288. package/src/util/dom.ts +5 -27
  289. package/src/util/index.ts +1 -0
  290. package/src/util/react.tsx +1 -1
  291. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  292. package/dist/lib/browser/testing/index.mjs +0 -6
  293. package/dist/lib/browser/testing/index.mjs.map +0 -7
  294. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  295. package/dist/lib/node-esm/testing/index.mjs +0 -8
  296. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  297. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  298. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  299. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  300. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  301. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  302. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  303. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  304. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  305. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  306. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  307. package/dist/types/src/components/Popover/index.d.ts +0 -4
  308. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  309. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  310. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  311. package/dist/types/src/extensions/command/action.d.ts +0 -17
  312. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  313. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  314. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  315. package/dist/types/src/extensions/command/command.d.ts +0 -6
  316. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  317. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  318. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  319. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  320. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  321. package/dist/types/src/extensions/command/index.d.ts +0 -7
  322. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  323. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  324. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  325. package/dist/types/src/extensions/command/state.d.ts +0 -16
  326. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  327. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  328. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  329. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  330. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  331. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  332. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  333. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  334. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  335. package/dist/types/src/testing/index.d.ts +0 -2
  336. package/dist/types/src/testing/index.d.ts.map +0 -1
  337. package/dist/types/src/testing/util.d.ts +0 -3
  338. package/dist/types/src/testing/util.d.ts.map +0 -1
  339. package/src/components/EditorToolbar/lists.ts +0 -60
  340. package/src/components/EditorToolbar/util.ts +0 -65
  341. package/src/components/Popover/CommandMenu.tsx +0 -279
  342. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  343. package/src/components/Popover/RefPopover.tsx +0 -99
  344. package/src/components/Popover/index.ts +0 -7
  345. package/src/extensions/autocomplete.ts +0 -69
  346. package/src/extensions/command/action.ts +0 -56
  347. package/src/extensions/command/command-menu.ts +0 -211
  348. package/src/extensions/command/command.ts +0 -34
  349. package/src/extensions/command/hint.ts +0 -103
  350. package/src/extensions/command/index.ts +0 -10
  351. package/src/extensions/command/state.ts +0 -90
  352. package/src/extensions/command/useCommandMenu.ts +0 -119
  353. package/src/stories/Command.stories.tsx +0 -98
  354. package/src/stories/CommandMenu.stories.tsx +0 -160
  355. package/src/testing/index.ts +0 -5
  356. package/src/testing/util.ts +0 -7
@@ -2,123 +2,143 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import { Rx } from '@effect-rx/rx-react';
5
+ import { type EditorView } from '@codemirror/view';
6
+ import { Atom } from '@effect-atom/atom-react';
6
7
  import React, { memo, useMemo } from 'react';
7
8
 
8
- import { type NodeArg, rxFromSignal } from '@dxos/app-graph';
9
- import { ElevationProvider } from '@dxos/react-ui';
10
- import { MenuProvider, ToolbarMenu, createGapSeparator, useMenuActions } from '@dxos/react-ui-menu';
9
+ import { atomFromSignal } from '@dxos/app-graph';
10
+ import { type Live } from '@dxos/live-object';
11
+ import { ElevationProvider, type ThemedClassName } from '@dxos/react-ui';
12
+ import {
13
+ type ActionGraphProps,
14
+ MenuProvider,
15
+ ToolbarMenu,
16
+ createGapSeparator,
17
+ useMenuActions,
18
+ } from '@dxos/react-ui-menu';
11
19
 
20
+ import { type EditorViewMode } from '../../types';
21
+
22
+ import { createLists } from './actions';
12
23
  import { createBlocks } from './blocks';
13
24
  import { createFormatting } from './formatting';
14
25
  import { createHeadings } from './headings';
15
26
  import { createImageUpload } from './image';
16
- import { createLists } from './lists';
17
27
  import { createSearch } from './search';
18
- import { type EditorToolbarActionGraphProps, type EditorToolbarFeatureFlags, type EditorToolbarProps } from './util';
28
+ import { type EditorToolbarState } from './useEditorToolbar';
19
29
  import { createViewMode } from './view-mode';
20
30
 
21
- const createToolbar = ({
22
- getView,
31
+ export type EditorToolbarFeatureFlags = Partial<{
32
+ showHeadings: boolean;
33
+ showFormatting: boolean;
34
+ showLists: boolean;
35
+ showBlocks: boolean;
36
+ showSearch: boolean;
37
+
38
+ // TODO(wittjosiah): Factor out (depends on plugin-level capabilities.)
39
+ onImageUpload: () => void;
40
+ onViewModeChange: (mode: EditorViewMode) => void;
41
+ }>;
42
+
43
+ export type EditorToolbarActionGraphProps = {
44
+ state: Live<EditorToolbarState>;
45
+ getView: () => EditorView;
46
+ // TODO(wittjosiah): Control positioning.
47
+ customActions?: Atom.Atom<ActionGraphProps>;
48
+ };
49
+
50
+ export type EditorToolbarProps = ThemedClassName<
51
+ {
52
+ role?: string;
53
+ attendableId?: string;
54
+ } & (EditorToolbarActionGraphProps & EditorToolbarFeatureFlags)
55
+ >;
56
+
57
+ // TODO(burdon): Remove role dependency.
58
+ export const EditorToolbar = memo(({ classNames, role, attendableId, ...props }: EditorToolbarProps) => {
59
+ const menuProps = useEditorToolbarActionGraph(props);
60
+
61
+ return (
62
+ <ElevationProvider elevation={role === 'section' ? 'positioned' : 'base'}>
63
+ <MenuProvider {...menuProps} attendableId={attendableId}>
64
+ <ToolbarMenu classNames={classNames} textBlockWidth />
65
+ </MenuProvider>
66
+ </ElevationProvider>
67
+ );
68
+ });
69
+
70
+ type ToolbarActionsProps = Pick<EditorToolbarActionGraphProps, 'state' | 'getView' | 'customActions'> &
71
+ EditorToolbarFeatureFlags;
72
+
73
+ // TODO(wittjosiah): Toolbar re-rendering is causing this graph to be recreated and breaking reactivity in some cases.
74
+ // E.g. for toolbar dropdowns which use active icon, the icon is not updated when the active item changes.
75
+ // This is currently only happening in the markdown plugin usage and should be reproduced in an editor story.
76
+ const useEditorToolbarActionGraph = ({ state, getView, customActions, ...features }: ToolbarActionsProps) => {
77
+ const menuCreator = useMemo(
78
+ () => createToolbarActions({ state, getView, customActions, ...features }),
79
+ [
80
+ state,
81
+ getView,
82
+ customActions,
83
+ features?.showHeadings,
84
+ features?.showFormatting,
85
+ features?.showLists,
86
+ features?.showBlocks,
87
+ features?.showSearch,
88
+ features?.onImageUpload,
89
+ features?.onViewModeChange,
90
+ ],
91
+ );
92
+
93
+ return useMenuActions(menuCreator);
94
+ };
95
+
96
+ const createToolbarActions = ({
23
97
  state,
98
+ getView,
24
99
  customActions,
25
100
  ...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);
101
+ }: ToolbarActionsProps): Atom.Atom<ActionGraphProps> => {
102
+ 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))));
37
116
  }
38
- if (features.formatting ?? true) {
39
- const formatting = get(rxFromSignal(() => createFormatting(state, getView)));
40
- nodes.push(...formatting.nodes);
41
- edges.push(...formatting.edges);
117
+ if (features?.showFormatting ?? true) {
118
+ addSubGraph(graph, get(atomFromSignal(() => createFormatting(state, getView))));
42
119
  }
43
- if (features.lists ?? true) {
44
- const lists = get(rxFromSignal(() => createLists(state, getView)));
45
- nodes.push(...lists.nodes);
46
- edges.push(...lists.edges);
120
+ if (features?.showLists ?? true) {
121
+ addSubGraph(graph, get(atomFromSignal(() => createLists(state, getView))));
47
122
  }
48
- if (features.blocks ?? true) {
49
- const blocks = get(rxFromSignal(() => createBlocks(state, getView)));
50
- nodes.push(...blocks.nodes);
51
- edges.push(...blocks.edges);
123
+ if (features?.showBlocks ?? true) {
124
+ addSubGraph(graph, get(atomFromSignal(() => createBlocks(state, getView))));
52
125
  }
53
- if (features.image) {
54
- const image = get(rxFromSignal(() => createImageUpload(features.image!)));
55
- nodes.push(...image.nodes);
56
- edges.push(...image.edges);
126
+ if (features?.onImageUpload) {
127
+ addSubGraph(graph, get(atomFromSignal(() => createImageUpload(features.onImageUpload!))));
57
128
  }
58
- const editorToolbarGap = createGapSeparator();
59
- nodes.push(...editorToolbarGap.nodes);
60
- edges.push(...editorToolbarGap.edges);
129
+
130
+ addSubGraph(graph, createGapSeparator());
131
+
61
132
  if (customActions) {
62
- const custom = get(customActions);
63
- nodes.push(...custom.nodes);
64
- edges.push(...custom.edges);
133
+ addSubGraph(graph, get(customActions));
65
134
  }
66
- if (features.search ?? true) {
67
- const search = get(rxFromSignal(() => createSearch(getView)));
68
- nodes.push(...search.nodes);
69
- edges.push(...search.edges);
135
+ if (features?.showSearch ?? true) {
136
+ addSubGraph(graph, get(atomFromSignal(() => createSearch(getView))));
70
137
  }
71
- if (features.viewMode) {
72
- const viewMode = get(rxFromSignal(() => createViewMode(state, features.viewMode!)));
73
- nodes.push(...viewMode.nodes);
74
- edges.push(...viewMode.edges);
138
+ if (features?.onViewModeChange) {
139
+ addSubGraph(graph, get(atomFromSignal(() => createViewMode(state, features.onViewModeChange!))));
75
140
  }
76
- return { nodes, edges };
77
- });
78
- };
79
-
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
141
 
112
- return useMenuActions(menuCreator);
142
+ return graph;
143
+ });
113
144
  };
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
- });
@@ -0,0 +1,86 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type EditorView } from '@codemirror/view';
6
+
7
+ import { type Action, type NodeArg } from '@dxos/app-graph';
8
+ import {
9
+ type MenuActionProperties,
10
+ type ToolbarMenuActionGroupProperties,
11
+ createMenuAction,
12
+ createMenuItemGroup,
13
+ } from '@dxos/react-ui-menu';
14
+
15
+ import { List, addList, removeList } from '../../extensions';
16
+ import { translationKey } from '../../translations';
17
+
18
+ import { type EditorToolbarState } from './useEditorToolbar';
19
+
20
+ const listStyles = {
21
+ bullet: 'ph--list-bullets--regular',
22
+ ordered: 'ph--list-numbers--regular',
23
+ task: 'ph--list-checks--regular',
24
+ };
25
+
26
+ export const createLists = (state: EditorToolbarState, getView: () => EditorView) => {
27
+ const value = state.listStyle ?? '';
28
+ const listGroupAction = createListGroupAction(value);
29
+ const listActionsMap = createListActions(value, getView);
30
+ return {
31
+ nodes: [listGroupAction as NodeArg<any>, ...listActionsMap],
32
+ edges: [
33
+ { source: 'root', target: 'list' },
34
+ ...listActionsMap.map(({ id }) => ({ source: listGroupAction.id, target: id })),
35
+ ],
36
+ };
37
+ };
38
+
39
+ export const createEditorAction = (id: string, props: Partial<MenuActionProperties>, invoke: () => void) => {
40
+ const { label = [`${id} label`, { ns: translationKey }], ...rest } = props;
41
+
42
+ return createMenuAction(id, invoke, {
43
+ label,
44
+ ...rest,
45
+ }) as Action<MenuActionProperties>;
46
+ };
47
+
48
+ export const createEditorActionGroup = (
49
+ id: string,
50
+ props: Omit<ToolbarMenuActionGroupProperties, 'icon'>,
51
+ icon?: string,
52
+ ) => {
53
+ const { label = [`${id} label`, { ns: translationKey }], ...rest } = props;
54
+
55
+ return createMenuItemGroup(id, {
56
+ label,
57
+ icon,
58
+ iconOnly: true,
59
+ ...rest,
60
+ });
61
+ };
62
+
63
+ const createListGroupAction = (value: string) =>
64
+ createEditorActionGroup('list', {
65
+ variant: 'toggleGroup',
66
+ selectCardinality: 'single',
67
+ value,
68
+ } as ToolbarMenuActionGroupProperties);
69
+
70
+ const createListActions = (value: string, getView: () => EditorView) =>
71
+ Object.entries(listStyles).map(([listStyle, icon]) => {
72
+ const checked = value === listStyle;
73
+ return createEditorAction(`list-${listStyle}`, { checked, icon }, () => {
74
+ const view = getView();
75
+ if (!view) {
76
+ return;
77
+ }
78
+
79
+ const listType = listStyle === 'ordered' ? List.Ordered : listStyle === 'bullet' ? List.Bullet : List.Task;
80
+ if (checked) {
81
+ removeList(listType)(view);
82
+ } else {
83
+ addList(listType)(view);
84
+ }
85
+ });
86
+ });
@@ -9,7 +9,8 @@ import { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
9
9
 
10
10
  import { addBlockquote, addCodeblock, insertTable, removeBlockquote, removeCodeblock } from '../../extensions';
11
11
 
12
- import { type EditorToolbarState, createEditorAction, createEditorActionGroup } from './util';
12
+ import { createEditorAction, createEditorActionGroup } from './actions';
13
+ import { type EditorToolbarState } from './useEditorToolbar';
13
14
 
14
15
  const createBlockGroupAction = (value: string) =>
15
16
  createEditorActionGroup('block', {
@@ -25,28 +26,24 @@ const createBlockActions = (value: string, getView: () => EditorView, blankLine?
25
26
  table: 'ph--table--regular',
26
27
  }).map(([type, icon]) => {
27
28
  const checked = type === value;
28
- return createEditorAction(
29
- type,
30
- () => {
31
- const view = getView();
32
- if (!view) {
33
- return;
34
- }
35
-
36
- switch (type) {
37
- case 'blockquote':
38
- checked ? removeBlockquote(view) : addBlockquote(view);
39
- break;
40
- case 'codeblock':
41
- checked ? removeCodeblock(view) : addCodeblock(view);
42
- break;
43
- case 'table':
44
- insertTable(view);
45
- break;
46
- }
47
- },
48
- { checked, ...(type === 'table' && { disabled: !!blankLine }), icon },
49
- );
29
+ return createEditorAction(type, { checked, ...(type === 'table' && { disabled: !!blankLine }), icon }, () => {
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
+ });
50
47
  });
51
48
 
52
49
  export const createBlocks = (state: EditorToolbarState, getView: () => EditorView) => {
@@ -9,7 +9,8 @@ import { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
9
9
 
10
10
  import { type Formatting, Inline, addLink, removeLink, setStyle } from '../../extensions';
11
11
 
12
- import { type EditorToolbarState, createEditorAction, createEditorActionGroup } from './util';
12
+ import { createEditorAction, createEditorActionGroup } from './actions';
13
+ import { type EditorToolbarState } from './useEditorToolbar';
13
14
 
14
15
  const formats = {
15
16
  strong: 'ph--text-b--regular',
@@ -29,31 +30,27 @@ const createFormattingGroup = (formatting: Formatting) =>
29
30
  const createFormattingActions = (formatting: Formatting, getView: () => EditorView) =>
30
31
  Object.entries(formats).map(([type, icon]) => {
31
32
  const checked = !!formatting[type as keyof Formatting];
32
- return createEditorAction(
33
- type,
34
- () => {
35
- const view = getView();
36
- if (!view) {
37
- return;
38
- }
33
+ return createEditorAction(type, { checked, icon }, () => {
34
+ const view = getView();
35
+ if (!view) {
36
+ return;
37
+ }
39
38
 
40
- if (type === 'link') {
41
- checked ? removeLink(view) : addLink()(view);
42
- return;
43
- }
39
+ if (type === 'link') {
40
+ checked ? removeLink(view) : addLink()(view);
41
+ return;
42
+ }
44
43
 
45
- const inlineType =
46
- type === 'strong'
47
- ? Inline.Strong
48
- : type === 'emphasis'
49
- ? Inline.Emphasis
50
- : type === 'strikethrough'
51
- ? Inline.Strikethrough
52
- : Inline.Code;
53
- setStyle(inlineType, !checked)(view);
54
- },
55
- { checked, icon },
56
- );
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
+ });
57
54
  });
58
55
 
59
56
  export const createFormatting = (state: EditorToolbarState, getView: () => EditorView) => {
@@ -10,7 +10,8 @@ import { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
10
10
  import { setHeading } from '../../extensions';
11
11
  import { translationKey } from '../../translations';
12
12
 
13
- import { type EditorToolbarState, createEditorAction, createEditorActionGroup } from './util';
13
+ import { createEditorAction, createEditorActionGroup } from './actions';
14
+ import { type EditorToolbarState } from './useEditorToolbar';
14
15
 
15
16
  const createHeadingGroupAction = (value: string) =>
16
17
  createEditorActionGroup(
@@ -19,12 +20,13 @@ const createHeadingGroupAction = (value: string) =>
19
20
  variant: 'dropdownMenu',
20
21
  applyActive: true,
21
22
  selectCardinality: 'single',
23
+ // TODO(wittjosiah): Remove? Not sure this does anything.
22
24
  value,
23
25
  } as ToolbarMenuActionGroupProperties,
24
26
  'ph--text-h--regular',
25
27
  );
26
28
 
27
- const createHeadingActions = (getView: () => EditorView) =>
29
+ const createHeadingActions = (currentLevel: string, getView: () => EditorView) =>
28
30
  Object.entries({
29
31
  '0': 'ph--paragraph--regular',
30
32
  '1': 'ph--text-h-one--regular',
@@ -35,22 +37,27 @@ const createHeadingActions = (getView: () => EditorView) =>
35
37
  '6': 'ph--text-h-six--regular',
36
38
  }).map(([levelStr, icon]) => {
37
39
  const level = parseInt(levelStr);
38
- return createEditorAction(`heading--${levelStr}`, () => setHeading(level)(getView()), {
39
- label: ['heading level label', { count: level, ns: translationKey }],
40
- icon,
41
- });
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
+ );
42
49
  });
43
50
 
44
51
  const computeHeadingValue = (state: EditorToolbarState) => {
45
52
  const blockType = state ? state.blockType : 'paragraph';
46
- const header = blockType && /heading(\d)/.exec(blockType);
47
- return header ? header[1] : blockType === 'paragraph' || !blockType ? '0' : '';
53
+ const heading = blockType && /heading(\d)/.exec(blockType);
54
+ return heading ? heading[1] : blockType === 'paragraph' || !blockType ? '0' : '';
48
55
  };
49
56
 
50
57
  export const createHeadings = (state: EditorToolbarState, getView: () => EditorView) => {
51
58
  const headingValue = computeHeadingValue(state);
52
59
  const headingGroupAction = createHeadingGroupAction(headingValue);
53
- const headingActions = createHeadingActions(getView);
60
+ const headingActions = createHeadingActions(headingValue, getView);
54
61
  return {
55
62
  nodes: [headingGroupAction as NodeArg<any>, ...headingActions],
56
63
  edges: [
@@ -2,13 +2,17 @@
2
2
  // Copyright 2025 DXOS.org
3
3
  //
4
4
 
5
- import { createEditorAction } from './util';
5
+ import { createEditorAction } from './actions';
6
6
 
7
7
  const createImageUploadAction = (onImageUpload: () => void) =>
8
- createEditorAction('image', onImageUpload, {
9
- testId: 'editor.toolbar.image',
10
- icon: 'ph--image-square--regular',
11
- });
8
+ createEditorAction(
9
+ 'image',
10
+ {
11
+ testId: 'editor.toolbar.image',
12
+ icon: 'ph--image-square--regular',
13
+ },
14
+ onImageUpload,
15
+ );
12
16
 
13
17
  export const createImageUpload = (onImageUpload: () => void) => ({
14
18
  nodes: [createImageUploadAction(onImageUpload)],
@@ -3,10 +3,6 @@
3
3
  //
4
4
 
5
5
  export * from './EditorToolbar';
6
- export {
7
- type EditorToolbarState,
8
- type EditorToolbarActionGraphProps,
9
- useEditorToolbarState,
10
- createEditorAction,
11
- createEditorActionGroup,
12
- } from './util';
6
+
7
+ export { type EditorToolbarState, useEditorToolbar } from './useEditorToolbar';
8
+ export { createEditorAction, createEditorActionGroup } from './actions';
@@ -5,13 +5,17 @@
5
5
  import { openSearchPanel } from '@codemirror/search';
6
6
  import { type EditorView } from '@codemirror/view';
7
7
 
8
- import { createEditorAction } from './util';
8
+ import { createEditorAction } from './actions';
9
9
 
10
10
  const createSearchAction = (getView: () => EditorView) =>
11
- createEditorAction('search', () => openSearchPanel(getView()), {
12
- testId: 'editor.toolbar.search',
13
- icon: 'ph--magnifying-glass--regular',
14
- });
11
+ createEditorAction(
12
+ 'search',
13
+ {
14
+ testId: 'editor.toolbar.search',
15
+ icon: 'ph--magnifying-glass--regular',
16
+ },
17
+ () => openSearchPanel(getView()),
18
+ );
15
19
 
16
20
  export const createSearch = (getView: () => EditorView) => ({
17
21
  nodes: [createSearchAction(getView)],
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { useMemo } from 'react';
6
+
7
+ import { type Live, live } from '@dxos/live-object';
8
+
9
+ import { type Formatting } from '../../extensions';
10
+ import { type EditorViewMode } from '../../types';
11
+
12
+ // TODO(burdon): Move to extensions.
13
+ export type EditorToolbarState = { viewMode?: EditorViewMode } & Formatting;
14
+
15
+ /**
16
+ * @deprecated Use Editor.Root
17
+ */
18
+ export const useEditorToolbar = (initialState: Partial<EditorToolbarState> = {}): Live<EditorToolbarState> => {
19
+ return useMemo(() => live<EditorToolbarState>(initialState), []);
20
+ };
@@ -8,7 +8,8 @@ import { type ToolbarMenuActionGroupProperties } from '@dxos/react-ui-menu';
8
8
  import { translationKey } from '../../translations';
9
9
  import { type EditorViewMode } from '../../types';
10
10
 
11
- import { type EditorToolbarState, createEditorAction, createEditorActionGroup } from './util';
11
+ import { createEditorAction, createEditorActionGroup } from './actions';
12
+ import { type EditorToolbarState } from './useEditorToolbar';
12
13
 
13
14
  const createViewModeGroupAction = (value: string) =>
14
15
  createEditorActionGroup(
@@ -29,11 +30,15 @@ const createViewModeActions = (value: string, onViewModeChange: (mode: EditorVie
29
30
  readonly: 'ph--pencil-slash--regular',
30
31
  }).map(([viewMode, icon]) => {
31
32
  const checked = viewMode === value;
32
- return createEditorAction(`view-mode--${viewMode}`, () => onViewModeChange(viewMode as EditorViewMode), {
33
- label: [`${viewMode} mode label`, { ns: translationKey }],
34
- checked,
35
- icon,
36
- });
33
+ return createEditorAction(
34
+ `view-mode--${viewMode}`,
35
+ {
36
+ label: [`${viewMode} mode label`, { ns: translationKey }],
37
+ checked,
38
+ icon,
39
+ },
40
+ () => onViewModeChange(viewMode as EditorViewMode),
41
+ );
37
42
  });
38
43
 
39
44
  export const createViewMode = (state: EditorToolbarState, onViewModeChange: (mode: EditorViewMode) => void) => {
@@ -3,5 +3,11 @@
3
3
  //
4
4
 
5
5
  export * from './Editor';
6
- export * from './EditorToolbar';
7
- export * from './Popover';
6
+
7
+ // export { type GetMenuContext } from './EditorMenuProvider';
8
+
9
+ // TODO(burdon): Remove once Editor is fully migrated.
10
+ export { EditorContent, createEditorController } from './EditorContent';
11
+ export * from './EditorMenuProvider';
12
+ export * from './EditorPreviewProvider';
13
+ export { EditorToolbar, type EditorToolbarProps, type EditorToolbarState, useEditorToolbar } from './EditorToolbar';
package/src/defaults.ts CHANGED
@@ -28,7 +28,9 @@ export const editorSlots: ThemeExtensionsOptions['slots'] = {
28
28
 
29
29
  export const editorGutter = EditorView.theme({
30
30
  '.cm-gutters': {
31
- background: 'var(--dx-baseSurface)',
31
+ // NOTE: Color required to cover content if scrolling horizontally.
32
+ // TODO(burdon): Non-transparent background clips the focus ring.
33
+ background: 'var(--dx-baseSurface) !important',
32
34
  paddingRight: '1rem',
33
35
  },
34
36
  });
@@ -42,8 +44,9 @@ export const editorMonospace = EditorView.theme({
42
44
  export const editorWithToolbarLayout =
43
45
  'grid grid-cols-1 grid-rows-[min-content_1fr] data-[toolbar=disabled]:grid-rows-[1fr] justify-center content-start overflow-hidden';
44
46
 
47
+ // NOTE: Padding is added to the editor to account for the focus ring (since otherwise the CM gutter will clip it)
45
48
  export const stackItemContentEditorClassNames = (role?: string) =>
46
49
  mx(
47
- 'attention-surface dx-focus-ring-inset data-[toolbar=disabled]:pbs-2',
50
+ 'p-0.5 dx-focus-ring-inset attention-surface data-[toolbar=disabled]:pbs-2',
48
51
  role === 'section' ? '[&_.cm-scroller]:overflow-hidden [&_.cm-scroller]:min-bs-24' : 'min-bs-0',
49
52
  );