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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. package/dist/lib/browser/index.mjs +1304 -7438
  2. package/dist/lib/browser/index.mjs.map +4 -4
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node-esm/index.mjs +1304 -7438
  5. package/dist/lib/node-esm/index.mjs.map +4 -4
  6. package/dist/lib/node-esm/meta.json +1 -1
  7. package/dist/types/src/components/Editor/Editor.d.ts +47 -0
  8. package/dist/types/src/components/Editor/Editor.d.ts.map +1 -0
  9. package/dist/types/src/components/Editor/Editor.stories.d.ts +23 -0
  10. package/dist/types/src/components/Editor/Editor.stories.d.ts.map +1 -0
  11. package/dist/types/src/components/Editor/index.d.ts +2 -0
  12. package/dist/types/src/components/Editor/index.d.ts.map +1 -0
  13. package/dist/types/src/components/EditorContent/EditorContent.d.ts +31 -0
  14. package/dist/types/src/components/EditorContent/EditorContent.d.ts.map +1 -0
  15. package/dist/types/src/components/EditorContent/controller.d.ts +10 -0
  16. package/dist/types/src/components/EditorContent/controller.d.ts.map +1 -0
  17. package/dist/types/src/components/EditorContent/index.d.ts +3 -0
  18. package/dist/types/src/components/EditorContent/index.d.ts.map +1 -0
  19. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +36 -0
  20. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorMenuProvider/index.d.ts +6 -0
  22. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  24. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  25. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  26. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +46 -0
  28. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  29. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  30. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  32. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  33. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  34. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  35. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +28 -2
  36. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  37. package/dist/types/src/components/EditorToolbar/actions.d.ts +24 -0
  38. package/dist/types/src/components/EditorToolbar/actions.d.ts.map +1 -0
  39. package/dist/types/src/components/EditorToolbar/blocks.d.ts +8 -7
  40. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  41. package/dist/types/src/components/EditorToolbar/formatting.d.ts +8 -7
  42. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  43. package/dist/types/src/components/EditorToolbar/headings.d.ts +8 -7
  44. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/image.d.ts +4 -11
  46. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  47. package/dist/types/src/components/EditorToolbar/index.d.ts +2 -1
  48. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  49. package/dist/types/src/components/EditorToolbar/search.d.ts +4 -11
  50. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  51. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts +11 -0
  52. package/dist/types/src/components/EditorToolbar/useEditorToolbar.d.ts.map +1 -0
  53. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +9 -8
  54. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  55. package/dist/types/src/components/index.d.ts +5 -2
  56. package/dist/types/src/components/index.d.ts.map +1 -1
  57. package/dist/types/src/hooks/useTextEditor.d.ts +6 -10
  58. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  59. package/dist/types/src/index.d.ts +1 -9
  60. package/dist/types/src/index.d.ts.map +1 -1
  61. package/dist/types/src/stories/Automerge.stories.d.ts +43 -0
  62. package/dist/types/src/stories/Automerge.stories.d.ts.map +1 -0
  63. package/dist/types/src/stories/CommandDialog.stories.d.ts +14 -0
  64. package/dist/types/src/stories/CommandDialog.stories.d.ts.map +1 -0
  65. package/dist/types/src/stories/Comments.stories.d.ts +22 -10
  66. package/dist/types/src/stories/Comments.stories.d.ts.map +1 -1
  67. package/dist/types/src/stories/EditorToolbar.stories.d.ts +40 -4
  68. package/dist/types/src/stories/EditorToolbar.stories.d.ts.map +1 -1
  69. package/dist/types/src/stories/Experimental.stories.d.ts +23 -13
  70. package/dist/types/src/stories/Experimental.stories.d.ts.map +1 -1
  71. package/dist/types/src/stories/Markdown.stories.d.ts +33 -43
  72. package/dist/types/src/stories/Markdown.stories.d.ts.map +1 -1
  73. package/dist/types/src/stories/Outliner.stories.d.ts +15 -21
  74. package/dist/types/src/stories/Outliner.stories.d.ts.map +1 -1
  75. package/dist/types/src/stories/Popover.stories.d.ts +20 -0
  76. package/dist/types/src/stories/Popover.stories.d.ts.map +1 -0
  77. package/dist/types/src/stories/Preview.stories.d.ts +23 -7
  78. package/dist/types/src/stories/Preview.stories.d.ts.map +1 -1
  79. package/dist/types/src/stories/Tags.stories.d.ts +16 -0
  80. package/dist/types/src/stories/Tags.stories.d.ts.map +1 -0
  81. package/dist/types/src/stories/TextEditor.stories.d.ts +38 -52
  82. package/dist/types/src/stories/TextEditor.stories.d.ts.map +1 -1
  83. package/dist/types/src/stories/Theme.stories.d.ts +8 -0
  84. package/dist/types/src/stories/Theme.stories.d.ts.map +1 -0
  85. package/dist/types/src/stories/components/EditorStory.d.ts +11 -23
  86. package/dist/types/src/stories/components/EditorStory.d.ts.map +1 -1
  87. package/dist/types/src/stories/components/util.d.ts +3 -3
  88. package/dist/types/src/stories/components/util.d.ts.map +1 -1
  89. package/dist/types/src/translations.d.ts +29 -30
  90. package/dist/types/src/translations.d.ts.map +1 -1
  91. package/dist/types/src/util/index.d.ts +0 -4
  92. package/dist/types/src/util/index.d.ts.map +1 -1
  93. package/dist/types/src/util/react.d.ts +6 -2
  94. package/dist/types/src/util/react.d.ts.map +1 -1
  95. package/dist/types/tsconfig.tsbuildinfo +1 -1
  96. package/package.json +82 -75
  97. package/src/components/Editor/Editor.stories.tsx +95 -0
  98. package/src/components/Editor/Editor.tsx +185 -0
  99. package/src/components/Editor/index.ts +5 -0
  100. package/src/components/EditorContent/EditorContent.tsx +83 -0
  101. package/src/components/EditorContent/controller.ts +50 -0
  102. package/src/components/EditorContent/index.ts +6 -0
  103. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +227 -0
  104. package/src/components/EditorMenuProvider/index.ts +10 -0
  105. package/src/components/EditorMenuProvider/menu-presets.ts +124 -0
  106. package/src/components/EditorMenuProvider/menu.ts +70 -0
  107. package/src/components/EditorMenuProvider/popover.ts +285 -0
  108. package/src/components/EditorMenuProvider/useEditorMenu.ts +173 -0
  109. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +79 -0
  110. package/src/components/EditorPreviewProvider/index.ts +5 -0
  111. package/src/components/EditorToolbar/EditorToolbar.tsx +119 -96
  112. package/src/components/EditorToolbar/actions.ts +87 -0
  113. package/src/components/EditorToolbar/blocks.ts +23 -26
  114. package/src/components/EditorToolbar/formatting.ts +24 -27
  115. package/src/components/EditorToolbar/headings.ts +20 -12
  116. package/src/components/EditorToolbar/image.ts +17 -6
  117. package/src/components/EditorToolbar/index.ts +3 -7
  118. package/src/components/EditorToolbar/search.ts +17 -6
  119. package/src/components/EditorToolbar/useEditorToolbar.ts +20 -0
  120. package/src/components/EditorToolbar/view-mode.ts +15 -9
  121. package/src/components/index.ts +7 -2
  122. package/src/hooks/useTextEditor.ts +39 -45
  123. package/src/index.ts +1 -11
  124. package/src/stories/Automerge.stories.tsx +175 -0
  125. package/src/stories/CommandDialog.stories.tsx +81 -0
  126. package/src/stories/Comments.stories.tsx +59 -51
  127. package/src/stories/EditorToolbar.stories.tsx +45 -30
  128. package/src/stories/Experimental.stories.tsx +18 -16
  129. package/src/stories/Markdown.stories.tsx +37 -33
  130. package/src/stories/Outliner.stories.tsx +53 -42
  131. package/src/stories/Popover.stories.tsx +158 -0
  132. package/src/stories/Preview.stories.tsx +105 -94
  133. package/src/stories/Tags.stories.tsx +104 -0
  134. package/src/stories/TextEditor.stories.tsx +51 -76
  135. package/src/stories/Theme.stories.tsx +61 -0
  136. package/src/stories/components/EditorStory.tsx +41 -33
  137. package/src/stories/components/util.tsx +43 -11
  138. package/src/translations.ts +9 -7
  139. package/src/util/index.ts +1 -5
  140. package/src/util/react.tsx +7 -3
  141. package/dist/lib/browser/testing/index.mjs +0 -6
  142. package/dist/lib/browser/testing/index.mjs.map +0 -7
  143. package/dist/lib/node/index.cjs +0 -7754
  144. package/dist/lib/node/index.cjs.map +0 -7
  145. package/dist/lib/node/meta.json +0 -1
  146. package/dist/lib/node/testing/index.cjs +0 -29
  147. package/dist/lib/node/testing/index.cjs.map +0 -7
  148. package/dist/lib/node-esm/testing/index.mjs +0 -8
  149. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  150. package/dist/types/src/components/EditorToolbar/lists.d.ts +0 -19
  151. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +0 -1
  152. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -50
  153. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  154. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  155. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  156. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  157. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  158. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  159. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  160. package/dist/types/src/components/Popover/index.d.ts +0 -4
  161. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  162. package/dist/types/src/defaults.d.ts +0 -14
  163. package/dist/types/src/defaults.d.ts.map +0 -1
  164. package/dist/types/src/extensions/annotations.d.ts +0 -9
  165. package/dist/types/src/extensions/annotations.d.ts.map +0 -1
  166. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  167. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  168. package/dist/types/src/extensions/automerge/automerge.d.ts +0 -4
  169. package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
  170. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +0 -56
  171. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +0 -1
  172. package/dist/types/src/extensions/automerge/automerge.test.d.ts +0 -2
  173. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
  174. package/dist/types/src/extensions/automerge/cursor.d.ts +0 -4
  175. package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
  176. package/dist/types/src/extensions/automerge/defs.d.ts +0 -17
  177. package/dist/types/src/extensions/automerge/defs.d.ts.map +0 -1
  178. package/dist/types/src/extensions/automerge/index.d.ts +0 -2
  179. package/dist/types/src/extensions/automerge/index.d.ts.map +0 -1
  180. package/dist/types/src/extensions/automerge/sync.d.ts +0 -17
  181. package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
  182. package/dist/types/src/extensions/automerge/update-automerge.d.ts +0 -6
  183. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
  184. package/dist/types/src/extensions/automerge/update-codemirror.d.ts +0 -5
  185. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
  186. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +0 -31
  187. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
  188. package/dist/types/src/extensions/awareness/awareness.d.ts +0 -46
  189. package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
  190. package/dist/types/src/extensions/awareness/index.d.ts +0 -3
  191. package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
  192. package/dist/types/src/extensions/blast.d.ts +0 -25
  193. package/dist/types/src/extensions/blast.d.ts.map +0 -1
  194. package/dist/types/src/extensions/command/action.d.ts +0 -17
  195. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  196. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  197. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  198. package/dist/types/src/extensions/command/command.d.ts +0 -6
  199. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  200. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  201. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  202. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  203. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  204. package/dist/types/src/extensions/command/index.d.ts +0 -7
  205. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  206. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  207. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  208. package/dist/types/src/extensions/command/state.d.ts +0 -16
  209. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  210. package/dist/types/src/extensions/command/typeahead.d.ts +0 -17
  211. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  212. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  213. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  214. package/dist/types/src/extensions/comments.d.ts +0 -95
  215. package/dist/types/src/extensions/comments.d.ts.map +0 -1
  216. package/dist/types/src/extensions/debug.d.ts +0 -3
  217. package/dist/types/src/extensions/debug.d.ts.map +0 -1
  218. package/dist/types/src/extensions/dnd.d.ts +0 -9
  219. package/dist/types/src/extensions/dnd.d.ts.map +0 -1
  220. package/dist/types/src/extensions/factories.d.ts +0 -64
  221. package/dist/types/src/extensions/factories.d.ts.map +0 -1
  222. package/dist/types/src/extensions/focus.d.ts +0 -7
  223. package/dist/types/src/extensions/focus.d.ts.map +0 -1
  224. package/dist/types/src/extensions/folding.d.ts +0 -7
  225. package/dist/types/src/extensions/folding.d.ts.map +0 -1
  226. package/dist/types/src/extensions/hashtag.d.ts +0 -3
  227. package/dist/types/src/extensions/hashtag.d.ts.map +0 -1
  228. package/dist/types/src/extensions/index.d.ts +0 -23
  229. package/dist/types/src/extensions/index.d.ts.map +0 -1
  230. package/dist/types/src/extensions/json.d.ts +0 -7
  231. package/dist/types/src/extensions/json.d.ts.map +0 -1
  232. package/dist/types/src/extensions/listener.d.ts +0 -11
  233. package/dist/types/src/extensions/listener.d.ts.map +0 -1
  234. package/dist/types/src/extensions/markdown/action.d.ts +0 -12
  235. package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
  236. package/dist/types/src/extensions/markdown/bundle.d.ts +0 -16
  237. package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
  238. package/dist/types/src/extensions/markdown/changes.d.ts +0 -10
  239. package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
  240. package/dist/types/src/extensions/markdown/changes.test.d.ts +0 -2
  241. package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
  242. package/dist/types/src/extensions/markdown/debug.d.ts +0 -11
  243. package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
  244. package/dist/types/src/extensions/markdown/decorate.d.ts +0 -17
  245. package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
  246. package/dist/types/src/extensions/markdown/formatting.d.ts +0 -63
  247. package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
  248. package/dist/types/src/extensions/markdown/formatting.test.d.ts +0 -3
  249. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
  250. package/dist/types/src/extensions/markdown/highlight.d.ts +0 -37
  251. package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
  252. package/dist/types/src/extensions/markdown/image.d.ts +0 -7
  253. package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
  254. package/dist/types/src/extensions/markdown/index.d.ts +0 -10
  255. package/dist/types/src/extensions/markdown/index.d.ts.map +0 -1
  256. package/dist/types/src/extensions/markdown/link.d.ts +0 -7
  257. package/dist/types/src/extensions/markdown/link.d.ts.map +0 -1
  258. package/dist/types/src/extensions/markdown/parser.test.d.ts +0 -2
  259. package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
  260. package/dist/types/src/extensions/markdown/styles.d.ts +0 -4
  261. package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
  262. package/dist/types/src/extensions/markdown/table.d.ts +0 -8
  263. package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
  264. package/dist/types/src/extensions/mention.d.ts +0 -7
  265. package/dist/types/src/extensions/mention.d.ts.map +0 -1
  266. package/dist/types/src/extensions/modes.d.ts +0 -17
  267. package/dist/types/src/extensions/modes.d.ts.map +0 -1
  268. package/dist/types/src/extensions/outliner/commands.d.ts +0 -10
  269. package/dist/types/src/extensions/outliner/commands.d.ts.map +0 -1
  270. package/dist/types/src/extensions/outliner/editor.d.ts +0 -5
  271. package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
  272. package/dist/types/src/extensions/outliner/editor.test.d.ts +0 -2
  273. package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
  274. package/dist/types/src/extensions/outliner/index.d.ts +0 -4
  275. package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
  276. package/dist/types/src/extensions/outliner/outliner.d.ts +0 -11
  277. package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
  278. package/dist/types/src/extensions/outliner/outliner.test.d.ts +0 -2
  279. package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +0 -1
  280. package/dist/types/src/extensions/outliner/selection.d.ts +0 -12
  281. package/dist/types/src/extensions/outliner/selection.d.ts.map +0 -1
  282. package/dist/types/src/extensions/outliner/tree.d.ts +0 -79
  283. package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
  284. package/dist/types/src/extensions/outliner/tree.test.d.ts +0 -2
  285. package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
  286. package/dist/types/src/extensions/preview/index.d.ts +0 -2
  287. package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
  288. package/dist/types/src/extensions/preview/preview.d.ts +0 -32
  289. package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
  290. package/dist/types/src/extensions/selection.d.ts +0 -24
  291. package/dist/types/src/extensions/selection.d.ts.map +0 -1
  292. package/dist/types/src/extensions/typewriter.d.ts +0 -10
  293. package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
  294. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  295. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  296. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  297. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  298. package/dist/types/src/styles/index.d.ts +0 -4
  299. package/dist/types/src/styles/index.d.ts.map +0 -1
  300. package/dist/types/src/styles/markdown.d.ts +0 -8
  301. package/dist/types/src/styles/markdown.d.ts.map +0 -1
  302. package/dist/types/src/styles/theme.d.ts +0 -38
  303. package/dist/types/src/styles/theme.d.ts.map +0 -1
  304. package/dist/types/src/styles/tokens.d.ts +0 -3
  305. package/dist/types/src/styles/tokens.d.ts.map +0 -1
  306. package/dist/types/src/testing/index.d.ts +0 -2
  307. package/dist/types/src/testing/index.d.ts.map +0 -1
  308. package/dist/types/src/testing/util.d.ts +0 -2
  309. package/dist/types/src/testing/util.d.ts.map +0 -1
  310. package/dist/types/src/types.d.ts +0 -14
  311. package/dist/types/src/types.d.ts.map +0 -1
  312. package/dist/types/src/util/cursor.d.ts +0 -31
  313. package/dist/types/src/util/cursor.d.ts.map +0 -1
  314. package/dist/types/src/util/debug.d.ts +0 -17
  315. package/dist/types/src/util/debug.d.ts.map +0 -1
  316. package/dist/types/src/util/dom.d.ts +0 -20
  317. package/dist/types/src/util/dom.d.ts.map +0 -1
  318. package/dist/types/src/util/facet.d.ts +0 -3
  319. package/dist/types/src/util/facet.d.ts.map +0 -1
  320. package/src/components/EditorToolbar/lists.ts +0 -59
  321. package/src/components/EditorToolbar/util.ts +0 -64
  322. package/src/components/Popover/CommandMenu.tsx +0 -279
  323. package/src/components/Popover/RefDropdownMenu.tsx +0 -79
  324. package/src/components/Popover/RefPopover.tsx +0 -99
  325. package/src/components/Popover/index.ts +0 -7
  326. package/src/defaults.ts +0 -49
  327. package/src/extensions/annotations.ts +0 -55
  328. package/src/extensions/autocomplete.ts +0 -69
  329. package/src/extensions/automerge/automerge.stories.tsx +0 -140
  330. package/src/extensions/automerge/automerge.test.tsx +0 -78
  331. package/src/extensions/automerge/automerge.ts +0 -85
  332. package/src/extensions/automerge/cursor.ts +0 -28
  333. package/src/extensions/automerge/defs.ts +0 -31
  334. package/src/extensions/automerge/index.ts +0 -5
  335. package/src/extensions/automerge/sync.ts +0 -75
  336. package/src/extensions/automerge/update-automerge.ts +0 -50
  337. package/src/extensions/automerge/update-codemirror.ts +0 -115
  338. package/src/extensions/awareness/awareness-provider.ts +0 -127
  339. package/src/extensions/awareness/awareness.ts +0 -315
  340. package/src/extensions/awareness/index.ts +0 -6
  341. package/src/extensions/blast.ts +0 -376
  342. package/src/extensions/command/action.ts +0 -56
  343. package/src/extensions/command/command-menu.ts +0 -210
  344. package/src/extensions/command/command.ts +0 -34
  345. package/src/extensions/command/floating-menu.ts +0 -133
  346. package/src/extensions/command/hint.ts +0 -102
  347. package/src/extensions/command/index.ts +0 -10
  348. package/src/extensions/command/placeholder.ts +0 -113
  349. package/src/extensions/command/state.ts +0 -89
  350. package/src/extensions/command/typeahead.ts +0 -116
  351. package/src/extensions/command/useCommandMenu.ts +0 -118
  352. package/src/extensions/comments.ts +0 -592
  353. package/src/extensions/debug.ts +0 -15
  354. package/src/extensions/dnd.ts +0 -37
  355. package/src/extensions/factories.ts +0 -240
  356. package/src/extensions/focus.ts +0 -35
  357. package/src/extensions/folding.tsx +0 -46
  358. package/src/extensions/hashtag.tsx +0 -68
  359. package/src/extensions/index.ts +0 -26
  360. package/src/extensions/json.ts +0 -57
  361. package/src/extensions/listener.ts +0 -38
  362. package/src/extensions/markdown/action.ts +0 -116
  363. package/src/extensions/markdown/bundle.ts +0 -71
  364. package/src/extensions/markdown/changes.test.ts +0 -26
  365. package/src/extensions/markdown/changes.ts +0 -149
  366. package/src/extensions/markdown/debug.ts +0 -44
  367. package/src/extensions/markdown/decorate.ts +0 -591
  368. package/src/extensions/markdown/formatting.test.ts +0 -498
  369. package/src/extensions/markdown/formatting.ts +0 -1265
  370. package/src/extensions/markdown/highlight.ts +0 -183
  371. package/src/extensions/markdown/image.ts +0 -119
  372. package/src/extensions/markdown/index.ts +0 -13
  373. package/src/extensions/markdown/link.ts +0 -47
  374. package/src/extensions/markdown/parser.test.ts +0 -75
  375. package/src/extensions/markdown/styles.ts +0 -135
  376. package/src/extensions/markdown/table.ts +0 -144
  377. package/src/extensions/mention.ts +0 -41
  378. package/src/extensions/modes.ts +0 -50
  379. package/src/extensions/outliner/commands.ts +0 -270
  380. package/src/extensions/outliner/editor.test.ts +0 -33
  381. package/src/extensions/outliner/editor.ts +0 -184
  382. package/src/extensions/outliner/index.ts +0 -7
  383. package/src/extensions/outliner/outliner.test.ts +0 -99
  384. package/src/extensions/outliner/outliner.ts +0 -166
  385. package/src/extensions/outliner/selection.ts +0 -50
  386. package/src/extensions/outliner/tree.test.ts +0 -167
  387. package/src/extensions/outliner/tree.ts +0 -317
  388. package/src/extensions/preview/index.ts +0 -5
  389. package/src/extensions/preview/preview.ts +0 -193
  390. package/src/extensions/selection.ts +0 -100
  391. package/src/extensions/typewriter.ts +0 -68
  392. package/src/stories/Command.stories.tsx +0 -97
  393. package/src/stories/CommandMenu.stories.tsx +0 -159
  394. package/src/styles/index.ts +0 -7
  395. package/src/styles/markdown.ts +0 -26
  396. package/src/styles/theme.ts +0 -266
  397. package/src/styles/tokens.ts +0 -17
  398. package/src/testing/index.ts +0 -5
  399. package/src/testing/util.ts +0 -5
  400. package/src/types.ts +0 -23
  401. package/src/util/cursor.ts +0 -55
  402. package/src/util/debug.ts +0 -64
  403. package/src/util/dom.ts +0 -56
  404. package/src/util/facet.ts +0 -13
@@ -2,54 +2,63 @@
2
2
  // Copyright 2024 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
- import { type StoryObj } from '@storybook/react';
8
- import React, { useCallback, useState } from 'react';
5
+ import { RegistryContext, useAtomValue } from '@effect-atom/atom-react';
6
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
+ import React, { useCallback, useContext, useState } from 'react';
9
8
 
10
9
  import { invariant } from '@dxos/invariant';
11
10
  import { useThemeContext } from '@dxos/react-ui';
12
- import { attentionSurface, mx } from '@dxos/react-ui-theme';
13
- import { type Meta, withLayout, withTheme } from '@dxos/storybook-utils';
14
-
15
- import { EditorToolbar, useEditorToolbarState } from '../components';
16
- import { editorWidth } from '../defaults';
11
+ import { withTheme } from '@dxos/react-ui/testing';
12
+ import { withRegistry } from '@dxos/storybook-utils';
17
13
  import {
18
14
  type EditorInputMode,
19
15
  type EditorViewMode,
20
16
  InputModeExtensions,
21
- createMarkdownExtensions,
22
17
  createBasicExtensions,
18
+ createMarkdownExtensions,
23
19
  createThemeExtensions,
24
20
  decorateMarkdown,
21
+ editorWidth,
25
22
  formattingKeymap,
26
- useFormattingState,
27
- } from '../extensions';
28
- import { useTextEditor, type UseTextEditorProps } from '../hooks';
29
- import translations from '../translations';
23
+ formattingListener,
24
+ } from '@dxos/ui-editor';
25
+ import { attentionSurface, mx } from '@dxos/ui-theme';
26
+
27
+ import { EditorToolbar, type EditorToolbarState, useEditorToolbar } from '../components';
28
+ import { type UseTextEditorProps, useTextEditor } from '../hooks';
29
+ import { translations } from '../translations';
30
30
 
31
31
  type StoryProps = { placeholder?: string } & UseTextEditorProps;
32
32
 
33
33
  const DefaultStory = ({ autoFocus, initialValue, placeholder }: StoryProps) => {
34
34
  const { themeMode } = useThemeContext();
35
- const toolbarState = useEditorToolbarState({ viewMode: 'source' });
36
- const viewMode = toolbarState.viewMode;
37
- const trackFormatting = useFormattingState(toolbarState);
35
+ const registry = useContext(RegistryContext);
36
+
37
+ const toolbarState = useEditorToolbar({ viewMode: 'source' });
38
+ const { viewMode } = useAtomValue(toolbarState);
39
+
40
+ const updateToolbarState = useCallback(
41
+ (formatting: EditorToolbarState) => {
42
+ registry.update(toolbarState, (state) => ({ ...state, ...formatting }));
43
+ },
44
+ [registry, toolbarState],
45
+ );
46
+
38
47
  // TODO(wittjosiah): Provide way to change the input mode.
39
48
  const [editorInputMode, _setEditorInputMode] = useState<EditorInputMode>('default');
40
49
  const { parentRef, view } = useTextEditor(
41
50
  () => ({
42
51
  autoFocus,
43
52
  initialValue,
44
- moveToEndOfLine: true,
53
+ selectionEnd: true,
45
54
  extensions: [
46
55
  editorInputMode ? InputModeExtensions[editorInputMode] : [],
47
- createBasicExtensions({ placeholder, lineWrapping: true, readOnly: viewMode === 'readonly' }),
48
- createMarkdownExtensions({ themeMode }),
56
+ createBasicExtensions({ placeholder, lineWrapping: true, readOnly: viewMode === 'readonly', search: true }),
57
+ createMarkdownExtensions(),
49
58
  createThemeExtensions({ themeMode, syntaxHighlighting: true }),
50
59
  viewMode === 'source' ? [] : decorateMarkdown(),
51
60
  formattingKeymap(),
52
- trackFormatting,
61
+ formattingListener(updateToolbarState),
53
62
  ],
54
63
  }),
55
64
  [editorInputMode, viewMode, themeMode, placeholder],
@@ -60,15 +69,18 @@ const DefaultStory = ({ autoFocus, initialValue, placeholder }: StoryProps) => {
60
69
  return view;
61
70
  }, [view]);
62
71
 
63
- const handleViewModeChange = useCallback((mode: EditorViewMode) => {
64
- toolbarState.viewMode = mode;
65
- }, []);
72
+ const handleViewModeChange = useCallback(
73
+ (mode: EditorViewMode) => {
74
+ registry.update(toolbarState, (state) => ({ ...state, viewMode: mode }));
75
+ },
76
+ [registry, toolbarState],
77
+ );
66
78
 
67
79
  // TODO(marijn): This doesn't update the state on view changes.
68
80
  // Also not sure if view is even guaranteed to exist at this point.
69
81
  return (
70
82
  <div role='none' className={mx('fixed inset-0 flex flex-col')}>
71
- {toolbarState && <EditorToolbar state={toolbarState} getView={getView} viewMode={handleViewModeChange} />}
83
+ {toolbarState && <EditorToolbar state={toolbarState} getView={getView} onViewModeChange={handleViewModeChange} />}
72
84
  <div role='none' className={mx('grow overflow-hidden', attentionSurface)}>
73
85
  <div className={mx(editorWidth)} ref={parentRef} />
74
86
  </div>
@@ -76,12 +88,15 @@ const DefaultStory = ({ autoFocus, initialValue, placeholder }: StoryProps) => {
76
88
  );
77
89
  };
78
90
 
79
- const meta: Meta<StoryProps> = {
91
+ const meta = {
80
92
  title: 'ui/react-ui-editor/EditorToolbar',
81
93
  render: DefaultStory,
82
- decorators: [withTheme, withLayout({ fullscreen: true })],
83
- parameters: { translations, layout: 'fullscreen' },
84
- };
94
+ decorators: [withRegistry, withTheme()],
95
+ parameters: {
96
+ layout: 'fullscreen',
97
+ translations,
98
+ },
99
+ } satisfies Meta<typeof DefaultStory>;
85
100
 
86
101
  export default meta;
87
102
 
@@ -91,6 +106,6 @@ export const Default: Story = {
91
106
  args: {
92
107
  autoFocus: true,
93
108
  placeholder: 'Text...',
94
- initialValue: '# Demo\n\nThis is a document.\n\n',
109
+ initialValue: '# Demo\n\nThis is a **document**.\n\n',
95
110
  },
96
111
  };
@@ -2,38 +2,40 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
7
6
  import defaultsDeep from 'lodash.defaultsdeep';
8
7
  import React from 'react';
9
8
 
10
9
  import { log } from '@dxos/log';
11
10
  import { faker } from '@dxos/random';
12
- import { withLayout, withTheme, type Meta } from '@dxos/storybook-utils';
11
+ import { withTheme } from '@dxos/react-ui/testing';
12
+ import { blast, defaultOptions, dropFile, join, typewriter } from '@dxos/ui-editor';
13
13
 
14
14
  import { EditorStory, content } from './components';
15
- import { typewriter, blast, defaultOptions, dropFile } from '../extensions';
16
- import { str } from '../testing';
17
15
 
18
- const meta: Meta<typeof EditorStory> = {
16
+ const meta = {
19
17
  title: 'ui/react-ui-editor/Experimental',
20
18
  component: EditorStory,
21
- decorators: [withTheme, withLayout({ fullscreen: true })],
22
- parameters: { layout: 'fullscreen' },
23
- };
19
+ decorators: [withTheme()],
20
+ parameters: {
21
+ layout: 'fullscreen',
22
+ },
23
+ } satisfies Meta<typeof EditorStory>;
24
24
 
25
25
  export default meta;
26
26
 
27
+ type Story = StoryObj<typeof meta>;
28
+
27
29
  //
28
30
  // Typewriter
29
31
  //
30
32
 
31
- const typewriterItems = localStorage.getItem('dxos.org/plugin/markdown/typewriter')?.split(',');
33
+ const typewriterItems = localStorage.getItem('dxos.org/testing/typewriter')?.split(',');
32
34
 
33
- export const Typewriter = {
35
+ export const Typewriter: Story = {
34
36
  render: () => (
35
37
  <EditorStory
36
- text={str('# Typewriter', '', content.paragraphs, content.footer)}
38
+ text={join('# Typewriter', '', content.paragraphs, content.footer)}
37
39
  extensions={[typewriter({ items: typewriterItems })]}
38
40
  />
39
41
  ),
@@ -43,10 +45,10 @@ export const Typewriter = {
43
45
  // Blast
44
46
  //
45
47
 
46
- export const Blast = {
48
+ export const Blast: Story = {
47
49
  render: () => (
48
50
  <EditorStory
49
- text={str('# Blast', '', content.paragraphs, content.codeblocks, content.paragraphs)}
51
+ text={join('# Blast', '', content.paragraphs, content.codeblocks, content.paragraphs)}
50
52
  extensions={[
51
53
  typewriter({ items: typewriterItems }),
52
54
  blast(
@@ -70,10 +72,10 @@ export const Blast = {
70
72
  // DND
71
73
  //
72
74
 
73
- export const DND = {
75
+ export const DND: Story = {
74
76
  render: () => (
75
77
  <EditorStory
76
- text={str('# DND', '')}
78
+ text={join('# DND', '')}
77
79
  extensions={[
78
80
  dropFile({
79
81
  onDrop: (view, event) => {
@@ -2,64 +2,68 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import '@dxos-theme';
6
-
7
5
  import { markdown } from '@codemirror/lang-markdown';
6
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
8
7
  import React from 'react';
9
8
 
10
- import { withLayout, withTheme, type Meta } from '@dxos/storybook-utils';
9
+ import { withTheme } from '@dxos/react-ui/testing';
10
+ import { decorateMarkdown, image, join, linkTooltip, table } from '@dxos/ui-editor';
11
11
 
12
12
  import { EditorStory, content, defaultExtensions, headings, renderLinkTooltip, text } from './components';
13
- import { decorateMarkdown, image, linkTooltip, table } from '../extensions';
14
- import { str } from '../testing';
15
13
 
16
- const meta: Meta<typeof EditorStory> = {
14
+ const meta = {
17
15
  title: 'ui/react-ui-editor/Markdown',
18
16
  component: EditorStory,
19
- decorators: [withTheme, withLayout({ fullscreen: true })],
20
- parameters: { layout: 'fullscreen' },
21
- };
17
+ decorators: [withTheme()],
18
+ parameters: {
19
+ layout: 'fullscreen',
20
+ },
21
+ } satisfies Meta<typeof EditorStory>;
22
22
 
23
23
  export default meta;
24
24
 
25
+ type Story = StoryObj<typeof meta>;
26
+
25
27
  //
26
28
  // Default
27
29
  //
28
30
 
29
- export const Default = {
31
+ export const Default: Story = {
30
32
  render: () => <EditorStory text={text} extensions={defaultExtensions} />,
31
33
  };
32
34
 
33
- export const Blockquote = {
35
+ export const Blockquote: Story = {
34
36
  render: () => (
35
37
  <EditorStory
36
- text={str('> Blockquote', 'continuation', content.footer)}
38
+ text={join('> Blockquote', 'continuation', content.footer)}
37
39
  extensions={decorateMarkdown()}
38
40
  debug='raw'
39
41
  />
40
42
  ),
41
43
  };
42
44
 
43
- export const Headings = {
45
+ export const Headings: Story = {
44
46
  render: () => <EditorStory text={headings} extensions={decorateMarkdown({ numberedHeadings: { from: 2, to: 4 } })} />,
45
47
  };
46
48
 
47
- export const Links = {
48
- render: () => <EditorStory text={str(content.links, content.footer)} extensions={[linkTooltip(renderLinkTooltip)]} />,
49
+ export const Links: Story = {
50
+ render: () => (
51
+ <EditorStory text={join(content.links, content.footer)} extensions={[linkTooltip(renderLinkTooltip)]} />
52
+ ),
49
53
  };
50
54
 
51
- export const Image = {
52
- render: () => <EditorStory text={str(content.image, content.footer)} extensions={[image()]} />,
55
+ export const Image: Story = {
56
+ render: () => <EditorStory text={join(content.image, content.footer)} extensions={[image()]} />,
53
57
  };
54
58
 
55
- export const Code = {
56
- render: () => <EditorStory text={str(content.codeblocks, content.footer)} extensions={[decorateMarkdown()]} />,
59
+ export const Code: Story = {
60
+ render: () => <EditorStory text={join(content.codeblocks, content.footer)} extensions={[decorateMarkdown()]} />,
57
61
  };
58
62
 
59
- export const Lists = {
63
+ export const Lists: Story = {
60
64
  render: () => (
61
65
  <EditorStory
62
- text={str(content.tasks, '', content.bullets, '', content.numbered, content.footer)}
66
+ text={join(content.tasks, '', content.bullets, '', content.numbered, content.footer)}
63
67
  extensions={[decorateMarkdown()]}
64
68
  />
65
69
  ),
@@ -69,48 +73,48 @@ export const Lists = {
69
73
  // Bullet List
70
74
  //
71
75
 
72
- export const BulletList = {
73
- render: () => <EditorStory text={str(content.bullets, content.footer)} extensions={[decorateMarkdown()]} />,
76
+ export const BulletList: Story = {
77
+ render: () => <EditorStory text={join(content.bullets, content.footer)} extensions={[decorateMarkdown()]} />,
74
78
  };
75
79
 
76
80
  //
77
81
  // Ordered List
78
82
  //
79
83
 
80
- export const OrderedList = {
81
- render: () => <EditorStory text={str(content.numbered, content.footer)} extensions={[decorateMarkdown()]} />,
84
+ export const OrderedList: Story = {
85
+ render: () => <EditorStory text={join(content.numbered, content.footer)} extensions={[decorateMarkdown()]} />,
82
86
  };
83
87
 
84
88
  //
85
89
  // Task List
86
90
  //
87
91
 
88
- export const TaskList = {
92
+ export const TaskList: Story = {
89
93
  render: () => (
90
- <EditorStory text={str(content.tasks, content.footer)} extensions={[decorateMarkdown()]} debug='raw+tree' />
94
+ <EditorStory text={join(content.tasks, content.footer)} extensions={[decorateMarkdown()]} debug='raw+tree' />
91
95
  ),
92
96
  };
93
97
 
94
- export const TaskListEmpty = {
95
- render: () => <EditorStory text={str('- [ ] ')} extensions={[decorateMarkdown()]} debug='raw+tree' />,
98
+ export const TaskListEmpty: Story = {
99
+ render: () => <EditorStory text={join('- [ ] ')} extensions={[decorateMarkdown()]} debug='raw+tree' />,
96
100
  };
97
101
 
98
102
  //
99
103
  // Table
100
104
  //
101
105
 
102
- export const Table = {
103
- render: () => <EditorStory text={str(content.table, content.footer)} extensions={[decorateMarkdown(), table()]} />,
106
+ export const Table: Story = {
107
+ render: () => <EditorStory text={join(content.table, content.footer)} extensions={[decorateMarkdown(), table()]} />,
104
108
  };
105
109
 
106
110
  //
107
111
  // Commented out
108
112
  //
109
113
 
110
- export const CommentedOut = {
114
+ export const CommentedOut: Story = {
111
115
  render: () => (
112
116
  <EditorStory
113
- text={str('# Commented out', '', content.comment, content.footer)}
117
+ text={join('# Commented out', '', content.comment, content.footer)}
114
118
  extensions={[
115
119
  decorateMarkdown(),
116
120
  markdown(),
@@ -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 { 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
16
  type StoryProps = {
20
- text: string;
17
+ text?: string;
21
18
  };
22
19
 
23
20
  const DefaultStory = ({ text }: StoryProps) => {
24
- const viewRef = useRef<EditorView>(null);
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(), 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 { 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-sm mx-1 pli-1 pbs-[2px] pbe-[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 StoryProps = Omit<UseEditorMenuProps, 'viewRef'> & { text: string };
48
+
49
+ const DefaultStory = ({ text, ...props }: StoryProps) => {
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: StoryProps) => {
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()],
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
+ };