@dxos/react-ui-editor 0.8.3 → 0.8.4-main.1068cf700f

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