@opentiny/fluent-editor 4.0.0-alpha.13 → 4.0.0-alpha.15

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 (339) hide show
  1. package/README.md +88 -88
  2. package/es/attributors/line-height.es.js.map +1 -1
  3. package/es/config/base64-image.es.js.map +1 -1
  4. package/es/config/editor.config.es.js +27 -0
  5. package/es/config/editor.config.es.js.map +1 -1
  6. package/es/config/editor.utils.es.js.map +1 -1
  7. package/es/config/i18n/en-us.es.js.map +1 -1
  8. package/es/config/i18n/zh-cn.es.js.map +1 -1
  9. package/es/config/index.es.js +3 -1
  10. package/es/config/index.es.js.map +1 -1
  11. package/es/core/fluent-editor.es.js.map +1 -1
  12. package/es/fluent-editor.es.js.map +1 -1
  13. package/es/formats/emoji.es.js.map +1 -1
  14. package/es/formats/soft-break.es.js.map +1 -1
  15. package/es/formats/strike.es.js.map +1 -1
  16. package/es/formats/video.es.js.map +1 -1
  17. package/es/index.es.js +31 -2
  18. package/es/index.es.js.map +1 -1
  19. package/es/modules/ai/constants.es.js.map +1 -1
  20. package/es/modules/ai/icons.es.js.map +1 -1
  21. package/es/modules/ai/index.es.js.map +1 -1
  22. package/es/modules/collaborative-editing/awareness/awareness.es.js.map +1 -1
  23. package/es/modules/collaborative-editing/awareness/y-indexeddb.es.js.map +1 -1
  24. package/es/modules/collaborative-editing/collaborative-editing.es.js.map +1 -1
  25. package/es/modules/collaborative-editing/module.es.js.map +1 -1
  26. package/es/modules/collaborative-editing/provider/providerRegistry.es.js.map +1 -1
  27. package/es/modules/collaborative-editing/provider/webrtc.es.js.map +1 -1
  28. package/es/modules/collaborative-editing/provider/websocket.es.js.map +1 -1
  29. package/es/modules/counter.es.js.map +1 -1
  30. package/es/modules/custom-clipboard.es.js.map +1 -1
  31. package/es/modules/custom-image/actions/action.es.js.map +1 -1
  32. package/es/modules/custom-image/actions/custom-resize-action.es.js.map +1 -1
  33. package/es/modules/custom-image/actions/delete-action.es.js.map +1 -1
  34. package/es/modules/custom-image/blot-formatter.es.js.map +1 -1
  35. package/es/modules/custom-image/image.es.js.map +1 -1
  36. package/es/modules/custom-image/options.es.js.map +1 -1
  37. package/es/modules/custom-image/specs/blot-spec.es.js.map +1 -1
  38. package/es/modules/custom-image/specs/custom-image-spec.es.js.map +1 -1
  39. package/es/modules/custom-image/specs/image-spec.es.js.map +1 -1
  40. package/es/modules/divider.es.js.map +1 -1
  41. package/es/modules/emoji.es.js.map +1 -1
  42. package/es/modules/file/formats/file.es.js.map +1 -1
  43. package/es/modules/file/modules/file-bar.es.js.map +1 -1
  44. package/es/modules/file/modules/file-module.es.js.map +1 -1
  45. package/es/modules/flow-chart/config-utils.es.js.map +1 -1
  46. package/es/modules/flow-chart/formats/flow-chart-blot.es.js.map +1 -1
  47. package/es/modules/flow-chart/i18n/en-us.es.js.map +1 -1
  48. package/es/modules/flow-chart/i18n/index.es.js.map +1 -1
  49. package/es/modules/flow-chart/i18n/zh-cn.es.js.map +1 -1
  50. package/es/modules/flow-chart/icons.es.js.map +1 -1
  51. package/es/modules/flow-chart/index.es.js.map +1 -1
  52. package/es/modules/flow-chart/modules/context-menu.es.js.map +1 -1
  53. package/es/modules/flow-chart/modules/control-panel.es.js.map +1 -1
  54. package/es/modules/flow-chart/modules/custom-resize-action.es.js.map +1 -1
  55. package/es/modules/link/formats/link.es.js.map +1 -1
  56. package/es/modules/link/modules/tooltip.es.js.map +1 -1
  57. package/es/modules/mathlive/formats.es.js.map +1 -1
  58. package/es/modules/mathlive/tooltip.es.js.map +1 -1
  59. package/es/modules/mention/constants.es.js.map +1 -1
  60. package/es/modules/mention/mention-link.es.js.map +1 -1
  61. package/es/modules/mention/mention.es.js.map +1 -1
  62. package/es/modules/mind-map/config-utils.es.js.map +1 -1
  63. package/es/modules/mind-map/formats/mind-map-blot.es.js.map +1 -1
  64. package/es/modules/mind-map/i18n/en-us.es.js.map +1 -1
  65. package/es/modules/mind-map/i18n/index.es.js.map +1 -1
  66. package/es/modules/mind-map/i18n/zh-cn.es.js.map +1 -1
  67. package/es/modules/mind-map/icons.es.js.map +1 -1
  68. package/es/modules/mind-map/index.es.js.map +1 -1
  69. package/es/modules/mind-map/modules/context-menu.es.js.map +1 -1
  70. package/es/modules/mind-map/modules/control-panel.es.js.map +1 -1
  71. package/es/modules/mind-map/modules/custom-resize-action.es.js.map +1 -1
  72. package/es/modules/syntax.es.js.map +1 -1
  73. package/es/modules/toolbar/better-picker.es.js.map +1 -1
  74. package/es/themes/snow.es.js.map +1 -1
  75. package/es/tools/screenshot.es.js.map +1 -1
  76. package/es/ui/icons.config.es.js.map +1 -1
  77. package/es/ui/icons.es.js.map +1 -1
  78. package/es/utils/debounce.es.js.map +1 -1
  79. package/es/utils/merge.es.js.map +1 -1
  80. package/es/utils/method.es.js.map +1 -1
  81. package/lib/attributors/line-height.cjs.js.map +1 -1
  82. package/lib/config/base64-image.cjs.js.map +1 -1
  83. package/lib/config/editor.config.cjs.js +27 -0
  84. package/lib/config/editor.config.cjs.js.map +1 -1
  85. package/lib/config/editor.utils.cjs.js.map +1 -1
  86. package/lib/config/i18n/en-us.cjs.js.map +1 -1
  87. package/lib/config/i18n/zh-cn.cjs.js.map +1 -1
  88. package/lib/config/index.cjs.js +2 -0
  89. package/lib/config/index.cjs.js.map +1 -1
  90. package/lib/core/fluent-editor.cjs.js.map +1 -1
  91. package/lib/fluent-editor.cjs.js.map +1 -1
  92. package/lib/formats/emoji.cjs.js.map +1 -1
  93. package/lib/formats/soft-break.cjs.js.map +1 -1
  94. package/lib/formats/strike.cjs.js.map +1 -1
  95. package/lib/formats/video.cjs.js.map +1 -1
  96. package/lib/index.cjs.js +39 -10
  97. package/lib/index.cjs.js.map +1 -1
  98. package/lib/modules/ai/constants.cjs.js.map +1 -1
  99. package/lib/modules/ai/icons.cjs.js.map +1 -1
  100. package/lib/modules/ai/index.cjs.js.map +1 -1
  101. package/lib/modules/collaborative-editing/awareness/awareness.cjs.js.map +1 -1
  102. package/lib/modules/collaborative-editing/awareness/y-indexeddb.cjs.js.map +1 -1
  103. package/lib/modules/collaborative-editing/collaborative-editing.cjs.js.map +1 -1
  104. package/lib/modules/collaborative-editing/module.cjs.js.map +1 -1
  105. package/lib/modules/collaborative-editing/provider/providerRegistry.cjs.js.map +1 -1
  106. package/lib/modules/collaborative-editing/provider/webrtc.cjs.js.map +1 -1
  107. package/lib/modules/collaborative-editing/provider/websocket.cjs.js.map +1 -1
  108. package/lib/modules/counter.cjs.js.map +1 -1
  109. package/lib/modules/custom-clipboard.cjs.js.map +1 -1
  110. package/lib/modules/custom-image/actions/action.cjs.js.map +1 -1
  111. package/lib/modules/custom-image/actions/custom-resize-action.cjs.js.map +1 -1
  112. package/lib/modules/custom-image/actions/delete-action.cjs.js.map +1 -1
  113. package/lib/modules/custom-image/blot-formatter.cjs.js.map +1 -1
  114. package/lib/modules/custom-image/image.cjs.js.map +1 -1
  115. package/lib/modules/custom-image/options.cjs.js.map +1 -1
  116. package/lib/modules/custom-image/specs/blot-spec.cjs.js.map +1 -1
  117. package/lib/modules/custom-image/specs/custom-image-spec.cjs.js.map +1 -1
  118. package/lib/modules/custom-image/specs/image-spec.cjs.js.map +1 -1
  119. package/lib/modules/divider.cjs.js.map +1 -1
  120. package/lib/modules/emoji.cjs.js.map +1 -1
  121. package/lib/modules/file/formats/file.cjs.js.map +1 -1
  122. package/lib/modules/file/modules/file-bar.cjs.js.map +1 -1
  123. package/lib/modules/file/modules/file-module.cjs.js.map +1 -1
  124. package/lib/modules/flow-chart/config-utils.cjs.js.map +1 -1
  125. package/lib/modules/flow-chart/formats/flow-chart-blot.cjs.js.map +1 -1
  126. package/lib/modules/flow-chart/i18n/en-us.cjs.js.map +1 -1
  127. package/lib/modules/flow-chart/i18n/index.cjs.js.map +1 -1
  128. package/lib/modules/flow-chart/i18n/zh-cn.cjs.js.map +1 -1
  129. package/lib/modules/flow-chart/icons.cjs.js.map +1 -1
  130. package/lib/modules/flow-chart/index.cjs.js.map +1 -1
  131. package/lib/modules/flow-chart/modules/context-menu.cjs.js.map +1 -1
  132. package/lib/modules/flow-chart/modules/control-panel.cjs.js.map +1 -1
  133. package/lib/modules/flow-chart/modules/custom-resize-action.cjs.js.map +1 -1
  134. package/lib/modules/link/formats/link.cjs.js.map +1 -1
  135. package/lib/modules/link/modules/tooltip.cjs.js.map +1 -1
  136. package/lib/modules/mathlive/formats.cjs.js.map +1 -1
  137. package/lib/modules/mathlive/tooltip.cjs.js.map +1 -1
  138. package/lib/modules/mention/constants.cjs.js.map +1 -1
  139. package/lib/modules/mention/mention-link.cjs.js.map +1 -1
  140. package/lib/modules/mention/mention.cjs.js.map +1 -1
  141. package/lib/modules/mind-map/config-utils.cjs.js.map +1 -1
  142. package/lib/modules/mind-map/formats/mind-map-blot.cjs.js.map +1 -1
  143. package/lib/modules/mind-map/i18n/en-us.cjs.js.map +1 -1
  144. package/lib/modules/mind-map/i18n/index.cjs.js.map +1 -1
  145. package/lib/modules/mind-map/i18n/zh-cn.cjs.js.map +1 -1
  146. package/lib/modules/mind-map/icons.cjs.js.map +1 -1
  147. package/lib/modules/mind-map/index.cjs.js.map +1 -1
  148. package/lib/modules/mind-map/modules/context-menu.cjs.js.map +1 -1
  149. package/lib/modules/mind-map/modules/control-panel.cjs.js.map +1 -1
  150. package/lib/modules/mind-map/modules/custom-resize-action.cjs.js.map +1 -1
  151. package/lib/modules/syntax.cjs.js.map +1 -1
  152. package/lib/modules/toolbar/better-picker.cjs.js.map +1 -1
  153. package/lib/themes/snow.cjs.js.map +1 -1
  154. package/lib/tools/screenshot.cjs.js.map +1 -1
  155. package/lib/ui/icons.cjs.js.map +1 -1
  156. package/lib/ui/icons.config.cjs.js.map +1 -1
  157. package/lib/utils/debounce.cjs.js.map +1 -1
  158. package/lib/utils/merge.cjs.js.map +1 -1
  159. package/lib/utils/method.cjs.js.map +1 -1
  160. package/package.json +1 -1
  161. package/patches/quill@2.0.3.patch +33 -33
  162. package/scripts/apply-patches.cjs +248 -248
  163. package/style.css +1 -1
  164. package/types/attributors/font-size.d.ts +1 -1
  165. package/types/attributors/font-style.d.ts +1 -1
  166. package/types/attributors/index.d.ts +4 -4
  167. package/types/attributors/line-height.d.ts +1 -1
  168. package/types/attributors/text-indent.d.ts +1 -1
  169. package/types/config/base64-image.d.ts +2 -2
  170. package/types/config/editor.config.d.ts +55 -11
  171. package/types/config/editor.utils.d.ts +40 -40
  172. package/types/config/i18n/en-us.d.ts +125 -125
  173. package/types/config/i18n/zh-cn.d.ts +125 -125
  174. package/types/config/index.d.ts +7 -7
  175. package/types/config/types/additional-toolbar-item.interface.d.ts +8 -0
  176. package/types/config/types/content-change.interface.d.ts +13 -0
  177. package/types/config/types/content-save.interface.d.ts +6 -0
  178. package/types/config/types/counter-option.interface.d.ts +9 -0
  179. package/types/config/types/editor-config.interface.d.ts +12 -11
  180. package/types/config/types/editor-modules.interface.d.ts +39 -38
  181. package/types/config/types/editor-toolbar.interface.d.ts +6 -0
  182. package/types/config/types/file-operation.interface.d.ts +12 -0
  183. package/types/config/types/focus-change.interface.d.ts +4 -0
  184. package/types/config/types/fullscreen-module.interface.d.ts +4 -0
  185. package/types/config/types/help-panel-item.interface.d.ts +5 -0
  186. package/types/config/types/help-panel-option.interface.d.ts +7 -0
  187. package/types/config/types/image-module.interface.d.ts +3 -0
  188. package/types/config/types/image-upload.interface.d.ts +7 -0
  189. package/types/config/types/index.d.ts +3 -3
  190. package/types/config/types/load-on-demand-module.interface.d.ts +5 -0
  191. package/types/config/types/mention-module.interface.d.ts +8 -0
  192. package/types/config/types/paste-change.interface.d.ts +6 -0
  193. package/types/config/types/quick-menu-module.interface.d.ts +3 -0
  194. package/types/config/types/range.interface.d.ts +4 -0
  195. package/types/config/types/registry-options.interface.d.ts +5 -0
  196. package/types/config/types/selection-change.interface.d.ts +8 -0
  197. package/types/config/types/toolbar-item.interface.d.ts +13 -0
  198. package/types/config/types/type.d.ts +2 -2
  199. package/types/config/types/validate-error.interface.d.ts +13 -0
  200. package/types/core/fluent-editor.d.ts +11 -10
  201. package/types/fluent-editor.d.ts +2 -1
  202. package/types/formats/emoji.d.ts +8 -7
  203. package/types/formats/index.d.ts +4 -4
  204. package/types/formats/soft-break.d.ts +12 -11
  205. package/types/formats/strike.d.ts +8 -7
  206. package/types/formats/video.d.ts +13 -12
  207. package/types/index.d.ts +8 -7
  208. package/types/modules/ai/constants.d.ts +30 -30
  209. package/types/modules/ai/icons.d.ts +21 -21
  210. package/types/modules/ai/index.d.ts +94 -93
  211. package/types/modules/ai/types.d.ts +16 -16
  212. package/types/modules/collaborative-editing/awareness/awareness.d.ts +26 -25
  213. package/types/modules/collaborative-editing/awareness/index.d.ts +2 -2
  214. package/types/modules/collaborative-editing/awareness/y-indexeddb.d.ts +3 -2
  215. package/types/modules/collaborative-editing/collaborative-editing.d.ts +21 -20
  216. package/types/modules/collaborative-editing/index.d.ts +2 -2
  217. package/types/modules/collaborative-editing/module.d.ts +11 -10
  218. package/types/modules/collaborative-editing/provider/index.d.ts +3 -3
  219. package/types/modules/collaborative-editing/provider/providerRegistry.d.ts +25 -24
  220. package/types/modules/collaborative-editing/provider/webrtc.d.ts +34 -33
  221. package/types/modules/collaborative-editing/provider/websocket.d.ts +38 -37
  222. package/types/modules/collaborative-editing/types.d.ts +46 -45
  223. package/types/modules/counter.d.ts +22 -21
  224. package/types/modules/custom-clipboard.d.ts +24 -23
  225. package/types/modules/custom-image/BlotFormatter.d.ts +29 -0
  226. package/types/modules/custom-image/{options.d.ts → Options.d.ts} +46 -45
  227. package/types/modules/custom-image/actions/{action.d.ts → Action.d.ts} +8 -7
  228. package/types/modules/custom-image/actions/CustomResizeAction.d.ts +24 -0
  229. package/types/modules/custom-image/actions/DeleteAction.d.ts +7 -0
  230. package/types/modules/custom-image/actions/custom-resize-action.d.ts +23 -22
  231. package/types/modules/custom-image/actions/delete-action.d.ts +6 -5
  232. package/types/modules/custom-image/actions/image-toolbar-buttons.d.ts +16 -15
  233. package/types/modules/custom-image/actions/index.d.ts +6 -6
  234. package/types/modules/custom-image/actions/toolbar-action.d.ts +8 -7
  235. package/types/modules/custom-image/actions/toolbar.d.ts +17 -16
  236. package/types/modules/custom-image/blot-formatter.d.ts +20 -19
  237. package/types/modules/custom-image/image-bar.d.ts +15 -0
  238. package/types/modules/custom-image/image.d.ts +27 -26
  239. package/types/modules/custom-image/index.d.ts +4 -4
  240. package/types/modules/custom-image/specs/BlotSpec.d.ts +13 -0
  241. package/types/modules/custom-image/specs/CustomImageSpec.d.ts +21 -0
  242. package/types/modules/custom-image/specs/ImageSpec.d.ts +10 -0
  243. package/types/modules/custom-image/specs/blot-spec.d.ts +11 -10
  244. package/types/modules/custom-image/specs/custom-image-spec.d.ts +16 -15
  245. package/types/modules/custom-image/specs/image-spec.d.ts +8 -7
  246. package/types/modules/custom-image/specs/index.d.ts +3 -3
  247. package/types/modules/custom-uploader.d.ts +38 -37
  248. package/types/modules/divider.d.ts +8 -7
  249. package/types/modules/emoji/emoji-list/index.d.ts +1 -0
  250. package/types/modules/emoji/emoji-list/people.d.ts +1 -0
  251. package/types/modules/emoji/emoji-list.d.ts +2 -0
  252. package/types/modules/emoji/emoji-map.d.ts +2 -0
  253. package/types/modules/emoji/emoji-sprite.d.ts +1 -0
  254. package/types/modules/emoji/formats/emoji-blot.d.ts +13 -0
  255. package/types/modules/emoji/index.d.ts +10 -0
  256. package/types/modules/emoji/modules/emoji.d.ts +38 -0
  257. package/types/modules/emoji/modules/toolbar-emoji.d.ts +8 -0
  258. package/types/modules/emoji/utils.d.ts +1 -0
  259. package/types/modules/emoji.d.ts +36 -35
  260. package/types/modules/file/formats/file.d.ts +18 -17
  261. package/types/modules/file/index.d.ts +3 -3
  262. package/types/modules/file/modules/file-bar.d.ts +14 -14
  263. package/types/modules/file/modules/file-module.d.ts +8 -7
  264. package/types/modules/flow-chart/config-utils.d.ts +10 -9
  265. package/types/modules/flow-chart/formats/flow-chart-blot.d.ts +41 -40
  266. package/types/modules/flow-chart/i18n/en-us.d.ts +26 -26
  267. package/types/modules/flow-chart/i18n/index.d.ts +1 -1
  268. package/types/modules/flow-chart/i18n/zh-cn.d.ts +26 -26
  269. package/types/modules/flow-chart/icons.d.ts +12 -12
  270. package/types/modules/flow-chart/index.d.ts +9 -8
  271. package/types/modules/flow-chart/modules/context-menu.d.ts +2 -1
  272. package/types/modules/flow-chart/modules/control-panel.d.ts +2 -1
  273. package/types/modules/flow-chart/modules/custom-resize-action.d.ts +22 -22
  274. package/types/modules/flow-chart/options.d.ts +29 -29
  275. package/types/modules/global-link/constants.d.ts +3 -0
  276. package/types/modules/global-link/formats/customer-widget-link.d.ts +14 -0
  277. package/types/modules/global-link/formats/doc-link.d.ts +17 -0
  278. package/types/modules/global-link/formats/wiki-link.d.ts +16 -0
  279. package/types/modules/global-link/formats/work-item-link.d.ts +16 -0
  280. package/types/modules/global-link/global-link-panel.d.ts +19 -0
  281. package/types/modules/global-link/index.d.ts +18 -0
  282. package/types/modules/global-link/utils/createTable.d.ts +1 -0
  283. package/types/modules/i18n.d.ts +14 -13
  284. package/types/modules/index.d.ts +18 -18
  285. package/types/modules/link/formats/link.d.ts +15 -14
  286. package/types/modules/link/index.d.ts +2 -2
  287. package/types/modules/link/modules/tooltip.d.ts +26 -25
  288. package/types/modules/mathlive/formats.d.ts +21 -20
  289. package/types/modules/mathlive/index.d.ts +3 -3
  290. package/types/modules/mathlive/module.d.ts +8 -7
  291. package/types/modules/mathlive/tooltip.d.ts +15 -14
  292. package/types/modules/mention/{mention.d.ts → Mention.d.ts} +53 -52
  293. package/types/modules/mention/MentionLink.d.ts +16 -0
  294. package/types/modules/mention/constants.d.ts +3 -3
  295. package/types/modules/mention/index.d.ts +2 -2
  296. package/types/modules/mention/mention-link.d.ts +15 -14
  297. package/types/modules/mind-map/config-utils.d.ts +12 -11
  298. package/types/modules/mind-map/formats/mind-map-blot.d.ts +42 -41
  299. package/types/modules/mind-map/i18n/en-us.d.ts +25 -25
  300. package/types/modules/mind-map/i18n/index.d.ts +1 -1
  301. package/types/modules/mind-map/i18n/zh-cn.d.ts +25 -25
  302. package/types/modules/mind-map/icons.d.ts +21 -21
  303. package/types/modules/mind-map/index.d.ts +9 -8
  304. package/types/modules/mind-map/modules/context-menu.d.ts +2 -1
  305. package/types/modules/mind-map/modules/control-panel.d.ts +2 -1
  306. package/types/modules/mind-map/modules/custom-resize-action.d.ts +23 -23
  307. package/types/modules/mind-map/options.d.ts +27 -27
  308. package/types/modules/quick-menu.d.ts +22 -0
  309. package/types/modules/shortcut-key/index.d.ts +68 -67
  310. package/types/modules/syntax.d.ts +13 -12
  311. package/types/modules/table/better-table.d.ts +35 -0
  312. package/types/modules/table/formats/header.d.ts +23 -0
  313. package/types/modules/table/formats/list.d.ts +34 -0
  314. package/types/modules/table/formats/table.d.ts +147 -0
  315. package/types/modules/table/modules/table-column-tool.d.ts +23 -0
  316. package/types/modules/table/modules/table-operation-menu.d.ts +38 -0
  317. package/types/modules/table/modules/table-scroll-bar.d.ts +33 -0
  318. package/types/modules/table/modules/table-selection.d.ts +37 -0
  319. package/types/modules/table/modules/table-selector.d.ts +22 -0
  320. package/types/modules/table/table-config.d.ts +38 -0
  321. package/types/modules/table/utils/index.d.ts +17 -0
  322. package/types/modules/table/utils/node-matchers.d.ts +9 -0
  323. package/types/modules/table-up/index.d.ts +33 -32
  324. package/types/modules/toolbar/better-picker.d.ts +14 -13
  325. package/types/modules/toolbar/better-toolbar.d.ts +7 -6
  326. package/types/modules/toolbar/index.d.ts +3 -3
  327. package/types/modules/toolbar/toolbar-tip.d.ts +8 -7
  328. package/types/themes/snow.d.ts +10 -9
  329. package/types/tools/format-painter.d.ts +13 -12
  330. package/types/tools/fullscreen.d.ts +5 -4
  331. package/types/tools/screenshot.d.ts +18 -17
  332. package/types/ui/icons.config.d.ts +40 -40
  333. package/types/ui/icons.d.ts +6 -6
  334. package/types/utils/debounce.d.ts +6 -6
  335. package/types/utils/image.d.ts +1 -1
  336. package/types/utils/is.d.ts +6 -6
  337. package/types/utils/merge.d.ts +7 -7
  338. package/types/utils/method.d.ts +6 -6
  339. package/types/utils/scroll-lock.d.ts +6 -6
@@ -1 +1 @@
1
- {"version":3,"file":"control-panel.cjs.js","sources":["../../../../../src/modules/flow-chart/modules/control-panel.ts"],"sourcesContent":["import type FluentEditor from '../../../core/fluent-editor'\nimport type FlowChartPlaceholderBlot from '../formats/flow-chart-blot'\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\nimport { I18N } from '../../../modules/i18n'\nimport { registerFlowChartI18N } from '../i18n'\nimport { backIcon, bezierIcon, contractIcon, fitIcon, forwardIcon, lineIcon, polyLineIcon, screenReduceIcon, screenTypeIcon, zoomInIcon, zoomOutIcon } from '../icons'\n\nclass FlowChartControlPanelHandler {\n private texts: Record<string, string>\n private lang: string\n getText(key: keyof Record<string, string>): string {\n return this.texts[key]\n }\n\n constructor(private quill: FluentEditor, private blot: FlowChartPlaceholderBlot) {\n const i18nModule = this.quill.getModule('i18n') as I18N\n registerFlowChartI18N(I18N)\n this.lang = i18nModule.options.lang\n this.texts = this.resolveTexts()\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, (lang: string) => {\n this.lang = lang\n this.texts = this.resolveTexts()\n this.updateControlPanelTexts()\n })\n }\n\n resolveTexts() {\n return {\n exportTitle: I18N.parserText('flowChart.controlPanel.exportTitle', this.lang),\n zoomOutTitle: I18N.parserText('flowChart.controlPanel.zoomOutTitle', this.lang),\n zoomInTitle: I18N.parserText('flowChart.controlPanel.zoomInTitle', this.lang),\n fitTitle: I18N.parserText('flowChart.controlPanel.fitTitle', this.lang),\n backTitle: I18N.parserText('flowChart.controlPanel.backTitle', this.lang),\n forwardTitle: I18N.parserText('flowChart.controlPanel.forwardTitle', this.lang),\n setEdgeTypeTitle: I18N.parserText('flowChart.controlPanel.setEdgeTypeTitle', this.lang),\n panelStatusTitle: I18N.parserText('flowChart.controlPanel.panelStatusTitle', this.lang),\n screenTypeTitle: I18N.parserText('flowChart.controlPanel.screenTypeTitle', this.lang),\n }\n }\n\n updateControlPanelTexts() {\n const controlItems = this.blot.domNode.querySelectorAll('.ql-flow-chart-control-item')\n\n const controlItemMap: Record<string, string> = {\n 'zoom-out': 'zoomOutTitle',\n 'zoom-in': 'zoomInTitle',\n 'fit': 'fitTitle',\n 'back': 'backTitle',\n 'forward': 'forwardTitle',\n 'set-edge-type': 'setEdgeTypeTitle',\n 'panel-status': 'panelStatusTitle',\n 'screen-type': 'screenTypeTitle',\n }\n\n controlItems.forEach((item) => {\n const controlType = (item as HTMLElement).dataset.controlType\n if (controlType && controlItemMap[controlType] && this.texts[controlItemMap[controlType]]) {\n (item as HTMLElement).title = this.texts[controlItemMap[controlType]]\n }\n })\n }\n}\n\nconst controlPanelHandlers = new WeakMap<FlowChartPlaceholderBlot, FlowChartControlPanelHandler>()\n\nconst DISABLED_OPACITY = '0.5'\nconst ENABLED_OPACITY = '1'\nexport function createControlPanel(blot: FlowChartPlaceholderBlot, quill: FluentEditor): void {\n // 中间的控制面板\n const controlPanel = document.createElement('div')\n controlPanel.className = 'ql-flow-chart-control'\n // 右上的控制面板\n const controlRightUpPanel = document.createElement('div')\n controlRightUpPanel.className = 'ql-flow-chart-right-up-control'\n\n const handler = new FlowChartControlPanelHandler(quill, blot)\n controlPanelHandlers.set(blot, handler)\n const zoomOutBtn = createControlItem('zoom-out', handler.getText('zoomOutTitle'), () => handleZoomOut(blot))\n const zoomInBtn = createControlItem('zoom-in', handler.getText('zoomInTitle'), () => handleZoomIn(blot))\n const resetBtn = createControlItem('fit', handler.getText('fitTitle'), () => handleResetZoom(blot))\n const backBtn = createControlItem('back', handler.getText('backTitle'), () => handleUndo(blot))\n const forwardBtn = createControlItem('forward', handler.getText('forwardTitle'), () => handleRedo(blot))\n const setEdgeTypeBtn = createControlItem('set-edge-type', handler.getText('setEdgeTypeTitle'), () => handleSetEdgeType(blot))\n const panelStatusBtn = createControlItem('panel-status', handler.getText('panelStatusTitle'))\n const screenTypeBtn = createControlItem('screen-type', handler.getText('screenTypeTitle'), () => handleScreenTypeBtn(blot))\n\n const updateButtonState = (historyData: any) => {\n if (!historyData.data) {\n backBtn.style.opacity = DISABLED_OPACITY\n backBtn.style.cursor = 'not-allowed'\n forwardBtn.style.opacity = DISABLED_OPACITY\n forwardBtn.style.cursor = 'not-allowed'\n return\n }\n const isUndoAvailable = historyData.data.undoAble || historyData.data.undos.length < 0\n const isRedoAvailable = historyData.data.redoAble || historyData.data.redos.length > 0\n\n if (backBtn) {\n backBtn.style.opacity = isUndoAvailable ? ENABLED_OPACITY : DISABLED_OPACITY\n backBtn.style.cursor = isUndoAvailable ? 'pointer' : 'not-allowed'\n }\n\n if (forwardBtn) {\n forwardBtn.style.opacity = isRedoAvailable ? ENABLED_OPACITY : DISABLED_OPACITY\n forwardBtn.style.cursor = isRedoAvailable ? 'pointer' : 'not-allowed'\n }\n }\n updateButtonState(blot.flowChart.history)\n blot.flowChart.on('history:change', (data: any) => {\n updateButtonState(data)\n })\n\n setTimeout(() => {\n const controlLeftUpPanel = blot.domNode.querySelector('.lf-dndpanel') as HTMLElement | null\n controlLeftUpPanel.append(setEdgeTypeBtn)\n }, 0)\n controlRightUpPanel.append(panelStatusBtn)\n blot.domNode.appendChild(controlRightUpPanel)\n controlPanel.append(zoomOutBtn, zoomInBtn, resetBtn, screenTypeBtn, backBtn, forwardBtn)\n blot.domNode.appendChild(controlPanel)\n}\n\nfunction handleUndo(blot: FlowChartPlaceholderBlot): void {\n if (blot.flowChart) {\n blot.flowChart.undo()\n }\n}\n\nfunction handleRedo(blot: FlowChartPlaceholderBlot): void {\n if (blot.flowChart) {\n blot.flowChart.redo()\n }\n}\n\nfunction handleZoomIn(blot: FlowChartPlaceholderBlot): void {\n if (blot.flowChart) {\n blot.flowChart.zoom(true)\n }\n}\n\nfunction handleZoomOut(blot: FlowChartPlaceholderBlot): void {\n if (blot.flowChart) {\n blot.flowChart.zoom(false)\n }\n}\n\nfunction handleResetZoom(blot: FlowChartPlaceholderBlot): void {\n if (blot.flowChart) {\n blot.flowChart.resetZoom()\n }\n}\n\nfunction createControlItem(iconClass: string, title: string, onClick?: () => void, disabled = false) {\n const controlItem = document.createElement('div')\n controlItem.className = 'ql-flow-chart-control-item'\n controlItem.title = title\n controlItem.dataset.controlType = iconClass\n controlItem.style.cursor = disabled ? 'not-allowed' : 'pointer'\n\n const iconMap: Record<string, string> = {\n 'back': backIcon,\n 'forward': forwardIcon,\n 'zoom-out': zoomOutIcon,\n 'zoom-in': zoomInIcon,\n 'fit': fitIcon,\n 'screen-type': screenTypeIcon,\n 'panel-status': contractIcon,\n 'set-edge-type': lineIcon,\n }\n\n const icon = document.createElement('i')\n icon.innerHTML = iconMap[iconClass] || ''\n controlItem.appendChild(icon)\n\n if (!disabled) {\n controlItem.addEventListener('click', onClick)\n }\n\n return controlItem\n}\n\nfunction handleSetEdgeType(blot: FlowChartPlaceholderBlot): void {\n const controlLeftUpPanel = blot.domNode.querySelector('.lf-dndpanel') as HTMLElement | null\n if (!controlLeftUpPanel) return\n let edgeTypePanel = controlLeftUpPanel.querySelector('.ql-flow-chart-edge-panel') as HTMLElement\n if (!edgeTypePanel) {\n edgeTypePanel = document.createElement('div')\n edgeTypePanel.className = 'ql-flow-chart-edge-panel'\n edgeTypePanel.style.display = 'flex'\n edgeTypePanel.style.justifyContent = 'space-around'\n edgeTypePanel.style.flexWrap = 'nowrap'\n edgeTypePanel.style.width = 'auto'\n edgeTypePanel.style.minWidth = '100%'\n edgeTypePanel.style.padding = '8px'\n edgeTypePanel.style.boxSizing = 'border-box'\n edgeTypePanel.style.position = 'absolute'\n edgeTypePanel.style.top = '170px'\n controlLeftUpPanel.appendChild(edgeTypePanel)\n\n const edgeTypes = [\n {\n name: 'line',\n displayName: '直线',\n icon: lineIcon,\n },\n {\n name: 'polyline',\n displayName: '折线',\n icon: polyLineIcon,\n },\n {\n name: 'bezier',\n displayName: '贝塞尔曲线',\n icon: bezierIcon,\n },\n ]\n\n edgeTypes.forEach((edgeType) => {\n const edgeItem = document.createElement('div')\n edgeItem.className = 'ql-flow-chart-edge-item'\n edgeItem.style.padding = '8px'\n edgeItem.style.cursor = 'pointer'\n edgeItem.style.textAlign = 'center'\n\n const edgeIcon = document.createElement('div')\n edgeIcon.className = `ql-flow-chart-edge-type-icon`\n edgeIcon.style.width = '24px'\n edgeIcon.style.height = '24px'\n edgeIcon.style.margin = '0 auto'\n if (edgeType.icon) {\n edgeIcon.innerHTML = edgeType.icon\n }\n\n edgeItem.appendChild(edgeIcon)\n\n edgeItem.addEventListener('click', () => {\n const { edges = [] } = blot.flowChart.getSelectElements()\n if (edges.length > 0) {\n edges.forEach((edge) => {\n blot.flowChart.changeEdgeType(edge.id, edgeType.name)\n })\n blot.data = blot.flowChart.getGraphData()\n blot.domNode.setAttribute('data-flow-chart', JSON.stringify(blot.data))\n }\n\n edgeTypePanel.style.display = 'none'\n })\n edgeTypePanel.appendChild(edgeItem)\n })\n }\n else {\n edgeTypePanel.style.display = 'flex'\n edgeTypePanel.style.justifyContent = 'space-around'\n edgeTypePanel.style.flexWrap = 'nowrap'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let setEdgeTypeBtn: HTMLElement | null = null\n const controlItems = controlLeftUpPanel.querySelectorAll('.ql-flow-chart-control-item')\n controlItems.forEach((item) => {\n const iconEl = item.querySelector('i')\n if (iconEl && iconEl.className.includes('set-edge-type')) {\n setEdgeTypeBtn = item as HTMLElement\n }\n })\n if (!edgeTypePanel.contains(e.target as Node)\n && (!setEdgeTypeBtn || !setEdgeTypeBtn.contains(e.target as Node))) {\n edgeTypePanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n\n document.removeEventListener('click', handleOutsideClick)\n setTimeout(() => {\n document.addEventListener('click', handleOutsideClick)\n }, 0)\n}\n\nfunction handleScreenTypeBtn(blot: FlowChartPlaceholderBlot): void {\n const screenTypeBtn = blot.domNode.querySelector('[data-control-type=\"screen-type\"]') as HTMLElement | null\n if (!screenTypeBtn || !blot.domNode) return\n\n const flowChartContainer = blot.domNode\n const isFullscreen = flowChartContainer.style.position === 'fixed'\n\n if (isFullscreen) {\n const originalPosition = flowChartContainer.getAttribute('data-original-position')\n const originalWidth = flowChartContainer.getAttribute('data-original-width')\n const originalHeight = flowChartContainer.getAttribute('data-original-height')\n if (originalWidth && originalHeight) {\n flowChartContainer.style.position = originalPosition\n flowChartContainer.style.width = originalWidth\n flowChartContainer.style.height = originalHeight\n flowChartContainer.style.zIndex = '0'\n }\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenTypeIcon\n }\n }\n else {\n flowChartContainer.setAttribute('data-original-position', flowChartContainer.style.position || '')\n flowChartContainer.setAttribute('data-original-width', flowChartContainer.style.width || '')\n flowChartContainer.setAttribute('data-original-height', flowChartContainer.style.height || '')\n flowChartContainer.style.position = 'fixed'\n flowChartContainer.style.top = '0'\n flowChartContainer.style.left = '0'\n flowChartContainer.style.width = '100vw'\n flowChartContainer.style.height = '100vh'\n flowChartContainer.style.zIndex = '100'\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenReduceIcon\n }\n }\n blot.flowChart.resize()\n blot.flowChart.translateCenter()\n}\n"],"names":["registerFlowChartI18N","I18N","CHANGE_LANGUAGE_EVENT","backIcon","forwardIcon","zoomOutIcon","zoomInIcon","fitIcon","screenTypeIcon","contractIcon","lineIcon","polyLineIcon","bezierIcon","screenReduceIcon"],"mappings":"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"}
1
+ {"version":3,"file":"control-panel.cjs.js","sources":["../../../../../src/modules/flow-chart/modules/control-panel.ts"],"sourcesContent":["import type FluentEditor from '../../../core/fluent-editor'\r\nimport type FlowChartPlaceholderBlot from '../formats/flow-chart-blot'\r\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\r\nimport { I18N } from '../../../modules/i18n'\r\nimport { registerFlowChartI18N } from '../i18n'\r\nimport { backIcon, bezierIcon, contractIcon, fitIcon, forwardIcon, lineIcon, polyLineIcon, screenReduceIcon, screenTypeIcon, zoomInIcon, zoomOutIcon } from '../icons'\r\n\r\nclass FlowChartControlPanelHandler {\r\n private texts: Record<string, string>\r\n private lang: string\r\n getText(key: keyof Record<string, string>): string {\r\n return this.texts[key]\r\n }\r\n\r\n constructor(private quill: FluentEditor, private blot: FlowChartPlaceholderBlot) {\r\n const i18nModule = this.quill.getModule('i18n') as I18N\r\n registerFlowChartI18N(I18N)\r\n this.lang = i18nModule.options.lang\r\n this.texts = this.resolveTexts()\r\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, (lang: string) => {\r\n this.lang = lang\r\n this.texts = this.resolveTexts()\r\n this.updateControlPanelTexts()\r\n })\r\n }\r\n\r\n resolveTexts() {\r\n return {\r\n exportTitle: I18N.parserText('flowChart.controlPanel.exportTitle', this.lang),\r\n zoomOutTitle: I18N.parserText('flowChart.controlPanel.zoomOutTitle', this.lang),\r\n zoomInTitle: I18N.parserText('flowChart.controlPanel.zoomInTitle', this.lang),\r\n fitTitle: I18N.parserText('flowChart.controlPanel.fitTitle', this.lang),\r\n backTitle: I18N.parserText('flowChart.controlPanel.backTitle', this.lang),\r\n forwardTitle: I18N.parserText('flowChart.controlPanel.forwardTitle', this.lang),\r\n setEdgeTypeTitle: I18N.parserText('flowChart.controlPanel.setEdgeTypeTitle', this.lang),\r\n panelStatusTitle: I18N.parserText('flowChart.controlPanel.panelStatusTitle', this.lang),\r\n screenTypeTitle: I18N.parserText('flowChart.controlPanel.screenTypeTitle', this.lang),\r\n }\r\n }\r\n\r\n updateControlPanelTexts() {\r\n const controlItems = this.blot.domNode.querySelectorAll('.ql-flow-chart-control-item')\r\n\r\n const controlItemMap: Record<string, string> = {\r\n 'zoom-out': 'zoomOutTitle',\r\n 'zoom-in': 'zoomInTitle',\r\n 'fit': 'fitTitle',\r\n 'back': 'backTitle',\r\n 'forward': 'forwardTitle',\r\n 'set-edge-type': 'setEdgeTypeTitle',\r\n 'panel-status': 'panelStatusTitle',\r\n 'screen-type': 'screenTypeTitle',\r\n }\r\n\r\n controlItems.forEach((item) => {\r\n const controlType = (item as HTMLElement).dataset.controlType\r\n if (controlType && controlItemMap[controlType] && this.texts[controlItemMap[controlType]]) {\r\n (item as HTMLElement).title = this.texts[controlItemMap[controlType]]\r\n }\r\n })\r\n }\r\n}\r\n\r\nconst controlPanelHandlers = new WeakMap<FlowChartPlaceholderBlot, FlowChartControlPanelHandler>()\r\n\r\nconst DISABLED_OPACITY = '0.5'\r\nconst ENABLED_OPACITY = '1'\r\nexport function createControlPanel(blot: FlowChartPlaceholderBlot, quill: FluentEditor): void {\r\n // 中间的控制面板\r\n const controlPanel = document.createElement('div')\r\n controlPanel.className = 'ql-flow-chart-control'\r\n // 右上的控制面板\r\n const controlRightUpPanel = document.createElement('div')\r\n controlRightUpPanel.className = 'ql-flow-chart-right-up-control'\r\n\r\n const handler = new FlowChartControlPanelHandler(quill, blot)\r\n controlPanelHandlers.set(blot, handler)\r\n const zoomOutBtn = createControlItem('zoom-out', handler.getText('zoomOutTitle'), () => handleZoomOut(blot))\r\n const zoomInBtn = createControlItem('zoom-in', handler.getText('zoomInTitle'), () => handleZoomIn(blot))\r\n const resetBtn = createControlItem('fit', handler.getText('fitTitle'), () => handleResetZoom(blot))\r\n const backBtn = createControlItem('back', handler.getText('backTitle'), () => handleUndo(blot))\r\n const forwardBtn = createControlItem('forward', handler.getText('forwardTitle'), () => handleRedo(blot))\r\n const setEdgeTypeBtn = createControlItem('set-edge-type', handler.getText('setEdgeTypeTitle'), () => handleSetEdgeType(blot))\r\n const panelStatusBtn = createControlItem('panel-status', handler.getText('panelStatusTitle'))\r\n const screenTypeBtn = createControlItem('screen-type', handler.getText('screenTypeTitle'), () => handleScreenTypeBtn(blot))\r\n\r\n const updateButtonState = (historyData: any) => {\r\n if (!historyData.data) {\r\n backBtn.style.opacity = DISABLED_OPACITY\r\n backBtn.style.cursor = 'not-allowed'\r\n forwardBtn.style.opacity = DISABLED_OPACITY\r\n forwardBtn.style.cursor = 'not-allowed'\r\n return\r\n }\r\n const isUndoAvailable = historyData.data.undoAble || historyData.data.undos.length < 0\r\n const isRedoAvailable = historyData.data.redoAble || historyData.data.redos.length > 0\r\n\r\n if (backBtn) {\r\n backBtn.style.opacity = isUndoAvailable ? ENABLED_OPACITY : DISABLED_OPACITY\r\n backBtn.style.cursor = isUndoAvailable ? 'pointer' : 'not-allowed'\r\n }\r\n\r\n if (forwardBtn) {\r\n forwardBtn.style.opacity = isRedoAvailable ? ENABLED_OPACITY : DISABLED_OPACITY\r\n forwardBtn.style.cursor = isRedoAvailable ? 'pointer' : 'not-allowed'\r\n }\r\n }\r\n updateButtonState(blot.flowChart.history)\r\n blot.flowChart.on('history:change', (data: any) => {\r\n updateButtonState(data)\r\n })\r\n\r\n setTimeout(() => {\r\n const controlLeftUpPanel = blot.domNode.querySelector('.lf-dndpanel') as HTMLElement | null\r\n controlLeftUpPanel.append(setEdgeTypeBtn)\r\n }, 0)\r\n controlRightUpPanel.append(panelStatusBtn)\r\n blot.domNode.appendChild(controlRightUpPanel)\r\n controlPanel.append(zoomOutBtn, zoomInBtn, resetBtn, screenTypeBtn, backBtn, forwardBtn)\r\n blot.domNode.appendChild(controlPanel)\r\n}\r\n\r\nfunction handleUndo(blot: FlowChartPlaceholderBlot): void {\r\n if (blot.flowChart) {\r\n blot.flowChart.undo()\r\n }\r\n}\r\n\r\nfunction handleRedo(blot: FlowChartPlaceholderBlot): void {\r\n if (blot.flowChart) {\r\n blot.flowChart.redo()\r\n }\r\n}\r\n\r\nfunction handleZoomIn(blot: FlowChartPlaceholderBlot): void {\r\n if (blot.flowChart) {\r\n blot.flowChart.zoom(true)\r\n }\r\n}\r\n\r\nfunction handleZoomOut(blot: FlowChartPlaceholderBlot): void {\r\n if (blot.flowChart) {\r\n blot.flowChart.zoom(false)\r\n }\r\n}\r\n\r\nfunction handleResetZoom(blot: FlowChartPlaceholderBlot): void {\r\n if (blot.flowChart) {\r\n blot.flowChart.resetZoom()\r\n }\r\n}\r\n\r\nfunction createControlItem(iconClass: string, title: string, onClick?: () => void, disabled = false) {\r\n const controlItem = document.createElement('div')\r\n controlItem.className = 'ql-flow-chart-control-item'\r\n controlItem.title = title\r\n controlItem.dataset.controlType = iconClass\r\n controlItem.style.cursor = disabled ? 'not-allowed' : 'pointer'\r\n\r\n const iconMap: Record<string, string> = {\r\n 'back': backIcon,\r\n 'forward': forwardIcon,\r\n 'zoom-out': zoomOutIcon,\r\n 'zoom-in': zoomInIcon,\r\n 'fit': fitIcon,\r\n 'screen-type': screenTypeIcon,\r\n 'panel-status': contractIcon,\r\n 'set-edge-type': lineIcon,\r\n }\r\n\r\n const icon = document.createElement('i')\r\n icon.innerHTML = iconMap[iconClass] || ''\r\n controlItem.appendChild(icon)\r\n\r\n if (!disabled) {\r\n controlItem.addEventListener('click', onClick)\r\n }\r\n\r\n return controlItem\r\n}\r\n\r\nfunction handleSetEdgeType(blot: FlowChartPlaceholderBlot): void {\r\n const controlLeftUpPanel = blot.domNode.querySelector('.lf-dndpanel') as HTMLElement | null\r\n if (!controlLeftUpPanel) return\r\n let edgeTypePanel = controlLeftUpPanel.querySelector('.ql-flow-chart-edge-panel') as HTMLElement\r\n if (!edgeTypePanel) {\r\n edgeTypePanel = document.createElement('div')\r\n edgeTypePanel.className = 'ql-flow-chart-edge-panel'\r\n edgeTypePanel.style.display = 'flex'\r\n edgeTypePanel.style.justifyContent = 'space-around'\r\n edgeTypePanel.style.flexWrap = 'nowrap'\r\n edgeTypePanel.style.width = 'auto'\r\n edgeTypePanel.style.minWidth = '100%'\r\n edgeTypePanel.style.padding = '8px'\r\n edgeTypePanel.style.boxSizing = 'border-box'\r\n edgeTypePanel.style.position = 'absolute'\r\n edgeTypePanel.style.top = '170px'\r\n controlLeftUpPanel.appendChild(edgeTypePanel)\r\n\r\n const edgeTypes = [\r\n {\r\n name: 'line',\r\n displayName: '直线',\r\n icon: lineIcon,\r\n },\r\n {\r\n name: 'polyline',\r\n displayName: '折线',\r\n icon: polyLineIcon,\r\n },\r\n {\r\n name: 'bezier',\r\n displayName: '贝塞尔曲线',\r\n icon: bezierIcon,\r\n },\r\n ]\r\n\r\n edgeTypes.forEach((edgeType) => {\r\n const edgeItem = document.createElement('div')\r\n edgeItem.className = 'ql-flow-chart-edge-item'\r\n edgeItem.style.padding = '8px'\r\n edgeItem.style.cursor = 'pointer'\r\n edgeItem.style.textAlign = 'center'\r\n\r\n const edgeIcon = document.createElement('div')\r\n edgeIcon.className = `ql-flow-chart-edge-type-icon`\r\n edgeIcon.style.width = '24px'\r\n edgeIcon.style.height = '24px'\r\n edgeIcon.style.margin = '0 auto'\r\n if (edgeType.icon) {\r\n edgeIcon.innerHTML = edgeType.icon\r\n }\r\n\r\n edgeItem.appendChild(edgeIcon)\r\n\r\n edgeItem.addEventListener('click', () => {\r\n const { edges = [] } = blot.flowChart.getSelectElements()\r\n if (edges.length > 0) {\r\n edges.forEach((edge) => {\r\n blot.flowChart.changeEdgeType(edge.id, edgeType.name)\r\n })\r\n blot.data = blot.flowChart.getGraphData()\r\n blot.domNode.setAttribute('data-flow-chart', JSON.stringify(blot.data))\r\n }\r\n\r\n edgeTypePanel.style.display = 'none'\r\n })\r\n edgeTypePanel.appendChild(edgeItem)\r\n })\r\n }\r\n else {\r\n edgeTypePanel.style.display = 'flex'\r\n edgeTypePanel.style.justifyContent = 'space-around'\r\n edgeTypePanel.style.flexWrap = 'nowrap'\r\n }\r\n\r\n const handleOutsideClick = (e: MouseEvent) => {\r\n let setEdgeTypeBtn: HTMLElement | null = null\r\n const controlItems = controlLeftUpPanel.querySelectorAll('.ql-flow-chart-control-item')\r\n controlItems.forEach((item) => {\r\n const iconEl = item.querySelector('i')\r\n if (iconEl && iconEl.className.includes('set-edge-type')) {\r\n setEdgeTypeBtn = item as HTMLElement\r\n }\r\n })\r\n if (!edgeTypePanel.contains(e.target as Node)\r\n && (!setEdgeTypeBtn || !setEdgeTypeBtn.contains(e.target as Node))) {\r\n edgeTypePanel.style.display = 'none'\r\n document.removeEventListener('click', handleOutsideClick)\r\n }\r\n }\r\n\r\n document.removeEventListener('click', handleOutsideClick)\r\n setTimeout(() => {\r\n document.addEventListener('click', handleOutsideClick)\r\n }, 0)\r\n}\r\n\r\nfunction handleScreenTypeBtn(blot: FlowChartPlaceholderBlot): void {\r\n const screenTypeBtn = blot.domNode.querySelector('[data-control-type=\"screen-type\"]') as HTMLElement | null\r\n if (!screenTypeBtn || !blot.domNode) return\r\n\r\n const flowChartContainer = blot.domNode\r\n const isFullscreen = flowChartContainer.style.position === 'fixed'\r\n\r\n if (isFullscreen) {\r\n const originalPosition = flowChartContainer.getAttribute('data-original-position')\r\n const originalWidth = flowChartContainer.getAttribute('data-original-width')\r\n const originalHeight = flowChartContainer.getAttribute('data-original-height')\r\n if (originalWidth && originalHeight) {\r\n flowChartContainer.style.position = originalPosition\r\n flowChartContainer.style.width = originalWidth\r\n flowChartContainer.style.height = originalHeight\r\n flowChartContainer.style.zIndex = '0'\r\n }\r\n const iconElement = screenTypeBtn.querySelector('i')\r\n if (iconElement) {\r\n iconElement.innerHTML = screenTypeIcon\r\n }\r\n }\r\n else {\r\n flowChartContainer.setAttribute('data-original-position', flowChartContainer.style.position || '')\r\n flowChartContainer.setAttribute('data-original-width', flowChartContainer.style.width || '')\r\n flowChartContainer.setAttribute('data-original-height', flowChartContainer.style.height || '')\r\n flowChartContainer.style.position = 'fixed'\r\n flowChartContainer.style.top = '0'\r\n flowChartContainer.style.left = '0'\r\n flowChartContainer.style.width = '100vw'\r\n flowChartContainer.style.height = '100vh'\r\n flowChartContainer.style.zIndex = '100'\r\n const iconElement = screenTypeBtn.querySelector('i')\r\n if (iconElement) {\r\n iconElement.innerHTML = screenReduceIcon\r\n }\r\n }\r\n blot.flowChart.resize()\r\n blot.flowChart.translateCenter()\r\n}\r\n"],"names":["registerFlowChartI18N","I18N","CHANGE_LANGUAGE_EVENT","backIcon","forwardIcon","zoomOutIcon","zoomInIcon","fitIcon","screenTypeIcon","contractIcon","lineIcon","polyLineIcon","bezierIcon","screenReduceIcon"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"custom-resize-action.cjs.js","sources":["../../../../../src/modules/flow-chart/modules/custom-resize-action.ts"],"sourcesContent":["const MIN_WIDTH = 350\nconst MIN_HEIGHT = 290\n\nexport class FlowChartResizeAction {\n topLeftHandle: HTMLElement\n topRightHandle: HTMLElement\n bottomRightHandle: HTMLElement\n bottomLeftHandle: HTMLElement\n dragHandle: HTMLElement | null = null\n dragStartX: number = 0\n dragStartY: number = 0\n preDragWidth: number = 0\n preDragHeight: number = 0\n targetRatio: number = 0\n blot: any\n\n constructor(blot: any) {\n this.blot = blot\n this.topLeftHandle = this.createHandle('top-left', 'nwse-resize')\n this.topRightHandle = this.createHandle('top-right', 'nesw-resize')\n this.bottomRightHandle = this.createHandle('bottom-right', 'nwse-resize')\n this.bottomLeftHandle = this.createHandle('bottom-left', 'nesw-resize')\n this.init()\n }\n\n isFullscreen(): boolean {\n const container = this.blot.domNode\n return container.style.position === 'fixed' && container.style.width === '100vw' && container.style.height === '100vh'\n }\n\n init() {\n const container = this.blot.domNode\n container.style.position = 'relative'\n container.appendChild(this.topLeftHandle)\n container.appendChild(this.topRightHandle)\n container.appendChild(this.bottomRightHandle)\n container.appendChild(this.bottomLeftHandle)\n this.repositionHandles()\n }\n\n createHandle(position: string, cursor: string): HTMLElement {\n const box = document.createElement('div')\n box.classList.add('ql-flow-chart-resize-handle')\n box.setAttribute('data-position', position)\n Object.assign(box.style, {\n cursor,\n position: 'absolute',\n width: '10px',\n height: '10px',\n background: '#4285f4',\n border: '1px solid white',\n borderRadius: '50%',\n zIndex: '99',\n userSelect: 'none',\n })\n box.addEventListener('mousedown', this.onMouseDown.bind(this))\n return box\n }\n\n repositionHandles() {\n const container = this.blot.domNode\n const rect = container.getBoundingClientRect()\n\n Object.assign(this.topLeftHandle.style, {\n left: '-5px',\n top: '-5px',\n })\n Object.assign(this.topRightHandle.style, {\n right: '-5px',\n top: '-5px',\n })\n Object.assign(this.bottomRightHandle.style, {\n right: '-5px',\n bottom: '-5px',\n })\n Object.assign(this.bottomLeftHandle.style, {\n left: '-5px',\n bottom: '-5px',\n })\n }\n\n onMouseDown(event: MouseEvent) {\n if (this.isFullscreen()) {\n return\n }\n if (!(event.target instanceof HTMLElement)) {\n return\n }\n\n this.dragHandle = event.target\n document.body.style.cursor = this.dragHandle.style.cursor\n\n const container = this.blot.domNode\n const rect = container.getBoundingClientRect()\n\n this.dragStartX = event.clientX\n this.dragStartY = event.clientY\n this.preDragWidth = rect.width\n this.preDragHeight = rect.height\n this.targetRatio = rect.height / rect.width\n\n event.preventDefault()\n document.addEventListener('mousemove', this.onDrag.bind(this))\n document.addEventListener('mouseup', this.onMouseUp.bind(this))\n }\n\n onDrag(event: MouseEvent) {\n if (!this.dragHandle) return\n\n const container = this.blot.domNode\n let newWidth = this.preDragWidth\n let newHeight = this.preDragHeight\n\n const deltaX = event.clientX - this.dragStartX\n const deltaY = event.clientY - this.dragStartY\n\n switch (this.dragHandle.dataset.position) {\n case 'top-left':\n newWidth = Math.max(MIN_WIDTH, this.preDragWidth - deltaX)\n newHeight = Math.max(MIN_HEIGHT, this.preDragHeight - deltaY)\n break\n case 'top-right':\n newWidth = Math.max(MIN_WIDTH, this.preDragWidth + deltaX)\n newHeight = Math.max(MIN_HEIGHT, this.preDragHeight - deltaY)\n break\n case 'bottom-right':\n newWidth = Math.max(MIN_WIDTH, this.preDragWidth + deltaX)\n newHeight = Math.max(MIN_HEIGHT, this.preDragHeight + deltaY)\n break\n case 'bottom-left':\n newWidth = Math.max(MIN_WIDTH, this.preDragWidth - deltaX)\n newHeight = Math.max(MIN_HEIGHT, this.preDragHeight + deltaY)\n break\n }\n\n container.style.width = `${newWidth}px`\n container.style.height = `${newHeight}px`\n container.setAttribute('width', String(newWidth))\n container.setAttribute('height', String(newHeight))\n\n if (this.blot.flowChart) {\n this.blot.flowChart.resize(newWidth, newHeight)\n }\n\n this.blot.data.width = newWidth\n this.blot.data.height = newHeight\n container.setAttribute('data-flow-chart', JSON.stringify(this.blot.data))\n }\n\n onMouseUp() {\n document.body.style.cursor = ''\n document.removeEventListener('mousemove', this.onDrag.bind(this))\n document.removeEventListener('mouseup', this.onMouseUp.bind(this))\n this.dragHandle = null\n }\n\n destroy() {\n const container = this.blot.domNode\n container.removeChild(this.topLeftHandle)\n container.removeChild(this.topRightHandle)\n container.removeChild(this.bottomRightHandle)\n container.removeChild(this.bottomLeftHandle)\n }\n}\n"],"names":[],"mappings":";;;;;AAAA,MAAM,YAAY;AAClB,MAAM,aAAa;AAEZ,MAAM,sBAAsB;AAAA,EAajC,YAAY,MAAW;AAZvB;AACA;AACA;AACA;AACA,sCAAiC;AACjC,sCAAqB;AACrB,sCAAqB;AACrB,wCAAuB;AACvB,yCAAwB;AACxB,uCAAsB;AACtB;AAGE,SAAK,OAAO;AACZ,SAAK,gBAAgB,KAAK,aAAa,YAAY,aAAa;AAChE,SAAK,iBAAiB,KAAK,aAAa,aAAa,aAAa;AAClE,SAAK,oBAAoB,KAAK,aAAa,gBAAgB,aAAa;AACxE,SAAK,mBAAmB,KAAK,aAAa,eAAe,aAAa;AACtE,SAAK,KAAA;AAAA,EACP;AAAA,EAEA,eAAwB;AACtB,UAAM,YAAY,KAAK,KAAK;AAC5B,WAAO,UAAU,MAAM,aAAa,WAAW,UAAU,MAAM,UAAU,WAAW,UAAU,MAAM,WAAW;AAAA,EACjH;AAAA,EAEA,OAAO;AACL,UAAM,YAAY,KAAK,KAAK;AAC5B,cAAU,MAAM,WAAW;AAC3B,cAAU,YAAY,KAAK,aAAa;AACxC,cAAU,YAAY,KAAK,cAAc;AACzC,cAAU,YAAY,KAAK,iBAAiB;AAC5C,cAAU,YAAY,KAAK,gBAAgB;AAC3C,SAAK,kBAAA;AAAA,EACP;AAAA,EAEA,aAAa,UAAkB,QAA6B;AAC1D,UAAM,MAAM,SAAS,cAAc,KAAK;AACxC,QAAI,UAAU,IAAI,6BAA6B;AAC/C,QAAI,aAAa,iBAAiB,QAAQ;AAC1C,WAAO,OAAO,IAAI,OAAO;AAAA,MACvB;AAAA,MACA,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,YAAY;AAAA,MACZ,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,QAAQ;AAAA,MACR,YAAY;AAAA,IAAA,CACb;AACD,QAAI,iBAAiB,aAAa,KAAK,YAAY,KAAK,IAAI,CAAC;AAC7D,WAAO;AAAA,EACT;AAAA,EAEA,oBAAoB;AAClB,UAAM,YAAY,KAAK,KAAK;AAC5B,UAAM,OAAO,UAAU,sBAAA;AAEvB,WAAO,OAAO,KAAK,cAAc,OAAO;AAAA,MACtC,MAAM;AAAA,MACN,KAAK;AAAA,IAAA,CACN;AACD,WAAO,OAAO,KAAK,eAAe,OAAO;AAAA,MACvC,OAAO;AAAA,MACP,KAAK;AAAA,IAAA,CACN;AACD,WAAO,OAAO,KAAK,kBAAkB,OAAO;AAAA,MAC1C,OAAO;AAAA,MACP,QAAQ;AAAA,IAAA,CACT;AACD,WAAO,OAAO,KAAK,iBAAiB,OAAO;AAAA,MACzC,MAAM;AAAA,MACN,QAAQ;AAAA,IAAA,CACT;AAAA,EACH;AAAA,EAEA,YAAY,OAAmB;AAC7B,QAAI,KAAK,gBAAgB;AACvB;AAAA,IACF;AACA,QAAI,EAAE,MAAM,kBAAkB,cAAc;AAC1C;AAAA,IACF;AAEA,SAAK,aAAa,MAAM;AACxB,aAAS,KAAK,MAAM,SAAS,KAAK,WAAW,MAAM;AAEnD,UAAM,YAAY,KAAK,KAAK;AAC5B,UAAM,OAAO,UAAU,sBAAA;AAEvB,SAAK,aAAa,MAAM;AACxB,SAAK,aAAa,MAAM;AACxB,SAAK,eAAe,KAAK;AACzB,SAAK,gBAAgB,KAAK;AAC1B,SAAK,cAAc,KAAK,SAAS,KAAK;AAEtC,UAAM,eAAA;AACN,aAAS,iBAAiB,aAAa,KAAK,OAAO,KAAK,IAAI,CAAC;AAC7D,aAAS,iBAAiB,WAAW,KAAK,UAAU,KAAK,IAAI,CAAC;AAAA,EAChE;AAAA,EAEA,OAAO,OAAmB;AACxB,QAAI,CAAC,KAAK,WAAY;AAEtB,UAAM,YAAY,KAAK,KAAK;AAC5B,QAAI,WAAW,KAAK;AACpB,QAAI,YAAY,KAAK;AAErB,UAAM,SAAS,MAAM,UAAU,KAAK;AACpC,UAAM,SAAS,MAAM,UAAU,KAAK;AAEpC,YAAQ,KAAK,WAAW,QAAQ,UAAA;AAAA,MAC9B,KAAK;AACH,mBAAW,KAAK,IAAI,WAAW,KAAK,eAAe,MAAM;AACzD,oBAAY,KAAK,IAAI,YAAY,KAAK,gBAAgB,MAAM;AAC5D;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,IAAI,WAAW,KAAK,eAAe,MAAM;AACzD,oBAAY,KAAK,IAAI,YAAY,KAAK,gBAAgB,MAAM;AAC5D;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,IAAI,WAAW,KAAK,eAAe,MAAM;AACzD,oBAAY,KAAK,IAAI,YAAY,KAAK,gBAAgB,MAAM;AAC5D;AAAA,MACF,KAAK;AACH,mBAAW,KAAK,IAAI,WAAW,KAAK,eAAe,MAAM;AACzD,oBAAY,KAAK,IAAI,YAAY,KAAK,gBAAgB,MAAM;AAC5D;AAAA,IAAA;AAGJ,cAAU,MAAM,QAAQ,GAAG,QAAQ;AACnC,cAAU,MAAM,SAAS,GAAG,SAAS;AACrC,cAAU,aAAa,SAAS,OAAO,QAAQ,CAAC;AAChD,cAAU,aAAa,UAAU,OAAO,SAAS,CAAC;AAElD,QAAI,KAAK,KAAK,WAAW;AACvB,WAAK,KAAK,UAAU,OAAO,UAAU,SAAS;AAAA,IAChD;AAEA,SAAK,KAAK,KAAK,QAAQ;AACvB,SAAK,KAAK,KAAK,SAAS;AACxB,cAAU,aAAa,mBAAmB,KAAK,UAAU,KAAK,KAAK,IAAI,CAAC;AAAA,EAC1E;AAAA,EAEA,YAAY;AACV,aAAS,KAAK,MAAM,SAAS;AAC7B,aAAS,oBAAoB,aAAa,KAAK,OAAO,KAAK,IAAI,CAAC;AAChE,aAAS,oBAAoB,WAAW,KAAK,UAAU,KAAK,IAAI,CAAC;AACjE,SAAK,aAAa;AAAA,EACpB;AAAA,EAEA,UAAU;AACR,UAAM,YAAY,KAAK,KAAK;AAC5B,cAAU,YAAY,KAAK,aAAa;AACxC,cAAU,YAAY,KAAK,cAAc;AACzC,cAAU,YAAY,KAAK,iBAAiB;AAC5C,cAAU,YAAY,KAAK,gBAAgB;AAAA,EAC7C;AACF;;"}
1
+ {"version":3,"file":"custom-resize-action.cjs.js","sources":["../../../../../src/modules/flow-chart/modules/custom-resize-action.ts"],"sourcesContent":["const MIN_WIDTH = 350\r\nconst MIN_HEIGHT = 290\r\n\r\nexport class FlowChartResizeAction {\r\n topLeftHandle: HTMLElement\r\n topRightHandle: HTMLElement\r\n bottomRightHandle: HTMLElement\r\n bottomLeftHandle: HTMLElement\r\n dragHandle: HTMLElement | null = null\r\n dragStartX: number = 0\r\n dragStartY: number = 0\r\n preDragWidth: number = 0\r\n preDragHeight: number = 0\r\n targetRatio: number = 0\r\n blot: any\r\n\r\n constructor(blot: any) {\r\n this.blot = blot\r\n this.topLeftHandle = this.createHandle('top-left', 'nwse-resize')\r\n this.topRightHandle = this.createHandle('top-right', 'nesw-resize')\r\n this.bottomRightHandle = this.createHandle('bottom-right', 'nwse-resize')\r\n this.bottomLeftHandle = this.createHandle('bottom-left', 'nesw-resize')\r\n this.init()\r\n }\r\n\r\n isFullscreen(): boolean {\r\n const container = this.blot.domNode\r\n return container.style.position === 'fixed' && container.style.width === '100vw' && container.style.height === '100vh'\r\n }\r\n\r\n init() {\r\n const container = this.blot.domNode\r\n container.style.position = 'relative'\r\n container.appendChild(this.topLeftHandle)\r\n container.appendChild(this.topRightHandle)\r\n container.appendChild(this.bottomRightHandle)\r\n container.appendChild(this.bottomLeftHandle)\r\n this.repositionHandles()\r\n }\r\n\r\n createHandle(position: string, cursor: string): HTMLElement {\r\n const box = document.createElement('div')\r\n box.classList.add('ql-flow-chart-resize-handle')\r\n box.setAttribute('data-position', position)\r\n Object.assign(box.style, {\r\n cursor,\r\n position: 'absolute',\r\n width: '10px',\r\n height: '10px',\r\n background: '#4285f4',\r\n border: '1px solid white',\r\n borderRadius: '50%',\r\n zIndex: '99',\r\n userSelect: 'none',\r\n })\r\n box.addEventListener('mousedown', this.onMouseDown.bind(this))\r\n return box\r\n }\r\n\r\n repositionHandles() {\r\n const container = this.blot.domNode\r\n const rect = container.getBoundingClientRect()\r\n\r\n Object.assign(this.topLeftHandle.style, {\r\n left: '-5px',\r\n top: '-5px',\r\n })\r\n Object.assign(this.topRightHandle.style, {\r\n right: '-5px',\r\n top: '-5px',\r\n })\r\n Object.assign(this.bottomRightHandle.style, {\r\n right: '-5px',\r\n bottom: '-5px',\r\n })\r\n Object.assign(this.bottomLeftHandle.style, {\r\n left: '-5px',\r\n bottom: '-5px',\r\n })\r\n }\r\n\r\n onMouseDown(event: MouseEvent) {\r\n if (this.isFullscreen()) {\r\n return\r\n }\r\n if (!(event.target instanceof HTMLElement)) {\r\n return\r\n }\r\n\r\n this.dragHandle = event.target\r\n document.body.style.cursor = this.dragHandle.style.cursor\r\n\r\n const container = this.blot.domNode\r\n const rect = container.getBoundingClientRect()\r\n\r\n this.dragStartX = event.clientX\r\n this.dragStartY = event.clientY\r\n this.preDragWidth = rect.width\r\n this.preDragHeight = rect.height\r\n this.targetRatio = rect.height / rect.width\r\n\r\n event.preventDefault()\r\n document.addEventListener('mousemove', this.onDrag.bind(this))\r\n document.addEventListener('mouseup', this.onMouseUp.bind(this))\r\n }\r\n\r\n onDrag(event: MouseEvent) {\r\n if (!this.dragHandle) return\r\n\r\n const container = this.blot.domNode\r\n let newWidth = this.preDragWidth\r\n let newHeight = this.preDragHeight\r\n\r\n const deltaX = event.clientX - this.dragStartX\r\n const deltaY = event.clientY - this.dragStartY\r\n\r\n switch (this.dragHandle.dataset.position) {\r\n case 'top-left':\r\n newWidth = Math.max(MIN_WIDTH, this.preDragWidth - deltaX)\r\n newHeight = Math.max(MIN_HEIGHT, this.preDragHeight - deltaY)\r\n break\r\n case 'top-right':\r\n newWidth = Math.max(MIN_WIDTH, this.preDragWidth + deltaX)\r\n newHeight = Math.max(MIN_HEIGHT, this.preDragHeight - deltaY)\r\n break\r\n case 'bottom-right':\r\n newWidth = Math.max(MIN_WIDTH, this.preDragWidth + deltaX)\r\n newHeight = Math.max(MIN_HEIGHT, this.preDragHeight + deltaY)\r\n break\r\n case 'bottom-left':\r\n newWidth = Math.max(MIN_WIDTH, this.preDragWidth - deltaX)\r\n newHeight = Math.max(MIN_HEIGHT, this.preDragHeight + deltaY)\r\n break\r\n }\r\n\r\n container.style.width = `${newWidth}px`\r\n container.style.height = `${newHeight}px`\r\n container.setAttribute('width', String(newWidth))\r\n container.setAttribute('height', String(newHeight))\r\n\r\n if (this.blot.flowChart) {\r\n this.blot.flowChart.resize(newWidth, newHeight)\r\n }\r\n\r\n this.blot.data.width = newWidth\r\n this.blot.data.height = newHeight\r\n container.setAttribute('data-flow-chart', JSON.stringify(this.blot.data))\r\n }\r\n\r\n onMouseUp() {\r\n document.body.style.cursor = ''\r\n document.removeEventListener('mousemove', this.onDrag.bind(this))\r\n document.removeEventListener('mouseup', this.onMouseUp.bind(this))\r\n this.dragHandle = null\r\n }\r\n\r\n destroy() {\r\n const container = this.blot.domNode\r\n container.removeChild(this.topLeftHandle)\r\n container.removeChild(this.topRightHandle)\r\n container.removeChild(this.bottomRightHandle)\r\n container.removeChild(this.bottomLeftHandle)\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"link.cjs.js","sources":["../../../../../src/modules/link/formats/link.ts"],"sourcesContent":["import type TypeInline from 'quill/blots/inline'\nimport Quill from 'quill'\nimport { hadProtocol, sanitize } from '../../../config/editor.utils'\n\nconst Inline = Quill.import('blots/inline') as typeof TypeInline\n\nexport class LinkBlot extends Inline {\n static blotName = 'link'\n static tagName = 'A'\n static SANITIZED_URL = 'about:blank'\n static PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel']\n static className = 'ql-normal-link'\n\n static autoProtocol: string = ''\n static create(value: string) {\n const node = super.create(value)\n let href = value\n if (!hadProtocol(href) && this.autoProtocol) {\n href = `${this.autoProtocol}://${value}`\n }\n href = this.sanitize(href)\n node.setAttribute('href', href)\n node.setAttribute('target', '_blank')\n return node\n }\n\n static formats(domNode: HTMLElement): string | null {\n return domNode.getAttribute('href')\n }\n\n static sanitize(url: string) {\n return sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL\n }\n\n format(name: string, value: any) {\n if (name !== this.statics.blotName || [false, null].includes(value)) {\n super.format(name, value)\n }\n else {\n this.domNode.setAttribute('href', LinkBlot.sanitize(value))\n }\n }\n}\n"],"names":["hadProtocol","sanitize"],"mappings":";;;;;;;AAIA,MAAM,SAAS,MAAM,OAAO,cAAc;AAEnC,MAAM,YAAN,MAAM,kBAAiB,OAAO;AAAA,EAQnC,OAAO,OAAO,OAAe;AAC3B,UAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,QAAI,OAAO;AACX,QAAI,CAACA,aAAAA,YAAY,IAAI,KAAK,KAAK,cAAc;AAC3C,aAAO,GAAG,KAAK,YAAY,MAAM,KAAK;AAAA,IACxC;AACA,WAAO,KAAK,SAAS,IAAI;AACzB,SAAK,aAAa,QAAQ,IAAI;AAC9B,SAAK,aAAa,UAAU,QAAQ;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ,SAAqC;AAClD,WAAO,QAAQ,aAAa,MAAM;AAAA,EACpC;AAAA,EAEA,OAAO,SAAS,KAAa;AAC3B,WAAOC,aAAAA,SAAS,KAAK,KAAK,kBAAkB,IAAI,MAAM,KAAK;AAAA,EAC7D;AAAA,EAEA,OAAO,MAAc,OAAY;AAC/B,QAAI,SAAS,KAAK,QAAQ,YAAY,CAAC,OAAO,IAAI,EAAE,SAAS,KAAK,GAAG;AACnE,YAAM,OAAO,MAAM,KAAK;AAAA,IAC1B,OACK;AACH,WAAK,QAAQ,aAAa,QAAQ,UAAS,SAAS,KAAK,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;AAnCE,cADW,WACJ,YAAW;AAClB,cAFW,WAEJ,WAAU;AACjB,cAHW,WAGJ,iBAAgB;AACvB,cAJW,WAIJ,sBAAqB,CAAC,QAAQ,SAAS,UAAU,KAAK;AAC7D,cALW,WAKJ,aAAY;AAEnB,cAPW,WAOJ,gBAAuB;AAPzB,IAAM,WAAN;;"}
1
+ {"version":3,"file":"link.cjs.js","sources":["../../../../../src/modules/link/formats/link.ts"],"sourcesContent":["import type TypeInline from 'quill/blots/inline'\r\nimport Quill from 'quill'\r\nimport { hadProtocol, sanitize } from '../../../config/editor.utils'\r\n\r\nconst Inline = Quill.import('blots/inline') as typeof TypeInline\r\n\r\nexport class LinkBlot extends Inline {\r\n static blotName = 'link'\r\n static tagName = 'A'\r\n static SANITIZED_URL = 'about:blank'\r\n static PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel']\r\n static className = 'ql-normal-link'\r\n\r\n static autoProtocol: string = ''\r\n static create(value: string) {\r\n const node = super.create(value)\r\n let href = value\r\n if (!hadProtocol(href) && this.autoProtocol) {\r\n href = `${this.autoProtocol}://${value}`\r\n }\r\n href = this.sanitize(href)\r\n node.setAttribute('href', href)\r\n node.setAttribute('target', '_blank')\r\n return node\r\n }\r\n\r\n static formats(domNode: HTMLElement): string | null {\r\n return domNode.getAttribute('href')\r\n }\r\n\r\n static sanitize(url: string) {\r\n return sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL\r\n }\r\n\r\n format(name: string, value: any) {\r\n if (name !== this.statics.blotName || [false, null].includes(value)) {\r\n super.format(name, value)\r\n }\r\n else {\r\n this.domNode.setAttribute('href', LinkBlot.sanitize(value))\r\n }\r\n }\r\n}\r\n"],"names":["hadProtocol","sanitize"],"mappings":";;;;;;;AAIA,MAAM,SAAS,MAAM,OAAO,cAAc;AAEnC,MAAM,YAAN,MAAM,kBAAiB,OAAO;AAAA,EAQnC,OAAO,OAAO,OAAe;AAC3B,UAAM,OAAO,MAAM,OAAO,KAAK;AAC/B,QAAI,OAAO;AACX,QAAI,CAACA,aAAAA,YAAY,IAAI,KAAK,KAAK,cAAc;AAC3C,aAAO,GAAG,KAAK,YAAY,MAAM,KAAK;AAAA,IACxC;AACA,WAAO,KAAK,SAAS,IAAI;AACzB,SAAK,aAAa,QAAQ,IAAI;AAC9B,SAAK,aAAa,UAAU,QAAQ;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ,SAAqC;AAClD,WAAO,QAAQ,aAAa,MAAM;AAAA,EACpC;AAAA,EAEA,OAAO,SAAS,KAAa;AAC3B,WAAOC,aAAAA,SAAS,KAAK,KAAK,kBAAkB,IAAI,MAAM,KAAK;AAAA,EAC7D;AAAA,EAEA,OAAO,MAAc,OAAY;AAC/B,QAAI,SAAS,KAAK,QAAQ,YAAY,CAAC,OAAO,IAAI,EAAE,SAAS,KAAK,GAAG;AACnE,YAAM,OAAO,MAAM,KAAK;AAAA,IAC1B,OACK;AACH,WAAK,QAAQ,aAAa,QAAQ,UAAS,SAAS,KAAK,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;AAnCE,cADW,WACJ,YAAW;AAClB,cAFW,WAEJ,WAAU;AACjB,cAHW,WAGJ,iBAAgB;AACvB,cAJW,WAIJ,sBAAqB,CAAC,QAAQ,SAAS,UAAU,KAAK;AAC7D,cALW,WAKJ,aAAY;AAEnB,cAPW,WAOJ,gBAAuB;AAPzB,IAAM,WAAN;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.cjs.js","sources":["../../../../../src/modules/link/modules/tooltip.ts"],"sourcesContent":["import type { Parchment as TypeParchment } from 'quill'\nimport type FluentEditor from '../../../core/fluent-editor'\nimport Quill, { Range } from 'quill'\nimport Emitter from 'quill/core/emitter'\nimport { BaseTooltip } from 'quill/themes/base'\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\nimport { hadProtocol, isNullOrUndefined } from '../../../config/editor.utils'\nimport { EN_US } from '../../../config/i18n/en-us'\nimport { debounce } from '../../../utils/debounce'\nimport { LinkBlot } from '../formats/link'\n\nexport class LinkTooltip extends BaseTooltip {\n static TEMPLATE: string = [\n `<input type=\"text\" data-formula=\"e=mc^2\" data-link=\"${EN_US.linkplaceholder}\" data-video=\"Embed URL\" style=\"width: 225px;\">`,\n '<span class=\"ql-split\"></span>',\n '<a class=\"ql-preview\"><i class=\"icon-share\"></i></a>',\n '<a class=\"ql-remove\"><i class=\"icon-delete\"></i></a>',\n ].join('')\n\n isInputFocus: boolean\n isHover: boolean\n debouncedHideToolTip: any\n debouncedShowToolTip: any\n options: { autoProtocol: string } = {\n autoProtocol: 'https',\n }\n\n constructor(public quill: FluentEditor, bounds) {\n super(quill, bounds)\n this.setTemplate()\n this.isInputFocus = false\n this.isHover = false\n\n this.resolveOptions()\n LinkBlot.autoProtocol = this.options.autoProtocol\n this.debouncedHideToolTip = debounce(this.hideToolTip, 300)\n this.debouncedShowToolTip = debounce(this.showToolTip, 300)\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, () => {\n this.setTemplate()\n })\n }\n\n setTemplate() {\n this.root.innerHTML = [\n `<input type=\"text\" data-formula=\"e=mc^2\" data-link=\"${this.quill.getLangText('linkplaceholder')}\" data-video=\"Embed URL\" style=\"width: 225px;\">`,\n '<span class=\"ql-split\"></span>',\n '<a class=\"ql-preview\"><i class=\"icon-share\"></i></a>',\n '<a class=\"ql-remove\"><i class=\"icon-delete\"></i></a>',\n ].join('')\n this.textbox = this.root.querySelector('input[type=\"text\"]')\n this.listen()\n }\n\n resolveOptions() {\n this.options = {\n autoProtocol: 'https',\n }\n const value = this.quill.options.autoProtocol\n if (value && typeof value === 'string') {\n this.options.autoProtocol = value\n }\n else if (typeof value === 'boolean' && !value) {\n this.options.autoProtocol = ''\n }\n }\n\n shouldHide() {\n return !this.isHover && !this.isInputFocus\n }\n\n hideToolTip() {\n if (this.shouldHide()) {\n this.hide()\n }\n }\n\n showToolTip(name, value, range) {\n if (!this.shouldHide()) {\n this.edit(name, value, range)\n }\n }\n\n handleMouseLeave() {\n this.isHover = false\n this.debouncedHideToolTip()\n }\n\n handleMouseEnter(event: MouseEvent) {\n const isTooltipShow = !this.root.classList.contains('ql-hidden')\n if (isTooltipShow) {\n return\n }\n\n if (this.isInputFocus) {\n this.save()\n }\n this.isHover = true\n const linkNode = event.target as HTMLElement\n const preview = LinkBlot.formats(linkNode)\n if (!preview || preview.startsWith('#')) {\n return\n }\n const linkBlot = Quill.find(linkNode) as TypeParchment.Blot\n const index = this.quill.getIndex(linkBlot)\n const [link, offset] = this.quill.scroll.descendant(\n LinkBlot,\n index,\n )\n const length = link && link.length()\n this.linkRange = new Range(index - offset, length)\n this.debouncedShowToolTip('link', preview, this.linkRange)\n }\n\n listen() {\n super.listen()\n this.root.querySelector('a.ql-remove').addEventListener('click', (event) => {\n if (!isNullOrUndefined(this.linkRange)) {\n const range = this.linkRange\n this.restoreFocus()\n this.quill.formatText(range, 'link', false, Emitter.sources.API)\n delete this.linkRange\n }\n event.preventDefault()\n this.hide()\n })\n\n this.quill.root.addEventListener(\n 'mouseover',\n (event) => {\n const target = event.target as HTMLElement\n if (\n (target.tagName.toUpperCase() !== 'A'\n || !target.classList.contains(LinkBlot.className))\n && !target.closest(`a.${LinkBlot.className}`)\n ) {\n return\n }\n this.handleMouseEnter(event)\n },\n false,\n )\n\n this.quill.root.addEventListener(\n 'mouseout',\n (event) => {\n const target = event.target as HTMLElement\n if (target.tagName.toUpperCase() !== 'A' && !target.closest(`a.${LinkBlot.className}`)) {\n return\n }\n this.handleMouseLeave()\n },\n false,\n )\n\n this.root.addEventListener(\n 'mouseenter',\n () => {\n this.isHover = true\n },\n false,\n )\n\n this.root.addEventListener('mouseleave', this.handleMouseLeave.bind(this), false)\n\n this.root.querySelector('a.ql-preview').addEventListener('click', (event) => {\n const link = LinkBlot.sanitize(this.textbox.value)\n window.open(link, '_blank')\n event.preventDefault()\n })\n this.root.querySelector('input[type=\"text\"]').addEventListener('focus', () => {\n this.isInputFocus = true\n })\n this.root.querySelector('input[type=\"text\"]').addEventListener('blur', () => {\n this.isInputFocus = false\n this.save()\n })\n this.quill.on(\n Emitter.events.SELECTION_CHANGE,\n (range, _oldRange, source) => {\n if (isNullOrUndefined(range)) return\n if (source === Emitter.sources.USER) {\n const [link, offset] = this.quill.scroll.descendant(\n LinkBlot,\n range.index,\n )\n\n if (!isNullOrUndefined(link)) {\n this.linkRange = new Range(range.index - offset, link.length())\n const preview = LinkBlot.formats(link.domNode)\n if (!preview.startsWith('#')) {\n this.edit('link', preview, this.linkRange)\n }\n return\n }\n }\n if (this.shouldHide()) {\n this.hide()\n }\n },\n )\n this.quill.on(\n Emitter.events.TEXT_CHANGE,\n () => {\n const selection = this.quill.getSelection()\n const index = selection && selection.index\n setTimeout(() => {\n const link = this.quill.scroll.descendant(\n LinkBlot,\n index,\n )[0]\n if (!link) {\n this.handleMouseLeave()\n }\n })\n },\n )\n }\n\n save() {\n let value = this.textbox.value\n if (!value) return\n this.textbox.value = ''\n switch (this.root.getAttribute('data-mode')) {\n case 'link': {\n const { scrollTop } = this.quill.root\n if (this.options.autoProtocol) {\n value = this.addHttpProtocol(value)\n }\n\n if (this.linkRange) {\n this.quill.formatText(\n this.linkRange,\n 'link',\n value,\n Emitter.sources.USER,\n )\n this.restoreFocus()\n }\n else {\n this.restoreFocus()\n this.quill.format('link', value, Emitter.sources.USER)\n }\n this.quill.root.scrollTop = scrollTop\n break\n }\n case 'formula': {\n const range = this.quill.getSelection(true)\n if (!isNullOrUndefined(range)) {\n const index = range.index + range.length\n this.quill.insertEmbed(\n index,\n this.root.getAttribute('data-mode'),\n value,\n Emitter.sources.USER,\n )\n if (this.root.getAttribute('data-mode') === 'formula') {\n this.quill.insertText(index + 1, ' ', Emitter.sources.USER)\n }\n this.quill.setSelection(index + 2, Emitter.sources.USER)\n }\n break\n }\n case 'video': {\n const range = this.quill.getSelection(true)\n this.quill.insertText(range.index, '\\n', Emitter.sources.USER)\n this.quill.insertEmbed(range.index + 1, 'video', { src: value }, Emitter.sources.USER)\n this.quill.insertText(range.index + 2, '\\n', Emitter.sources.USER)\n this.quill.setSelection(range.index + 3, Emitter.sources.SILENT)\n this.textbox.value = ''\n this.hide()\n break\n }\n default:\n }\n }\n\n position(reference) {\n const left = reference.left\n const top = reference.bottom + this.quill.root.scrollTop\n this.root.style.left = `${left}px`\n this.root.style.top = `${top}px`\n this.root.classList.remove('ql-flip')\n const containerBounds = this.boundsContainer.getBoundingClientRect()\n const rootBounds = this.root.getBoundingClientRect()\n let shift = 0\n if (rootBounds.right > containerBounds.right) {\n shift = containerBounds.right - rootBounds.right\n this.root.style.left = `${left + shift}px`\n }\n if (rootBounds.left < containerBounds.left) {\n shift = containerBounds.left - rootBounds.left\n this.root.style.left = `${left + shift}px`\n }\n if (rootBounds.bottom > containerBounds.bottom) {\n const height = rootBounds.bottom - rootBounds.top\n const verticalShift = reference.bottom - reference.top + height\n const fixedTop = top - verticalShift\n this.root.style.top = `${fixedTop < 0 ? this.quill.root.scrollTop + reference.top : fixedTop}px`\n this.root.classList.add('ql-flip')\n }\n return shift\n }\n\n // @ts-expect-error\n edit(mode: string = 'link', preview = null, range) {\n this.linkRange = range || this.quill.selection.savedRange\n this.root.classList.remove('ql-hidden')\n this.root.classList.add('ql-editing')\n if (!isNullOrUndefined(preview)) {\n this.textbox.value = preview\n }\n else if (mode !== this.root.getAttribute('data-mode')) {\n this.textbox.value = ''\n }\n this.position(this.quill.getBounds(range || this.quill.selection.savedRange))\n if (this.textbox.value === '') {\n this.textbox.focus()\n }\n this.textbox.setAttribute(\n 'placeholder',\n this.textbox.getAttribute(`data-${mode}`) || '',\n )\n this.root.setAttribute('data-mode', mode)\n }\n\n show() {\n super.show()\n this.root.removeAttribute('data-mode')\n }\n\n addHttpProtocol(url: string) {\n let result = url\n if (!url) {\n return ''\n }\n if (!hadProtocol(url)) {\n result = `${this.options.autoProtocol}://${url}`\n }\n return result\n }\n}\n"],"names":["BaseTooltip","LinkBlot","debounce","CHANGE_LANGUAGE_EVENT","link","Range","isNullOrUndefined","hadProtocol","EN_US"],"mappings":";;;;;;;;;;;;;;AAWO,MAAM,oBAAoBA,KAAAA,YAAY;AAAA,EAgB3C,YAAmB,OAAqB,QAAQ;AAC9C,UAAM,OAAO,MAAM;AATrB;AACA;AACA;AACA;AACA,mCAAoC;AAAA,MAClC,cAAc;AAAA,IAAA;AAGG,SAAA,QAAA;AAEjB,SAAK,YAAA;AACL,SAAK,eAAe;AACpB,SAAK,UAAU;AAEf,SAAK,eAAA;AACLC,SAAAA,SAAS,eAAe,KAAK,QAAQ;AACrC,SAAK,uBAAuBC,SAAAA,SAAS,KAAK,aAAa,GAAG;AAC1D,SAAK,uBAAuBA,SAAAA,SAAS,KAAK,aAAa,GAAG;AAC1D,SAAK,MAAM,QAAQ,GAAGC,cAAAA,uBAAuB,MAAM;AACjD,WAAK,YAAA;AAAA,IACP,CAAC;AAAA,EACH;AAAA,EAEA,cAAc;AACZ,SAAK,KAAK,YAAY;AAAA,MACpB,uDAAuD,KAAK,MAAM,YAAY,iBAAiB,CAAC;AAAA,MAChG;AAAA,MACA;AAAA,MACA;AAAA,IAAA,EACA,KAAK,EAAE;AACT,SAAK,UAAU,KAAK,KAAK,cAAc,oBAAoB;AAC3D,SAAK,OAAA;AAAA,EACP;AAAA,EAEA,iBAAiB;AACf,SAAK,UAAU;AAAA,MACb,cAAc;AAAA,IAAA;AAEhB,UAAM,QAAQ,KAAK,MAAM,QAAQ;AACjC,QAAI,SAAS,OAAO,UAAU,UAAU;AACtC,WAAK,QAAQ,eAAe;AAAA,IAC9B,WACS,OAAO,UAAU,aAAa,CAAC,OAAO;AAC7C,WAAK,QAAQ,eAAe;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,aAAa;AACX,WAAO,CAAC,KAAK,WAAW,CAAC,KAAK;AAAA,EAChC;AAAA,EAEA,cAAc;AACZ,QAAI,KAAK,cAAc;AACrB,WAAK,KAAA;AAAA,IACP;AAAA,EACF;AAAA,EAEA,YAAY,MAAM,OAAO,OAAO;AAC9B,QAAI,CAAC,KAAK,cAAc;AACtB,WAAK,KAAK,MAAM,OAAO,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,mBAAmB;AACjB,SAAK,UAAU;AACf,SAAK,qBAAA;AAAA,EACP;AAAA,EAEA,iBAAiB,OAAmB;AAClC,UAAM,gBAAgB,CAAC,KAAK,KAAK,UAAU,SAAS,WAAW;AAC/D,QAAI,eAAe;AACjB;AAAA,IACF;AAEA,QAAI,KAAK,cAAc;AACrB,WAAK,KAAA;AAAA,IACP;AACA,SAAK,UAAU;AACf,UAAM,WAAW,MAAM;AACvB,UAAM,UAAUF,KAAAA,SAAS,QAAQ,QAAQ;AACzC,QAAI,CAAC,WAAW,QAAQ,WAAW,GAAG,GAAG;AACvC;AAAA,IACF;AACA,UAAM,WAAW,MAAM,KAAK,QAAQ;AACpC,UAAM,QAAQ,KAAK,MAAM,SAAS,QAAQ;AAC1C,UAAM,CAACG,QAAM,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,MACvCH,KAAAA;AAAAA,MACA;AAAA,IAAA;AAEF,UAAM,SAASG,UAAQA,OAAK,OAAA;AAC5B,SAAK,YAAY,IAAIC,MAAAA,MAAM,QAAQ,QAAQ,MAAM;AACjD,SAAK,qBAAqB,QAAQ,SAAS,KAAK,SAAS;AAAA,EAC3D;AAAA,EAEA,SAAS;AACP,UAAM,OAAA;AACN,SAAK,KAAK,cAAc,aAAa,EAAE,iBAAiB,SAAS,CAAC,UAAU;AAC1E,UAAI,CAACC,aAAAA,kBAAkB,KAAK,SAAS,GAAG;AACtC,cAAM,QAAQ,KAAK;AACnB,aAAK,aAAA;AACL,aAAK,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,QAAQ,GAAG;AAC/D,eAAO,KAAK;AAAA,MACd;AACA,YAAM,eAAA;AACN,WAAK,KAAA;AAAA,IACP,CAAC;AAED,SAAK,MAAM,KAAK;AAAA,MACd;AAAA,MACA,CAAC,UAAU;AACT,cAAM,SAAS,MAAM;AACrB,aACG,OAAO,QAAQ,YAAA,MAAkB,OAC7B,CAAC,OAAO,UAAU,SAASL,KAAAA,SAAS,SAAS,MAC/C,CAAC,OAAO,QAAQ,KAAKA,KAAAA,SAAS,SAAS,EAAE,GAC5C;AACA;AAAA,QACF;AACA,aAAK,iBAAiB,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,IAAA;AAGF,SAAK,MAAM,KAAK;AAAA,MACd;AAAA,MACA,CAAC,UAAU;AACT,cAAM,SAAS,MAAM;AACrB,YAAI,OAAO,QAAQ,YAAA,MAAkB,OAAO,CAAC,OAAO,QAAQ,KAAKA,KAAAA,SAAS,SAAS,EAAE,GAAG;AACtF;AAAA,QACF;AACA,aAAK,iBAAA;AAAA,MACP;AAAA,MACA;AAAA,IAAA;AAGF,SAAK,KAAK;AAAA,MACR;AAAA,MACA,MAAM;AACJ,aAAK,UAAU;AAAA,MACjB;AAAA,MACA;AAAA,IAAA;AAGF,SAAK,KAAK,iBAAiB,cAAc,KAAK,iBAAiB,KAAK,IAAI,GAAG,KAAK;AAEhF,SAAK,KAAK,cAAc,cAAc,EAAE,iBAAiB,SAAS,CAAC,UAAU;AAC3E,YAAMG,SAAOH,KAAAA,SAAS,SAAS,KAAK,QAAQ,KAAK;AACjD,aAAO,KAAKG,QAAM,QAAQ;AAC1B,YAAM,eAAA;AAAA,IACR,CAAC;AACD,SAAK,KAAK,cAAc,oBAAoB,EAAE,iBAAiB,SAAS,MAAM;AAC5E,WAAK,eAAe;AAAA,IACtB,CAAC;AACD,SAAK,KAAK,cAAc,oBAAoB,EAAE,iBAAiB,QAAQ,MAAM;AAC3E,WAAK,eAAe;AACpB,WAAK,KAAA;AAAA,IACP,CAAC;AACD,SAAK,MAAM;AAAA,MACT,QAAQ,OAAO;AAAA,MACf,CAAC,OAAO,WAAW,WAAW;AAC5B,YAAIE,aAAAA,kBAAkB,KAAK,EAAG;AAC9B,YAAI,WAAW,QAAQ,QAAQ,MAAM;AACnC,gBAAM,CAACF,QAAM,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,YACvCH,KAAAA;AAAAA,YACA,MAAM;AAAA,UAAA;AAGR,cAAI,CAACK,aAAAA,kBAAkBF,MAAI,GAAG;AAC5B,iBAAK,YAAY,IAAIC,YAAM,MAAM,QAAQ,QAAQD,OAAK,QAAQ;AAC9D,kBAAM,UAAUH,KAAAA,SAAS,QAAQG,OAAK,OAAO;AAC7C,gBAAI,CAAC,QAAQ,WAAW,GAAG,GAAG;AAC5B,mBAAK,KAAK,QAAQ,SAAS,KAAK,SAAS;AAAA,YAC3C;AACA;AAAA,UACF;AAAA,QACF;AACA,YAAI,KAAK,cAAc;AACrB,eAAK,KAAA;AAAA,QACP;AAAA,MACF;AAAA,IAAA;AAEF,SAAK,MAAM;AAAA,MACT,QAAQ,OAAO;AAAA,MACf,MAAM;AACJ,cAAM,YAAY,KAAK,MAAM,aAAA;AAC7B,cAAM,QAAQ,aAAa,UAAU;AACrC,mBAAW,MAAM;AACf,gBAAMA,SAAO,KAAK,MAAM,OAAO;AAAA,YAC7BH,KAAAA;AAAAA,YACA;AAAA,UAAA,EACA,CAAC;AACH,cAAI,CAACG,QAAM;AACT,iBAAK,iBAAA;AAAA,UACP;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO;AACL,QAAI,QAAQ,KAAK,QAAQ;AACzB,QAAI,CAAC,MAAO;AACZ,SAAK,QAAQ,QAAQ;AACrB,YAAQ,KAAK,KAAK,aAAa,WAAW,GAAA;AAAA,MACxC,KAAK,QAAQ;AACX,cAAM,EAAE,UAAA,IAAc,KAAK,MAAM;AACjC,YAAI,KAAK,QAAQ,cAAc;AAC7B,kBAAQ,KAAK,gBAAgB,KAAK;AAAA,QACpC;AAEA,YAAI,KAAK,WAAW;AAClB,eAAK,MAAM;AAAA,YACT,KAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA,QAAQ,QAAQ;AAAA,UAAA;AAElB,eAAK,aAAA;AAAA,QACP,OACK;AACH,eAAK,aAAA;AACL,eAAK,MAAM,OAAO,QAAQ,OAAO,QAAQ,QAAQ,IAAI;AAAA,QACvD;AACA,aAAK,MAAM,KAAK,YAAY;AAC5B;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,cAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AAC1C,YAAI,CAACE,aAAAA,kBAAkB,KAAK,GAAG;AAC7B,gBAAM,QAAQ,MAAM,QAAQ,MAAM;AAClC,eAAK,MAAM;AAAA,YACT;AAAA,YACA,KAAK,KAAK,aAAa,WAAW;AAAA,YAClC;AAAA,YACA,QAAQ,QAAQ;AAAA,UAAA;AAElB,cAAI,KAAK,KAAK,aAAa,WAAW,MAAM,WAAW;AACrD,iBAAK,MAAM,WAAW,QAAQ,GAAG,KAAK,QAAQ,QAAQ,IAAI;AAAA,UAC5D;AACA,eAAK,MAAM,aAAa,QAAQ,GAAG,QAAQ,QAAQ,IAAI;AAAA,QACzD;AACA;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AAC1C,aAAK,MAAM,WAAW,MAAM,OAAO,MAAM,QAAQ,QAAQ,IAAI;AAC7D,aAAK,MAAM,YAAY,MAAM,QAAQ,GAAG,SAAS,EAAE,KAAK,MAAA,GAAS,QAAQ,QAAQ,IAAI;AACrF,aAAK,MAAM,WAAW,MAAM,QAAQ,GAAG,MAAM,QAAQ,QAAQ,IAAI;AACjE,aAAK,MAAM,aAAa,MAAM,QAAQ,GAAG,QAAQ,QAAQ,MAAM;AAC/D,aAAK,QAAQ,QAAQ;AACrB,aAAK,KAAA;AACL;AAAA,MACF;AAAA,MACA;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,SAAS,WAAW;AAClB,UAAM,OAAO,UAAU;AACvB,UAAM,MAAM,UAAU,SAAS,KAAK,MAAM,KAAK;AAC/C,SAAK,KAAK,MAAM,OAAO,GAAG,IAAI;AAC9B,SAAK,KAAK,MAAM,MAAM,GAAG,GAAG;AAC5B,SAAK,KAAK,UAAU,OAAO,SAAS;AACpC,UAAM,kBAAkB,KAAK,gBAAgB,sBAAA;AAC7C,UAAM,aAAa,KAAK,KAAK,sBAAA;AAC7B,QAAI,QAAQ;AACZ,QAAI,WAAW,QAAQ,gBAAgB,OAAO;AAC5C,cAAQ,gBAAgB,QAAQ,WAAW;AAC3C,WAAK,KAAK,MAAM,OAAO,GAAG,OAAO,KAAK;AAAA,IACxC;AACA,QAAI,WAAW,OAAO,gBAAgB,MAAM;AAC1C,cAAQ,gBAAgB,OAAO,WAAW;AAC1C,WAAK,KAAK,MAAM,OAAO,GAAG,OAAO,KAAK;AAAA,IACxC;AACA,QAAI,WAAW,SAAS,gBAAgB,QAAQ;AAC9C,YAAM,SAAS,WAAW,SAAS,WAAW;AAC9C,YAAM,gBAAgB,UAAU,SAAS,UAAU,MAAM;AACzD,YAAM,WAAW,MAAM;AACvB,WAAK,KAAK,MAAM,MAAM,GAAG,WAAW,IAAI,KAAK,MAAM,KAAK,YAAY,UAAU,MAAM,QAAQ;AAC5F,WAAK,KAAK,UAAU,IAAI,SAAS;AAAA,IACnC;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,KAAK,OAAe,QAAQ,UAAU,MAAM,OAAO;AACjD,SAAK,YAAY,SAAS,KAAK,MAAM,UAAU;AAC/C,SAAK,KAAK,UAAU,OAAO,WAAW;AACtC,SAAK,KAAK,UAAU,IAAI,YAAY;AACpC,QAAI,CAACA,aAAAA,kBAAkB,OAAO,GAAG;AAC/B,WAAK,QAAQ,QAAQ;AAAA,IACvB,WACS,SAAS,KAAK,KAAK,aAAa,WAAW,GAAG;AACrD,WAAK,QAAQ,QAAQ;AAAA,IACvB;AACA,SAAK,SAAS,KAAK,MAAM,UAAU,SAAS,KAAK,MAAM,UAAU,UAAU,CAAC;AAC5E,QAAI,KAAK,QAAQ,UAAU,IAAI;AAC7B,WAAK,QAAQ,MAAA;AAAA,IACf;AACA,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK,QAAQ,aAAa,QAAQ,IAAI,EAAE,KAAK;AAAA,IAAA;AAE/C,SAAK,KAAK,aAAa,aAAa,IAAI;AAAA,EAC1C;AAAA,EAEA,OAAO;AACL,UAAM,KAAA;AACN,SAAK,KAAK,gBAAgB,WAAW;AAAA,EACvC;AAAA,EAEA,gBAAgB,KAAa;AAC3B,QAAI,SAAS;AACb,QAAI,CAAC,KAAK;AACR,aAAO;AAAA,IACT;AACA,QAAI,CAACC,aAAAA,YAAY,GAAG,GAAG;AACrB,eAAS,GAAG,KAAK,QAAQ,YAAY,MAAM,GAAG;AAAA,IAChD;AACA,WAAO;AAAA,EACT;AACF;AAxUE,cADW,aACJ,YAAmB;AAAA,EACxB,uDAAuDC,KAAAA,MAAM,eAAe;AAAA,EAC5E;AAAA,EACA;AAAA,EACA;AAAA,EACA,KAAK,EAAE;;"}
1
+ {"version":3,"file":"tooltip.cjs.js","sources":["../../../../../src/modules/link/modules/tooltip.ts"],"sourcesContent":["import type { Parchment as TypeParchment } from 'quill'\r\nimport type FluentEditor from '../../../core/fluent-editor'\r\nimport Quill, { Range } from 'quill'\r\nimport Emitter from 'quill/core/emitter'\r\nimport { BaseTooltip } from 'quill/themes/base'\r\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\r\nimport { hadProtocol, isNullOrUndefined } from '../../../config/editor.utils'\r\nimport { EN_US } from '../../../config/i18n/en-us'\r\nimport { debounce } from '../../../utils/debounce'\r\nimport { LinkBlot } from '../formats/link'\r\n\r\nexport class LinkTooltip extends BaseTooltip {\r\n static TEMPLATE: string = [\r\n `<input type=\"text\" data-formula=\"e=mc^2\" data-link=\"${EN_US.linkplaceholder}\" data-video=\"Embed URL\" style=\"width: 225px;\">`,\r\n '<span class=\"ql-split\"></span>',\r\n '<a class=\"ql-preview\"><i class=\"icon-share\"></i></a>',\r\n '<a class=\"ql-remove\"><i class=\"icon-delete\"></i></a>',\r\n ].join('')\r\n\r\n isInputFocus: boolean\r\n isHover: boolean\r\n debouncedHideToolTip: any\r\n debouncedShowToolTip: any\r\n options: { autoProtocol: string } = {\r\n autoProtocol: 'https',\r\n }\r\n\r\n constructor(public quill: FluentEditor, bounds) {\r\n super(quill, bounds)\r\n this.setTemplate()\r\n this.isInputFocus = false\r\n this.isHover = false\r\n\r\n this.resolveOptions()\r\n LinkBlot.autoProtocol = this.options.autoProtocol\r\n this.debouncedHideToolTip = debounce(this.hideToolTip, 300)\r\n this.debouncedShowToolTip = debounce(this.showToolTip, 300)\r\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, () => {\r\n this.setTemplate()\r\n })\r\n }\r\n\r\n setTemplate() {\r\n this.root.innerHTML = [\r\n `<input type=\"text\" data-formula=\"e=mc^2\" data-link=\"${this.quill.getLangText('linkplaceholder')}\" data-video=\"Embed URL\" style=\"width: 225px;\">`,\r\n '<span class=\"ql-split\"></span>',\r\n '<a class=\"ql-preview\"><i class=\"icon-share\"></i></a>',\r\n '<a class=\"ql-remove\"><i class=\"icon-delete\"></i></a>',\r\n ].join('')\r\n this.textbox = this.root.querySelector('input[type=\"text\"]')\r\n this.listen()\r\n }\r\n\r\n resolveOptions() {\r\n this.options = {\r\n autoProtocol: 'https',\r\n }\r\n const value = this.quill.options.autoProtocol\r\n if (value && typeof value === 'string') {\r\n this.options.autoProtocol = value\r\n }\r\n else if (typeof value === 'boolean' && !value) {\r\n this.options.autoProtocol = ''\r\n }\r\n }\r\n\r\n shouldHide() {\r\n return !this.isHover && !this.isInputFocus\r\n }\r\n\r\n hideToolTip() {\r\n if (this.shouldHide()) {\r\n this.hide()\r\n }\r\n }\r\n\r\n showToolTip(name, value, range) {\r\n if (!this.shouldHide()) {\r\n this.edit(name, value, range)\r\n }\r\n }\r\n\r\n handleMouseLeave() {\r\n this.isHover = false\r\n this.debouncedHideToolTip()\r\n }\r\n\r\n handleMouseEnter(event: MouseEvent) {\r\n const isTooltipShow = !this.root.classList.contains('ql-hidden')\r\n if (isTooltipShow) {\r\n return\r\n }\r\n\r\n if (this.isInputFocus) {\r\n this.save()\r\n }\r\n this.isHover = true\r\n const linkNode = event.target as HTMLElement\r\n const preview = LinkBlot.formats(linkNode)\r\n if (!preview || preview.startsWith('#')) {\r\n return\r\n }\r\n const linkBlot = Quill.find(linkNode) as TypeParchment.Blot\r\n const index = this.quill.getIndex(linkBlot)\r\n const [link, offset] = this.quill.scroll.descendant(\r\n LinkBlot,\r\n index,\r\n )\r\n const length = link && link.length()\r\n this.linkRange = new Range(index - offset, length)\r\n this.debouncedShowToolTip('link', preview, this.linkRange)\r\n }\r\n\r\n listen() {\r\n super.listen()\r\n this.root.querySelector('a.ql-remove').addEventListener('click', (event) => {\r\n if (!isNullOrUndefined(this.linkRange)) {\r\n const range = this.linkRange\r\n this.restoreFocus()\r\n this.quill.formatText(range, 'link', false, Emitter.sources.API)\r\n delete this.linkRange\r\n }\r\n event.preventDefault()\r\n this.hide()\r\n })\r\n\r\n this.quill.root.addEventListener(\r\n 'mouseover',\r\n (event) => {\r\n const target = event.target as HTMLElement\r\n if (\r\n (target.tagName.toUpperCase() !== 'A'\r\n || !target.classList.contains(LinkBlot.className))\r\n && !target.closest(`a.${LinkBlot.className}`)\r\n ) {\r\n return\r\n }\r\n this.handleMouseEnter(event)\r\n },\r\n false,\r\n )\r\n\r\n this.quill.root.addEventListener(\r\n 'mouseout',\r\n (event) => {\r\n const target = event.target as HTMLElement\r\n if (target.tagName.toUpperCase() !== 'A' && !target.closest(`a.${LinkBlot.className}`)) {\r\n return\r\n }\r\n this.handleMouseLeave()\r\n },\r\n false,\r\n )\r\n\r\n this.root.addEventListener(\r\n 'mouseenter',\r\n () => {\r\n this.isHover = true\r\n },\r\n false,\r\n )\r\n\r\n this.root.addEventListener('mouseleave', this.handleMouseLeave.bind(this), false)\r\n\r\n this.root.querySelector('a.ql-preview').addEventListener('click', (event) => {\r\n const link = LinkBlot.sanitize(this.textbox.value)\r\n window.open(link, '_blank')\r\n event.preventDefault()\r\n })\r\n this.root.querySelector('input[type=\"text\"]').addEventListener('focus', () => {\r\n this.isInputFocus = true\r\n })\r\n this.root.querySelector('input[type=\"text\"]').addEventListener('blur', () => {\r\n this.isInputFocus = false\r\n this.save()\r\n })\r\n this.quill.on(\r\n Emitter.events.SELECTION_CHANGE,\r\n (range, _oldRange, source) => {\r\n if (isNullOrUndefined(range)) return\r\n if (source === Emitter.sources.USER) {\r\n const [link, offset] = this.quill.scroll.descendant(\r\n LinkBlot,\r\n range.index,\r\n )\r\n\r\n if (!isNullOrUndefined(link)) {\r\n this.linkRange = new Range(range.index - offset, link.length())\r\n const preview = LinkBlot.formats(link.domNode)\r\n if (!preview.startsWith('#')) {\r\n this.edit('link', preview, this.linkRange)\r\n }\r\n return\r\n }\r\n }\r\n if (this.shouldHide()) {\r\n this.hide()\r\n }\r\n },\r\n )\r\n this.quill.on(\r\n Emitter.events.TEXT_CHANGE,\r\n () => {\r\n const selection = this.quill.getSelection()\r\n const index = selection && selection.index\r\n setTimeout(() => {\r\n const link = this.quill.scroll.descendant(\r\n LinkBlot,\r\n index,\r\n )[0]\r\n if (!link) {\r\n this.handleMouseLeave()\r\n }\r\n })\r\n },\r\n )\r\n }\r\n\r\n save() {\r\n let value = this.textbox.value\r\n if (!value) return\r\n this.textbox.value = ''\r\n switch (this.root.getAttribute('data-mode')) {\r\n case 'link': {\r\n const { scrollTop } = this.quill.root\r\n if (this.options.autoProtocol) {\r\n value = this.addHttpProtocol(value)\r\n }\r\n\r\n if (this.linkRange) {\r\n this.quill.formatText(\r\n this.linkRange,\r\n 'link',\r\n value,\r\n Emitter.sources.USER,\r\n )\r\n this.restoreFocus()\r\n }\r\n else {\r\n this.restoreFocus()\r\n this.quill.format('link', value, Emitter.sources.USER)\r\n }\r\n this.quill.root.scrollTop = scrollTop\r\n break\r\n }\r\n case 'formula': {\r\n const range = this.quill.getSelection(true)\r\n if (!isNullOrUndefined(range)) {\r\n const index = range.index + range.length\r\n this.quill.insertEmbed(\r\n index,\r\n this.root.getAttribute('data-mode'),\r\n value,\r\n Emitter.sources.USER,\r\n )\r\n if (this.root.getAttribute('data-mode') === 'formula') {\r\n this.quill.insertText(index + 1, ' ', Emitter.sources.USER)\r\n }\r\n this.quill.setSelection(index + 2, Emitter.sources.USER)\r\n }\r\n break\r\n }\r\n case 'video': {\r\n const range = this.quill.getSelection(true)\r\n this.quill.insertText(range.index, '\\n', Emitter.sources.USER)\r\n this.quill.insertEmbed(range.index + 1, 'video', { src: value }, Emitter.sources.USER)\r\n this.quill.insertText(range.index + 2, '\\n', Emitter.sources.USER)\r\n this.quill.setSelection(range.index + 3, Emitter.sources.SILENT)\r\n this.textbox.value = ''\r\n this.hide()\r\n break\r\n }\r\n default:\r\n }\r\n }\r\n\r\n position(reference) {\r\n const left = reference.left\r\n const top = reference.bottom + this.quill.root.scrollTop\r\n this.root.style.left = `${left}px`\r\n this.root.style.top = `${top}px`\r\n this.root.classList.remove('ql-flip')\r\n const containerBounds = this.boundsContainer.getBoundingClientRect()\r\n const rootBounds = this.root.getBoundingClientRect()\r\n let shift = 0\r\n if (rootBounds.right > containerBounds.right) {\r\n shift = containerBounds.right - rootBounds.right\r\n this.root.style.left = `${left + shift}px`\r\n }\r\n if (rootBounds.left < containerBounds.left) {\r\n shift = containerBounds.left - rootBounds.left\r\n this.root.style.left = `${left + shift}px`\r\n }\r\n if (rootBounds.bottom > containerBounds.bottom) {\r\n const height = rootBounds.bottom - rootBounds.top\r\n const verticalShift = reference.bottom - reference.top + height\r\n const fixedTop = top - verticalShift\r\n this.root.style.top = `${fixedTop < 0 ? this.quill.root.scrollTop + reference.top : fixedTop}px`\r\n this.root.classList.add('ql-flip')\r\n }\r\n return shift\r\n }\r\n\r\n // @ts-expect-error\r\n edit(mode: string = 'link', preview = null, range) {\r\n this.linkRange = range || this.quill.selection.savedRange\r\n this.root.classList.remove('ql-hidden')\r\n this.root.classList.add('ql-editing')\r\n if (!isNullOrUndefined(preview)) {\r\n this.textbox.value = preview\r\n }\r\n else if (mode !== this.root.getAttribute('data-mode')) {\r\n this.textbox.value = ''\r\n }\r\n this.position(this.quill.getBounds(range || this.quill.selection.savedRange))\r\n if (this.textbox.value === '') {\r\n this.textbox.focus()\r\n }\r\n this.textbox.setAttribute(\r\n 'placeholder',\r\n this.textbox.getAttribute(`data-${mode}`) || '',\r\n )\r\n this.root.setAttribute('data-mode', mode)\r\n }\r\n\r\n show() {\r\n super.show()\r\n this.root.removeAttribute('data-mode')\r\n }\r\n\r\n addHttpProtocol(url: string) {\r\n let result = url\r\n if (!url) {\r\n return ''\r\n }\r\n if (!hadProtocol(url)) {\r\n result = `${this.options.autoProtocol}://${url}`\r\n }\r\n return result\r\n }\r\n}\r\n"],"names":["BaseTooltip","LinkBlot","debounce","CHANGE_LANGUAGE_EVENT","link","Range","isNullOrUndefined","hadProtocol","EN_US"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"formats.cjs.js","sources":["../../../../src/modules/mathlive/formats.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\nimport type { Root } from 'parchment'\nimport Quill from 'quill'\n\nconst Parchment = Quill.import('parchment')\nexport type MathliveBlotMode = 'dialog' | 'only-read'\nexport class MathliveBlot extends Parchment.EmbedBlot {\n static blotName = 'mathlive'\n static tagName = 'math-field'\n static className = 'ql-math-field'\n mode: MathliveBlotMode\n\n static create(obj: { value: string, mode: MathliveBlotMode }) {\n const el = super.create() as MathfieldElement\n el.setAttribute('mode', obj.mode)\n el.classList.add('view')\n el.innerHTML = obj.value\n el.setValue(obj.value)\n return el\n }\n\n static value(domNode: MathfieldElement) {\n return {\n value: domNode.value,\n mode: domNode.getAttribute('mode'),\n }\n }\n\n constructor(scroll: Root, public domNode: MathfieldElement) {\n super(scroll, domNode)\n domNode.setAttribute('contenteditable', 'false')\n this.mode = (domNode.getAttribute('mode') || 'only-read') as MathliveBlotMode\n }\n\n html() {\n const formula = this.domNode.value\n return `<math-field class=\"ql-math-field view\" contenteditable=\"false\" mode=\"${this.mode}\">${formula}</math-field>`\n }\n}\n"],"names":[],"mappings":";;;;;;AAIA,MAAM,YAAY,MAAM,OAAO,WAAW;AAEnC,MAAM,qBAAqB,UAAU,UAAU;AAAA,EAsBpD,YAAY,QAAqB,SAA2B;AAC1D,UAAM,QAAQ,OAAO;AAnBvB;AAkBiC,SAAA,UAAA;AAE/B,YAAQ,aAAa,mBAAmB,OAAO;AAC/C,SAAK,OAAQ,QAAQ,aAAa,MAAM,KAAK;AAAA,EAC/C;AAAA,EApBA,OAAO,OAAO,KAAgD;AAC5D,UAAM,KAAK,MAAM,OAAA;AACjB,OAAG,aAAa,QAAQ,IAAI,IAAI;AAChC,OAAG,UAAU,IAAI,MAAM;AACvB,OAAG,YAAY,IAAI;AACnB,OAAG,SAAS,IAAI,KAAK;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAM,SAA2B;AACtC,WAAO;AAAA,MACL,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ,aAAa,MAAM;AAAA,IAAA;AAAA,EAErC;AAAA,EAQA,OAAO;AACL,UAAM,UAAU,KAAK,QAAQ;AAC7B,WAAO,wEAAwE,KAAK,IAAI,KAAK,OAAO;AAAA,EACtG;AACF;AA/BE,cADW,cACJ,YAAW;AAClB,cAFW,cAEJ,WAAU;AACjB,cAHW,cAGJ,aAAY;;"}
1
+ {"version":3,"file":"formats.cjs.js","sources":["../../../../src/modules/mathlive/formats.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\r\nimport type { Root } from 'parchment'\r\nimport Quill from 'quill'\r\n\r\nconst Parchment = Quill.import('parchment')\r\nexport type MathliveBlotMode = 'dialog' | 'only-read'\r\nexport class MathliveBlot extends Parchment.EmbedBlot {\r\n static blotName = 'mathlive'\r\n static tagName = 'math-field'\r\n static className = 'ql-math-field'\r\n mode: MathliveBlotMode\r\n\r\n static create(obj: { value: string, mode: MathliveBlotMode }) {\r\n const el = super.create() as MathfieldElement\r\n el.setAttribute('mode', obj.mode)\r\n el.classList.add('view')\r\n el.innerHTML = obj.value\r\n el.setValue(obj.value)\r\n return el\r\n }\r\n\r\n static value(domNode: MathfieldElement) {\r\n return {\r\n value: domNode.value,\r\n mode: domNode.getAttribute('mode'),\r\n }\r\n }\r\n\r\n constructor(scroll: Root, public domNode: MathfieldElement) {\r\n super(scroll, domNode)\r\n domNode.setAttribute('contenteditable', 'false')\r\n this.mode = (domNode.getAttribute('mode') || 'only-read') as MathliveBlotMode\r\n }\r\n\r\n html() {\r\n const formula = this.domNode.value\r\n return `<math-field class=\"ql-math-field view\" contenteditable=\"false\" mode=\"${this.mode}\">${formula}</math-field>`\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;;AAIA,MAAM,YAAY,MAAM,OAAO,WAAW;AAEnC,MAAM,qBAAqB,UAAU,UAAU;AAAA,EAsBpD,YAAY,QAAqB,SAA2B;AAC1D,UAAM,QAAQ,OAAO;AAnBvB;AAkBiC,SAAA,UAAA;AAE/B,YAAQ,aAAa,mBAAmB,OAAO;AAC/C,SAAK,OAAQ,QAAQ,aAAa,MAAM,KAAK;AAAA,EAC/C;AAAA,EApBA,OAAO,OAAO,KAAgD;AAC5D,UAAM,KAAK,MAAM,OAAA;AACjB,OAAG,aAAa,QAAQ,IAAI,IAAI;AAChC,OAAG,UAAU,IAAI,MAAM;AACvB,OAAG,YAAY,IAAI;AACnB,OAAG,SAAS,IAAI,KAAK;AACrB,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAM,SAA2B;AACtC,WAAO;AAAA,MACL,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ,aAAa,MAAM;AAAA,IAAA;AAAA,EAErC;AAAA,EAQA,OAAO;AACL,UAAM,UAAU,KAAK,QAAQ;AAC7B,WAAO,wEAAwE,KAAK,IAAI,KAAK,OAAO;AAAA,EACtG;AACF;AA/BE,cADW,cACJ,YAAW;AAClB,cAFW,cAEJ,WAAU;AACjB,cAHW,cAGJ,aAAY;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.cjs.js","sources":["../../../../src/modules/mathlive/tooltip.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\nimport type { Bounds } from 'quill/core/selection'\nimport type TypeTooltip from 'quill/ui/tooltip'\nimport Quill from 'quill'\nimport { isString } from '../../utils/is'\n\nconst Delta = Quill.import('delta')\nconst Tooltip = Quill.import('ui/tooltip') as typeof TypeTooltip\nexport class MathliveTooltip extends Tooltip {\n static TEMPLATE = ``\n\n mathliveDom: MathfieldElement\n editValue?: string\n\n constructor(quill: Quill, boundsContainer?: HTMLElement) {\n super(quill, boundsContainer)\n this.mathliveDom = document.createElement('math-field') as MathfieldElement\n this.mathliveDom.classList.add('ql-math-field')\n this.root.appendChild(this.mathliveDom)\n this.root.classList.add('math-field-tooltip')\n this.listen()\n }\n\n listen() {\n this.mathliveDom.addEventListener('blur', (event) => {\n this.hide()\n })\n this.root.addEventListener('keydown', (event) => {\n if (event.key === 'Enter') {\n event.preventDefault()\n this.save()\n }\n else if (event.key === 'Escape') {\n event.preventDefault()\n this.cancel()\n }\n })\n }\n\n cancel() {\n this.hide()\n this.restoreFocus()\n }\n\n edit(value?: string) {\n this.editValue = value\n this.root.classList.remove('ql-hidden')\n this.root.classList.add('ql-editing')\n this.mathliveDom.setValue(value || '')\n const range = this.quill.getSelection()\n const bounds = range ? this.quill.getBounds(range) : null\n if (bounds != null) {\n this.position(bounds)\n }\n this.show()\n this.mathliveDom.focus()\n }\n\n restoreFocus() {\n this.mathliveDom.blur()\n this.quill.focus({ preventScroll: true })\n }\n\n save() {\n const range = this.quill.getSelection(true)\n const inputValue = this.mathliveDom.value\n if (!inputValue) return\n const contentData = this.quill.getContents(range.index, 1).ops[0].insert\n let deleteCount = 0\n if (!isString(contentData) && contentData.mathlive) {\n deleteCount += 1\n }\n const delta = new Delta()\n .retain(range.index)\n .delete(Math.max(deleteCount, range.length))\n .insert({ mathlive: { value: inputValue, mode: 'dialog' } })\n this.quill.updateContents(delta, Quill.sources.USER)\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\n this.hide()\n }\n\n position(reference: Bounds) {\n const adjustedReference = { ...reference }\n adjustedReference.left = reference.left + this.root.offsetWidth / 2 - reference.width / 2\n return super.position(adjustedReference)\n }\n}\n"],"names":["isString"],"mappings":";;;;;;;AAMA,MAAM,QAAQ,MAAM,OAAO,OAAO;AAClC,MAAM,UAAU,MAAM,OAAO,YAAY;AAClC,MAAM,wBAAwB,QAAQ;AAAA,EAM3C,YAAY,OAAc,iBAA+B;AACvD,UAAM,OAAO,eAAe;AAJ9B;AACA;AAIE,SAAK,cAAc,SAAS,cAAc,YAAY;AACtD,SAAK,YAAY,UAAU,IAAI,eAAe;AAC9C,SAAK,KAAK,YAAY,KAAK,WAAW;AACtC,SAAK,KAAK,UAAU,IAAI,oBAAoB;AAC5C,SAAK,OAAA;AAAA,EACP;AAAA,EAEA,SAAS;AACP,SAAK,YAAY,iBAAiB,QAAQ,CAAC,UAAU;AACnD,WAAK,KAAA;AAAA,IACP,CAAC;AACD,SAAK,KAAK,iBAAiB,WAAW,CAAC,UAAU;AAC/C,UAAI,MAAM,QAAQ,SAAS;AACzB,cAAM,eAAA;AACN,aAAK,KAAA;AAAA,MACP,WACS,MAAM,QAAQ,UAAU;AAC/B,cAAM,eAAA;AACN,aAAK,OAAA;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,SAAS;AACP,SAAK,KAAA;AACL,SAAK,aAAA;AAAA,EACP;AAAA,EAEA,KAAK,OAAgB;AACnB,SAAK,YAAY;AACjB,SAAK,KAAK,UAAU,OAAO,WAAW;AACtC,SAAK,KAAK,UAAU,IAAI,YAAY;AACpC,SAAK,YAAY,SAAS,SAAS,EAAE;AACrC,UAAM,QAAQ,KAAK,MAAM,aAAA;AACzB,UAAM,SAAS,QAAQ,KAAK,MAAM,UAAU,KAAK,IAAI;AACrD,QAAI,UAAU,MAAM;AAClB,WAAK,SAAS,MAAM;AAAA,IACtB;AACA,SAAK,KAAA;AACL,SAAK,YAAY,MAAA;AAAA,EACnB;AAAA,EAEA,eAAe;AACb,SAAK,YAAY,KAAA;AACjB,SAAK,MAAM,MAAM,EAAE,eAAe,MAAM;AAAA,EAC1C;AAAA,EAEA,OAAO;AACL,UAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AAC1C,UAAM,aAAa,KAAK,YAAY;AACpC,QAAI,CAAC,WAAY;AACjB,UAAM,cAAc,KAAK,MAAM,YAAY,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE;AAClE,QAAI,cAAc;AAClB,QAAI,CAACA,GAAAA,SAAS,WAAW,KAAK,YAAY,UAAU;AAClD,qBAAe;AAAA,IACjB;AACA,UAAM,QAAQ,IAAI,MAAA,EACf,OAAO,MAAM,KAAK,EAClB,OAAO,KAAK,IAAI,aAAa,MAAM,MAAM,CAAC,EAC1C,OAAO,EAAE,UAAU,EAAE,OAAO,YAAY,MAAM,SAAA,GAAY;AAC7D,SAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AACnD,SAAK,MAAM,aAAa,MAAM,QAAQ,GAAG,MAAM,QAAQ,MAAM;AAC7D,SAAK,KAAA;AAAA,EACP;AAAA,EAEA,SAAS,WAAmB;AAC1B,UAAM,oBAAoB,EAAE,GAAG,UAAA;AAC/B,sBAAkB,OAAO,UAAU,OAAO,KAAK,KAAK,cAAc,IAAI,UAAU,QAAQ;AACxF,WAAO,MAAM,SAAS,iBAAiB;AAAA,EACzC;AACF;AA7EE,cADW,iBACJ,YAAW;;"}
1
+ {"version":3,"file":"tooltip.cjs.js","sources":["../../../../src/modules/mathlive/tooltip.ts"],"sourcesContent":["import type { MathfieldElement } from 'mathlive'\r\nimport type { Bounds } from 'quill/core/selection'\r\nimport type TypeTooltip from 'quill/ui/tooltip'\r\nimport Quill from 'quill'\r\nimport { isString } from '../../utils/is'\r\n\r\nconst Delta = Quill.import('delta')\r\nconst Tooltip = Quill.import('ui/tooltip') as typeof TypeTooltip\r\nexport class MathliveTooltip extends Tooltip {\r\n static TEMPLATE = ``\r\n\r\n mathliveDom: MathfieldElement\r\n editValue?: string\r\n\r\n constructor(quill: Quill, boundsContainer?: HTMLElement) {\r\n super(quill, boundsContainer)\r\n this.mathliveDom = document.createElement('math-field') as MathfieldElement\r\n this.mathliveDom.classList.add('ql-math-field')\r\n this.root.appendChild(this.mathliveDom)\r\n this.root.classList.add('math-field-tooltip')\r\n this.listen()\r\n }\r\n\r\n listen() {\r\n this.mathliveDom.addEventListener('blur', (event) => {\r\n this.hide()\r\n })\r\n this.root.addEventListener('keydown', (event) => {\r\n if (event.key === 'Enter') {\r\n event.preventDefault()\r\n this.save()\r\n }\r\n else if (event.key === 'Escape') {\r\n event.preventDefault()\r\n this.cancel()\r\n }\r\n })\r\n }\r\n\r\n cancel() {\r\n this.hide()\r\n this.restoreFocus()\r\n }\r\n\r\n edit(value?: string) {\r\n this.editValue = value\r\n this.root.classList.remove('ql-hidden')\r\n this.root.classList.add('ql-editing')\r\n this.mathliveDom.setValue(value || '')\r\n const range = this.quill.getSelection()\r\n const bounds = range ? this.quill.getBounds(range) : null\r\n if (bounds != null) {\r\n this.position(bounds)\r\n }\r\n this.show()\r\n this.mathliveDom.focus()\r\n }\r\n\r\n restoreFocus() {\r\n this.mathliveDom.blur()\r\n this.quill.focus({ preventScroll: true })\r\n }\r\n\r\n save() {\r\n const range = this.quill.getSelection(true)\r\n const inputValue = this.mathliveDom.value\r\n if (!inputValue) return\r\n const contentData = this.quill.getContents(range.index, 1).ops[0].insert\r\n let deleteCount = 0\r\n if (!isString(contentData) && contentData.mathlive) {\r\n deleteCount += 1\r\n }\r\n const delta = new Delta()\r\n .retain(range.index)\r\n .delete(Math.max(deleteCount, range.length))\r\n .insert({ mathlive: { value: inputValue, mode: 'dialog' } })\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\r\n this.hide()\r\n }\r\n\r\n position(reference: Bounds) {\r\n const adjustedReference = { ...reference }\r\n adjustedReference.left = reference.left + this.root.offsetWidth / 2 - reference.width / 2\r\n return super.position(adjustedReference)\r\n }\r\n}\r\n"],"names":["isString"],"mappings":";;;;;;;AAMA,MAAM,QAAQ,MAAM,OAAO,OAAO;AAClC,MAAM,UAAU,MAAM,OAAO,YAAY;AAClC,MAAM,wBAAwB,QAAQ;AAAA,EAM3C,YAAY,OAAc,iBAA+B;AACvD,UAAM,OAAO,eAAe;AAJ9B;AACA;AAIE,SAAK,cAAc,SAAS,cAAc,YAAY;AACtD,SAAK,YAAY,UAAU,IAAI,eAAe;AAC9C,SAAK,KAAK,YAAY,KAAK,WAAW;AACtC,SAAK,KAAK,UAAU,IAAI,oBAAoB;AAC5C,SAAK,OAAA;AAAA,EACP;AAAA,EAEA,SAAS;AACP,SAAK,YAAY,iBAAiB,QAAQ,CAAC,UAAU;AACnD,WAAK,KAAA;AAAA,IACP,CAAC;AACD,SAAK,KAAK,iBAAiB,WAAW,CAAC,UAAU;AAC/C,UAAI,MAAM,QAAQ,SAAS;AACzB,cAAM,eAAA;AACN,aAAK,KAAA;AAAA,MACP,WACS,MAAM,QAAQ,UAAU;AAC/B,cAAM,eAAA;AACN,aAAK,OAAA;AAAA,MACP;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,SAAS;AACP,SAAK,KAAA;AACL,SAAK,aAAA;AAAA,EACP;AAAA,EAEA,KAAK,OAAgB;AACnB,SAAK,YAAY;AACjB,SAAK,KAAK,UAAU,OAAO,WAAW;AACtC,SAAK,KAAK,UAAU,IAAI,YAAY;AACpC,SAAK,YAAY,SAAS,SAAS,EAAE;AACrC,UAAM,QAAQ,KAAK,MAAM,aAAA;AACzB,UAAM,SAAS,QAAQ,KAAK,MAAM,UAAU,KAAK,IAAI;AACrD,QAAI,UAAU,MAAM;AAClB,WAAK,SAAS,MAAM;AAAA,IACtB;AACA,SAAK,KAAA;AACL,SAAK,YAAY,MAAA;AAAA,EACnB;AAAA,EAEA,eAAe;AACb,SAAK,YAAY,KAAA;AACjB,SAAK,MAAM,MAAM,EAAE,eAAe,MAAM;AAAA,EAC1C;AAAA,EAEA,OAAO;AACL,UAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AAC1C,UAAM,aAAa,KAAK,YAAY;AACpC,QAAI,CAAC,WAAY;AACjB,UAAM,cAAc,KAAK,MAAM,YAAY,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE;AAClE,QAAI,cAAc;AAClB,QAAI,CAACA,GAAAA,SAAS,WAAW,KAAK,YAAY,UAAU;AAClD,qBAAe;AAAA,IACjB;AACA,UAAM,QAAQ,IAAI,MAAA,EACf,OAAO,MAAM,KAAK,EAClB,OAAO,KAAK,IAAI,aAAa,MAAM,MAAM,CAAC,EAC1C,OAAO,EAAE,UAAU,EAAE,OAAO,YAAY,MAAM,SAAA,GAAY;AAC7D,SAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AACnD,SAAK,MAAM,aAAa,MAAM,QAAQ,GAAG,MAAM,QAAQ,MAAM;AAC7D,SAAK,KAAA;AAAA,EACP;AAAA,EAEA,SAAS,WAAmB;AAC1B,UAAM,oBAAoB,EAAE,GAAG,UAAA;AAC/B,sBAAkB,OAAO,UAAU,OAAO,KAAK,KAAK,cAAc,IAAI,UAAU,QAAQ;AACxF,WAAO,MAAM,SAAS,iBAAiB;AAAA,EACzC;AACF;AA7EE,cADW,iBACJ,YAAW;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"constants.cjs.js","sources":["../../../../src/modules/mention/constants.ts"],"sourcesContent":["export const ON_MENTION_LINK_REMOVE = 'mention-link/remove'\nexport const MENTION_CHAR = 'mentionChar'\nexport const DEFAULT_MENTION_CHAR = '@'\n"],"names":[],"mappings":";;AAAO,MAAM,yBAAyB;AAC/B,MAAM,eAAe;AACrB,MAAM,uBAAuB;;;;"}
1
+ {"version":3,"file":"constants.cjs.js","sources":["../../../../src/modules/mention/constants.ts"],"sourcesContent":["export const ON_MENTION_LINK_REMOVE = 'mention-link/remove'\r\nexport const MENTION_CHAR = 'mentionChar'\r\nexport const DEFAULT_MENTION_CHAR = '@'\r\n"],"names":[],"mappings":";;AAAO,MAAM,yBAAyB;AAC/B,MAAM,eAAe;AACrB,MAAM,uBAAuB;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"mention-link.cjs.js","sources":["../../../../src/modules/mention/mention-link.ts"],"sourcesContent":["import type TypeEmbed from 'quill/blots/embed'\nimport type TypeScroll from 'quill/blots/scroll'\nimport Quill from 'quill'\nimport { DEFAULT_MENTION_CHAR, MENTION_CHAR, ON_MENTION_LINK_REMOVE } from './constants'\n\nconst Embed = Quill.import('blots/embed') as typeof TypeEmbed\n\nexport class MentionLink extends Embed {\n static blotName: string\n static tagName: string\n static className: string\n mentionData: any\n\n static create(data) {\n let node: HTMLElement\n if (data.link) {\n node = document.createElement('a')\n node.setAttribute('href', data.link)\n node.setAttribute('target', data.target)\n }\n else {\n node = document.createElement(this.tagName)\n }\n node.classList.add(this.className)\n node.dataset.mentionId = data.name || (data.mention && data.mention[data.searchKey || 'name']) || ''\n node.setAttribute('title', data.text)\n node.setAttribute(MENTION_CHAR, data.char)\n node.textContent = data.char + data.text\n return node\n }\n\n static value(domNode: HTMLElement) {\n const value: Record<string, any> = {\n char: domNode.getAttribute(MENTION_CHAR) || DEFAULT_MENTION_CHAR,\n text: domNode.getAttribute('title'),\n name: domNode.dataset.mentionId,\n }\n if (domNode.tagName.toLowerCase() === 'a' && domNode.hasAttribute('href')) {\n value.link = domNode.getAttribute('href')\n value.target = domNode.getAttribute('target')\n }\n return value\n }\n\n constructor(public scroll: TypeScroll, domNode, data) {\n super(scroll, domNode)\n this.mentionData = data\n }\n\n value() {\n // fix: 将@提醒内容加入到 Delta 里,以解决输入空格,@提醒内容被删除的问题\n // return ' ';\n return super.value()\n }\n\n remove() {\n this.scroll.emitter.emit(ON_MENTION_LINK_REMOVE, this.mentionData)\n return super.remove()\n }\n}\n\nMentionLink.blotName = 'mention'\nMentionLink.tagName = 'span'\nMentionLink.className = 'ql-mention-link'\n"],"names":["MENTION_CHAR","DEFAULT_MENTION_CHAR","ON_MENTION_LINK_REMOVE"],"mappings":";;;;;;;AAKA,MAAM,QAAQ,MAAM,OAAO,aAAa;AAEjC,MAAM,oBAAoB,MAAM;AAAA,EAqCrC,YAAmB,QAAoB,SAAS,MAAM;AACpD,UAAM,QAAQ,OAAO;AAlCvB;AAiCmB,SAAA,SAAA;AAEjB,SAAK,cAAc;AAAA,EACrB;AAAA,EAlCA,OAAO,OAAO,MAAM;AAClB,QAAI;AACJ,QAAI,KAAK,MAAM;AACb,aAAO,SAAS,cAAc,GAAG;AACjC,WAAK,aAAa,QAAQ,KAAK,IAAI;AACnC,WAAK,aAAa,UAAU,KAAK,MAAM;AAAA,IACzC,OACK;AACH,aAAO,SAAS,cAAc,KAAK,OAAO;AAAA,IAC5C;AACA,SAAK,UAAU,IAAI,KAAK,SAAS;AACjC,SAAK,QAAQ,YAAY,KAAK,QAAS,KAAK,WAAW,KAAK,QAAQ,KAAK,aAAa,MAAM,KAAM;AAClG,SAAK,aAAa,SAAS,KAAK,IAAI;AACpC,SAAK,aAAaA,wBAAc,KAAK,IAAI;AACzC,SAAK,cAAc,KAAK,OAAO,KAAK;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAM,SAAsB;AACjC,UAAM,QAA6B;AAAA,MACjC,MAAM,QAAQ,aAAaA,UAAAA,YAAY,KAAKC,UAAAA;AAAAA,MAC5C,MAAM,QAAQ,aAAa,OAAO;AAAA,MAClC,MAAM,QAAQ,QAAQ;AAAA,IAAA;AAExB,QAAI,QAAQ,QAAQ,YAAA,MAAkB,OAAO,QAAQ,aAAa,MAAM,GAAG;AACzE,YAAM,OAAO,QAAQ,aAAa,MAAM;AACxC,YAAM,SAAS,QAAQ,aAAa,QAAQ;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA,EAOA,QAAQ;AAGN,WAAO,MAAM,MAAA;AAAA,EACf;AAAA,EAEA,SAAS;AACP,SAAK,OAAO,QAAQ,KAAKC,UAAAA,wBAAwB,KAAK,WAAW;AACjE,WAAO,MAAM,OAAA;AAAA,EACf;AACF;AAnDE,cADW,aACJ;AACP,cAFW,aAEJ;AACP,cAHW,aAGJ;AAmDT,YAAY,WAAW;AACvB,YAAY,UAAU;AACtB,YAAY,YAAY;;"}
1
+ {"version":3,"file":"mention-link.cjs.js","sources":["../../../../src/modules/mention/mention-link.ts"],"sourcesContent":["import type TypeEmbed from 'quill/blots/embed'\r\nimport type TypeScroll from 'quill/blots/scroll'\r\nimport Quill from 'quill'\r\nimport { DEFAULT_MENTION_CHAR, MENTION_CHAR, ON_MENTION_LINK_REMOVE } from './constants'\r\n\r\nconst Embed = Quill.import('blots/embed') as typeof TypeEmbed\r\n\r\nexport class MentionLink extends Embed {\r\n static blotName: string\r\n static tagName: string\r\n static className: string\r\n mentionData: any\r\n\r\n static create(data) {\r\n let node: HTMLElement\r\n if (data.link) {\r\n node = document.createElement('a')\r\n node.setAttribute('href', data.link)\r\n node.setAttribute('target', data.target)\r\n }\r\n else {\r\n node = document.createElement(this.tagName)\r\n }\r\n node.classList.add(this.className)\r\n node.dataset.mentionId = data.name || (data.mention && data.mention[data.searchKey || 'name']) || ''\r\n node.setAttribute('title', data.text)\r\n node.setAttribute(MENTION_CHAR, data.char)\r\n node.textContent = data.char + data.text\r\n return node\r\n }\r\n\r\n static value(domNode: HTMLElement) {\r\n const value: Record<string, any> = {\r\n char: domNode.getAttribute(MENTION_CHAR) || DEFAULT_MENTION_CHAR,\r\n text: domNode.getAttribute('title'),\r\n name: domNode.dataset.mentionId,\r\n }\r\n if (domNode.tagName.toLowerCase() === 'a' && domNode.hasAttribute('href')) {\r\n value.link = domNode.getAttribute('href')\r\n value.target = domNode.getAttribute('target')\r\n }\r\n return value\r\n }\r\n\r\n constructor(public scroll: TypeScroll, domNode, data) {\r\n super(scroll, domNode)\r\n this.mentionData = data\r\n }\r\n\r\n value() {\r\n // fix: 将@提醒内容加入到 Delta 里,以解决输入空格,@提醒内容被删除的问题\r\n // return ' ';\r\n return super.value()\r\n }\r\n\r\n remove() {\r\n this.scroll.emitter.emit(ON_MENTION_LINK_REMOVE, this.mentionData)\r\n return super.remove()\r\n }\r\n}\r\n\r\nMentionLink.blotName = 'mention'\r\nMentionLink.tagName = 'span'\r\nMentionLink.className = 'ql-mention-link'\r\n"],"names":["MENTION_CHAR","DEFAULT_MENTION_CHAR","ON_MENTION_LINK_REMOVE"],"mappings":";;;;;;;AAKA,MAAM,QAAQ,MAAM,OAAO,aAAa;AAEjC,MAAM,oBAAoB,MAAM;AAAA,EAqCrC,YAAmB,QAAoB,SAAS,MAAM;AACpD,UAAM,QAAQ,OAAO;AAlCvB;AAiCmB,SAAA,SAAA;AAEjB,SAAK,cAAc;AAAA,EACrB;AAAA,EAlCA,OAAO,OAAO,MAAM;AAClB,QAAI;AACJ,QAAI,KAAK,MAAM;AACb,aAAO,SAAS,cAAc,GAAG;AACjC,WAAK,aAAa,QAAQ,KAAK,IAAI;AACnC,WAAK,aAAa,UAAU,KAAK,MAAM;AAAA,IACzC,OACK;AACH,aAAO,SAAS,cAAc,KAAK,OAAO;AAAA,IAC5C;AACA,SAAK,UAAU,IAAI,KAAK,SAAS;AACjC,SAAK,QAAQ,YAAY,KAAK,QAAS,KAAK,WAAW,KAAK,QAAQ,KAAK,aAAa,MAAM,KAAM;AAClG,SAAK,aAAa,SAAS,KAAK,IAAI;AACpC,SAAK,aAAaA,wBAAc,KAAK,IAAI;AACzC,SAAK,cAAc,KAAK,OAAO,KAAK;AACpC,WAAO;AAAA,EACT;AAAA,EAEA,OAAO,MAAM,SAAsB;AACjC,UAAM,QAA6B;AAAA,MACjC,MAAM,QAAQ,aAAaA,UAAAA,YAAY,KAAKC,UAAAA;AAAAA,MAC5C,MAAM,QAAQ,aAAa,OAAO;AAAA,MAClC,MAAM,QAAQ,QAAQ;AAAA,IAAA;AAExB,QAAI,QAAQ,QAAQ,YAAA,MAAkB,OAAO,QAAQ,aAAa,MAAM,GAAG;AACzE,YAAM,OAAO,QAAQ,aAAa,MAAM;AACxC,YAAM,SAAS,QAAQ,aAAa,QAAQ;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA,EAOA,QAAQ;AAGN,WAAO,MAAM,MAAA;AAAA,EACf;AAAA,EAEA,SAAS;AACP,SAAK,OAAO,QAAQ,KAAKC,UAAAA,wBAAwB,KAAK,WAAW;AACjE,WAAO,MAAM,OAAA;AAAA,EACf;AACF;AAnDE,cADW,aACJ;AACP,cAFW,aAEJ;AACP,cAHW,aAGJ;AAmDT,YAAY,WAAW;AACvB,YAAY,UAAU;AACtB,YAAY,YAAY;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"mention.cjs.js","sources":["../../../../src/modules/mention/mention.ts"],"sourcesContent":["import Quill from 'quill'\nimport { isNullOrUndefined } from '../../config/editor.utils'\nimport { DEFAULT_MENTION_CHAR, ON_MENTION_LINK_REMOVE } from './constants'\nimport { MentionLink } from './mention-link'\n\nconst Delta = Quill.import('delta')\nconst Parchment = Quill.import('parchment')\nconst { Scope } = Parchment\n\nexport interface MentionOption {\n containerClass?: string\n // dataAttributes?: string[]\n defaultLink?: string\n itemActiveClass?: string\n itemKey: string\n itemClass?: string\n listClass?: string\n listHideClass?: string\n maxHeight?: number\n mentionChar?: string\n remove?: (data: any) => void\n renderMentionItem?: (data: any) => string | HTMLElement\n renderMentionText?: (data: any) => string | HTMLElement\n search?: (term: string) => Promise<any[]> | any[]\n searchKey: string\n select?: (data: any) => void\n target?: string\n}\n\nexport class Mention {\n private readonly options: MentionOption\n private readonly mentionListEL: HTMLUListElement\n private activeMentionIndex = 0\n private latestMentionList: any[]\n private latestMentionCharPos: number\n private latestCaretPos: number\n private searchTerm = ''\n private needInsertBr = true\n private readonly defaultOptions: MentionOption = {\n defaultLink: '#',\n target: '_blank',\n mentionChar: DEFAULT_MENTION_CHAR,\n maxHeight: 200,\n renderMentionItem(data: any) {\n let mentionItem = data.name || data.id\n if (this.itemKey) {\n mentionItem = data[this.itemKey]\n }\n const dom = document.createElement('SPAN')\n dom.textContent = mentionItem\n return dom\n },\n renderMentionText(data: any) {\n let mentionText = data.name || data.id\n if (this.itemKey) {\n mentionText = data[this.itemKey]\n }\n return `${mentionText}`\n },\n containerClass: 'ql-mention-list-container',\n listClass: 'ql-mention-list',\n listHideClass: 'ql-mention-list--hide',\n itemClass: 'ql-mention-item',\n itemActiveClass: 'ql-mention-item--active',\n itemKey: 'name',\n searchKey: 'name',\n // dataAttributes: ['id'],\n select(_data: any) {},\n remove(_data: any) {},\n }\n\n static register() {\n Quill.register(MentionLink)\n }\n\n // @ts-ignore\n constructor(private quill: Quill, options: MentionOption) {\n if (!options.search) {\n console.warn('please provide a search function!')\n return\n }\n\n this.options = Object.assign(this.defaultOptions, options)\n const container = document.createElement('div')\n container.classList.add('ql-mention-list-container')\n if (this.options.containerClass !== 'ql-mention-list-container') {\n container.classList.add(this.options.containerClass)\n }\n this.mentionListEL = document.createElement('ul')\n this.mentionListEL.classList.add(this.options.listClass, this.options.listHideClass)\n this.mentionListEL.style.cssText += `\n max-height: ${this.options.maxHeight}px;\n `\n\n quill.on(Quill.events.TEXT_CHANGE, this.handleTextChange)\n quill.keyboard.addBinding({ key: 'ArrowUp' }, this.handleArrowUpKey)\n quill.keyboard.addBinding({ key: 'ArrowDown' }, this.handleArrowDownKey)\n quill.keyboard.addBinding({ key: 'Enter' }, this.handleEnterKey)\n quill.keyboard.addBinding({ key: 'Tab' }, this.handleEnterKey)\n quill.keyboard.addBinding({ key: 'Escape' }, this.handleEscapeKey)\n quill.keyboard.bindings.Enter.unshift(quill.keyboard.bindings.Enter.pop())\n quill.keyboard.bindings.Tab.unshift(quill.keyboard.bindings.Tab.pop())\n quill.keyboard.bindings.Escape.unshift(quill.keyboard.bindings.Escape.pop())\n\n const customKeyboardEnter = {\n key: 'Enter',\n shiftKey: null,\n handler: (range, context) => {\n const lineFormats = Object.keys(context.format).reduce(\n (formats, format) => {\n if (\n this.quill.scroll.query(format, Scope.BLOCK)\n && !Array.isArray(context.format[format])\n ) {\n formats[format] = context.format[format]\n }\n return formats\n },\n {},\n )\n\n // fix: 解决@提醒之后插入多余空行和光标位置不对的问题\n let selectionIndex = range.index - this.searchTerm.length\n let delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n if (this.needInsertBr) {\n delta = delta.insert('\\n', lineFormats)\n selectionIndex = range.index + 1\n }\n\n this.quill.updateContents(delta, Quill.sources.USER)\n this.quill.setSelection(selectionIndex, Quill.sources.SILENT)\n this.quill.focus()\n\n Object.keys(context.format).forEach((name) => {\n if (!isNullOrUndefined(lineFormats[name])) return\n if (Array.isArray(context.format[name])) return\n if (name === 'code' || name === 'link') return\n this.quill.format(name, context.format[name], Quill.sources.USER)\n })\n\n this.needInsertBr = true // 标记是否是输入@提醒的Enter\n },\n }\n\n // 用自定义的Enter替换内置的Enter\n quill.keyboard.bindings.Enter = quill.keyboard.bindings.Enter.map((item) => {\n const buildinKeyboardEnter = item.format === undefined && item.shiftKey === null\n if (buildinKeyboardEnter) {\n return customKeyboardEnter\n }\n else {\n return item\n }\n })\n\n this.on('click', this.handleMouseClick)\n this.on('mouseover', this.handleMouseEnter)\n quill.emitter.on(ON_MENTION_LINK_REMOVE, async ({ mention, name }) => {\n const [result] = (mention && [mention]) || (await this.options.search(name))\n this.options.remove(result)\n })\n container.appendChild(this.mentionListEL)\n quill.container.parentElement.insertBefore(container, quill.container)\n }\n\n on(eventName, callback) {\n this.mentionListEL.addEventListener(eventName, (evt) => {\n let\n target = evt.target\n let targetItemEL\n\n while (this.mentionListEL.contains(target) && target !== this.mentionListEL) {\n if (target.classList.contains(this.options.itemClass)) {\n targetItemEL = target\n }\n target = target.parentElement\n }\n\n if (targetItemEL) {\n callback.call(this, targetItemEL, this.getMentionItemIndex(targetItemEL))\n }\n })\n }\n\n getMentionItemIndex(itemEl: Element) {\n return [].reduce.call(this.mentionListEL.children, (index, item, idx) => item === itemEl ? idx : index, -1)\n }\n\n handleTextChange = (_delta, _oldDelta, source) => {\n // defer handler to make sure that we can get correct quill selection range.\n setTimeout(() => {\n if (Quill.sources.USER === source) {\n const range = this.quill.getSelection()\n if (!range) {\n return\n }\n\n const caretPos = this.latestCaretPos = range.index\n // beforeCaretText的计算有问题,没有把图片内容和@提醒内容的非字符内容算进去\n const content = this.quill.getContents()\n const beforeCaretText = content.reduce((newText, op) => {\n if (typeof op.insert === 'string') {\n return (newText += op.insert)\n }\n else {\n return (newText += ' ') // 将图片内容和@提醒内容的非字符内容置为' ',算一个位置\n }\n }, '')\n const mentionCharPos = beforeCaretText.lastIndexOf(this.options.mentionChar)\n\n if (mentionCharPos > -1) {\n const searchTerm = beforeCaretText.substring(mentionCharPos + this.options.mentionChar.length, caretPos)\n this.searchTerm = searchTerm\n if (!''.startsWith.call(searchTerm, ' ')) {\n this.latestMentionCharPos = mentionCharPos\n this.searchMentionListByTerm(searchTerm)\n }\n else {\n this.hideMentionList()\n }\n }\n else {\n this.hideMentionList()\n }\n }\n })\n }\n\n handleMouseClick(_itemEl: HTMLLIElement, index: number) {\n this.selectMentionItem(index, true)\n this.quill.focus()\n }\n\n handleMouseEnter(_itemEl: HTMLLIElement, index: number) {\n this.activeMentionIndex = index\n this.highlightMentionItem(index)\n }\n\n handleArrowUpKey = () => {\n if (this.isOpen()) {\n this.activeMentionIndex\n = (this.activeMentionIndex + this.latestMentionList.length - 1) % this.latestMentionList.length\n this.highlightMentionItem(this.activeMentionIndex)\n return false\n }\n return true\n }\n\n handleArrowDownKey = () => {\n if (this.isOpen()) {\n this.activeMentionIndex = (this.activeMentionIndex + 1) % this.latestMentionList.length\n this.highlightMentionItem(this.activeMentionIndex)\n return false\n }\n return true\n }\n\n handleEnterKey = () => {\n if (this.isOpen()) {\n this.selectMentionItem()\n this.needInsertBr = false\n }\n return true\n }\n\n handleEscapeKey = () => {\n if (this.isOpen()) {\n this.hideMentionList()\n return false\n }\n return true\n }\n\n getActiveMentionItem() {\n return this.mentionListEL.querySelector(`.${this.options.itemActiveClass}`)\n }\n\n isOpen() {\n return !this.mentionListEL.classList.contains(this.options.listHideClass)\n }\n\n async searchMentionListByTerm(term: string) {\n const mentionList = await this.options.search(term)\n this.latestMentionList = mentionList\n if (!mentionList || mentionList.length === 0) {\n return this.hideMentionList()\n }\n\n this.showMentionList(mentionList)\n }\n\n showMentionList(mentionList: any[]) {\n if (!this.isOpen()) {\n this.mentionListEL.classList.remove(this.options.listHideClass)\n }\n this.activeMentionIndex = 0\n this.setMentionListPos()\n this.render(mentionList)\n }\n\n hideMentionList() {\n if (this.isOpen()) {\n this.activeMentionIndex = 0\n this.mentionListEL.classList.add(this.options.listHideClass)\n }\n }\n\n setMentionListPos() {\n const cursorIndex = this.quill.selection.savedRange.index\n const cursorBounds = this.quill.getBounds(cursorIndex)\n const { left, top } = cursorBounds\n const container = this.quill.container\n const hostElement = container.parentNode as HTMLDivElement\n const { left: editorLeft, top: editorTop } = container.getBoundingClientRect()\n const { left: hostElementLeft, top: hostElementTop } = hostElement.getBoundingClientRect()\n const relativeLeft = editorLeft - hostElementLeft\n const relativeTop = editorTop - hostElementTop\n const menuLeft = left + relativeLeft - 5\n const menuTop = top + relativeTop + 20\n this.mentionListEL.style.cssText += `\n left: ${menuLeft}px;\n top: ${menuTop}px;\n `\n }\n\n render(mentionList: any[]) {\n const wrapEl = document.createElement('div');\n\n [].forEach.call(mentionList, (mentionItem, index) => {\n const mentionItemEl = document.createElement('li')\n mentionItemEl.classList.add(this.options.itemClass)\n if (index === this.activeMentionIndex) {\n mentionItemEl.classList.add(this.options.itemActiveClass)\n }\n const renderResult = this.options.renderMentionItem(mentionItem)\n if (typeof renderResult === 'string') {\n mentionItemEl.insertAdjacentHTML('afterbegin', renderResult)\n }\n else {\n mentionItemEl.insertAdjacentElement('afterbegin', renderResult)\n }\n wrapEl.appendChild(mentionItemEl)\n })\n\n this.mentionListEL.innerHTML = wrapEl.innerHTML\n }\n\n highlightMentionItem(index: number) {\n const oldActiveItem = this.getActiveMentionItem()\n if (oldActiveItem) {\n oldActiveItem.classList.remove(this.options.itemActiveClass)\n }\n\n const newActiveItem = this.mentionListEL.querySelector(`.${this.options.itemClass}:nth-of-type(${index + 1})`)\n if (newActiveItem) {\n newActiveItem.classList.add(this.options.itemActiveClass)\n this.scrollIntoView(newActiveItem)\n }\n }\n\n scrollIntoView(node: Element): void {\n const nodeAsAny: any = node\n if (nodeAsAny.scrollIntoViewIfNeeded) {\n nodeAsAny.scrollIntoViewIfNeeded(false)\n return\n }\n if (node.scrollIntoView) {\n node.scrollIntoView(false)\n }\n }\n\n selectMentionItem(index = this.activeMentionIndex, isClick?: boolean) {\n const activeMentionItem = this.latestMentionList[index]\n this.insertMentionBlot(activeMentionItem, isClick)\n this.options.select(activeMentionItem)\n this.hideMentionList()\n }\n\n insertMentionBlot(activeMentionItem: any, isClick?: boolean) {\n const mention = this.options.renderMentionText(activeMentionItem)\n const delta = new Delta()\n .retain(this.latestMentionCharPos)\n .delete(this.latestCaretPos - this.latestMentionCharPos)\n .insert({\n [MentionLink.blotName]: {\n char: this.options.mentionChar,\n text: mention,\n mention: activeMentionItem,\n link: activeMentionItem.link || this.options.defaultLink,\n target: activeMentionItem.target || this.options.target,\n searchKey: this.options.searchKey,\n },\n })\n if (isClick) {\n this.quill.updateContents(delta, Quill.sources.USER)\n }\n else {\n this.quill.updateContents(delta, Quill.sources.API)\n }\n this.quill.setSelection(this.latestMentionCharPos + 1, Quill.sources.API)\n }\n}\n"],"names":["DEFAULT_MENTION_CHAR","isNullOrUndefined","ON_MENTION_LINK_REMOVE","MentionLink"],"mappings":"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"}
1
+ {"version":3,"file":"mention.cjs.js","sources":["../../../../src/modules/mention/mention.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { isNullOrUndefined } from '../../config/editor.utils'\r\nimport { DEFAULT_MENTION_CHAR, ON_MENTION_LINK_REMOVE } from './constants'\r\nimport { MentionLink } from './mention-link'\r\n\r\nconst Delta = Quill.import('delta')\r\nconst Parchment = Quill.import('parchment')\r\nconst { Scope } = Parchment\r\n\r\nexport interface MentionOption {\r\n containerClass?: string\r\n // dataAttributes?: string[]\r\n defaultLink?: string\r\n itemActiveClass?: string\r\n itemKey: string\r\n itemClass?: string\r\n listClass?: string\r\n listHideClass?: string\r\n maxHeight?: number\r\n mentionChar?: string\r\n remove?: (data: any) => void\r\n renderMentionItem?: (data: any) => string | HTMLElement\r\n renderMentionText?: (data: any) => string | HTMLElement\r\n search?: (term: string) => Promise<any[]> | any[]\r\n searchKey: string\r\n select?: (data: any) => void\r\n target?: string\r\n}\r\n\r\nexport class Mention {\r\n private readonly options: MentionOption\r\n private readonly mentionListEL: HTMLUListElement\r\n private activeMentionIndex = 0\r\n private latestMentionList: any[]\r\n private latestMentionCharPos: number\r\n private latestCaretPos: number\r\n private searchTerm = ''\r\n private needInsertBr = true\r\n private readonly defaultOptions: MentionOption = {\r\n defaultLink: '#',\r\n target: '_blank',\r\n mentionChar: DEFAULT_MENTION_CHAR,\r\n maxHeight: 200,\r\n renderMentionItem(data: any) {\r\n let mentionItem = data.name || data.id\r\n if (this.itemKey) {\r\n mentionItem = data[this.itemKey]\r\n }\r\n const dom = document.createElement('SPAN')\r\n dom.textContent = mentionItem\r\n return dom\r\n },\r\n renderMentionText(data: any) {\r\n let mentionText = data.name || data.id\r\n if (this.itemKey) {\r\n mentionText = data[this.itemKey]\r\n }\r\n return `${mentionText}`\r\n },\r\n containerClass: 'ql-mention-list-container',\r\n listClass: 'ql-mention-list',\r\n listHideClass: 'ql-mention-list--hide',\r\n itemClass: 'ql-mention-item',\r\n itemActiveClass: 'ql-mention-item--active',\r\n itemKey: 'name',\r\n searchKey: 'name',\r\n // dataAttributes: ['id'],\r\n select(_data: any) {},\r\n remove(_data: any) {},\r\n }\r\n\r\n static register() {\r\n Quill.register(MentionLink)\r\n }\r\n\r\n // @ts-ignore\r\n constructor(private quill: Quill, options: MentionOption) {\r\n if (!options.search) {\r\n console.warn('please provide a search function!')\r\n return\r\n }\r\n\r\n this.options = Object.assign(this.defaultOptions, options)\r\n const container = document.createElement('div')\r\n container.classList.add('ql-mention-list-container')\r\n if (this.options.containerClass !== 'ql-mention-list-container') {\r\n container.classList.add(this.options.containerClass)\r\n }\r\n this.mentionListEL = document.createElement('ul')\r\n this.mentionListEL.classList.add(this.options.listClass, this.options.listHideClass)\r\n this.mentionListEL.style.cssText += `\r\n max-height: ${this.options.maxHeight}px;\r\n `\r\n\r\n quill.on(Quill.events.TEXT_CHANGE, this.handleTextChange)\r\n quill.keyboard.addBinding({ key: 'ArrowUp' }, this.handleArrowUpKey)\r\n quill.keyboard.addBinding({ key: 'ArrowDown' }, this.handleArrowDownKey)\r\n quill.keyboard.addBinding({ key: 'Enter' }, this.handleEnterKey)\r\n quill.keyboard.addBinding({ key: 'Tab' }, this.handleEnterKey)\r\n quill.keyboard.addBinding({ key: 'Escape' }, this.handleEscapeKey)\r\n quill.keyboard.bindings.Enter.unshift(quill.keyboard.bindings.Enter.pop())\r\n quill.keyboard.bindings.Tab.unshift(quill.keyboard.bindings.Tab.pop())\r\n quill.keyboard.bindings.Escape.unshift(quill.keyboard.bindings.Escape.pop())\r\n\r\n const customKeyboardEnter = {\r\n key: 'Enter',\r\n shiftKey: null,\r\n handler: (range, context) => {\r\n const lineFormats = Object.keys(context.format).reduce(\r\n (formats, format) => {\r\n if (\r\n this.quill.scroll.query(format, Scope.BLOCK)\r\n && !Array.isArray(context.format[format])\r\n ) {\r\n formats[format] = context.format[format]\r\n }\r\n return formats\r\n },\r\n {},\r\n )\r\n\r\n // fix: 解决@提醒之后插入多余空行和光标位置不对的问题\r\n let selectionIndex = range.index - this.searchTerm.length\r\n let delta = new Delta()\r\n .retain(range.index)\r\n .delete(range.length)\r\n if (this.needInsertBr) {\r\n delta = delta.insert('\\n', lineFormats)\r\n selectionIndex = range.index + 1\r\n }\r\n\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(selectionIndex, Quill.sources.SILENT)\r\n this.quill.focus()\r\n\r\n Object.keys(context.format).forEach((name) => {\r\n if (!isNullOrUndefined(lineFormats[name])) return\r\n if (Array.isArray(context.format[name])) return\r\n if (name === 'code' || name === 'link') return\r\n this.quill.format(name, context.format[name], Quill.sources.USER)\r\n })\r\n\r\n this.needInsertBr = true // 标记是否是输入@提醒的Enter\r\n },\r\n }\r\n\r\n // 用自定义的Enter替换内置的Enter\r\n quill.keyboard.bindings.Enter = quill.keyboard.bindings.Enter.map((item) => {\r\n const buildinKeyboardEnter = item.format === undefined && item.shiftKey === null\r\n if (buildinKeyboardEnter) {\r\n return customKeyboardEnter\r\n }\r\n else {\r\n return item\r\n }\r\n })\r\n\r\n this.on('click', this.handleMouseClick)\r\n this.on('mouseover', this.handleMouseEnter)\r\n quill.emitter.on(ON_MENTION_LINK_REMOVE, async ({ mention, name }) => {\r\n const [result] = (mention && [mention]) || (await this.options.search(name))\r\n this.options.remove(result)\r\n })\r\n container.appendChild(this.mentionListEL)\r\n quill.container.parentElement.insertBefore(container, quill.container)\r\n }\r\n\r\n on(eventName, callback) {\r\n this.mentionListEL.addEventListener(eventName, (evt) => {\r\n let\r\n target = evt.target\r\n let targetItemEL\r\n\r\n while (this.mentionListEL.contains(target) && target !== this.mentionListEL) {\r\n if (target.classList.contains(this.options.itemClass)) {\r\n targetItemEL = target\r\n }\r\n target = target.parentElement\r\n }\r\n\r\n if (targetItemEL) {\r\n callback.call(this, targetItemEL, this.getMentionItemIndex(targetItemEL))\r\n }\r\n })\r\n }\r\n\r\n getMentionItemIndex(itemEl: Element) {\r\n return [].reduce.call(this.mentionListEL.children, (index, item, idx) => item === itemEl ? idx : index, -1)\r\n }\r\n\r\n handleTextChange = (_delta, _oldDelta, source) => {\r\n // defer handler to make sure that we can get correct quill selection range.\r\n setTimeout(() => {\r\n if (Quill.sources.USER === source) {\r\n const range = this.quill.getSelection()\r\n if (!range) {\r\n return\r\n }\r\n\r\n const caretPos = this.latestCaretPos = range.index\r\n // beforeCaretText的计算有问题,没有把图片内容和@提醒内容的非字符内容算进去\r\n const content = this.quill.getContents()\r\n const beforeCaretText = content.reduce((newText, op) => {\r\n if (typeof op.insert === 'string') {\r\n return (newText += op.insert)\r\n }\r\n else {\r\n return (newText += ' ') // 将图片内容和@提醒内容的非字符内容置为' ',算一个位置\r\n }\r\n }, '')\r\n const mentionCharPos = beforeCaretText.lastIndexOf(this.options.mentionChar)\r\n\r\n if (mentionCharPos > -1) {\r\n const searchTerm = beforeCaretText.substring(mentionCharPos + this.options.mentionChar.length, caretPos)\r\n this.searchTerm = searchTerm\r\n if (!''.startsWith.call(searchTerm, ' ')) {\r\n this.latestMentionCharPos = mentionCharPos\r\n this.searchMentionListByTerm(searchTerm)\r\n }\r\n else {\r\n this.hideMentionList()\r\n }\r\n }\r\n else {\r\n this.hideMentionList()\r\n }\r\n }\r\n })\r\n }\r\n\r\n handleMouseClick(_itemEl: HTMLLIElement, index: number) {\r\n this.selectMentionItem(index, true)\r\n this.quill.focus()\r\n }\r\n\r\n handleMouseEnter(_itemEl: HTMLLIElement, index: number) {\r\n this.activeMentionIndex = index\r\n this.highlightMentionItem(index)\r\n }\r\n\r\n handleArrowUpKey = () => {\r\n if (this.isOpen()) {\r\n this.activeMentionIndex\r\n = (this.activeMentionIndex + this.latestMentionList.length - 1) % this.latestMentionList.length\r\n this.highlightMentionItem(this.activeMentionIndex)\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleArrowDownKey = () => {\r\n if (this.isOpen()) {\r\n this.activeMentionIndex = (this.activeMentionIndex + 1) % this.latestMentionList.length\r\n this.highlightMentionItem(this.activeMentionIndex)\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n handleEnterKey = () => {\r\n if (this.isOpen()) {\r\n this.selectMentionItem()\r\n this.needInsertBr = false\r\n }\r\n return true\r\n }\r\n\r\n handleEscapeKey = () => {\r\n if (this.isOpen()) {\r\n this.hideMentionList()\r\n return false\r\n }\r\n return true\r\n }\r\n\r\n getActiveMentionItem() {\r\n return this.mentionListEL.querySelector(`.${this.options.itemActiveClass}`)\r\n }\r\n\r\n isOpen() {\r\n return !this.mentionListEL.classList.contains(this.options.listHideClass)\r\n }\r\n\r\n async searchMentionListByTerm(term: string) {\r\n const mentionList = await this.options.search(term)\r\n this.latestMentionList = mentionList\r\n if (!mentionList || mentionList.length === 0) {\r\n return this.hideMentionList()\r\n }\r\n\r\n this.showMentionList(mentionList)\r\n }\r\n\r\n showMentionList(mentionList: any[]) {\r\n if (!this.isOpen()) {\r\n this.mentionListEL.classList.remove(this.options.listHideClass)\r\n }\r\n this.activeMentionIndex = 0\r\n this.setMentionListPos()\r\n this.render(mentionList)\r\n }\r\n\r\n hideMentionList() {\r\n if (this.isOpen()) {\r\n this.activeMentionIndex = 0\r\n this.mentionListEL.classList.add(this.options.listHideClass)\r\n }\r\n }\r\n\r\n setMentionListPos() {\r\n const cursorIndex = this.quill.selection.savedRange.index\r\n const cursorBounds = this.quill.getBounds(cursorIndex)\r\n const { left, top } = cursorBounds\r\n const container = this.quill.container\r\n const hostElement = container.parentNode as HTMLDivElement\r\n const { left: editorLeft, top: editorTop } = container.getBoundingClientRect()\r\n const { left: hostElementLeft, top: hostElementTop } = hostElement.getBoundingClientRect()\r\n const relativeLeft = editorLeft - hostElementLeft\r\n const relativeTop = editorTop - hostElementTop\r\n const menuLeft = left + relativeLeft - 5\r\n const menuTop = top + relativeTop + 20\r\n this.mentionListEL.style.cssText += `\r\n left: ${menuLeft}px;\r\n top: ${menuTop}px;\r\n `\r\n }\r\n\r\n render(mentionList: any[]) {\r\n const wrapEl = document.createElement('div');\r\n\r\n [].forEach.call(mentionList, (mentionItem, index) => {\r\n const mentionItemEl = document.createElement('li')\r\n mentionItemEl.classList.add(this.options.itemClass)\r\n if (index === this.activeMentionIndex) {\r\n mentionItemEl.classList.add(this.options.itemActiveClass)\r\n }\r\n const renderResult = this.options.renderMentionItem(mentionItem)\r\n if (typeof renderResult === 'string') {\r\n mentionItemEl.insertAdjacentHTML('afterbegin', renderResult)\r\n }\r\n else {\r\n mentionItemEl.insertAdjacentElement('afterbegin', renderResult)\r\n }\r\n wrapEl.appendChild(mentionItemEl)\r\n })\r\n\r\n this.mentionListEL.innerHTML = wrapEl.innerHTML\r\n }\r\n\r\n highlightMentionItem(index: number) {\r\n const oldActiveItem = this.getActiveMentionItem()\r\n if (oldActiveItem) {\r\n oldActiveItem.classList.remove(this.options.itemActiveClass)\r\n }\r\n\r\n const newActiveItem = this.mentionListEL.querySelector(`.${this.options.itemClass}:nth-of-type(${index + 1})`)\r\n if (newActiveItem) {\r\n newActiveItem.classList.add(this.options.itemActiveClass)\r\n this.scrollIntoView(newActiveItem)\r\n }\r\n }\r\n\r\n scrollIntoView(node: Element): void {\r\n const nodeAsAny: any = node\r\n if (nodeAsAny.scrollIntoViewIfNeeded) {\r\n nodeAsAny.scrollIntoViewIfNeeded(false)\r\n return\r\n }\r\n if (node.scrollIntoView) {\r\n node.scrollIntoView(false)\r\n }\r\n }\r\n\r\n selectMentionItem(index = this.activeMentionIndex, isClick?: boolean) {\r\n const activeMentionItem = this.latestMentionList[index]\r\n this.insertMentionBlot(activeMentionItem, isClick)\r\n this.options.select(activeMentionItem)\r\n this.hideMentionList()\r\n }\r\n\r\n insertMentionBlot(activeMentionItem: any, isClick?: boolean) {\r\n const mention = this.options.renderMentionText(activeMentionItem)\r\n const delta = new Delta()\r\n .retain(this.latestMentionCharPos)\r\n .delete(this.latestCaretPos - this.latestMentionCharPos)\r\n .insert({\r\n [MentionLink.blotName]: {\r\n char: this.options.mentionChar,\r\n text: mention,\r\n mention: activeMentionItem,\r\n link: activeMentionItem.link || this.options.defaultLink,\r\n target: activeMentionItem.target || this.options.target,\r\n searchKey: this.options.searchKey,\r\n },\r\n })\r\n if (isClick) {\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n }\r\n else {\r\n this.quill.updateContents(delta, Quill.sources.API)\r\n }\r\n this.quill.setSelection(this.latestMentionCharPos + 1, Quill.sources.API)\r\n }\r\n}\r\n"],"names":["DEFAULT_MENTION_CHAR","isNullOrUndefined","ON_MENTION_LINK_REMOVE","MentionLink"],"mappings":";;;;;;;;;AAKA,MAAM,QAAQ,MAAM,OAAO,OAAO;AAClC,MAAM,YAAY,MAAM,OAAO,WAAW;AAC1C,MAAM,EAAE,UAAU;AAsBX,MAAM,QAAQ;AAAA;AAAA,EA+CnB,YAAoB,OAAc,SAAwB;AA9CzC;AACA;AACT,8CAAqB;AACrB;AACA;AACA;AACA,sCAAa;AACb,wCAAe;AACN,0CAAgC;AAAA,MAC/C,aAAa;AAAA,MACb,QAAQ;AAAA,MACR,aAAaA,UAAAA;AAAAA,MACb,WAAW;AAAA,MACX,kBAAkB,MAAW;AAC3B,YAAI,cAAc,KAAK,QAAQ,KAAK;AACpC,YAAI,KAAK,SAAS;AAChB,wBAAc,KAAK,KAAK,OAAO;AAAA,QACjC;AACA,cAAM,MAAM,SAAS,cAAc,MAAM;AACzC,YAAI,cAAc;AAClB,eAAO;AAAA,MACT;AAAA,MACA,kBAAkB,MAAW;AAC3B,YAAI,cAAc,KAAK,QAAQ,KAAK;AACpC,YAAI,KAAK,SAAS;AAChB,wBAAc,KAAK,KAAK,OAAO;AAAA,QACjC;AACA,eAAO,GAAG,WAAW;AAAA,MACvB;AAAA,MACA,gBAAgB;AAAA,MAChB,WAAW;AAAA,MACX,eAAe;AAAA,MACf,WAAW;AAAA,MACX,iBAAiB;AAAA,MACjB,SAAS;AAAA,MACT,WAAW;AAAA;AAAA,MAEX,OAAO,OAAY;AAAA,MAAC;AAAA,MACpB,OAAO,OAAY;AAAA,MAAC;AAAA,IAAA;AA0HtB,4CAAmB,CAAC,QAAQ,WAAW,WAAW;AAEhD,iBAAW,MAAM;AACf,YAAI,MAAM,QAAQ,SAAS,QAAQ;AACjC,gBAAM,QAAQ,KAAK,MAAM,aAAA;AACzB,cAAI,CAAC,OAAO;AACV;AAAA,UACF;AAEA,gBAAM,WAAW,KAAK,iBAAiB,MAAM;AAE7C,gBAAM,UAAU,KAAK,MAAM,YAAA;AAC3B,gBAAM,kBAAkB,QAAQ,OAAO,CAAC,SAAS,OAAO;AACtD,gBAAI,OAAO,GAAG,WAAW,UAAU;AACjC,qBAAQ,WAAW,GAAG;AAAA,YACxB,OACK;AACH,qBAAQ,WAAW;AAAA,YACrB;AAAA,UACF,GAAG,EAAE;AACL,gBAAM,iBAAiB,gBAAgB,YAAY,KAAK,QAAQ,WAAW;AAE3E,cAAI,iBAAiB,IAAI;AACvB,kBAAM,aAAa,gBAAgB,UAAU,iBAAiB,KAAK,QAAQ,YAAY,QAAQ,QAAQ;AACvG,iBAAK,aAAa;AAClB,gBAAI,CAAC,GAAG,WAAW,KAAK,YAAY,GAAG,GAAG;AACxC,mBAAK,uBAAuB;AAC5B,mBAAK,wBAAwB,UAAU;AAAA,YACzC,OACK;AACH,mBAAK,gBAAA;AAAA,YACP;AAAA,UACF,OACK;AACH,iBAAK,gBAAA;AAAA,UACP;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAYA,4CAAmB,MAAM;AACvB,UAAI,KAAK,UAAU;AACjB,aAAK,sBACA,KAAK,qBAAqB,KAAK,kBAAkB,SAAS,KAAK,KAAK,kBAAkB;AAC3F,aAAK,qBAAqB,KAAK,kBAAkB;AACjD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAEA,8CAAqB,MAAM;AACzB,UAAI,KAAK,UAAU;AACjB,aAAK,sBAAsB,KAAK,qBAAqB,KAAK,KAAK,kBAAkB;AACjF,aAAK,qBAAqB,KAAK,kBAAkB;AACjD,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AAEA,0CAAiB,MAAM;AACrB,UAAI,KAAK,UAAU;AACjB,aAAK,kBAAA;AACL,aAAK,eAAe;AAAA,MACtB;AACA,aAAO;AAAA,IACT;AAEA,2CAAkB,MAAM;AACtB,UAAI,KAAK,UAAU;AACjB,aAAK,gBAAA;AACL,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT;AArMoB,SAAA,QAAA;AAClB,QAAI,CAAC,QAAQ,QAAQ;AACnB,cAAQ,KAAK,mCAAmC;AAChD;AAAA,IACF;AAEA,SAAK,UAAU,OAAO,OAAO,KAAK,gBAAgB,OAAO;AACzD,UAAM,YAAY,SAAS,cAAc,KAAK;AAC9C,cAAU,UAAU,IAAI,2BAA2B;AACnD,QAAI,KAAK,QAAQ,mBAAmB,6BAA6B;AAC/D,gBAAU,UAAU,IAAI,KAAK,QAAQ,cAAc;AAAA,IACrD;AACA,SAAK,gBAAgB,SAAS,cAAc,IAAI;AAChD,SAAK,cAAc,UAAU,IAAI,KAAK,QAAQ,WAAW,KAAK,QAAQ,aAAa;AACnF,SAAK,cAAc,MAAM,WAAW;AAAA,oBACpB,KAAK,QAAQ,SAAS;AAAA;AAGtC,UAAM,GAAG,MAAM,OAAO,aAAa,KAAK,gBAAgB;AACxD,UAAM,SAAS,WAAW,EAAE,KAAK,UAAA,GAAa,KAAK,gBAAgB;AACnE,UAAM,SAAS,WAAW,EAAE,KAAK,YAAA,GAAe,KAAK,kBAAkB;AACvE,UAAM,SAAS,WAAW,EAAE,KAAK,QAAA,GAAW,KAAK,cAAc;AAC/D,UAAM,SAAS,WAAW,EAAE,KAAK,MAAA,GAAS,KAAK,cAAc;AAC7D,UAAM,SAAS,WAAW,EAAE,KAAK,SAAA,GAAY,KAAK,eAAe;AACjE,UAAM,SAAS,SAAS,MAAM,QAAQ,MAAM,SAAS,SAAS,MAAM,KAAK;AACzE,UAAM,SAAS,SAAS,IAAI,QAAQ,MAAM,SAAS,SAAS,IAAI,KAAK;AACrE,UAAM,SAAS,SAAS,OAAO,QAAQ,MAAM,SAAS,SAAS,OAAO,KAAK;AAE3E,UAAM,sBAAsB;AAAA,MAC1B,KAAK;AAAA,MACL,UAAU;AAAA,MACV,SAAS,CAAC,OAAO,YAAY;AAC3B,cAAM,cAAc,OAAO,KAAK,QAAQ,MAAM,EAAE;AAAA,UAC9C,CAAC,SAAS,WAAW;AACnB,gBACE,KAAK,MAAM,OAAO,MAAM,QAAQ,MAAM,KAAK,KACxC,CAAC,MAAM,QAAQ,QAAQ,OAAO,MAAM,CAAC,GACxC;AACA,sBAAQ,MAAM,IAAI,QAAQ,OAAO,MAAM;AAAA,YACzC;AACA,mBAAO;AAAA,UACT;AAAA,UACA,CAAA;AAAA,QAAC;AAIH,YAAI,iBAAiB,MAAM,QAAQ,KAAK,WAAW;AACnD,YAAI,QAAQ,IAAI,MAAA,EACb,OAAO,MAAM,KAAK,EAClB,OAAO,MAAM,MAAM;AACtB,YAAI,KAAK,cAAc;AACrB,kBAAQ,MAAM,OAAO,MAAM,WAAW;AACtC,2BAAiB,MAAM,QAAQ;AAAA,QACjC;AAEA,aAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AACnD,aAAK,MAAM,aAAa,gBAAgB,MAAM,QAAQ,MAAM;AAC5D,aAAK,MAAM,MAAA;AAEX,eAAO,KAAK,QAAQ,MAAM,EAAE,QAAQ,CAAC,SAAS;AAC5C,cAAI,CAACC,aAAAA,kBAAkB,YAAY,IAAI,CAAC,EAAG;AAC3C,cAAI,MAAM,QAAQ,QAAQ,OAAO,IAAI,CAAC,EAAG;AACzC,cAAI,SAAS,UAAU,SAAS,OAAQ;AACxC,eAAK,MAAM,OAAO,MAAM,QAAQ,OAAO,IAAI,GAAG,MAAM,QAAQ,IAAI;AAAA,QAClE,CAAC;AAED,aAAK,eAAe;AAAA,MACtB;AAAA,IAAA;AAIF,UAAM,SAAS,SAAS,QAAQ,MAAM,SAAS,SAAS,MAAM,IAAI,CAAC,SAAS;AAC1E,YAAM,uBAAuB,KAAK,WAAW,UAAa,KAAK,aAAa;AAC5E,UAAI,sBAAsB;AACxB,eAAO;AAAA,MACT,OACK;AACH,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AAED,SAAK,GAAG,SAAS,KAAK,gBAAgB;AACtC,SAAK,GAAG,aAAa,KAAK,gBAAgB;AAC1C,UAAM,QAAQ,GAAGC,UAAAA,wBAAwB,OAAO,EAAE,SAAS,WAAW;AACpE,YAAM,CAAC,MAAM,IAAK,WAAW,CAAC,OAAO,KAAO,MAAM,KAAK,QAAQ,OAAO,IAAI;AAC1E,WAAK,QAAQ,OAAO,MAAM;AAAA,IAC5B,CAAC;AACD,cAAU,YAAY,KAAK,aAAa;AACxC,UAAM,UAAU,cAAc,aAAa,WAAW,MAAM,SAAS;AAAA,EACvE;AAAA,EA9FA,OAAO,WAAW;AAChB,UAAM,SAASC,uBAAW;AAAA,EAC5B;AAAA,EA8FA,GAAG,WAAW,UAAU;AACtB,SAAK,cAAc,iBAAiB,WAAW,CAAC,QAAQ;AACtD,UACE,SAAS,IAAI;AACf,UAAI;AAEJ,aAAO,KAAK,cAAc,SAAS,MAAM,KAAK,WAAW,KAAK,eAAe;AAC3E,YAAI,OAAO,UAAU,SAAS,KAAK,QAAQ,SAAS,GAAG;AACrD,yBAAe;AAAA,QACjB;AACA,iBAAS,OAAO;AAAA,MAClB;AAEA,UAAI,cAAc;AAChB,iBAAS,KAAK,MAAM,cAAc,KAAK,oBAAoB,YAAY,CAAC;AAAA,MAC1E;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,oBAAoB,QAAiB;AACnC,WAAO,CAAA,EAAG,OAAO,KAAK,KAAK,cAAc,UAAU,CAAC,OAAO,MAAM,QAAQ,SAAS,SAAS,MAAM,OAAO,EAAE;AAAA,EAC5G;AAAA,EA0CA,iBAAiB,SAAwB,OAAe;AACtD,SAAK,kBAAkB,OAAO,IAAI;AAClC,SAAK,MAAM,MAAA;AAAA,EACb;AAAA,EAEA,iBAAiB,SAAwB,OAAe;AACtD,SAAK,qBAAqB;AAC1B,SAAK,qBAAqB,KAAK;AAAA,EACjC;AAAA,EAqCA,uBAAuB;AACrB,WAAO,KAAK,cAAc,cAAc,IAAI,KAAK,QAAQ,eAAe,EAAE;AAAA,EAC5E;AAAA,EAEA,SAAS;AACP,WAAO,CAAC,KAAK,cAAc,UAAU,SAAS,KAAK,QAAQ,aAAa;AAAA,EAC1E;AAAA,EAEA,MAAM,wBAAwB,MAAc;AAC1C,UAAM,cAAc,MAAM,KAAK,QAAQ,OAAO,IAAI;AAClD,SAAK,oBAAoB;AACzB,QAAI,CAAC,eAAe,YAAY,WAAW,GAAG;AAC5C,aAAO,KAAK,gBAAA;AAAA,IACd;AAEA,SAAK,gBAAgB,WAAW;AAAA,EAClC;AAAA,EAEA,gBAAgB,aAAoB;AAClC,QAAI,CAAC,KAAK,UAAU;AAClB,WAAK,cAAc,UAAU,OAAO,KAAK,QAAQ,aAAa;AAAA,IAChE;AACA,SAAK,qBAAqB;AAC1B,SAAK,kBAAA;AACL,SAAK,OAAO,WAAW;AAAA,EACzB;AAAA,EAEA,kBAAkB;AAChB,QAAI,KAAK,UAAU;AACjB,WAAK,qBAAqB;AAC1B,WAAK,cAAc,UAAU,IAAI,KAAK,QAAQ,aAAa;AAAA,IAC7D;AAAA,EACF;AAAA,EAEA,oBAAoB;AAClB,UAAM,cAAc,KAAK,MAAM,UAAU,WAAW;AACpD,UAAM,eAAe,KAAK,MAAM,UAAU,WAAW;AACrD,UAAM,EAAE,MAAM,IAAA,IAAQ;AACtB,UAAM,YAAY,KAAK,MAAM;AAC7B,UAAM,cAAc,UAAU;AAC9B,UAAM,EAAE,MAAM,YAAY,KAAK,UAAA,IAAc,UAAU,sBAAA;AACvD,UAAM,EAAE,MAAM,iBAAiB,KAAK,eAAA,IAAmB,YAAY,sBAAA;AACnE,UAAM,eAAe,aAAa;AAClC,UAAM,cAAc,YAAY;AAChC,UAAM,WAAW,OAAO,eAAe;AACvC,UAAM,UAAU,MAAM,cAAc;AACpC,SAAK,cAAc,MAAM,WAAW;AAAA,cAC1B,QAAQ;AAAA,aACT,OAAO;AAAA;AAAA,EAElB;AAAA,EAEA,OAAO,aAAoB;AACzB,UAAM,SAAS,SAAS,cAAc,KAAK;AAE3C,KAAA,EAAG,QAAQ,KAAK,aAAa,CAAC,aAAa,UAAU;AACnD,YAAM,gBAAgB,SAAS,cAAc,IAAI;AACjD,oBAAc,UAAU,IAAI,KAAK,QAAQ,SAAS;AAClD,UAAI,UAAU,KAAK,oBAAoB;AACrC,sBAAc,UAAU,IAAI,KAAK,QAAQ,eAAe;AAAA,MAC1D;AACA,YAAM,eAAe,KAAK,QAAQ,kBAAkB,WAAW;AAC/D,UAAI,OAAO,iBAAiB,UAAU;AACpC,sBAAc,mBAAmB,cAAc,YAAY;AAAA,MAC7D,OACK;AACH,sBAAc,sBAAsB,cAAc,YAAY;AAAA,MAChE;AACA,aAAO,YAAY,aAAa;AAAA,IAClC,CAAC;AAED,SAAK,cAAc,YAAY,OAAO;AAAA,EACxC;AAAA,EAEA,qBAAqB,OAAe;AAClC,UAAM,gBAAgB,KAAK,qBAAA;AAC3B,QAAI,eAAe;AACjB,oBAAc,UAAU,OAAO,KAAK,QAAQ,eAAe;AAAA,IAC7D;AAEA,UAAM,gBAAgB,KAAK,cAAc,cAAc,IAAI,KAAK,QAAQ,SAAS,gBAAgB,QAAQ,CAAC,GAAG;AAC7G,QAAI,eAAe;AACjB,oBAAc,UAAU,IAAI,KAAK,QAAQ,eAAe;AACxD,WAAK,eAAe,aAAa;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,eAAe,MAAqB;AAClC,UAAM,YAAiB;AACvB,QAAI,UAAU,wBAAwB;AACpC,gBAAU,uBAAuB,KAAK;AACtC;AAAA,IACF;AACA,QAAI,KAAK,gBAAgB;AACvB,WAAK,eAAe,KAAK;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,kBAAkB,QAAQ,KAAK,oBAAoB,SAAmB;AACpE,UAAM,oBAAoB,KAAK,kBAAkB,KAAK;AACtD,SAAK,kBAAkB,mBAAmB,OAAO;AACjD,SAAK,QAAQ,OAAO,iBAAiB;AACrC,SAAK,gBAAA;AAAA,EACP;AAAA,EAEA,kBAAkB,mBAAwB,SAAmB;AAC3D,UAAM,UAAU,KAAK,QAAQ,kBAAkB,iBAAiB;AAChE,UAAM,QAAQ,IAAI,MAAA,EACf,OAAO,KAAK,oBAAoB,EAChC,OAAO,KAAK,iBAAiB,KAAK,oBAAoB,EACtD,OAAO;AAAA,MACN,CAACA,YAAAA,YAAY,QAAQ,GAAG;AAAA,QACtB,MAAM,KAAK,QAAQ;AAAA,QACnB,MAAM;AAAA,QACN,SAAS;AAAA,QACT,MAAM,kBAAkB,QAAQ,KAAK,QAAQ;AAAA,QAC7C,QAAQ,kBAAkB,UAAU,KAAK,QAAQ;AAAA,QACjD,WAAW,KAAK,QAAQ;AAAA,MAAA;AAAA,IAC1B,CACD;AACH,QAAI,SAAS;AACX,WAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AAAA,IACrD,OACK;AACH,WAAK,MAAM,eAAe,OAAO,MAAM,QAAQ,GAAG;AAAA,IACpD;AACA,SAAK,MAAM,aAAa,KAAK,uBAAuB,GAAG,MAAM,QAAQ,GAAG;AAAA,EAC1E;AACF;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"config-utils.cjs.js","sources":["../../../../src/modules/mind-map/config-utils.ts"],"sourcesContent":["import type Quill from 'quill'\nimport type { BackgroundConfig, LineConfig } from './options'\n\nexport function getBackgroundConfig(quill: Quill | null): false | object {\n const MindMapModule = quill?.options.modules?.['mind-map']\n if (!MindMapModule || typeof MindMapModule !== 'object') {\n return false\n }\n if ('background' in MindMapModule) {\n const background = MindMapModule.background as BackgroundConfig | boolean | undefined\n\n if (background === false || background === undefined) {\n return false\n }\n if (typeof background === 'object' && background !== null) {\n const typedBackground = background as BackgroundConfig\n const backgroundConfig: any = {}\n\n if (typedBackground.color) {\n backgroundConfig.backgroundColor = typedBackground.color\n }\n if (typedBackground.image) {\n backgroundConfig.backgroundImage = typedBackground.image\n }\n if (typedBackground.repeat) {\n backgroundConfig.backgroundRepeat = typedBackground.repeat\n }\n if (typedBackground.position) {\n backgroundConfig.backgroundPosition = typedBackground.position\n }\n if (typedBackground.size) {\n backgroundConfig.backgroundSize = typedBackground.size\n }\n return backgroundConfig\n }\n }\n return false\n}\n\nexport function getLineConfig(quill: Quill | null): false | object {\n const MindMapModule = quill?.options.modules?.['mind-map']\n if (!MindMapModule || typeof MindMapModule !== 'object') {\n return false\n }\n if ('line' in MindMapModule) {\n const line = MindMapModule.line as LineConfig | boolean | undefined\n\n if (line === false || line === undefined) {\n return false\n }\n if (typeof line === 'object' && line !== null) {\n const typedLine = line as LineConfig\n const lineConfig: any = {}\n\n if (typedLine.color) {\n lineConfig.lineColor = typedLine.color\n }\n if (typedLine.width) {\n lineConfig.lineWidth = typedLine.width\n }\n if (typedLine.dasharray) {\n lineConfig.lineDasharray = typedLine.dasharray\n }\n if (typedLine.style) {\n lineConfig.lineStyle = typedLine.style\n }\n return lineConfig\n }\n }\n return false\n}\n\nexport function getResizeConfig(quill: Quill | null): boolean {\n const MindMapModule = quill?.options.modules?.['mind-map']\n if (!MindMapModule || typeof MindMapModule !== 'object') {\n return false\n }\n if ('resize' in MindMapModule) {\n const resize = (MindMapModule as any).resize as boolean | undefined\n return resize === true\n }\n return false\n}\n\nexport function getThemeConfig(quill: Quill | null): string {\n const MindMapModule = quill?.options.modules?.['mind-map']\n if (!MindMapModule || typeof MindMapModule !== 'object') {\n return 'default'\n }\n if ('theme' in MindMapModule) {\n const theme = MindMapModule.theme as string | undefined\n return theme || 'default'\n }\n return 'default'\n}\n\nexport function getAllConfigs(quill: Quill | null): {\n backgroundConfig: false | object\n resizeConfig: boolean\n lineConfig: false | object\n themeConfig: string\n deps?: any\n} {\n const deps = (quill?.options.modules?.['mind-map'] as any)?.deps\n return {\n backgroundConfig: getBackgroundConfig(quill),\n resizeConfig: getResizeConfig(quill),\n lineConfig: getLineConfig(quill),\n themeConfig: getThemeConfig(quill),\n deps,\n }\n}\n"],"names":[],"mappings":";;AAGO,SAAS,oBAAoB,OAAqC;;AACvE,QAAM,iBAAgB,oCAAO,QAAQ,YAAf,mBAAyB;AAC/C,MAAI,CAAC,iBAAiB,OAAO,kBAAkB,UAAU;AACvD,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,eAAe;AACjC,UAAM,aAAa,cAAc;AAEjC,QAAI,eAAe,SAAS,eAAe,QAAW;AACpD,aAAO;AAAA,IACT;AACA,QAAI,OAAO,eAAe,YAAY,eAAe,MAAM;AACzD,YAAM,kBAAkB;AACxB,YAAM,mBAAwB,CAAA;AAE9B,UAAI,gBAAgB,OAAO;AACzB,yBAAiB,kBAAkB,gBAAgB;AAAA,MACrD;AACA,UAAI,gBAAgB,OAAO;AACzB,yBAAiB,kBAAkB,gBAAgB;AAAA,MACrD;AACA,UAAI,gBAAgB,QAAQ;AAC1B,yBAAiB,mBAAmB,gBAAgB;AAAA,MACtD;AACA,UAAI,gBAAgB,UAAU;AAC5B,yBAAiB,qBAAqB,gBAAgB;AAAA,MACxD;AACA,UAAI,gBAAgB,MAAM;AACxB,yBAAiB,iBAAiB,gBAAgB;AAAA,MACpD;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,cAAc,OAAqC;;AACjE,QAAM,iBAAgB,oCAAO,QAAQ,YAAf,mBAAyB;AAC/C,MAAI,CAAC,iBAAiB,OAAO,kBAAkB,UAAU;AACvD,WAAO;AAAA,EACT;AACA,MAAI,UAAU,eAAe;AAC3B,UAAM,OAAO,cAAc;AAE3B,QAAI,SAAS,SAAS,SAAS,QAAW;AACxC,aAAO;AAAA,IACT;AACA,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,YAAM,YAAY;AAClB,YAAM,aAAkB,CAAA;AAExB,UAAI,UAAU,OAAO;AACnB,mBAAW,YAAY,UAAU;AAAA,MACnC;AACA,UAAI,UAAU,OAAO;AACnB,mBAAW,YAAY,UAAU;AAAA,MACnC;AACA,UAAI,UAAU,WAAW;AACvB,mBAAW,gBAAgB,UAAU;AAAA,MACvC;AACA,UAAI,UAAU,OAAO;AACnB,mBAAW,YAAY,UAAU;AAAA,MACnC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAA8B;;AAC5D,QAAM,iBAAgB,oCAAO,QAAQ,YAAf,mBAAyB;AAC/C,MAAI,CAAC,iBAAiB,OAAO,kBAAkB,UAAU;AACvD,WAAO;AAAA,EACT;AACA,MAAI,YAAY,eAAe;AAC7B,UAAM,SAAU,cAAsB;AACtC,WAAO,WAAW;AAAA,EACpB;AACA,SAAO;AACT;AAEO,SAAS,eAAe,OAA6B;;AAC1D,QAAM,iBAAgB,oCAAO,QAAQ,YAAf,mBAAyB;AAC/C,MAAI,CAAC,iBAAiB,OAAO,kBAAkB,UAAU;AACvD,WAAO;AAAA,EACT;AACA,MAAI,WAAW,eAAe;AAC5B,UAAM,QAAQ,cAAc;AAC5B,WAAO,SAAS;AAAA,EAClB;AACA,SAAO;AACT;AAEO,SAAS,cAAc,OAM5B;;AACA,QAAM,QAAQ,0CAAO,QAAQ,YAAf,mBAAyB,gBAAzB,mBAA8C;AAC5D,SAAO;AAAA,IACL,kBAAkB,oBAAoB,KAAK;AAAA,IAC3C,cAAc,gBAAgB,KAAK;AAAA,IACnC,YAAY,cAAc,KAAK;AAAA,IAC/B,aAAa,eAAe,KAAK;AAAA,IACjC;AAAA,EAAA;AAEJ;;;;;;"}
1
+ {"version":3,"file":"config-utils.cjs.js","sources":["../../../../src/modules/mind-map/config-utils.ts"],"sourcesContent":["import type Quill from 'quill'\r\nimport type { BackgroundConfig, LineConfig } from './options'\r\n\r\nexport function getBackgroundConfig(quill: Quill | null): false | object {\r\n const MindMapModule = quill?.options.modules?.['mind-map']\r\n if (!MindMapModule || typeof MindMapModule !== 'object') {\r\n return false\r\n }\r\n if ('background' in MindMapModule) {\r\n const background = MindMapModule.background as BackgroundConfig | boolean | undefined\r\n\r\n if (background === false || background === undefined) {\r\n return false\r\n }\r\n if (typeof background === 'object' && background !== null) {\r\n const typedBackground = background as BackgroundConfig\r\n const backgroundConfig: any = {}\r\n\r\n if (typedBackground.color) {\r\n backgroundConfig.backgroundColor = typedBackground.color\r\n }\r\n if (typedBackground.image) {\r\n backgroundConfig.backgroundImage = typedBackground.image\r\n }\r\n if (typedBackground.repeat) {\r\n backgroundConfig.backgroundRepeat = typedBackground.repeat\r\n }\r\n if (typedBackground.position) {\r\n backgroundConfig.backgroundPosition = typedBackground.position\r\n }\r\n if (typedBackground.size) {\r\n backgroundConfig.backgroundSize = typedBackground.size\r\n }\r\n return backgroundConfig\r\n }\r\n }\r\n return false\r\n}\r\n\r\nexport function getLineConfig(quill: Quill | null): false | object {\r\n const MindMapModule = quill?.options.modules?.['mind-map']\r\n if (!MindMapModule || typeof MindMapModule !== 'object') {\r\n return false\r\n }\r\n if ('line' in MindMapModule) {\r\n const line = MindMapModule.line as LineConfig | boolean | undefined\r\n\r\n if (line === false || line === undefined) {\r\n return false\r\n }\r\n if (typeof line === 'object' && line !== null) {\r\n const typedLine = line as LineConfig\r\n const lineConfig: any = {}\r\n\r\n if (typedLine.color) {\r\n lineConfig.lineColor = typedLine.color\r\n }\r\n if (typedLine.width) {\r\n lineConfig.lineWidth = typedLine.width\r\n }\r\n if (typedLine.dasharray) {\r\n lineConfig.lineDasharray = typedLine.dasharray\r\n }\r\n if (typedLine.style) {\r\n lineConfig.lineStyle = typedLine.style\r\n }\r\n return lineConfig\r\n }\r\n }\r\n return false\r\n}\r\n\r\nexport function getResizeConfig(quill: Quill | null): boolean {\r\n const MindMapModule = quill?.options.modules?.['mind-map']\r\n if (!MindMapModule || typeof MindMapModule !== 'object') {\r\n return false\r\n }\r\n if ('resize' in MindMapModule) {\r\n const resize = (MindMapModule as any).resize as boolean | undefined\r\n return resize === true\r\n }\r\n return false\r\n}\r\n\r\nexport function getThemeConfig(quill: Quill | null): string {\r\n const MindMapModule = quill?.options.modules?.['mind-map']\r\n if (!MindMapModule || typeof MindMapModule !== 'object') {\r\n return 'default'\r\n }\r\n if ('theme' in MindMapModule) {\r\n const theme = MindMapModule.theme as string | undefined\r\n return theme || 'default'\r\n }\r\n return 'default'\r\n}\r\n\r\nexport function getAllConfigs(quill: Quill | null): {\r\n backgroundConfig: false | object\r\n resizeConfig: boolean\r\n lineConfig: false | object\r\n themeConfig: string\r\n deps?: any\r\n} {\r\n const deps = (quill?.options.modules?.['mind-map'] as any)?.deps\r\n return {\r\n backgroundConfig: getBackgroundConfig(quill),\r\n resizeConfig: getResizeConfig(quill),\r\n lineConfig: getLineConfig(quill),\r\n themeConfig: getThemeConfig(quill),\r\n deps,\r\n }\r\n}\r\n"],"names":[],"mappings":";;AAGO,SAAS,oBAAoB,OAAqC;;AACvE,QAAM,iBAAgB,oCAAO,QAAQ,YAAf,mBAAyB;AAC/C,MAAI,CAAC,iBAAiB,OAAO,kBAAkB,UAAU;AACvD,WAAO;AAAA,EACT;AACA,MAAI,gBAAgB,eAAe;AACjC,UAAM,aAAa,cAAc;AAEjC,QAAI,eAAe,SAAS,eAAe,QAAW;AACpD,aAAO;AAAA,IACT;AACA,QAAI,OAAO,eAAe,YAAY,eAAe,MAAM;AACzD,YAAM,kBAAkB;AACxB,YAAM,mBAAwB,CAAA;AAE9B,UAAI,gBAAgB,OAAO;AACzB,yBAAiB,kBAAkB,gBAAgB;AAAA,MACrD;AACA,UAAI,gBAAgB,OAAO;AACzB,yBAAiB,kBAAkB,gBAAgB;AAAA,MACrD;AACA,UAAI,gBAAgB,QAAQ;AAC1B,yBAAiB,mBAAmB,gBAAgB;AAAA,MACtD;AACA,UAAI,gBAAgB,UAAU;AAC5B,yBAAiB,qBAAqB,gBAAgB;AAAA,MACxD;AACA,UAAI,gBAAgB,MAAM;AACxB,yBAAiB,iBAAiB,gBAAgB;AAAA,MACpD;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,cAAc,OAAqC;;AACjE,QAAM,iBAAgB,oCAAO,QAAQ,YAAf,mBAAyB;AAC/C,MAAI,CAAC,iBAAiB,OAAO,kBAAkB,UAAU;AACvD,WAAO;AAAA,EACT;AACA,MAAI,UAAU,eAAe;AAC3B,UAAM,OAAO,cAAc;AAE3B,QAAI,SAAS,SAAS,SAAS,QAAW;AACxC,aAAO;AAAA,IACT;AACA,QAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,YAAM,YAAY;AAClB,YAAM,aAAkB,CAAA;AAExB,UAAI,UAAU,OAAO;AACnB,mBAAW,YAAY,UAAU;AAAA,MACnC;AACA,UAAI,UAAU,OAAO;AACnB,mBAAW,YAAY,UAAU;AAAA,MACnC;AACA,UAAI,UAAU,WAAW;AACvB,mBAAW,gBAAgB,UAAU;AAAA,MACvC;AACA,UAAI,UAAU,OAAO;AACnB,mBAAW,YAAY,UAAU;AAAA,MACnC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,gBAAgB,OAA8B;;AAC5D,QAAM,iBAAgB,oCAAO,QAAQ,YAAf,mBAAyB;AAC/C,MAAI,CAAC,iBAAiB,OAAO,kBAAkB,UAAU;AACvD,WAAO;AAAA,EACT;AACA,MAAI,YAAY,eAAe;AAC7B,UAAM,SAAU,cAAsB;AACtC,WAAO,WAAW;AAAA,EACpB;AACA,SAAO;AACT;AAEO,SAAS,eAAe,OAA6B;;AAC1D,QAAM,iBAAgB,oCAAO,QAAQ,YAAf,mBAAyB;AAC/C,MAAI,CAAC,iBAAiB,OAAO,kBAAkB,UAAU;AACvD,WAAO;AAAA,EACT;AACA,MAAI,WAAW,eAAe;AAC5B,UAAM,QAAQ,cAAc;AAC5B,WAAO,SAAS;AAAA,EAClB;AACA,SAAO;AACT;AAEO,SAAS,cAAc,OAM5B;;AACA,QAAM,QAAQ,0CAAO,QAAQ,YAAf,mBAAyB,gBAAzB,mBAA8C;AAC5D,SAAO;AAAA,IACL,kBAAkB,oBAAoB,KAAK;AAAA,IAC3C,cAAc,gBAAgB,KAAK;AAAA,IACnC,YAAY,cAAc,KAAK;AAAA,IAC/B,aAAa,eAAe,KAAK;AAAA,IACjC;AAAA,EAAA;AAEJ;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"mind-map-blot.cjs.js","sources":["../../../../../src/modules/mind-map/formats/mind-map-blot.ts"],"sourcesContent":["import type { Root } from 'parchment'\nimport type { BlockEmbed as TypeBlockEmbed } from 'quill/blots/block'\nimport type FluentEditor from '../../../core/fluent-editor'\nimport Quill from 'quill'\nimport { getAllConfigs } from '../config-utils'\nimport { contractIcon, expandIcon } from '../icons'\nimport { initContextMenu } from '../modules/context-menu'\nimport { createControlPanel } from '../modules/control-panel'\nimport { MindMapResizeAction } from '../modules/custom-resize-action'\nimport '../style/mind-map.scss'\n\nconst BlockEmbed = Quill.import('blots/embed') as typeof TypeBlockEmbed\n\nclass MindMapPlaceholderBlot extends BlockEmbed {\n static blotName = 'mind-map'\n static tagName = 'div'\n static className = 'ql-mind-map-item'\n quill: Quill | null = null\n mindMap: any | null = null\n data: any\n zoomCount = 0\n contextMenu: HTMLElement | null = null\n currentNode: any = null\n width: number = 100\n height: number = 500\n parentObserver: MutationObserver | null = null\n nextPObserver: MutationObserver | null = null\n\n constructor(scroll: Root, domNode: HTMLElement) {\n super(scroll, domNode)\n const data = MindMapPlaceholderBlot.value(domNode)\n this.width = data.width || 100\n this.height = data.height || 500\n this.domNode.style.width = `${this.width}${data.width ? 'px' : '%'}`\n this.domNode.style.height = `${this.height}px`\n this.domNode.style.maxWidth = '100%'\n this.domNode.style.border = '1px solid #e8e8e8'\n this.domNode.setAttribute('contenteditable', 'false')\n this.data = MindMapPlaceholderBlot.value(domNode)\n this.initMindMap()\n }\n\n static value(domNode: HTMLElement): any {\n const dataStr = JSON.parse(domNode.getAttribute('data-mind-map'))\n const value = dataStr\n if (domNode.hasAttribute('width')) {\n value.width = Number.parseInt(domNode.getAttribute('width'), 10)\n }\n if (domNode.hasAttribute('height')) {\n value.height = Number.parseInt(domNode.getAttribute('height'), 10)\n }\n return dataStr\n }\n\n static create(value: any): HTMLElement {\n const node = super.create() as HTMLElement\n if (value) {\n node.setAttribute('data-mind-map', JSON.stringify(value))\n }\n if (value.width) {\n node.setAttribute('width', String(value.width))\n node.style.width = `${value.width}%`\n }\n if (value.height) {\n node.setAttribute('height', String(value.height))\n node.style.height = `${value.height}px`\n }\n node.setAttribute('contenteditable', 'false')\n return node\n }\n\n private static findQuill(el: HTMLElement): Quill | null {\n let cur: HTMLElement | null = el\n while (cur) {\n const q = (cur as any).__quillInstance\n if (q) return q\n cur = cur.parentElement\n }\n return null\n }\n\n attach() {\n super.attach()\n this.quill = MindMapPlaceholderBlot.findQuill(this.domNode)\n }\n\n initMindMap(): void {\n if (this.domNode.isConnected) {\n this.insertMindMapEditor()\n }\n else {\n const observer = new MutationObserver(() => {\n if (this.domNode.isConnected) {\n this.insertMindMapEditor()\n observer.disconnect()\n }\n })\n observer.observe(document.body, { childList: true, subtree: true })\n }\n }\n\n insertMindMapEditor(): void {\n this.domNode.style.width = `${this.width}${this.data.width ? 'px' : '%'}`\n this.domNode.style.height = `${this.height}px`\n while (this.domNode.firstChild) {\n this.domNode.removeChild(this.domNode.firstChild)\n }\n this.updateAlignmentStyle()\n this.observeParentAlignment()\n const { backgroundConfig, resizeConfig, lineConfig, themeConfig, deps } = getAllConfigs(this.quill)\n const { SimpleMindMap, Themes, Drag, Export } = deps || window as any\n Themes.init(SimpleMindMap)\n SimpleMindMap.usePlugin(Drag).usePlugin(Export)\n this.mindMap = new SimpleMindMap ({\n el: this.domNode,\n mousewheelAction: 'zoom',\n disableMouseWheelZoom: true,\n layout: this.data.layout,\n theme: themeConfig,\n data: this.data.root ? this.data.root : this.data,\n } as any)\n\n const styleConfig = { ...backgroundConfig }\n if (lineConfig && typeof lineConfig === 'object') {\n Object.assign(styleConfig, lineConfig)\n }\n\n this.mindMap.setThemeConfig(styleConfig)\n\n const handleScroll = () => {\n if (this.mindMap && this.domNode && this.domNode.isConnected) {\n this.mindMap.getElRectInfo()\n }\n }\n\n window.addEventListener('scroll', handleScroll, { passive: true })\n\n this.domNode.addEventListener('remove', () => {\n window.removeEventListener('scroll', handleScroll)\n })\n\n if (resizeConfig) {\n new MindMapResizeAction(this)\n }\n createControlPanel(this, this.quill as FluentEditor) // 创建控制面板\n initContextMenu(this, this.quill as FluentEditor) // 初始化右键菜单\n this.observeOwnParentChange()\n this.observeNextPElement()\n this.addMouseHoverEvents()\n this.mindMap.on('node_tree_render_end', () => {\n this.data = this.mindMap.getData({})\n this.domNode.setAttribute('data-mind-map', JSON.stringify(this.data))\n })\n this.mindMap.on('node_dblclick', this.handleNodeDblClick.bind(this))\n this.domNode.addEventListener('click', (e) => {\n if (this.quill) {\n this.mindMap.getElRectInfo()\n const mindMapBlot = Quill.find(this.domNode)\n const index = this.quill.getIndex(mindMapBlot as MindMapPlaceholderBlot)\n if (index && typeof index === 'number') {\n this.quill.setSelection(index + 1, 0)\n }\n }\n })\n }\n\n addMouseHoverEvents(): void {\n this.domNode.addEventListener('mouseenter', () => {\n this.showControlPanel()\n })\n\n this.domNode.addEventListener('mouseleave', () => {\n this.mindMap.execCommand('CLEAR_ACTIVE_NODE')\n this.hideControlPanel()\n })\n }\n\n getControlElements(): { leftUpControl: HTMLElement | null, control: HTMLElement | null, panelStatusIcon: HTMLElement | null } {\n const leftUpControl = this.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement | null\n const control = this.domNode.querySelector('.ql-mind-map-control') as HTMLElement | null\n const panelStatusIcon = this.domNode.querySelector('[data-control-type=\"panel-status\"]') as HTMLElement | null\n return { leftUpControl, control, panelStatusIcon }\n }\n\n showControlPanel(): void {\n const { leftUpControl, control, panelStatusIcon } = this.getControlElements()\n if (!leftUpControl || !control) return\n\n leftUpControl.style.display = 'inline-flex'\n control.style.display = 'flex'\n if (panelStatusIcon) {\n const iconElement = panelStatusIcon.querySelector('i') || panelStatusIcon\n iconElement.innerHTML = expandIcon\n }\n }\n\n hideControlPanel(): void {\n const { leftUpControl, control, panelStatusIcon } = this.getControlElements()\n if (!leftUpControl || !control) return\n\n leftUpControl.style.display = 'none'\n control.style.display = 'none'\n if (panelStatusIcon) {\n const iconElement = panelStatusIcon.querySelector('i') || panelStatusIcon\n iconElement.innerHTML = contractIcon\n }\n }\n\n // 监听父元素变化\n observeOwnParentChange(): void {\n let currentParent = this.domNode.parentElement\n const observer = new MutationObserver(() => {\n if (this.domNode.parentElement !== currentParent) {\n currentParent = this.domNode.parentElement\n this.observeParentAlignment()\n }\n })\n\n observer.observe(document.body, {\n attributes: false,\n childList: true,\n subtree: true,\n })\n }\n\n // 监听父元素对齐变化\n observeParentAlignment(): void {\n if (this.parentObserver) {\n this.parentObserver.disconnect()\n }\n\n const observer = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.attributeName === 'class') {\n this.updateAlignmentStyle()\n }\n })\n })\n\n this.parentObserver = observer\n\n const parent = this.domNode.parentElement\n if (parent) {\n observer.observe(parent, {\n attributes: true,\n attributeFilter: ['class'],\n })\n this.updateAlignmentStyle()\n }\n }\n\n // 更新对齐样式\n updateAlignmentStyle(): void {\n const parent = this.domNode.parentElement\n if (!parent) return\n\n this.domNode.style.margin = ''\n this.domNode.style.display = 'block'\n\n if (parent.classList.contains('ql-align-center')) {\n this.domNode.style.margin = '0 auto'\n }\n else if (parent.classList.contains('ql-align-right')) {\n this.domNode.style.marginLeft = 'auto'\n this.domNode.style.marginRight = '0'\n }\n else {\n this.domNode.style.marginLeft = '0'\n this.domNode.style.marginRight = 'auto'\n }\n }\n\n observeNextPElement(): void {\n if (this.nextPObserver) {\n this.nextPObserver.disconnect()\n }\n const parentElement = this.domNode.parentElement\n if (!parentElement) {\n return\n }\n const trackedParentElement = parentElement\n const parentElementId = parentElement.getAttribute('id') || `mind-map-parent-${Date.now()}`\n parentElement.setAttribute('id', parentElementId)\n const observer = new MutationObserver(() => {\n if (!document.contains(trackedParentElement)) {\n const elementById = document.getElementById(parentElementId)\n if (!elementById) {\n this.remove()\n observer.disconnect()\n }\n }\n })\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n })\n this.nextPObserver = observer\n }\n\n handleNodeDblClick(node: any, e: any) {\n if (node && node.uid && e) {\n this.currentNode = node\n this.createEditInput(node, e)\n }\n }\n\n // 创建编辑输入框\n createEditInput(node: any, e: any) {\n const input = document.createElement('textarea')\n input.className = 'ql-mind-map-edit-input'\n input.value = node.nodeData.data.text || ''\n const autoResize = () => {\n input.style.height = 'auto'\n input.style.height = `${input.scrollHeight}px`\n }\n Object.assign(input.style, {\n position: 'absolute',\n boxSizing: 'border-box',\n width: '100px',\n height: '35px',\n padding: '5px',\n lineHeight: '1.2',\n fontFamily: '微软雅黑',\n fontSize: '16px',\n whiteSpace: 'pre',\n textAlign: 'center',\n background: '#fff',\n border: '1px solid #edefed',\n borderRadius: '3px',\n outline: 'none',\n transform: 'translate(-50%, -50%)',\n resize: 'none',\n zIndex: '1000',\n left: `${e.pageX ? e.pageX : 100}px`,\n top: `${e.pageY ? e.pageY : 100}px`,\n overflow: 'hidden',\n })\n\n document.body.appendChild(input)\n autoResize()\n input.addEventListener('keydown', (event) => {\n if (event.key === 'Enter' && event.shiftKey) {\n autoResize()\n }\n })\n input.focus()\n\n const currentNode = node\n const handleDrawClick = () => {\n this.updateNodeText(input.value, currentNode)\n input.remove()\n this.mindMap.off('draw_click', handleDrawClick)\n }\n\n this.mindMap.on('draw_click', handleDrawClick)\n\n input.addEventListener('keydown', (event) => {\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault()\n this.updateNodeText(input.value, currentNode)\n input.remove()\n this.mindMap.off('draw_click', handleDrawClick)\n }\n })\n }\n\n updateNodeText(text: string, node: any) {\n if (node && this.mindMap) {\n node.setText(text)\n const editWraps = document.querySelectorAll('.smm-node-edit-wrap')\n editWraps.forEach((editWrap) => {\n const input = editWrap.querySelector('input, textarea')\n if (input) {\n (input as HTMLInputElement | HTMLTextAreaElement).value = text\n }\n else {\n editWrap.textContent = text\n }\n })\n this.data = this.mindMap.getData({})\n this.domNode.setAttribute('data-mind-map', JSON.stringify(this.data))\n }\n }\n\n format(name: string, value: any) {\n }\n\n remove() {\n this.mindMap.destroy()\n if (this.nextPObserver) {\n this.nextPObserver.disconnect()\n this.nextPObserver = null\n }\n super.remove()\n }\n}\n\nexport default MindMapPlaceholderBlot\n"],"names":["getAllConfigs","MindMapResizeAction","createControlPanel","initContextMenu","expandIcon","contractIcon"],"mappings":"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"}
1
+ {"version":3,"file":"mind-map-blot.cjs.js","sources":["../../../../../src/modules/mind-map/formats/mind-map-blot.ts"],"sourcesContent":["import type { Root } from 'parchment'\r\nimport type { BlockEmbed as TypeBlockEmbed } from 'quill/blots/block'\r\nimport type FluentEditor from '../../../core/fluent-editor'\r\nimport Quill from 'quill'\r\nimport { getAllConfigs } from '../config-utils'\r\nimport { contractIcon, expandIcon } from '../icons'\r\nimport { initContextMenu } from '../modules/context-menu'\r\nimport { createControlPanel } from '../modules/control-panel'\r\nimport { MindMapResizeAction } from '../modules/custom-resize-action'\r\nimport '../style/mind-map.scss'\r\n\r\nconst BlockEmbed = Quill.import('blots/embed') as typeof TypeBlockEmbed\r\n\r\nclass MindMapPlaceholderBlot extends BlockEmbed {\r\n static blotName = 'mind-map'\r\n static tagName = 'div'\r\n static className = 'ql-mind-map-item'\r\n quill: Quill | null = null\r\n mindMap: any | null = null\r\n data: any\r\n zoomCount = 0\r\n contextMenu: HTMLElement | null = null\r\n currentNode: any = null\r\n width: number = 100\r\n height: number = 500\r\n parentObserver: MutationObserver | null = null\r\n nextPObserver: MutationObserver | null = null\r\n\r\n constructor(scroll: Root, domNode: HTMLElement) {\r\n super(scroll, domNode)\r\n const data = MindMapPlaceholderBlot.value(domNode)\r\n this.width = data.width || 100\r\n this.height = data.height || 500\r\n this.domNode.style.width = `${this.width}${data.width ? 'px' : '%'}`\r\n this.domNode.style.height = `${this.height}px`\r\n this.domNode.style.maxWidth = '100%'\r\n this.domNode.style.border = '1px solid #e8e8e8'\r\n this.domNode.setAttribute('contenteditable', 'false')\r\n this.data = MindMapPlaceholderBlot.value(domNode)\r\n this.initMindMap()\r\n }\r\n\r\n static value(domNode: HTMLElement): any {\r\n const dataStr = JSON.parse(domNode.getAttribute('data-mind-map'))\r\n const value = dataStr\r\n if (domNode.hasAttribute('width')) {\r\n value.width = Number.parseInt(domNode.getAttribute('width'), 10)\r\n }\r\n if (domNode.hasAttribute('height')) {\r\n value.height = Number.parseInt(domNode.getAttribute('height'), 10)\r\n }\r\n return dataStr\r\n }\r\n\r\n static create(value: any): HTMLElement {\r\n const node = super.create() as HTMLElement\r\n if (value) {\r\n node.setAttribute('data-mind-map', JSON.stringify(value))\r\n }\r\n if (value.width) {\r\n node.setAttribute('width', String(value.width))\r\n node.style.width = `${value.width}%`\r\n }\r\n if (value.height) {\r\n node.setAttribute('height', String(value.height))\r\n node.style.height = `${value.height}px`\r\n }\r\n node.setAttribute('contenteditable', 'false')\r\n return node\r\n }\r\n\r\n private static findQuill(el: HTMLElement): Quill | null {\r\n let cur: HTMLElement | null = el\r\n while (cur) {\r\n const q = (cur as any).__quillInstance\r\n if (q) return q\r\n cur = cur.parentElement\r\n }\r\n return null\r\n }\r\n\r\n attach() {\r\n super.attach()\r\n this.quill = MindMapPlaceholderBlot.findQuill(this.domNode)\r\n }\r\n\r\n initMindMap(): void {\r\n if (this.domNode.isConnected) {\r\n this.insertMindMapEditor()\r\n }\r\n else {\r\n const observer = new MutationObserver(() => {\r\n if (this.domNode.isConnected) {\r\n this.insertMindMapEditor()\r\n observer.disconnect()\r\n }\r\n })\r\n observer.observe(document.body, { childList: true, subtree: true })\r\n }\r\n }\r\n\r\n insertMindMapEditor(): void {\r\n this.domNode.style.width = `${this.width}${this.data.width ? 'px' : '%'}`\r\n this.domNode.style.height = `${this.height}px`\r\n while (this.domNode.firstChild) {\r\n this.domNode.removeChild(this.domNode.firstChild)\r\n }\r\n this.updateAlignmentStyle()\r\n this.observeParentAlignment()\r\n const { backgroundConfig, resizeConfig, lineConfig, themeConfig, deps } = getAllConfigs(this.quill)\r\n const { SimpleMindMap, Themes, Drag, Export } = deps || window as any\r\n Themes.init(SimpleMindMap)\r\n SimpleMindMap.usePlugin(Drag).usePlugin(Export)\r\n this.mindMap = new SimpleMindMap ({\r\n el: this.domNode,\r\n mousewheelAction: 'zoom',\r\n disableMouseWheelZoom: true,\r\n layout: this.data.layout,\r\n theme: themeConfig,\r\n data: this.data.root ? this.data.root : this.data,\r\n } as any)\r\n\r\n const styleConfig = { ...backgroundConfig }\r\n if (lineConfig && typeof lineConfig === 'object') {\r\n Object.assign(styleConfig, lineConfig)\r\n }\r\n\r\n this.mindMap.setThemeConfig(styleConfig)\r\n\r\n const handleScroll = () => {\r\n if (this.mindMap && this.domNode && this.domNode.isConnected) {\r\n this.mindMap.getElRectInfo()\r\n }\r\n }\r\n\r\n window.addEventListener('scroll', handleScroll, { passive: true })\r\n\r\n this.domNode.addEventListener('remove', () => {\r\n window.removeEventListener('scroll', handleScroll)\r\n })\r\n\r\n if (resizeConfig) {\r\n new MindMapResizeAction(this)\r\n }\r\n createControlPanel(this, this.quill as FluentEditor) // 创建控制面板\r\n initContextMenu(this, this.quill as FluentEditor) // 初始化右键菜单\r\n this.observeOwnParentChange()\r\n this.observeNextPElement()\r\n this.addMouseHoverEvents()\r\n this.mindMap.on('node_tree_render_end', () => {\r\n this.data = this.mindMap.getData({})\r\n this.domNode.setAttribute('data-mind-map', JSON.stringify(this.data))\r\n })\r\n this.mindMap.on('node_dblclick', this.handleNodeDblClick.bind(this))\r\n this.domNode.addEventListener('click', (e) => {\r\n if (this.quill) {\r\n this.mindMap.getElRectInfo()\r\n const mindMapBlot = Quill.find(this.domNode)\r\n const index = this.quill.getIndex(mindMapBlot as MindMapPlaceholderBlot)\r\n if (index && typeof index === 'number') {\r\n this.quill.setSelection(index + 1, 0)\r\n }\r\n }\r\n })\r\n }\r\n\r\n addMouseHoverEvents(): void {\r\n this.domNode.addEventListener('mouseenter', () => {\r\n this.showControlPanel()\r\n })\r\n\r\n this.domNode.addEventListener('mouseleave', () => {\r\n this.mindMap.execCommand('CLEAR_ACTIVE_NODE')\r\n this.hideControlPanel()\r\n })\r\n }\r\n\r\n getControlElements(): { leftUpControl: HTMLElement | null, control: HTMLElement | null, panelStatusIcon: HTMLElement | null } {\r\n const leftUpControl = this.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement | null\r\n const control = this.domNode.querySelector('.ql-mind-map-control') as HTMLElement | null\r\n const panelStatusIcon = this.domNode.querySelector('[data-control-type=\"panel-status\"]') as HTMLElement | null\r\n return { leftUpControl, control, panelStatusIcon }\r\n }\r\n\r\n showControlPanel(): void {\r\n const { leftUpControl, control, panelStatusIcon } = this.getControlElements()\r\n if (!leftUpControl || !control) return\r\n\r\n leftUpControl.style.display = 'inline-flex'\r\n control.style.display = 'flex'\r\n if (panelStatusIcon) {\r\n const iconElement = panelStatusIcon.querySelector('i') || panelStatusIcon\r\n iconElement.innerHTML = expandIcon\r\n }\r\n }\r\n\r\n hideControlPanel(): void {\r\n const { leftUpControl, control, panelStatusIcon } = this.getControlElements()\r\n if (!leftUpControl || !control) return\r\n\r\n leftUpControl.style.display = 'none'\r\n control.style.display = 'none'\r\n if (panelStatusIcon) {\r\n const iconElement = panelStatusIcon.querySelector('i') || panelStatusIcon\r\n iconElement.innerHTML = contractIcon\r\n }\r\n }\r\n\r\n // 监听父元素变化\r\n observeOwnParentChange(): void {\r\n let currentParent = this.domNode.parentElement\r\n const observer = new MutationObserver(() => {\r\n if (this.domNode.parentElement !== currentParent) {\r\n currentParent = this.domNode.parentElement\r\n this.observeParentAlignment()\r\n }\r\n })\r\n\r\n observer.observe(document.body, {\r\n attributes: false,\r\n childList: true,\r\n subtree: true,\r\n })\r\n }\r\n\r\n // 监听父元素对齐变化\r\n observeParentAlignment(): void {\r\n if (this.parentObserver) {\r\n this.parentObserver.disconnect()\r\n }\r\n\r\n const observer = new MutationObserver((mutations) => {\r\n mutations.forEach((mutation) => {\r\n if (mutation.attributeName === 'class') {\r\n this.updateAlignmentStyle()\r\n }\r\n })\r\n })\r\n\r\n this.parentObserver = observer\r\n\r\n const parent = this.domNode.parentElement\r\n if (parent) {\r\n observer.observe(parent, {\r\n attributes: true,\r\n attributeFilter: ['class'],\r\n })\r\n this.updateAlignmentStyle()\r\n }\r\n }\r\n\r\n // 更新对齐样式\r\n updateAlignmentStyle(): void {\r\n const parent = this.domNode.parentElement\r\n if (!parent) return\r\n\r\n this.domNode.style.margin = ''\r\n this.domNode.style.display = 'block'\r\n\r\n if (parent.classList.contains('ql-align-center')) {\r\n this.domNode.style.margin = '0 auto'\r\n }\r\n else if (parent.classList.contains('ql-align-right')) {\r\n this.domNode.style.marginLeft = 'auto'\r\n this.domNode.style.marginRight = '0'\r\n }\r\n else {\r\n this.domNode.style.marginLeft = '0'\r\n this.domNode.style.marginRight = 'auto'\r\n }\r\n }\r\n\r\n observeNextPElement(): void {\r\n if (this.nextPObserver) {\r\n this.nextPObserver.disconnect()\r\n }\r\n const parentElement = this.domNode.parentElement\r\n if (!parentElement) {\r\n return\r\n }\r\n const trackedParentElement = parentElement\r\n const parentElementId = parentElement.getAttribute('id') || `mind-map-parent-${Date.now()}`\r\n parentElement.setAttribute('id', parentElementId)\r\n const observer = new MutationObserver(() => {\r\n if (!document.contains(trackedParentElement)) {\r\n const elementById = document.getElementById(parentElementId)\r\n if (!elementById) {\r\n this.remove()\r\n observer.disconnect()\r\n }\r\n }\r\n })\r\n observer.observe(document.body, {\r\n childList: true,\r\n subtree: true,\r\n })\r\n this.nextPObserver = observer\r\n }\r\n\r\n handleNodeDblClick(node: any, e: any) {\r\n if (node && node.uid && e) {\r\n this.currentNode = node\r\n this.createEditInput(node, e)\r\n }\r\n }\r\n\r\n // 创建编辑输入框\r\n createEditInput(node: any, e: any) {\r\n const input = document.createElement('textarea')\r\n input.className = 'ql-mind-map-edit-input'\r\n input.value = node.nodeData.data.text || ''\r\n const autoResize = () => {\r\n input.style.height = 'auto'\r\n input.style.height = `${input.scrollHeight}px`\r\n }\r\n Object.assign(input.style, {\r\n position: 'absolute',\r\n boxSizing: 'border-box',\r\n width: '100px',\r\n height: '35px',\r\n padding: '5px',\r\n lineHeight: '1.2',\r\n fontFamily: '微软雅黑',\r\n fontSize: '16px',\r\n whiteSpace: 'pre',\r\n textAlign: 'center',\r\n background: '#fff',\r\n border: '1px solid #edefed',\r\n borderRadius: '3px',\r\n outline: 'none',\r\n transform: 'translate(-50%, -50%)',\r\n resize: 'none',\r\n zIndex: '1000',\r\n left: `${e.pageX ? e.pageX : 100}px`,\r\n top: `${e.pageY ? e.pageY : 100}px`,\r\n overflow: 'hidden',\r\n })\r\n\r\n document.body.appendChild(input)\r\n autoResize()\r\n input.addEventListener('keydown', (event) => {\r\n if (event.key === 'Enter' && event.shiftKey) {\r\n autoResize()\r\n }\r\n })\r\n input.focus()\r\n\r\n const currentNode = node\r\n const handleDrawClick = () => {\r\n this.updateNodeText(input.value, currentNode)\r\n input.remove()\r\n this.mindMap.off('draw_click', handleDrawClick)\r\n }\r\n\r\n this.mindMap.on('draw_click', handleDrawClick)\r\n\r\n input.addEventListener('keydown', (event) => {\r\n if (event.key === 'Enter' && !event.shiftKey) {\r\n event.preventDefault()\r\n this.updateNodeText(input.value, currentNode)\r\n input.remove()\r\n this.mindMap.off('draw_click', handleDrawClick)\r\n }\r\n })\r\n }\r\n\r\n updateNodeText(text: string, node: any) {\r\n if (node && this.mindMap) {\r\n node.setText(text)\r\n const editWraps = document.querySelectorAll('.smm-node-edit-wrap')\r\n editWraps.forEach((editWrap) => {\r\n const input = editWrap.querySelector('input, textarea')\r\n if (input) {\r\n (input as HTMLInputElement | HTMLTextAreaElement).value = text\r\n }\r\n else {\r\n editWrap.textContent = text\r\n }\r\n })\r\n this.data = this.mindMap.getData({})\r\n this.domNode.setAttribute('data-mind-map', JSON.stringify(this.data))\r\n }\r\n }\r\n\r\n format(name: string, value: any) {\r\n }\r\n\r\n remove() {\r\n this.mindMap.destroy()\r\n if (this.nextPObserver) {\r\n this.nextPObserver.disconnect()\r\n this.nextPObserver = null\r\n }\r\n super.remove()\r\n }\r\n}\r\n\r\nexport default MindMapPlaceholderBlot\r\n"],"names":["getAllConfigs","MindMapResizeAction","createControlPanel","initContextMenu","expandIcon","contractIcon"],"mappings":"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"}