adtec-core-package 3.0.0 → 3.0.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 (507) hide show
  1. package/auto-imports.d.ts +299 -0
  2. package/package.json +94 -49
  3. package/prebuilt/umo-editor/favicon.ico +0 -0
  4. package/prebuilt/umo-editor/umo-editor.css +1 -0
  5. package/prebuilt/umo-editor/umo-editor.js +85998 -0
  6. package/prebuilt/umo-editor/umo-editor.js.map +1 -0
  7. package/scripts/build-umo.mjs +47 -0
  8. package/scripts/generate-umo-entry.mjs +81 -0
  9. package/scripts/inject-umo-composable-imports.mjs +66 -0
  10. package/scripts/patch-es-drager-vue35.mjs +68 -0
  11. package/scripts/patch-tiptap-vue3.mjs +117 -0
  12. package/scripts/prepare-umo-source.mjs +122 -0
  13. package/src/components/RichTextEditor/RichTextEditor.vue +566 -398
  14. package/src/components/RichTextEditor/installUmoEditorApp.ts +31 -0
  15. package/src/components/RichTextEditor/richTextHtmlUtils.ts +151 -17
  16. package/src/components/RichTextEditor/umo-editor.d.ts +9 -0
  17. package/src/components/editor-main/src/assets/icons/align-center.svg +1 -0
  18. package/src/components/editor-main/src/assets/icons/align-distributed.svg +1 -0
  19. package/src/components/editor-main/src/assets/icons/align-justify.svg +1 -0
  20. package/src/components/editor-main/src/assets/icons/align-left.svg +1 -0
  21. package/src/components/editor-main/src/assets/icons/align-right.svg +1 -0
  22. package/src/components/editor-main/src/assets/icons/arrow-down.svg +1 -0
  23. package/src/components/editor-main/src/assets/icons/audio.svg +1 -0
  24. package/src/components/editor-main/src/assets/icons/auto-width.svg +1 -0
  25. package/src/components/editor-main/src/assets/icons/background-color.svg +1 -0
  26. package/src/components/editor-main/src/assets/icons/barcode.svg +1 -0
  27. package/src/components/editor-main/src/assets/icons/block-add.svg +1 -0
  28. package/src/components/editor-main/src/assets/icons/block-menu.svg +1 -0
  29. package/src/components/editor-main/src/assets/icons/bold.svg +1 -0
  30. package/src/components/editor-main/src/assets/icons/bookmark.svg +10 -0
  31. package/src/components/editor-main/src/assets/icons/border-none.svg +1 -0
  32. package/src/components/editor-main/src/assets/icons/border.svg +1 -0
  33. package/src/components/editor-main/src/assets/icons/break-marks.svg +1 -0
  34. package/src/components/editor-main/src/assets/icons/bullet-list-2.svg +1 -0
  35. package/src/components/editor-main/src/assets/icons/bullet-list-circle.svg +1 -0
  36. package/src/components/editor-main/src/assets/icons/bullet-list-disc.svg +1 -0
  37. package/src/components/editor-main/src/assets/icons/bullet-list-square.svg +1 -0
  38. package/src/components/editor-main/src/assets/icons/bullet-list.svg +1 -0
  39. package/src/components/editor-main/src/assets/icons/callout.svg +1 -0
  40. package/src/components/editor-main/src/assets/icons/check.svg +1 -0
  41. package/src/components/editor-main/src/assets/icons/checkbox.svg +1 -0
  42. package/src/components/editor-main/src/assets/icons/chinese-case.svg +1 -0
  43. package/src/components/editor-main/src/assets/icons/clear-cache.svg +1 -0
  44. package/src/components/editor-main/src/assets/icons/clear-format.svg +1 -0
  45. package/src/components/editor-main/src/assets/icons/clickable.svg +1 -0
  46. package/src/components/editor-main/src/assets/icons/close.svg +1 -0
  47. package/src/components/editor-main/src/assets/icons/code-block.svg +1 -0
  48. package/src/components/editor-main/src/assets/icons/code-line-number.svg +1 -0
  49. package/src/components/editor-main/src/assets/icons/code-word-wrap.svg +1 -0
  50. package/src/components/editor-main/src/assets/icons/code.svg +1 -0
  51. package/src/components/editor-main/src/assets/icons/color.svg +1 -0
  52. package/src/components/editor-main/src/assets/icons/columns.svg +1 -0
  53. package/src/components/editor-main/src/assets/icons/copy.svg +1 -0
  54. package/src/components/editor-main/src/assets/icons/copyright.svg +1 -0
  55. package/src/components/editor-main/src/assets/icons/date.svg +1 -0
  56. package/src/components/editor-main/src/assets/icons/details.svg +1 -0
  57. package/src/components/editor-main/src/assets/icons/diagrams.svg +1 -0
  58. package/src/components/editor-main/src/assets/icons/download.svg +1 -0
  59. package/src/components/editor-main/src/assets/icons/echarts.svg +1 -0
  60. package/src/components/editor-main/src/assets/icons/edit.svg +1 -0
  61. package/src/components/editor-main/src/assets/icons/embed.svg +1 -0
  62. package/src/components/editor-main/src/assets/icons/emoji.svg +1 -0
  63. package/src/components/editor-main/src/assets/icons/equal-proportion.svg +1 -0
  64. package/src/components/editor-main/src/assets/icons/exit.svg +1 -0
  65. package/src/components/editor-main/src/assets/icons/expand-down.svg +1 -0
  66. package/src/components/editor-main/src/assets/icons/file-view.svg +1 -0
  67. package/src/components/editor-main/src/assets/icons/file.svg +1 -0
  68. package/src/components/editor-main/src/assets/icons/font-size-decrease.svg +1 -0
  69. package/src/components/editor-main/src/assets/icons/font-size-increase.svg +1 -0
  70. package/src/components/editor-main/src/assets/icons/footnote.svg +1 -0
  71. package/src/components/editor-main/src/assets/icons/format-painter.svg +1 -0
  72. package/src/components/editor-main/src/assets/icons/format.svg +1 -0
  73. package/src/components/editor-main/src/assets/icons/full-screen-exit.svg +1 -0
  74. package/src/components/editor-main/src/assets/icons/full-screen.svg +1 -0
  75. package/src/components/editor-main/src/assets/icons/hand-drawn.svg +1 -0
  76. package/src/components/editor-main/src/assets/icons/hard-break.svg +1 -0
  77. package/src/components/editor-main/src/assets/icons/heading.svg +1 -0
  78. package/src/components/editor-main/src/assets/icons/help.svg +1 -0
  79. package/src/components/editor-main/src/assets/icons/hide-toolbar.svg +1 -0
  80. package/src/components/editor-main/src/assets/icons/highlight.svg +1 -0
  81. package/src/components/editor-main/src/assets/icons/hr.svg +1 -0
  82. package/src/components/editor-main/src/assets/icons/html5.svg +1 -0
  83. package/src/components/editor-main/src/assets/icons/image-draggable.svg +1 -0
  84. package/src/components/editor-main/src/assets/icons/image-failed.svg +1 -0
  85. package/src/components/editor-main/src/assets/icons/image-flip.svg +1 -0
  86. package/src/components/editor-main/src/assets/icons/image-inline.svg +1 -0
  87. package/src/components/editor-main/src/assets/icons/image-preview.svg +1 -0
  88. package/src/components/editor-main/src/assets/icons/image-remove-background.svg +1 -0
  89. package/src/components/editor-main/src/assets/icons/image-reset.svg +1 -0
  90. package/src/components/editor-main/src/assets/icons/image-rotate.svg +1 -0
  91. package/src/components/editor-main/src/assets/icons/image.svg +1 -0
  92. package/src/components/editor-main/src/assets/icons/indent.svg +1 -0
  93. package/src/components/editor-main/src/assets/icons/italic.svg +1 -0
  94. package/src/components/editor-main/src/assets/icons/laser-pointer.svg +1 -0
  95. package/src/components/editor-main/src/assets/icons/layout-page.svg +1 -0
  96. package/src/components/editor-main/src/assets/icons/layout-web.svg +1 -0
  97. package/src/components/editor-main/src/assets/icons/letter-spacing.svg +1 -0
  98. package/src/components/editor-main/src/assets/icons/line-height.svg +1 -0
  99. package/src/components/editor-main/src/assets/icons/line-number.svg +1 -0
  100. package/src/components/editor-main/src/assets/icons/link.svg +1 -0
  101. package/src/components/editor-main/src/assets/icons/loading.svg +1 -0
  102. package/src/components/editor-main/src/assets/icons/locale.svg +1 -0
  103. package/src/components/editor-main/src/assets/icons/margin.svg +1 -0
  104. package/src/components/editor-main/src/assets/icons/markdown.svg +1 -0
  105. package/src/components/editor-main/src/assets/icons/math.svg +1 -0
  106. package/src/components/editor-main/src/assets/icons/mention.svg +1 -0
  107. package/src/components/editor-main/src/assets/icons/menu.svg +1 -0
  108. package/src/components/editor-main/src/assets/icons/mermaid.svg +1 -0
  109. package/src/components/editor-main/src/assets/icons/mind-map.svg +1 -0
  110. package/src/components/editor-main/src/assets/icons/minus.svg +1 -0
  111. package/src/components/editor-main/src/assets/icons/new-window.svg +1 -0
  112. package/src/components/editor-main/src/assets/icons/node-add.svg +1 -0
  113. package/src/components/editor-main/src/assets/icons/node-clear-format.svg +1 -0
  114. package/src/components/editor-main/src/assets/icons/node-copy.svg +1 -0
  115. package/src/components/editor-main/src/assets/icons/node-cut.svg +2 -0
  116. package/src/components/editor-main/src/assets/icons/node-delete-2.svg +1 -0
  117. package/src/components/editor-main/src/assets/icons/node-delete.svg +1 -0
  118. package/src/components/editor-main/src/assets/icons/node-duplicate.svg +1 -0
  119. package/src/components/editor-main/src/assets/icons/node-switch.svg +1 -0
  120. package/src/components/editor-main/src/assets/icons/ordered-list-2.svg +1 -0
  121. package/src/components/editor-main/src/assets/icons/ordered-list-decimal-leading-zero.svg +1 -0
  122. package/src/components/editor-main/src/assets/icons/ordered-list-decimal.svg +1 -0
  123. package/src/components/editor-main/src/assets/icons/ordered-list-lower-latin.svg +1 -0
  124. package/src/components/editor-main/src/assets/icons/ordered-list-lower-roman.svg +1 -0
  125. package/src/components/editor-main/src/assets/icons/ordered-list-simp-chinese-formal.svg +12 -0
  126. package/src/components/editor-main/src/assets/icons/ordered-list-trad-chinese-informal.svg +12 -0
  127. package/src/components/editor-main/src/assets/icons/ordered-list-upper-latin.svg +1 -0
  128. package/src/components/editor-main/src/assets/icons/ordered-list-upper-roman.svg +1 -0
  129. package/src/components/editor-main/src/assets/icons/ordered-list.svg +1 -0
  130. package/src/components/editor-main/src/assets/icons/outdent.svg +1 -0
  131. package/src/components/editor-main/src/assets/icons/page-background.svg +1 -0
  132. package/src/components/editor-main/src/assets/icons/page-break.svg +1 -0
  133. package/src/components/editor-main/src/assets/icons/page-footer.svg +1 -0
  134. package/src/components/editor-main/src/assets/icons/page-header.svg +1 -0
  135. package/src/components/editor-main/src/assets/icons/page-margin.svg +1 -0
  136. package/src/components/editor-main/src/assets/icons/page-orientation.svg +1 -0
  137. package/src/components/editor-main/src/assets/icons/page-size.svg +1 -0
  138. package/src/components/editor-main/src/assets/icons/page.svg +1 -0
  139. package/src/components/editor-main/src/assets/icons/palette-color.svg +1 -0
  140. package/src/components/editor-main/src/assets/icons/paragraph.svg +1 -0
  141. package/src/components/editor-main/src/assets/icons/pdf.svg +1 -0
  142. package/src/components/editor-main/src/assets/icons/plus.svg +1 -0
  143. package/src/components/editor-main/src/assets/icons/preview.svg +1 -0
  144. package/src/components/editor-main/src/assets/icons/print.svg +1 -0
  145. package/src/components/editor-main/src/assets/icons/qrcode.svg +1 -0
  146. package/src/components/editor-main/src/assets/icons/quote.svg +1 -0
  147. package/src/components/editor-main/src/assets/icons/redo.svg +1 -0
  148. package/src/components/editor-main/src/assets/icons/register.js +47 -0
  149. package/src/components/editor-main/src/assets/icons/reload.svg +1 -0
  150. package/src/components/editor-main/src/assets/icons/remove.svg +1 -0
  151. package/src/components/editor-main/src/assets/icons/reply.svg +1 -0
  152. package/src/components/editor-main/src/assets/icons/search-replace.svg +1 -0
  153. package/src/components/editor-main/src/assets/icons/select-all.svg +1 -0
  154. package/src/components/editor-main/src/assets/icons/selected.svg +1 -0
  155. package/src/components/editor-main/src/assets/icons/setting.svg +1 -0
  156. package/src/components/editor-main/src/assets/icons/share.svg +1 -0
  157. package/src/components/editor-main/src/assets/icons/shortcut.svg +1 -0
  158. package/src/components/editor-main/src/assets/icons/signature.svg +1 -0
  159. package/src/components/editor-main/src/assets/icons/skin.svg +1 -0
  160. package/src/components/editor-main/src/assets/icons/spellcheck.svg +1 -0
  161. package/src/components/editor-main/src/assets/icons/strike.svg +1 -0
  162. package/src/components/editor-main/src/assets/icons/subscript.svg +1 -0
  163. package/src/components/editor-main/src/assets/icons/superscript.svg +1 -0
  164. package/src/components/editor-main/src/assets/icons/symbol.svg +1 -0
  165. package/src/components/editor-main/src/assets/icons/table-add-column-after.svg +1 -0
  166. package/src/components/editor-main/src/assets/icons/table-add-column-before.svg +1 -0
  167. package/src/components/editor-main/src/assets/icons/table-add-row-after.svg +1 -0
  168. package/src/components/editor-main/src/assets/icons/table-add-row-before.svg +1 -0
  169. package/src/components/editor-main/src/assets/icons/table-cells-align.svg +1 -0
  170. package/src/components/editor-main/src/assets/icons/table-cells-background.svg +1 -0
  171. package/src/components/editor-main/src/assets/icons/table-delete-column.svg +1 -0
  172. package/src/components/editor-main/src/assets/icons/table-delete-row.svg +1 -0
  173. package/src/components/editor-main/src/assets/icons/table-delete.svg +1 -0
  174. package/src/components/editor-main/src/assets/icons/table-fix.svg +1 -0
  175. package/src/components/editor-main/src/assets/icons/table-header-cell.svg +1 -0
  176. package/src/components/editor-main/src/assets/icons/table-header-column.svg +1 -0
  177. package/src/components/editor-main/src/assets/icons/table-header-row.svg +1 -0
  178. package/src/components/editor-main/src/assets/icons/table-merge-cell.svg +1 -0
  179. package/src/components/editor-main/src/assets/icons/table-next-cell.svg +1 -0
  180. package/src/components/editor-main/src/assets/icons/table-previous-cell.svg +1 -0
  181. package/src/components/editor-main/src/assets/icons/table-split-cell.svg +1 -0
  182. package/src/components/editor-main/src/assets/icons/table.svg +1 -0
  183. package/src/components/editor-main/src/assets/icons/tag.svg +1 -0
  184. package/src/components/editor-main/src/assets/icons/task-list-2.svg +1 -0
  185. package/src/components/editor-main/src/assets/icons/task-list.svg +1 -0
  186. package/src/components/editor-main/src/assets/icons/template.svg +1 -0
  187. package/src/components/editor-main/src/assets/icons/text-box.svg +1 -0
  188. package/src/components/editor-main/src/assets/icons/text.svg +1 -0
  189. package/src/components/editor-main/src/assets/icons/theme.svg +1 -0
  190. package/src/components/editor-main/src/assets/icons/time.svg +1 -0
  191. package/src/components/editor-main/src/assets/icons/toc.svg +1 -0
  192. package/src/components/editor-main/src/assets/icons/toolbar-classic.svg +1 -0
  193. package/src/components/editor-main/src/assets/icons/toolbar-ribbon.svg +1 -0
  194. package/src/components/editor-main/src/assets/icons/toolbar-source.svg +1 -0
  195. package/src/components/editor-main/src/assets/icons/underline.svg +1 -0
  196. package/src/components/editor-main/src/assets/icons/undo.svg +1 -0
  197. package/src/components/editor-main/src/assets/icons/unlink.svg +1 -0
  198. package/src/components/editor-main/src/assets/icons/video.svg +1 -0
  199. package/src/components/editor-main/src/assets/icons/view.svg +1 -0
  200. package/src/components/editor-main/src/assets/icons/watermark.svg +1 -0
  201. package/src/components/editor-main/src/assets/icons/web-page.svg +1 -0
  202. package/src/components/editor-main/src/assets/icons/word-wrap.svg +1 -0
  203. package/src/components/editor-main/src/assets/icons/word.svg +1 -0
  204. package/src/components/editor-main/src/assets/icons/writing-mode.svg +1 -0
  205. package/src/components/editor-main/src/assets/icons/zoom-1.svg +1 -0
  206. package/src/components/editor-main/src/assets/icons/zoom-auto.svg +1 -0
  207. package/src/components/editor-main/src/assets/icons/zoom.svg +1 -0
  208. package/src/components/editor-main/src/assets/images/avatar.svg +1 -0
  209. package/src/components/editor-main/src/assets/images/format-painter.svg +1 -0
  210. package/src/components/editor-main/src/assets/images/laser-pointer.svg +1 -0
  211. package/src/components/editor-main/src/assets/images/logo.svg +1 -0
  212. package/src/components/editor-main/src/assets/images/watermark-compact.png +0 -0
  213. package/src/components/editor-main/src/assets/images/watermark-spacious.png +0 -0
  214. package/src/components/editor-main/src/assets/styles/_mixins.less +150 -0
  215. package/src/components/editor-main/src/assets/styles/_variables.less +97 -0
  216. package/src/components/editor-main/src/assets/styles/drager.less +123 -0
  217. package/src/components/editor-main/src/assets/styles/editor.less +917 -0
  218. package/src/components/editor-main/src/assets/styles/index.less +19 -0
  219. package/src/components/editor-main/src/assets/styles/plyr.less +26 -0
  220. package/src/components/editor-main/src/assets/styles/tdesign.less +341 -0
  221. package/src/components/editor-main/src/components/container/page.vue +392 -0
  222. package/src/components/editor-main/src/components/container/print.vue +191 -0
  223. package/src/components/editor-main/src/components/container/search-replace.vue +264 -0
  224. package/src/components/editor-main/src/components/container/toc.vue +260 -0
  225. package/src/components/editor-main/src/components/editor/index.vue +213 -0
  226. package/src/components/editor-main/src/components/icon.vue +43 -0
  227. package/src/components/editor-main/src/components/index.js +22 -0
  228. package/src/components/editor-main/src/components/index.vue +1396 -0
  229. package/src/components/editor-main/src/components/menus/block/common.vue +127 -0
  230. package/src/components/editor-main/src/components/menus/block/index.vue +217 -0
  231. package/src/components/editor-main/src/components/menus/block/node.vue +183 -0
  232. package/src/components/editor-main/src/components/menus/bubble/callout/background.vue +39 -0
  233. package/src/components/editor-main/src/components/menus/bubble/callout/builtin.vue +90 -0
  234. package/src/components/editor-main/src/components/menus/bubble/callout/emoji-remove.vue +28 -0
  235. package/src/components/editor-main/src/components/menus/bubble/file/download.vue +30 -0
  236. package/src/components/editor-main/src/components/menus/bubble/file/width.vue +22 -0
  237. package/src/components/editor-main/src/components/menus/bubble/image/convert.vue +63 -0
  238. package/src/components/editor-main/src/components/menus/bubble/image/edit.vue +32 -0
  239. package/src/components/editor-main/src/components/menus/bubble/image/open.vue +27 -0
  240. package/src/components/editor-main/src/components/menus/bubble/image/preview.vue +24 -0
  241. package/src/components/editor-main/src/components/menus/bubble/image/proportion.vue +34 -0
  242. package/src/components/editor-main/src/components/menus/bubble/index.vue +55 -0
  243. package/src/components/editor-main/src/components/menus/bubble/link/copy.vue +29 -0
  244. package/src/components/editor-main/src/components/menus/bubble/link/open.vue +27 -0
  245. package/src/components/editor-main/src/components/menus/bubble/link/unlink.vue +19 -0
  246. package/src/components/editor-main/src/components/menus/bubble/math.vue +36 -0
  247. package/src/components/editor-main/src/components/menus/bubble/menus.vue +209 -0
  248. package/src/components/editor-main/src/components/menus/bubble/node/delete.vue +15 -0
  249. package/src/components/editor-main/src/components/menus/bubble/node/duplicate.vue +40 -0
  250. package/src/components/editor-main/src/components/menus/bubble/node/tofile.vue +31 -0
  251. package/src/components/editor-main/src/components/menus/bubble/tag/background.vue +36 -0
  252. package/src/components/editor-main/src/components/menus/bubble/tag/builtin.vue +88 -0
  253. package/src/components/editor-main/src/components/menus/bubble/tag/color.vue +36 -0
  254. package/src/components/editor-main/src/components/menus/bubble/tag/delete.vue +14 -0
  255. package/src/components/editor-main/src/components/menus/bubble/tag/input.vue +63 -0
  256. package/src/components/editor-main/src/components/menus/bubble/text-box/background.vue +37 -0
  257. package/src/components/editor-main/src/components/menus/bubble/text-box/border.vue +186 -0
  258. package/src/components/editor-main/src/components/menus/bubble/text-box/writing-mode.vue +42 -0
  259. package/src/components/editor-main/src/components/menus/bubble/webpage/clickable.vue +31 -0
  260. package/src/components/editor-main/src/components/menus/bubble/webpage/open.vue +29 -0
  261. package/src/components/editor-main/src/components/menus/button.vue +630 -0
  262. package/src/components/editor-main/src/components/menus/toolbar/base/align-center.vue +33 -0
  263. package/src/components/editor-main/src/components/menus/toolbar/base/align-distributed.vue +18 -0
  264. package/src/components/editor-main/src/components/menus/toolbar/base/align-dropdown.vue +56 -0
  265. package/src/components/editor-main/src/components/menus/toolbar/base/align-justify.vue +18 -0
  266. package/src/components/editor-main/src/components/menus/toolbar/base/align-left.vue +32 -0
  267. package/src/components/editor-main/src/components/menus/toolbar/base/align-right.vue +33 -0
  268. package/src/components/editor-main/src/components/menus/toolbar/base/background-color.vue +72 -0
  269. package/src/components/editor-main/src/components/menus/toolbar/base/bold.vue +18 -0
  270. package/src/components/editor-main/src/components/menus/toolbar/base/bullet-list.vue +110 -0
  271. package/src/components/editor-main/src/components/menus/toolbar/base/clear-format.vue +15 -0
  272. package/src/components/editor-main/src/components/menus/toolbar/base/code.vue +18 -0
  273. package/src/components/editor-main/src/components/menus/toolbar/base/color.vue +75 -0
  274. package/src/components/editor-main/src/components/menus/toolbar/base/font-family.vue +528 -0
  275. package/src/components/editor-main/src/components/menus/toolbar/base/font-size.vue +163 -0
  276. package/src/components/editor-main/src/components/menus/toolbar/base/format-painter.vue +27 -0
  277. package/src/components/editor-main/src/components/menus/toolbar/base/heading.vue +322 -0
  278. package/src/components/editor-main/src/components/menus/toolbar/base/highlight.vue +127 -0
  279. package/src/components/editor-main/src/components/menus/toolbar/base/indent.vue +17 -0
  280. package/src/components/editor-main/src/components/menus/toolbar/base/italic.vue +18 -0
  281. package/src/components/editor-main/src/components/menus/toolbar/base/letter-spacing.vue +113 -0
  282. package/src/components/editor-main/src/components/menus/toolbar/base/line-height.vue +40 -0
  283. package/src/components/editor-main/src/components/menus/toolbar/base/margin.vue +118 -0
  284. package/src/components/editor-main/src/components/menus/toolbar/base/markdown.vue +50 -0
  285. package/src/components/editor-main/src/components/menus/toolbar/base/ordered-list.vue +184 -0
  286. package/src/components/editor-main/src/components/menus/toolbar/base/outdent.vue +17 -0
  287. package/src/components/editor-main/src/components/menus/toolbar/base/print.vue +19 -0
  288. package/src/components/editor-main/src/components/menus/toolbar/base/quote.vue +18 -0
  289. package/src/components/editor-main/src/components/menus/toolbar/base/redo.vue +20 -0
  290. package/src/components/editor-main/src/components/menus/toolbar/base/search-replace.vue +16 -0
  291. package/src/components/editor-main/src/components/menus/toolbar/base/select-all.vue +16 -0
  292. package/src/components/editor-main/src/components/menus/toolbar/base/strike.vue +18 -0
  293. package/src/components/editor-main/src/components/menus/toolbar/base/subscript.vue +18 -0
  294. package/src/components/editor-main/src/components/menus/toolbar/base/superscript.vue +18 -0
  295. package/src/components/editor-main/src/components/menus/toolbar/base/task-list.vue +47 -0
  296. package/src/components/editor-main/src/components/menus/toolbar/base/underline.vue +18 -0
  297. package/src/components/editor-main/src/components/menus/toolbar/base/undo.vue +18 -0
  298. package/src/components/editor-main/src/components/menus/toolbar/base/word-wrap.vue +47 -0
  299. package/src/components/editor-main/src/components/menus/toolbar/export/embed.vue +67 -0
  300. package/src/components/editor-main/src/components/menus/toolbar/export/html.vue +27 -0
  301. package/src/components/editor-main/src/components/menus/toolbar/export/image.vue +66 -0
  302. package/src/components/editor-main/src/components/menus/toolbar/export/pdf.vue +8 -0
  303. package/src/components/editor-main/src/components/menus/toolbar/export/share.vue +63 -0
  304. package/src/components/editor-main/src/components/menus/toolbar/export/text.vue +32 -0
  305. package/src/components/editor-main/src/components/menus/toolbar/insert/audio.vue +23 -0
  306. package/src/components/editor-main/src/components/menus/toolbar/insert/bookmark.vue +206 -0
  307. package/src/components/editor-main/src/components/menus/toolbar/insert/callout.vue +15 -0
  308. package/src/components/editor-main/src/components/menus/toolbar/insert/chinese-date.vue +112 -0
  309. package/src/components/editor-main/src/components/menus/toolbar/insert/code-block.vue +16 -0
  310. package/src/components/editor-main/src/components/menus/toolbar/insert/columns.vue +97 -0
  311. package/src/components/editor-main/src/components/menus/toolbar/insert/details.vue +34 -0
  312. package/src/components/editor-main/src/components/menus/toolbar/insert/emoji.vue +103 -0
  313. package/src/components/editor-main/src/components/menus/toolbar/insert/file.vue +23 -0
  314. package/src/components/editor-main/src/components/menus/toolbar/insert/footnote.vue +15 -0
  315. package/src/components/editor-main/src/components/menus/toolbar/insert/hard-break.vue +16 -0
  316. package/src/components/editor-main/src/components/menus/toolbar/insert/hr.vue +141 -0
  317. package/src/components/editor-main/src/components/menus/toolbar/insert/image.vue +84 -0
  318. package/src/components/editor-main/src/components/menus/toolbar/insert/link.vue +121 -0
  319. package/src/components/editor-main/src/components/menus/toolbar/insert/mention.vue +15 -0
  320. package/src/components/editor-main/src/components/menus/toolbar/insert/option-box.vue +324 -0
  321. package/src/components/editor-main/src/components/menus/toolbar/insert/symbol.vue +88 -0
  322. package/src/components/editor-main/src/components/menus/toolbar/insert/tag.vue +15 -0
  323. package/src/components/editor-main/src/components/menus/toolbar/insert/template.vue +76 -0
  324. package/src/components/editor-main/src/components/menus/toolbar/insert/text-box.vue +15 -0
  325. package/src/components/editor-main/src/components/menus/toolbar/insert/toc.vue +15 -0
  326. package/src/components/editor-main/src/components/menus/toolbar/insert/video.vue +23 -0
  327. package/src/components/editor-main/src/components/menus/toolbar/insert/web-page.vue +173 -0
  328. package/src/components/editor-main/src/components/menus/toolbar/page/background.vue +138 -0
  329. package/src/components/editor-main/src/components/menus/toolbar/page/break-marks.vue +26 -0
  330. package/src/components/editor-main/src/components/menus/toolbar/page/break.vue +20 -0
  331. package/src/components/editor-main/src/components/menus/toolbar/page/footer.vue +15 -0
  332. package/src/components/editor-main/src/components/menus/toolbar/page/header.vue +15 -0
  333. package/src/components/editor-main/src/components/menus/toolbar/page/line-number.vue +16 -0
  334. package/src/components/editor-main/src/components/menus/toolbar/page/margin.vue +17 -0
  335. package/src/components/editor-main/src/components/menus/toolbar/page/orientation.vue +63 -0
  336. package/src/components/editor-main/src/components/menus/toolbar/page/size.vue +67 -0
  337. package/src/components/editor-main/src/components/menus/toolbar/page/watermark.vue +200 -0
  338. package/src/components/editor-main/src/components/menus/toolbar/table/add-column-after.vue +20 -0
  339. package/src/components/editor-main/src/components/menus/toolbar/table/add-column-before.vue +20 -0
  340. package/src/components/editor-main/src/components/menus/toolbar/table/add-row-after.vue +20 -0
  341. package/src/components/editor-main/src/components/menus/toolbar/table/add-row-before.vue +20 -0
  342. package/src/components/editor-main/src/components/menus/toolbar/table/border-color.vue +35 -0
  343. package/src/components/editor-main/src/components/menus/toolbar/table/cells-align.vue +41 -0
  344. package/src/components/editor-main/src/components/menus/toolbar/table/cells-background.vue +32 -0
  345. package/src/components/editor-main/src/components/menus/toolbar/table/delete-column.vue +44 -0
  346. package/src/components/editor-main/src/components/menus/toolbar/table/delete-row.vue +44 -0
  347. package/src/components/editor-main/src/components/menus/toolbar/table/delete.vue +40 -0
  348. package/src/components/editor-main/src/components/menus/toolbar/table/fix.vue +17 -0
  349. package/src/components/editor-main/src/components/menus/toolbar/table/insert.vue +137 -0
  350. package/src/components/editor-main/src/components/menus/toolbar/table/merge-cells.vue +20 -0
  351. package/src/components/editor-main/src/components/menus/toolbar/table/next-cell.vue +21 -0
  352. package/src/components/editor-main/src/components/menus/toolbar/table/previous-cell.vue +21 -0
  353. package/src/components/editor-main/src/components/menus/toolbar/table/split-cell.vue +20 -0
  354. package/src/components/editor-main/src/components/menus/toolbar/table/toggle-header-cell.vue +20 -0
  355. package/src/components/editor-main/src/components/menus/toolbar/table/toggle-header-column.vue +20 -0
  356. package/src/components/editor-main/src/components/menus/toolbar/table/toggle-header-row.vue +20 -0
  357. package/src/components/editor-main/src/components/menus/toolbar/tools/barcode.vue +441 -0
  358. package/src/components/editor-main/src/components/menus/toolbar/tools/chinese-case.vue +135 -0
  359. package/src/components/editor-main/src/components/menus/toolbar/tools/diagrams.vue +141 -0
  360. package/src/components/editor-main/src/components/menus/toolbar/tools/echarts.vue +718 -0
  361. package/src/components/editor-main/src/components/menus/toolbar/tools/math.vue +339 -0
  362. package/src/components/editor-main/src/components/menus/toolbar/tools/mermaid.vue +293 -0
  363. package/src/components/editor-main/src/components/menus/toolbar/tools/mind-map.vue +7 -0
  364. package/src/components/editor-main/src/components/menus/toolbar/tools/qrcode.vue +293 -0
  365. package/src/components/editor-main/src/components/menus/toolbar/tools/signature.vue +208 -0
  366. package/src/components/editor-main/src/components/menus/toolbar/view/fullscreen.vue +17 -0
  367. package/src/components/editor-main/src/components/menus/toolbar/view/locale.vue +40 -0
  368. package/src/components/editor-main/src/components/menus/toolbar/view/page.vue +16 -0
  369. package/src/components/editor-main/src/components/menus/toolbar/view/preview.vue +16 -0
  370. package/src/components/editor-main/src/components/menus/toolbar/view/skin.vue +43 -0
  371. package/src/components/editor-main/src/components/menus/toolbar/view/theme.vue +41 -0
  372. package/src/components/editor-main/src/components/menus/toolbar/view/toc.vue +15 -0
  373. package/src/components/editor-main/src/components/menus/toolbar/view/web.vue +16 -0
  374. package/src/components/editor-main/src/components/menus/toolbar/view/zoom-auto.vue +27 -0
  375. package/src/components/editor-main/src/components/menus/toolbar/view/zoom-original.vue +18 -0
  376. package/src/components/editor-main/src/components/menus/toolbar/view/zoom.vue +35 -0
  377. package/src/components/editor-main/src/components/modal.vue +22 -0
  378. package/src/components/editor-main/src/components/page-options.vue +392 -0
  379. package/src/components/editor-main/src/components/picker/color.vue +208 -0
  380. package/src/components/editor-main/src/components/statusbar/about.vue +37 -0
  381. package/src/components/editor-main/src/components/statusbar/countdown.vue +273 -0
  382. package/src/components/editor-main/src/components/statusbar/index.vue +753 -0
  383. package/src/components/editor-main/src/components/statusbar/shortcuts.vue +313 -0
  384. package/src/components/editor-main/src/components/toolbar/classic.vue +325 -0
  385. package/src/components/editor-main/src/components/toolbar/index.vue +369 -0
  386. package/src/components/editor-main/src/components/toolbar/ribbon.vue +398 -0
  387. package/src/components/editor-main/src/components/toolbar/scrollable.vue +205 -0
  388. package/src/components/editor-main/src/components/tooltip.vue +23 -0
  389. package/src/components/editor-main/src/composables/copy.js +24 -0
  390. package/src/components/editor-main/src/composables/dialog.js +25 -0
  391. package/src/components/editor-main/src/composables/hotkeys.js +14 -0
  392. package/src/components/editor-main/src/composables/i18n.js +19 -0
  393. package/src/components/editor-main/src/composables/popup.js +11 -0
  394. package/src/components/editor-main/src/composables/select.js +13 -0
  395. package/src/components/editor-main/src/composables/state.js +30 -0
  396. package/src/components/editor-main/src/composables/toolbarSelection.js +68 -0
  397. package/src/components/editor-main/src/extensions/audio/index.js +59 -0
  398. package/src/components/editor-main/src/extensions/audio/node-view.vue +141 -0
  399. package/src/components/editor-main/src/extensions/bookmark.js +110 -0
  400. package/src/components/editor-main/src/extensions/break-marks.js +19 -0
  401. package/src/components/editor-main/src/extensions/bullet-list.js +21 -0
  402. package/src/components/editor-main/src/extensions/callout/index.js +128 -0
  403. package/src/components/editor-main/src/extensions/callout/node-view.vue +130 -0
  404. package/src/components/editor-main/src/extensions/code-block/index.js +32 -0
  405. package/src/components/editor-main/src/extensions/code-block/node-view.vue +399 -0
  406. package/src/components/editor-main/src/extensions/columns/dom.js +142 -0
  407. package/src/components/editor-main/src/extensions/columns/index.js +77 -0
  408. package/src/components/editor-main/src/extensions/columns/keymap.js +62 -0
  409. package/src/components/editor-main/src/extensions/columns/resize.js +60 -0
  410. package/src/components/editor-main/src/extensions/columns/schema.js +47 -0
  411. package/src/components/editor-main/src/extensions/columns/state.js +26 -0
  412. package/src/components/editor-main/src/extensions/columns/utils.js +55 -0
  413. package/src/components/editor-main/src/extensions/datetime/index.js +55 -0
  414. package/src/components/editor-main/src/extensions/datetime/node-view.vue +116 -0
  415. package/src/components/editor-main/src/extensions/echarts/cal-service.js +142 -0
  416. package/src/components/editor-main/src/extensions/echarts/index.js +115 -0
  417. package/src/components/editor-main/src/extensions/echarts/node-view.vue +220 -0
  418. package/src/components/editor-main/src/extensions/file/index.js +254 -0
  419. package/src/components/editor-main/src/extensions/file/node-view.vue +333 -0
  420. package/src/components/editor-main/src/extensions/file-handler.js +93 -0
  421. package/src/components/editor-main/src/extensions/foonotes/footnote.js +152 -0
  422. package/src/components/editor-main/src/extensions/foonotes/footnotes.js +41 -0
  423. package/src/components/editor-main/src/extensions/foonotes/index.js +7 -0
  424. package/src/components/editor-main/src/extensions/foonotes/reference.js +211 -0
  425. package/src/components/editor-main/src/extensions/foonotes/rules.js +103 -0
  426. package/src/components/editor-main/src/extensions/foonotes/utils.js +171 -0
  427. package/src/components/editor-main/src/extensions/format-painter.js +104 -0
  428. package/src/components/editor-main/src/extensions/horizontal-rule.js +93 -0
  429. package/src/components/editor-main/src/extensions/iframe/index.js +54 -0
  430. package/src/components/editor-main/src/extensions/iframe/node-view.vue +106 -0
  431. package/src/components/editor-main/src/extensions/image/image-resizer.vue +349 -0
  432. package/src/components/editor-main/src/extensions/image/index.js +216 -0
  433. package/src/components/editor-main/src/extensions/image/node-view.vue +592 -0
  434. package/src/components/editor-main/src/extensions/indent.js +226 -0
  435. package/src/components/editor-main/src/extensions/index.js +341 -0
  436. package/src/components/editor-main/src/extensions/letter-spacing.js +66 -0
  437. package/src/components/editor-main/src/extensions/line-height.js +147 -0
  438. package/src/components/editor-main/src/extensions/margin.js +266 -0
  439. package/src/components/editor-main/src/extensions/mention/index.js +33 -0
  440. package/src/components/editor-main/src/extensions/mention/mentions.vue +180 -0
  441. package/src/components/editor-main/src/extensions/mention/suggestion.js +90 -0
  442. package/src/components/editor-main/src/extensions/node-align.js +164 -0
  443. package/src/components/editor-main/src/extensions/node-select.js +51 -0
  444. package/src/components/editor-main/src/extensions/office-paste/index.js +70 -0
  445. package/src/components/editor-main/src/extensions/office-paste/transform/bookmark.js +17 -0
  446. package/src/components/editor-main/src/extensions/office-paste/transform/excel.js +85 -0
  447. package/src/components/editor-main/src/extensions/office-paste/transform/html-classes.js +9 -0
  448. package/src/components/editor-main/src/extensions/office-paste/transform/line-number.js +10 -0
  449. package/src/components/editor-main/src/extensions/office-paste/transform/list.js +148 -0
  450. package/src/components/editor-main/src/extensions/office-paste/transform/style.js +24 -0
  451. package/src/components/editor-main/src/extensions/office-paste/utils.js +120 -0
  452. package/src/components/editor-main/src/extensions/option-box/index.js +77 -0
  453. package/src/components/editor-main/src/extensions/option-box/node-view.vue +194 -0
  454. package/src/components/editor-main/src/extensions/ordered-list.js +36 -0
  455. package/src/components/editor-main/src/extensions/page-break.js +42 -0
  456. package/src/components/editor-main/src/extensions/search-replace.js +304 -0
  457. package/src/components/editor-main/src/extensions/selection.js +38 -0
  458. package/src/components/editor-main/src/extensions/table.js +65 -0
  459. package/src/components/editor-main/src/extensions/tag/index.js +47 -0
  460. package/src/components/editor-main/src/extensions/tag/node-view.vue +51 -0
  461. package/src/components/editor-main/src/extensions/text-align.js +44 -0
  462. package/src/components/editor-main/src/extensions/text-box/index.js +78 -0
  463. package/src/components/editor-main/src/extensions/text-box/node-view.vue +141 -0
  464. package/src/components/editor-main/src/extensions/toc/index.js +48 -0
  465. package/src/components/editor-main/src/extensions/toc/node-view.vue +159 -0
  466. package/src/components/editor-main/src/extensions/type-writer.js +256 -0
  467. package/src/components/editor-main/src/extensions/video/index.js +65 -0
  468. package/src/components/editor-main/src/extensions/video/node-view.vue +211 -0
  469. package/src/components/editor-main/src/extensions/word-wrap.js +94 -0
  470. package/src/components/editor-main/src/i18n.js +15 -0
  471. package/src/components/editor-main/src/locales/bo.json +707 -0
  472. package/src/components/editor-main/src/locales/en-US.json +802 -0
  473. package/src/components/editor-main/src/locales/it-IT.json +721 -0
  474. package/src/components/editor-main/src/locales/ru-RU.json +779 -0
  475. package/src/components/editor-main/src/locales/zh-CN.json +804 -0
  476. package/src/components/editor-main/src/options/config/dicts.js +369 -0
  477. package/src/components/editor-main/src/options/config/index.js +203 -0
  478. package/src/components/editor-main/src/options/index.js +7 -0
  479. package/src/components/editor-main/src/options/schema.js +732 -0
  480. package/src/components/editor-main/src/utils/content-transform.js +12 -0
  481. package/src/components/editor-main/src/utils/copyright.js +4 -0
  482. package/src/components/editor-main/src/utils/diagram-editor.js +153 -0
  483. package/src/components/editor-main/src/utils/editor-scroll.js +75 -0
  484. package/src/components/editor-main/src/utils/file.js +177 -0
  485. package/src/components/editor-main/src/utils/history-record.js +135 -0
  486. package/src/components/editor-main/src/utils/load-resource.js +45 -0
  487. package/src/components/editor-main/src/utils/options.js +25 -0
  488. package/src/components/editor-main/src/utils/player.js +91 -0
  489. package/src/components/editor-main/src/utils/selection.js +39 -0
  490. package/src/components/editor-main/src/utils/short-id.js +4 -0
  491. package/src/components/editor-main/src/utils/shortcut.js +17 -0
  492. package/src/components/editor-main/src/utils/time-ago.js +8 -0
  493. package/src/components/editor-main/umo-build-entry.js +570 -0
  494. package/src/css/elementUI/col.scss +10 -2
  495. package/src/css/elementUI/mixins/_col.scss +10 -2
  496. package/vite/highlightJsLibVirtual.ts +98 -0
  497. package/vite/projectRoot.ts +17 -0
  498. package/vite/tiptapUmoResolve.ts +140 -0
  499. package/vite/tiptapVueRendererFix.ts +171 -0
  500. package/vite/umoCjsVirtual.ts +192 -0
  501. package/vite/umoIntegration.js +611 -0
  502. package/vite/umoIntegration.ts +56 -0
  503. package/vite/yjsPeerResolve.ts +100 -0
  504. package/vite.config.ts +8 -0
  505. package/vite.config.umo.ts +82 -0
  506. package/src/components/RichTextEditor/UmoRichTextEditor.vue +0 -257
  507. package/src/types/umoteam-editor.d.ts +0 -8
@@ -1,475 +1,643 @@
1
- <!--创建人 xux-->
2
- <!--说明: RichTextEditor https://www.wangeditor.com/-->
3
- <!--创建时间: 2025/1/3 下午1:43-->
4
- <!--修改时间: 2025/1/3 下午1:43-->
1
+ <!-- RichTextEditor:基于预编译 Umo Editor(prebuilt/umo-editor),对外 API 与原 AiEditor 封装保持一致 -->
5
2
  <template>
6
- <el-flex>
7
- <div
8
- ref="divRef"
9
- :style="{
10
- height: '100%',
11
- width: '100%',
12
- fontSize: '14px',
13
- }"
3
+ <div ref="rootRef" class="umo-rich-text-editor-root">
4
+ <UmoEditor
5
+ v-if="umoMountOptions"
6
+ :key="umoRuntimeKey"
7
+ ref="editorRef"
8
+ class="umo-rich-text-editor"
9
+ v-bind="umoMountOptions"
10
+ @created="onEditorCreated"
11
+ @changed="onEditorChanged"
12
+ @blur="onEditorBlur"
14
13
  />
15
- </el-flex>
14
+ </div>
16
15
  </template>
16
+
17
17
  <script setup lang="ts">
18
- import { AiEditor } from 'aieditor'
19
- import 'aieditor/dist/style.css'
20
- import { onActivated, type WatchStopHandle } from 'vue'
21
- import { onMounted, onUnmounted, ref, watch } from 'vue'
18
+ import { UmoEditor } from '../../../prebuilt/umo-editor/umo-editor.js'
19
+ import '../../../prebuilt/umo-editor/umo-editor.css'
22
20
  import { ElMessage } from 'element-plus'
21
+ import { computed, getCurrentInstance, nextTick, onBeforeUnmount, onMounted, onUnmounted, ref, shallowRef, watch, type App } from 'vue'
22
+ import { v4 as uuidv4 } from 'uuid'
23
+ import {
24
+ finalizeHtml,
25
+ initHtml,
26
+ installUmoDocumentStorageShim,
27
+ purgeUmoDocumentLocalStorage,
28
+ releaseUmoDocumentStorageShim,
29
+ } from './richTextHtmlUtils'
30
+ import { installUmoEditorApp } from './installUmoEditorApp'
23
31
 
24
- enum WatchType {
25
- initWatch = 'initWatch',
32
+ export type RichTextEditorConfig = {
33
+ placeholder?: string
34
+ editable?: boolean
35
+ [key: string]: unknown
26
36
  }
27
37
 
28
- const watchHandlers = ref<Partial<Record<WatchType, WatchStopHandle>>>({})
29
- const emit = defineEmits(['onBlur', 'onChange'])
30
- const divRef = ref()
31
- let aiEditor: AiEditor | null
38
+ /** 始终保留 BlockImage NodeView;只读由 document.readOnly + node-view 静态分支控制 */
39
+ const DISABLED_EXTENSIONS = ['mermaid', 'diagrams'] as const
40
+
41
+ const OFFICIAL_TOOLBAR_MENUS = ['base', 'insert', 'table', 'tools', 'page', 'view', 'export'] as const
42
+
43
+ const emit = defineEmits<{
44
+ onBlur: [payload: { html: string; text: string }]
45
+ onChange: [payload: { html: string; text: string }]
46
+ }>()
47
+
32
48
  const props = withDefaults(
33
49
  defineProps<{
34
- /**
35
- * html 内容
36
- */
37
- // modelValue: string
38
- /**
39
- * 工具栏显示
40
- */
41
50
  showToolbar?: boolean
42
- /**
43
- * 边框宽度
44
- */
45
51
  borderWidth?: string
46
- /**
47
- * 编辑器配置 IEditorConfig
48
- */
49
- editorConfig?: any
50
- /**
51
- * 是否编辑状态,一直生效(config中edit只用在初始化时生效)
52
- */
52
+ editorConfig?: RichTextEditorConfig
53
53
  isEdit?: boolean
54
54
  }>(),
55
55
  {
56
- // modelValue: '',
57
56
  showToolbar: true,
58
57
  borderWidth: '1px',
59
- editorConfig: {},
58
+ editorConfig: () => ({}),
60
59
  isEdit: true,
61
60
  },
62
61
  )
63
- const model = defineModel({
64
- type: [String, null, undefined],
62
+
63
+ const model = defineModel<string | null | undefined>({
65
64
  required: false,
66
65
  default: null,
67
66
  })
68
- const text = defineModel('text', {
69
- type: String,
67
+ const text = defineModel<string>('text', {
70
68
  required: false,
71
69
  })
72
- //字体对照表
73
- const fontSizes = [
74
- { name: '八号', pt: 5, px: 5 },
75
- { name: '七号', pt: 5.5, px: 6 },
76
- { name: '小六', pt: 6.5, px: 8 },
77
- { name: '六号', pt: 7.5, px: 9 },
78
- { name: '小五', pt: 9, px: 11 },
79
- { name: '五号', pt: 10.5, px: 12 },
80
- { name: '小四', pt: 12, px: 14 },
81
- { name: '四号', pt: 14, px: 16 },
82
- { name: '小三', pt: 15, px: 18 },
83
- { name: '三号', pt: 16, px: 19 },
84
- { name: '小二', pt: 18, px: 21 },
85
- { name: '二号', pt: 22, px: 26 },
86
- { name: '小一', pt: 24, px: 28 },
87
- { name: '一号', pt: 26, px: 30 },
88
- { name: '小初', pt: 36, px: 42 },
89
- { name: '初号', pt: 42, px: 49 },
90
- ]
91
-
92
- function setDefaultPx(html: string) {
93
- // 创建临时div用于解析HTML
94
- const tempDiv = document.createElement('div')
95
- tempDiv.innerHTML = html
96
- // 获取所有p元素
97
- const pElements = tempDiv.querySelectorAll('p')
98
-
99
- pElements.forEach((p) => {
100
- // 检查是否有内联样式设置了fontSize
101
- const hasInlineFontSize = !!p.style.fontSize
102
- // 只有当没有设置字体大小时才添加
103
- if (!hasInlineFontSize) {
104
- p.style.fontSize = '14px'
70
+
71
+ const editorRef = ref<InstanceType<typeof UmoEditor> | null>(null)
72
+ const rootRef = ref<HTMLElement | null>(null)
73
+ /** setup 同步捕获;async/Observer getCurrentInstance() null */
74
+ const hostApp = getCurrentInstance()?.appContext?.app as App | undefined
75
+ const editorKey = `umo-${uuidv4()}`
76
+ /** 编辑/只读扩展集不同,切换时需 remount;key 变化强制重建 UmoEditor */
77
+ const umoRuntimeKey = ref(editorKey)
78
+ const lastMountEditable = ref<boolean | null>(null)
79
+ const ready = ref(false)
80
+ const syncingContent = ref(false)
81
+ /** 挂载快照,避免 computed props 变更触发 Umo 内部反复 patch 导致 emitsOptions null */
82
+ const umoMountOptions = shallowRef<Record<string, unknown> | null>(null)
83
+
84
+ let remounting = false
85
+ let blockImageRepairAttempts = 0
86
+
87
+ let visibilityResizeObserver: ResizeObserver | null = null
88
+ let ancestorVisibilityObserver: MutationObserver | null = null
89
+ let rootWasHidden = false
90
+
91
+ function isPanelVisible() {
92
+ const el = rootRef.value
93
+ if (!el || typeof document === 'undefined') return false
94
+ let node: HTMLElement | null = el
95
+ while (node && node !== document.documentElement) {
96
+ const style = getComputedStyle(node)
97
+ if (style.display === 'none') return false
98
+ node = node.parentElement
99
+ }
100
+ return true
101
+ }
102
+
103
+ function handlePanelShown() {
104
+ if (!isPanelVisible() || !umoMountOptions.value) {
105
+ rootWasHidden = true
106
+ return
107
+ }
108
+ if (!rootWasHidden) return
109
+ rootWasHidden = false
110
+ if (!ready.value) return
111
+ void applyEditableStateWithRetry()
112
+ if (editable.value) {
113
+ void ensureBlockImageNodeView()
114
+ }
115
+ }
116
+
117
+ function observeAncestorsVisibility() {
118
+ const el = rootRef.value
119
+ if (!el || typeof MutationObserver === 'undefined' || ancestorVisibilityObserver) return
120
+
121
+ const targets = new Set<HTMLElement>()
122
+ let node: HTMLElement | null = el
123
+ while (node) {
124
+ if (
125
+ node.hasAttribute('aria-hidden') ||
126
+ node.classList.contains('el-tab-pane') ||
127
+ node.classList.contains('el-collapse-item') ||
128
+ node.getAttribute('role') === 'tabpanel'
129
+ ) {
130
+ targets.add(node)
105
131
  }
132
+ node = node.parentElement
133
+ }
134
+ if (targets.size === 0) return
135
+
136
+ ancestorVisibilityObserver = new MutationObserver(() => {
137
+ handlePanelShown()
106
138
  })
107
- return tempDiv.innerHTML
139
+ for (const target of targets) {
140
+ ancestorVisibilityObserver.observe(target, {
141
+ attributes: true,
142
+ attributeFilter: ['aria-hidden', 'class', 'style'],
143
+ })
144
+ }
108
145
  }
109
146
 
110
- function convertPxToPt(html: string) {
111
- html = setDefaultPx(html)
112
- const regex = /font-size: (\d+)px/g
113
- return html.replace(regex, (match, pxValue) => {
114
- const px = parseInt(pxValue, 10)
115
- const entry = fontSizes.find((item) => item.px === px)
116
- if (entry) {
117
- return `font-size: ${entry.pt}pt`
118
- }
119
- return match
147
+ function observePanelVisibility() {
148
+ const el = rootRef.value
149
+ if (!el) return
150
+ observeAncestorsVisibility()
151
+ if (typeof ResizeObserver !== 'undefined' && !visibilityResizeObserver) {
152
+ visibilityResizeObserver = new ResizeObserver(() => {
153
+ handlePanelShown()
154
+ })
155
+ visibilityResizeObserver.observe(el)
156
+ }
157
+ }
158
+
159
+ purgeUmoDocumentLocalStorage()
160
+ installUmoDocumentStorageShim()
161
+
162
+ function clearVisibilityObserver() {
163
+ visibilityResizeObserver?.disconnect()
164
+ visibilityResizeObserver = null
165
+ ancestorVisibilityObserver?.disconnect()
166
+ ancestorVisibilityObserver = null
167
+ }
168
+
169
+ function initUmoMountOptions(content?: string) {
170
+ seedUmoLayoutStorage()
171
+ umoMountOptions.value = buildUmoMountOptions(initHtml(content ?? model.value ?? ''))
172
+ lastMountEditable.value = editable.value
173
+ }
174
+
175
+ async function remountEditor() {
176
+ if (remounting || !umoMountOptions.value) return
177
+ remounting = true
178
+ try {
179
+ const html = ready.value
180
+ ? finalizeHtml(getRawHtml(), getRootElement())
181
+ : initHtml(model.value ?? '')
182
+ ready.value = false
183
+ editorRef.value = null
184
+ umoMountOptions.value = null
185
+ umoRuntimeKey.value = `${editorKey}-${Date.now()}`
186
+ await nextTick()
187
+ ensureUmoGlobals()
188
+ initUmoMountOptions(html)
189
+ } finally {
190
+ remounting = false
191
+ }
192
+ }
193
+
194
+ function ensureUmoGlobals() {
195
+ return installUmoEditorApp(hostApp ?? getCurrentInstance()?.appContext?.app)
196
+ }
197
+
198
+ const editable = computed(() => {
199
+ if (!props.isEdit) return false
200
+ if (props.editorConfig?.editable === false) return false
201
+ return true
202
+ })
203
+
204
+ function seedUmoLayoutStorage() {
205
+ if (typeof localStorage === 'undefined') return
206
+ const showToolbar = props.showToolbar && editable.value
207
+ try {
208
+ localStorage.setItem(`umo-editor:${umoRuntimeKey.value}:layout`, JSON.stringify('web'))
209
+ localStorage.setItem(
210
+ `umo-editor:${umoRuntimeKey.value}:toolbar`,
211
+ JSON.stringify({ mode: 'ribbon', show: showToolbar }),
212
+ )
213
+ } catch {
214
+ // ignore quota / private mode
215
+ }
216
+ }
217
+
218
+ function waitEditorPaintFrames() {
219
+ return new Promise<void>((resolve) => {
220
+ requestAnimationFrame(() => requestAnimationFrame(() => resolve()))
120
221
  })
121
222
  }
122
223
 
123
- function convertPtToPx(html: string) {
124
- const regex = /font-size: (\d+)pt/g
125
- return html.replace(regex, (match, ptValue) => {
126
- const pt = parseFloat(ptValue)
127
- const entry = fontSizes.find((item) => item.pt === pt)
128
- if (entry) {
129
- return `font-size: ${entry.px}px`
224
+ function usesPlainImageDom(root: HTMLElement | null): boolean {
225
+ const prose = root?.querySelector('.ProseMirror')
226
+ if (!prose) return false
227
+ if (prose.querySelector('.umo-node-view')) return false
228
+ return prose.querySelector(':scope > img') !== null
229
+ }
230
+
231
+ /** contentComponent 就绪前写入的图片会渲染为裸 img;重灌 HTML 可触发 BlockImage NodeView */
232
+ async function ensureBlockImageNodeView() {
233
+ if (!editable.value || !umoMountOptions.value) return
234
+ await nextTick()
235
+ await waitEditorPaintFrames()
236
+ await nextTick()
237
+ await waitEditorPaintFrames()
238
+ if (!usesPlainImageDom(rootRef.value)) {
239
+ blockImageRepairAttempts = 0
240
+ return
241
+ }
242
+ if (blockImageRepairAttempts >= 3) return
243
+ blockImageRepairAttempts += 1
244
+
245
+ const editor = getEditorInstance()
246
+ if (editor?.setContent && ready.value) {
247
+ const html = initHtml(getRawHtml() || (model.value ?? ''))
248
+ editor.setContent(html, { emitUpdate: false })
249
+ await nextTick()
250
+ await waitEditorPaintFrames()
251
+ if (!usesPlainImageDom(rootRef.value)) {
252
+ blockImageRepairAttempts = 0
253
+ return
130
254
  }
131
- return match
132
- })
255
+ }
256
+
257
+ if (ready.value) {
258
+ publishModelFromEditor(true)
259
+ }
260
+ await remountEditor()
261
+ await nextTick()
262
+ await applyEditableStateWithRetry()
133
263
  }
134
264
 
135
- //默认的配置
136
- const defaultConfig = {
137
- placeholder: '请输入内容...',
138
- draggable: false, // 禁止拖拽
139
- toolbarExcludeKeys: [
140
- 'eraser',
141
- 'link',
142
- 'code',
143
- 'attachment',
144
- 'code-block',
145
- 'video',
146
- 'ai',
147
- 'quote',
148
- 'emoji',
149
- ],
150
- textSelectionBubbleMenu: {
151
- enable: true,
152
- items: ['Bold', 'Italic', 'Underline', 'Strike', 'code', 'comment'],
153
- },
154
- image: {
155
- uploaderEvent: {
156
- onUploadBefore: (file, uploadUrl, headers) => {
157
- if (file.size > 2 * 1024 * 1024) {
158
- ElMessage.warning('图片大小不能超过2M')
159
- return false
160
- }
265
+ function buildUmoMountOptions(content: string) {
266
+ const placeholder =
267
+ typeof props.editorConfig?.placeholder === 'string' && props.editorConfig.placeholder.trim()
268
+ ? props.editorConfig.placeholder
269
+ : '请输入内容...'
270
+ const editableNow = editable.value
271
+
272
+ return {
273
+ editorKey: umoRuntimeKey.value,
274
+ locale: 'zh-CN',
275
+ theme: 'light',
276
+ height: '100%',
277
+ fullscreenZIndex: 2500,
278
+ toolbar: {
279
+ showSaveLabel: false,
280
+ defaultMode: 'ribbon',
281
+ menus:
282
+ props.showToolbar && editableNow
283
+ ? [...OFFICIAL_TOOLBAR_MENUS]
284
+ : (['base'] as unknown as string[]),
285
+ },
286
+ page: {
287
+ layouts: ['page', 'web'],
288
+ },
289
+ document: {
290
+ title: '',
291
+ content,
292
+ placeholder: {
293
+ zh_CN: placeholder,
294
+ },
295
+ readOnly: !editableNow,
296
+ autofocus: editableNow,
297
+ enableMarkdown: false,
298
+ enableSpellcheck: false,
299
+ autoSave: {
300
+ enabled: false,
161
301
  },
162
- // onSuccess: (file, response) => {
163
- // console.log('onSuccess', file, response)
164
- // }
165
302
  },
166
- },
167
- htmlPasteConfig: {
168
- pasteProcessor: (html) => {
169
- // return html;
170
- // console.log('html:', html, 'xxxxxx', removeAllFontFamilyStyles(html))
171
- return removeAllFontFamilyStyles(html)
303
+ shareUrl: typeof location !== 'undefined' ? location.href : '',
304
+ disableExtensions: [...DISABLED_EXTENSIONS],
305
+ extensions: [],
306
+ async onFileUpload(file: File) {
307
+ if (file.type.startsWith('image/') && file.size > 2 * 1024 * 1024) {
308
+ ElMessage.warning('图片大小不能超过2M')
309
+ throw new Error('image too large')
310
+ }
311
+ const url = await readFileAsDataUrl(file)
312
+ return {
313
+ id: uuidv4(),
314
+ url,
315
+ }
172
316
  },
173
- },
174
- fontSize: {
175
- defaultValue: ' ',
176
- values: [
177
- { name: '小四', value: 14 },
178
- { name: '初号', value: 49 },
179
- { name: '小初', value: 42 },
180
- { name: '一号', value: 30 },
181
- { name: '小一', value: 28 },
182
- { name: '二号', value: 26 },
183
- { name: '小二', value: 21 },
184
- { name: '三号', value: 19 },
185
- { name: '小三', value: 18 },
186
- { name: '四号', value: 16 },
187
- { name: '小四', value: 14 },
188
- { name: '五号', value: 12 },
189
- { name: '小五', value: 11 },
190
- { name: '六号', value: 9 },
191
- { name: '小六', value: 8 },
192
- { name: '七号', value: 6 },
193
- { name: '八号', value: 5 },
194
- ],
195
- },
196
- onChange: (editor: AiEditor) => {
197
- emit('onChange', { html: editor.getHtml(), text: editor.getText() })
198
- setFooter()
199
- model.value = editor.getHtml()
200
- text.value = editor.getText()
201
- setTimeout(() => {
202
- setContent()
203
- }, 200)
204
- },
205
- onBlur: (editor: AiEditor) => {
206
- emit('onBlur', { html: editor.getHtml(), text: editor.getText() })
207
- },
317
+ /** 图片以 base64 写入 HTML,无独立服务端文件;覆盖 Umo 默认 console.error */
318
+ onFileDelete(_id: string, _url: string, _type?: string) {
319
+ // no-op
320
+ },
321
+ }
208
322
  }
209
323
 
210
- /**
211
- * 修改样式
212
- */
213
- function setContent() {
214
- let html = aiEditor!.getHtml()
215
- html = calcImagesHeight(html)
216
- model.value = convertPxToPt(html)
217
- }
218
-
219
- /**
220
- * 移除html字体相关设置
221
- * @param html
222
- */
223
- function removeAllFontFamilyStyles(html: string): string {
224
- const tempDiv = document.createElement('div')
225
- tempDiv.innerHTML = html
226
-
227
- function processElement(element: Element) {
228
- if (element.hasAttribute('style')) {
229
- let style = element.getAttribute('style') || ''
230
- // 规范化样式字符串:确保每个属性以分号结尾
231
- style = normalizeStyleString(style)
232
-
233
- // 使用简化的正则表达式移除字体相关属性(现在可以安全地假设每个属性后都有分号)
234
- style = style.replace(
235
- /(?:font-family|mso-(?:ascii|hansi|bidi|fareast|east-asian|font)-font-family)\s*:\s*[^;]+;/gi,
236
- '',
237
- )
238
- // 清理空样式
239
- style = style.trim()
240
- if (style) {
241
- element.setAttribute('style', style)
242
- } else {
243
- element.removeAttribute('style')
244
- }
245
- }
324
+ function readFileAsDataUrl(file: File) {
325
+ return new Promise<string>((resolve, reject) => {
326
+ const reader = new FileReader()
327
+ reader.onload = () => resolve(String(reader.result ?? ''))
328
+ reader.onerror = () => reject(reader.error)
329
+ reader.readAsDataURL(file)
330
+ })
331
+ }
246
332
 
247
- // 移除标签上的字体家族相关属性
248
- const fontFamilyAttrs = [
249
- 'font-family',
250
- 'face',
251
- 'mso-hansi-font-family',
252
- 'mso-bidi-font-family',
253
- 'mso-ascii-font-family',
254
- 'mso-fareast-font-family',
255
- 'mso-east-asian-font-family',
256
- 'mso-font-font-family',
257
- ]
258
- fontFamilyAttrs.forEach((attr) => element.removeAttribute(attr))
259
-
260
- // 递归处理子元素
261
- Array.from(element.children).forEach((child) => processElement(child))
262
- }
333
+ function getRootElement(): HTMLElement | null {
334
+ return rootRef.value
335
+ }
263
336
 
264
- // 规范化样式字符串:确保每个属性以分号结尾
265
- function normalizeStyleString(style: string): string {
266
- // 移除首尾空格
267
- style = style.trim()
337
+ function getEditorInstance() {
338
+ return editorRef.value as unknown as {
339
+ getHTML?: () => string
340
+ getText?: () => string
341
+ setContent?: (content: string, options?: Record<string, unknown>) => void
342
+ setReadOnly?: (value: boolean) => void
343
+ setDocument?: (payload: Record<string, unknown>) => void
344
+ setToolbar?: (payload: { mode?: string; show?: boolean }) => void
345
+ setLayout?: (layout: 'page' | 'web') => void
346
+ focus?: (position?: string, options?: Record<string, unknown>) => void
347
+ getEditor?: () => { value?: { setEditable?: (value: boolean) => void; isEditable?: boolean } }
348
+ } | null
349
+ }
268
350
 
269
- // 如果样式为空,直接返回
270
- if (!style) return ''
351
+ function ensureTipTapEditable(canEdit: boolean) {
352
+ const tipTap = getEditorInstance()?.getEditor?.()?.value
353
+ if (tipTap && typeof tipTap.setEditable === 'function') {
354
+ tipTap.setEditable(canEdit)
355
+ }
356
+ }
271
357
 
272
- // 如果最后一个字符不是分号,添加分号
273
- if (style.charAt(style.length - 1) !== ';') {
274
- style += ';'
275
- }
358
+ /** 强制同步 Umo/TipTap 可编辑态(readOnly 与 isEditable 可能脱节,如预览模式或隐藏 Tab 挂载) */
359
+ async function applyEditableState() {
360
+ const editor = getEditorInstance()
361
+ if (!editor) return false
362
+ const canEdit = editable.value
363
+ editor.setDocument?.({ readOnly: !canEdit })
364
+ editor.setReadOnly?.(!canEdit)
365
+ ensureTipTapEditable(canEdit)
366
+ editor.setToolbar?.({
367
+ mode: 'ribbon',
368
+ show: props.showToolbar && canEdit,
369
+ })
370
+ const tipTap = editor.getEditor?.()?.value
371
+ if (!tipTap) return false
372
+ if (canEdit && !tipTap.isEditable) {
373
+ tipTap.setEditable(true)
374
+ }
375
+ return canEdit ? tipTap.isEditable : !tipTap.isEditable
376
+ }
276
377
 
277
- return style
378
+ async function applyEditableStateWithRetry(maxAttempts = 6) {
379
+ for (let i = 0; i < maxAttempts; i += 1) {
380
+ if (await applyEditableState()) return true
381
+ await nextTick()
382
+ await waitEditorPaintFrames()
278
383
  }
384
+ return false
385
+ }
279
386
 
280
- Array.from(tempDiv.children).forEach((child) => processElement(child))
281
- return tempDiv.innerHTML
282
- }
283
-
284
- /**
285
- * 计算富文本框中图片的高度并赋值
286
- */
287
- function calcImagesHeight(html: string) {
288
- const map = new Map()
289
- const imageElements = divRef.value.querySelectorAll('img.resize-obj')
290
- if (imageElements.length > 0) {
291
- imageElements.forEach((imageElement: any) => {
292
- const width = imageElement.offsetWidth
293
- const height = imageElement.offsetHeight
294
- if (width > 1 && height > 1) {
295
- map.set(
296
- imageElement.src.length > 100 ? imageElement.src.substring(0, 100) : imageElement.src,
297
- height,
298
- )
299
- }
300
- })
301
- for (const [key, value] of map) {
302
- html = customStringReplacement(html, `${key}`, '>', `height="auto"`, `height="${value}"`)
303
- }
387
+ function syncEditorPresentation() {
388
+ const editor = getEditorInstance()
389
+ if (!editor) return
390
+ editor.setLayout?.('web')
391
+ void applyEditableState()
392
+ }
393
+
394
+ function getRawHtml() {
395
+ const editor = getEditorInstance()
396
+ return editor?.getHTML?.() ?? ''
397
+ }
398
+
399
+ function getPlainText() {
400
+ const editor = getEditorInstance()
401
+ return editor?.getText?.() ?? ''
402
+ }
403
+
404
+ function applyEditorHtml(html: string, focus = false) {
405
+ if (!ready.value) return
406
+ const editor = getEditorInstance()
407
+ editor?.setContent?.(initHtml(html), {
408
+ emitUpdate: false,
409
+ focusPosition: focus ? 'end' : false,
410
+ })
411
+ }
412
+
413
+ function publishModelFromEditor(finalize = false) {
414
+ const editor = getEditorInstance()
415
+ if (!editor) return
416
+ let html = getRawHtml()
417
+ if (finalize) {
418
+ html = finalizeHtml(html, getRootElement())
304
419
  }
305
- return html
306
- }
307
-
308
- function customStringReplacement(
309
- str: string,
310
- startMarker: string,
311
- endMarker: string,
312
- target: string,
313
- replacement: string,
314
- ): string {
315
- let result = ''
316
- let currentIndex = 0
317
-
318
- while (true) {
319
- const startIndex = str.indexOf(startMarker, currentIndex)
320
- if (startIndex === -1) {
321
- result += str.slice(currentIndex)
322
- break
323
- }
420
+ syncingContent.value = true
421
+ model.value = html
422
+ text.value = getPlainText()
423
+ syncingContent.value = false
424
+ emit('onChange', { html, text: getPlainText() })
425
+ }
324
426
 
325
- const endIndex = str.indexOf(endMarker, startIndex + startMarker.length)
326
- if (endIndex === -1) {
327
- result += str.slice(currentIndex)
328
- break
329
- }
427
+ async function bootstrapEditor() {
428
+ if (ready.value) return
429
+ const editor = getEditorInstance()
430
+ if (!editor?.getHTML) return
330
431
 
331
- result += str.slice(currentIndex, startIndex + startMarker.length)
332
- const middle = str.slice(startIndex + startMarker.length, endIndex)
333
- const newMiddle = middle.replace(new RegExp(target, 'g'), replacement)
334
- result += newMiddle
335
- result += endMarker
336
- currentIndex = endIndex + 1
432
+ await nextTick()
433
+ await waitEditorPaintFrames()
434
+ await waitEditorPaintFrames()
435
+ ready.value = true
436
+ await nextTick()
437
+ await applyEditableStateWithRetry()
438
+ syncEditorPresentation()
439
+ if (editable.value) {
440
+ editor.focus?.('start', { scrollIntoView: false })
441
+ await applyEditableStateWithRetry()
442
+ await ensureBlockImageNodeView()
337
443
  }
444
+ syncingContent.value = true
445
+ model.value = getRawHtml()
446
+ text.value = getPlainText()
447
+ syncingContent.value = false
448
+ }
338
449
 
339
- return result
450
+ async function onEditorCreated() {
451
+ await bootstrapEditor()
340
452
  }
341
453
 
342
- function initHtml(html: string) {
343
- html = customStringReplacement(html, '<img', '>', 'height="[0-9]+"', 'height="auto"')
344
- return convertPtToPx(html)
454
+ function onEditorChanged() {
455
+ if (!ready.value || syncingContent.value) return
456
+ publishModelFromEditor(false)
345
457
  }
346
458
 
347
- const stopWatchByType = (type: WatchType) => {
348
- const stopHandle = watchHandlers.value[type]
349
- if (stopHandle) {
350
- stopHandle()
351
- delete watchHandlers.value[type]
352
- }
459
+ function onEditorBlur() {
460
+ publishModelFromEditor(true)
461
+ emit('onBlur', { html: model.value ?? '', text: getPlainText() })
353
462
  }
463
+
354
464
  onMounted(() => {
355
- const config = {
356
- element: divRef.value as Element,
357
- content: initHtml(model.value ?? ''),
358
- ...defaultConfig,
359
- ...props.editorConfig,
360
- fontFamily: {
361
- values: [
362
- { name: '宋体', value: 'SimSun' },
363
- { name: '仿宋', value: 'FangSong' },
364
- { name: '黑体', value: 'SimHei' },
365
- { name: '楷体', value: 'KaiTi' },
366
- { name: '微软雅黑', value: 'Microsoft YaHei' },
367
- { name: '方正仿宋简体_GBK', value: 'FangSong_GB2312' },
368
- { name: 'Arial', value: 'Arial' },
369
- { name: 'Times New Roman', value: 'Times New Roman' },
370
- ],
371
- },
372
- onCreated: (editor: AiEditor) => {
373
- setFooter()
374
- stopWatchByType(WatchType.initWatch)
375
- watchHandlers.value[WatchType.initWatch] = watch(
376
- () => props.isEdit,
377
- (val) => {
378
- if (aiEditor) {
379
- aiEditor.setEditable(val)
380
- //头尾显隐
381
- // const footer = divRef.value?.querySelector('aie-footer') as HTMLElement
382
- // if (footer) {
383
- // footer.style.display = val ? '' : 'none'
384
- // }
385
- const header = divRef.value?.querySelector('aie-header') as HTMLElement
386
- if (header) {
387
- const div = header.querySelector('div') as HTMLElement
388
- div.style.justifyContent = val ? '' : 'end'
389
- const menuItems = header.querySelectorAll('.aie-menu-item:not(:last-child)')
390
- if (menuItems.length) {
391
- menuItems.forEach((item) => {
392
- item.style.display = val ? '' : 'none'
393
- })
394
- }
395
- }
396
- }
397
- },
398
- { immediate: true },
399
- )
400
- },
401
- }
402
- // 隐藏工具栏
403
- if (!props.showToolbar) {
404
- config.toolbarKeys = []
405
- }
406
- setTimeout(() => {
407
- aiEditor = new AiEditor(config)
408
- }, 100)
465
+ ensureUmoGlobals()
466
+ rootWasHidden = !isPanelVisible()
467
+ observePanelVisibility()
409
468
  })
410
- onActivated(() => {
411
- const header = divRef.value?.querySelector('aie-header') as HTMLElement
412
- if (header) {
413
- const div = header.querySelector('div') as HTMLElement
414
- div.style.justifyContent = props.isEdit ? '' : 'end'
415
- const menuItems = header.querySelectorAll('.aie-menu-item:not(:last-child)')
416
- if (menuItems.length) {
417
- menuItems.forEach((item) => {
418
- item.style.display = props.isEdit ? '' : 'none'
419
- })
420
- }
469
+
470
+ // editable 就绪后同步初始化,避免 onBeforeMount 时序问题
471
+ ensureUmoGlobals()
472
+ initUmoMountOptions()
473
+
474
+ onBeforeUnmount(() => {
475
+ clearVisibilityObserver()
476
+ ready.value = false
477
+ })
478
+
479
+ watch(
480
+ () => model.value,
481
+ (value) => {
482
+ if (!ready.value || syncingContent.value) return
483
+ const incoming = initHtml(value ?? '')
484
+ const current = getRawHtml()
485
+ if (incoming === current || (value ?? '') === current) return
486
+ applyEditorHtml(value ?? '', false)
487
+ },
488
+ )
489
+
490
+ watch(editable, async (now, prev) => {
491
+ if (prev === undefined) return
492
+ if (lastMountEditable.value === now) return
493
+ if (!umoMountOptions.value) return
494
+ if (ready.value) {
495
+ publishModelFromEditor(true)
421
496
  }
497
+ await remountEditor()
422
498
  })
423
- const setFooter = () => {
424
- const footer = divRef.value?.querySelector('aie-footer') as HTMLElement
425
- if (footer) {
426
- const footerSpan = footer.querySelector('span') as HTMLElement
427
- if (footerSpan && footerSpan.textContent) {
428
- footerSpan.textContent = footerSpan.textContent.replace(
429
- 'Powered by AiEditor, Characters',
430
- '字数',
431
- )
499
+
500
+ watch(
501
+ () => props.isEdit,
502
+ async (now, prev) => {
503
+ if (prev === undefined) return
504
+ if (now === prev) return
505
+ if (!umoMountOptions.value) return
506
+ if (ready.value) {
507
+ publishModelFromEditor(true)
432
508
  }
433
- }
434
- }
509
+ await remountEditor()
510
+ },
511
+ )
435
512
 
436
- onUnmounted(() => {
437
- aiEditor && aiEditor.destroy()
438
- })
513
+ watch(
514
+ () => props.showToolbar,
515
+ async () => {
516
+ if (!ready.value) return
517
+ await nextTick()
518
+ syncEditorPresentation()
519
+ },
520
+ )
521
+
522
+ watch(
523
+ () => editorRef.value,
524
+ () => {
525
+ void bootstrapEditor()
526
+ },
527
+ { flush: 'post' },
528
+ )
439
529
 
440
530
  defineExpose({
441
531
  getHtml: () => {
442
- if (aiEditor) {
443
- return aiEditor.getHtml()
444
- } else {
445
- return ''
446
- }
532
+ if (!ready.value) return model.value ?? ''
533
+ return finalizeHtml(getRawHtml(), getRootElement())
447
534
  },
448
535
  getText: () => {
449
- if (aiEditor) {
450
- return aiEditor.getText()
451
- } else {
452
- return ''
453
- }
536
+ if (!ready.value) return text.value ?? ''
537
+ return getPlainText()
454
538
  },
455
- setContent: (html: string, focus: boolean = false) => {
456
- if (aiEditor) {
457
- aiEditor.setContent(initHtml(html), focus)
539
+ setContent: (html: string, focus = false) => {
540
+ syncingContent.value = true
541
+ model.value = html
542
+ syncingContent.value = false
543
+ if (ready.value) {
544
+ applyEditorHtml(html, focus)
458
545
  }
459
546
  },
460
547
  })
548
+
549
+ onUnmounted(() => {
550
+ ready.value = false
551
+ umoMountOptions.value = null
552
+ clearVisibilityObserver()
553
+ releaseUmoDocumentStorageShim()
554
+ })
461
555
  </script>
556
+
462
557
  <style scoped lang="scss">
463
- :deep {
464
- .aie-container {
465
- border-width: v-bind(borderWidth);
466
- border-color: #dcdfe6;
467
- }
558
+ .umo-rich-text-editor-root {
559
+ /* 父级 el-flex align="center" 会把子项压成内容宽度,导致工具栏/状态栏竖排 */
560
+ align-self: stretch;
561
+ flex: 1 1 auto;
562
+ height: 100%;
563
+ width: 100%;
564
+ min-width: 0;
565
+ min-height: 280px;
566
+ box-sizing: border-box;
567
+ }
468
568
 
469
- .aie-content {
470
- p {
471
- margin: 6px 0;
472
- }
473
- }
569
+ :deep(.umo-rich-text-editor) {
570
+ width: 100%;
571
+ height: 100%;
572
+ border-width: v-bind(borderWidth);
573
+ border-style: solid;
574
+ border-color: #dcdfe6;
575
+ box-sizing: border-box;
576
+ }
577
+
578
+ :deep(.umo-editor-container) {
579
+ min-height: 240px;
580
+ width: 100%;
581
+ display: flex;
582
+ flex-direction: column;
583
+ overflow: hidden;
584
+ }
585
+
586
+ :deep(.umo-editor-container .umo-toolbar) {
587
+ flex-shrink: 0;
588
+ width: 100%;
589
+ }
590
+
591
+ :deep(.umo-editor-container .umo-footer) {
592
+ flex-shrink: 0;
593
+ width: 100%;
594
+ }
595
+
596
+ :deep(.umo-toolbar-container),
597
+ :deep(.umo-scrollable-container) {
598
+ width: 100%;
599
+ min-width: 0;
600
+ }
601
+
602
+ :deep(.umo-classic-menu),
603
+ :deep(.umo-virtual-group) {
604
+ flex-wrap: nowrap;
605
+ white-space: nowrap;
606
+ }
607
+
608
+ :deep(.umo-button__text),
609
+ :deep(.umo-menu-button .umo-button__text) {
610
+ writing-mode: horizontal-tb !important;
611
+ white-space: nowrap;
612
+ }
613
+
614
+ :deep(.umo-status-bar) {
615
+ width: 100%;
616
+ flex-wrap: nowrap;
617
+ }
618
+
619
+ :deep(.umo-editor-container .umo-main) {
620
+ flex: 1;
621
+ min-width: 0;
622
+ min-height: 0;
623
+ }
624
+
625
+ :deep(.umo-back-top) {
626
+ display: none !important;
627
+ }
628
+
629
+ /* 嵌入场景:隐藏快捷键抽屉(TDesign classPrefix=umo → .umo-drawer) */
630
+ :deep(.umo-status-bar-shortcut-btn) {
631
+ display: none !important;
632
+ }
633
+
634
+ :deep(.umo-editor-container .umo-drawer) {
635
+ display: none !important;
636
+ }
637
+
638
+ :deep(.umo-editor-content .ProseMirror) {
639
+ pointer-events: auto;
640
+ cursor: text;
641
+ min-height: 120px;
474
642
  }
475
643
  </style>