@dxos/react-ui-editor 0.8.4-main.b97322e → 0.8.4-main.bcb3aa67d6

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 (401) hide show
  1. package/dist/lib/browser/index.mjs +1337 -7593
  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 +1337 -7592
  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 -15
  8. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -1
  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/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/components/EditorMenuProvider/EditorMenuProvider.d.ts +34 -0
  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/components/EditorMenuProvider/popover.d.ts +46 -0
  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/blocks.d.ts +4 -17
  36. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  37. package/dist/types/src/components/EditorToolbar/formatting.d.ts +4 -17
  38. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  39. package/dist/types/src/components/EditorToolbar/headings.d.ts +4 -17
  40. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  41. package/dist/types/src/components/EditorToolbar/image.d.ts +3 -15
  42. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  43. package/dist/types/src/components/EditorToolbar/index.d.ts +1 -1
  44. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/lists.d.ts +4 -17
  46. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  47. package/dist/types/src/components/EditorToolbar/search.d.ts +3 -15
  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 +5 -18
  52. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  53. package/dist/types/src/components/index.d.ts +4 -2
  54. package/dist/types/src/components/index.d.ts.map +1 -1
  55. package/dist/types/src/hooks/useTextEditor.d.ts +6 -10
  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/stories/Automerge.stories.d.ts +44 -0
  60. package/dist/types/src/stories/Automerge.stories.d.ts.map +1 -0
  61. package/dist/types/src/stories/Comments.stories.d.ts +22 -10
  62. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  63. package/dist/types/src/stories/EditorToolbar.stories.d.ts +40 -4
  64. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  65. package/dist/types/src/stories/Experimental.stories.d.ts +23 -13
  66. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  67. package/dist/types/src/stories/Markdown.stories.d.ts +33 -43
  68. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  69. package/dist/types/src/stories/Outliner.stories.d.ts +16 -22
  70. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  71. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  72. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  73. package/dist/types/src/stories/Preview.stories.d.ts +23 -7
  74. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  75. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  76. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  77. package/dist/types/src/stories/TextEditor.stories.d.ts +38 -52
  78. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  79. package/dist/types/src/stories/Theme.stories.d.ts +8 -0
  80. package/dist/types/src/stories/Theme.stories.d.ts.map +1 -0
  81. package/dist/types/src/stories/components/EditorStory.d.ts +11 -23
  82. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  83. package/dist/types/src/stories/components/util.d.ts +3 -3
  84. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  85. package/dist/types/src/translations.d.ts +26 -26
  86. package/dist/types/src/translations.d.ts.map +1 -1
  87. package/dist/types/src/util/index.d.ts +0 -4
  88. package/dist/types/src/util/index.d.ts.map +1 -1
  89. package/dist/types/src/util/react.d.ts +7 -6
  90. package/dist/types/src/util/react.d.ts.map +1 -1
  91. package/dist/types/tsconfig.tsbuildinfo +1 -1
  92. package/package.json +84 -80
  93. package/src/components/Editor/Editor.stories.tsx +95 -0
  94. package/src/components/Editor/Editor.tsx +170 -24
  95. package/src/components/EditorContent/EditorContent.tsx +83 -0
  96. package/src/components/EditorContent/controller.ts +50 -0
  97. package/src/components/EditorContent/index.ts +6 -0
  98. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +226 -0
  99. package/src/components/EditorMenuProvider/index.ts +10 -0
  100. package/src/components/EditorMenuProvider/menu-presets.ts +125 -0
  101. package/src/components/EditorMenuProvider/menu.ts +70 -0
  102. package/src/components/EditorMenuProvider/popover.ts +285 -0
  103. package/src/components/EditorMenuProvider/useEditorMenu.ts +180 -0
  104. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +79 -0
  105. package/src/components/EditorPreviewProvider/index.ts +5 -0
  106. package/src/components/EditorToolbar/EditorToolbar.tsx +90 -103
  107. package/src/components/EditorToolbar/blocks.ts +53 -48
  108. package/src/components/EditorToolbar/formatting.ts +42 -46
  109. package/src/components/EditorToolbar/headings.ts +46 -44
  110. package/src/components/EditorToolbar/image.ts +16 -10
  111. package/src/components/EditorToolbar/index.ts +2 -7
  112. package/src/components/EditorToolbar/lists.ts +39 -41
  113. package/src/components/EditorToolbar/search.ts +16 -10
  114. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  115. package/src/components/EditorToolbar/view-mode.ts +39 -39
  116. package/src/components/index.ts +6 -2
  117. package/src/hooks/useTextEditor.ts +39 -45
  118. package/src/index.ts +0 -10
  119. package/src/stories/Automerge.stories.tsx +173 -0
  120. package/src/stories/Comments.stories.tsx +59 -51
  121. package/src/stories/EditorToolbar.stories.tsx +72 -41
  122. package/src/stories/Experimental.stories.tsx +18 -16
  123. package/src/stories/Markdown.stories.tsx +37 -33
  124. package/src/stories/Outliner.stories.tsx +55 -44
  125. package/src/stories/Popover.stories.tsx +158 -0
  126. package/src/stories/Preview.stories.tsx +112 -92
  127. package/src/stories/Tags.stories.tsx +104 -0
  128. package/src/stories/TextEditor.stories.tsx +50 -75
  129. package/src/stories/Theme.stories.tsx +61 -0
  130. package/src/stories/components/EditorStory.tsx +48 -35
  131. package/src/stories/components/util.tsx +60 -31
  132. package/src/translations.ts +30 -25
  133. package/src/util/index.ts +1 -5
  134. package/src/util/react.tsx +9 -14
  135. package/dist/lib/browser/chunk-22UMM3QJ.mjs +0 -22
  136. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  137. package/dist/lib/browser/testing/index.mjs +0 -6
  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-YXYQPV6R.mjs +0 -24
  142. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  143. package/dist/lib/node-esm/testing/index.mjs +0 -8
  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/util.d.ts +0 -51
  148. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  149. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  150. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  151. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  152. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  153. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  154. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  155. package/dist/types/src/components/Popover/index.d.ts +0 -4
  156. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  157. package/dist/types/src/defaults.d.ts +0 -14
  158. package/dist/types/src/defaults.d.ts.map +0 -1
  159. package/dist/types/src/extensions/annotations.d.ts +0 -9
  160. package/dist/types/src/extensions/annotations.d.ts.map +0 -1
  161. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  162. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  163. package/dist/types/src/extensions/automerge/automerge.d.ts +0 -4
  164. package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
  165. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +0 -56
  166. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +0 -1
  167. package/dist/types/src/extensions/automerge/automerge.test.d.ts +0 -2
  168. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
  169. package/dist/types/src/extensions/automerge/cursor.d.ts +0 -4
  170. package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
  171. package/dist/types/src/extensions/automerge/defs.d.ts +0 -17
  172. package/dist/types/src/extensions/automerge/defs.d.ts.map +0 -1
  173. package/dist/types/src/extensions/automerge/index.d.ts +0 -2
  174. package/dist/types/src/extensions/automerge/index.d.ts.map +0 -1
  175. package/dist/types/src/extensions/automerge/sync.d.ts +0 -17
  176. package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
  177. package/dist/types/src/extensions/automerge/update-automerge.d.ts +0 -6
  178. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
  179. package/dist/types/src/extensions/automerge/update-codemirror.d.ts +0 -5
  180. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
  181. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +0 -31
  182. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
  183. package/dist/types/src/extensions/awareness/awareness.d.ts +0 -46
  184. package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
  185. package/dist/types/src/extensions/awareness/index.d.ts +0 -3
  186. package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
  187. package/dist/types/src/extensions/blast.d.ts +0 -25
  188. package/dist/types/src/extensions/blast.d.ts.map +0 -1
  189. package/dist/types/src/extensions/command/action.d.ts +0 -17
  190. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  191. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  192. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  193. package/dist/types/src/extensions/command/command.d.ts +0 -6
  194. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  195. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  196. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  197. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  198. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  199. package/dist/types/src/extensions/command/index.d.ts +0 -7
  200. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  201. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  202. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  203. package/dist/types/src/extensions/command/state.d.ts +0 -16
  204. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  205. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  206. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  207. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  208. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  209. package/dist/types/src/extensions/comments.d.ts +0 -95
  210. package/dist/types/src/extensions/comments.d.ts.map +0 -1
  211. package/dist/types/src/extensions/debug.d.ts +0 -3
  212. package/dist/types/src/extensions/debug.d.ts.map +0 -1
  213. package/dist/types/src/extensions/dnd.d.ts +0 -9
  214. package/dist/types/src/extensions/dnd.d.ts.map +0 -1
  215. package/dist/types/src/extensions/factories.d.ts +0 -83
  216. package/dist/types/src/extensions/factories.d.ts.map +0 -1
  217. package/dist/types/src/extensions/focus.d.ts +0 -7
  218. package/dist/types/src/extensions/focus.d.ts.map +0 -1
  219. package/dist/types/src/extensions/folding.d.ts +0 -7
  220. package/dist/types/src/extensions/folding.d.ts.map +0 -1
  221. package/dist/types/src/extensions/hashtag.d.ts +0 -3
  222. package/dist/types/src/extensions/hashtag.d.ts.map +0 -1
  223. package/dist/types/src/extensions/index.d.ts +0 -23
  224. package/dist/types/src/extensions/index.d.ts.map +0 -1
  225. package/dist/types/src/extensions/json.d.ts +0 -7
  226. package/dist/types/src/extensions/json.d.ts.map +0 -1
  227. package/dist/types/src/extensions/listener.d.ts +0 -11
  228. package/dist/types/src/extensions/listener.d.ts.map +0 -1
  229. package/dist/types/src/extensions/markdown/action.d.ts +0 -12
  230. package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
  231. package/dist/types/src/extensions/markdown/bundle.d.ts +0 -16
  232. package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
  233. package/dist/types/src/extensions/markdown/changes.d.ts +0 -10
  234. package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
  235. package/dist/types/src/extensions/markdown/changes.test.d.ts +0 -2
  236. package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
  237. package/dist/types/src/extensions/markdown/debug.d.ts +0 -11
  238. package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
  239. package/dist/types/src/extensions/markdown/decorate.d.ts +0 -17
  240. package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
  241. package/dist/types/src/extensions/markdown/formatting.d.ts +0 -63
  242. package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
  243. package/dist/types/src/extensions/markdown/formatting.test.d.ts +0 -3
  244. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
  245. package/dist/types/src/extensions/markdown/highlight.d.ts +0 -37
  246. package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
  247. package/dist/types/src/extensions/markdown/image.d.ts +0 -7
  248. package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
  249. package/dist/types/src/extensions/markdown/index.d.ts +0 -10
  250. package/dist/types/src/extensions/markdown/index.d.ts.map +0 -1
  251. package/dist/types/src/extensions/markdown/link.d.ts +0 -7
  252. package/dist/types/src/extensions/markdown/link.d.ts.map +0 -1
  253. package/dist/types/src/extensions/markdown/parser.test.d.ts +0 -2
  254. package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
  255. package/dist/types/src/extensions/markdown/styles.d.ts +0 -4
  256. package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
  257. package/dist/types/src/extensions/markdown/table.d.ts +0 -8
  258. package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
  259. package/dist/types/src/extensions/mention.d.ts +0 -7
  260. package/dist/types/src/extensions/mention.d.ts.map +0 -1
  261. package/dist/types/src/extensions/modes.d.ts +0 -10
  262. package/dist/types/src/extensions/modes.d.ts.map +0 -1
  263. package/dist/types/src/extensions/outliner/commands.d.ts +0 -10
  264. package/dist/types/src/extensions/outliner/commands.d.ts.map +0 -1
  265. package/dist/types/src/extensions/outliner/editor.d.ts +0 -5
  266. package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
  267. package/dist/types/src/extensions/outliner/editor.test.d.ts +0 -2
  268. package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
  269. package/dist/types/src/extensions/outliner/index.d.ts +0 -4
  270. package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
  271. package/dist/types/src/extensions/outliner/outliner.d.ts +0 -11
  272. package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
  273. package/dist/types/src/extensions/outliner/outliner.test.d.ts +0 -2
  274. package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +0 -1
  275. package/dist/types/src/extensions/outliner/selection.d.ts +0 -12
  276. package/dist/types/src/extensions/outliner/selection.d.ts.map +0 -1
  277. package/dist/types/src/extensions/outliner/tree.d.ts +0 -79
  278. package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
  279. package/dist/types/src/extensions/outliner/tree.test.d.ts +0 -2
  280. package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
  281. package/dist/types/src/extensions/preview/index.d.ts +0 -2
  282. package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
  283. package/dist/types/src/extensions/preview/preview.d.ts +0 -32
  284. package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
  285. package/dist/types/src/extensions/selection.d.ts +0 -24
  286. package/dist/types/src/extensions/selection.d.ts.map +0 -1
  287. package/dist/types/src/extensions/typewriter.d.ts +0 -10
  288. package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
  289. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  290. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  291. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  292. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  293. package/dist/types/src/styles/index.d.ts +0 -4
  294. package/dist/types/src/styles/index.d.ts.map +0 -1
  295. package/dist/types/src/styles/markdown.d.ts +0 -8
  296. package/dist/types/src/styles/markdown.d.ts.map +0 -1
  297. package/dist/types/src/styles/theme.d.ts +0 -38
  298. package/dist/types/src/styles/theme.d.ts.map +0 -1
  299. package/dist/types/src/styles/tokens.d.ts +0 -3
  300. package/dist/types/src/styles/tokens.d.ts.map +0 -1
  301. package/dist/types/src/testing/index.d.ts +0 -2
  302. package/dist/types/src/testing/index.d.ts.map +0 -1
  303. package/dist/types/src/testing/util.d.ts +0 -2
  304. package/dist/types/src/testing/util.d.ts.map +0 -1
  305. package/dist/types/src/types/index.d.ts +0 -2
  306. package/dist/types/src/types/index.d.ts.map +0 -1
  307. package/dist/types/src/types/types.d.ts +0 -21
  308. package/dist/types/src/types/types.d.ts.map +0 -1
  309. package/dist/types/src/util/cursor.d.ts +0 -31
  310. package/dist/types/src/util/cursor.d.ts.map +0 -1
  311. package/dist/types/src/util/debug.d.ts +0 -17
  312. package/dist/types/src/util/debug.d.ts.map +0 -1
  313. package/dist/types/src/util/dom.d.ts +0 -20
  314. package/dist/types/src/util/dom.d.ts.map +0 -1
  315. package/dist/types/src/util/facet.d.ts +0 -3
  316. package/dist/types/src/util/facet.d.ts.map +0 -1
  317. package/src/components/EditorToolbar/util.ts +0 -65
  318. package/src/components/Popover/CommandMenu.tsx +0 -279
  319. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  320. package/src/components/Popover/RefPopover.tsx +0 -99
  321. package/src/components/Popover/index.ts +0 -7
  322. package/src/defaults.ts +0 -49
  323. package/src/extensions/annotations.ts +0 -55
  324. package/src/extensions/autocomplete.ts +0 -69
  325. package/src/extensions/automerge/automerge.stories.tsx +0 -142
  326. package/src/extensions/automerge/automerge.test.tsx +0 -78
  327. package/src/extensions/automerge/automerge.ts +0 -85
  328. package/src/extensions/automerge/cursor.ts +0 -28
  329. package/src/extensions/automerge/defs.ts +0 -31
  330. package/src/extensions/automerge/index.ts +0 -5
  331. package/src/extensions/automerge/sync.ts +0 -75
  332. package/src/extensions/automerge/update-automerge.ts +0 -50
  333. package/src/extensions/automerge/update-codemirror.ts +0 -115
  334. package/src/extensions/awareness/awareness-provider.ts +0 -127
  335. package/src/extensions/awareness/awareness.ts +0 -315
  336. package/src/extensions/awareness/index.ts +0 -6
  337. package/src/extensions/blast.ts +0 -363
  338. package/src/extensions/command/action.ts +0 -56
  339. package/src/extensions/command/command-menu.ts +0 -210
  340. package/src/extensions/command/command.ts +0 -34
  341. package/src/extensions/command/floating-menu.ts +0 -133
  342. package/src/extensions/command/hint.ts +0 -102
  343. package/src/extensions/command/index.ts +0 -10
  344. package/src/extensions/command/placeholder.ts +0 -113
  345. package/src/extensions/command/state.ts +0 -89
  346. package/src/extensions/command/typeahead.ts +0 -129
  347. package/src/extensions/command/useCommandMenu.ts +0 -118
  348. package/src/extensions/comments.ts +0 -592
  349. package/src/extensions/debug.ts +0 -15
  350. package/src/extensions/dnd.ts +0 -37
  351. package/src/extensions/factories.ts +0 -259
  352. package/src/extensions/focus.ts +0 -35
  353. package/src/extensions/folding.tsx +0 -46
  354. package/src/extensions/hashtag.tsx +0 -68
  355. package/src/extensions/index.ts +0 -26
  356. package/src/extensions/json.ts +0 -57
  357. package/src/extensions/listener.ts +0 -38
  358. package/src/extensions/markdown/action.ts +0 -116
  359. package/src/extensions/markdown/bundle.ts +0 -71
  360. package/src/extensions/markdown/changes.test.ts +0 -26
  361. package/src/extensions/markdown/changes.ts +0 -149
  362. package/src/extensions/markdown/debug.ts +0 -44
  363. package/src/extensions/markdown/decorate.ts +0 -591
  364. package/src/extensions/markdown/formatting.test.ts +0 -498
  365. package/src/extensions/markdown/formatting.ts +0 -1267
  366. package/src/extensions/markdown/highlight.ts +0 -183
  367. package/src/extensions/markdown/image.ts +0 -119
  368. package/src/extensions/markdown/index.ts +0 -13
  369. package/src/extensions/markdown/link.ts +0 -47
  370. package/src/extensions/markdown/parser.test.ts +0 -75
  371. package/src/extensions/markdown/styles.ts +0 -135
  372. package/src/extensions/markdown/table.ts +0 -144
  373. package/src/extensions/mention.ts +0 -41
  374. package/src/extensions/modes.ts +0 -41
  375. package/src/extensions/outliner/commands.ts +0 -270
  376. package/src/extensions/outliner/editor.test.ts +0 -33
  377. package/src/extensions/outliner/editor.ts +0 -184
  378. package/src/extensions/outliner/index.ts +0 -7
  379. package/src/extensions/outliner/outliner.test.ts +0 -99
  380. package/src/extensions/outliner/outliner.ts +0 -166
  381. package/src/extensions/outliner/selection.ts +0 -50
  382. package/src/extensions/outliner/tree.test.ts +0 -167
  383. package/src/extensions/outliner/tree.ts +0 -317
  384. package/src/extensions/preview/index.ts +0 -5
  385. package/src/extensions/preview/preview.ts +0 -193
  386. package/src/extensions/selection.ts +0 -100
  387. package/src/extensions/typewriter.ts +0 -68
  388. package/src/stories/Command.stories.tsx +0 -97
  389. package/src/stories/CommandMenu.stories.tsx +0 -159
  390. package/src/styles/index.ts +0 -7
  391. package/src/styles/markdown.ts +0 -26
  392. package/src/styles/theme.ts +0 -265
  393. package/src/styles/tokens.ts +0 -17
  394. package/src/testing/index.ts +0 -5
  395. package/src/testing/util.ts +0 -5
  396. package/src/types/index.ts +0 -5
  397. package/src/types/types.ts +0 -32
  398. package/src/util/cursor.ts +0 -55
  399. package/src/util/debug.ts +0 -64
  400. package/src/util/dom.ts +0 -56
  401. package/src/util/facet.ts +0 -13
@@ -2,41 +2,57 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useMemo, useState } from 'react';
6
7
 
7
- import { type EditorView } from '@codemirror/view';
8
- import React, { useRef } from 'react';
9
-
10
- import { DropdownMenu } from '@dxos/react-ui';
8
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
9
  import { withAttention } from '@dxos/react-ui-attention/testing';
12
- import { withLayout, withTheme, type Meta } from '@dxos/storybook-utils';
10
+ import { deleteItem, hashtag, join, listItemToString, outliner, treeFacet } from '@dxos/ui-editor';
11
+
12
+ import { type EditorController, type EditorMenuGroup, EditorMenuProvider } from '../components';
13
13
 
14
14
  import { EditorStory } from './components';
15
- import { RefDropdownMenu } from '../components';
16
- import { outliner, listItemToString, treeFacet, deleteItem, hashtag } from '../extensions';
17
- import { str } from '../testing';
18
15
 
19
- type StoryProps = {
20
- text: string;
16
+ type DefaultStoryProps = {
17
+ text?: string;
21
18
  };
22
19
 
23
- const DefaultStory = ({ text }: StoryProps) => {
24
- const viewRef = useRef<EditorView>(null);
20
+ const DefaultStory = ({ text }: DefaultStoryProps) => {
21
+ const [controller, setController] = useState<EditorController | null>(null);
25
22
 
26
- const handleDelete = () => {
27
- if (viewRef.current) {
28
- deleteItem(viewRef.current);
29
- }
30
- };
23
+ const extensions = useMemo(() => [outliner(), hashtag()], []);
24
+ const commandGroups: EditorMenuGroup[] = useMemo(
25
+ () => [
26
+ {
27
+ id: 'outliner-actions',
28
+ items: [
29
+ {
30
+ id: 'delete-row',
31
+ label: 'Delete',
32
+ onSelect: ({ view }) => {
33
+ deleteItem(view);
34
+ },
35
+ },
36
+ ],
37
+ },
38
+ ],
39
+ [],
40
+ );
31
41
 
32
42
  return (
33
- <RefDropdownMenu.Provider>
43
+ <EditorMenuProvider
44
+ view={controller?.view}
45
+ groups={commandGroups}
46
+ onSelect={({ view, item }) => {
47
+ if (item.onSelect) {
48
+ return item.onSelect({ view, head: view.state.selection.main.head });
49
+ }
50
+ }}
51
+ >
34
52
  <EditorStory
35
- ref={viewRef}
53
+ ref={setController}
36
54
  text={text}
37
- extensions={[outliner(), hashtag()]}
38
- placeholder=''
39
- slots={{}}
55
+ extensions={extensions}
40
56
  debug='raw+tree'
41
57
  debugCustom={(view) => {
42
58
  const tree = view.state.facet(treeFacet);
@@ -45,35 +61,30 @@ const DefaultStory = ({ text }: StoryProps) => {
45
61
  return <pre className='p-1 overflow-auto text-xs text-green-800 dark:text-green-200'>{lines.join('\n')}</pre>;
46
62
  }}
47
63
  />
48
-
49
- <DropdownMenu.Portal>
50
- <DropdownMenu.Content>
51
- <DropdownMenu.Viewport>
52
- <DropdownMenu.Item onClick={handleDelete}>Delete</DropdownMenu.Item>
53
- </DropdownMenu.Viewport>
54
- <DropdownMenu.Arrow />
55
- </DropdownMenu.Content>
56
- </DropdownMenu.Portal>
57
- </RefDropdownMenu.Provider>
64
+ </EditorMenuProvider>
58
65
  );
59
66
  };
60
67
 
61
- const meta: Meta<StoryProps> = {
68
+ const meta = {
62
69
  title: 'ui/react-ui-editor/Outliner',
63
70
  render: DefaultStory,
64
- decorators: [withAttention, withTheme, withLayout({ fullscreen: true })],
65
- parameters: { layout: 'fullscreen' },
66
- };
71
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' }), withAttention()],
72
+ parameters: {
73
+ layout: 'fullscreen',
74
+ },
75
+ } satisfies Meta<typeof DefaultStory>;
67
76
 
68
77
  export default meta;
69
78
 
70
- export const Empty = {
79
+ type Story = StoryObj<typeof meta>;
80
+
81
+ export const Empty: Story = {
71
82
  args: {},
72
83
  };
73
84
 
74
- export const Basic = {
85
+ export const Basic: Story = {
75
86
  args: {
76
- text: str(
87
+ text: join(
77
88
  //
78
89
  '- [ ] A',
79
90
  '- [ ] B',
@@ -86,9 +97,9 @@ export const Basic = {
86
97
  },
87
98
  };
88
99
 
89
- export const Nested = {
100
+ export const Nested: Story = {
90
101
  args: {
91
- text: str(
102
+ text: join(
92
103
  //
93
104
  '- [ ] A',
94
105
  ' - [ ] B',
@@ -101,9 +112,9 @@ export const Nested = {
101
112
  },
102
113
  };
103
114
 
104
- export const Continuation = {
115
+ export const Continuation: Story = {
105
116
  args: {
106
- text: str(
117
+ text: join(
107
118
  //
108
119
  '- [ ] A',
109
120
  '- [ ] B',
@@ -0,0 +1,158 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useCallback, useState } from 'react';
7
+
8
+ import { Obj, Query } from '@dxos/echo';
9
+ import { faker } from '@dxos/random';
10
+ import { useClientStory, withClientProvider } from '@dxos/react-client/testing';
11
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
12
+ import { TestSchema, type ValueGenerator, createObjectFactory } from '@dxos/schema/testing';
13
+ import { Domino, mx } from '@dxos/ui';
14
+ import { insertAtCursor, insertAtLineStart, join } from '@dxos/ui-editor';
15
+
16
+ import {
17
+ type EditorController,
18
+ type EditorMenuGroup,
19
+ type EditorMenuItem,
20
+ EditorMenuProvider,
21
+ type UseEditorMenuProps,
22
+ createMenuGroup,
23
+ filterMenuGroups,
24
+ formattingCommands,
25
+ linkSlashCommands,
26
+ useEditorMenu,
27
+ } from '../components';
28
+
29
+ import { EditorStory } from './components';
30
+
31
+ const generator: ValueGenerator = faker as any;
32
+
33
+ const customCompletions: EditorMenuGroup = createMenuGroup({
34
+ id: 'test',
35
+ items: ['Hello world!', 'Hello DXOS', 'Hello Composer', 'https://dxos.org'],
36
+ });
37
+
38
+ const placeholder = (trigger: string[]) => {
39
+ const pressEl = Domino.of('span').text('Press');
40
+ const triggerEls = trigger.map((trigger) =>
41
+ Domino.of('span').classNames(mx('border border-separator rounded-xs mx-1 px-1 py-[2px] pb-[3px]')).text(trigger),
42
+ );
43
+ const forCommandsEl = Domino.of('span').text('for commands');
44
+ return Domino.of('div').children(pressEl, ...triggerEls, forCommandsEl).root;
45
+ };
46
+
47
+ type DefaultStoryProps = Omit<UseEditorMenuProps, 'viewRef'> & { text: string };
48
+
49
+ const DefaultStory = ({ text, ...props }: DefaultStoryProps) => {
50
+ const [controller, setController] = useState<EditorController | null>(null);
51
+ const { groupsRef, extension, ...menuProps } = useEditorMenu(props);
52
+
53
+ return (
54
+ <EditorMenuProvider view={controller?.view} groups={groupsRef.current} {...menuProps}>
55
+ <EditorStory ref={setController} text={text} extensions={extension} />
56
+ </EditorMenuProvider>
57
+ );
58
+ };
59
+
60
+ const LinkStory = (args: DefaultStoryProps) => {
61
+ const { space } = useClientStory();
62
+
63
+ const getMenu = useCallback<NonNullable<UseEditorMenuProps['getMenu']>>(
64
+ async ({ text, trigger }): Promise<EditorMenuGroup[]> => {
65
+ if (trigger === '/') {
66
+ return filterMenuGroups([linkSlashCommands], (item) =>
67
+ text ? (item.label as string).toLowerCase().includes(text.toLowerCase()) : true,
68
+ );
69
+ }
70
+
71
+ if (!space) {
72
+ return [];
73
+ }
74
+
75
+ const name = text?.startsWith('@') ? text.slice(1).toLowerCase() : (text?.toLowerCase() ?? '');
76
+ const result = await space?.db.query(Query.type(TestSchema.Person)).run();
77
+ const items = result
78
+ .filter((object) => object.name.toLowerCase().includes(name))
79
+ .map(
80
+ (object): EditorMenuItem => ({
81
+ id: object.id,
82
+ label: object.name,
83
+ icon: 'ph--user--regular',
84
+ onSelect: ({ view, head }) => {
85
+ const link = `[${object.name}](${Obj.getDXN(object)})`;
86
+ if (text?.startsWith('@')) {
87
+ insertAtLineStart(view, head, `!${link}\n`);
88
+ } else {
89
+ insertAtCursor(view, head, `${link} `);
90
+ }
91
+ },
92
+ }),
93
+ );
94
+
95
+ return [{ id: 'test', items }];
96
+ },
97
+ [space],
98
+ );
99
+
100
+ return <DefaultStory {...args} getMenu={getMenu} />;
101
+ };
102
+
103
+ const meta = {
104
+ title: 'ui/react-ui-editor/Popover',
105
+ render: DefaultStory,
106
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
107
+ parameters: {
108
+ layout: 'fullscreen',
109
+ },
110
+ } satisfies Meta<typeof DefaultStory>;
111
+
112
+ export default meta;
113
+
114
+ type Story = StoryObj<typeof meta>;
115
+
116
+ export const Default: Story = {
117
+ args: {
118
+ text: join('# Autocomplete', '', ''),
119
+ triggerKey: 'Ctrl-Space',
120
+ filter: true,
121
+ getMenu: () => [customCompletions],
122
+ },
123
+ };
124
+
125
+ export const Formatting: Story = {
126
+ args: {
127
+ text: join('# Slash command', '', ''),
128
+ trigger: '/',
129
+ placeholder: {
130
+ content: () => placeholder(['/']),
131
+ },
132
+ getMenu: () => [formattingCommands],
133
+ },
134
+ };
135
+
136
+ export const Link: Story = {
137
+ render: LinkStory,
138
+ decorators: [
139
+ withClientProvider({
140
+ createSpace: true,
141
+ onInitialized: async (client) => {
142
+ await client.addTypes([TestSchema.Person]);
143
+ },
144
+ onCreateSpace: async ({ space }) => {
145
+ const createObjects = createObjectFactory(space.db, generator);
146
+ await createObjects([{ type: TestSchema.Person, count: 10 }]);
147
+ await space.db.flush({ indexes: true });
148
+ },
149
+ }),
150
+ ],
151
+ args: {
152
+ text: join('# Links', '', ''),
153
+ trigger: ['/', '@'],
154
+ placeholder: {
155
+ content: () => placeholder(['/', '@']),
156
+ },
157
+ },
158
+ };
@@ -2,28 +2,35 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { syntaxTree } from '@codemirror/language';
8
6
  import { type EditorView } from '@codemirror/view';
9
- import React, { useState, useEffect, useMemo, useCallback } from 'react';
7
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
+ import React, { useCallback, useEffect, useMemo, useState } from 'react';
10
9
  import { createPortal } from 'react-dom';
11
10
 
12
11
  import { invariant } from '@dxos/invariant';
13
12
  import { faker } from '@dxos/random';
14
- import { Popover } from '@dxos/react-ui';
15
- import { Card } from '@dxos/react-ui-stack';
16
- import { hoverableControlItem, hoverableControlItemTransition, hoverableControls } from '@dxos/react-ui-theme';
17
- import { withLayout, withTheme, type Meta } from '@dxos/storybook-utils';
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';
25
+ import { trim } from '@dxos/util';
26
+
27
+ import { type EditorController, EditorPreviewProvider, useEditorPreview } from '../components';
18
28
 
19
29
  import { EditorStory } from './components';
20
- import { PreviewProvider, useRefPopover } from '../components';
21
- import { preview, image, type PreviewLinkRef, type PreviewLinkTarget, getLinkRef } from '../extensions';
22
- import { str } from '../testing';
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 } = useRefPopover('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 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,104 +144,105 @@ 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 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
  };
166
189
 
167
- const meta: Meta<typeof EditorStory> = {
190
+ const meta = {
168
191
  title: 'ui/react-ui-editor/Preview',
169
192
  component: EditorStory,
170
- decorators: [withTheme, withLayout({ fullscreen: true })],
171
- parameters: { layout: 'fullscreen' },
172
- };
193
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
194
+ parameters: {
195
+ layout: 'fullscreen',
196
+ },
197
+ } satisfies Meta<typeof EditorStory>;
173
198
 
174
199
  export default meta;
175
200
 
176
- export const Default = {
177
- render: () => {
178
- const [view, setView] = useState<EditorView>();
179
- const [previewBlocks, setPreviewBlocks] = useState<{ link: PreviewLinkRef; el: HTMLElement }[]>([]);
201
+ type Story = StoryObj<typeof meta>;
202
+
203
+ const text = trim`
204
+ # Preview
180
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
+
218
+ export const Default: Story = {
219
+ render: () => {
220
+ const [controller, setController] = useState<EditorController | null>(null);
221
+ const [previewBlocks, setPreviewBlocks] = useState<PreviewBlock[]>([]);
181
222
  const extensions = useMemo(() => {
182
223
  return [
183
224
  image(),
184
225
  preview({
185
- addBlockContainer: (link, el) => {
186
- setPreviewBlocks((prev) => [...prev, { link, el }]);
226
+ addBlockContainer: (block) => {
227
+ setPreviewBlocks((prev) => [...prev, block]);
187
228
  },
188
- removeBlockContainer: (link) => {
189
- 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));
190
231
  },
191
232
  }),
192
233
  ];
193
234
  }, []);
194
235
 
195
- const handleViewRef = useCallback((instance?: EditorView | null) => {
196
- setView(instance ?? undefined);
197
- }, []);
198
-
236
+ // TODO(burdon): Migrate to Editor.Root.
199
237
  return (
200
- <PreviewProvider onLookup={handlePreviewLookup}>
201
- <EditorStory
202
- ref={handleViewRef}
203
- text={str(
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
- '',
218
- )}
219
- extensions={extensions}
220
- />
238
+ <EditorPreviewProvider onLookup={handlePreviewLookup}>
239
+ <EditorStory ref={setController} text={text} extensions={extensions} />
221
240
  <PreviewCard />
222
- {previewBlocks.map(({ link, el }) => (
223
- <PreviewBlock key={link.ref} link={link} el={el} view={view} />
224
- ))}
225
- </PreviewProvider>
241
+ {controller?.view &&
242
+ previewBlocks.map(({ link, el }) => (
243
+ <PreviewBlockComponent key={link.dxn} link={link} el={el} view={controller.view!} />
244
+ ))}
245
+ </EditorPreviewProvider>
226
246
  );
227
247
  },
228
248
  };
@@ -0,0 +1,104 @@
1
+ //
2
+ // Copyright 2025 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { useEffect, useState } from 'react';
7
+ import { createPortal } from 'react-dom';
8
+
9
+ import { useThemeContext } from '@dxos/react-ui';
10
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
11
+ import {
12
+ type XmlWidgetRegistry,
13
+ type XmlWidgetState,
14
+ createBasicExtensions,
15
+ createThemeExtensions,
16
+ decorateMarkdown,
17
+ extendedMarkdown,
18
+ xmlTags,
19
+ } from '@dxos/ui-editor';
20
+ import { safeParseInt, trim } from '@dxos/util';
21
+
22
+ import { useTextEditor } from '../hooks';
23
+
24
+ const registry = {
25
+ /**
26
+ * Custom tag: <test/>
27
+ */
28
+ test: {
29
+ block: true,
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
+ },
48
+ },
49
+ } satisfies XmlWidgetRegistry;
50
+
51
+ const DefaultStory = ({ text }: { text?: string }) => {
52
+ const { themeMode } = useThemeContext();
53
+ const [widgets, setWidgets] = useState<XmlWidgetState[]>([]);
54
+ const { parentRef } = useTextEditor({
55
+ initialValue: text,
56
+ extensions: [
57
+ createThemeExtensions({ themeMode }),
58
+ createBasicExtensions({ lineWrapping: true }),
59
+ decorateMarkdown(),
60
+ extendedMarkdown({ registry }),
61
+ xmlTags({ registry, setWidgets }),
62
+ ],
63
+ });
64
+
65
+ return (
66
+ <>
67
+ <div ref={parentRef} className='w-full p-4' />
68
+ {widgets.map(({ id, root, Component, props }) => (
69
+ <div key={id}>{createPortal(<Component {...props} />, root)}</div>
70
+ ))}
71
+ </>
72
+ );
73
+ };
74
+
75
+ const text = trim`
76
+ # Tags
77
+
78
+ React widget below.
79
+
80
+ <test id="t-1" />
81
+
82
+ <test id="t-2" start="100" />
83
+
84
+ React widget above.
85
+ `;
86
+
87
+ const meta = {
88
+ title: 'ui/react-ui-editor/Tags',
89
+ render: DefaultStory,
90
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
91
+ parameters: {
92
+ layout: 'fullscreen',
93
+ },
94
+ } satisfies Meta<typeof DefaultStory>;
95
+
96
+ export default meta;
97
+
98
+ type Story = StoryObj<typeof meta>;
99
+
100
+ export const Default: Story = {
101
+ args: {
102
+ text,
103
+ },
104
+ };