@dou-ui/editor 0.0.0-stage → 0.1.0-alpha.1

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 (324) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -2
  3. package/dist/catalog.js +18 -0
  4. package/dist/catalog.js.map +1 -0
  5. package/dist/code/code-editor-block.js +6 -0
  6. package/dist/code/code-editor-block.js.map +1 -0
  7. package/dist/code/code-editor-block.vue_vue_type_script_setup_true_lang.js +116 -0
  8. package/dist/code/code-editor-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  9. package/dist/code/index.js +69 -0
  10. package/dist/code/index.js.map +1 -0
  11. package/dist/code/languages.js +51 -0
  12. package/dist/code/languages.js.map +1 -0
  13. package/dist/code/view.js +255 -0
  14. package/dist/code/view.js.map +1 -0
  15. package/dist/collaboration/binding.js +381 -0
  16. package/dist/collaboration/binding.js.map +1 -0
  17. package/dist/collaboration/cursors.js +150 -0
  18. package/dist/collaboration/cursors.js.map +1 -0
  19. package/dist/collaboration/index.js +108 -0
  20. package/dist/collaboration/index.js.map +1 -0
  21. package/dist/collaboration/order.js +88 -0
  22. package/dist/collaboration/order.js.map +1 -0
  23. package/dist/collaboration/table.js +234 -0
  24. package/dist/collaboration/table.js.map +1 -0
  25. package/dist/collaboration/text.js +91 -0
  26. package/dist/collaboration/text.js.map +1 -0
  27. package/dist/components/block-handle.js +6 -0
  28. package/dist/components/block-handle.js.map +1 -0
  29. package/dist/components/block-handle.vue_vue_type_script_setup_true_lang.js +474 -0
  30. package/dist/components/block-handle.vue_vue_type_script_setup_true_lang.js.map +1 -0
  31. package/dist/components/bubble-toolbar.js +6 -0
  32. package/dist/components/bubble-toolbar.js.map +1 -0
  33. package/dist/components/bubble-toolbar.vue_vue_type_script_setup_true_lang.js +381 -0
  34. package/dist/components/bubble-toolbar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  35. package/dist/components/comment-button.js +6 -0
  36. package/dist/components/comment-button.js.map +1 -0
  37. package/dist/components/comment-button.vue_vue_type_script_setup_true_lang.js +83 -0
  38. package/dist/components/comment-button.vue_vue_type_script_setup_true_lang.js.map +1 -0
  39. package/dist/components/comment-card.js +6 -0
  40. package/dist/components/comment-card.js.map +1 -0
  41. package/dist/components/comment-card.vue_vue_type_script_setup_true_lang.js +104 -0
  42. package/dist/components/comment-card.vue_vue_type_script_setup_true_lang.js.map +1 -0
  43. package/dist/components/menu-escape.js +25 -0
  44. package/dist/components/menu-escape.js.map +1 -0
  45. package/dist/components/search-bar.js +6 -0
  46. package/dist/components/search-bar.js.map +1 -0
  47. package/dist/components/search-bar.vue_vue_type_script_setup_true_lang.js +192 -0
  48. package/dist/components/search-bar.vue_vue_type_script_setup_true_lang.js.map +1 -0
  49. package/dist/components/slash-menu.js +6 -0
  50. package/dist/components/slash-menu.js.map +1 -0
  51. package/dist/components/slash-menu.vue_vue_type_script_setup_true_lang.js +164 -0
  52. package/dist/components/slash-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  53. package/dist/core/align.js +94 -0
  54. package/dist/core/align.js.map +1 -0
  55. package/dist/core/block-selection.js +155 -0
  56. package/dist/core/block-selection.js.map +1 -0
  57. package/dist/core/blocks.js +132 -0
  58. package/dist/core/blocks.js.map +1 -0
  59. package/dist/core/changes.js +85 -0
  60. package/dist/core/changes.js.map +1 -0
  61. package/dist/core/colors.js +16 -0
  62. package/dist/core/colors.js.map +1 -0
  63. package/dist/core/commands.js +379 -0
  64. package/dist/core/commands.js.map +1 -0
  65. package/dist/core/comments.js +186 -0
  66. package/dist/core/comments.js.map +1 -0
  67. package/dist/core/compare.js +106 -0
  68. package/dist/core/compare.js.map +1 -0
  69. package/dist/core/convert.js +28 -0
  70. package/dist/core/convert.js.map +1 -0
  71. package/dist/core/diff.js +141 -0
  72. package/dist/core/diff.js.map +1 -0
  73. package/dist/core/editor.js +138 -0
  74. package/dist/core/editor.js.map +1 -0
  75. package/dist/core/extension.js +99 -0
  76. package/dist/core/extension.js.map +1 -0
  77. package/dist/core/file-drop.js +56 -0
  78. package/dist/core/file-drop.js.map +1 -0
  79. package/dist/core/highlight.js +120 -0
  80. package/dist/core/highlight.js.map +1 -0
  81. package/dist/core/input-rules.js +61 -0
  82. package/dist/core/input-rules.js.map +1 -0
  83. package/dist/core/keymap.js +38 -0
  84. package/dist/core/keymap.js.map +1 -0
  85. package/dist/core/model.js +196 -0
  86. package/dist/core/model.js.map +1 -0
  87. package/dist/core/output.js +263 -0
  88. package/dist/core/output.js.map +1 -0
  89. package/dist/core/plugins.js +102 -0
  90. package/dist/core/plugins.js.map +1 -0
  91. package/dist/core/prepare.js +102 -0
  92. package/dist/core/prepare.js.map +1 -0
  93. package/dist/core/schema.js +158 -0
  94. package/dist/core/schema.js.map +1 -0
  95. package/dist/core/search.js +197 -0
  96. package/dist/core/search.js.map +1 -0
  97. package/dist/core/selection.js +16 -0
  98. package/dist/core/selection.js.map +1 -0
  99. package/dist/core/slash.js +83 -0
  100. package/dist/core/slash.js.map +1 -0
  101. package/dist/core/transaction.js +311 -0
  102. package/dist/core/transaction.js.map +1 -0
  103. package/dist/define-block.js +177 -0
  104. package/dist/define-block.js.map +1 -0
  105. package/dist/document.js +157 -0
  106. package/dist/document.js.map +1 -0
  107. package/dist/dom.js +48 -0
  108. package/dist/dom.js.map +1 -0
  109. package/dist/editor.js +33 -0
  110. package/dist/editor.js.map +1 -0
  111. package/dist/editor.vue_vue_type_script_setup_true_lang.js +564 -0
  112. package/dist/editor.vue_vue_type_script_setup_true_lang.js.map +1 -0
  113. package/dist/editor2.js +6 -0
  114. package/dist/editor2.js.map +1 -0
  115. package/dist/extensions/align/align-menu.js +6 -0
  116. package/dist/extensions/align/align-menu.js.map +1 -0
  117. package/dist/extensions/align/align-menu.vue_vue_type_script_setup_true_lang.js +82 -0
  118. package/dist/extensions/align/align-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  119. package/dist/extensions/align/align-sub.js +6 -0
  120. package/dist/extensions/align/align-sub.js.map +1 -0
  121. package/dist/extensions/align/align-sub.vue_vue_type_script_setup_true_lang.js +57 -0
  122. package/dist/extensions/align/align-sub.vue_vue_type_script_setup_true_lang.js.map +1 -0
  123. package/dist/extensions/align/commands.js +40 -0
  124. package/dist/extensions/align/commands.js.map +1 -0
  125. package/dist/extensions/align/index.js +27 -0
  126. package/dist/extensions/align/index.js.map +1 -0
  127. package/dist/extensions/attachment/attachment-block.js +6 -0
  128. package/dist/extensions/attachment/attachment-block.js.map +1 -0
  129. package/dist/extensions/attachment/attachment-block.vue_vue_type_script_setup_true_lang.js +119 -0
  130. package/dist/extensions/attachment/attachment-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  131. package/dist/extensions/attachment/files.js +66 -0
  132. package/dist/extensions/attachment/files.js.map +1 -0
  133. package/dist/extensions/attachment/index.js +132 -0
  134. package/dist/extensions/attachment/index.js.map +1 -0
  135. package/dist/extensions/blocks.js +170 -0
  136. package/dist/extensions/blocks.js.map +1 -0
  137. package/dist/extensions/callout/callout-block.js +6 -0
  138. package/dist/extensions/callout/callout-block.js.map +1 -0
  139. package/dist/extensions/callout/callout-block.vue_vue_type_script_setup_true_lang.js +71 -0
  140. package/dist/extensions/callout/callout-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  141. package/dist/extensions/callout/html.js +61 -0
  142. package/dist/extensions/callout/html.js.map +1 -0
  143. package/dist/extensions/callout/index.js +52 -0
  144. package/dist/extensions/callout/index.js.map +1 -0
  145. package/dist/extensions/callout/tones.js +12 -0
  146. package/dist/extensions/callout/tones.js.map +1 -0
  147. package/dist/extensions/code-block/code-block-view.js +6 -0
  148. package/dist/extensions/code-block/code-block-view.js.map +1 -0
  149. package/dist/extensions/code-block/code-block-view.vue_vue_type_script_setup_true_lang.js +87 -0
  150. package/dist/extensions/code-block/code-block-view.vue_vue_type_script_setup_true_lang.js.map +1 -0
  151. package/dist/extensions/code-block/index.js +98 -0
  152. package/dist/extensions/code-block/index.js.map +1 -0
  153. package/dist/extensions/code-block/languages.js +116 -0
  154. package/dist/extensions/code-block/languages.js.map +1 -0
  155. package/dist/extensions/colors/color-menu.js +6 -0
  156. package/dist/extensions/colors/color-menu.js.map +1 -0
  157. package/dist/extensions/colors/color-menu.vue_vue_type_script_setup_true_lang.js +113 -0
  158. package/dist/extensions/colors/color-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  159. package/dist/extensions/colors/index.js +49 -0
  160. package/dist/extensions/colors/index.js.map +1 -0
  161. package/dist/extensions/colors/palette.js +26 -0
  162. package/dist/extensions/colors/palette.js.map +1 -0
  163. package/dist/extensions/editor-kit.js +35 -0
  164. package/dist/extensions/editor-kit.js.map +1 -0
  165. package/dist/extensions/embed/embed-block.js +6 -0
  166. package/dist/extensions/embed/embed-block.js.map +1 -0
  167. package/dist/extensions/embed/embed-block.vue_vue_type_script_setup_true_lang.js +210 -0
  168. package/dist/extensions/embed/embed-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  169. package/dist/extensions/embed/index.js +118 -0
  170. package/dist/extensions/embed/index.js.map +1 -0
  171. package/dist/extensions/embed/targets.js +79 -0
  172. package/dist/extensions/embed/targets.js.map +1 -0
  173. package/dist/extensions/formatting.js +153 -0
  174. package/dist/extensions/formatting.js.map +1 -0
  175. package/dist/extensions/image/image-block.js +6 -0
  176. package/dist/extensions/image/image-block.js.map +1 -0
  177. package/dist/extensions/image/image-block.vue_vue_type_script_setup_true_lang.js +206 -0
  178. package/dist/extensions/image/image-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  179. package/dist/extensions/image/index.js +125 -0
  180. package/dist/extensions/image/index.js.map +1 -0
  181. package/dist/extensions/image/uploads.js +96 -0
  182. package/dist/extensions/image/uploads.js.map +1 -0
  183. package/dist/extensions/list-html.js +58 -0
  184. package/dist/extensions/list-html.js.map +1 -0
  185. package/dist/extensions/lists.js +182 -0
  186. package/dist/extensions/lists.js.map +1 -0
  187. package/dist/extensions/mention/index.js +56 -0
  188. package/dist/extensions/mention/index.js.map +1 -0
  189. package/dist/extensions/mention/mention-menu.js +6 -0
  190. package/dist/extensions/mention/mention-menu.js.map +1 -0
  191. package/dist/extensions/mention/mention-menu.vue_vue_type_script_setup_true_lang.js +132 -0
  192. package/dist/extensions/mention/mention-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
  193. package/dist/extensions/mention/state.js +113 -0
  194. package/dist/extensions/mention/state.js.map +1 -0
  195. package/dist/extensions/table/commands.js +356 -0
  196. package/dist/extensions/table/commands.js.map +1 -0
  197. package/dist/extensions/table/html.js +134 -0
  198. package/dist/extensions/table/html.js.map +1 -0
  199. package/dist/extensions/table/index.js +56 -0
  200. package/dist/extensions/table/index.js.map +1 -0
  201. package/dist/extensions/table/plugin.js +81 -0
  202. package/dist/extensions/table/plugin.js.map +1 -0
  203. package/dist/extensions/table/schema.js +258 -0
  204. package/dist/extensions/table/schema.js.map +1 -0
  205. package/dist/extensions/table/table-controls.js +6 -0
  206. package/dist/extensions/table/table-controls.js.map +1 -0
  207. package/dist/extensions/table/table-controls.vue_vue_type_script_setup_true_lang.js +698 -0
  208. package/dist/extensions/table/table-controls.vue_vue_type_script_setup_true_lang.js.map +1 -0
  209. package/dist/extensions/table/view.js +19 -0
  210. package/dist/extensions/table/view.js.map +1 -0
  211. package/dist/extensions/toggle/index.js +87 -0
  212. package/dist/extensions/toggle/index.js.map +1 -0
  213. package/dist/extensions/toggle/state.js +120 -0
  214. package/dist/extensions/toggle/state.js.map +1 -0
  215. package/dist/extensions/toggle/toggle-block.js +6 -0
  216. package/dist/extensions/toggle/toggle-block.js.map +1 -0
  217. package/dist/extensions/toggle/toggle-block.vue_vue_type_script_setup_true_lang.js +42 -0
  218. package/dist/extensions/toggle/toggle-block.vue_vue_type_script_setup_true_lang.js.map +1 -0
  219. package/dist/index.js +49 -0
  220. package/dist/index.js.map +1 -0
  221. package/dist/locale.js +522 -0
  222. package/dist/locale.js.map +1 -0
  223. package/dist/markdown/index.js +24 -0
  224. package/dist/markdown/index.js.map +1 -0
  225. package/dist/style.css +1 -0
  226. package/dist/style.d.ts +1 -0
  227. package/dist/style.js +8 -0
  228. package/dist/types/catalog.d.ts +8 -0
  229. package/dist/types/code/code-editor-block.vue.d.ts +17 -0
  230. package/dist/types/code/index.d.ts +18 -0
  231. package/dist/types/code/languages.d.ts +7 -0
  232. package/dist/types/code/types.d.ts +37 -0
  233. package/dist/types/code/view.d.ts +12 -0
  234. package/dist/types/collaboration/binding.d.ts +32 -0
  235. package/dist/types/collaboration/cursors.d.ts +26 -0
  236. package/dist/types/collaboration/index.d.ts +47 -0
  237. package/dist/types/collaboration/order.d.ts +20 -0
  238. package/dist/types/collaboration/table.d.ts +25 -0
  239. package/dist/types/collaboration/text.d.ts +9 -0
  240. package/dist/types/components/block-handle.vue.d.ts +3 -0
  241. package/dist/types/components/bubble-toolbar.vue.d.ts +7 -0
  242. package/dist/types/components/comment-button.vue.d.ts +3 -0
  243. package/dist/types/components/comment-card.vue.d.ts +3 -0
  244. package/dist/types/components/menu-escape.d.ts +7 -0
  245. package/dist/types/components/search-bar.vue.d.ts +22 -0
  246. package/dist/types/components/slash-menu.vue.d.ts +11 -0
  247. package/dist/types/core/align.d.ts +16 -0
  248. package/dist/types/core/block-selection.d.ts +22 -0
  249. package/dist/types/core/blocks.d.ts +52 -0
  250. package/dist/types/core/changes.d.ts +14 -0
  251. package/dist/types/core/colors.d.ts +4 -0
  252. package/dist/types/core/commands.d.ts +61 -0
  253. package/dist/types/core/comments.d.ts +44 -0
  254. package/dist/types/core/compare.d.ts +10 -0
  255. package/dist/types/core/convert.d.ts +12 -0
  256. package/dist/types/core/diff.d.ts +49 -0
  257. package/dist/types/core/editor.d.ts +64 -0
  258. package/dist/types/core/extension.d.ts +167 -0
  259. package/dist/types/core/file-drop.d.ts +19 -0
  260. package/dist/types/core/highlight.d.ts +32 -0
  261. package/dist/types/core/input-rules.d.ts +21 -0
  262. package/dist/types/core/keymap.d.ts +8 -0
  263. package/dist/types/core/model.d.ts +158 -0
  264. package/dist/types/core/output.d.ts +64 -0
  265. package/dist/types/core/plugins.d.ts +24 -0
  266. package/dist/types/core/prepare.d.ts +23 -0
  267. package/dist/types/core/schema.d.ts +38 -0
  268. package/dist/types/core/search.d.ts +83 -0
  269. package/dist/types/core/selection.d.ts +8 -0
  270. package/dist/types/core/slash.d.ts +21 -0
  271. package/dist/types/core/transaction.d.ts +97 -0
  272. package/dist/types/define-block.d.ts +66 -0
  273. package/dist/types/document.d.ts +46 -0
  274. package/dist/types/dom.d.ts +17 -0
  275. package/dist/types/editor.d.ts +252 -0
  276. package/dist/types/editor.vue.d.ts +210 -0
  277. package/dist/types/extensions/align/align-menu.vue.d.ts +3 -0
  278. package/dist/types/extensions/align/align-sub.vue.d.ts +7 -0
  279. package/dist/types/extensions/align/commands.d.ts +13 -0
  280. package/dist/types/extensions/align/index.d.ts +7 -0
  281. package/dist/types/extensions/attachment/attachment-block.vue.d.ts +17 -0
  282. package/dist/types/extensions/attachment/files.d.ts +6 -0
  283. package/dist/types/extensions/attachment/index.d.ts +20 -0
  284. package/dist/types/extensions/blocks.d.ts +8 -0
  285. package/dist/types/extensions/callout/callout-block.vue.d.ts +14 -0
  286. package/dist/types/extensions/callout/html.d.ts +4 -0
  287. package/dist/types/extensions/callout/index.d.ts +3 -0
  288. package/dist/types/extensions/callout/tones.d.ts +8 -0
  289. package/dist/types/extensions/code-block/code-block-view.vue.d.ts +16 -0
  290. package/dist/types/extensions/code-block/index.d.ts +19 -0
  291. package/dist/types/extensions/code-block/languages.d.ts +9 -0
  292. package/dist/types/extensions/colors/color-menu.vue.d.ts +3 -0
  293. package/dist/types/extensions/colors/index.d.ts +7 -0
  294. package/dist/types/extensions/colors/palette.d.ts +7 -0
  295. package/dist/types/extensions/editor-kit.d.ts +37 -0
  296. package/dist/types/extensions/embed/embed-block.vue.d.ts +16 -0
  297. package/dist/types/extensions/embed/index.d.ts +18 -0
  298. package/dist/types/extensions/embed/targets.d.ts +32 -0
  299. package/dist/types/extensions/formatting.d.ts +8 -0
  300. package/dist/types/extensions/image/image-block.vue.d.ts +16 -0
  301. package/dist/types/extensions/image/index.d.ts +16 -0
  302. package/dist/types/extensions/image/uploads.d.ts +35 -0
  303. package/dist/types/extensions/list-html.d.ts +11 -0
  304. package/dist/types/extensions/lists.d.ts +6 -0
  305. package/dist/types/extensions/mention/index.d.ts +11 -0
  306. package/dist/types/extensions/mention/mention-menu.vue.d.ts +7 -0
  307. package/dist/types/extensions/mention/state.d.ts +28 -0
  308. package/dist/types/extensions/table/commands.d.ts +69 -0
  309. package/dist/types/extensions/table/html.d.ts +4 -0
  310. package/dist/types/extensions/table/index.d.ts +8 -0
  311. package/dist/types/extensions/table/plugin.d.ts +4 -0
  312. package/dist/types/extensions/table/schema.d.ts +23 -0
  313. package/dist/types/extensions/table/table-controls.vue.d.ts +3 -0
  314. package/dist/types/extensions/table/view.d.ts +13 -0
  315. package/dist/types/extensions/toggle/index.d.ts +7 -0
  316. package/dist/types/extensions/toggle/state.d.ts +17 -0
  317. package/dist/types/extensions/toggle/toggle-block.vue.d.ts +14 -0
  318. package/dist/types/index.d.ts +266 -0
  319. package/dist/types/locale.d.ts +195 -0
  320. package/dist/types/markdown/index.d.ts +14 -0
  321. package/dist/types/use-comments.d.ts +17 -0
  322. package/dist/use-comments.js +141 -0
  323. package/dist/use-comments.js.map +1 -0
  324. package/package.json +98 -4
@@ -0,0 +1,266 @@
1
+ import type { EditorContent } from './define-block';
2
+ export declare const DouEditor: import("dou-ui").WithInstall<import("vue").DefineComponent<import("./editor").EditorProps, import("./editor").EditorExpose, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
3
+ blur: (event: FocusEvent) => any;
4
+ change: (document: import("./index.js").EditorDocument<import("./index.js").Block>) => any;
5
+ focus: (event: FocusEvent) => any;
6
+ "update:modelValue": (document: import("./index.js").EditorDocument<import("./index.js").Block>) => any;
7
+ transaction: (result: import("./editor").EditorTransactionResult) => any;
8
+ "update:selection": (selection: import("./editor").EditorSelection) => any;
9
+ linkOpen: (event: import("./editor").EditorLinkOpenEvent) => any;
10
+ "update:comments": (threads: import("dou-ui").CommentThread[]) => any;
11
+ "update:activeComment": (id: string | null) => any;
12
+ commentAction: (action: import("dou-ui").CommentAction) => any;
13
+ }, string, import("vue").PublicProps, Readonly<import("./editor").EditorProps> & Readonly<{
14
+ onBlur?: ((event: FocusEvent) => any) | undefined;
15
+ onChange?: ((document: import("./index.js").EditorDocument<import("./index.js").Block>) => any) | undefined;
16
+ onFocus?: ((event: FocusEvent) => any) | undefined;
17
+ "onUpdate:modelValue"?: ((document: import("./index.js").EditorDocument<import("./index.js").Block>) => any) | undefined;
18
+ onTransaction?: ((result: import("./editor").EditorTransactionResult) => any) | undefined;
19
+ "onUpdate:selection"?: ((selection: import("./editor").EditorSelection) => any) | undefined;
20
+ onLinkOpen?: ((event: import("./editor").EditorLinkOpenEvent) => any) | undefined;
21
+ "onUpdate:comments"?: ((threads: import("dou-ui").CommentThread[]) => any) | undefined;
22
+ "onUpdate:activeComment"?: ((id: string | null) => any) | undefined;
23
+ onCommentAction?: ((action: import("dou-ui").CommentAction) => any) | undefined;
24
+ }>, {
25
+ placeholder: string;
26
+ comments: import("dou-ui").CommentThread[];
27
+ selection: import("./editor").EditorSelection;
28
+ undo: import("prosemirror-state").Command;
29
+ redo: import("prosemirror-state").Command;
30
+ plugins: import("prosemirror-state").Plugin<any>[];
31
+ history: boolean;
32
+ messages: {
33
+ placeholder?: string | undefined;
34
+ emptyPlaceholder?: string | undefined;
35
+ headingPlaceholder?: string | undefined;
36
+ types?: {
37
+ paragraph?: string | undefined;
38
+ heading1?: string | undefined;
39
+ heading2?: string | undefined;
40
+ heading3?: string | undefined;
41
+ bulletItem?: string | undefined;
42
+ numberedItem?: string | undefined;
43
+ checkItem?: string | undefined;
44
+ quote?: string | undefined;
45
+ codeBlock?: string | undefined;
46
+ divider?: string | undefined;
47
+ image?: string | undefined;
48
+ toggle?: string | undefined;
49
+ callout?: string | undefined;
50
+ table?: string | undefined;
51
+ attachment?: string | undefined;
52
+ embed?: string | undefined;
53
+ } | undefined;
54
+ hints?: {
55
+ paragraph?: string | undefined;
56
+ heading1?: string | undefined;
57
+ heading2?: string | undefined;
58
+ heading3?: string | undefined;
59
+ bulletItem?: string | undefined;
60
+ numberedItem?: string | undefined;
61
+ checkItem?: string | undefined;
62
+ quote?: string | undefined;
63
+ codeBlock?: string | undefined;
64
+ divider?: string | undefined;
65
+ image?: string | undefined;
66
+ toggle?: string | undefined;
67
+ callout?: string | undefined;
68
+ table?: string | undefined;
69
+ attachment?: string | undefined;
70
+ embed?: string | undefined;
71
+ } | undefined;
72
+ image?: {
73
+ empty?: string | undefined;
74
+ upload?: string | undefined;
75
+ embed?: string | undefined;
76
+ urlPlaceholder?: string | undefined;
77
+ apply?: string | undefined;
78
+ uploading?: string | undefined;
79
+ failed?: string | undefined;
80
+ caption?: string | undefined;
81
+ resize?: string | undefined;
82
+ } | undefined;
83
+ codeBlock?: {
84
+ language?: string | undefined;
85
+ plainText?: string | undefined;
86
+ } | undefined;
87
+ toggle?: {
88
+ expand?: string | undefined;
89
+ collapse?: string | undefined;
90
+ } | undefined;
91
+ callout?: {
92
+ change?: string | undefined;
93
+ tones?: {
94
+ info?: string | undefined;
95
+ tip?: string | undefined;
96
+ warning?: string | undefined;
97
+ danger?: string | undefined;
98
+ } | undefined;
99
+ } | undefined;
100
+ mention?: {
101
+ label?: string | undefined;
102
+ searching?: string | undefined;
103
+ noResults?: string | undefined;
104
+ } | undefined;
105
+ table?: {
106
+ row?: string | undefined;
107
+ column?: string | undefined;
108
+ insertAbove?: string | undefined;
109
+ insertBelow?: string | undefined;
110
+ insertLeft?: string | undefined;
111
+ insertRight?: string | undefined;
112
+ moveUp?: string | undefined;
113
+ moveDown?: string | undefined;
114
+ moveLeft?: string | undefined;
115
+ moveRight?: string | undefined;
116
+ deleteRow?: string | undefined;
117
+ deleteColumn?: string | undefined;
118
+ merge?: string | undefined;
119
+ split?: string | undefined;
120
+ clear?: string | undefined;
121
+ headerRow?: string | undefined;
122
+ headerColumn?: string | undefined;
123
+ alignLeft?: string | undefined;
124
+ alignCenter?: string | undefined;
125
+ alignRight?: string | undefined;
126
+ addRow?: string | undefined;
127
+ addColumn?: string | undefined;
128
+ } | undefined;
129
+ colors?: {
130
+ label?: string | undefined;
131
+ text?: string | undefined;
132
+ background?: string | undefined;
133
+ none?: string | undefined;
134
+ names?: {
135
+ gray?: string | undefined;
136
+ red?: string | undefined;
137
+ orange?: string | undefined;
138
+ yellow?: string | undefined;
139
+ green?: string | undefined;
140
+ blue?: string | undefined;
141
+ purple?: string | undefined;
142
+ pink?: string | undefined;
143
+ } | undefined;
144
+ } | undefined;
145
+ align?: {
146
+ label?: string | undefined;
147
+ left?: string | undefined;
148
+ center?: string | undefined;
149
+ right?: string | undefined;
150
+ } | undefined;
151
+ attachment?: {
152
+ empty?: string | undefined;
153
+ upload?: string | undefined;
154
+ uploading?: string | undefined;
155
+ failed?: string | undefined;
156
+ retry?: string | undefined;
157
+ download?: string | undefined;
158
+ } | undefined;
159
+ embed?: {
160
+ empty?: string | undefined;
161
+ urlPlaceholder?: string | undefined;
162
+ apply?: string | undefined;
163
+ invalid?: string | undefined;
164
+ insecure?: string | undefined;
165
+ caption?: string | undefined;
166
+ edit?: string | undefined;
167
+ cancel?: string | undefined;
168
+ } | undefined;
169
+ noResults?: string | undefined;
170
+ addBlock?: string | undefined;
171
+ dragHandle?: string | undefined;
172
+ turnInto?: string | undefined;
173
+ duplicate?: string | undefined;
174
+ delete?: string | undefined;
175
+ moveUp?: string | undefined;
176
+ moveDown?: string | undefined;
177
+ bold?: string | undefined;
178
+ italic?: string | undefined;
179
+ underline?: string | undefined;
180
+ strike?: string | undefined;
181
+ code?: string | undefined;
182
+ link?: string | undefined;
183
+ linkPlaceholder?: string | undefined;
184
+ applyLink?: string | undefined;
185
+ removeLink?: string | undefined;
186
+ comment?: string | undefined;
187
+ commentThread?: string | undefined;
188
+ removedBlock?: string | undefined;
189
+ restored?: string | undefined;
190
+ changeAdded?: string | undefined;
191
+ changeRemoved?: string | undefined;
192
+ changeChanged?: string | undefined;
193
+ formatting?: string | undefined;
194
+ blockTypes?: string | undefined;
195
+ };
196
+ autofocus: boolean;
197
+ modelValue: import("./index.js").EditorDocument<import("./index.js").PartialBlock>;
198
+ readonly: boolean;
199
+ author: import("dou-ui").CommentAuthor;
200
+ compare: import("./index.js").EditorDocument<import("./index.js").PartialBlock> | null;
201
+ extensions: (import("./index.js").EditorExtension | import("./index.js").EditorExtension[])[];
202
+ searchable: boolean;
203
+ ariaLabel: string;
204
+ activeComment: string | null;
205
+ commentable: boolean;
206
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>, import("vue").HTMLAttributes>;
207
+ export default DouEditor;
208
+ export { useEditor, useToolbarMenu } from './editor';
209
+ export type { EditorComments, EditorContext, EditorEmits, EditorExpose, EditorLinkOpenEvent, EditorProps, EditorOrigin, EditorSelection, EditorTransactionResult, } from './editor';
210
+ export { EditorTransaction } from './core/transaction';
211
+ export type { BlockEdge, BlockPatch, BlockPlacement, EditorTransactionMeta, } from './core/transaction';
212
+ export type { BlockChanges } from './core/changes';
213
+ export type { CommentAnchor, CommentRange } from './core/comments';
214
+ export { editorLocales, useEditorMessages } from './locale';
215
+ export type { EditorMessages, EditorMessagesOverride } from './locale';
216
+ export { filterOptions } from './catalog';
217
+ export { defineEditorExtension, labelOf } from './core/extension';
218
+ export type { BlockOption, CommentsProvider, EditorExtension, EditorExtensionContext, FormatOption, HistoryProvider, Label, MountComponent, ResolvedEditorExtensions, } from './core/extension';
219
+ export { align, callout, codeBlock, colors, divider, formatting, heading, link, lists, paragraph, quote, editorKit, table, toggle, } from './extensions/editor-kit';
220
+ export type { CalloutTone } from './extensions/callout';
221
+ export { setHighlight, setTextColor, textColors } from './extensions/colors';
222
+ export type { TextColor } from './extensions/colors';
223
+ export { currentAlign, setAlign } from './extensions/align';
224
+ export { alignable } from './core/align';
225
+ export type { BlockAlign } from './core/align';
226
+ export { attachment, formatFileSize, isSafeFileSrc } from './extensions/attachment';
227
+ export type { AttachmentOptions } from './extensions/attachment';
228
+ export { embed, resolveEmbed } from './extensions/embed';
229
+ export type { EmbedOptions, EmbedResolver, EmbedTarget } from './extensions/embed';
230
+ export { alignColumns, clearCells, deleteColumns, deleteRows, insertColumn, insertRow, mergeCells, moveLines, moveLinesTo, splitMergedCell, toggleHeader, } from './extensions/table';
231
+ export type { TableAlign, TableColumn } from './extensions/table';
232
+ export type { EditorKitOptions } from './extensions/editor-kit';
233
+ export { componentMounter, defineBlock, EditorContent, vueNodeView } from './define-block';
234
+ export { historyCommands } from './core/editor';
235
+ export { defaultLanguages } from './extensions/code-block';
236
+ export type { CodeBlockOptions, CodeHighlighter, CodeLanguage } from './extensions/code-block';
237
+ export { image, isSafeImageSrc, readAsDataUrl } from './extensions/image';
238
+ export { mention } from './extensions/mention';
239
+ export type { MentionItem, MentionOptions } from './extensions/mention';
240
+ export type { FileUploader, ImageOptions } from './extensions/image';
241
+ export type { BlockViewProps, DefineBlockOptions } from './define-block';
242
+ export { atomInputRule, blockInputRule, markInputRule } from './core/input-rules';
243
+ export type { Block, BlockProps, BreakContent, EditorDocument, InlineContent, InlineNodeContent, PartialBlock, PartialTableCell, PartialTableRow, RowsSpec, TableCell, TableRow, TextContent, } from './core/model';
244
+ export { blocksToDoc, createId, docToBlocks } from './core/model';
245
+ export { diffBlocks, diffText, inlineText } from './core/diff';
246
+ export type { BlockVersionChange, BlocksDiff, TextPart } from './core/diff';
247
+ export { searchDoc } from './core/search';
248
+ export type { EditorMatch, EditorSearchQuery } from './core/search';
249
+ export { checkDocument, emptyDocument, migrateDocument } from './document';
250
+ export type { CheckDocumentOptions, DocumentProblem } from './document';
251
+ export type { BuiltinContentType, ContentType, MarkType } from './core/schema';
252
+ export { contentDOM, createSchema, isSafeHref, textBlock } from './core/schema';
253
+ export { duplicateBlocks, insertBlockAfter, liftBlocks, swapBlocks, moveRangeTo, setBlockType, sinkBlocks, } from './core/commands';
254
+ export { clearBlockSelection, getBlockSelection, selectBlocks } from './core/block-selection';
255
+ export { isRemote } from './core/plugins';
256
+ export { blocksToHTML, htmlToBlocks } from './core/convert';
257
+ export type { EditorExtensionList } from './core/convert';
258
+ export { escapeHTML, escapeMarkdown, indentLines } from './core/output';
259
+ export type { BlockOutput, BlockOutputContext, EditorExtensionOutput, InlineOutput, MarkdownBlockContext, MarkOutput, } from './core/output';
260
+ export { blockElement, splitContainer } from './core/prepare';
261
+ declare module 'vue' {
262
+ interface GlobalComponents {
263
+ DouEditor: typeof DouEditor;
264
+ DouEditorContent: typeof EditorContent;
265
+ }
266
+ }
@@ -0,0 +1,195 @@
1
+ import { type MaybeRefOrGetter } from 'vue';
2
+ export interface EditorMessages {
3
+ placeholder: string;
4
+ emptyPlaceholder: string;
5
+ headingPlaceholder: string;
6
+ /** Names of the block types, also shown in menus. */
7
+ types: {
8
+ paragraph: string;
9
+ heading1: string;
10
+ heading2: string;
11
+ heading3: string;
12
+ bulletItem: string;
13
+ numberedItem: string;
14
+ checkItem: string;
15
+ quote: string;
16
+ codeBlock: string;
17
+ divider: string;
18
+ image: string;
19
+ toggle: string;
20
+ callout: string;
21
+ table: string;
22
+ attachment: string;
23
+ embed: string;
24
+ };
25
+ /** Short descriptions in the slash menu. */
26
+ hints: {
27
+ paragraph: string;
28
+ heading1: string;
29
+ heading2: string;
30
+ heading3: string;
31
+ bulletItem: string;
32
+ numberedItem: string;
33
+ checkItem: string;
34
+ quote: string;
35
+ codeBlock: string;
36
+ divider: string;
37
+ image: string;
38
+ toggle: string;
39
+ callout: string;
40
+ table: string;
41
+ attachment: string;
42
+ embed: string;
43
+ };
44
+ /** The image block. */
45
+ image: {
46
+ empty: string;
47
+ upload: string;
48
+ embed: string;
49
+ urlPlaceholder: string;
50
+ apply: string;
51
+ uploading: string;
52
+ failed: string;
53
+ caption: string;
54
+ resize: string;
55
+ };
56
+ /** The code block. */
57
+ codeBlock: {
58
+ /** The language picker's name. */
59
+ language: string;
60
+ plainText: string;
61
+ };
62
+ toggle: {
63
+ expand: string;
64
+ collapse: string;
65
+ };
66
+ callout: {
67
+ /** Said after the tone on the icon button. */
68
+ change: string;
69
+ tones: {
70
+ info: string;
71
+ tip: string;
72
+ warning: string;
73
+ danger: string;
74
+ };
75
+ };
76
+ mention: {
77
+ label: string;
78
+ searching: string;
79
+ noResults: string;
80
+ };
81
+ /** The table: its row and column menus. */
82
+ table: {
83
+ row: string;
84
+ column: string;
85
+ insertAbove: string;
86
+ insertBelow: string;
87
+ insertLeft: string;
88
+ insertRight: string;
89
+ moveUp: string;
90
+ moveDown: string;
91
+ moveLeft: string;
92
+ moveRight: string;
93
+ deleteRow: string;
94
+ deleteColumn: string;
95
+ merge: string;
96
+ split: string;
97
+ clear: string;
98
+ headerRow: string;
99
+ headerColumn: string;
100
+ alignLeft: string;
101
+ alignCenter: string;
102
+ alignRight: string;
103
+ addRow: string;
104
+ addColumn: string;
105
+ };
106
+ /** The color menu of the formatting toolbar. */
107
+ colors: {
108
+ label: string;
109
+ text: string;
110
+ background: string;
111
+ none: string;
112
+ names: {
113
+ gray: string;
114
+ red: string;
115
+ orange: string;
116
+ yellow: string;
117
+ green: string;
118
+ blue: string;
119
+ purple: string;
120
+ pink: string;
121
+ };
122
+ };
123
+ /** Aligning paragraphs, headings and quotes. */
124
+ align: {
125
+ label: string;
126
+ left: string;
127
+ center: string;
128
+ right: string;
129
+ };
130
+ /** The attachment block. */
131
+ attachment: {
132
+ empty: string;
133
+ upload: string;
134
+ uploading: string;
135
+ failed: string;
136
+ retry: string;
137
+ download: string;
138
+ };
139
+ /** The embed block. */
140
+ embed: {
141
+ empty: string;
142
+ urlPlaceholder: string;
143
+ apply: string;
144
+ invalid: string;
145
+ /** The link is not https. */
146
+ insecure: string;
147
+ caption: string;
148
+ edit: string;
149
+ cancel: string;
150
+ };
151
+ noResults: string;
152
+ addBlock: string;
153
+ dragHandle: string;
154
+ turnInto: string;
155
+ duplicate: string;
156
+ delete: string;
157
+ moveUp: string;
158
+ moveDown: string;
159
+ bold: string;
160
+ italic: string;
161
+ underline: string;
162
+ strike: string;
163
+ code: string;
164
+ link: string;
165
+ linkPlaceholder: string;
166
+ applyLink: string;
167
+ removeLink: string;
168
+ /** Starts a comment thread on the selected text. */
169
+ comment: string;
170
+ /** The name of the card that shows a thread. */
171
+ commentThread: string;
172
+ /** Shown for a removed block that has no text, such as a divider, when comparing versions. */
173
+ removedBlock: string;
174
+ /** Read out once a version is restored. */
175
+ restored: string;
176
+ /** Read out, before the text, when going to a change while comparing. */
177
+ changeAdded: string;
178
+ changeRemoved: string;
179
+ changeChanged: string;
180
+ formatting: string;
181
+ /** The name of the slash menu's list. */
182
+ blockTypes: string;
183
+ }
184
+ export declare const editorLocales: Record<string, EditorMessages>;
185
+ /**
186
+ * The editor's texts, picked by the name of DouUI's current locale.
187
+ * Pass `messages` to override any of them.
188
+ */
189
+ type DeepPartial<T> = {
190
+ [K in keyof T]?: T[K] extends object ? DeepPartial<T[K]> : T[K];
191
+ };
192
+ /** Any part of the messages: a nested group can be given in part too. */
193
+ export type EditorMessagesOverride = DeepPartial<EditorMessages>;
194
+ export declare function useEditorMessages(override?: MaybeRefOrGetter<EditorMessagesOverride | undefined>): import("vue").ComputedRef<EditorMessages>;
195
+ export {};
@@ -0,0 +1,14 @@
1
+ import { type EditorExtensionList } from '../core/convert';
2
+ import type { Block, PartialBlock } from '../core/model';
3
+ export interface MarkdownToBlocksOptions {
4
+ /**
5
+ * Turns Markdown into HTML. Defaults to markdown-it with HTML allowed
6
+ * (the HTML is read like pasted HTML, so only what the extensions know
7
+ * is kept); pass your own to add syntax.
8
+ */
9
+ render?: (markdown: string) => string;
10
+ }
11
+ /** Write blocks as Markdown (CommonMark with GitHub's extensions). Works without a browser. */
12
+ export declare function blocksToMarkdown(blocks: PartialBlock[], extensions: EditorExtensionList): string;
13
+ /** Read Markdown as blocks. Needs `DOMParser` (a browser, or a DOM library). */
14
+ export declare function markdownToBlocks(markdown: string, extensions: EditorExtensionList, options?: MarkdownToBlocksOptions): Block[];
@@ -0,0 +1,17 @@
1
+ import type { EditorView } from 'prosemirror-view';
2
+ import { type ShallowRef } from 'vue';
3
+ import { type CommentAnchor } from './core/comments';
4
+ import type { CommentsProvider } from './core/extension';
5
+ import type { EditorComments, EditorEmits, EditorProps } from './editor';
6
+ type Emit = <K extends keyof EditorEmits>(event: K, ...args: EditorEmits[K]) => void;
7
+ export declare function useEditorComments(options: {
8
+ props: EditorProps;
9
+ emit: Emit;
10
+ view: ShallowRef<EditorView | null>;
11
+ provider: CommentsProvider | null;
12
+ }): {
13
+ comments: EditorComments;
14
+ plugin: import("prosemirror-state").Plugin<import("./core/comments").CommentPluginState>;
15
+ anchors: () => Record<string, CommentAnchor | null>;
16
+ };
17
+ export {};
@@ -0,0 +1,141 @@
1
+ import { anchorComment, commentAnchors, commentPlugin, commentsAt, setPendingComment, unanchorComment } from "./core/comments.js";
2
+ import { applyCommentAction } from "dou-ui";
3
+ import { computed, shallowRef, watch } from "vue";
4
+ import { TextSelection } from "prosemirror-state";
5
+ // src/use-comments.ts
6
+ /** The selected text in a read-only editor, which keeps no selection of its own. */
7
+ function domSelection(view) {
8
+ const selection = view.dom.ownerDocument.getSelection();
9
+ if (!selection || selection.isCollapsed || !selection.rangeCount) return null;
10
+ const range = selection.getRangeAt(0);
11
+ if (!view.dom.contains(range.startContainer) || !view.dom.contains(range.endContainer)) return null;
12
+ try {
13
+ const from = view.posAtDOM(range.startContainer, range.startOffset);
14
+ const to = view.posAtDOM(range.endContainer, range.endOffset);
15
+ return to > from ? {
16
+ from,
17
+ to
18
+ } : null;
19
+ } catch {
20
+ return null;
21
+ }
22
+ }
23
+ /** Whether a range holds text a thread can be about: not only a divider, not in code. */
24
+ function hasText(state, range) {
25
+ let text = false;
26
+ state.doc.nodesBetween(range.from, range.to, (node) => {
27
+ if (text) return false;
28
+ if (!node.isTextblock) return true;
29
+ text = !node.type.spec.code && node.content.size > 0;
30
+ return false;
31
+ });
32
+ return text;
33
+ }
34
+ function useEditorComments(options) {
35
+ const { props, emit, view, provider } = options;
36
+ const threads = computed(() => provider?.threads.value ?? props.comments ?? []);
37
+ const enabled = computed(() => !!provider || props.comments !== void 0);
38
+ const writable = computed(() => enabled.value && !!props.author && props.commentable !== false);
39
+ const known = computed(() => new Set(threads.value.map((thread) => thread.id)));
40
+ if (provider) watch(provider.threads, (value) => emit("update:comments", [...value]), { immediate: true });
41
+ const innerActive = shallowRef(null);
42
+ const active = computed(() => props.activeComment === void 0 ? innerActive.value : props.activeComment);
43
+ function open(id) {
44
+ if (id === active.value) return;
45
+ innerActive.value = id;
46
+ emit("update:activeComment", id);
47
+ }
48
+ const pending = shallowRef(null);
49
+ function selection() {
50
+ const current = view.value;
51
+ if (!current) return null;
52
+ const range = current.editable ? current.state.selection instanceof TextSelection && !current.state.selection.empty ? {
53
+ from: current.state.selection.from,
54
+ to: current.state.selection.to
55
+ } : null : domSelection(current);
56
+ return range && hasText(current.state, range) ? range : null;
57
+ }
58
+ const focusRequest = shallowRef(0);
59
+ /** The open thread the cursor is in, innermost first. */
60
+ function threadAtCursor() {
61
+ const current = view.value;
62
+ if (!current) return null;
63
+ return commentsAt(current.state, current.state.selection.from).find((id) => isOpen(id)) ?? null;
64
+ }
65
+ function start() {
66
+ const current = view.value;
67
+ if (!current || !enabled.value) return false;
68
+ const range = selection();
69
+ if (!range) {
70
+ const id = threadAtCursor();
71
+ if (!id) return false;
72
+ open(id);
73
+ focusRequest.value++;
74
+ return true;
75
+ }
76
+ if (!writable.value) return false;
77
+ open(null);
78
+ setPendingComment(current, range);
79
+ return true;
80
+ }
81
+ function close() {
82
+ const current = view.value;
83
+ if (current && pending.value) setPendingComment(current, null);
84
+ open(null);
85
+ }
86
+ function apply(action) {
87
+ const current = view.value;
88
+ if (action.type === "create") {
89
+ const range = pending.value;
90
+ if (!current || !range) return;
91
+ anchorComment(current, range, action.thread.id);
92
+ } else if (current && action.type === "remove") unanchorComment(current, action.threadId);
93
+ if (provider) provider.apply(action);
94
+ else emit("update:comments", applyCommentAction(threads.value, action));
95
+ emit("commentAction", action);
96
+ if (action.type === "create") {
97
+ open(action.thread.id);
98
+ focusRequest.value++;
99
+ } else if (action.type === "remove" || action.type === "resolve") open(null);
100
+ }
101
+ const isOpen = (id) => {
102
+ const thread = threads.value.find((item) => item.id === id);
103
+ return !!thread && !thread.resolved;
104
+ };
105
+ const plugin = commentPlugin({
106
+ known: () => enabled.value ? known.value : null,
107
+ onClick: (ids) => {
108
+ if (pending.value && view.value) setPendingComment(view.value, null);
109
+ open(ids.find(isOpen) ?? null);
110
+ },
111
+ onSelect: () => {
112
+ if (!pending.value) open(null);
113
+ },
114
+ onPending: (range) => pending.value = range
115
+ });
116
+ function anchors() {
117
+ const found = view.value ? commentAnchors(view.value.state.doc) : /* @__PURE__ */ new Map();
118
+ return Object.fromEntries(threads.value.map((thread) => [thread.id, found.get(thread.id) ?? null]));
119
+ }
120
+ return {
121
+ comments: {
122
+ enabled,
123
+ writable,
124
+ threads,
125
+ author: computed(() => props.author),
126
+ active,
127
+ pending,
128
+ focusRequest,
129
+ selection,
130
+ start,
131
+ apply,
132
+ open,
133
+ close
134
+ },
135
+ plugin,
136
+ anchors
137
+ };
138
+ }
139
+ export { useEditorComments };
140
+
141
+ //# sourceMappingURL=use-comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-comments.js","names":[],"sources":["../src/use-comments.ts"],"sourcesContent":["import { applyCommentAction, type CommentAction, type CommentThread } from 'dou-ui'\nimport { TextSelection, type EditorState } from 'prosemirror-state'\nimport type { EditorView } from 'prosemirror-view'\nimport { computed, shallowRef, watch, type ShallowRef } from 'vue'\nimport {\n anchorComment,\n commentAnchors,\n commentsAt,\n commentPlugin,\n setPendingComment,\n unanchorComment,\n type CommentAnchor,\n type CommentRange,\n} from './core/comments'\nimport type { CommentsProvider } from './core/extension'\nimport type { EditorComments, EditorEmits, EditorProps } from './editor'\n\ntype Emit = <K extends keyof EditorEmits>(event: K, ...args: EditorEmits[K]) => void\n\n/** The selected text in a read-only editor, which keeps no selection of its own. */\nfunction domSelection(view: EditorView): CommentRange | null {\n const selection = view.dom.ownerDocument.getSelection()\n if (!selection || selection.isCollapsed || !selection.rangeCount) return null\n const range = selection.getRangeAt(0)\n if (!view.dom.contains(range.startContainer) || !view.dom.contains(range.endContainer))\n return null\n try {\n const from = view.posAtDOM(range.startContainer, range.startOffset)\n const to = view.posAtDOM(range.endContainer, range.endOffset)\n return to > from ? { from, to } : null\n } catch {\n return null\n }\n}\n\n/** Whether a range holds text a thread can be about: not only a divider, not in code. */\nfunction hasText(state: EditorState, range: CommentRange) {\n let text = false\n state.doc.nodesBetween(range.from, range.to, (node) => {\n if (text) return false\n if (!node.isTextblock) return true\n text = !node.type.spec.code && node.content.size > 0\n return false\n })\n return text\n}\n\nexport function useEditorComments(options: {\n props: EditorProps\n emit: Emit\n view: ShallowRef<EditorView | null>\n provider: CommentsProvider | null\n}) {\n const { props, emit, view, provider } = options\n\n const threads = computed<readonly CommentThread[]>(\n () => provider?.threads.value ?? props.comments ?? [],\n )\n const enabled = computed(() => !!provider || props.comments !== undefined)\n const writable = computed(() => enabled.value && !!props.author && props.commentable !== false)\n const known = computed(() => new Set(threads.value.map((thread) => thread.id)))\n\n // the shared document's threads, mirrored to `v-model:comments`\n if (provider)\n watch(provider.threads, (value) => emit('update:comments', [...value]), { immediate: true })\n\n const innerActive = shallowRef<string | null>(null)\n const active = computed(() =>\n props.activeComment === undefined ? innerActive.value : props.activeComment,\n )\n function open(id: string | null) {\n if (id === active.value) return\n innerActive.value = id\n emit('update:activeComment', id)\n }\n\n const pending = shallowRef<CommentRange | null>(null)\n\n function selection(): CommentRange | null {\n const current = view.value\n if (!current) return null\n const range = current.editable\n ? current.state.selection instanceof TextSelection && !current.state.selection.empty\n ? { from: current.state.selection.from, to: current.state.selection.to }\n : null\n : domSelection(current)\n return range && hasText(current.state, range) ? range : null\n }\n\n const focusRequest = shallowRef(0)\n\n /** The open thread the cursor is in, innermost first. */\n function threadAtCursor(): string | null {\n const current = view.value\n if (!current) return null\n const ids = commentsAt(current.state, current.state.selection.from)\n return ids.find((id) => isOpen(id)) ?? null\n }\n\n function start(): boolean {\n const current = view.value\n if (!current || !enabled.value) return false\n const range = selection()\n if (!range) {\n // on commented text: open its thread, ready to reply\n const id = threadAtCursor()\n if (!id) return false\n open(id)\n focusRequest.value++\n return true\n }\n if (!writable.value) return false\n open(null)\n setPendingComment(current, range)\n return true\n }\n\n function close() {\n const current = view.value\n if (current && pending.value) setPendingComment(current, null)\n open(null)\n }\n\n function apply(action: CommentAction) {\n const current = view.value\n if (action.type === 'create') {\n const range = pending.value\n if (!current || !range) return\n anchorComment(current, range, action.thread.id)\n } else if (current && action.type === 'remove') unanchorComment(current, action.threadId)\n if (provider) provider.apply(action)\n else emit('update:comments', applyCommentAction(threads.value, action))\n emit('commentAction', action)\n if (action.type === 'create') {\n open(action.thread.id)\n focusRequest.value++\n } else if (action.type === 'remove' || action.type === 'resolve') open(null)\n }\n\n const isOpen = (id: string) => {\n const thread = threads.value.find((item) => item.id === id)\n return !!thread && !thread.resolved\n }\n\n const plugin = commentPlugin({\n known: () => (enabled.value ? known.value : null),\n onClick: (ids) => {\n if (pending.value && view.value) setPendingComment(view.value, null)\n open(ids.find(isOpen) ?? null)\n },\n // selecting other text (the formatting toolbar shows) closes an open thread\n onSelect: () => {\n if (!pending.value) open(null)\n },\n onPending: (range) => (pending.value = range),\n })\n\n function anchors(): Record<string, CommentAnchor | null> {\n const found = view.value ? commentAnchors(view.value.state.doc) : new Map()\n return Object.fromEntries(\n threads.value.map((thread) => [thread.id, found.get(thread.id) ?? null]),\n )\n }\n\n const comments: EditorComments = {\n enabled,\n writable,\n threads,\n author: computed(() => props.author),\n active,\n pending,\n focusRequest,\n selection,\n start,\n apply,\n open,\n close,\n }\n\n return { comments, plugin, anchors }\n}\n"],"mappings":"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"}