@dxos/react-ui-editor 0.8.4-main.ead640a → 0.8.4-main.effb148878

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