@dxos/react-ui-editor 0.8.4-main.406dc2a → 0.8.4-main.4a85c3132b

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 (416) hide show
  1. package/dist/lib/browser/index.mjs +1184 -8481
  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 +1184 -8480
  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 +43 -30
  8. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  9. package/dist/types/src/components/Editor/Editor.stories.d.ts +13 -20
  10. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -1
  11. package/dist/types/src/components/EditorContent/EditorContent.d.ts +31 -0
  12. package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +1 -0
  13. package/dist/types/src/components/EditorContent/controller.d.ts +10 -0
  14. package/dist/types/src/components/EditorContent/controller.d.ts.map +1 -0
  15. package/dist/types/src/components/EditorContent/index.d.ts +3 -0
  16. package/dist/types/src/components/EditorContent/index.d.ts.map +1 -0
  17. package/dist/types/src/{extensions/popover/PopoverMenuProvider.d.ts → components/EditorMenuProvider/EditorMenuProvider.d.ts} +6 -6
  18. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  19. package/dist/types/src/components/EditorMenuProvider/index.d.ts +6 -0
  20. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  22. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  24. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  25. package/dist/types/src/{extensions/popover → components/EditorMenuProvider}/popover.d.ts +1 -2
  26. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  28. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  29. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  30. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  32. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  33. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +28 -2
  34. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  35. package/dist/types/src/components/EditorToolbar/actions.d.ts +25 -0
  36. package/dist/types/src/components/EditorToolbar/actions.d.ts.map +1 -0
  37. package/dist/types/src/components/EditorToolbar/blocks.d.ts +9 -7
  38. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  39. package/dist/types/src/components/EditorToolbar/formatting.d.ts +9 -7
  40. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  41. package/dist/types/src/components/EditorToolbar/headings.d.ts +9 -7
  42. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  43. package/dist/types/src/components/EditorToolbar/image.d.ts +5 -11
  44. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
  46. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  47. package/dist/types/src/components/EditorToolbar/search.d.ts +5 -11
  48. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  49. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
  50. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
  51. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +10 -8
  52. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  53. package/dist/types/src/components/index.d.ts +4 -1
  54. package/dist/types/src/components/index.d.ts.map +1 -1
  55. package/dist/types/src/hooks/useTextEditor.d.ts +2 -2
  56. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  57. package/dist/types/src/index.d.ts +0 -8
  58. package/dist/types/src/index.d.ts.map +1 -1
  59. package/dist/types/src/{extensions/automerge/automerge.stories.d.ts → stories/Automerge.stories.d.ts} +5 -8
  60. package/dist/types/src/stories/Automerge.stories.d.ts.map +1 -0
  61. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -1
  62. package/dist/types/src/stories/Comments.stories.d.ts +4 -3
  63. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  64. package/dist/types/src/stories/EditorToolbar.stories.d.ts +4 -4
  65. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  66. package/dist/types/src/stories/Experimental.stories.d.ts +4 -3
  67. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  68. package/dist/types/src/stories/Markdown.stories.d.ts +4 -3
  69. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  70. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  71. package/dist/types/src/stories/Popover.stories.d.ts +2 -2
  72. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -1
  73. package/dist/types/src/stories/Preview.stories.d.ts +5 -3
  74. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  75. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -1
  76. package/dist/types/src/stories/TextEditor.stories.d.ts +4 -3
  77. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  78. package/dist/types/src/stories/Theme.stories.d.ts +8 -0
  79. package/dist/types/src/stories/Theme.stories.d.ts.map +1 -0
  80. package/dist/types/src/stories/components/EditorStory.d.ts +10 -19
  81. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  82. package/dist/types/src/stories/components/util.d.ts +3 -3
  83. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  84. package/dist/types/src/translations.d.ts +5 -5
  85. package/dist/types/src/translations.d.ts.map +1 -1
  86. package/dist/types/src/util/index.d.ts +0 -5
  87. package/dist/types/src/util/index.d.ts.map +1 -1
  88. package/dist/types/src/util/react.d.ts +6 -5
  89. package/dist/types/src/util/react.d.ts.map +1 -1
  90. package/dist/types/tsconfig.tsbuildinfo +1 -1
  91. package/package.json +67 -71
  92. package/src/components/Editor/Editor.stories.tsx +75 -52
  93. package/src/components/Editor/Editor.tsx +166 -63
  94. package/src/components/EditorContent/EditorContent.tsx +83 -0
  95. package/src/components/EditorContent/controller.ts +50 -0
  96. package/src/components/EditorContent/index.ts +6 -0
  97. package/src/{extensions/popover/PopoverMenuProvider.tsx → components/EditorMenuProvider/EditorMenuProvider.tsx} +47 -40
  98. package/src/components/EditorMenuProvider/index.ts +10 -0
  99. package/src/{extensions/popover → components/EditorMenuProvider}/menu-presets.ts +19 -19
  100. package/src/{extensions/popover → components/EditorMenuProvider}/menu.ts +21 -18
  101. package/src/{extensions/popover → components/EditorMenuProvider}/popover.ts +3 -11
  102. package/src/{extensions/popover/usePopoverMenu.ts → components/EditorMenuProvider/useEditorMenu.ts} +27 -21
  103. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +79 -0
  104. package/src/components/EditorPreviewProvider/index.ts +5 -0
  105. package/src/components/EditorToolbar/EditorToolbar.tsx +102 -105
  106. package/src/components/EditorToolbar/{lists.ts → actions.ts} +48 -17
  107. package/src/components/EditorToolbar/blocks.ts +7 -7
  108. package/src/components/EditorToolbar/formatting.ts +7 -7
  109. package/src/components/EditorToolbar/headings.ts +20 -17
  110. package/src/components/EditorToolbar/image.ts +10 -3
  111. package/src/components/EditorToolbar/index.ts +3 -7
  112. package/src/components/EditorToolbar/search.ts +10 -3
  113. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  114. package/src/components/EditorToolbar/view-mode.ts +7 -6
  115. package/src/components/index.ts +6 -1
  116. package/src/hooks/useTextEditor.ts +13 -7
  117. package/src/index.ts +0 -10
  118. package/src/stories/Automerge.stories.tsx +174 -0
  119. package/src/stories/CommandDialog.stories.tsx +16 -13
  120. package/src/stories/Comments.stories.tsx +48 -44
  121. package/src/stories/EditorToolbar.stories.tsx +36 -21
  122. package/src/stories/Experimental.stories.tsx +6 -8
  123. package/src/stories/Markdown.stories.tsx +16 -16
  124. package/src/stories/Outliner.stories.tsx +18 -26
  125. package/src/stories/Popover.stories.tsx +42 -47
  126. package/src/stories/Preview.stories.tsx +100 -81
  127. package/src/stories/Tags.stories.tsx +36 -13
  128. package/src/stories/TextEditor.stories.tsx +15 -21
  129. package/src/stories/Theme.stories.tsx +61 -0
  130. package/src/stories/components/EditorStory.tsx +32 -27
  131. package/src/stories/components/util.tsx +60 -31
  132. package/src/translations.ts +4 -4
  133. package/src/util/index.ts +1 -6
  134. package/src/util/react.tsx +8 -13
  135. package/dist/lib/browser/chunk-HL3YF6WC.mjs +0 -22
  136. package/dist/lib/browser/chunk-HL3YF6WC.mjs.map +0 -7
  137. package/dist/lib/browser/testing/index.mjs +0 -76
  138. package/dist/lib/browser/testing/index.mjs.map +0 -7
  139. package/dist/lib/browser/types/index.mjs +0 -13
  140. package/dist/lib/browser/types/index.mjs.map +0 -7
  141. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs +0 -24
  142. package/dist/lib/node-esm/chunk-YJZGD3LY.mjs.map +0 -7
  143. package/dist/lib/node-esm/testing/index.mjs +0 -78
  144. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  145. package/dist/lib/node-esm/types/index.mjs +0 -14
  146. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  147. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  148. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  149. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  150. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  151. package/dist/types/src/defaults.d.ts +0 -14
  152. package/dist/types/src/defaults.d.ts.map +0 -1
  153. package/dist/types/src/extensions/annotations.d.ts +0 -9
  154. package/dist/types/src/extensions/annotations.d.ts.map +0 -1
  155. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts +0 -26
  156. package/dist/types/src/extensions/autocomplete/autocomplete.d.ts.map +0 -1
  157. package/dist/types/src/extensions/autocomplete/index.d.ts +0 -5
  158. package/dist/types/src/extensions/autocomplete/index.d.ts.map +0 -1
  159. package/dist/types/src/extensions/autocomplete/match.d.ts +0 -13
  160. package/dist/types/src/extensions/autocomplete/match.d.ts.map +0 -1
  161. package/dist/types/src/extensions/autocomplete/placeholder.d.ts +0 -20
  162. package/dist/types/src/extensions/autocomplete/placeholder.d.ts.map +0 -1
  163. package/dist/types/src/extensions/autocomplete/typeahead.d.ts +0 -10
  164. package/dist/types/src/extensions/autocomplete/typeahead.d.ts.map +0 -1
  165. package/dist/types/src/extensions/automerge/automerge.d.ts +0 -4
  166. package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
  167. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +0 -1
  168. package/dist/types/src/extensions/automerge/automerge.test.d.ts +0 -2
  169. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
  170. package/dist/types/src/extensions/automerge/cursor.d.ts +0 -4
  171. package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
  172. package/dist/types/src/extensions/automerge/defs.d.ts +0 -17
  173. package/dist/types/src/extensions/automerge/defs.d.ts.map +0 -1
  174. package/dist/types/src/extensions/automerge/index.d.ts +0 -2
  175. package/dist/types/src/extensions/automerge/index.d.ts.map +0 -1
  176. package/dist/types/src/extensions/automerge/sync.d.ts +0 -17
  177. package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
  178. package/dist/types/src/extensions/automerge/update-automerge.d.ts +0 -6
  179. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
  180. package/dist/types/src/extensions/automerge/update-codemirror.d.ts +0 -5
  181. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
  182. package/dist/types/src/extensions/autoscroll.d.ts +0 -10
  183. package/dist/types/src/extensions/autoscroll.d.ts.map +0 -1
  184. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +0 -31
  185. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
  186. package/dist/types/src/extensions/awareness/awareness.d.ts +0 -46
  187. package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
  188. package/dist/types/src/extensions/awareness/index.d.ts +0 -3
  189. package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
  190. package/dist/types/src/extensions/blast.d.ts +0 -25
  191. package/dist/types/src/extensions/blast.d.ts.map +0 -1
  192. package/dist/types/src/extensions/comments.d.ts +0 -95
  193. package/dist/types/src/extensions/comments.d.ts.map +0 -1
  194. package/dist/types/src/extensions/debug.d.ts +0 -3
  195. package/dist/types/src/extensions/debug.d.ts.map +0 -1
  196. package/dist/types/src/extensions/dnd.d.ts +0 -9
  197. package/dist/types/src/extensions/dnd.d.ts.map +0 -1
  198. package/dist/types/src/extensions/factories.d.ts +0 -83
  199. package/dist/types/src/extensions/factories.d.ts.map +0 -1
  200. package/dist/types/src/extensions/focus.d.ts +0 -7
  201. package/dist/types/src/extensions/focus.d.ts.map +0 -1
  202. package/dist/types/src/extensions/folding.d.ts +0 -7
  203. package/dist/types/src/extensions/folding.d.ts.map +0 -1
  204. package/dist/types/src/extensions/hashtag.d.ts +0 -3
  205. package/dist/types/src/extensions/hashtag.d.ts.map +0 -1
  206. package/dist/types/src/extensions/index.d.ts +0 -26
  207. package/dist/types/src/extensions/index.d.ts.map +0 -1
  208. package/dist/types/src/extensions/json.d.ts +0 -7
  209. package/dist/types/src/extensions/json.d.ts.map +0 -1
  210. package/dist/types/src/extensions/listener.d.ts +0 -11
  211. package/dist/types/src/extensions/listener.d.ts.map +0 -1
  212. package/dist/types/src/extensions/markdown/action.d.ts +0 -12
  213. package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
  214. package/dist/types/src/extensions/markdown/bundle.d.ts +0 -22
  215. package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
  216. package/dist/types/src/extensions/markdown/changes.d.ts +0 -10
  217. package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
  218. package/dist/types/src/extensions/markdown/changes.test.d.ts +0 -2
  219. package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
  220. package/dist/types/src/extensions/markdown/debug.d.ts +0 -11
  221. package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
  222. package/dist/types/src/extensions/markdown/decorate.d.ts +0 -25
  223. package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
  224. package/dist/types/src/extensions/markdown/formatting.d.ts +0 -63
  225. package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
  226. package/dist/types/src/extensions/markdown/formatting.test.d.ts +0 -3
  227. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
  228. package/dist/types/src/extensions/markdown/highlight.d.ts +0 -37
  229. package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
  230. package/dist/types/src/extensions/markdown/image.d.ts +0 -7
  231. package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
  232. package/dist/types/src/extensions/markdown/index.d.ts +0 -10
  233. package/dist/types/src/extensions/markdown/index.d.ts.map +0 -1
  234. package/dist/types/src/extensions/markdown/link.d.ts +0 -7
  235. package/dist/types/src/extensions/markdown/link.d.ts.map +0 -1
  236. package/dist/types/src/extensions/markdown/parser.test.d.ts +0 -2
  237. package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
  238. package/dist/types/src/extensions/markdown/styles.d.ts +0 -4
  239. package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
  240. package/dist/types/src/extensions/markdown/table.d.ts +0 -8
  241. package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
  242. package/dist/types/src/extensions/mention.d.ts +0 -7
  243. package/dist/types/src/extensions/mention.d.ts.map +0 -1
  244. package/dist/types/src/extensions/modes.d.ts +0 -10
  245. package/dist/types/src/extensions/modes.d.ts.map +0 -1
  246. package/dist/types/src/extensions/outliner/commands.d.ts +0 -10
  247. package/dist/types/src/extensions/outliner/commands.d.ts.map +0 -1
  248. package/dist/types/src/extensions/outliner/editor.d.ts +0 -5
  249. package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
  250. package/dist/types/src/extensions/outliner/editor.test.d.ts +0 -2
  251. package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
  252. package/dist/types/src/extensions/outliner/index.d.ts +0 -4
  253. package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
  254. package/dist/types/src/extensions/outliner/menu.d.ts +0 -8
  255. package/dist/types/src/extensions/outliner/menu.d.ts.map +0 -1
  256. package/dist/types/src/extensions/outliner/outliner.d.ts +0 -11
  257. package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
  258. package/dist/types/src/extensions/outliner/outliner.test.d.ts +0 -2
  259. package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +0 -1
  260. package/dist/types/src/extensions/outliner/selection.d.ts +0 -12
  261. package/dist/types/src/extensions/outliner/selection.d.ts.map +0 -1
  262. package/dist/types/src/extensions/outliner/tree.d.ts +0 -79
  263. package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
  264. package/dist/types/src/extensions/outliner/tree.test.d.ts +0 -2
  265. package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
  266. package/dist/types/src/extensions/popover/PopoverMenuProvider.d.ts.map +0 -1
  267. package/dist/types/src/extensions/popover/index.d.ts +0 -8
  268. package/dist/types/src/extensions/popover/index.d.ts.map +0 -1
  269. package/dist/types/src/extensions/popover/menu-presets.d.ts +0 -4
  270. package/dist/types/src/extensions/popover/menu-presets.d.ts.map +0 -1
  271. package/dist/types/src/extensions/popover/menu.d.ts +0 -24
  272. package/dist/types/src/extensions/popover/menu.d.ts.map +0 -1
  273. package/dist/types/src/extensions/popover/modal.d.ts +0 -7
  274. package/dist/types/src/extensions/popover/modal.d.ts.map +0 -1
  275. package/dist/types/src/extensions/popover/popover.d.ts.map +0 -1
  276. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts +0 -34
  277. package/dist/types/src/extensions/popover/usePopoverMenu.d.ts.map +0 -1
  278. package/dist/types/src/extensions/popover/util.d.ts +0 -8
  279. package/dist/types/src/extensions/popover/util.d.ts.map +0 -1
  280. package/dist/types/src/extensions/preview/index.d.ts +0 -2
  281. package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
  282. package/dist/types/src/extensions/preview/preview.d.ts +0 -28
  283. package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
  284. package/dist/types/src/extensions/selection.d.ts +0 -24
  285. package/dist/types/src/extensions/selection.d.ts.map +0 -1
  286. package/dist/types/src/extensions/state.d.ts +0 -2
  287. package/dist/types/src/extensions/state.d.ts.map +0 -1
  288. package/dist/types/src/extensions/tags/extended-markdown.d.ts +0 -10
  289. package/dist/types/src/extensions/tags/extended-markdown.d.ts.map +0 -1
  290. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts +0 -2
  291. package/dist/types/src/extensions/tags/extended-markdown.test.d.ts.map +0 -1
  292. package/dist/types/src/extensions/tags/index.d.ts +0 -4
  293. package/dist/types/src/extensions/tags/index.d.ts.map +0 -1
  294. package/dist/types/src/extensions/tags/streamer.d.ts +0 -12
  295. package/dist/types/src/extensions/tags/streamer.d.ts.map +0 -1
  296. package/dist/types/src/extensions/tags/xml-tags.d.ts +0 -72
  297. package/dist/types/src/extensions/tags/xml-tags.d.ts.map +0 -1
  298. package/dist/types/src/extensions/tags/xml-util.d.ts +0 -10
  299. package/dist/types/src/extensions/tags/xml-util.d.ts.map +0 -1
  300. package/dist/types/src/extensions/typewriter.d.ts +0 -10
  301. package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
  302. package/dist/types/src/styles/index.d.ts +0 -4
  303. package/dist/types/src/styles/index.d.ts.map +0 -1
  304. package/dist/types/src/styles/markdown.d.ts +0 -8
  305. package/dist/types/src/styles/markdown.d.ts.map +0 -1
  306. package/dist/types/src/styles/theme.d.ts +0 -38
  307. package/dist/types/src/styles/theme.d.ts.map +0 -1
  308. package/dist/types/src/styles/tokens.d.ts +0 -3
  309. package/dist/types/src/styles/tokens.d.ts.map +0 -1
  310. package/dist/types/src/testing/PreviewPopover.d.ts +0 -20
  311. package/dist/types/src/testing/PreviewPopover.d.ts.map +0 -1
  312. package/dist/types/src/testing/index.d.ts +0 -3
  313. package/dist/types/src/testing/index.d.ts.map +0 -1
  314. package/dist/types/src/testing/util.d.ts +0 -3
  315. package/dist/types/src/testing/util.d.ts.map +0 -1
  316. package/dist/types/src/types/index.d.ts +0 -2
  317. package/dist/types/src/types/index.d.ts.map +0 -1
  318. package/dist/types/src/types/types.d.ts +0 -21
  319. package/dist/types/src/types/types.d.ts.map +0 -1
  320. package/dist/types/src/util/cursor.d.ts +0 -31
  321. package/dist/types/src/util/cursor.d.ts.map +0 -1
  322. package/dist/types/src/util/debug.d.ts +0 -17
  323. package/dist/types/src/util/debug.d.ts.map +0 -1
  324. package/dist/types/src/util/decorations.d.ts +0 -4
  325. package/dist/types/src/util/decorations.d.ts.map +0 -1
  326. package/dist/types/src/util/dom.d.ts +0 -10
  327. package/dist/types/src/util/dom.d.ts.map +0 -1
  328. package/dist/types/src/util/facet.d.ts +0 -3
  329. package/dist/types/src/util/facet.d.ts.map +0 -1
  330. package/src/components/EditorToolbar/util.ts +0 -76
  331. package/src/defaults.ts +0 -52
  332. package/src/extensions/annotations.ts +0 -55
  333. package/src/extensions/autocomplete/autocomplete.ts +0 -220
  334. package/src/extensions/autocomplete/index.ts +0 -8
  335. package/src/extensions/autocomplete/match.ts +0 -46
  336. package/src/extensions/autocomplete/placeholder.ts +0 -117
  337. package/src/extensions/autocomplete/typeahead.ts +0 -87
  338. package/src/extensions/automerge/automerge.stories.tsx +0 -149
  339. package/src/extensions/automerge/automerge.test.tsx +0 -78
  340. package/src/extensions/automerge/automerge.ts +0 -105
  341. package/src/extensions/automerge/cursor.ts +0 -28
  342. package/src/extensions/automerge/defs.ts +0 -31
  343. package/src/extensions/automerge/index.ts +0 -5
  344. package/src/extensions/automerge/sync.ts +0 -79
  345. package/src/extensions/automerge/update-automerge.ts +0 -50
  346. package/src/extensions/automerge/update-codemirror.ts +0 -115
  347. package/src/extensions/autoscroll.ts +0 -157
  348. package/src/extensions/awareness/awareness-provider.ts +0 -127
  349. package/src/extensions/awareness/awareness.ts +0 -315
  350. package/src/extensions/awareness/index.ts +0 -6
  351. package/src/extensions/blast.ts +0 -363
  352. package/src/extensions/comments.ts +0 -597
  353. package/src/extensions/debug.ts +0 -15
  354. package/src/extensions/dnd.ts +0 -37
  355. package/src/extensions/factories.ts +0 -276
  356. package/src/extensions/focus.ts +0 -36
  357. package/src/extensions/folding.tsx +0 -44
  358. package/src/extensions/hashtag.tsx +0 -68
  359. package/src/extensions/index.ts +0 -29
  360. package/src/extensions/json.ts +0 -57
  361. package/src/extensions/listener.ts +0 -38
  362. package/src/extensions/markdown/action.ts +0 -117
  363. package/src/extensions/markdown/bundle.ts +0 -95
  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 -601
  368. package/src/extensions/markdown/formatting.test.ts +0 -498
  369. package/src/extensions/markdown/formatting.ts +0 -1267
  370. package/src/extensions/markdown/highlight.ts +0 -183
  371. package/src/extensions/markdown/image.ts +0 -118
  372. package/src/extensions/markdown/index.ts +0 -13
  373. package/src/extensions/markdown/link.ts +0 -50
  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 -150
  377. package/src/extensions/mention.ts +0 -41
  378. package/src/extensions/modes.ts +0 -41
  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/menu.ts +0 -128
  384. package/src/extensions/outliner/outliner.test.ts +0 -100
  385. package/src/extensions/outliner/outliner.ts +0 -167
  386. package/src/extensions/outliner/selection.ts +0 -50
  387. package/src/extensions/outliner/tree.test.ts +0 -168
  388. package/src/extensions/outliner/tree.ts +0 -317
  389. package/src/extensions/popover/index.ts +0 -12
  390. package/src/extensions/popover/modal.ts +0 -24
  391. package/src/extensions/popover/util.ts +0 -29
  392. package/src/extensions/preview/index.ts +0 -5
  393. package/src/extensions/preview/preview.ts +0 -188
  394. package/src/extensions/selection.ts +0 -100
  395. package/src/extensions/state.ts +0 -7
  396. package/src/extensions/tags/extended-markdown.test.ts +0 -261
  397. package/src/extensions/tags/extended-markdown.ts +0 -78
  398. package/src/extensions/tags/index.ts +0 -7
  399. package/src/extensions/tags/streamer.ts +0 -243
  400. package/src/extensions/tags/xml-tags.ts +0 -393
  401. package/src/extensions/tags/xml-util.ts +0 -94
  402. package/src/extensions/typewriter.ts +0 -68
  403. package/src/styles/index.ts +0 -7
  404. package/src/styles/markdown.ts +0 -26
  405. package/src/styles/theme.ts +0 -269
  406. package/src/styles/tokens.ts +0 -17
  407. package/src/testing/PreviewPopover.tsx +0 -80
  408. package/src/testing/index.ts +0 -6
  409. package/src/testing/util.ts +0 -7
  410. package/src/types/index.ts +0 -5
  411. package/src/types/types.ts +0 -32
  412. package/src/util/cursor.ts +0 -56
  413. package/src/util/debug.ts +0 -64
  414. package/src/util/decorations.ts +0 -21
  415. package/src/util/dom.ts +0 -34
  416. package/src/util/facet.ts +0 -13
@@ -10,20 +10,27 @@ import { createPortal } from 'react-dom';
10
10
 
11
11
  import { invariant } from '@dxos/invariant';
12
12
  import { faker } from '@dxos/random';
13
- import { Popover } from '@dxos/react-ui';
14
- import { withTheme } from '@dxos/react-ui/testing';
15
- import { Card } from '@dxos/react-ui-stack';
16
- import { hoverableControlItem, hoverableControlItemTransition, hoverableControls } from '@dxos/react-ui-theme';
13
+ import { Card, Popover, Toolbar } from '@dxos/react-ui';
14
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
15
+ import { Menu, createMenuAction } from '@dxos/react-ui-menu';
16
+ import {
17
+ type PreviewBlock,
18
+ type PreviewLinkRef,
19
+ type PreviewLinkTarget,
20
+ getLinkRef,
21
+ image,
22
+ preview,
23
+ } from '@dxos/ui-editor';
24
+ import { hoverableControls } from '@dxos/ui-theme';
17
25
  import { trim } from '@dxos/util';
18
26
 
19
- import { type PreviewLinkRef, type PreviewLinkTarget, getLinkRef, image, preview } from '../extensions';
20
- import { PreviewPopoverProvider, usePreviewPopover } from '../testing';
27
+ import { type EditorController, EditorPreviewProvider, useEditorPreview } from '../components';
21
28
 
22
29
  import { EditorStory } from './components';
23
30
 
24
- const handlePreviewLookup = async ({ label, ref }: PreviewLinkRef): Promise<PreviewLinkTarget> => {
31
+ const handlePreviewLookup = async ({ dxn, label }: PreviewLinkRef): Promise<PreviewLinkTarget> => {
25
32
  // Random text.
26
- faker.seed(ref.split('').reduce((acc: number, char: string) => acc + char.charCodeAt(0), 1));
33
+ faker.seed(dxn.split('').reduce((acc: number, char: string) => acc + char.charCodeAt(0), 1));
27
34
  const text = Array.from({ length: 2 }, () => faker.lorem.paragraphs()).join('\n\n');
28
35
  return {
29
36
  label,
@@ -43,15 +50,27 @@ const useRefTarget = (link: PreviewLinkRef): PreviewLinkTarget | undefined => {
43
50
  };
44
51
 
45
52
  const PreviewCard = () => {
46
- const { target } = usePreviewPopover('PreviewCard');
53
+ const { target } = useEditorPreview('PreviewCard');
54
+ if (!target) {
55
+ return null;
56
+ }
57
+
47
58
  return (
48
59
  <Popover.Portal>
49
60
  <Popover.Content onOpenAutoFocus={(event) => event.preventDefault()}>
50
- <Popover.Viewport>
51
- <Card.SurfaceRoot role='card--popover'>
52
- <Card.Heading>{target?.label}</Card.Heading>
53
- {target && <Card.Text classNames='line-clamp-3'>{target.text}</Card.Text>}
54
- </Card.SurfaceRoot>
61
+ <Popover.Viewport classNames='dx-card-popover-width'>
62
+ <Card.Root border={false}>
63
+ <Card.Toolbar>
64
+ <Card.Icon toolbar icon='ph--file-text--regular' />
65
+ <Card.Title>{target.label}</Card.Title>
66
+ <Popover.Close asChild>
67
+ <Card.CloseIconButton />
68
+ </Popover.Close>
69
+ </Card.Toolbar>
70
+ <Card.Row>
71
+ <Card.Text variant='description'>{target.text}</Card.Text>
72
+ </Card.Row>
73
+ </Card.Root>
55
74
  </Popover.Viewport>
56
75
  <Popover.Arrow />
57
76
  </Popover.Content>
@@ -70,7 +89,7 @@ type PreviewAction =
70
89
  link: PreviewLinkRef;
71
90
  };
72
91
 
73
- const PreviewBlock = ({ link, el, view }: { link: PreviewLinkRef; el: HTMLElement; view?: EditorView }) => {
92
+ const PreviewBlockComponent = ({ link, el, view }: { link: PreviewLinkRef; el: HTMLElement; view?: EditorView }) => {
74
93
  const target = useRefTarget(link);
75
94
 
76
95
  const handleAction = useCallback(
@@ -83,7 +102,7 @@ const PreviewBlock = ({ link, el, view }: { link: PreviewLinkRef; el: HTMLElemen
83
102
  }
84
103
 
85
104
  const link = getLinkRef(view.state, node);
86
- if (link?.ref !== action.link.ref) {
105
+ if (link?.dxn !== action.link.dxn) {
87
106
  return;
88
107
  }
89
108
 
@@ -125,41 +144,45 @@ const PreviewBlock = ({ link, el, view }: { link: PreviewLinkRef; el: HTMLElemen
125
144
  }
126
145
  }, [handleAction, link, target]);
127
146
 
147
+ const menuItems = useMemo(
148
+ () => [
149
+ createMenuAction('delete', handleDelete, {
150
+ label: link.suggest ? 'Discard' : 'Delete',
151
+ icon: 'ph--x--regular',
152
+ }),
153
+ ...(target
154
+ ? [
155
+ createMenuAction('apply', handleInsert, {
156
+ label: 'Apply',
157
+ icon: 'ph--check--regular',
158
+ }),
159
+ ]
160
+ : []),
161
+ ],
162
+ [handleDelete, handleInsert, link.suggest, target],
163
+ );
164
+
128
165
  return createPortal(
129
- <Card.StaticRoot classNames={hoverableControls}>
130
- <div className='flex items-start'>
166
+ <Menu.Root>
167
+ <Card.Root classNames={hoverableControls}>
131
168
  {!view?.state.readOnly && (
132
- <Card.Toolbar classNames='is-min p-[--dx-cardSpacingInline]'>
133
- {(link.suggest && (
134
- <>
135
- <Card.ToolbarIconButton label='Discard' icon='ph--x--regular' onClick={handleDelete} />
136
- {target && (
137
- <Card.ToolbarIconButton
138
- classNames='bg-successSurface text-successSurfaceText'
139
- label='Apply'
140
- icon='ph--check--regular'
141
- onClick={handleInsert}
142
- />
143
- )}
144
- </>
145
- )) || (
146
- <Card.ToolbarIconButton
147
- iconOnly
148
- label='Delete'
149
- icon='ph--x--regular'
150
- classNames={[hoverableControlItem, hoverableControlItemTransition]}
151
- onClick={handleDelete}
152
- />
153
- )}
169
+ <Card.Toolbar>
170
+ <Card.Icon toolbar icon='ph--bookmark--regular' />
171
+ <Card.Title>{link.label}</Card.Title>
172
+ {/* TODO(wittjosiah): Reconcile with Card.Menu. */}
173
+ <Menu.Trigger asChild disabled={!menuItems?.length}>
174
+ <Toolbar.IconButton iconOnly variant='ghost' icon='ph--dots-three-vertical--regular' label='Menu' />
175
+ </Menu.Trigger>
176
+ <Menu.Content items={menuItems} />
154
177
  </Card.Toolbar>
155
178
  )}
156
- <Card.Heading classNames='grow order-first mie-0'>
157
- {/* <span className='text-xs text-subdued mie-2'>Prompt</span> */}
158
- {link.label}
159
- </Card.Heading>
160
- </div>
161
- {target && <Card.Text classNames='line-clamp-3 mbs-0'>{target.text}</Card.Text>}
162
- </Card.StaticRoot>,
179
+ {target && (
180
+ <Card.Row>
181
+ <Card.Text className='text-description'>{target.text}</Card.Text>
182
+ </Card.Row>
183
+ )}
184
+ </Card.Root>
185
+ </Menu.Root>,
163
186
  el,
164
187
  );
165
188
  };
@@ -167,7 +190,7 @@ const PreviewBlock = ({ link, el, view }: { link: PreviewLinkRef; el: HTMLElemen
167
190
  const meta = {
168
191
  title: 'ui/react-ui-editor/Preview',
169
192
  component: EditorStory,
170
- decorators: [withTheme],
193
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
171
194
  parameters: {
172
195
  layout: 'fullscreen',
173
196
  },
@@ -177,53 +200,49 @@ export default meta;
177
200
 
178
201
  type Story = StoryObj<typeof meta>;
179
202
 
203
+ const text = trim`
204
+ # Preview
205
+
206
+ This project is part of the [DXOS](dxn:queue:data:123) SDK.
207
+
208
+ ![DXOS](dxn:queue:data:123)
209
+
210
+ It consists of [ECHO](dxn:queue:data:echo), [HALO](dxn:queue:data:halo), and [MESH](dxn:queue:data:mesh).
211
+
212
+ ## Deep dive
213
+
214
+ ![ECHO](dxn:queue:data:echo)
215
+
216
+ `;
217
+
180
218
  export const Default: Story = {
181
219
  render: () => {
182
- const [view, setView] = useState<EditorView>();
183
- const [previewBlocks, setPreviewBlocks] = useState<{ link: PreviewLinkRef; el: HTMLElement }[]>([]);
220
+ const [controller, setController] = useState<EditorController | null>(null);
221
+ const [previewBlocks, setPreviewBlocks] = useState<PreviewBlock[]>([]);
184
222
  const extensions = useMemo(() => {
185
223
  return [
186
224
  image(),
187
225
  preview({
188
- addBlockContainer: (link, el) => {
189
- setPreviewBlocks((prev) => [...prev, { link, el }]);
226
+ addBlockContainer: (block) => {
227
+ setPreviewBlocks((prev) => [...prev, block]);
190
228
  },
191
- removeBlockContainer: (link) => {
192
- setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.ref !== link.ref));
229
+ removeBlockContainer: (block) => {
230
+ setPreviewBlocks((prev) => prev.filter(({ link: prevLink }) => prevLink.dxn !== block.link.dxn));
193
231
  },
194
232
  }),
195
233
  ];
196
234
  }, []);
197
235
 
198
- const handleViewRef = useCallback((instance?: EditorView | null) => {
199
- setView(instance ?? undefined);
200
- }, []);
201
-
236
+ // TODO(burdon): Migrate to Editor.Root.
202
237
  return (
203
- <PreviewPopoverProvider onLookup={handlePreviewLookup}>
204
- <EditorStory
205
- ref={handleViewRef}
206
- text={trim`
207
- # Preview
208
-
209
- This project is part of the [DXOS](dxn:queue:data:123) SDK.
210
-
211
- ![DXOS](dxn:queue:data:123)
212
-
213
- It consists of [ECHO](dxn:queue:data:echo), [HALO](dxn:queue:data:halo), and [MESH](dxn:queue:data:mesh).
214
-
215
- ## Deep dive
216
-
217
- ![ECHO](dxn:queue:data:echo)
218
-
219
- `}
220
- extensions={extensions}
221
- />
238
+ <EditorPreviewProvider onLookup={handlePreviewLookup}>
239
+ <EditorStory ref={setController} text={text} extensions={extensions} />
222
240
  <PreviewCard />
223
- {previewBlocks.map(({ link, el }) => (
224
- <PreviewBlock key={link.ref} link={link} el={el} view={view} />
225
- ))}
226
- </PreviewPopoverProvider>
241
+ {controller?.view &&
242
+ previewBlocks.map(({ link, el }) => (
243
+ <PreviewBlockComponent key={link.dxn} link={link} el={el} view={controller.view!} />
244
+ ))}
245
+ </EditorPreviewProvider>
227
246
  );
228
247
  },
229
248
  };
@@ -3,13 +3,11 @@
3
3
  //
4
4
 
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
- import React, { useState } from 'react';
6
+ import React, { useEffect, useState } from 'react';
7
7
  import { createPortal } from 'react-dom';
8
8
 
9
9
  import { useThemeContext } from '@dxos/react-ui';
10
- import { withTheme } from '@dxos/react-ui/testing';
11
- import { trim } from '@dxos/util';
12
-
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
13
11
  import {
14
12
  type XmlWidgetRegistry,
15
13
  type XmlWidgetState,
@@ -18,14 +16,35 @@ import {
18
16
  decorateMarkdown,
19
17
  extendedMarkdown,
20
18
  xmlTags,
21
- } from '../extensions';
19
+ } from '@dxos/ui-editor';
20
+ import { safeParseInt, trim } from '@dxos/util';
21
+
22
22
  import { useTextEditor } from '../hooks';
23
23
 
24
24
  const registry = {
25
- // <test/>
26
- ['test' as const]: {
25
+ /**
26
+ * Custom tag: <test/>
27
+ */
28
+ test: {
27
29
  block: true,
28
- Component: () => <div className='p-2 border border-separator rounded'>Test</div>,
30
+ Component: ({ start = '0' }) => {
31
+ const [count, setCount] = useState<number>(safeParseInt(start, 0));
32
+ useEffect(() => {
33
+ const interval = setInterval(() => {
34
+ setCount((prev) => {
35
+ if (prev >= 200) {
36
+ clearInterval(interval);
37
+ return prev;
38
+ }
39
+
40
+ return prev + 1;
41
+ });
42
+ }, 100);
43
+ return () => clearInterval(interval);
44
+ }, []);
45
+
46
+ return <div className='p-2 border border-separator rounded-sm'>Test {count}</div>;
47
+ },
29
48
  },
30
49
  } satisfies XmlWidgetRegistry;
31
50
 
@@ -36,7 +55,7 @@ const DefaultStory = ({ text }: { text?: string }) => {
36
55
  initialValue: text,
37
56
  extensions: [
38
57
  createThemeExtensions({ themeMode }),
39
- createBasicExtensions({ lineWrapping: true, readOnly: true }),
58
+ createBasicExtensions({ lineWrapping: true }),
40
59
  decorateMarkdown(),
41
60
  extendedMarkdown({ registry }),
42
61
  xmlTags({ registry, setWidgets }),
@@ -45,8 +64,8 @@ const DefaultStory = ({ text }: { text?: string }) => {
45
64
 
46
65
  return (
47
66
  <>
48
- <div ref={parentRef} className='is-full p-4' />
49
- {widgets.map(({ Component, root, id, ...props }) => (
67
+ <div ref={parentRef} className='w-full p-4' />
68
+ {widgets.map(({ id, root, Component, props }) => (
50
69
  <div key={id}>{createPortal(<Component {...props} />, root)}</div>
51
70
  ))}
52
71
  </>
@@ -56,7 +75,11 @@ const DefaultStory = ({ text }: { text?: string }) => {
56
75
  const text = trim`
57
76
  # Tags
58
77
 
59
- <test id="123" />
78
+ React widget below.
79
+
80
+ <test id="t-1" />
81
+
82
+ <test id="t-2" start="100" />
60
83
 
61
84
  React widget above.
62
85
  `;
@@ -64,7 +87,7 @@ const text = trim`
64
87
  const meta = {
65
88
  title: 'ui/react-ui-editor/Tags',
66
89
  render: DefaultStory,
67
- decorators: [withTheme],
90
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
68
91
  parameters: {
69
92
  layout: 'fullscreen',
70
93
  },
@@ -8,21 +8,19 @@ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
8
  import React from 'react';
9
9
 
10
10
  import { log } from '@dxos/log';
11
- import { withTheme } from '@dxos/react-ui/testing';
12
-
13
- import { editorMonospace } from '../defaults';
11
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
14
12
  import {
15
13
  InputModeExtensions,
16
14
  decorateMarkdown,
17
15
  folding,
18
16
  image,
17
+ join,
19
18
  listener,
20
19
  mention,
21
20
  selectionState,
22
21
  staticCompletion,
23
22
  typeahead,
24
- } from '../extensions';
25
- import { str } from '../testing';
23
+ } from '@dxos/ui-editor';
26
24
 
27
25
  import {
28
26
  EditorStory,
@@ -39,7 +37,7 @@ import {
39
37
  const meta = {
40
38
  title: 'ui/react-ui-editor/TextEditor',
41
39
  component: EditorStory,
42
- decorators: [withTheme],
40
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
43
41
  parameters: {
44
42
  layout: 'fullscreen',
45
43
  controls: { disable: true },
@@ -97,7 +95,7 @@ export const NoExtensions: Story = {
97
95
  export const Vim: Story = {
98
96
  render: () => (
99
97
  <EditorStory
100
- text={str('# Vim Mode', '', 'The distant future. The year 2000.', '', content.paragraphs)}
98
+ text={join('# Vim Mode', '', 'The distant future. The year 2000.', '', content.paragraphs)}
101
99
  extensions={[defaultExtensions, InputModeExtensions.vim]}
102
100
  />
103
101
  ),
@@ -110,13 +108,13 @@ export const Vim: Story = {
110
108
  export const Listener: Story = {
111
109
  render: () => (
112
110
  <EditorStory
113
- text={str('# Listener', '', content.footer)}
111
+ text={join('# Listener', '', content.footer)}
114
112
  extensions={[
115
113
  listener({
116
- onFocus: (focusing) => {
114
+ onFocus: ({ focusing }) => {
117
115
  log.info('listener', { focusing });
118
116
  },
119
- onChange: (text) => {
117
+ onChange: ({ text }) => {
120
118
  log.info('listener', { text });
121
119
  },
122
120
  }),
@@ -140,7 +138,7 @@ export const Folding: Story = {
140
138
  export const Scrolling: Story = {
141
139
  render: () => (
142
140
  <EditorStory
143
- text={str('# Large Document', '', longText)}
141
+ text={join('# Large Document', '', longText)}
144
142
  extensions={selectionState({
145
143
  setState: (id, state) => global.set(id, state),
146
144
  getState: (id) => global.get(id),
@@ -151,7 +149,7 @@ export const Scrolling: Story = {
151
149
 
152
150
  export const ScrollingWithImages: Story = {
153
151
  render: () => (
154
- <EditorStory text={str('# Large Document', '', largeWithImages)} extensions={[decorateMarkdown(), image()]} />
152
+ <EditorStory text={join('# Large Document', '', largeWithImages)} extensions={[decorateMarkdown(), image()]} />
155
153
  ),
156
154
  };
157
155
 
@@ -159,7 +157,7 @@ export const ScrollTo: Story = {
159
157
  render: () => {
160
158
  // NOTE: Selection won't appear if text is reformatted.
161
159
  const word = 'Scroll to here...';
162
- const text = str('# Scroll To', longText, '', word, '', longText);
160
+ const text = join('# Scroll To', longText, '', word, '', longText);
163
161
  const idx = text.indexOf(word);
164
162
  return (
165
163
  <EditorStory
@@ -178,11 +176,7 @@ export const ScrollTo: Story = {
178
176
 
179
177
  export const Typescript: Story = {
180
178
  render: () => (
181
- <EditorStory
182
- text={content.typescript}
183
- lineNumbers
184
- extensions={[editorMonospace, javascript({ typescript: true })]}
185
- />
179
+ <EditorStory text={content.typescript} lineNumbers monospace extensions={javascript({ typescript: true })} />
186
180
  ),
187
181
  };
188
182
 
@@ -195,7 +189,7 @@ const completions = ['hello world!', 'dxos.org'];
195
189
  export const Typeahead: Story = {
196
190
  render: () => (
197
191
  <EditorStory
198
- text={str('# Typeahead', '')}
192
+ text={join('# Typeahead', '')}
199
193
  extensions={[
200
194
  typeahead({
201
195
  onComplete: staticCompletion(completions, { minLength: 2 }),
@@ -212,7 +206,7 @@ export const Typeahead: Story = {
212
206
  export const Mention: Story = {
213
207
  render: () => (
214
208
  <EditorStory
215
- text={str('# Mention', '', 'Type @...', content.footer)}
209
+ text={join('# Mention', '', 'Type @...', content.footer)}
216
210
  extensions={[
217
211
  mention({
218
212
  onSearch: (text) => names.filter((name) => name.toLowerCase().startsWith(text.toLowerCase())),
@@ -229,7 +223,7 @@ export const Mention: Story = {
229
223
  export const Search: Story = {
230
224
  render: () => (
231
225
  <EditorStory
232
- text={str('# Search', text)}
226
+ text={join('# Search', text)}
233
227
  extensions={defaultExtensions}
234
228
  onReady={(view) => openSearchPanel(view)}
235
229
  />
@@ -0,0 +1,61 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useMemo } from 'react';
7
+
8
+ import { useThemeContext } from '@dxos/react-ui';
9
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
10
+ import { createBasicExtensions, createThemeExtensions } from '@dxos/ui-editor';
11
+
12
+ import { Editor } from '../components';
13
+
14
+ const createText = (monospace?: boolean) =>
15
+ [`${monospace ? 'monospace' : 'body'}`, 'Hello world', '0123456789'].join('\n');
16
+
17
+ const DefaultStory = () => {
18
+ const { themeMode } = useThemeContext();
19
+ const [ext1, ext2] = useMemo(
20
+ () => [
21
+ //
22
+ [
23
+ createBasicExtensions({ placeholder: 'Enter text', search: true }),
24
+ createThemeExtensions({ themeMode, monospace: false }),
25
+ ],
26
+ [
27
+ createBasicExtensions({ placeholder: 'Enter text', search: true }),
28
+ createThemeExtensions({ themeMode, monospace: true }),
29
+ ],
30
+ ],
31
+ [],
32
+ );
33
+
34
+ return (
35
+ <div className='w-full grid grid-cols-2 gap-2'>
36
+ <Editor.Root>
37
+ <Editor.Content classNames='p-2' extensions={ext1} initialValue={createText(false)} />
38
+ </Editor.Root>
39
+ <Editor.Root>
40
+ <Editor.Content classNames='p-2' extensions={ext2} initialValue={createText(true)} />
41
+ </Editor.Root>
42
+ </div>
43
+ );
44
+ };
45
+
46
+ const meta: Meta<typeof DefaultStory> = {
47
+ title: 'ui/react-ui-editor/Theme',
48
+ component: DefaultStory,
49
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
50
+ parameters: {
51
+ layout: 'fullscreen',
52
+ },
53
+ };
54
+
55
+ export default meta;
56
+
57
+ type Story = StoryObj<typeof meta>;
58
+
59
+ export const Default: Story = {
60
+ args: {},
61
+ };
@@ -3,30 +3,29 @@
3
3
  //
4
4
 
5
5
  import { type EditorView } from '@codemirror/view';
6
- import React, { type ReactNode, forwardRef, useEffect, useImperativeHandle, useMemo, useState } from 'react';
6
+ import React, { type ReactNode, forwardRef, useEffect, useImperativeHandle, useMemo, useRef, useState } from 'react';
7
7
 
8
- import { Expando } from '@dxos/echo/internal';
9
- import { live } from '@dxos/echo/internal';
8
+ import { Obj } from '@dxos/echo';
9
+ import { TestSchema } from '@dxos/echo/testing';
10
10
  import { invariant } from '@dxos/invariant';
11
11
  import { PublicKey } from '@dxos/keys';
12
- import { createDocAccessor, createObject } from '@dxos/react-client/echo';
13
- import { useForwardedRef, useThemeContext } from '@dxos/react-ui';
12
+ import { log } from '@dxos/log';
13
+ import { useMergeRefs, useThemeContext } from '@dxos/react-ui';
14
14
  import { useAttentionAttributes } from '@dxos/react-ui-attention';
15
15
  import { JsonFilter } from '@dxos/react-ui-syntax-highlighter';
16
- import { mx } from '@dxos/react-ui-theme';
17
- import { isNonNullable } from '@dxos/util';
18
-
19
- import { editorGutter, editorSlots } from '../../defaults';
20
16
  import {
21
17
  type DebugNode,
22
18
  type ThemeExtensionsOptions,
23
19
  createBasicExtensions,
24
- createDataExtensions,
25
20
  createMarkdownExtensions,
26
21
  createThemeExtensions,
27
22
  debugTree,
28
- decorateMarkdown,
29
- } from '../../extensions';
23
+ editorSlots,
24
+ } from '@dxos/ui-editor';
25
+ import { mx } from '@dxos/ui-theme';
26
+ import { isNonNullable } from '@dxos/util';
27
+
28
+ import { type EditorController, createEditorController } from '../../components';
30
29
  import { type UseTextEditorProps, useTextEditor } from '../../hooks';
31
30
 
32
31
  // Type definitions.
@@ -39,28 +38,32 @@ export type StoryProps = Pick<UseTextEditorProps, 'id' | 'scrollTo' | 'selection
39
38
  debug?: DebugMode;
40
39
  debugCustom?: (view: EditorView) => ReactNode;
41
40
  text?: string;
42
- object?: Expando;
41
+ object?: Obj.OfShape<TestSchema.Expando>;
43
42
  readOnly?: boolean;
44
43
  placeholder?: string;
45
44
  lineNumbers?: boolean;
45
+ monospace?: boolean;
46
46
  onReady?: (view: EditorView) => void;
47
47
  };
48
48
 
49
- export const EditorStory = forwardRef<EditorView | null, StoryProps>(
50
- ({ debug, debugCustom, text, extensions: _extensions, ...props }, forwardedRef) => {
49
+ export const EditorStory = forwardRef<EditorController, StoryProps>(
50
+ ({ debug, debugCustom, text, extensions: extensionsProp, ...props }, forwardedRef) => {
51
+ const controllerRef = useRef<EditorController>(null);
52
+ const mergedRef = useMergeRefs([controllerRef, forwardedRef]);
53
+
51
54
  const attentionAttrs = useAttentionAttributes('test-panel');
52
55
  const [tree, setTree] = useState<DebugNode>();
53
- const [object] = useState(createObject(live(Expando, { content: text ?? '' })));
54
- const viewRef = useForwardedRef(forwardedRef);
56
+ const [object] = useState(Obj.make(TestSchema.Expando, { content: text ?? '' }));
57
+
55
58
  const extensions = useMemo(
56
- () => (debug ? [_extensions, debugTree(setTree)].filter(isNonNullable) : _extensions),
57
- [debug, _extensions],
59
+ () => (debug ? [extensionsProp, debugTree(setTree)].filter(isNonNullable) : extensionsProp),
60
+ [debug, extensionsProp],
58
61
  );
59
62
 
60
- const view = viewRef.current;
63
+ const view = controllerRef.current?.view;
61
64
  return (
62
65
  <div className={mx('w-full h-full grid overflow-hidden', debug && 'grid-cols-2 lg:grid-cols-[1fr_600px]')}>
63
- <EditorComponent ref={viewRef} object={object} text={text} extensions={extensions} {...props} />
66
+ <EditorComponent ref={mergedRef} object={object} text={text} extensions={extensions} {...props} />
64
67
 
65
68
  {debug && (
66
69
  <div
@@ -84,7 +87,7 @@ export const EditorStory = forwardRef<EditorView | null, StoryProps>(
84
87
  /**
85
88
  * Default story component.
86
89
  */
87
- export const EditorComponent = forwardRef<EditorView | null, StoryProps>(
90
+ const EditorComponent = forwardRef<EditorController, StoryProps>(
88
91
  (
89
92
  {
90
93
  id = defaultId,
@@ -93,6 +96,7 @@ export const EditorComponent = forwardRef<EditorView | null, StoryProps>(
93
96
  readOnly,
94
97
  placeholder = 'New document.',
95
98
  lineNumbers,
99
+ monospace,
96
100
  scrollTo,
97
101
  selection,
98
102
  extensions,
@@ -111,19 +115,20 @@ export const EditorComponent = forwardRef<EditorView | null, StoryProps>(
111
115
  selection,
112
116
  initialValue: text,
113
117
  extensions: [
114
- createDataExtensions({ id, text: createDocAccessor(object, ['content']) }),
115
118
  createBasicExtensions({ readOnly, placeholder, lineNumbers, scrollPastEnd: true, search: true }),
119
+ createThemeExtensions({ monospace, themeMode, syntaxHighlighting: true, slots }),
116
120
  createMarkdownExtensions(),
117
- createThemeExtensions({ themeMode, syntaxHighlighting: true, slots }),
118
- decorateMarkdown(),
119
- editorGutter,
120
121
  extensions || [],
121
122
  ],
122
123
  }),
123
124
  [id, object, extensions, themeMode],
124
125
  );
125
126
 
126
- useImperativeHandle<EditorView | null, EditorView | null>(forwardedRef, () => view, [view]);
127
+ // External controller.
128
+ useImperativeHandle(forwardedRef, () => {
129
+ log.info('view updated', { id });
130
+ return createEditorController(view);
131
+ }, [id, view]);
127
132
 
128
133
  useEffect(() => {
129
134
  if (view) {