@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,564 @@
1
+ import { blocksToDoc, docToBlocks } from "./core/model.js";
2
+ import { resolveEditorExtensions } from "./core/extension.js";
3
+ import { selectBlocks } from "./core/block-selection.js";
4
+ import { slashPlugin } from "./core/slash.js";
5
+ import { editorKey } from "./editor.js";
6
+ import block_handle_default from "./components/block-handle.js";
7
+ import bubble_toolbar_default from "./components/bubble-toolbar.js";
8
+ import { isRemote } from "./core/plugins.js";
9
+ import { parseHTML } from "./core/prepare.js";
10
+ import { createEditorView, getBlocks, historyCommands, replaceBlocks, restoreBlocks, runCommand, setEditable } from "./core/editor.js";
11
+ import { previewMatch, searchKey, searchPlugin, setSearch } from "./core/search.js";
12
+ import search_bar_default from "./components/search-bar.js";
13
+ import comment_button_default from "./components/comment-button.js";
14
+ import comment_card_default from "./components/comment-card.js";
15
+ import slash_menu_default from "./components/slash-menu.js";
16
+ import { setFallbackHighlighter } from "./core/highlight.js";
17
+ import { compareKey, comparePlugin } from "./core/compare.js";
18
+ import { diffBlocks } from "./core/changes.js";
19
+ import { sameSelection, selectionOf } from "./core/selection.js";
20
+ import { EditorTransaction, applyEditorTransaction } from "./core/transaction.js";
21
+ import { writeHTML } from "./core/output.js";
22
+ import { componentMounter, vueNodeView } from "./define-block.js";
23
+ import { editorKit } from "./extensions/editor-kit.js";
24
+ import { readBlocks } from "./document.js";
25
+ import { useEditorMessages } from "./locale.js";
26
+ import { useEditorComments } from "./use-comments.js";
27
+ import { isApplePlatform, useGlobalConfig, useNamespace } from "dou-ui";
28
+ import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createVNode, defineComponent, getCurrentInstance, h, nextTick, normalizeClass, onBeforeUnmount, onMounted, openBlock, provide, ref, renderList, resolveDynamicComponent, shallowRef, toDisplayString, toRaw, unref, useId, useTemplateRef, watch } from "vue";
29
+ import { keymap } from "prosemirror-keymap";
30
+ import { Plugin } from "prosemirror-state";
31
+ // src/editor.vue?vue&type=script&setup=true&lang.ts
32
+ var _hoisted_1 = ["data-dou-editor"];
33
+ var editor_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
34
+ name: "DouEditor",
35
+ __name: "editor",
36
+ props: {
37
+ modelValue: { default: void 0 },
38
+ extensions: { default: void 0 },
39
+ readonly: {
40
+ type: Boolean,
41
+ default: false
42
+ },
43
+ searchable: {
44
+ type: Boolean,
45
+ default: true
46
+ },
47
+ placeholder: { default: void 0 },
48
+ messages: { default: void 0 },
49
+ ariaLabel: { default: void 0 },
50
+ autofocus: {
51
+ type: Boolean,
52
+ default: false
53
+ },
54
+ plugins: { default: void 0 },
55
+ history: {
56
+ type: Boolean,
57
+ default: true
58
+ },
59
+ undo: {
60
+ type: Function,
61
+ default: void 0
62
+ },
63
+ redo: {
64
+ type: Function,
65
+ default: void 0
66
+ },
67
+ comments: { default: void 0 },
68
+ author: { default: void 0 },
69
+ activeComment: { default: void 0 },
70
+ commentable: {
71
+ type: Boolean,
72
+ default: true
73
+ },
74
+ compare: { default: void 0 },
75
+ selection: { default: void 0 }
76
+ },
77
+ emits: [
78
+ "update:modelValue",
79
+ "change",
80
+ "transaction",
81
+ "update:selection",
82
+ "linkOpen",
83
+ "focus",
84
+ "blur",
85
+ "update:comments",
86
+ "update:activeComment",
87
+ "commentAction"
88
+ ],
89
+ setup(__props, { expose: __expose, emit: __emit }) {
90
+ const props = __props;
91
+ const emit = __emit;
92
+ const kit = resolveEditorExtensions(props.extensions ?? [editorKit()]);
93
+ const stopWatchingExtensions = watch(() => props.extensions, () => {
94
+ console.warn("[@dou-ui/editor] `extensions` changed after mount and is ignored: it is read once. Create the list once outside the template, or give the editor a new `key` to rebuild it.");
95
+ stopWatchingExtensions();
96
+ });
97
+ const ns = useNamespace("editor");
98
+ const messages = useEditorMessages(() => props.messages);
99
+ const config = useGlobalConfig();
100
+ const root = useTemplateRef("root");
101
+ const mount = useTemplateRef("mount");
102
+ const view = shallowRef(null);
103
+ const state = shallowRef(null);
104
+ const focused = shallowRef(false);
105
+ const dragging = shallowRef(false);
106
+ /** Showing what changed since an older version: read-only, without comments. */
107
+ const comparing = computed(() => !!props.compare);
108
+ /**
109
+ * The older version as whole blocks, matched to the current ones by id. A
110
+ * block saved without an id gets a new one, so it shows as removed.
111
+ */
112
+ const compareBlocks = computed(() => {
113
+ const blocks = props.compare?.blocks;
114
+ return Array.isArray(blocks) ? docToBlocks(blocksToDoc(kit.schema, blocks)) : null;
115
+ });
116
+ const editable = computed(() => !props.readonly && !comparing.value);
117
+ const { comments, plugin: commentPlugin, anchors } = useEditorComments({
118
+ props,
119
+ emit,
120
+ view,
121
+ provider: kit.comments
122
+ });
123
+ const context = {
124
+ view,
125
+ state,
126
+ focused,
127
+ dragging,
128
+ editable,
129
+ messages,
130
+ root,
131
+ kit,
132
+ comments
133
+ };
134
+ provide(editorKey, context);
135
+ const appContext = getCurrentInstance()?.appContext ?? null;
136
+ const mountComponent = componentMounter(appContext, [[editorKey, context]]);
137
+ const componentViews = {
138
+ ...Object.fromEntries(Object.entries(kit.schema.nodes).filter(([, type]) => type.spec.component).map(([name, type]) => [name, vueNodeView(type.spec.component, appContext, [[editorKey, context]])])),
139
+ ...Object.fromEntries(Object.entries(kit.componentViews).map(([name, create]) => [name, create(mountComponent)]))
140
+ };
141
+ const searchOpen = ref(false);
142
+ const searchReplacing = ref(false);
143
+ const searchBar = useTemplateRef("searchBar");
144
+ /** Blocks that draw their own text, such as a code block in the code editor, are not searched. */
145
+ const searchSkip = (node) => node.type.name in kit.componentViews;
146
+ /** Opens the panel, with the replace box for `replace`. A selection on one line becomes the search. */
147
+ function openSearch(replace = false, given) {
148
+ const v = view.value;
149
+ if (!v || !props.searchable) return false;
150
+ const query = {
151
+ ...searchKey.getState(v.state)?.query ?? { search: "" },
152
+ ...given
153
+ };
154
+ const { from, to, empty } = v.state.selection;
155
+ if (given?.search === void 0 && !empty) {
156
+ const text = v.state.doc.textBetween(from, to, "\n");
157
+ if (text && !text.includes("\n")) query.search = text;
158
+ }
159
+ if ((replace || given?.replace !== void 0) && editable.value) searchReplacing.value = true;
160
+ searchOpen.value = true;
161
+ v.dispatch(setSearch(v.state.tr, {
162
+ query,
163
+ active: true
164
+ }));
165
+ const preview = previewMatch(v.state);
166
+ if (preview) v.dispatch(preview);
167
+ nextTick(() => searchBar.value?.focus(replace && editable.value ? "replace" : "find"));
168
+ return true;
169
+ }
170
+ function closeSearch() {
171
+ const v = view.value;
172
+ if (!searchOpen.value || !v) return false;
173
+ searchOpen.value = false;
174
+ v.dispatch(setSearch(v.state.tr, { active: false }));
175
+ v.focus();
176
+ return true;
177
+ }
178
+ /** Goes to the next (or previous) match; with the panel shut, opens it on the last search. */
179
+ function findAgain(step) {
180
+ if (!searchOpen.value) {
181
+ const v = view.value;
182
+ if (!v || !searchKey.getState(v.state)?.query.search || !openSearch()) return false;
183
+ }
184
+ nextTick(() => step > 0 ? searchBar.value?.next() : searchBar.value?.previous());
185
+ return true;
186
+ }
187
+ const replaceKey = isApplePlatform() ? "Mod-Alt-f" : "Mod-h";
188
+ const searchKeys = keymap({
189
+ "Mod-f": () => openSearch(),
190
+ [replaceKey]: () => openSearch(true),
191
+ F3: () => findAgain(1),
192
+ "Mod-g": () => findAgain(1),
193
+ "Shift-F3": () => findAgain(-1),
194
+ "Mod-Shift-g": () => findAgain(-1),
195
+ Escape: () => closeSearch()
196
+ });
197
+ const slash = shallowRef(null);
198
+ const slashMenu = useTemplateRef("slashMenu");
199
+ const bubble = useTemplateRef("bubble");
200
+ let emitted;
201
+ let lastResult = null;
202
+ function onChange(current, tr, before) {
203
+ const blocks = getBlocks(current);
204
+ const doc = {
205
+ version: 1,
206
+ blocks
207
+ };
208
+ emitted = doc;
209
+ const history = tr.getMeta("history$");
210
+ const origin = tr.getMeta("douOrigin") ?? (history ? history.redo ? "redo" : "undo" : isRemote(tr) ? "remote" : void 0);
211
+ const meta = { history: tr.getMeta("addToHistory") !== false && origin !== "remote" && origin !== "undo" && origin !== "redo" };
212
+ if (origin !== void 0) meta.origin = origin;
213
+ lastResult = {
214
+ blocks,
215
+ changes: diffBlocks(before.doc, current.state.doc),
216
+ meta
217
+ };
218
+ emit("transaction", lastResult);
219
+ emit("update:modelValue", doc);
220
+ emit("change", doc);
221
+ }
222
+ let selection = {
223
+ block: null,
224
+ blocks: []
225
+ };
226
+ const warn = (message) => {
227
+ if (process.env.NODE_ENV !== "production") console.warn(`[@dou-ui/editor] ${message}`);
228
+ };
229
+ const lacksId = (blocks) => blocks.some((block) => !block.id || lacksId(block.children ?? []));
230
+ let cursorKnown = false;
231
+ function onUpdate(current) {
232
+ state.value = current.state;
233
+ if (!cursorKnown) {
234
+ if (!focused.value) return;
235
+ cursorKnown = true;
236
+ }
237
+ const next = selectionOf(current.state);
238
+ if (sameSelection(next, selection)) return;
239
+ selection = next;
240
+ emit("update:selection", next);
241
+ }
242
+ const openLinks = new Plugin({ props: { handleDOMEvents: { click(clicked, event) {
243
+ const link = event.target.closest("a.dou-editor__link");
244
+ if (!link?.href || !(event.metaKey || event.ctrlKey || !clicked.editable)) return false;
245
+ event.preventDefault();
246
+ const $pos = clicked.state.doc.resolve(clicked.posAtDOM(link, 0));
247
+ let block = "";
248
+ for (let depth = $pos.depth; depth > 0; depth--) if ($pos.node(depth).type.name === "block") {
249
+ block = $pos.node(depth).attrs.id;
250
+ break;
251
+ }
252
+ const opening = {
253
+ link: link.getAttribute("href") ?? link.href,
254
+ block,
255
+ defaultPrevented: false,
256
+ preventDefault() {
257
+ this.defaultPrevented = true;
258
+ }
259
+ };
260
+ emit("linkOpen", opening);
261
+ if (!opening.defaultPrevented) window.open(link.href, "_blank", "noopener,noreferrer");
262
+ return true;
263
+ } } } });
264
+ onMounted(() => {
265
+ const instance = createEditorView({
266
+ element: mount.value,
267
+ kit,
268
+ nodeViews: componentViews,
269
+ blocks: kit.externalDocument ? [] : readBlocks(props.modelValue),
270
+ editable: editable.value,
271
+ placeholder: {
272
+ text: () => props.placeholder ?? messages.value.placeholder,
273
+ heading: () => messages.value.headingPlaceholder,
274
+ empty: () => props.placeholder ?? messages.value.emptyPlaceholder
275
+ },
276
+ plugins: [
277
+ ...props.plugins ?? [],
278
+ slashPlugin({
279
+ onChange: (value) => slash.value = value,
280
+ onKey: (event) => slashMenu.value?.onKey(event) ?? false
281
+ }),
282
+ keymap({
283
+ "Mod-k": () => bubble.value?.editLink() ?? false,
284
+ "Mod-Alt-m": () => comments.start(),
285
+ Escape: () => {
286
+ if (!comments.pending.value && !comments.active.value) return false;
287
+ comments.close();
288
+ return true;
289
+ }
290
+ }),
291
+ commentPlugin,
292
+ comparePlugin({
293
+ before: () => compareBlocks.value,
294
+ label: () => messages.value.removedBlock
295
+ }),
296
+ openLinks,
297
+ searchPlugin({ skip: searchSkip })
298
+ ],
299
+ keymaps: [searchKeys],
300
+ history: props.history,
301
+ undo: props.undo,
302
+ redo: props.redo,
303
+ attributes: () => {
304
+ const attrs = {};
305
+ if (props.ariaLabel) attrs["aria-label"] = props.ariaLabel;
306
+ if (!editable.value) attrs["aria-readonly"] = "true";
307
+ return attrs;
308
+ },
309
+ onChange,
310
+ onUpdate
311
+ });
312
+ view.value = instance;
313
+ state.value = instance.state;
314
+ watch(() => config.value.defaults.DouCodeBlock?.highlight ?? null, (highlight) => setFallbackHighlighter(instance, highlight), { immediate: true });
315
+ instance.dom.addEventListener("focus", onFocus);
316
+ instance.dom.addEventListener("blur", onBlur);
317
+ if (props.autofocus) instance.focus();
318
+ const given = kit.externalDocument ? void 0 : readBlocks(props.modelValue);
319
+ if (given && lacksId(given)) {
320
+ const doc = {
321
+ version: 1,
322
+ blocks: getBlocks(instance)
323
+ };
324
+ emitted = doc;
325
+ emit("update:modelValue", doc);
326
+ }
327
+ });
328
+ function onFocus(event) {
329
+ focused.value = true;
330
+ if (!cursorKnown && view.value) {
331
+ cursorKnown = true;
332
+ const next = selectionOf(view.value.state);
333
+ if (!sameSelection(next, selection)) {
334
+ selection = next;
335
+ emit("update:selection", next);
336
+ }
337
+ }
338
+ emit("focus", event);
339
+ }
340
+ function onBlur(event) {
341
+ focused.value = false;
342
+ emit("blur", event);
343
+ }
344
+ onBeforeUnmount(() => {
345
+ view.value?.destroy();
346
+ view.value = null;
347
+ });
348
+ watch(() => props.modelValue, (value) => {
349
+ const current = view.value;
350
+ if (!current || value === void 0 || kit.externalDocument || toRaw(value) === emitted) return;
351
+ replaceBlocks(current, readBlocks(value) ?? []);
352
+ });
353
+ watch(editable, (value) => view.value && setEditable(view.value, value));
354
+ watch(compareBlocks, () => view.value?.dispatch(view.value.state.tr.setMeta(compareKey, true)));
355
+ /** The change last scrolled to, by its place among them. */
356
+ let changeIndex = -1;
357
+ watch(() => props.compare, () => changeIndex = -1);
358
+ function goToChange(step) {
359
+ const dom = view.value?.dom;
360
+ if (!dom || !props.compare) return false;
361
+ const marks = [...dom.querySelectorAll(".dou-editor__diff-added, .dou-editor__diff-changed, .dou-editor__diff-removed-block, .dou-editor__diff-added-text, .dou-editor__diff-removed")].filter((el, index, list) => {
362
+ const block = el.closest("[data-block-id]");
363
+ const previous = list[index - 1];
364
+ return !previous || previous.closest("[data-block-id]") !== block || !block;
365
+ });
366
+ const next = changeIndex + step;
367
+ const target = marks[next];
368
+ if (!target) return false;
369
+ changeIndex = next;
370
+ target.scrollIntoView({ block: "center" });
371
+ const m = messages.value;
372
+ announce(`${target.matches(".dou-editor__diff-added") ? m.changeAdded : target.matches(".dou-editor__diff-removed-block") ? m.changeRemoved : m.changeChanged} ${changeText(target)}`);
373
+ return true;
374
+ }
375
+ /** The text of a change: what was removed, or its block as it is now. */
376
+ function changeText(target) {
377
+ if (target.matches(".dou-editor__diff-removed-block")) return target.textContent ?? "";
378
+ const block = (target.closest("[data-block-id]") ?? target).cloneNode(true);
379
+ for (const el of block.querySelectorAll("[data-diff=\"removed\"]")) el.remove();
380
+ return block.textContent ?? "";
381
+ }
382
+ /** What the live region reads out: a version restored, the change gone to. */
383
+ const spoken = ref("");
384
+ function announce(text) {
385
+ spoken.value = "";
386
+ nextTick(() => spoken.value = text);
387
+ }
388
+ function restore(doc) {
389
+ if (!view.value || !restoreBlocks(view.value, readBlocks(doc) ?? [])) return false;
390
+ announce(messages.value.restored);
391
+ return true;
392
+ }
393
+ watch(() => props.selection, (value) => {
394
+ const current = view.value;
395
+ if (!current || !value || sameSelection(value, selection)) return;
396
+ const known = cursorKnown;
397
+ cursorKnown = true;
398
+ let applied = false;
399
+ if (value.blocks.length > 1) {
400
+ applied = selectBlocks(value.blocks[0], value.blocks.at(-1))(current.state, current.dispatch);
401
+ if (!applied) warn("`selection.blocks` must be sibling blocks that exist in the document");
402
+ } else {
403
+ const id = value.block ?? value.blocks[0];
404
+ const transaction = new EditorTransaction(current.state);
405
+ if (id && transaction.focusBlock(id)) {
406
+ current.dispatch(transaction.tr);
407
+ applied = true;
408
+ } else if (!id) warn("a selection without blocks cannot be set; the cursor stays where it is");
409
+ }
410
+ if (applied) return;
411
+ cursorKnown = known;
412
+ emit("update:selection", {
413
+ ...selection,
414
+ blocks: [...selection.blocks]
415
+ });
416
+ });
417
+ function transact(fn, meta) {
418
+ const current = view.value;
419
+ if (!current || props.compare) return null;
420
+ const transaction = new EditorTransaction(current.state, meta, cursorKnown);
421
+ fn(transaction);
422
+ lastResult = null;
423
+ if (transaction.focused) cursorKnown = true;
424
+ applyEditorTransaction(current, transaction);
425
+ if (transaction.focused) current.focus();
426
+ const result = lastResult;
427
+ lastResult = null;
428
+ return result;
429
+ }
430
+ const history = (action, dispatch) => {
431
+ const current = view.value;
432
+ if (!current || props.compare) return false;
433
+ const command = historyCommands(current.state)[action];
434
+ return dispatch ? runCommand(current, command) : command(current.state);
435
+ };
436
+ __expose({
437
+ get view() {
438
+ return view.value;
439
+ },
440
+ focus: () => view.value?.focus(),
441
+ blur: () => (view.value?.dom)?.blur(),
442
+ getBlocks: () => view.value ? getBlocks(view.value) : [],
443
+ setBlocks: (blocks) => view.value && replaceBlocks(view.value, blocks),
444
+ getHTML: () => view.value ? writeHTML(getBlocks(view.value), kit) : "",
445
+ setHTML: (html) => view.value && replaceBlocks(view.value, parseHTML(html, kit)),
446
+ run: (command) => view.value ? runCommand(view.value, command) : false,
447
+ openSearch: (query) => openSearch(query?.replace !== void 0, query),
448
+ closeSearch,
449
+ transact,
450
+ getBlock: (id) => view.value ? new EditorTransaction(view.value.state).getBlock(id) : null,
451
+ insertBlocks: (blocks, placement) => {
452
+ let ids = [];
453
+ transact((tr) => ids = tr.insertBlocks(blocks, placement));
454
+ return ids;
455
+ },
456
+ updateBlock: (id, patch) => {
457
+ let ok = false;
458
+ transact((tr) => ok = tr.updateBlock(id, patch));
459
+ return ok;
460
+ },
461
+ removeBlocks: (ids) => {
462
+ let ok = false;
463
+ transact((tr) => ok = tr.removeBlocks(ids));
464
+ return ok;
465
+ },
466
+ moveBlocks: (ids, placement) => {
467
+ let ok = false;
468
+ transact((tr) => ok = tr.moveBlocks(ids, placement));
469
+ return ok;
470
+ },
471
+ focusBlock: (id, edge) => {
472
+ let ok = false;
473
+ transact((tr) => ok = tr.focusBlock(id, edge));
474
+ return ok;
475
+ },
476
+ getSelection: () => ({
477
+ ...selection,
478
+ blocks: [...selection.blocks]
479
+ }),
480
+ undo: () => history("undo", true),
481
+ redo: () => history("redo", true),
482
+ get canUndo() {
483
+ return !!state.value && history("undo", false);
484
+ },
485
+ get canRedo() {
486
+ return !!state.value && history("redo", false);
487
+ },
488
+ comment: () => comments.start(),
489
+ getCommentAnchors: anchors,
490
+ restore,
491
+ nextChange: () => goToChange(1),
492
+ previousChange: () => goToChange(-1)
493
+ });
494
+ const scope = useId();
495
+ /** An id as a CSS identifier: no quotes or `<`, which server rendering would escape. */
496
+ const ident = (id) => id.replace(/[^a-zA-Z0-9_]|^[\d-]/gu, (char) => `\\${char.codePointAt(0).toString(16)} `);
497
+ const highlighted = (id) => `[data-dou-editor=${ident(scope)}] [data-comment=${ident(id)}]`;
498
+ const highlightCSS = computed(() => {
499
+ if (!comments.enabled.value) return "";
500
+ const open = comments.threads.value.filter((thread) => !thread.resolved);
501
+ if (!open.length) return "";
502
+ let css = `${open.map((thread) => highlighted(thread.id)).join(",")}{background-color:var(--dou-editor-comment-bg);border-bottom-color:var(--dou-editor-comment-line)}`;
503
+ const active = comments.active.value;
504
+ if (active && open.some((thread) => thread.id === active)) css += `${highlighted(active)}{background-color:var(--dou-editor-comment-bg-active)}`;
505
+ return css;
506
+ });
507
+ const HighlightStyle = () => highlightCSS.value ? h("style", highlightCSS.value) : null;
508
+ return (_ctx, _cache) => {
509
+ return openBlock(), createElementBlock("div", {
510
+ ref_key: "root",
511
+ ref: root,
512
+ class: normalizeClass([unref(ns).b(), {
513
+ "is-readonly": __props.readonly,
514
+ "is-comparing": comparing.value,
515
+ "is-focused": focused.value,
516
+ "is-dragging": dragging.value
517
+ }]),
518
+ "data-dou-editor": unref(scope)
519
+ }, [
520
+ searchOpen.value && view.value ? (openBlock(), createElementBlock("div", {
521
+ key: 0,
522
+ class: normalizeClass(unref(ns).e("search"))
523
+ }, [createVNode(search_bar_default, {
524
+ ref_key: "searchBar",
525
+ ref: searchBar,
526
+ replacing: searchReplacing.value,
527
+ "onUpdate:replacing": _cache[0] || (_cache[0] = ($event) => searchReplacing.value = $event),
528
+ readonly: !editable.value,
529
+ skip: searchSkip,
530
+ onClose: closeSearch
531
+ }, null, 8, ["replacing", "readonly"])], 2)) : createCommentVNode("", true),
532
+ createVNode(HighlightStyle),
533
+ createElementVNode("div", {
534
+ ref_key: "mount",
535
+ ref: mount,
536
+ class: normalizeClass(unref(ns).e("mount"))
537
+ }, null, 2),
538
+ editable.value && view.value ? (openBlock(), createElementBlock(Fragment, { key: 1 }, [
539
+ createVNode(block_handle_default),
540
+ createVNode(slash_menu_default, {
541
+ ref_key: "slashMenu",
542
+ ref: slashMenu,
543
+ slash: slash.value
544
+ }, null, 8, ["slash"]),
545
+ createVNode(bubble_toolbar_default, {
546
+ ref_key: "bubble",
547
+ ref: bubble
548
+ }, null, 512),
549
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(kit).overlays, (overlay, index) => {
550
+ return openBlock(), createBlock(resolveDynamicComponent(overlay), { key: index });
551
+ }), 128))
552
+ ], 64)) : createCommentVNode("", true),
553
+ createElementVNode("div", {
554
+ class: normalizeClass(unref(ns).e("live")),
555
+ "aria-live": "polite"
556
+ }, toDisplayString(spoken.value), 3),
557
+ view.value && unref(comments).enabled.value && !comparing.value ? (openBlock(), createElementBlock(Fragment, { key: 2 }, [__props.readonly ? (openBlock(), createBlock(comment_button_default, { key: 0 })) : createCommentVNode("", true), createVNode(comment_card_default)], 64)) : createCommentVNode("", true)
558
+ ], 10, _hoisted_1);
559
+ };
560
+ }
561
+ });
562
+ export { editor_vue_vue_type_script_setup_true_lang_default as default };
563
+
564
+ //# sourceMappingURL=editor.vue_vue_type_script_setup_true_lang.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_normalizeClass","_unref","_createVNode","SearchBar","_createCommentVNode","_createElementVNode","_Fragment","BlockHandle","SlashMenu","BubbleToolbar","_renderList","_createBlock","_resolveDynamicComponent","_toDisplayString","CommentButton","CommentCard"],"sources":["../src/editor.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { isApplePlatform, useGlobalConfig, useNamespace } from 'dou-ui'\nimport { keymap } from 'prosemirror-keymap'\nimport { Plugin, type EditorState, type Transaction } from 'prosemirror-state'\nimport type { EditorView } from 'prosemirror-view'\nimport {\n computed,\n getCurrentInstance,\n nextTick,\n onBeforeUnmount,\n onMounted,\n provide,\n ref,\n shallowRef,\n toRaw,\n useTemplateRef,\n watch,\n h,\n useId,\n type Component,\n} from 'vue'\nimport BlockHandle from './components/block-handle.vue'\nimport BubbleToolbar from './components/bubble-toolbar.vue'\nimport SearchBar from './components/search-bar.vue'\nimport CommentButton from './components/comment-button.vue'\nimport CommentCard from './components/comment-card.vue'\nimport SlashMenu from './components/slash-menu.vue'\nimport { setFallbackHighlighter, type CodeHighlighter } from './core/highlight'\nimport { comparePlugin, compareKey } from './core/compare'\nimport {\n createEditorView,\n getBlocks,\n historyCommands,\n originKey,\n replaceBlocks,\n restoreBlocks,\n runCommand,\n setEditable,\n} from './core/editor'\nimport { diffBlocks } from './core/changes'\nimport { isRemote } from './core/plugins'\nimport { selectionOf, sameSelection } from './core/selection'\nimport { selectBlocks } from './core/block-selection'\nimport { applyEditorTransaction, EditorTransaction } from './core/transaction'\nimport {\n blocksToDoc,\n docToBlocks,\n type Block,\n type EditorDocument,\n type PartialBlock,\n} from './core/model'\nimport { resolveEditorExtensions } from './core/extension'\nimport {\n previewMatch,\n searchKey,\n searchPlugin,\n setSearch,\n type EditorSearchQuery,\n} from './core/search'\nimport { slashPlugin, type SlashState } from './core/slash'\nimport { writeHTML } from './core/output'\nimport { parseHTML } from './core/prepare'\nimport { componentMounter, vueNodeView } from './define-block'\nimport { editorKit } from './extensions/editor-kit'\nimport { readBlocks } from './document'\nimport {\n editorKey,\n type EditorEmits,\n type EditorExpose,\n type EditorProps,\n type EditorOrigin,\n type EditorLinkOpenEvent,\n type EditorSelection,\n type EditorTransactionResult,\n} from './editor'\nimport { useEditorMessages } from './locale'\nimport { useEditorComments } from './use-comments'\n\ndefineOptions({ name: 'DouEditor' })\n\nconst props = withDefaults(defineProps<EditorProps>(), {\n modelValue: undefined,\n extensions: undefined,\n readonly: false,\n searchable: true,\n placeholder: undefined,\n messages: undefined,\n ariaLabel: undefined,\n autofocus: false,\n plugins: undefined,\n history: true,\n undo: undefined,\n redo: undefined,\n selection: undefined,\n comments: undefined,\n author: undefined,\n activeComment: undefined,\n commentable: true,\n compare: undefined,\n})\nconst emit = defineEmits<EditorEmits>()\n\n// read once: changing the schema of a live editor would invalidate its document\nconst kit = resolveEditorExtensions(props.extensions ?? [editorKit()])\n// say so once, instead of silently keeping the old extensions\nconst stopWatchingExtensions = watch(\n () => props.extensions,\n () => {\n console.warn(\n '[@dou-ui/editor] `extensions` changed after mount and is ignored: it is read once. Create the list once outside the template, or give the editor a new `key` to rebuild it.',\n )\n stopWatchingExtensions()\n },\n)\n\nconst ns = useNamespace('editor')\nconst messages = useEditorMessages(() => props.messages)\nconst config = useGlobalConfig()\nconst root = useTemplateRef<HTMLElement>('root')\nconst mount = useTemplateRef<HTMLElement>('mount')\nconst view = shallowRef<EditorView | null>(null)\nconst state = shallowRef<EditorState | null>(null)\nconst focused = shallowRef(false)\nconst dragging = shallowRef(false)\n/** Showing what changed since an older version: read-only, without comments. */\nconst comparing = computed(() => !!props.compare)\n/**\n * The older version as whole blocks, matched to the current ones by id. A\n * block saved without an id gets a new one, so it shows as removed.\n */\nconst compareBlocks = computed(() => {\n const blocks = props.compare?.blocks\n return Array.isArray(blocks) ? docToBlocks(blocksToDoc(kit.schema, blocks)) : null\n})\nconst editable = computed(() => !props.readonly && !comparing.value)\n\nconst {\n comments,\n plugin: commentPlugin,\n anchors,\n} = useEditorComments({\n props,\n emit,\n view,\n provider: kit.comments,\n})\n\nconst context = { view, state, focused, dragging, editable, messages, root, kit, comments }\nprovide(editorKey, context)\n\n// block components render outside this component's tree: hand them the context\nconst appContext = getCurrentInstance()?.appContext ?? null\nconst mountComponent = componentMounter(appContext, [[editorKey, context]])\nconst componentViews = {\n ...Object.fromEntries(\n Object.entries(kit.schema.nodes)\n .filter(([, type]) => type.spec.component)\n .map(([name, type]) => [\n name,\n vueNodeView(type.spec.component as Component, appContext, [[editorKey, context]]),\n ]),\n ),\n ...Object.fromEntries(\n Object.entries(kit.componentViews).map(([name, create]) => [name, create(mountComponent)]),\n ),\n}\n\n// find and replace: the panel over the text, the matches marked in it\nconst searchOpen = ref(false)\nconst searchReplacing = ref(false)\nconst searchBar = useTemplateRef<InstanceType<typeof SearchBar>>('searchBar')\n/** Blocks that draw their own text, such as a code block in the code editor, are not searched. */\nconst searchSkip = (node: { type: { name: string } }) => node.type.name in kit.componentViews\n\n/** Opens the panel, with the replace box for `replace`. A selection on one line becomes the search. */\nfunction openSearch(replace = false, given?: Partial<EditorSearchQuery>) {\n const v = view.value\n if (!v || !props.searchable) return false\n const old = searchKey.getState(v.state)?.query ?? { search: '' }\n const query = { ...old, ...given }\n const { from, to, empty } = v.state.selection\n if (given?.search === undefined && !empty) {\n const text = v.state.doc.textBetween(from, to, '\\n')\n if (text && !text.includes('\\n')) query.search = text\n }\n if ((replace || given?.replace !== undefined) && editable.value) searchReplacing.value = true\n searchOpen.value = true\n v.dispatch(setSearch(v.state.tr, { query, active: true }))\n const preview = previewMatch(v.state)\n if (preview) v.dispatch(preview)\n void nextTick(() => searchBar.value?.focus(replace && editable.value ? 'replace' : 'find'))\n return true\n}\n\nfunction closeSearch() {\n const v = view.value\n if (!searchOpen.value || !v) return false\n searchOpen.value = false\n v.dispatch(setSearch(v.state.tr, { active: false }))\n v.focus()\n return true\n}\n\n/** Goes to the next (or previous) match; with the panel shut, opens it on the last search. */\nfunction findAgain(step: 1 | -1) {\n if (!searchOpen.value) {\n const v = view.value\n if (!v || !searchKey.getState(v.state)?.query.search || !openSearch()) return false\n }\n void nextTick(() => (step > 0 ? searchBar.value?.next() : searchBar.value?.previous()))\n return true\n}\n\nconst replaceKey = isApplePlatform() ? 'Mod-Alt-f' : 'Mod-h'\nconst searchKeys = keymap({\n 'Mod-f': () => openSearch(),\n [replaceKey]: () => openSearch(true),\n F3: () => findAgain(1),\n 'Mod-g': () => findAgain(1),\n 'Shift-F3': () => findAgain(-1),\n 'Mod-Shift-g': () => findAgain(-1),\n Escape: () => closeSearch(),\n})\n\nconst slash = shallowRef<SlashState | null>(null)\nconst slashMenu = useTemplateRef<InstanceType<typeof SlashMenu>>('slashMenu')\nconst bubble = useTemplateRef<InstanceType<typeof BubbleToolbar>>('bubble')\n\n// The document last sent through `v-model`: when the same object comes back,\n// it is not loaded again (that would move the cursor).\nlet emitted: EditorDocument | undefined\n\n// the result of the last change, for `transact` to hand back\nlet lastResult: EditorTransactionResult | null = null\n\nfunction onChange(current: EditorView, tr: Transaction, before: EditorState) {\n const blocks = getBlocks(current)\n const doc: EditorDocument = { version: 1, blocks }\n emitted = doc\n const history = tr.getMeta('history$') as { redo: boolean } | undefined\n const origin =\n (tr.getMeta(originKey) as EditorOrigin | undefined) ??\n (history ? (history.redo ? 'redo' : 'undo') : isRemote(tr) ? 'remote' : undefined)\n const meta: EditorTransactionResult['meta'] = {\n history:\n tr.getMeta('addToHistory') !== false &&\n origin !== 'remote' &&\n origin !== 'undo' &&\n origin !== 'redo',\n }\n if (origin !== undefined) meta.origin = origin\n lastResult = { blocks, changes: diffBlocks(before.doc, current.state.doc), meta }\n emit('transaction', lastResult)\n emit('update:modelValue', doc)\n emit('change', doc)\n}\n\nlet selection: EditorSelection = { block: null, blocks: [] }\n\nconst warn = (message: string) => {\n if (process.env.NODE_ENV !== 'production') console.warn(`[@dou-ui/editor] ${message}`)\n}\n\nconst lacksId = (blocks: PartialBlock[]): boolean =>\n blocks.some((block) => !block.id || lacksId(block.children ?? []))\n// until the editor is focused (or a block is, by the program) its selection is no cursor\nlet cursorKnown = false\n\nfunction onUpdate(current: EditorView) {\n state.value = current.state\n if (!cursorKnown) {\n if (!focused.value) return\n cursorKnown = true\n }\n const next = selectionOf(current.state)\n if (sameSelection(next, selection)) return\n selection = next\n emit('update:selection', next)\n}\n\n// a click on a link places the cursor; with Ctrl or ⌘ held, or while read-only, it opens the link\nconst openLinks = new Plugin({\n props: {\n handleDOMEvents: {\n click(clicked, event) {\n const link = (event.target as HTMLElement).closest<HTMLAnchorElement>('a.dou-editor__link')\n if (!link?.href || !(event.metaKey || event.ctrlKey || !clicked.editable)) return false\n event.preventDefault()\n const $pos = clicked.state.doc.resolve(clicked.posAtDOM(link, 0))\n let block = ''\n for (let depth = $pos.depth; depth > 0; depth--)\n if ($pos.node(depth).type.name === 'block') {\n block = $pos.node(depth).attrs.id as string\n break\n }\n const opening: EditorLinkOpenEvent = {\n link: link.getAttribute('href') ?? link.href,\n block,\n defaultPrevented: false,\n preventDefault() {\n this.defaultPrevented = true\n },\n }\n emit('linkOpen', opening)\n if (!opening.defaultPrevented) window.open(link.href, '_blank', 'noopener,noreferrer')\n return true\n },\n },\n },\n})\n\nonMounted(() => {\n const instance = createEditorView({\n element: mount.value!,\n kit,\n nodeViews: componentViews,\n // with collaboration the document comes from the shared document\n blocks: kit.externalDocument ? [] : readBlocks(props.modelValue),\n editable: editable.value,\n placeholder: {\n text: () => props.placeholder ?? messages.value.placeholder,\n heading: () => messages.value.headingPlaceholder,\n empty: () => props.placeholder ?? messages.value.emptyPlaceholder,\n },\n plugins: [\n ...(props.plugins ?? []),\n slashPlugin({\n onChange: (value) => (slash.value = value),\n onKey: (event) => slashMenu.value?.onKey(event) ?? false,\n }),\n keymap({\n 'Mod-k': () => bubble.value?.editLink() ?? false,\n 'Mod-Alt-m': () => comments.start(),\n // with the thread card open, Escape in the text closes it, and only that\n Escape: () => {\n if (!comments.pending.value && !comments.active.value) return false\n comments.close()\n return true\n },\n }),\n commentPlugin,\n comparePlugin({\n before: () => compareBlocks.value,\n label: () => messages.value.removedBlock,\n }),\n openLinks,\n searchPlugin({ skip: searchSkip }),\n ],\n keymaps: [searchKeys],\n history: props.history,\n undo: props.undo,\n redo: props.redo,\n attributes: () => {\n const attrs: Record<string, string> = {}\n if (props.ariaLabel) attrs['aria-label'] = props.ariaLabel\n if (!editable.value) attrs['aria-readonly'] = 'true'\n return attrs\n },\n onChange,\n onUpdate,\n })\n view.value = instance\n state.value = instance.state\n // code blocks without their own highlighter use the one DouCodeBlock uses\n watch(\n () =>\n (config.value.defaults as { DouCodeBlock?: { highlight?: CodeHighlighter } }).DouCodeBlock\n ?.highlight ?? null,\n (highlight) => setFallbackHighlighter(instance, highlight),\n { immediate: true },\n )\n instance.dom.addEventListener('focus', onFocus)\n instance.dom.addEventListener('blur', onBlur)\n if (props.autofocus) instance.focus()\n // blocks given without ids got them now: hand those back, so events' ids can be looked up\n const given = kit.externalDocument ? undefined : readBlocks(props.modelValue)\n if (given && lacksId(given)) {\n const doc: EditorDocument = { version: 1, blocks: getBlocks(instance) }\n emitted = doc\n emit('update:modelValue', doc)\n }\n})\n\nfunction onFocus(event: FocusEvent) {\n focused.value = true\n if (!cursorKnown && view.value) {\n cursorKnown = true\n const next = selectionOf(view.value.state)\n if (!sameSelection(next, selection)) {\n selection = next\n emit('update:selection', next)\n }\n }\n emit('focus', event)\n}\n\nfunction onBlur(event: FocusEvent) {\n focused.value = false\n emit('blur', event)\n}\n\nonBeforeUnmount(() => {\n view.value?.destroy()\n view.value = null\n})\n\nwatch(\n () => props.modelValue,\n (value) => {\n const current = view.value\n if (!current || value === undefined || kit.externalDocument || toRaw(value) === emitted) return\n replaceBlocks(current, readBlocks(value) ?? [])\n },\n)\n\nwatch(editable, (value) => view.value && setEditable(view.value, value))\nwatch(compareBlocks, () => view.value?.dispatch(view.value.state.tr.setMeta(compareKey, true)))\n\n/** The change last scrolled to, by its place among them. */\nlet changeIndex = -1\nwatch(\n () => props.compare,\n () => (changeIndex = -1),\n)\nfunction goToChange(step: 1 | -1) {\n const dom = view.value?.dom\n if (!dom || !props.compare) return false\n // a block's own mark, or the first piece of text changed in it\n const marks = [\n ...dom.querySelectorAll<HTMLElement>(\n '.dou-editor__diff-added, .dou-editor__diff-changed, .dou-editor__diff-removed-block, .dou-editor__diff-added-text, .dou-editor__diff-removed',\n ),\n ].filter((el, index, list) => {\n const block = el.closest('[data-block-id]')\n const previous = list[index - 1]\n return !previous || previous.closest('[data-block-id]') !== block || !block\n })\n const next = changeIndex + step\n const target = marks[next]\n if (!target) return false\n changeIndex = next\n target.scrollIntoView({ block: 'center' })\n const m = messages.value\n // a block added or removed, or one whose text or kind changed\n const kind = target.matches('.dou-editor__diff-added')\n ? m.changeAdded\n : target.matches('.dou-editor__diff-removed-block')\n ? m.changeRemoved\n : m.changeChanged\n announce(`${kind} ${changeText(target)}`)\n return true\n}\n\n/** The text of a change: what was removed, or its block as it is now. */\nfunction changeText(target: HTMLElement) {\n if (target.matches('.dou-editor__diff-removed-block')) return target.textContent ?? ''\n const block = (target.closest('[data-block-id]') ?? target).cloneNode(true) as HTMLElement\n for (const el of block.querySelectorAll('[data-diff=\"removed\"]')) el.remove()\n return block.textContent ?? ''\n}\n\n/** What the live region reads out: a version restored, the change gone to. */\nconst spoken = ref('')\nfunction announce(text: string) {\n // the same words twice still get read\n spoken.value = ''\n void nextTick(() => (spoken.value = text))\n}\n\nfunction restore(doc: EditorDocument<PartialBlock>) {\n // like the other methods it works while `readonly`, and it is the change comparing allows\n if (!view.value || !restoreBlocks(view.value, readBlocks(doc) ?? [])) return false\n announce(messages.value.restored)\n return true\n}\n\n// a selection from outside: the cursor goes to the block, or the blocks are selected\nwatch(\n () => props.selection,\n (value) => {\n const current = view.value\n if (!current || !value || sameSelection(value, selection)) return\n const known = cursorKnown\n cursorKnown = true\n let applied = false\n if (value.blocks.length > 1) {\n applied = selectBlocks(value.blocks[0]!, value.blocks.at(-1)!)(\n current.state,\n current.dispatch,\n )\n if (!applied) warn('`selection.blocks` must be sibling blocks that exist in the document')\n } else {\n const id = value.block ?? value.blocks[0]\n const transaction = new EditorTransaction(current.state)\n if (id && transaction.focusBlock(id)) {\n current.dispatch(transaction.tr)\n applied = true\n } else if (!id) warn('a selection without blocks cannot be set; the cursor stays where it is')\n }\n if (applied) return\n cursorKnown = known\n // hand back where the selection really is, so the binding doesn't keep a value that never applied\n emit('update:selection', { ...selection, blocks: [...selection.blocks] })\n },\n)\n\nfunction transact(\n fn: (tr: EditorTransaction) => void,\n meta?: EditorTransaction['meta'],\n): EditorTransactionResult | null {\n const current = view.value\n // comparing shows a version: nothing changes it but `restore`\n if (!current || props.compare) return null\n const transaction = new EditorTransaction(current.state, meta, cursorKnown)\n fn(transaction)\n lastResult = null\n // `focusBlock` places the cursor\n if (transaction.focused) cursorKnown = true\n applyEditorTransaction(current, transaction)\n if (transaction.focused) current.focus()\n const result = lastResult\n lastResult = null\n return result\n}\n\nconst history = (action: 'undo' | 'redo', dispatch: boolean) => {\n const current = view.value\n if (!current || props.compare) return false\n const command = historyCommands(current.state)[action]\n return dispatch ? runCommand(current, command) : command(current.state)\n}\n\ndefineExpose<EditorExpose>({\n get view() {\n return view.value\n },\n focus: () => view.value?.focus(),\n blur: () => (view.value?.dom as HTMLElement | undefined)?.blur(),\n getBlocks: () => (view.value ? getBlocks(view.value) : []),\n setBlocks: (blocks: PartialBlock[]) => view.value && replaceBlocks(view.value, blocks),\n getHTML: () => (view.value ? writeHTML(getBlocks(view.value), kit) : ''),\n setHTML: (html: string) => view.value && replaceBlocks(view.value, parseHTML(html, kit)),\n run: (command) => (view.value ? runCommand(view.value, command) : false),\n openSearch: (query) => openSearch(query?.replace !== undefined, query),\n closeSearch,\n transact,\n getBlock: (id) => (view.value ? new EditorTransaction(view.value.state).getBlock(id) : null),\n insertBlocks: (blocks, placement) => {\n let ids: string[] = []\n transact((tr) => (ids = tr.insertBlocks(blocks, placement)))\n return ids\n },\n updateBlock: (id, patch) => {\n let ok = false\n transact((tr) => (ok = tr.updateBlock(id, patch)))\n return ok\n },\n removeBlocks: (ids) => {\n let ok = false\n transact((tr) => (ok = tr.removeBlocks(ids)))\n return ok\n },\n moveBlocks: (ids, placement) => {\n let ok = false\n transact((tr) => (ok = tr.moveBlocks(ids, placement)))\n return ok\n },\n focusBlock: (id, edge) => {\n let ok = false\n transact((tr) => (ok = tr.focusBlock(id, edge)))\n return ok\n },\n getSelection: () => ({ ...selection, blocks: [...selection.blocks] }),\n undo: () => history('undo', true),\n redo: () => history('redo', true),\n get canUndo() {\n return !!state.value && history('undo', false)\n },\n get canRedo() {\n return !!state.value && history('redo', false)\n },\n comment: () => comments.start(),\n getCommentAnchors: anchors,\n restore,\n nextChange: () => goToChange(1),\n previousChange: () => goToChange(-1),\n})\n\n/*\n * Highlights for the threads that are open: by thread id, in one rule,\n * so a thread resolved or opened restyles its text without redrawing it.\n */\nconst scope = useId()\n/** An id as a CSS identifier: no quotes or `<`, which server rendering would escape. */\nconst ident = (id: string) =>\n id.replace(/[^a-zA-Z0-9_]|^[\\d-]/gu, (char) => `\\\\${char.codePointAt(0)!.toString(16)} `)\nconst highlighted = (id: string) => `[data-dou-editor=${ident(scope)}] [data-comment=${ident(id)}]`\nconst highlightCSS = computed(() => {\n if (!comments.enabled.value) return ''\n const open = comments.threads.value.filter((thread) => !thread.resolved)\n if (!open.length) return ''\n let css = `${open.map((thread) => highlighted(thread.id)).join(',')}{background-color:var(--dou-editor-comment-bg);border-bottom-color:var(--dou-editor-comment-line)}`\n const active = comments.active.value\n if (active && open.some((thread) => thread.id === active))\n css += `${highlighted(active)}{background-color:var(--dou-editor-comment-bg-active)}`\n return css\n})\nconst HighlightStyle = () => (highlightCSS.value ? h('style', highlightCSS.value) : null)\n</script>\n\n<template>\n <div\n ref=\"root\"\n :class=\"[\n ns.b(),\n {\n // comparing keeps the editor's own gutter, so the text doesn't move\n 'is-readonly': readonly,\n 'is-comparing': comparing,\n 'is-focused': focused,\n 'is-dragging': dragging,\n },\n ]\"\n :data-dou-editor=\"scope\"\n >\n <div v-if=\"searchOpen && view\" :class=\"ns.e('search')\">\n <SearchBar\n ref=\"searchBar\"\n v-model:replacing=\"searchReplacing\"\n :readonly=\"!editable\"\n :skip=\"searchSkip\"\n @close=\"closeSearch\"\n />\n </div>\n <HighlightStyle />\n <div ref=\"mount\" :class=\"ns.e('mount')\" />\n <template v-if=\"editable && view\">\n <BlockHandle />\n <SlashMenu ref=\"slashMenu\" :slash=\"slash\" />\n <BubbleToolbar ref=\"bubble\" />\n <component :is=\"overlay\" v-for=\"(overlay, index) in kit.overlays\" :key=\"index\" />\n </template>\n <div :class=\"ns.e('live')\" aria-live=\"polite\">{{ spoken }}</div>\n <template v-if=\"view && comments.enabled.value && !comparing\">\n <CommentButton v-if=\"readonly\" />\n <CommentCard />\n </template>\n </div>\n</template>\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import editor_vue_vue_type_script_setup_true_lang_default from "./editor.vue_vue_type_script_setup_true_lang.js";
2
+ // src/editor.vue
3
+ var editor_default = editor_vue_vue_type_script_setup_true_lang_default;
4
+ export { editor_default as default };
5
+
6
+ //# sourceMappingURL=editor2.js.map