@dxos/react-ui-editor 0.8.4-main.f9ba587 → 0.8.4-main.fcfe5033a5

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 +1384 -7468
  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 +1534 -7617
  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 +42 -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/Editor/EditorView.d.ts +31 -0
  12. package/dist/types/src/components/Editor/EditorView.d.ts.map +1 -0
  13. package/dist/types/src/components/Editor/controller.d.ts +10 -0
  14. package/dist/types/src/components/Editor/controller.d.ts.map +1 -0
  15. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts +34 -0
  16. package/dist/types/src/components/EditorMenuProvider/EditorMenuProvider.d.ts.map +1 -0
  17. package/dist/types/src/components/EditorMenuProvider/index.d.ts +6 -0
  18. package/dist/types/src/components/EditorMenuProvider/index.d.ts.map +1 -0
  19. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts +4 -0
  20. package/dist/types/src/components/EditorMenuProvider/menu-presets.d.ts.map +1 -0
  21. package/dist/types/src/components/EditorMenuProvider/menu.d.ts +28 -0
  22. package/dist/types/src/components/EditorMenuProvider/menu.d.ts.map +1 -0
  23. package/dist/types/src/components/EditorMenuProvider/popover.d.ts +46 -0
  24. package/dist/types/src/components/EditorMenuProvider/popover.d.ts.map +1 -0
  25. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts +34 -0
  26. package/dist/types/src/components/EditorMenuProvider/useEditorMenu.d.ts.map +1 -0
  27. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts +16 -0
  28. package/dist/types/src/components/EditorPreviewProvider/EditorPreviewProvider.d.ts.map +1 -0
  29. package/dist/types/src/components/EditorPreviewProvider/index.d.ts +2 -0
  30. package/dist/types/src/components/EditorPreviewProvider/index.d.ts.map +1 -0
  31. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts +28 -2
  32. package/dist/types/src/components/EditorToolbar/EditorToolbar.d.ts.map +1 -1
  33. package/dist/types/src/components/EditorToolbar/blocks.d.ts +4 -17
  34. package/dist/types/src/components/EditorToolbar/blocks.d.ts.map +1 -1
  35. package/dist/types/src/components/EditorToolbar/formatting.d.ts +4 -17
  36. package/dist/types/src/components/EditorToolbar/formatting.d.ts.map +1 -1
  37. package/dist/types/src/components/EditorToolbar/headings.d.ts +4 -17
  38. package/dist/types/src/components/EditorToolbar/headings.d.ts.map +1 -1
  39. package/dist/types/src/components/EditorToolbar/image.d.ts +3 -15
  40. package/dist/types/src/components/EditorToolbar/image.d.ts.map +1 -1
  41. package/dist/types/src/components/EditorToolbar/index.d.ts +1 -1
  42. package/dist/types/src/components/EditorToolbar/index.d.ts.map +1 -1
  43. package/dist/types/src/components/EditorToolbar/lists.d.ts +4 -17
  44. package/dist/types/src/components/EditorToolbar/lists.d.ts.map +1 -1
  45. package/dist/types/src/components/EditorToolbar/search.d.ts +3 -15
  46. package/dist/types/src/components/EditorToolbar/search.d.ts.map +1 -1
  47. package/dist/types/src/components/EditorToolbar/types.d.ts +5 -0
  48. package/dist/types/src/components/EditorToolbar/types.d.ts.map +1 -0
  49. package/dist/types/src/components/EditorToolbar/view-mode.d.ts +5 -18
  50. package/dist/types/src/components/EditorToolbar/view-mode.d.ts.map +1 -1
  51. package/dist/types/src/components/index.d.ts +2 -2
  52. package/dist/types/src/components/index.d.ts.map +1 -1
  53. package/dist/types/src/extensions/Assistant.stories.d.ts +10 -0
  54. package/dist/types/src/extensions/Assistant.stories.d.ts.map +1 -0
  55. package/dist/types/src/extensions/assistant-extension.d.ts +24 -0
  56. package/dist/types/src/extensions/assistant-extension.d.ts.map +1 -0
  57. package/dist/types/src/extensions/index.d.ts +1 -22
  58. package/dist/types/src/extensions/index.d.ts.map +1 -1
  59. package/dist/types/src/hooks/useTextEditor.d.ts +6 -10
  60. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  61. package/dist/types/src/index.d.ts +0 -7
  62. package/dist/types/src/index.d.ts.map +1 -1
  63. package/dist/types/src/stories/Automerge.stories.d.ts +44 -0
  64. package/dist/types/src/stories/Automerge.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 +42 -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 +16 -22
  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 +26 -26
  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 +7 -6
  94. package/dist/types/src/util/react.d.ts.map +1 -1
  95. package/dist/types/tsconfig.tsbuildinfo +1 -1
  96. package/package.json +87 -80
  97. package/src/components/Editor/Editor.stories.tsx +89 -0
  98. package/src/components/Editor/Editor.tsx +177 -24
  99. package/src/components/Editor/EditorView.tsx +83 -0
  100. package/src/components/Editor/controller.ts +50 -0
  101. package/src/components/EditorMenuProvider/EditorMenuProvider.tsx +226 -0
  102. package/src/components/EditorMenuProvider/index.ts +10 -0
  103. package/src/components/EditorMenuProvider/menu-presets.ts +125 -0
  104. package/src/components/EditorMenuProvider/menu.ts +70 -0
  105. package/src/components/EditorMenuProvider/popover.ts +285 -0
  106. package/src/components/EditorMenuProvider/useEditorMenu.ts +180 -0
  107. package/src/components/EditorPreviewProvider/EditorPreviewProvider.tsx +79 -0
  108. package/src/components/EditorPreviewProvider/index.ts +5 -0
  109. package/src/components/EditorToolbar/EditorToolbar.tsx +90 -103
  110. package/src/components/EditorToolbar/blocks.ts +52 -48
  111. package/src/components/EditorToolbar/formatting.ts +43 -48
  112. package/src/components/EditorToolbar/headings.ts +46 -45
  113. package/src/components/EditorToolbar/image.ts +16 -10
  114. package/src/components/EditorToolbar/index.ts +2 -7
  115. package/src/components/EditorToolbar/lists.ts +39 -41
  116. package/src/components/EditorToolbar/search.ts +16 -10
  117. package/src/components/EditorToolbar/types.ts +7 -0
  118. package/src/components/EditorToolbar/view-mode.ts +39 -40
  119. package/src/components/index.ts +3 -2
  120. package/src/extensions/Assistant.stories.tsx +111 -0
  121. package/src/extensions/assistant-extension.tsx +223 -0
  122. package/src/extensions/index.ts +2 -23
  123. package/src/hooks/useTextEditor.ts +39 -45
  124. package/src/index.ts +0 -9
  125. package/src/stories/Automerge.stories.tsx +173 -0
  126. package/src/stories/Comments.stories.tsx +58 -51
  127. package/src/stories/EditorToolbar.stories.tsx +48 -61
  128. package/src/stories/Experimental.stories.tsx +21 -19
  129. package/src/stories/Markdown.stories.tsx +37 -33
  130. package/src/stories/Outliner.stories.tsx +54 -44
  131. package/src/stories/Popover.stories.tsx +157 -0
  132. package/src/stories/Preview.stories.tsx +114 -95
  133. package/src/stories/Tags.stories.tsx +104 -0
  134. package/src/stories/TextEditor.stories.tsx +50 -75
  135. package/src/stories/Theme.stories.tsx +61 -0
  136. package/src/stories/components/EditorStory.tsx +48 -35
  137. package/src/stories/components/util.tsx +90 -59
  138. package/src/translations.ts +30 -25
  139. package/src/util/index.ts +1 -5
  140. package/src/util/react.tsx +9 -14
  141. package/dist/lib/browser/chunk-22UMM3QJ.mjs +0 -22
  142. package/dist/lib/browser/chunk-22UMM3QJ.mjs.map +0 -7
  143. package/dist/lib/browser/testing/index.mjs +0 -6
  144. package/dist/lib/browser/testing/index.mjs.map +0 -7
  145. package/dist/lib/browser/types/index.mjs +0 -13
  146. package/dist/lib/browser/types/index.mjs.map +0 -7
  147. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs +0 -24
  148. package/dist/lib/node-esm/chunk-YXYQPV6R.mjs.map +0 -7
  149. package/dist/lib/node-esm/testing/index.mjs +0 -8
  150. package/dist/lib/node-esm/testing/index.mjs.map +0 -7
  151. package/dist/lib/node-esm/types/index.mjs +0 -14
  152. package/dist/lib/node-esm/types/index.mjs.map +0 -7
  153. package/dist/types/src/components/EditorToolbar/util.d.ts +0 -51
  154. package/dist/types/src/components/EditorToolbar/util.d.ts.map +0 -1
  155. package/dist/types/src/components/Popover/CommandMenu.d.ts +0 -34
  156. package/dist/types/src/components/Popover/CommandMenu.d.ts.map +0 -1
  157. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts +0 -21
  158. package/dist/types/src/components/Popover/RefDropdownMenu.d.ts.map +0 -1
  159. package/dist/types/src/components/Popover/RefPopover.d.ts +0 -34
  160. package/dist/types/src/components/Popover/RefPopover.d.ts.map +0 -1
  161. package/dist/types/src/components/Popover/index.d.ts +0 -4
  162. package/dist/types/src/components/Popover/index.d.ts.map +0 -1
  163. package/dist/types/src/defaults.d.ts +0 -14
  164. package/dist/types/src/defaults.d.ts.map +0 -1
  165. package/dist/types/src/extensions/annotations.d.ts +0 -9
  166. package/dist/types/src/extensions/annotations.d.ts.map +0 -1
  167. package/dist/types/src/extensions/autocomplete.d.ts +0 -13
  168. package/dist/types/src/extensions/autocomplete.d.ts.map +0 -1
  169. package/dist/types/src/extensions/automerge/automerge.d.ts +0 -4
  170. package/dist/types/src/extensions/automerge/automerge.d.ts.map +0 -1
  171. package/dist/types/src/extensions/automerge/automerge.stories.d.ts +0 -56
  172. package/dist/types/src/extensions/automerge/automerge.stories.d.ts.map +0 -1
  173. package/dist/types/src/extensions/automerge/automerge.test.d.ts +0 -2
  174. package/dist/types/src/extensions/automerge/automerge.test.d.ts.map +0 -1
  175. package/dist/types/src/extensions/automerge/cursor.d.ts +0 -4
  176. package/dist/types/src/extensions/automerge/cursor.d.ts.map +0 -1
  177. package/dist/types/src/extensions/automerge/defs.d.ts +0 -17
  178. package/dist/types/src/extensions/automerge/defs.d.ts.map +0 -1
  179. package/dist/types/src/extensions/automerge/index.d.ts +0 -2
  180. package/dist/types/src/extensions/automerge/index.d.ts.map +0 -1
  181. package/dist/types/src/extensions/automerge/sync.d.ts +0 -17
  182. package/dist/types/src/extensions/automerge/sync.d.ts.map +0 -1
  183. package/dist/types/src/extensions/automerge/update-automerge.d.ts +0 -6
  184. package/dist/types/src/extensions/automerge/update-automerge.d.ts.map +0 -1
  185. package/dist/types/src/extensions/automerge/update-codemirror.d.ts +0 -5
  186. package/dist/types/src/extensions/automerge/update-codemirror.d.ts.map +0 -1
  187. package/dist/types/src/extensions/awareness/awareness-provider.d.ts +0 -31
  188. package/dist/types/src/extensions/awareness/awareness-provider.d.ts.map +0 -1
  189. package/dist/types/src/extensions/awareness/awareness.d.ts +0 -46
  190. package/dist/types/src/extensions/awareness/awareness.d.ts.map +0 -1
  191. package/dist/types/src/extensions/awareness/index.d.ts +0 -3
  192. package/dist/types/src/extensions/awareness/index.d.ts.map +0 -1
  193. package/dist/types/src/extensions/blast.d.ts +0 -25
  194. package/dist/types/src/extensions/blast.d.ts.map +0 -1
  195. package/dist/types/src/extensions/command/action.d.ts +0 -17
  196. package/dist/types/src/extensions/command/action.d.ts.map +0 -1
  197. package/dist/types/src/extensions/command/command-menu.d.ts +0 -20
  198. package/dist/types/src/extensions/command/command-menu.d.ts.map +0 -1
  199. package/dist/types/src/extensions/command/command.d.ts +0 -6
  200. package/dist/types/src/extensions/command/command.d.ts.map +0 -1
  201. package/dist/types/src/extensions/command/floating-menu.d.ts +0 -7
  202. package/dist/types/src/extensions/command/floating-menu.d.ts.map +0 -1
  203. package/dist/types/src/extensions/command/hint.d.ts +0 -24
  204. package/dist/types/src/extensions/command/hint.d.ts.map +0 -1
  205. package/dist/types/src/extensions/command/index.d.ts +0 -7
  206. package/dist/types/src/extensions/command/index.d.ts.map +0 -1
  207. package/dist/types/src/extensions/command/placeholder.d.ts +0 -10
  208. package/dist/types/src/extensions/command/placeholder.d.ts.map +0 -1
  209. package/dist/types/src/extensions/command/state.d.ts +0 -16
  210. package/dist/types/src/extensions/command/state.d.ts.map +0 -1
  211. package/dist/types/src/extensions/command/typeahead.d.ts +0 -22
  212. package/dist/types/src/extensions/command/typeahead.d.ts.map +0 -1
  213. package/dist/types/src/extensions/command/useCommandMenu.d.ts +0 -26
  214. package/dist/types/src/extensions/command/useCommandMenu.d.ts.map +0 -1
  215. package/dist/types/src/extensions/comments.d.ts +0 -95
  216. package/dist/types/src/extensions/comments.d.ts.map +0 -1
  217. package/dist/types/src/extensions/debug.d.ts +0 -3
  218. package/dist/types/src/extensions/debug.d.ts.map +0 -1
  219. package/dist/types/src/extensions/dnd.d.ts +0 -9
  220. package/dist/types/src/extensions/dnd.d.ts.map +0 -1
  221. package/dist/types/src/extensions/factories.d.ts +0 -82
  222. package/dist/types/src/extensions/factories.d.ts.map +0 -1
  223. package/dist/types/src/extensions/focus.d.ts +0 -7
  224. package/dist/types/src/extensions/focus.d.ts.map +0 -1
  225. package/dist/types/src/extensions/folding.d.ts +0 -7
  226. package/dist/types/src/extensions/folding.d.ts.map +0 -1
  227. package/dist/types/src/extensions/hashtag.d.ts +0 -3
  228. package/dist/types/src/extensions/hashtag.d.ts.map +0 -1
  229. package/dist/types/src/extensions/json.d.ts +0 -7
  230. package/dist/types/src/extensions/json.d.ts.map +0 -1
  231. package/dist/types/src/extensions/listener.d.ts +0 -11
  232. package/dist/types/src/extensions/listener.d.ts.map +0 -1
  233. package/dist/types/src/extensions/markdown/action.d.ts +0 -12
  234. package/dist/types/src/extensions/markdown/action.d.ts.map +0 -1
  235. package/dist/types/src/extensions/markdown/bundle.d.ts +0 -16
  236. package/dist/types/src/extensions/markdown/bundle.d.ts.map +0 -1
  237. package/dist/types/src/extensions/markdown/changes.d.ts +0 -10
  238. package/dist/types/src/extensions/markdown/changes.d.ts.map +0 -1
  239. package/dist/types/src/extensions/markdown/changes.test.d.ts +0 -2
  240. package/dist/types/src/extensions/markdown/changes.test.d.ts.map +0 -1
  241. package/dist/types/src/extensions/markdown/debug.d.ts +0 -11
  242. package/dist/types/src/extensions/markdown/debug.d.ts.map +0 -1
  243. package/dist/types/src/extensions/markdown/decorate.d.ts +0 -17
  244. package/dist/types/src/extensions/markdown/decorate.d.ts.map +0 -1
  245. package/dist/types/src/extensions/markdown/formatting.d.ts +0 -63
  246. package/dist/types/src/extensions/markdown/formatting.d.ts.map +0 -1
  247. package/dist/types/src/extensions/markdown/formatting.test.d.ts +0 -3
  248. package/dist/types/src/extensions/markdown/formatting.test.d.ts.map +0 -1
  249. package/dist/types/src/extensions/markdown/highlight.d.ts +0 -37
  250. package/dist/types/src/extensions/markdown/highlight.d.ts.map +0 -1
  251. package/dist/types/src/extensions/markdown/image.d.ts +0 -7
  252. package/dist/types/src/extensions/markdown/image.d.ts.map +0 -1
  253. package/dist/types/src/extensions/markdown/index.d.ts +0 -10
  254. package/dist/types/src/extensions/markdown/index.d.ts.map +0 -1
  255. package/dist/types/src/extensions/markdown/link.d.ts +0 -7
  256. package/dist/types/src/extensions/markdown/link.d.ts.map +0 -1
  257. package/dist/types/src/extensions/markdown/parser.test.d.ts +0 -2
  258. package/dist/types/src/extensions/markdown/parser.test.d.ts.map +0 -1
  259. package/dist/types/src/extensions/markdown/styles.d.ts +0 -4
  260. package/dist/types/src/extensions/markdown/styles.d.ts.map +0 -1
  261. package/dist/types/src/extensions/markdown/table.d.ts +0 -8
  262. package/dist/types/src/extensions/markdown/table.d.ts.map +0 -1
  263. package/dist/types/src/extensions/mention.d.ts +0 -7
  264. package/dist/types/src/extensions/mention.d.ts.map +0 -1
  265. package/dist/types/src/extensions/modes.d.ts +0 -10
  266. package/dist/types/src/extensions/modes.d.ts.map +0 -1
  267. package/dist/types/src/extensions/outliner/commands.d.ts +0 -10
  268. package/dist/types/src/extensions/outliner/commands.d.ts.map +0 -1
  269. package/dist/types/src/extensions/outliner/editor.d.ts +0 -5
  270. package/dist/types/src/extensions/outliner/editor.d.ts.map +0 -1
  271. package/dist/types/src/extensions/outliner/editor.test.d.ts +0 -2
  272. package/dist/types/src/extensions/outliner/editor.test.d.ts.map +0 -1
  273. package/dist/types/src/extensions/outliner/index.d.ts +0 -4
  274. package/dist/types/src/extensions/outliner/index.d.ts.map +0 -1
  275. package/dist/types/src/extensions/outliner/outliner.d.ts +0 -11
  276. package/dist/types/src/extensions/outliner/outliner.d.ts.map +0 -1
  277. package/dist/types/src/extensions/outliner/outliner.test.d.ts +0 -2
  278. package/dist/types/src/extensions/outliner/outliner.test.d.ts.map +0 -1
  279. package/dist/types/src/extensions/outliner/selection.d.ts +0 -12
  280. package/dist/types/src/extensions/outliner/selection.d.ts.map +0 -1
  281. package/dist/types/src/extensions/outliner/tree.d.ts +0 -79
  282. package/dist/types/src/extensions/outliner/tree.d.ts.map +0 -1
  283. package/dist/types/src/extensions/outliner/tree.test.d.ts +0 -2
  284. package/dist/types/src/extensions/outliner/tree.test.d.ts.map +0 -1
  285. package/dist/types/src/extensions/preview/index.d.ts +0 -2
  286. package/dist/types/src/extensions/preview/index.d.ts.map +0 -1
  287. package/dist/types/src/extensions/preview/preview.d.ts +0 -32
  288. package/dist/types/src/extensions/preview/preview.d.ts.map +0 -1
  289. package/dist/types/src/extensions/selection.d.ts +0 -24
  290. package/dist/types/src/extensions/selection.d.ts.map +0 -1
  291. package/dist/types/src/extensions/typewriter.d.ts +0 -10
  292. package/dist/types/src/extensions/typewriter.d.ts.map +0 -1
  293. package/dist/types/src/stories/Command.stories.d.ts +0 -7
  294. package/dist/types/src/stories/Command.stories.d.ts.map +0 -1
  295. package/dist/types/src/stories/CommandMenu.stories.d.ts +0 -13
  296. package/dist/types/src/stories/CommandMenu.stories.d.ts.map +0 -1
  297. package/dist/types/src/styles/index.d.ts +0 -4
  298. package/dist/types/src/styles/index.d.ts.map +0 -1
  299. package/dist/types/src/styles/markdown.d.ts +0 -8
  300. package/dist/types/src/styles/markdown.d.ts.map +0 -1
  301. package/dist/types/src/styles/theme.d.ts +0 -38
  302. package/dist/types/src/styles/theme.d.ts.map +0 -1
  303. package/dist/types/src/styles/tokens.d.ts +0 -3
  304. package/dist/types/src/styles/tokens.d.ts.map +0 -1
  305. package/dist/types/src/testing/index.d.ts +0 -2
  306. package/dist/types/src/testing/index.d.ts.map +0 -1
  307. package/dist/types/src/testing/util.d.ts +0 -2
  308. package/dist/types/src/testing/util.d.ts.map +0 -1
  309. package/dist/types/src/types/index.d.ts +0 -2
  310. package/dist/types/src/types/index.d.ts.map +0 -1
  311. package/dist/types/src/types/types.d.ts +0 -21
  312. package/dist/types/src/types/types.d.ts.map +0 -1
  313. package/dist/types/src/util/cursor.d.ts +0 -31
  314. package/dist/types/src/util/cursor.d.ts.map +0 -1
  315. package/dist/types/src/util/debug.d.ts +0 -17
  316. package/dist/types/src/util/debug.d.ts.map +0 -1
  317. package/dist/types/src/util/dom.d.ts +0 -20
  318. package/dist/types/src/util/dom.d.ts.map +0 -1
  319. package/dist/types/src/util/facet.d.ts +0 -3
  320. package/dist/types/src/util/facet.d.ts.map +0 -1
  321. package/src/components/EditorToolbar/util.ts +0 -65
  322. package/src/components/Popover/CommandMenu.tsx +0 -279
  323. package/src/components/Popover/RefDropdownMenu.tsx +0 -85
  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 -142
  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 -363
  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 -129
  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 -259
  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/json.ts +0 -57
  360. package/src/extensions/listener.ts +0 -38
  361. package/src/extensions/markdown/action.ts +0 -116
  362. package/src/extensions/markdown/bundle.ts +0 -71
  363. package/src/extensions/markdown/changes.test.ts +0 -26
  364. package/src/extensions/markdown/changes.ts +0 -149
  365. package/src/extensions/markdown/debug.ts +0 -44
  366. package/src/extensions/markdown/decorate.ts +0 -591
  367. package/src/extensions/markdown/formatting.test.ts +0 -498
  368. package/src/extensions/markdown/formatting.ts +0 -1267
  369. package/src/extensions/markdown/highlight.ts +0 -183
  370. package/src/extensions/markdown/image.ts +0 -119
  371. package/src/extensions/markdown/index.ts +0 -13
  372. package/src/extensions/markdown/link.ts +0 -47
  373. package/src/extensions/markdown/parser.test.ts +0 -75
  374. package/src/extensions/markdown/styles.ts +0 -135
  375. package/src/extensions/markdown/table.ts +0 -144
  376. package/src/extensions/mention.ts +0 -41
  377. package/src/extensions/modes.ts +0 -41
  378. package/src/extensions/outliner/commands.ts +0 -270
  379. package/src/extensions/outliner/editor.test.ts +0 -33
  380. package/src/extensions/outliner/editor.ts +0 -184
  381. package/src/extensions/outliner/index.ts +0 -7
  382. package/src/extensions/outliner/outliner.test.ts +0 -99
  383. package/src/extensions/outliner/outliner.ts +0 -166
  384. package/src/extensions/outliner/selection.ts +0 -50
  385. package/src/extensions/outliner/tree.test.ts +0 -167
  386. package/src/extensions/outliner/tree.ts +0 -317
  387. package/src/extensions/preview/index.ts +0 -5
  388. package/src/extensions/preview/preview.ts +0 -193
  389. package/src/extensions/selection.ts +0 -100
  390. package/src/extensions/typewriter.ts +0 -68
  391. package/src/stories/Command.stories.tsx +0 -97
  392. package/src/stories/CommandMenu.stories.tsx +0 -159
  393. package/src/styles/index.ts +0 -7
  394. package/src/styles/markdown.ts +0 -26
  395. package/src/styles/theme.ts +0 -266
  396. package/src/styles/tokens.ts +0 -17
  397. package/src/testing/index.ts +0 -5
  398. package/src/testing/util.ts +0 -5
  399. package/src/types/index.ts +0 -5
  400. package/src/types/types.ts +0 -32
  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
@@ -1,133 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { EditorView, ViewPlugin, type ViewUpdate } from '@codemirror/view';
6
-
7
- import { type CleanupFn, addEventListener } from '@dxos/async';
8
-
9
- import { closeEffect, openEffect } from './action';
10
-
11
- export type FloatingMenuOptions = {
12
- icon?: string;
13
- height?: number;
14
- padding?: number;
15
- };
16
-
17
- export const floatingMenu = (options: FloatingMenuOptions = {}) => [
18
- ViewPlugin.fromClass(
19
- class {
20
- view: EditorView;
21
- tag: HTMLElement;
22
- rafId?: number | null;
23
- cleanup?: CleanupFn;
24
-
25
- constructor(view: EditorView) {
26
- this.view = view;
27
-
28
- // Position context.
29
- const container = view.scrollDOM;
30
- if (getComputedStyle(container).position === 'static') {
31
- container.style.position = 'relative';
32
- }
33
-
34
- {
35
- const icon = document.createElement('dx-icon');
36
- icon.setAttribute('icon', options.icon ?? 'ph--dots-three-vertical--regular');
37
- const button = document.createElement('button');
38
- button.appendChild(icon);
39
-
40
- this.tag = document.createElement('dx-ref-tag');
41
- this.tag.classList.add('cm-ref-tag');
42
- this.tag.appendChild(button);
43
- }
44
-
45
- container.appendChild(this.tag);
46
-
47
- // Listen for scroll events.
48
- const handler = () => this.scheduleUpdate();
49
- this.cleanup = addEventListener(container, 'scroll', handler);
50
- this.scheduleUpdate();
51
- }
52
-
53
- destroy() {
54
- this.cleanup?.();
55
- this.tag.remove();
56
- if (this.rafId != null) {
57
- cancelAnimationFrame(this.rafId);
58
- }
59
- }
60
-
61
- update(update: ViewUpdate) {
62
- this.tag.dataset.focused = update.view.hasFocus ? 'true' : 'false';
63
- if (!update.view.hasFocus) {
64
- return;
65
- }
66
-
67
- // TODO(burdon): Timer to fade in/out.
68
- if (update.transactions.some((tr) => tr.effects.some((effect) => effect.is(openEffect)))) {
69
- this.tag.style.display = 'none';
70
- this.tag.classList.add('opacity-10');
71
- } else if (update.transactions.some((tr) => tr.effects.some((effect) => effect.is(closeEffect)))) {
72
- this.tag.style.display = 'block';
73
- } else if (
74
- update.docChanged ||
75
- update.focusChanged ||
76
- update.geometryChanged ||
77
- update.selectionSet ||
78
- update.viewportChanged
79
- ) {
80
- this.scheduleUpdate();
81
- }
82
- }
83
-
84
- updateButtonPosition() {
85
- const { x, width } = this.view.contentDOM.getBoundingClientRect();
86
-
87
- const pos = this.view.state.selection.main.head;
88
- const line = this.view.lineBlockAt(pos);
89
- const coords = this.view.coordsAtPos(line.from);
90
- if (!coords) {
91
- return;
92
- }
93
-
94
- const lineHeight = coords.bottom - coords.top;
95
- const dy = (lineHeight - (options.height ?? 32)) / 2;
96
-
97
- const offsetTop = coords.top + dy;
98
- const offsetLeft = x + width + (options.padding ?? 8);
99
-
100
- this.tag.style.top = `${offsetTop}px`;
101
- this.tag.style.left = `${offsetLeft}px`;
102
- this.tag.style.display = 'block';
103
- }
104
-
105
- scheduleUpdate() {
106
- if (this.rafId != null) {
107
- cancelAnimationFrame(this.rafId);
108
- }
109
-
110
- this.rafId = requestAnimationFrame(this.updateButtonPosition.bind(this));
111
- }
112
- },
113
- ),
114
-
115
- EditorView.theme({
116
- '.cm-ref-tag': {
117
- position: 'fixed',
118
- padding: '0',
119
- border: 'none',
120
- opacity: '0',
121
- },
122
- '[data-has-focus] & .cm-ref-tag': {
123
- opacity: '1',
124
- },
125
- '.cm-ref-tag button': {
126
- display: 'grid',
127
- alignItems: 'center',
128
- justifyContent: 'center',
129
- width: '2rem',
130
- height: '2rem',
131
- },
132
- }),
133
- ];
@@ -1,102 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- // Based on https://github.com/codemirror/view/blob/main/src/placeholder.ts
4
- //
5
-
6
- import { RangeSetBuilder } from '@codemirror/state';
7
- import { Decoration, EditorView, ViewPlugin, type ViewUpdate, WidgetType } from '@codemirror/view';
8
-
9
- import { commandState } from './state';
10
- import { clientRectsFor, flattenRect } from '../../util';
11
-
12
- export type HintOptions = {
13
- delay?: number;
14
- onHint?: () => string | undefined;
15
- };
16
-
17
- export const hint = ({ delay = 3_000, onHint }: HintOptions) => {
18
- return ViewPlugin.fromClass(
19
- class {
20
- decorations = Decoration.none;
21
- timeout: ReturnType<typeof setTimeout> | undefined;
22
-
23
- update(update: ViewUpdate) {
24
- if (this.timeout) {
25
- clearTimeout(this.timeout);
26
- this.timeout = undefined;
27
- }
28
-
29
- const builder = new RangeSetBuilder<Decoration>();
30
- const cState = update.view.state.field(commandState, false);
31
- if (!cState?.tooltip) {
32
- const selection = update.view.state.selection.main;
33
- const line = update.view.state.doc.lineAt(selection.from);
34
- // Only show if blank line.
35
- if (selection.from === selection.to && line.from === line.to) {
36
- // Set timeout to add decoration after delay.
37
- this.timeout = setTimeout(() => {
38
- const hint = onHint?.();
39
- if (hint) {
40
- const builder = new RangeSetBuilder<Decoration>();
41
- builder.add(selection.from, selection.to, Decoration.widget({ widget: new Hint(hint) }));
42
- this.decorations = builder.finish();
43
- update.view.update([]);
44
- }
45
- }, delay);
46
- }
47
- }
48
-
49
- this.decorations = builder.finish();
50
- }
51
-
52
- destroy() {
53
- if (this.timeout) {
54
- clearTimeout(this.timeout);
55
- }
56
- }
57
- },
58
- {
59
- provide: (plugin) => [EditorView.decorations.of((view) => view.plugin(plugin)?.decorations ?? Decoration.none)],
60
- },
61
- );
62
- };
63
-
64
- export class Hint extends WidgetType {
65
- constructor(readonly content: string | HTMLElement) {
66
- super();
67
- }
68
-
69
- toDOM(): HTMLSpanElement {
70
- const wrap = document.createElement('span');
71
- wrap.className = 'cm-placeholder';
72
- wrap.style.pointerEvents = 'none';
73
- wrap.appendChild(typeof this.content === 'string' ? document.createTextNode(this.content) : this.content);
74
- if (typeof this.content === 'string') {
75
- wrap.setAttribute('aria-label', 'placeholder ' + this.content);
76
- } else {
77
- wrap.setAttribute('aria-hidden', 'true');
78
- }
79
-
80
- return wrap;
81
- }
82
-
83
- override coordsAt(dom: HTMLElement) {
84
- const rects = dom.firstChild ? clientRectsFor(dom.firstChild) : [];
85
- if (!rects.length) {
86
- return null;
87
- }
88
-
89
- const style = window.getComputedStyle(dom.parentNode as HTMLElement);
90
- const rect = flattenRect(rects[0], style.direction !== 'rtl');
91
- const lineHeight = parseInt(style.lineHeight);
92
- if (rect.bottom - rect.top > lineHeight * 1.5) {
93
- return { left: rect.left, right: rect.right, top: rect.top, bottom: rect.top + lineHeight };
94
- }
95
-
96
- return rect;
97
- }
98
-
99
- override ignoreEvent(): boolean {
100
- return false;
101
- }
102
- }
@@ -1,10 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- export * from './action';
6
- export * from './command';
7
- export * from './command-menu';
8
- export * from './floating-menu';
9
- export * from './typeahead';
10
- export * from './useCommandMenu';
@@ -1,113 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- // Based on https://github.com/codemirror/view/blob/main/src/placeholder.ts
4
- //
5
-
6
- import { type Extension } from '@codemirror/state';
7
- import { Decoration, EditorView, WidgetType, ViewPlugin, type ViewUpdate } from '@codemirror/view';
8
-
9
- import { clientRectsFor, flattenRect } from '../../util';
10
-
11
- type Content = string | HTMLElement | ((view: EditorView) => HTMLElement);
12
-
13
- export type PlaceholderOptions = {
14
- delay?: number;
15
- content: Content;
16
- };
17
-
18
- export const placeholder = ({ delay = 3_000, content }: PlaceholderOptions): Extension => {
19
- const plugin = ViewPlugin.fromClass(
20
- class {
21
- decorations = Decoration.none;
22
- timeout: ReturnType<typeof setTimeout> | undefined;
23
-
24
- update(update: ViewUpdate) {
25
- if (this.timeout) {
26
- window.clearTimeout(this.timeout);
27
- this.timeout = undefined;
28
- }
29
-
30
- // Check if the active line (where cursor is) is empty.
31
- const activeLine = update.view.state.doc.lineAt(update.view.state.selection.main.head);
32
- const isEmpty = activeLine.text.trim() === '';
33
- if (isEmpty) {
34
- // Create widget decoration at the start of the current line.
35
- const lineStart = activeLine.from;
36
- this.timeout = setTimeout(() => {
37
- this.decorations = Decoration.set([
38
- Decoration.widget({
39
- widget: new Placeholder(content),
40
- side: 1,
41
- }).range(lineStart),
42
- ]);
43
-
44
- update.view.update([]);
45
- }, delay);
46
- }
47
-
48
- this.decorations = Decoration.none;
49
- }
50
-
51
- destroy() {
52
- if (this.timeout) {
53
- clearTimeout(this.timeout);
54
- }
55
- }
56
- },
57
- {
58
- provide: (plugin) => {
59
- return [EditorView.decorations.of((view) => view.plugin(plugin)?.decorations ?? Decoration.none)];
60
- },
61
- },
62
- );
63
-
64
- return typeof content === 'string'
65
- ? [plugin, EditorView.contentAttributes.of({ 'aria-placeholder': content })]
66
- : plugin;
67
- };
68
-
69
- class Placeholder extends WidgetType {
70
- constructor(readonly content: Content) {
71
- super();
72
- }
73
-
74
- toDOM(view: EditorView) {
75
- const wrap = document.createElement('span');
76
- wrap.className = 'cm-placeholder';
77
- wrap.style.pointerEvents = 'none';
78
- wrap.appendChild(
79
- typeof this.content === 'string'
80
- ? document.createTextNode(this.content)
81
- : typeof this.content === 'function'
82
- ? this.content(view)
83
- : this.content.cloneNode(true),
84
- );
85
- wrap.setAttribute('aria-hidden', 'true');
86
- return wrap;
87
- }
88
-
89
- override coordsAt(dom: HTMLElement) {
90
- const rects = dom.firstChild ? clientRectsFor(dom.firstChild) : [];
91
- if (!rects.length) {
92
- return null;
93
- }
94
-
95
- const style = window.getComputedStyle(dom.parentNode as HTMLElement);
96
- const rect = flattenRect(rects[0], style.direction !== 'rtl');
97
- const lineHeight = parseInt(style.lineHeight);
98
- if (rect.bottom - rect.top > lineHeight * 1.5) {
99
- return {
100
- left: rect.left,
101
- right: rect.right,
102
- top: rect.top,
103
- bottom: rect.top + lineHeight,
104
- };
105
- }
106
-
107
- return rect;
108
- }
109
-
110
- override ignoreEvent() {
111
- return false;
112
- }
113
- }
@@ -1,89 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { StateField } from '@codemirror/state';
6
- import { showTooltip, type EditorView, type Tooltip, type TooltipView } from '@codemirror/view';
7
-
8
- import { closeEffect, type Action, openEffect } from './action';
9
- import { type CommandOptions } from './command';
10
- import { type RenderCallback } from '../../types';
11
- import { singleValueFacet } from '../../util';
12
-
13
- export const commandConfig = singleValueFacet<CommandOptions>();
14
-
15
- export type PopupOptions = {
16
- renderDialog: RenderCallback<{ onAction: (action?: Action) => void }>;
17
- };
18
-
19
- type CommandState = {
20
- tooltip?: Tooltip;
21
- };
22
-
23
- export const commandState = StateField.define<CommandState>({
24
- create: () => ({}),
25
- update: (state, tr) => {
26
- for (const effect of tr.effects) {
27
- if (effect.is(closeEffect)) {
28
- return {};
29
- }
30
-
31
- const { renderDialog } = tr.state.facet(commandConfig);
32
- if (effect.is(openEffect) && renderDialog) {
33
- const { pos, fullWidth } = effect.value;
34
- const tooltip: Tooltip = {
35
- pos,
36
- above: false,
37
- arrow: false,
38
- strictSide: true,
39
- create: (view: EditorView) => {
40
- const root = document.createElement('div');
41
- const tooltipView: TooltipView = {
42
- dom: root,
43
- mount: (view: EditorView) => {
44
- if (fullWidth) {
45
- const parent = root.parentElement!;
46
- const { paddingLeft, paddingRight } = window.getComputedStyle(parent);
47
- const widthWithoutPadding = parent.clientWidth - parseFloat(paddingLeft) - parseFloat(paddingRight);
48
- root.style.width = `${widthWithoutPadding}px`;
49
- }
50
-
51
- // Render react component.
52
- renderDialog(
53
- root,
54
- {
55
- onAction: (action) => {
56
- view.dispatch({ effects: closeEffect.of(null) });
57
- switch (action?.type) {
58
- case 'insert': {
59
- // Insert into editor.
60
- const text = action.text + '\n';
61
- view.dispatch({
62
- changes: { from: pos, insert: text },
63
- selection: { anchor: pos + text.length },
64
- });
65
- break;
66
- }
67
- }
68
-
69
- // NOTE: Truncates text if set focus immediately.
70
- requestAnimationFrame(() => view.focus());
71
- },
72
- },
73
- view,
74
- );
75
- },
76
- };
77
-
78
- return tooltipView;
79
- },
80
- };
81
-
82
- return { tooltip };
83
- }
84
- }
85
-
86
- return state;
87
- },
88
- provide: (field) => [showTooltip.from(field, (value) => value.tooltip ?? null)],
89
- });
@@ -1,129 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { EditorSelection, Prec, RangeSetBuilder, type Extension } from '@codemirror/state';
6
- import {
7
- type Command,
8
- Decoration,
9
- type DecorationSet,
10
- type EditorView,
11
- keymap,
12
- ViewPlugin,
13
- type ViewUpdate,
14
- } from '@codemirror/view';
15
-
16
- import { Hint } from './hint';
17
-
18
- export type TypeaheadContext = { line: string };
19
-
20
- // TODO(burdon): Option to complete only at end of line?
21
- export type TypeaheadOptions = {
22
- onComplete?: (context: TypeaheadContext) => string | undefined;
23
- };
24
-
25
- /**
26
- * CodeMirror extension for typeahead completion.
27
- */
28
- export const typeahead = ({ onComplete }: TypeaheadOptions = {}): Extension => {
29
- let hint: string | undefined;
30
-
31
- const complete: Command = (view: EditorView) => {
32
- if (!hint) {
33
- return false;
34
- }
35
-
36
- const selection = view.state.selection.main;
37
- view.dispatch({
38
- changes: [{ from: selection.from, to: selection.to, insert: hint }],
39
- selection: EditorSelection.cursor(selection.from + hint.length),
40
- });
41
-
42
- return true;
43
- };
44
-
45
- return [
46
- ViewPlugin.fromClass(
47
- class {
48
- decorations: DecorationSet = Decoration.none;
49
- update(update: ViewUpdate) {
50
- const builder = new RangeSetBuilder<Decoration>();
51
- const selection = update.view.state.selection.main;
52
- const line = update.view.state.doc.lineAt(selection.from);
53
-
54
- // TODO(burdon): Check at end of line and matches start of previous word.
55
- // TODO(burdon): Context grammar.
56
- if (selection.from === selection.to && selection.from === line.to) {
57
- const str = update.state.sliceDoc(line.from, selection.from);
58
- hint = onComplete?.({ line: str });
59
- if (hint) {
60
- builder.add(selection.from, selection.to, Decoration.widget({ widget: new Hint(hint) }));
61
- }
62
- }
63
-
64
- this.decorations = builder.finish();
65
- }
66
- },
67
- {
68
- decorations: (v) => v.decorations,
69
- },
70
- ),
71
-
72
- // Keys.
73
- Prec.highest(
74
- keymap.of([
75
- {
76
- key: 'Tab',
77
- preventDefault: true,
78
- run: complete,
79
- },
80
- {
81
- key: 'ArrowRight',
82
- preventDefault: true,
83
- run: complete,
84
- },
85
- ]),
86
- ),
87
- ];
88
- };
89
-
90
- type CompletionOptions = {
91
- default?: string;
92
- minLength?: number;
93
- };
94
-
95
- /**
96
- * Util to match current line to a static list of completions.
97
- */
98
- export const staticCompletion =
99
- (completions: string[], options: CompletionOptions = {}) =>
100
- ({ line }: TypeaheadContext) => {
101
- if (line.length === 0 && options.default) {
102
- return options.default;
103
- }
104
-
105
- const parts = line.split(/\s+/).filter(Boolean);
106
- if (parts.length) {
107
- const str = parts.at(-1)!;
108
- if (str.length >= (options.minLength ?? 0)) {
109
- for (const completion of completions) {
110
- const match = matchCompletion(completion, str);
111
- if (match) {
112
- return match;
113
- }
114
- }
115
- }
116
- }
117
- };
118
-
119
- export const matchCompletion = (completion: string, str: string, minLength = 0): string | undefined => {
120
- if (
121
- str.length >= minLength &&
122
- completion.length > str.length &&
123
- completion.startsWith(str)
124
- // TODO(burdon): If case insensitive, need to replace existing chars.
125
- // completion.toLowerCase().startsWith(str.toLowerCase())
126
- ) {
127
- return completion.slice(str.length);
128
- }
129
- };
@@ -1,118 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import { type EditorView } from '@codemirror/view';
6
- import { type RefObject, useCallback, useMemo, useRef, useState } from 'react';
7
-
8
- import { type DxRefTag, type DxRefTagActivate } from '@dxos/lit-ui';
9
- import { type MaybePromise } from '@dxos/util';
10
-
11
- import { commandMenu, commandRangeEffect } from './command-menu';
12
- import { type PlaceholderOptions } from './placeholder';
13
- import { getItem, getNextItem, getPreviousItem, type CommandMenuGroup, type CommandMenuItem } from '../../components';
14
-
15
- export type UseCommandMenuOptions = {
16
- viewRef: RefObject<EditorView | undefined>;
17
- trigger: string | string[];
18
- placeholder?: Partial<PlaceholderOptions>;
19
- getMenu: (trigger: string, query?: string) => MaybePromise<CommandMenuGroup[]>;
20
- };
21
-
22
- export const useCommandMenu = ({ viewRef, trigger, placeholder, getMenu }: UseCommandMenuOptions) => {
23
- const triggerRef = useRef<DxRefTag | null>(null);
24
- const currentRef = useRef<CommandMenuItem | null>(null);
25
- const groupsRef = useRef<CommandMenuGroup[]>([]);
26
- const [currentItem, setCurrentItem] = useState<string>();
27
- const [open, setOpen] = useState(false);
28
- const [_, refresh] = useState({});
29
-
30
- const handleOpenChange = useCallback(
31
- async (open: boolean, trigger?: string) => {
32
- if (open && trigger) {
33
- groupsRef.current = await getMenu(trigger);
34
- }
35
- setOpen(open);
36
- if (!open) {
37
- triggerRef.current = null;
38
- setCurrentItem(undefined);
39
- viewRef.current?.dispatch({ effects: [commandRangeEffect.of(null)] });
40
- }
41
- },
42
- [getMenu],
43
- );
44
-
45
- const handleActivate = useCallback(
46
- async (event: DxRefTagActivate) => {
47
- const item = getItem(groupsRef.current, currentItem);
48
- if (item) {
49
- currentRef.current = item;
50
- }
51
-
52
- triggerRef.current = event.trigger;
53
- const triggerKey = event.trigger.getAttribute('data-trigger');
54
- if (!open && triggerKey) {
55
- await handleOpenChange(true, triggerKey);
56
- }
57
- },
58
- [open, handleOpenChange],
59
- );
60
-
61
- const handleSelect = useCallback((item: CommandMenuItem) => {
62
- const view = viewRef.current;
63
- if (!view) {
64
- return;
65
- }
66
-
67
- const selection = view.state.selection.main;
68
- void item.onSelect?.(view, selection.head);
69
- }, []);
70
-
71
- const serializedTrigger = Array.isArray(trigger) ? trigger.join(',') : trigger;
72
- const _commandMenu = useMemo(() => {
73
- return commandMenu({
74
- trigger,
75
- placeholder,
76
- onClose: () => handleOpenChange(false),
77
- onArrowDown: () => {
78
- setCurrentItem((currentItem) => {
79
- const next = getNextItem(groupsRef.current, currentItem);
80
- currentRef.current = next;
81
- return next.id;
82
- });
83
- },
84
- onArrowUp: () => {
85
- setCurrentItem((currentItem) => {
86
- const previous = getPreviousItem(groupsRef.current, currentItem);
87
- currentRef.current = previous;
88
- return previous.id;
89
- });
90
- },
91
- onEnter: () => {
92
- if (currentRef.current) {
93
- handleSelect(currentRef.current);
94
- }
95
- },
96
- onTextChange: async (trigger, text) => {
97
- groupsRef.current = await getMenu(trigger, text);
98
- const firstItem = groupsRef.current.filter((group) => group.items.length > 0)[0]?.items[0];
99
- if (firstItem) {
100
- setCurrentItem(firstItem.id);
101
- currentRef.current = firstItem;
102
- }
103
- refresh({});
104
- },
105
- });
106
- }, [handleOpenChange, getMenu, serializedTrigger, placeholder]);
107
-
108
- return {
109
- commandMenu: _commandMenu,
110
- currentItem,
111
- groupsRef,
112
- ref: triggerRef,
113
- open,
114
- onActivate: handleActivate,
115
- onOpenChange: setOpen,
116
- onSelect: handleSelect,
117
- };
118
- };