@opentiny/fluent-editor 4.0.0-alpha.14 → 4.0.0-alpha.16

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/editor-config.interface.d.ts +11 -12
  176. package/types/config/types/editor-modules.interface.d.ts +38 -39
  177. package/types/config/types/index.d.ts +3 -3
  178. package/types/config/types/type.d.ts +2 -2
  179. package/types/core/fluent-editor.d.ts +10 -11
  180. package/types/fluent-editor.d.ts +1 -2
  181. package/types/formats/emoji.d.ts +7 -8
  182. package/types/formats/index.d.ts +4 -4
  183. package/types/formats/soft-break.d.ts +11 -12
  184. package/types/formats/strike.d.ts +7 -8
  185. package/types/formats/video.d.ts +12 -13
  186. package/types/index.d.ts +7 -8
  187. package/types/modules/ai/constants.d.ts +30 -30
  188. package/types/modules/ai/icons.d.ts +21 -21
  189. package/types/modules/ai/index.d.ts +93 -94
  190. package/types/modules/ai/types.d.ts +16 -16
  191. package/types/modules/collaborative-editing/awareness/awareness.d.ts +25 -26
  192. package/types/modules/collaborative-editing/awareness/index.d.ts +2 -2
  193. package/types/modules/collaborative-editing/awareness/y-indexeddb.d.ts +2 -3
  194. package/types/modules/collaborative-editing/collaborative-editing.d.ts +20 -21
  195. package/types/modules/collaborative-editing/index.d.ts +2 -2
  196. package/types/modules/collaborative-editing/module.d.ts +10 -11
  197. package/types/modules/collaborative-editing/provider/index.d.ts +3 -3
  198. package/types/modules/collaborative-editing/provider/providerRegistry.d.ts +24 -25
  199. package/types/modules/collaborative-editing/provider/webrtc.d.ts +33 -34
  200. package/types/modules/collaborative-editing/provider/websocket.d.ts +37 -38
  201. package/types/modules/collaborative-editing/types.d.ts +45 -46
  202. package/types/modules/counter.d.ts +21 -22
  203. package/types/modules/custom-clipboard.d.ts +23 -24
  204. package/types/modules/custom-image/actions/{Action.d.ts → action.d.ts} +7 -8
  205. package/types/modules/custom-image/actions/custom-resize-action.d.ts +22 -23
  206. package/types/modules/custom-image/actions/delete-action.d.ts +5 -6
  207. package/types/modules/custom-image/actions/image-toolbar-buttons.d.ts +15 -16
  208. package/types/modules/custom-image/actions/index.d.ts +6 -6
  209. package/types/modules/custom-image/actions/toolbar-action.d.ts +7 -8
  210. package/types/modules/custom-image/actions/toolbar.d.ts +16 -17
  211. package/types/modules/custom-image/blot-formatter.d.ts +19 -20
  212. package/types/modules/custom-image/image.d.ts +26 -27
  213. package/types/modules/custom-image/index.d.ts +4 -4
  214. package/types/modules/custom-image/{Options.d.ts → options.d.ts} +45 -46
  215. package/types/modules/custom-image/specs/blot-spec.d.ts +10 -11
  216. package/types/modules/custom-image/specs/custom-image-spec.d.ts +15 -16
  217. package/types/modules/custom-image/specs/image-spec.d.ts +7 -8
  218. package/types/modules/custom-image/specs/index.d.ts +3 -3
  219. package/types/modules/custom-uploader.d.ts +37 -38
  220. package/types/modules/divider.d.ts +7 -8
  221. package/types/modules/emoji.d.ts +35 -36
  222. package/types/modules/file/formats/file.d.ts +17 -18
  223. package/types/modules/file/index.d.ts +3 -3
  224. package/types/modules/file/modules/file-bar.d.ts +14 -14
  225. package/types/modules/file/modules/file-module.d.ts +7 -8
  226. package/types/modules/flow-chart/config-utils.d.ts +9 -10
  227. package/types/modules/flow-chart/formats/flow-chart-blot.d.ts +40 -41
  228. package/types/modules/flow-chart/i18n/en-us.d.ts +26 -26
  229. package/types/modules/flow-chart/i18n/index.d.ts +1 -1
  230. package/types/modules/flow-chart/i18n/zh-cn.d.ts +26 -26
  231. package/types/modules/flow-chart/icons.d.ts +12 -12
  232. package/types/modules/flow-chart/index.d.ts +8 -9
  233. package/types/modules/flow-chart/modules/context-menu.d.ts +1 -2
  234. package/types/modules/flow-chart/modules/control-panel.d.ts +1 -2
  235. package/types/modules/flow-chart/modules/custom-resize-action.d.ts +22 -22
  236. package/types/modules/flow-chart/options.d.ts +29 -29
  237. package/types/modules/i18n.d.ts +13 -14
  238. package/types/modules/index.d.ts +18 -18
  239. package/types/modules/link/formats/link.d.ts +14 -15
  240. package/types/modules/link/index.d.ts +2 -2
  241. package/types/modules/link/modules/tooltip.d.ts +25 -26
  242. package/types/modules/mathlive/formats.d.ts +20 -21
  243. package/types/modules/mathlive/index.d.ts +3 -3
  244. package/types/modules/mathlive/module.d.ts +7 -8
  245. package/types/modules/mathlive/tooltip.d.ts +14 -15
  246. package/types/modules/mention/constants.d.ts +3 -3
  247. package/types/modules/mention/index.d.ts +2 -2
  248. package/types/modules/mention/mention-link.d.ts +14 -15
  249. package/types/modules/mention/{Mention.d.ts → mention.d.ts} +52 -53
  250. package/types/modules/mind-map/config-utils.d.ts +11 -12
  251. package/types/modules/mind-map/formats/mind-map-blot.d.ts +41 -42
  252. package/types/modules/mind-map/i18n/en-us.d.ts +25 -25
  253. package/types/modules/mind-map/i18n/index.d.ts +1 -1
  254. package/types/modules/mind-map/i18n/zh-cn.d.ts +25 -25
  255. package/types/modules/mind-map/icons.d.ts +21 -21
  256. package/types/modules/mind-map/index.d.ts +8 -9
  257. package/types/modules/mind-map/modules/context-menu.d.ts +1 -2
  258. package/types/modules/mind-map/modules/control-panel.d.ts +1 -2
  259. package/types/modules/mind-map/modules/custom-resize-action.d.ts +23 -23
  260. package/types/modules/mind-map/options.d.ts +27 -27
  261. package/types/modules/shortcut-key/index.d.ts +67 -68
  262. package/types/modules/syntax.d.ts +12 -13
  263. package/types/modules/table-up/index.d.ts +32 -33
  264. package/types/modules/toolbar/better-picker.d.ts +13 -14
  265. package/types/modules/toolbar/better-toolbar.d.ts +6 -7
  266. package/types/modules/toolbar/index.d.ts +3 -3
  267. package/types/modules/toolbar/toolbar-tip.d.ts +7 -8
  268. package/types/themes/snow.d.ts +9 -10
  269. package/types/tools/format-painter.d.ts +12 -13
  270. package/types/tools/fullscreen.d.ts +4 -5
  271. package/types/tools/screenshot.d.ts +17 -18
  272. package/types/ui/icons.config.d.ts +40 -40
  273. package/types/ui/icons.d.ts +6 -6
  274. package/types/utils/debounce.d.ts +6 -6
  275. package/types/utils/image.d.ts +1 -1
  276. package/types/utils/is.d.ts +6 -6
  277. package/types/utils/merge.d.ts +7 -7
  278. package/types/utils/method.d.ts +6 -6
  279. package/types/utils/scroll-lock.d.ts +6 -6
  280. package/types/config/types/additional-toolbar-item.interface.d.ts +0 -8
  281. package/types/config/types/content-change.interface.d.ts +0 -13
  282. package/types/config/types/content-save.interface.d.ts +0 -6
  283. package/types/config/types/counter-option.interface.d.ts +0 -9
  284. package/types/config/types/editor-toolbar.interface.d.ts +0 -6
  285. package/types/config/types/file-operation.interface.d.ts +0 -12
  286. package/types/config/types/focus-change.interface.d.ts +0 -4
  287. package/types/config/types/fullscreen-module.interface.d.ts +0 -4
  288. package/types/config/types/help-panel-item.interface.d.ts +0 -5
  289. package/types/config/types/help-panel-option.interface.d.ts +0 -7
  290. package/types/config/types/image-module.interface.d.ts +0 -3
  291. package/types/config/types/image-upload.interface.d.ts +0 -7
  292. package/types/config/types/load-on-demand-module.interface.d.ts +0 -5
  293. package/types/config/types/mention-module.interface.d.ts +0 -8
  294. package/types/config/types/paste-change.interface.d.ts +0 -6
  295. package/types/config/types/quick-menu-module.interface.d.ts +0 -3
  296. package/types/config/types/range.interface.d.ts +0 -4
  297. package/types/config/types/registry-options.interface.d.ts +0 -5
  298. package/types/config/types/selection-change.interface.d.ts +0 -8
  299. package/types/config/types/toolbar-item.interface.d.ts +0 -13
  300. package/types/config/types/validate-error.interface.d.ts +0 -13
  301. package/types/modules/custom-image/BlotFormatter.d.ts +0 -29
  302. package/types/modules/custom-image/actions/CustomResizeAction.d.ts +0 -24
  303. package/types/modules/custom-image/actions/DeleteAction.d.ts +0 -7
  304. package/types/modules/custom-image/image-bar.d.ts +0 -15
  305. package/types/modules/custom-image/specs/BlotSpec.d.ts +0 -13
  306. package/types/modules/custom-image/specs/CustomImageSpec.d.ts +0 -21
  307. package/types/modules/custom-image/specs/ImageSpec.d.ts +0 -10
  308. package/types/modules/emoji/emoji-list/index.d.ts +0 -1
  309. package/types/modules/emoji/emoji-list/people.d.ts +0 -1
  310. package/types/modules/emoji/emoji-list.d.ts +0 -2
  311. package/types/modules/emoji/emoji-map.d.ts +0 -2
  312. package/types/modules/emoji/emoji-sprite.d.ts +0 -1
  313. package/types/modules/emoji/formats/emoji-blot.d.ts +0 -13
  314. package/types/modules/emoji/index.d.ts +0 -10
  315. package/types/modules/emoji/modules/emoji.d.ts +0 -38
  316. package/types/modules/emoji/modules/toolbar-emoji.d.ts +0 -8
  317. package/types/modules/emoji/utils.d.ts +0 -1
  318. package/types/modules/global-link/constants.d.ts +0 -3
  319. package/types/modules/global-link/formats/customer-widget-link.d.ts +0 -14
  320. package/types/modules/global-link/formats/doc-link.d.ts +0 -17
  321. package/types/modules/global-link/formats/wiki-link.d.ts +0 -16
  322. package/types/modules/global-link/formats/work-item-link.d.ts +0 -16
  323. package/types/modules/global-link/global-link-panel.d.ts +0 -19
  324. package/types/modules/global-link/index.d.ts +0 -18
  325. package/types/modules/global-link/utils/createTable.d.ts +0 -1
  326. package/types/modules/mention/MentionLink.d.ts +0 -16
  327. package/types/modules/quick-menu.d.ts +0 -22
  328. package/types/modules/table/better-table.d.ts +0 -35
  329. package/types/modules/table/formats/header.d.ts +0 -23
  330. package/types/modules/table/formats/list.d.ts +0 -34
  331. package/types/modules/table/formats/table.d.ts +0 -147
  332. package/types/modules/table/modules/table-column-tool.d.ts +0 -23
  333. package/types/modules/table/modules/table-operation-menu.d.ts +0 -38
  334. package/types/modules/table/modules/table-scroll-bar.d.ts +0 -33
  335. package/types/modules/table/modules/table-selection.d.ts +0 -37
  336. package/types/modules/table/modules/table-selector.d.ts +0 -22
  337. package/types/modules/table/table-config.d.ts +0 -38
  338. package/types/modules/table/utils/index.d.ts +0 -17
  339. package/types/modules/table/utils/node-matchers.d.ts +0 -9
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../../../../src/modules/mind-map/index.ts"],"sourcesContent":["import type Quill from 'quill'\r\nimport type { MindMapOptions } from './options'\r\nimport Quills from 'quill'\r\nimport MindMapPlaceholderBlot from './formats/mind-map-blot'\r\n\r\nexport class MindMapModule {\r\n quill: Quill\r\n toolbar: any\r\n options: MindMapOptions\r\n\r\n static register() {\r\n Quills.register('formats/mind-map', MindMapPlaceholderBlot, true)\r\n }\r\n\r\n constructor(quill: Quill, options: MindMapOptions) {\r\n (quill.container as any).__quillInstance = quill\r\n this.quill = quill\r\n this.options = options\r\n this.toolbar = quill.getModule('toolbar')\r\n if (this.toolbar) {\r\n this.toolbar.addHandler('mind-map', () => {\r\n this.insertMindMapEditor()\r\n })\r\n }\r\n }\r\n\r\n public insertMindMapEditor(): void {\r\n const range = this.quill.getSelection()\r\n if (range) {\r\n const defaultData = {\r\n data: {\r\n text: '根节点',\r\n expand: true,\r\n uid: '36bae545-da0b-4c08-be14-ff05f7f05d0a',\r\n isActive: false,\r\n },\r\n children: [\r\n {\r\n data: {\r\n text: '二级节点',\r\n uid: 'ef0895d2-b5cc-4214-b0ee-e29f8f02420d',\r\n expand: true,\r\n richText: false,\r\n isActive: false,\r\n },\r\n children: [],\r\n },\r\n ],\r\n }\r\n this.quill.insertText(range.index, '\\n', 'user')\r\n this.quill.insertEmbed(range.index + 1, 'mind-map', defaultData, 'user')\r\n this.quill.insertText(range.index + 2, '\\n', 'user')\r\n }\r\n }\r\n}\r\n"],"names":["Quills"],"mappings":";;;;;AAKO,MAAM,cAAc;AAAA,EASzB,YAAY,OAAc,SAAyB;AARnD;AACA;AACA;AAOG,UAAM,UAAkB,kBAAkB;AAC3C,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,SAAK,UAAU,MAAM,UAAU,SAAS;AACxC,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,WAAW,YAAY,MAAM;AACxC,aAAK,oBAAA;AAAA,MACP,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAdA,OAAO,WAAW;AAChBA,UAAO,SAAS,oBAAoB,wBAAwB,IAAI;AAAA,EAClE;AAAA,EAcO,sBAA4B;AACjC,UAAM,QAAQ,KAAK,MAAM,aAAA;AACzB,QAAI,OAAO;AACT,YAAM,cAAc;AAAA,QAClB,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,KAAK;AAAA,UACL,UAAU;AAAA,QAAA;AAAA,QAEZ,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,cACJ,MAAM;AAAA,cACN,KAAK;AAAA,cACL,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,UAAU;AAAA,YAAA;AAAA,YAEZ,UAAU,CAAA;AAAA,UAAC;AAAA,QACb;AAAA,MACF;AAEF,WAAK,MAAM,WAAW,MAAM,OAAO,MAAM,MAAM;AAC/C,WAAK,MAAM,YAAY,MAAM,QAAQ,GAAG,YAAY,aAAa,MAAM;AACvE,WAAK,MAAM,WAAW,MAAM,QAAQ,GAAG,MAAM,MAAM;AAAA,IACrD;AAAA,EACF;AACF;"}
1
+ {"version":3,"file":"index.es.js","sources":["../../../../src/modules/mind-map/index.ts"],"sourcesContent":["import type Quill from 'quill'\nimport type { MindMapOptions } from './options'\nimport Quills from 'quill'\nimport MindMapPlaceholderBlot from './formats/mind-map-blot'\n\nexport class MindMapModule {\n quill: Quill\n toolbar: any\n options: MindMapOptions\n\n static register() {\n Quills.register('formats/mind-map', MindMapPlaceholderBlot, true)\n }\n\n constructor(quill: Quill, options: MindMapOptions) {\n (quill.container as any).__quillInstance = quill\n this.quill = quill\n this.options = options\n this.toolbar = quill.getModule('toolbar')\n if (this.toolbar) {\n this.toolbar.addHandler('mind-map', () => {\n this.insertMindMapEditor()\n })\n }\n }\n\n public insertMindMapEditor(): void {\n const range = this.quill.getSelection()\n if (range) {\n const defaultData = {\n data: {\n text: '根节点',\n expand: true,\n uid: '36bae545-da0b-4c08-be14-ff05f7f05d0a',\n isActive: false,\n },\n children: [\n {\n data: {\n text: '二级节点',\n uid: 'ef0895d2-b5cc-4214-b0ee-e29f8f02420d',\n expand: true,\n richText: false,\n isActive: false,\n },\n children: [],\n },\n ],\n }\n this.quill.insertText(range.index, '\\n', 'user')\n this.quill.insertEmbed(range.index + 1, 'mind-map', defaultData, 'user')\n this.quill.insertText(range.index + 2, '\\n', 'user')\n }\n }\n}\n"],"names":["Quills"],"mappings":";;;;;AAKO,MAAM,cAAc;AAAA,EASzB,YAAY,OAAc,SAAyB;AARnD;AACA;AACA;AAOG,UAAM,UAAkB,kBAAkB;AAC3C,SAAK,QAAQ;AACb,SAAK,UAAU;AACf,SAAK,UAAU,MAAM,UAAU,SAAS;AACxC,QAAI,KAAK,SAAS;AAChB,WAAK,QAAQ,WAAW,YAAY,MAAM;AACxC,aAAK,oBAAA;AAAA,MACP,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAdA,OAAO,WAAW;AAChBA,UAAO,SAAS,oBAAoB,wBAAwB,IAAI;AAAA,EAClE;AAAA,EAcO,sBAA4B;AACjC,UAAM,QAAQ,KAAK,MAAM,aAAA;AACzB,QAAI,OAAO;AACT,YAAM,cAAc;AAAA,QAClB,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,KAAK;AAAA,UACL,UAAU;AAAA,QAAA;AAAA,QAEZ,UAAU;AAAA,UACR;AAAA,YACE,MAAM;AAAA,cACJ,MAAM;AAAA,cACN,KAAK;AAAA,cACL,QAAQ;AAAA,cACR,UAAU;AAAA,cACV,UAAU;AAAA,YAAA;AAAA,YAEZ,UAAU,CAAA;AAAA,UAAC;AAAA,QACb;AAAA,MACF;AAEF,WAAK,MAAM,WAAW,MAAM,OAAO,MAAM,MAAM;AAC/C,WAAK,MAAM,YAAY,MAAM,QAAQ,GAAG,YAAY,aAAa,MAAM;AACvE,WAAK,MAAM,WAAW,MAAM,QAAQ,GAAG,MAAM,MAAM;AAAA,IACrD;AAAA,EACF;AACF;"}
@@ -1 +1 @@
1
- {"version":3,"file":"context-menu.es.js","sources":["../../../../../src/modules/mind-map/modules/context-menu.ts"],"sourcesContent":["import type FluentEditor from '../../../core/fluent-editor'\r\nimport type MindMapPlaceholderBlot from '../formats/mind-map-blot'\r\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\r\nimport { I18N } from '../../../modules/i18n'\r\nimport { registerMindMapI18N } from '../i18n'\r\n\r\nclass MindMapContextMenuHandler {\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: MindMapPlaceholderBlot) {\r\n const i18nModule = this.quill.getModule('i18n') as I18N\r\n registerMindMapI18N(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.updateContextMenuItems()\r\n })\r\n }\r\n\r\n resolveTexts() {\r\n return {\r\n copy: I18N.parserText('mindMap.contextMenu.copy', this.lang),\r\n cut: I18N.parserText('mindMap.contextMenu.cut', this.lang),\r\n paste: I18N.parserText('mindMap.contextMenu.paste', this.lang),\r\n delete: I18N.parserText('mindMap.contextMenu.deleteContent', this.lang),\r\n }\r\n }\r\n\r\n updateContextMenuItems() {\r\n if (!this.blot.contextMenu) return\r\n\r\n const menuItems = this.blot.contextMenu.querySelectorAll('.ql-mind-map-context-menu-item')\r\n if (menuItems.length >= 4) {\r\n menuItems[0].textContent = this.texts.copy\r\n menuItems[1].textContent = this.texts.cut\r\n menuItems[2].textContent = this.texts.paste\r\n menuItems[3].textContent = this.texts.delete\r\n }\r\n }\r\n}\r\n\r\nconst contextMenuHandlers = new WeakMap<MindMapPlaceholderBlot, MindMapContextMenuHandler>()\r\n\r\nexport function initContextMenu(blot: MindMapPlaceholderBlot, quill: FluentEditor): void {\r\n blot.contextMenu = document.createElement('div')\r\n blot.contextMenu.className = 'ql-mind-map-context-menu'\r\n blot.domNode.appendChild(blot.contextMenu)\r\n\r\n const handler = new MindMapContextMenuHandler(quill, blot)\r\n contextMenuHandlers.set(blot, handler)\r\n\r\n addContextMenuItem(blot, handler.getText('copy'), () => handleCopy(blot))\r\n addContextMenuItem(blot, handler.getText('cut'), () => handleCut(blot))\r\n addContextMenuItem(blot, handler.getText('paste'), () => handlePaste(blot))\r\n addContextMenuItem(blot, handler.getText('delete'), () => handleDeleteContent(blot))\r\n\r\n // 监听节点右键点击事件\r\n if (blot.mindMap) {\r\n blot.mindMap.on('node_contextmenu', (e: any, node: any) => {\r\n e.preventDefault()\r\n e.stopPropagation()\r\n blot.currentNode = node\r\n if (blot.contextMenu) {\r\n blot.contextMenu.style.display = 'block'\r\n blot.contextMenu.style.left = `${e.clientX}px`\r\n blot.contextMenu.style.top = `${e.clientY}px`\r\n }\r\n })\r\n }\r\n\r\n // 隐藏菜单的逻辑\r\n const hideMenu = () => {\r\n if (blot.contextMenu) {\r\n blot.contextMenu.style.display = 'none'\r\n blot.currentNode = null\r\n }\r\n }\r\n\r\n blot.mindMap.on('node_click', hideMenu)\r\n blot.mindMap.on('draw_click', hideMenu)\r\n blot.mindMap.on('expand_btn_click', hideMenu)\r\n document.addEventListener('click', (e) => {\r\n if (blot.contextMenu && !blot.contextMenu.contains(e.target as Node)) {\r\n hideMenu()\r\n }\r\n })\r\n}\r\n\r\nfunction addContextMenuItem(blot: MindMapPlaceholderBlot, text: string, onClick: () => void): void {\r\n const item = document.createElement('div')\r\n item.className = 'ql-mind-map-context-menu-item'\r\n item.textContent = text\r\n item.style.padding = '5px 15px'\r\n item.style.cursor = 'pointer'\r\n item.style.whiteSpace = 'nowrap'\r\n item.addEventListener('click', onClick)\r\n item.addEventListener('mouseenter', () => {\r\n item.style.background = '#f5f5f5'\r\n })\r\n item.addEventListener('mouseleave', () => {\r\n item.style.background = 'white'\r\n })\r\n blot.contextMenu!.appendChild(item)\r\n}\r\n\r\nfunction handleCopy(blot: MindMapPlaceholderBlot): void {\r\n blot.mindMap.renderer.copy()\r\n hideContextMenu(blot)\r\n}\r\n\r\nfunction handleCut(blot: MindMapPlaceholderBlot): void {\r\n blot.mindMap.renderer.cut()\r\n hideContextMenu(blot)\r\n}\r\n\r\nfunction handlePaste(blot: MindMapPlaceholderBlot): void {\r\n blot.mindMap.renderer.paste()\r\n hideContextMenu(blot)\r\n}\r\n\r\nfunction handleDeleteContent(blot: MindMapPlaceholderBlot): void {\r\n if (blot.currentNode) {\r\n blot.currentNode.setText('')\r\n blot.data = blot.mindMap.getData({})\r\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\r\n }\r\n hideContextMenu(blot)\r\n}\r\n\r\nfunction hideContextMenu(blot: MindMapPlaceholderBlot): void {\r\n if (blot.contextMenu) {\r\n blot.contextMenu.style.display = 'none'\r\n }\r\n}\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-menu.es.js","sources":["../../../../../src/modules/mind-map/modules/context-menu.ts"],"sourcesContent":["import type FluentEditor from '../../../core/fluent-editor'\nimport type MindMapPlaceholderBlot from '../formats/mind-map-blot'\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\nimport { I18N } from '../../../modules/i18n'\nimport { registerMindMapI18N } from '../i18n'\n\nclass MindMapContextMenuHandler {\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: MindMapPlaceholderBlot) {\n const i18nModule = this.quill.getModule('i18n') as I18N\n registerMindMapI18N(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.updateContextMenuItems()\n })\n }\n\n resolveTexts() {\n return {\n copy: I18N.parserText('mindMap.contextMenu.copy', this.lang),\n cut: I18N.parserText('mindMap.contextMenu.cut', this.lang),\n paste: I18N.parserText('mindMap.contextMenu.paste', this.lang),\n delete: I18N.parserText('mindMap.contextMenu.deleteContent', this.lang),\n }\n }\n\n updateContextMenuItems() {\n if (!this.blot.contextMenu) return\n\n const menuItems = this.blot.contextMenu.querySelectorAll('.ql-mind-map-context-menu-item')\n if (menuItems.length >= 4) {\n menuItems[0].textContent = this.texts.copy\n menuItems[1].textContent = this.texts.cut\n menuItems[2].textContent = this.texts.paste\n menuItems[3].textContent = this.texts.delete\n }\n }\n}\n\nconst contextMenuHandlers = new WeakMap<MindMapPlaceholderBlot, MindMapContextMenuHandler>()\n\nexport function initContextMenu(blot: MindMapPlaceholderBlot, quill: FluentEditor): void {\n blot.contextMenu = document.createElement('div')\n blot.contextMenu.className = 'ql-mind-map-context-menu'\n blot.domNode.appendChild(blot.contextMenu)\n\n const handler = new MindMapContextMenuHandler(quill, blot)\n contextMenuHandlers.set(blot, handler)\n\n addContextMenuItem(blot, handler.getText('copy'), () => handleCopy(blot))\n addContextMenuItem(blot, handler.getText('cut'), () => handleCut(blot))\n addContextMenuItem(blot, handler.getText('paste'), () => handlePaste(blot))\n addContextMenuItem(blot, handler.getText('delete'), () => handleDeleteContent(blot))\n\n // 监听节点右键点击事件\n if (blot.mindMap) {\n blot.mindMap.on('node_contextmenu', (e: any, node: any) => {\n e.preventDefault()\n e.stopPropagation()\n blot.currentNode = node\n if (blot.contextMenu) {\n blot.contextMenu.style.display = 'block'\n blot.contextMenu.style.left = `${e.clientX}px`\n blot.contextMenu.style.top = `${e.clientY}px`\n }\n })\n }\n\n // 隐藏菜单的逻辑\n const hideMenu = () => {\n if (blot.contextMenu) {\n blot.contextMenu.style.display = 'none'\n blot.currentNode = null\n }\n }\n\n blot.mindMap.on('node_click', hideMenu)\n blot.mindMap.on('draw_click', hideMenu)\n blot.mindMap.on('expand_btn_click', hideMenu)\n document.addEventListener('click', (e) => {\n if (blot.contextMenu && !blot.contextMenu.contains(e.target as Node)) {\n hideMenu()\n }\n })\n}\n\nfunction addContextMenuItem(blot: MindMapPlaceholderBlot, text: string, onClick: () => void): void {\n const item = document.createElement('div')\n item.className = 'ql-mind-map-context-menu-item'\n item.textContent = text\n item.style.padding = '5px 15px'\n item.style.cursor = 'pointer'\n item.style.whiteSpace = 'nowrap'\n item.addEventListener('click', onClick)\n item.addEventListener('mouseenter', () => {\n item.style.background = '#f5f5f5'\n })\n item.addEventListener('mouseleave', () => {\n item.style.background = 'white'\n })\n blot.contextMenu!.appendChild(item)\n}\n\nfunction handleCopy(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.renderer.copy()\n hideContextMenu(blot)\n}\n\nfunction handleCut(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.renderer.cut()\n hideContextMenu(blot)\n}\n\nfunction handlePaste(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.renderer.paste()\n hideContextMenu(blot)\n}\n\nfunction handleDeleteContent(blot: MindMapPlaceholderBlot): void {\n if (blot.currentNode) {\n blot.currentNode.setText('')\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n }\n hideContextMenu(blot)\n}\n\nfunction hideContextMenu(blot: MindMapPlaceholderBlot): void {\n if (blot.contextMenu) {\n blot.contextMenu.style.display = 'none'\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"control-panel.es.js","sources":["../../../../../src/modules/mind-map/modules/control-panel.ts"],"sourcesContent":["import type FluentEditor from '../../../core/fluent-editor'\r\nimport type MindMapPlaceholderBlot from '../formats/mind-map-blot'\r\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\r\nimport { I18N } from '../../../modules/i18n'\r\nimport { getAllConfigs } from '../config-utils'\r\nimport { registerMindMapI18N } from '../i18n'\r\nimport { backIcon, catalogOrganizationIcon, contractIcon, fishboneIcon, fitIcon, forwardIcon, insertChildNodeIcon, insertIconIcon, insertNodeIcon, insertParentNodeIcon, logicalStructureIcon, mindMapIcon, organizationStructureIcon, removeNodeIcon, screenReduceIcon, screenTypeIcon, setLayoutIcon, timelineIcon, zoomInIcon, zoomOutIcon } from '../icons'\r\n\r\nclass MindMapControlPanelHandler {\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: MindMapPlaceholderBlot) {\r\n const i18nModule = this.quill.getModule('i18n') as I18N\r\n registerMindMapI18N(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 const textKeys = [\r\n 'zoomOutTitle',\r\n 'zoomInTitle',\r\n 'fitTitle',\r\n 'backTitle',\r\n 'forwardTitle',\r\n 'inserChildNodeTitle',\r\n 'inserNodeTitle',\r\n 'insertIconTitle',\r\n 'inserParentNodeTitle',\r\n 'removeNodeTitle',\r\n 'setLayoutTitle',\r\n 'logicalStructureLayout',\r\n 'catalogOrganizationLayout',\r\n 'mindMapLayout',\r\n 'organizationStructureLayout',\r\n 'timelineLayout',\r\n 'fishboneLayout',\r\n 'panelStatusTitle',\r\n 'screenTypeTitle',\r\n ]\r\n\r\n return textKeys.reduce((acc, key) => {\r\n if (!key.includes('Title')) {\r\n acc[key] = I18N.parserText(`mindMap.layout.${key.replace('Layout', '')}`, this.lang)\r\n }\r\n else {\r\n acc[key] = I18N.parserText(`mindMap.controlPanel.${key}`, this.lang)\r\n }\r\n return acc\r\n }, {} as Record<string, string>)\r\n }\r\n\r\n updateControlPanelTexts() {\r\n const controlItems = this.blot.domNode.querySelectorAll('.ql-mind-map-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 'insert-child-node': 'inserChildNodeTitle',\r\n 'insert-node': 'inserNodeTitle',\r\n 'insert-icon': 'insertIconTitle',\r\n 'insert-parent-node': 'inserParentNodeTitle',\r\n 'remove-node': 'removeNodeTitle',\r\n 'set-layout-icon': 'setLayoutTitle',\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<MindMapPlaceholderBlot, MindMapControlPanelHandler>()\r\n\r\nconst DISABLED_OPACITY = '0.5'\r\nconst ENABLED_OPACITY = '1'\r\nexport function createControlPanel(blot: MindMapPlaceholderBlot, quill: FluentEditor): void {\r\n let isStart = true\r\n let isEnd = true\r\n let selectedNodes: any[] = []\r\n blot.mindMap.on('node_active', (...args: unknown[]) => {\r\n selectedNodes = Array.isArray(args[1]) ? args[1] : []\r\n })\r\n // 中间的控制面板\r\n const controlPanel = document.createElement('div')\r\n controlPanel.className = 'ql-mind-map-control'\r\n // 右上的控制面板\r\n const controlRightUpPanel = document.createElement('div')\r\n controlRightUpPanel.className = 'ql-mind-map-right-up-control'\r\n // 左上的控制面板\r\n const controlLeftUpPanel = document.createElement('div')\r\n controlLeftUpPanel.className = 'ql-mind-map-left-up-control'\r\n\r\n const handler = new MindMapControlPanelHandler(quill, blot)\r\n controlPanelHandlers.set(blot, handler)\r\n\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'), () => {\r\n if (!isStart) {\r\n blot.mindMap.execCommand('BACK')\r\n }\r\n })\r\n const forwardBtn = createControlItem('forward', handler.getText('forwardTitle'), () => {\r\n if (!isEnd) {\r\n blot.mindMap.execCommand('FORWARD')\r\n }\r\n })\r\n const insertChildNode = createControlItem('insert-child-node', handler.getText('inserChildNodeTitle'), () => handleInsertChildNode(blot))\r\n const insertNode = createControlItem('insert-node', handler.getText('inserNodeTitle'), () => handleInsertNode(blot))\r\n const insertParentNode = createControlItem('insert-parent-node', handler.getText('inserParentNodeTitle'), () => handleInsertParentNode(blot))\r\n const removeNode = createControlItem('remove-node', handler.getText('removeNodeTitle'), () => handleRemoveNode(blot))\r\n const insertIconBtn = createControlItem('insert-icon', handler.getText('insertIconTitle'), () => handleInsertIcon(blot, selectedNodes))\r\n const setLayoutBtn = createControlItem('set-layout-icon', handler.getText('setLayoutTitle'), () => handleSetLayoutBtn(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 const updateButtonState = (index: number, len: number) => {\r\n isStart = index <= 0\r\n isEnd = index >= len - 1\r\n backBtn.style.cursor = isStart ? 'not-allowed' : 'pointer'\r\n backBtn.style.opacity = isStart ? DISABLED_OPACITY : ENABLED_OPACITY\r\n forwardBtn.style.cursor = isEnd ? 'not-allowed' : 'pointer'\r\n forwardBtn.style.opacity = isEnd ? DISABLED_OPACITY : ENABLED_OPACITY\r\n }\r\n\r\n blot.mindMap.on('back_forward', (index: number, len: number) => {\r\n updateButtonState(index, len)\r\n })\r\n controlPanel.append(zoomOutBtn, zoomInBtn, resetBtn, screenTypeBtn, backBtn, forwardBtn)\r\n blot.domNode.appendChild(controlPanel)\r\n controlRightUpPanel.append(panelStatusBtn)\r\n blot.domNode.appendChild(controlRightUpPanel)\r\n controlLeftUpPanel.append(insertChildNode, insertNode, insertParentNode, removeNode, insertIconBtn, setLayoutBtn)\r\n blot.domNode.appendChild(controlLeftUpPanel)\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-mind-map-control-item'\r\n controlItem.title = title\r\n controlItem.dataset.controlType = iconClass\r\n controlItem.style.cursor = disabled ? 'not-allowed' : 'pointer'\r\n controlItem.style.opacity = disabled ? DISABLED_OPACITY : ENABLED_OPACITY\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 'insert-child-node': insertChildNodeIcon,\r\n 'insert-node': insertNodeIcon,\r\n 'insert-parent-node': insertParentNodeIcon,\r\n 'remove-node': removeNodeIcon,\r\n 'insert-icon': insertIconIcon,\r\n 'set-layout-icon': setLayoutIcon,\r\n 'screen-type': screenTypeIcon,\r\n 'panel-status': contractIcon,\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 handleInsertChildNode(blot: MindMapPlaceholderBlot): void {\r\n blot.mindMap.execCommand('INSERT_CHILD_NODE')\r\n}\r\n\r\nfunction handleInsertNode(blot: MindMapPlaceholderBlot): void {\r\n blot.mindMap.execCommand('INSERT_NODE')\r\n}\r\n\r\nfunction handleInsertParentNode(blot: MindMapPlaceholderBlot): void {\r\n blot.mindMap.execCommand('INSERT_PARENT_NODE')\r\n}\r\n\r\nfunction handleRemoveNode(blot: MindMapPlaceholderBlot): void {\r\n blot.mindMap.execCommand('REMOVE_CURRENT_NODE')\r\n}\r\n\r\nfunction handleZoomIn(blot: MindMapPlaceholderBlot): void {\r\n if (blot.mindMap && blot.mindMap.view) {\r\n const containerRect = blot.mindMap.el.getBoundingClientRect()\r\n const cx = containerRect.width / 2\r\n const cy = containerRect.height / 2\r\n blot.mindMap.view.enlarge(cx, cy, false)\r\n blot.zoomCount++\r\n }\r\n}\r\n\r\nfunction handleZoomOut(blot: MindMapPlaceholderBlot): void {\r\n if (blot.mindMap && blot.mindMap.view) {\r\n const containerRect = blot.mindMap.el.getBoundingClientRect()\r\n const cx = containerRect.width / 2\r\n const cy = containerRect.height / 2\r\n blot.mindMap.view.narrow(cx, cy, false)\r\n blot.zoomCount--\r\n }\r\n}\r\n\r\nfunction handleResetZoom(blot: MindMapPlaceholderBlot): void {\r\n blot.mindMap.renderer.setRootNodeCenter()\r\n if (!blot.mindMap || !blot.mindMap.view || blot.zoomCount === 0) return\r\n const containerRect = blot.mindMap.el.getBoundingClientRect()\r\n const centerX = containerRect.width / 2\r\n const centerY = containerRect.height / 2\r\n const operationCount = Math.abs(blot.zoomCount)\r\n const isEnlarge = blot.zoomCount < 0\r\n for (let i = 0; i < operationCount; i++) {\r\n if (isEnlarge) {\r\n blot.mindMap.view.enlarge(centerX, centerY, false)\r\n }\r\n else {\r\n blot.mindMap.view.narrow(centerX, centerY, false)\r\n }\r\n }\r\n blot.zoomCount = 0\r\n}\r\n\r\nfunction handleInsertIcon(blot: MindMapPlaceholderBlot, selectedNodes: any[]): void {\r\n (blot as any).selectedNodes = selectedNodes\r\n const heightStr = blot.domNode.getAttribute('height') || '500px'\r\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\r\n let iconList = []\r\n const { deps } = getAllConfigs(blot.quill)\r\n iconList = deps.nodeIconList.nodeIconList ? deps.nodeIconList.nodeIconList : deps.nodeIconList\r\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\r\n let iconPanel = leftUpControl.querySelector('.ql-mind-map-icon-panel') as HTMLElement\r\n if (!iconPanel) {\r\n iconPanel = document.createElement('div')\r\n iconPanel.className = 'ql-mind-map-icon-panel'\r\n iconList?.forEach((group) => {\r\n const groupContainer = document.createElement('div')\r\n groupContainer.className = 'ql-mind-map-icon-group-container'\r\n\r\n group.list.forEach((icon: { icon: string, name: string }) => {\r\n const iconItem = document.createElement('div')\r\n iconItem.className = 'ql-mind-map-icon-item'\r\n iconItem.innerHTML = icon.icon\r\n\r\n iconItem.addEventListener('click', () => {\r\n const currentSelectedNodes = (blot as any).selectedNodes || []\r\n if (currentSelectedNodes.length > 0) {\r\n const node = currentSelectedNodes[0]\r\n\r\n if (node.getData('icon') && node.getData('icon')[0] === `${group.type}_${icon.name}`) {\r\n node.setIcon([])\r\n }\r\n else {\r\n node.setIcon([`${group.type}_${icon.name}`])\r\n }\r\n blot.data = blot.mindMap.getData({})\r\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\r\n }\r\n iconPanel.style.display = 'none'\r\n })\r\n groupContainer.appendChild(iconItem)\r\n })\r\n iconPanel.appendChild(groupContainer)\r\n })\r\n if (height < 395) {\r\n iconPanel.style.height = `${height - 130}px`\r\n }\r\n else {\r\n iconPanel.style.height = '270px'\r\n }\r\n leftUpControl.appendChild(iconPanel)\r\n }\r\n else {\r\n if (height < 395) {\r\n iconPanel.style.height = `${height - 130}px`\r\n }\r\n else {\r\n iconPanel.style.height = '270px'\r\n }\r\n iconPanel.style.display = 'block'\r\n }\r\n\r\n const handleOutsideClick = (e: MouseEvent) => {\r\n let insertIconBtn: HTMLElement | null = null\r\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\r\n\r\n controlItems.forEach((item) => {\r\n if ((item as HTMLElement).dataset.controlType === 'insert-icon') {\r\n insertIconBtn = item as HTMLElement\r\n }\r\n })\r\n\r\n if (!iconPanel.contains(e.target as Node) && (!insertIconBtn || !insertIconBtn.contains(e.target as Node))) {\r\n iconPanel.style.display = 'none'\r\n document.removeEventListener('click', handleOutsideClick)\r\n }\r\n }\r\n document.removeEventListener('click', handleOutsideClick)\r\n document.addEventListener('click', handleOutsideClick)\r\n}\r\n\r\nfunction handleSetLayoutBtn(blot: MindMapPlaceholderBlot): void {\r\n const handler = controlPanelHandlers.get(blot)\r\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\r\n let layoutPanel = leftUpControl.querySelector('.ql-mind-map-layout-panel') as HTMLElement\r\n const heightStr = blot.domNode.getAttribute('height') || '500'\r\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\r\n\r\n if (!layoutPanel) {\r\n layoutPanel = document.createElement('div')\r\n layoutPanel.className = 'ql-mind-map-layout-panel'\r\n\r\n const layouts = [\r\n {\r\n name: 'logicalStructure',\r\n displayName: handler?.getText('logicalStructureLayout'),\r\n icon: logicalStructureIcon,\r\n },\r\n {\r\n name: 'catalogOrganization',\r\n displayName: handler?.getText('catalogOrganizationLayout'),\r\n icon: catalogOrganizationIcon,\r\n },\r\n {\r\n name: 'mindMap',\r\n displayName: handler?.getText('mindMapLayout'),\r\n icon: mindMapIcon,\r\n },\r\n {\r\n name: 'organizationStructure',\r\n displayName: handler?.getText('organizationStructureLayout'),\r\n icon: organizationStructureIcon,\r\n },\r\n {\r\n name: 'timeline',\r\n displayName: handler?.getText('timelineLayout'),\r\n icon: timelineIcon,\r\n },\r\n {\r\n name: 'fishbone',\r\n displayName: handler?.getText('fishboneLayout'),\r\n icon: fishboneIcon,\r\n },\r\n ]\r\n\r\n layouts.forEach((layout) => {\r\n const layoutItem = document.createElement('div')\r\n layoutItem.className = 'ql-mind-map-layout-item'\r\n\r\n const iconContainer = document.createElement('div')\r\n iconContainer.className = 'ql-mind-map-layout-icon-container'\r\n\r\n const img = document.createElement('div')\r\n img.className = 'ql-mind-map-layout-icon'\r\n img.innerHTML = layout.icon\r\n img.style.display = 'flex'\r\n img.style.alignItems = 'center'\r\n img.style.justifyContent = 'center'\r\n const svgElement = img.querySelector('svg')\r\n\r\n svgElement.style.maxWidth = '100%'\r\n svgElement.style.maxHeight = '100%'\r\n svgElement.style.width = 'auto'\r\n svgElement.style.height = 'auto'\r\n svgElement.removeAttribute('width')\r\n svgElement.removeAttribute('height')\r\n\r\n iconContainer.appendChild(img)\r\n\r\n const nameText = document.createElement('div')\r\n nameText.className = 'ql-mind-map-layout-name'\r\n nameText.textContent = layout.displayName\r\n\r\n layoutItem.appendChild(iconContainer)\r\n layoutItem.appendChild(nameText)\r\n layoutItem.addEventListener('click', () => {\r\n blot.mindMap.setLayout(layout.name)\r\n blot.data = blot.mindMap.getData({})\r\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\r\n layoutPanel.style.display = 'none'\r\n })\r\n layoutPanel.appendChild(layoutItem)\r\n })\r\n leftUpControl.appendChild(layoutPanel)\r\n if (height < 395) {\r\n layoutPanel.style.height = `${height - 130}px`\r\n }\r\n else {\r\n layoutPanel.style.height = '270px'\r\n }\r\n }\r\n else {\r\n if (height < 395) {\r\n layoutPanel.style.height = `${height - 130}px`\r\n }\r\n else {\r\n layoutPanel.style.height = '270px'\r\n }\r\n layoutPanel.style.display = 'flex'\r\n }\r\n\r\n const handleOutsideClick = (e: MouseEvent) => {\r\n let setLayoutBtn: HTMLElement | null = null\r\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\r\n\r\n setLayoutBtn = Array.from(controlItems).find(item => item.getAttribute('data-control-type') === 'set-layout-icon') as HTMLElement | null\r\n\r\n if (!layoutPanel.contains(e.target as Node) && (!setLayoutBtn || !setLayoutBtn.contains(e.target as Node))) {\r\n layoutPanel.style.display = 'none'\r\n document.removeEventListener('click', handleOutsideClick)\r\n }\r\n }\r\n document.removeEventListener('click', handleOutsideClick)\r\n document.addEventListener('click', handleOutsideClick)\r\n}\r\n\r\nfunction handleScreenTypeBtn(blot: MindMapPlaceholderBlot): 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 mindMapContainer = blot.domNode\r\n const isFullscreen = mindMapContainer.style.position === 'fixed'\r\n\r\n if (isFullscreen) {\r\n const originalPosition = mindMapContainer.getAttribute('data-original-position')\r\n const originalWidth = mindMapContainer.getAttribute('data-original-width')\r\n const originalHeight = mindMapContainer.getAttribute('data-original-height')\r\n if (originalWidth && originalHeight) {\r\n mindMapContainer.style.position = originalPosition\r\n mindMapContainer.style.width = originalWidth\r\n mindMapContainer.style.height = originalHeight\r\n mindMapContainer.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 mindMapContainer.setAttribute('data-original-position', mindMapContainer.style.position || '')\r\n mindMapContainer.setAttribute('data-original-width', mindMapContainer.style.width || '')\r\n mindMapContainer.setAttribute('data-original-height', mindMapContainer.style.height || '')\r\n mindMapContainer.style.position = 'fixed'\r\n mindMapContainer.style.top = '0'\r\n mindMapContainer.style.left = '0'\r\n mindMapContainer.style.width = '100vw'\r\n mindMapContainer.style.height = '100vh'\r\n mindMapContainer.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.mindMap.renderer.setRootNodeCenter()\r\n blot.mindMap.resize()\r\n}\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"control-panel.es.js","sources":["../../../../../src/modules/mind-map/modules/control-panel.ts"],"sourcesContent":["import type FluentEditor from '../../../core/fluent-editor'\nimport type MindMapPlaceholderBlot from '../formats/mind-map-blot'\nimport { CHANGE_LANGUAGE_EVENT } from '../../../config'\nimport { I18N } from '../../../modules/i18n'\nimport { getAllConfigs } from '../config-utils'\nimport { registerMindMapI18N } from '../i18n'\nimport { backIcon, catalogOrganizationIcon, contractIcon, fishboneIcon, fitIcon, forwardIcon, insertChildNodeIcon, insertIconIcon, insertNodeIcon, insertParentNodeIcon, logicalStructureIcon, mindMapIcon, organizationStructureIcon, removeNodeIcon, screenReduceIcon, screenTypeIcon, setLayoutIcon, timelineIcon, zoomInIcon, zoomOutIcon } from '../icons'\n\nclass MindMapControlPanelHandler {\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: MindMapPlaceholderBlot) {\n const i18nModule = this.quill.getModule('i18n') as I18N\n registerMindMapI18N(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 const textKeys = [\n 'zoomOutTitle',\n 'zoomInTitle',\n 'fitTitle',\n 'backTitle',\n 'forwardTitle',\n 'inserChildNodeTitle',\n 'inserNodeTitle',\n 'insertIconTitle',\n 'inserParentNodeTitle',\n 'removeNodeTitle',\n 'setLayoutTitle',\n 'logicalStructureLayout',\n 'catalogOrganizationLayout',\n 'mindMapLayout',\n 'organizationStructureLayout',\n 'timelineLayout',\n 'fishboneLayout',\n 'panelStatusTitle',\n 'screenTypeTitle',\n ]\n\n return textKeys.reduce((acc, key) => {\n if (!key.includes('Title')) {\n acc[key] = I18N.parserText(`mindMap.layout.${key.replace('Layout', '')}`, this.lang)\n }\n else {\n acc[key] = I18N.parserText(`mindMap.controlPanel.${key}`, this.lang)\n }\n return acc\n }, {} as Record<string, string>)\n }\n\n updateControlPanelTexts() {\n const controlItems = this.blot.domNode.querySelectorAll('.ql-mind-map-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 'insert-child-node': 'inserChildNodeTitle',\n 'insert-node': 'inserNodeTitle',\n 'insert-icon': 'insertIconTitle',\n 'insert-parent-node': 'inserParentNodeTitle',\n 'remove-node': 'removeNodeTitle',\n 'set-layout-icon': 'setLayoutTitle',\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<MindMapPlaceholderBlot, MindMapControlPanelHandler>()\n\nconst DISABLED_OPACITY = '0.5'\nconst ENABLED_OPACITY = '1'\nexport function createControlPanel(blot: MindMapPlaceholderBlot, quill: FluentEditor): void {\n let isStart = true\n let isEnd = true\n let selectedNodes: any[] = []\n blot.mindMap.on('node_active', (...args: unknown[]) => {\n selectedNodes = Array.isArray(args[1]) ? args[1] : []\n })\n // 中间的控制面板\n const controlPanel = document.createElement('div')\n controlPanel.className = 'ql-mind-map-control'\n // 右上的控制面板\n const controlRightUpPanel = document.createElement('div')\n controlRightUpPanel.className = 'ql-mind-map-right-up-control'\n // 左上的控制面板\n const controlLeftUpPanel = document.createElement('div')\n controlLeftUpPanel.className = 'ql-mind-map-left-up-control'\n\n const handler = new MindMapControlPanelHandler(quill, blot)\n controlPanelHandlers.set(blot, handler)\n\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'), () => {\n if (!isStart) {\n blot.mindMap.execCommand('BACK')\n }\n })\n const forwardBtn = createControlItem('forward', handler.getText('forwardTitle'), () => {\n if (!isEnd) {\n blot.mindMap.execCommand('FORWARD')\n }\n })\n const insertChildNode = createControlItem('insert-child-node', handler.getText('inserChildNodeTitle'), () => handleInsertChildNode(blot))\n const insertNode = createControlItem('insert-node', handler.getText('inserNodeTitle'), () => handleInsertNode(blot))\n const insertParentNode = createControlItem('insert-parent-node', handler.getText('inserParentNodeTitle'), () => handleInsertParentNode(blot))\n const removeNode = createControlItem('remove-node', handler.getText('removeNodeTitle'), () => handleRemoveNode(blot))\n const insertIconBtn = createControlItem('insert-icon', handler.getText('insertIconTitle'), () => handleInsertIcon(blot, selectedNodes))\n const setLayoutBtn = createControlItem('set-layout-icon', handler.getText('setLayoutTitle'), () => handleSetLayoutBtn(blot))\n const panelStatusBtn = createControlItem('panel-status', handler.getText('panelStatusTitle'))\n const screenTypeBtn = createControlItem('screen-type', handler.getText('screenTypeTitle'), () => handleScreenTypeBtn(blot))\n const updateButtonState = (index: number, len: number) => {\n isStart = index <= 0\n isEnd = index >= len - 1\n backBtn.style.cursor = isStart ? 'not-allowed' : 'pointer'\n backBtn.style.opacity = isStart ? DISABLED_OPACITY : ENABLED_OPACITY\n forwardBtn.style.cursor = isEnd ? 'not-allowed' : 'pointer'\n forwardBtn.style.opacity = isEnd ? DISABLED_OPACITY : ENABLED_OPACITY\n }\n\n blot.mindMap.on('back_forward', (index: number, len: number) => {\n updateButtonState(index, len)\n })\n controlPanel.append(zoomOutBtn, zoomInBtn, resetBtn, screenTypeBtn, backBtn, forwardBtn)\n blot.domNode.appendChild(controlPanel)\n controlRightUpPanel.append(panelStatusBtn)\n blot.domNode.appendChild(controlRightUpPanel)\n controlLeftUpPanel.append(insertChildNode, insertNode, insertParentNode, removeNode, insertIconBtn, setLayoutBtn)\n blot.domNode.appendChild(controlLeftUpPanel)\n}\n\nfunction createControlItem(iconClass: string, title: string, onClick?: () => void, disabled = false) {\n const controlItem = document.createElement('div')\n controlItem.className = 'ql-mind-map-control-item'\n controlItem.title = title\n controlItem.dataset.controlType = iconClass\n controlItem.style.cursor = disabled ? 'not-allowed' : 'pointer'\n controlItem.style.opacity = disabled ? DISABLED_OPACITY : ENABLED_OPACITY\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 'insert-child-node': insertChildNodeIcon,\n 'insert-node': insertNodeIcon,\n 'insert-parent-node': insertParentNodeIcon,\n 'remove-node': removeNodeIcon,\n 'insert-icon': insertIconIcon,\n 'set-layout-icon': setLayoutIcon,\n 'screen-type': screenTypeIcon,\n 'panel-status': contractIcon,\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 handleInsertChildNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_CHILD_NODE')\n}\n\nfunction handleInsertNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_NODE')\n}\n\nfunction handleInsertParentNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('INSERT_PARENT_NODE')\n}\n\nfunction handleRemoveNode(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.execCommand('REMOVE_CURRENT_NODE')\n}\n\nfunction handleZoomIn(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.enlarge(cx, cy, false)\n blot.zoomCount++\n }\n}\n\nfunction handleZoomOut(blot: MindMapPlaceholderBlot): void {\n if (blot.mindMap && blot.mindMap.view) {\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const cx = containerRect.width / 2\n const cy = containerRect.height / 2\n blot.mindMap.view.narrow(cx, cy, false)\n blot.zoomCount--\n }\n}\n\nfunction handleResetZoom(blot: MindMapPlaceholderBlot): void {\n blot.mindMap.renderer.setRootNodeCenter()\n if (!blot.mindMap || !blot.mindMap.view || blot.zoomCount === 0) return\n const containerRect = blot.mindMap.el.getBoundingClientRect()\n const centerX = containerRect.width / 2\n const centerY = containerRect.height / 2\n const operationCount = Math.abs(blot.zoomCount)\n const isEnlarge = blot.zoomCount < 0\n for (let i = 0; i < operationCount; i++) {\n if (isEnlarge) {\n blot.mindMap.view.enlarge(centerX, centerY, false)\n }\n else {\n blot.mindMap.view.narrow(centerX, centerY, false)\n }\n }\n blot.zoomCount = 0\n}\n\nfunction handleInsertIcon(blot: MindMapPlaceholderBlot, selectedNodes: any[]): void {\n (blot as any).selectedNodes = selectedNodes\n const heightStr = blot.domNode.getAttribute('height') || '500px'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n let iconList = []\n const { deps } = getAllConfigs(blot.quill)\n iconList = deps.nodeIconList.nodeIconList ? deps.nodeIconList.nodeIconList : deps.nodeIconList\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let iconPanel = leftUpControl.querySelector('.ql-mind-map-icon-panel') as HTMLElement\n if (!iconPanel) {\n iconPanel = document.createElement('div')\n iconPanel.className = 'ql-mind-map-icon-panel'\n iconList?.forEach((group) => {\n const groupContainer = document.createElement('div')\n groupContainer.className = 'ql-mind-map-icon-group-container'\n\n group.list.forEach((icon: { icon: string, name: string }) => {\n const iconItem = document.createElement('div')\n iconItem.className = 'ql-mind-map-icon-item'\n iconItem.innerHTML = icon.icon\n\n iconItem.addEventListener('click', () => {\n const currentSelectedNodes = (blot as any).selectedNodes || []\n if (currentSelectedNodes.length > 0) {\n const node = currentSelectedNodes[0]\n\n if (node.getData('icon') && node.getData('icon')[0] === `${group.type}_${icon.name}`) {\n node.setIcon([])\n }\n else {\n node.setIcon([`${group.type}_${icon.name}`])\n }\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n }\n iconPanel.style.display = 'none'\n })\n groupContainer.appendChild(iconItem)\n })\n iconPanel.appendChild(groupContainer)\n })\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n leftUpControl.appendChild(iconPanel)\n }\n else {\n if (height < 395) {\n iconPanel.style.height = `${height - 130}px`\n }\n else {\n iconPanel.style.height = '270px'\n }\n iconPanel.style.display = 'block'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let insertIconBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n controlItems.forEach((item) => {\n if ((item as HTMLElement).dataset.controlType === 'insert-icon') {\n insertIconBtn = item as HTMLElement\n }\n })\n\n if (!iconPanel.contains(e.target as Node) && (!insertIconBtn || !insertIconBtn.contains(e.target as Node))) {\n iconPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleSetLayoutBtn(blot: MindMapPlaceholderBlot): void {\n const handler = controlPanelHandlers.get(blot)\n const leftUpControl = blot.domNode.querySelector('.ql-mind-map-left-up-control') as HTMLElement\n let layoutPanel = leftUpControl.querySelector('.ql-mind-map-layout-panel') as HTMLElement\n const heightStr = blot.domNode.getAttribute('height') || '500'\n const height = Number.parseInt(heightStr.replace(/[^\\d.]/g, ''), 10) || 500\n\n if (!layoutPanel) {\n layoutPanel = document.createElement('div')\n layoutPanel.className = 'ql-mind-map-layout-panel'\n\n const layouts = [\n {\n name: 'logicalStructure',\n displayName: handler?.getText('logicalStructureLayout'),\n icon: logicalStructureIcon,\n },\n {\n name: 'catalogOrganization',\n displayName: handler?.getText('catalogOrganizationLayout'),\n icon: catalogOrganizationIcon,\n },\n {\n name: 'mindMap',\n displayName: handler?.getText('mindMapLayout'),\n icon: mindMapIcon,\n },\n {\n name: 'organizationStructure',\n displayName: handler?.getText('organizationStructureLayout'),\n icon: organizationStructureIcon,\n },\n {\n name: 'timeline',\n displayName: handler?.getText('timelineLayout'),\n icon: timelineIcon,\n },\n {\n name: 'fishbone',\n displayName: handler?.getText('fishboneLayout'),\n icon: fishboneIcon,\n },\n ]\n\n layouts.forEach((layout) => {\n const layoutItem = document.createElement('div')\n layoutItem.className = 'ql-mind-map-layout-item'\n\n const iconContainer = document.createElement('div')\n iconContainer.className = 'ql-mind-map-layout-icon-container'\n\n const img = document.createElement('div')\n img.className = 'ql-mind-map-layout-icon'\n img.innerHTML = layout.icon\n img.style.display = 'flex'\n img.style.alignItems = 'center'\n img.style.justifyContent = 'center'\n const svgElement = img.querySelector('svg')\n\n svgElement.style.maxWidth = '100%'\n svgElement.style.maxHeight = '100%'\n svgElement.style.width = 'auto'\n svgElement.style.height = 'auto'\n svgElement.removeAttribute('width')\n svgElement.removeAttribute('height')\n\n iconContainer.appendChild(img)\n\n const nameText = document.createElement('div')\n nameText.className = 'ql-mind-map-layout-name'\n nameText.textContent = layout.displayName\n\n layoutItem.appendChild(iconContainer)\n layoutItem.appendChild(nameText)\n layoutItem.addEventListener('click', () => {\n blot.mindMap.setLayout(layout.name)\n blot.data = blot.mindMap.getData({})\n blot.domNode.setAttribute('data-mind-map', JSON.stringify(blot.data))\n layoutPanel.style.display = 'none'\n })\n layoutPanel.appendChild(layoutItem)\n })\n leftUpControl.appendChild(layoutPanel)\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n }\n else {\n if (height < 395) {\n layoutPanel.style.height = `${height - 130}px`\n }\n else {\n layoutPanel.style.height = '270px'\n }\n layoutPanel.style.display = 'flex'\n }\n\n const handleOutsideClick = (e: MouseEvent) => {\n let setLayoutBtn: HTMLElement | null = null\n const controlItems = leftUpControl.querySelectorAll('.ql-mind-map-control-item')\n\n setLayoutBtn = Array.from(controlItems).find(item => item.getAttribute('data-control-type') === 'set-layout-icon') as HTMLElement | null\n\n if (!layoutPanel.contains(e.target as Node) && (!setLayoutBtn || !setLayoutBtn.contains(e.target as Node))) {\n layoutPanel.style.display = 'none'\n document.removeEventListener('click', handleOutsideClick)\n }\n }\n document.removeEventListener('click', handleOutsideClick)\n document.addEventListener('click', handleOutsideClick)\n}\n\nfunction handleScreenTypeBtn(blot: MindMapPlaceholderBlot): void {\n const screenTypeBtn = blot.domNode.querySelector('[data-control-type=\"screen-type\"]') as HTMLElement | null\n if (!screenTypeBtn || !blot.domNode) return\n\n const mindMapContainer = blot.domNode\n const isFullscreen = mindMapContainer.style.position === 'fixed'\n\n if (isFullscreen) {\n const originalPosition = mindMapContainer.getAttribute('data-original-position')\n const originalWidth = mindMapContainer.getAttribute('data-original-width')\n const originalHeight = mindMapContainer.getAttribute('data-original-height')\n if (originalWidth && originalHeight) {\n mindMapContainer.style.position = originalPosition\n mindMapContainer.style.width = originalWidth\n mindMapContainer.style.height = originalHeight\n mindMapContainer.style.zIndex = '0'\n }\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenTypeIcon\n }\n }\n else {\n mindMapContainer.setAttribute('data-original-position', mindMapContainer.style.position || '')\n mindMapContainer.setAttribute('data-original-width', mindMapContainer.style.width || '')\n mindMapContainer.setAttribute('data-original-height', mindMapContainer.style.height || '')\n mindMapContainer.style.position = 'fixed'\n mindMapContainer.style.top = '0'\n mindMapContainer.style.left = '0'\n mindMapContainer.style.width = '100vw'\n mindMapContainer.style.height = '100vh'\n mindMapContainer.style.zIndex = '100'\n const iconElement = screenTypeBtn.querySelector('i')\n if (iconElement) {\n iconElement.innerHTML = screenReduceIcon\n }\n }\n blot.mindMap.renderer.setRootNodeCenter()\n blot.mindMap.resize()\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"custom-resize-action.es.js","sources":["../../../../../src/modules/mind-map/modules/custom-resize-action.ts"],"sourcesContent":["const MIN_WIDTH = 350\r\nconst MIN_HEIGHT = 290\r\nconst HEIGHT_THRESHOLD = 395\r\nconst PANEL_HEIGHT_OFFSET = 130\r\n\r\nexport class MindMapResizeAction {\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-mind-map-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 updateDependentElementsHeight(newHeight: number) {\r\n const iconPanel = this.blot.domNode.querySelector('.ql-mind-map-icon-panel') as HTMLElement\r\n const layoutPanel = this.blot.domNode.querySelector('.ql-mind-map-layout-panel') as HTMLElement\r\n if (iconPanel && newHeight < HEIGHT_THRESHOLD) {\r\n iconPanel.style.height = `${newHeight - PANEL_HEIGHT_OFFSET}px`\r\n }\r\n if (layoutPanel && newHeight < HEIGHT_THRESHOLD) {\r\n layoutPanel.style.height = `${newHeight - PANEL_HEIGHT_OFFSET}px`\r\n }\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 this.updateDependentElementsHeight(newHeight)\r\n if (this.blot.mindMap) {\r\n this.blot.mindMap.resize(newWidth, newHeight)\r\n }\r\n\r\n container.setAttribute('data-mind-map', 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
+ {"version":3,"file":"custom-resize-action.es.js","sources":["../../../../../src/modules/mind-map/modules/custom-resize-action.ts"],"sourcesContent":["const MIN_WIDTH = 350\nconst MIN_HEIGHT = 290\nconst HEIGHT_THRESHOLD = 395\nconst PANEL_HEIGHT_OFFSET = 130\n\nexport class MindMapResizeAction {\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-mind-map-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 updateDependentElementsHeight(newHeight: number) {\n const iconPanel = this.blot.domNode.querySelector('.ql-mind-map-icon-panel') as HTMLElement\n const layoutPanel = this.blot.domNode.querySelector('.ql-mind-map-layout-panel') as HTMLElement\n if (iconPanel && newHeight < HEIGHT_THRESHOLD) {\n iconPanel.style.height = `${newHeight - PANEL_HEIGHT_OFFSET}px`\n }\n if (layoutPanel && newHeight < HEIGHT_THRESHOLD) {\n layoutPanel.style.height = `${newHeight - PANEL_HEIGHT_OFFSET}px`\n }\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 this.updateDependentElementsHeight(newHeight)\n if (this.blot.mindMap) {\n this.blot.mindMap.resize(newWidth, newHeight)\n }\n\n container.setAttribute('data-mind-map', 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":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"syntax.es.js","sources":["../../../src/modules/syntax.ts"],"sourcesContent":["import type TypeSyntax from 'quill/modules/syntax'\r\nimport Quill from 'quill'\r\n\r\nconst Syntax = Quill.import('modules/syntax') as typeof TypeSyntax\r\n\r\n// @dynamic\r\nclass CustomSyntax extends Syntax {\r\n static DEFAULTS: { hljs: any, interval: number, languages: { key: string, label: string }[] }\r\n}\r\n\r\nCustomSyntax.DEFAULTS = {\r\n hljs: (() => {\r\n // @ts-ignore\r\n return window.hljs\r\n })(),\r\n interval: 1000,\r\n languages: [\r\n { key: 'plain', label: 'Plain' },\r\n { key: 'bash', label: 'Bash' },\r\n { key: 'cpp', label: 'C++' },\r\n { key: 'cs', label: 'C#' },\r\n { key: 'css', label: 'CSS' },\r\n { key: 'diff', label: 'Diff' },\r\n { key: 'xml', label: 'HTML/XML' },\r\n { key: 'java', label: 'Java' },\r\n { key: 'javascript', label: 'Javascript' },\r\n { key: 'markdown', label: 'Markdown' },\r\n { key: 'php', label: 'PHP' },\r\n { key: 'python', label: 'Python' },\r\n { key: 'ruby', label: 'Ruby' },\r\n { key: 'sql', label: 'SQL' },\r\n ],\r\n}\r\n\r\nexport default CustomSyntax\r\n"],"names":[],"mappings":";;;;AAGA,MAAM,SAAS,MAAM,OAAO,gBAAgB;AAG5C,MAAM,qBAAqB,OAAO;AAElC;AADE,cADI,cACG;AAGT,aAAa,WAAW;AAAA,EACtB,OAAO,MAAM;AAEX,WAAO,OAAO;AAAA,EAChB,GAAA;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,IACT,EAAE,KAAK,SAAS,OAAO,QAAA;AAAA,IACvB,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,IACtB,EAAE,KAAK,OAAO,OAAO,MAAA;AAAA,IACrB,EAAE,KAAK,MAAM,OAAO,KAAA;AAAA,IACpB,EAAE,KAAK,OAAO,OAAO,MAAA;AAAA,IACrB,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,IACtB,EAAE,KAAK,OAAO,OAAO,WAAA;AAAA,IACrB,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,IACtB,EAAE,KAAK,cAAc,OAAO,aAAA;AAAA,IAC5B,EAAE,KAAK,YAAY,OAAO,WAAA;AAAA,IAC1B,EAAE,KAAK,OAAO,OAAO,MAAA;AAAA,IACrB,EAAE,KAAK,UAAU,OAAO,SAAA;AAAA,IACxB,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,IACtB,EAAE,KAAK,OAAO,OAAO,MAAA;AAAA,EAAM;AAE/B;"}
1
+ {"version":3,"file":"syntax.es.js","sources":["../../../src/modules/syntax.ts"],"sourcesContent":["import type TypeSyntax from 'quill/modules/syntax'\nimport Quill from 'quill'\n\nconst Syntax = Quill.import('modules/syntax') as typeof TypeSyntax\n\n// @dynamic\nclass CustomSyntax extends Syntax {\n static DEFAULTS: { hljs: any, interval: number, languages: { key: string, label: string }[] }\n}\n\nCustomSyntax.DEFAULTS = {\n hljs: (() => {\n // @ts-ignore\n return window.hljs\n })(),\n interval: 1000,\n languages: [\n { key: 'plain', label: 'Plain' },\n { key: 'bash', label: 'Bash' },\n { key: 'cpp', label: 'C++' },\n { key: 'cs', label: 'C#' },\n { key: 'css', label: 'CSS' },\n { key: 'diff', label: 'Diff' },\n { key: 'xml', label: 'HTML/XML' },\n { key: 'java', label: 'Java' },\n { key: 'javascript', label: 'Javascript' },\n { key: 'markdown', label: 'Markdown' },\n { key: 'php', label: 'PHP' },\n { key: 'python', label: 'Python' },\n { key: 'ruby', label: 'Ruby' },\n { key: 'sql', label: 'SQL' },\n ],\n}\n\nexport default CustomSyntax\n"],"names":[],"mappings":";;;;AAGA,MAAM,SAAS,MAAM,OAAO,gBAAgB;AAG5C,MAAM,qBAAqB,OAAO;AAElC;AADE,cADI,cACG;AAGT,aAAa,WAAW;AAAA,EACtB,OAAO,MAAM;AAEX,WAAO,OAAO;AAAA,EAChB,GAAA;AAAA,EACA,UAAU;AAAA,EACV,WAAW;AAAA,IACT,EAAE,KAAK,SAAS,OAAO,QAAA;AAAA,IACvB,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,IACtB,EAAE,KAAK,OAAO,OAAO,MAAA;AAAA,IACrB,EAAE,KAAK,MAAM,OAAO,KAAA;AAAA,IACpB,EAAE,KAAK,OAAO,OAAO,MAAA;AAAA,IACrB,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,IACtB,EAAE,KAAK,OAAO,OAAO,WAAA;AAAA,IACrB,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,IACtB,EAAE,KAAK,cAAc,OAAO,aAAA;AAAA,IAC5B,EAAE,KAAK,YAAY,OAAO,WAAA;AAAA,IAC1B,EAAE,KAAK,OAAO,OAAO,MAAA;AAAA,IACrB,EAAE,KAAK,UAAU,OAAO,SAAA;AAAA,IACxB,EAAE,KAAK,QAAQ,OAAO,OAAA;AAAA,IACtB,EAAE,KAAK,OAAO,OAAO,MAAA;AAAA,EAAM;AAE/B;"}
@@ -1 +1 @@
1
- {"version":3,"file":"better-picker.es.js","sources":["../../../../src/modules/toolbar/better-picker.ts"],"sourcesContent":["import type TypePicker from 'quill/ui/picker'\r\nimport { EasyColorPicker } from 'quill-easy-color'\r\nimport FluentEditor from '../../core/fluent-editor'\r\n\r\nconst OriginPicker = FluentEditor.import('ui/picker') as typeof TypePicker\r\nexport class Picker extends OriginPicker {\r\n buildLabel() {\r\n const label = document.createElement('span')\r\n label.classList.add('ql-picker-label')\r\n label.innerHTML = `<i class=\"icon\" />`\r\n label.tabIndex = 0\r\n label.setAttribute('role', 'button')\r\n label.setAttribute('aria-expanded', 'false')\r\n this.container.appendChild(label)\r\n return label\r\n }\r\n\r\n buildItem(option: HTMLOptionElement) {\r\n const item = super.buildItem(option)\r\n const value = option.getAttribute('value')\r\n item.style.setProperty('--value', value)\r\n return item\r\n }\r\n\r\n selectItem(item: HTMLElement | null, trigger = false) {\r\n const selected = this.container.querySelector('.ql-selected')\r\n if (item === selected || item == null) return\r\n // move ql-selected clear after judge.\r\n // ql-selected is the class for check mark in picker\r\n if (selected != null) {\r\n selected.classList.remove('ql-selected')\r\n }\r\n item.classList.add('ql-selected')\r\n this.select.selectedIndex = Array.from(item.parentNode.children).indexOf(item)\r\n if (item.hasAttribute('data-value')) {\r\n this.label.setAttribute('data-value', item.getAttribute('data-value'))\r\n }\r\n else {\r\n this.label.removeAttribute('data-value')\r\n }\r\n if (item.hasAttribute('data-label')) {\r\n this.label.setAttribute('data-label', item.getAttribute('data-label'))\r\n }\r\n else {\r\n this.label.removeAttribute('data-label')\r\n }\r\n if (trigger) {\r\n this.select.dispatchEvent(new Event('change'))\r\n this.close()\r\n }\r\n }\r\n}\r\n\r\nexport class ColorPicker extends EasyColorPicker {\r\n static clearText: string\r\n static customText: string\r\n\r\n constructor(select: HTMLSelectElement, label: string, options: any) {\r\n super(select, label, options)\r\n }\r\n\r\n buildItem(option: HTMLOptionElement) {\r\n const item = super.buildItem(option)\r\n item.setAttribute('title', option.getAttribute('value'))\r\n return item\r\n }\r\n}\r\n"],"names":[],"mappings":";;;;;AAIA,MAAM,eAAe,aAAa,OAAO,WAAW;AAC7C,MAAM,eAAe,aAAa;AAAA,EACvC,aAAa;AACX,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,UAAU,IAAI,iBAAiB;AACrC,UAAM,YAAY;AAClB,UAAM,WAAW;AACjB,UAAM,aAAa,QAAQ,QAAQ;AACnC,UAAM,aAAa,iBAAiB,OAAO;AAC3C,SAAK,UAAU,YAAY,KAAK;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,QAA2B;AACnC,UAAM,OAAO,MAAM,UAAU,MAAM;AACnC,UAAM,QAAQ,OAAO,aAAa,OAAO;AACzC,SAAK,MAAM,YAAY,WAAW,KAAK;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,MAA0B,UAAU,OAAO;AACpD,UAAM,WAAW,KAAK,UAAU,cAAc,cAAc;AAC5D,QAAI,SAAS,YAAY,QAAQ,KAAM;AAGvC,QAAI,YAAY,MAAM;AACpB,eAAS,UAAU,OAAO,aAAa;AAAA,IACzC;AACA,SAAK,UAAU,IAAI,aAAa;AAChC,SAAK,OAAO,gBAAgB,MAAM,KAAK,KAAK,WAAW,QAAQ,EAAE,QAAQ,IAAI;AAC7E,QAAI,KAAK,aAAa,YAAY,GAAG;AACnC,WAAK,MAAM,aAAa,cAAc,KAAK,aAAa,YAAY,CAAC;AAAA,IACvE,OACK;AACH,WAAK,MAAM,gBAAgB,YAAY;AAAA,IACzC;AACA,QAAI,KAAK,aAAa,YAAY,GAAG;AACnC,WAAK,MAAM,aAAa,cAAc,KAAK,aAAa,YAAY,CAAC;AAAA,IACvE,OACK;AACH,WAAK,MAAM,gBAAgB,YAAY;AAAA,IACzC;AACA,QAAI,SAAS;AACX,WAAK,OAAO,cAAc,IAAI,MAAM,QAAQ,CAAC;AAC7C,WAAK,MAAA;AAAA,IACP;AAAA,EACF;AACF;AAEO,MAAM,oBAAoB,gBAAgB;AAAA,EAI/C,YAAY,QAA2B,OAAe,SAAc;AAClE,UAAM,QAAQ,OAAO,OAAO;AAAA,EAC9B;AAAA,EAEA,UAAU,QAA2B;AACnC,UAAM,OAAO,MAAM,UAAU,MAAM;AACnC,SAAK,aAAa,SAAS,OAAO,aAAa,OAAO,CAAC;AACvD,WAAO;AAAA,EACT;AACF;AAZE,cADW,aACJ;AACP,cAFW,aAEJ;"}
1
+ {"version":3,"file":"better-picker.es.js","sources":["../../../../src/modules/toolbar/better-picker.ts"],"sourcesContent":["import type TypePicker from 'quill/ui/picker'\nimport { EasyColorPicker } from 'quill-easy-color'\nimport FluentEditor from '../../core/fluent-editor'\n\nconst OriginPicker = FluentEditor.import('ui/picker') as typeof TypePicker\nexport class Picker extends OriginPicker {\n buildLabel() {\n const label = document.createElement('span')\n label.classList.add('ql-picker-label')\n label.innerHTML = `<i class=\"icon\" />`\n label.tabIndex = 0\n label.setAttribute('role', 'button')\n label.setAttribute('aria-expanded', 'false')\n this.container.appendChild(label)\n return label\n }\n\n buildItem(option: HTMLOptionElement) {\n const item = super.buildItem(option)\n const value = option.getAttribute('value')\n item.style.setProperty('--value', value)\n return item\n }\n\n selectItem(item: HTMLElement | null, trigger = false) {\n const selected = this.container.querySelector('.ql-selected')\n if (item === selected || item == null) return\n // move ql-selected clear after judge.\n // ql-selected is the class for check mark in picker\n if (selected != null) {\n selected.classList.remove('ql-selected')\n }\n item.classList.add('ql-selected')\n this.select.selectedIndex = Array.from(item.parentNode.children).indexOf(item)\n if (item.hasAttribute('data-value')) {\n this.label.setAttribute('data-value', item.getAttribute('data-value'))\n }\n else {\n this.label.removeAttribute('data-value')\n }\n if (item.hasAttribute('data-label')) {\n this.label.setAttribute('data-label', item.getAttribute('data-label'))\n }\n else {\n this.label.removeAttribute('data-label')\n }\n if (trigger) {\n this.select.dispatchEvent(new Event('change'))\n this.close()\n }\n }\n}\n\nexport class ColorPicker extends EasyColorPicker {\n static clearText: string\n static customText: string\n\n constructor(select: HTMLSelectElement, label: string, options: any) {\n super(select, label, options)\n }\n\n buildItem(option: HTMLOptionElement) {\n const item = super.buildItem(option)\n item.setAttribute('title', option.getAttribute('value'))\n return item\n }\n}\n"],"names":[],"mappings":";;;;;AAIA,MAAM,eAAe,aAAa,OAAO,WAAW;AAC7C,MAAM,eAAe,aAAa;AAAA,EACvC,aAAa;AACX,UAAM,QAAQ,SAAS,cAAc,MAAM;AAC3C,UAAM,UAAU,IAAI,iBAAiB;AACrC,UAAM,YAAY;AAClB,UAAM,WAAW;AACjB,UAAM,aAAa,QAAQ,QAAQ;AACnC,UAAM,aAAa,iBAAiB,OAAO;AAC3C,SAAK,UAAU,YAAY,KAAK;AAChC,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,QAA2B;AACnC,UAAM,OAAO,MAAM,UAAU,MAAM;AACnC,UAAM,QAAQ,OAAO,aAAa,OAAO;AACzC,SAAK,MAAM,YAAY,WAAW,KAAK;AACvC,WAAO;AAAA,EACT;AAAA,EAEA,WAAW,MAA0B,UAAU,OAAO;AACpD,UAAM,WAAW,KAAK,UAAU,cAAc,cAAc;AAC5D,QAAI,SAAS,YAAY,QAAQ,KAAM;AAGvC,QAAI,YAAY,MAAM;AACpB,eAAS,UAAU,OAAO,aAAa;AAAA,IACzC;AACA,SAAK,UAAU,IAAI,aAAa;AAChC,SAAK,OAAO,gBAAgB,MAAM,KAAK,KAAK,WAAW,QAAQ,EAAE,QAAQ,IAAI;AAC7E,QAAI,KAAK,aAAa,YAAY,GAAG;AACnC,WAAK,MAAM,aAAa,cAAc,KAAK,aAAa,YAAY,CAAC;AAAA,IACvE,OACK;AACH,WAAK,MAAM,gBAAgB,YAAY;AAAA,IACzC;AACA,QAAI,KAAK,aAAa,YAAY,GAAG;AACnC,WAAK,MAAM,aAAa,cAAc,KAAK,aAAa,YAAY,CAAC;AAAA,IACvE,OACK;AACH,WAAK,MAAM,gBAAgB,YAAY;AAAA,IACzC;AACA,QAAI,SAAS;AACX,WAAK,OAAO,cAAc,IAAI,MAAM,QAAQ,CAAC;AAC7C,WAAK,MAAA;AAAA,IACP;AAAA,EACF;AACF;AAEO,MAAM,oBAAoB,gBAAgB;AAAA,EAI/C,YAAY,QAA2B,OAAe,SAAc;AAClE,UAAM,QAAQ,OAAO,OAAO;AAAA,EAC9B;AAAA,EAEA,UAAU,QAA2B;AACnC,UAAM,OAAO,MAAM,UAAU,MAAM;AACnC,SAAK,aAAa,SAAS,OAAO,aAAa,OAAO,CAAC;AACvD,WAAO;AAAA,EACT;AACF;AAZE,cADW,aACJ;AACP,cAFW,aAEJ;"}
@@ -1 +1 @@
1
- {"version":3,"file":"snow.es.js","sources":["../../../src/themes/snow.ts"],"sourcesContent":["import type { ThemeOptions } from 'quill/core/theme'\r\nimport type TypeToolbar from 'quill/modules/toolbar'\r\nimport type TypeIconPicker from 'quill/ui/icon-picker'\r\nimport { CHANGE_LANGUAGE_EVENT, inputFile, isNullOrUndefined } from '../config'\r\nimport FluentEditor from '../core/fluent-editor'\r\nimport { CustomImageSpec } from '../modules/custom-image/specs/custom-image-spec'\r\nimport { LinkTooltip } from '../modules/link'\r\nimport { shortKey } from '../modules/shortcut-key'\r\nimport { ColorPicker, Picker } from '../modules/toolbar/better-picker'\r\nimport { FormatPainter } from '../tools/format-painter'\r\nimport { fullscreenHandler } from '../tools/fullscreen'\r\nimport { Screenshot } from '../tools/screenshot'\r\n\r\nconst OriginSnowTheme = FluentEditor.import('themes/snow') as any\r\nconst IconPicker = FluentEditor.import('ui/icon-picker') as typeof TypeIconPicker\r\n\r\nOriginSnowTheme.DEFAULTS = {\r\n modules: {\r\n 'i18n': true,\r\n 'keyboard': {\r\n bindings: {\r\n ...shortKey,\r\n },\r\n },\r\n 'toolbar': {\r\n handlers: {\r\n ...(OriginSnowTheme.DEFAULTS as Record<string, any>).modules.toolbar.handlers,\r\n 'formula': function () {\r\n if (!this.quill.isEnabled()) return\r\n const mathlive = this.quill.getModule('mathlive')\r\n if (!mathlive) {\r\n this.quill.theme.tooltip.edit('formula')\r\n }\r\n else {\r\n mathlive.createDialog()\r\n }\r\n },\r\n 'undo': function () {\r\n this.quill.history.undo()\r\n },\r\n 'redo': function () {\r\n this.quill.history.redo()\r\n },\r\n 'file': function () {\r\n const accept = this.quill.uploader.options.mimetypes\r\n inputFile.call(this, 'file', accept)\r\n },\r\n 'image': function () {\r\n const accept = (this.quill as FluentEditor).uploader.options.mimetypes.filter((type) => {\r\n if (type === '*') return 'image/*'\r\n return type.startsWith('image/')\r\n })\r\n inputFile.call(this, 'image', accept)\r\n },\r\n 'video': function () {\r\n const accept = (this.quill as FluentEditor).uploader.options.mimetypes.filter((type) => {\r\n if (type === '*') return 'video/*'\r\n return type.startsWith('video/')\r\n })\r\n inputFile.call(this, 'video', accept)\r\n },\r\n 'ai': function () {},\r\n 'emoji': function () {},\r\n 'fullscreen': fullscreenHandler,\r\n [FormatPainter.toolName]: FormatPainter,\r\n [Screenshot.toolName]: Screenshot,\r\n 'line-height': function (value) {\r\n this.quill.format('line-height', value)\r\n },\r\n 'divider': function () {\r\n const range = this.quill.getSelection(true)\r\n this.quill.insertText(range.index, '\\n', FluentEditor.sources.USER)\r\n this.quill.insertEmbed(range.index + 1, 'divider', true, FluentEditor.sources.USER)\r\n this.quill.setSelection(range.index + 2, FluentEditor.sources.SILENT)\r\n },\r\n },\r\n },\r\n 'image': {\r\n specs: [CustomImageSpec],\r\n overlay: {\r\n style: {\r\n border: '1px dashed rgb(68, 68, 68)',\r\n },\r\n },\r\n },\r\n 'shortcut-key': true,\r\n 'file': true,\r\n },\r\n}\r\n\r\nconst ALIGNS = [false, 'center', 'right']\r\nconst COLORS = [\r\n '',\r\n 'rgb(255, 255, 255)',\r\n 'rgb(0, 0, 0)',\r\n 'rgb(72, 83, 104)',\r\n 'rgb(41, 114, 244)',\r\n 'rgb(0, 163, 245)',\r\n 'rgb(49, 155, 98)',\r\n 'rgb(222, 60, 54)',\r\n 'rgb(248, 136, 37)',\r\n 'rgb(245, 196, 0)',\r\n 'rgb(153, 56, 215)',\r\n\r\n 'rgb(242, 242, 242)',\r\n 'rgb(127, 127, 127)',\r\n 'rgb(243, 245, 247)',\r\n 'rgb(229, 239, 255)',\r\n 'rgb(229, 246, 255)',\r\n 'rgb(234, 250, 241)',\r\n 'rgb(254, 233, 232)',\r\n 'rgb(254, 243, 235)',\r\n 'rgb(254, 249, 227)',\r\n 'rgb(253, 235, 255)',\r\n\r\n 'rgb(216, 216, 216)',\r\n 'rgb(89, 89, 89)',\r\n 'rgb(197, 202, 211)',\r\n 'rgb(199, 220, 255)',\r\n 'rgb(199, 236, 255)',\r\n 'rgb(195, 234, 213)',\r\n 'rgb(255, 201, 199)',\r\n 'rgb(255, 220, 196)',\r\n 'rgb(255, 238, 173)',\r\n 'rgb(242, 199, 255)',\r\n\r\n 'rgb(191, 191, 191)',\r\n 'rgb(63, 63, 63)',\r\n 'rgb(128, 139, 158)',\r\n 'rgb(153, 190, 255)',\r\n 'rgb(153, 221, 255)',\r\n 'rgb(152, 215, 182)',\r\n 'rgb(255, 156, 153)',\r\n 'rgb(255, 186, 132)',\r\n 'rgb(255, 226, 112)',\r\n 'rgb(213, 142, 255)',\r\n\r\n 'rgb(165, 165, 165)',\r\n 'rgb(38, 38, 38)',\r\n 'rgb(53, 59, 69)',\r\n 'rgb(20, 80, 184)',\r\n 'rgb(18, 116, 165)',\r\n 'rgb(39, 124, 79)',\r\n 'rgb(158, 30, 26)',\r\n 'rgb(184, 96, 20)',\r\n 'rgb(163, 130, 0)',\r\n 'rgb(94, 34, 129)',\r\n\r\n 'rgb(147, 147, 147)',\r\n 'rgb(13, 13, 13)',\r\n 'rgb(36, 39, 46)',\r\n 'rgb(12, 48, 110)',\r\n 'rgb(10, 65, 92)',\r\n 'rgb(24, 78, 50)',\r\n 'rgb(88, 17, 14)',\r\n 'rgb(92, 48, 10)',\r\n 'rgb(102, 82, 0)',\r\n 'rgb(59, 21, 81)',\r\n\r\n 'custom',\r\n]\r\nconst FONTS = [false, 'serif', 'monospace']\r\nconst HEADERS = ['1', '2', '3', false]\r\nconst SIZES = ['small', false, 'large', 'huge']\r\nconst LINEHEIGHT = [false, '1.2', '1.5', '2']\r\n\r\nclass SnowTheme extends OriginSnowTheme {\r\n constructor(public quill: FluentEditor, options: ThemeOptions) {\r\n super(quill, options)\r\n\r\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, () => {\r\n this.i18nTextToolbar()\r\n })\r\n }\r\n\r\n i18nTextToolbar() {\r\n const toolbar = this.quill.getModule('toolbar') as TypeToolbar\r\n ColorPicker.clearText = this.quill.getLangText('clear-color')\r\n ColorPicker.customText = this.quill.getLangText('custom-color')\r\n\r\n if (!toolbar || !this.pickers) return\r\n\r\n this.pickers.forEach((picker) => {\r\n if (picker instanceof ColorPicker) {\r\n // EasyColorPicker have not dts. abd origin quill ColorPicker dts not complete. use any to resovle ts type error\r\n const colorPicker = picker as any\r\n colorPicker.options.remove()\r\n Array.from(colorPicker.select.options).forEach((option: any) => {\r\n if (option.hasAttribute('custom')) {\r\n option.remove()\r\n }\r\n })\r\n colorPicker.buildOptions()\r\n colorPicker.createUsedColor()\r\n }\r\n\r\n if (picker.select && picker.select.classList.contains('ql-header')) {\r\n const getLabelKey = (v: string | null) => (v ? `header-${v}` : 'header-normal')\r\n\r\n // 更新 label 文本\r\n const labelValue = picker.label.getAttribute('data-value')\r\n picker.label.setAttribute('data-label', this.quill.getLangText(getLabelKey(labelValue)))\r\n\r\n const select = picker.select as HTMLSelectElement\r\n Array.from(select.options).forEach((option) => {\r\n const value = option.getAttribute('value')\r\n option.textContent = this.quill.getLangText(getLabelKey(value))\r\n })\r\n\r\n picker.options.remove()\r\n picker.buildOptions()\r\n }\r\n })\r\n }\r\n\r\n buildPickers(selects: NodeListOf<HTMLSelectElement>, icons: Record<string, string | Record<string, string>>) {\r\n this.pickers = Array.from(selects).map((select) => {\r\n if (select.classList.contains('ql-align')) {\r\n if (isNullOrUndefined(select.querySelector('option'))) {\r\n fillSelect(select, ALIGNS)\r\n }\r\n return new IconPicker(select, icons.align as Record<string, string>)\r\n }\r\n\r\n if (select.classList.contains('ql-background') || select.classList.contains('ql-color')) {\r\n const format = select.classList.contains('ql-background') ? 'background' : 'color'\r\n if (isNullOrUndefined(select.querySelector('option'))) {\r\n fillColorSelect(select, COLORS, format, format === 'background' ? '#ffffff' : '#000000')\r\n }\r\n return new ColorPicker(select, icons[format] as string, {\r\n expandIcon: '<i class=\"icon\" />',\r\n closeAfterChange: false,\r\n })\r\n }\r\n\r\n if (isNullOrUndefined(select.querySelector('option'))) {\r\n if (select.classList.contains('ql-font')) {\r\n fillSelect(select, FONTS)\r\n }\r\n else if (select.classList.contains('ql-header')) {\r\n fillSelect(select, HEADERS)\r\n }\r\n else if (select.classList.contains('ql-size')) {\r\n fillSelect(select, SIZES)\r\n }\r\n else if (select.classList.contains('ql-line-height')) {\r\n fillSelect(select, LINEHEIGHT)\r\n }\r\n }\r\n return new Picker(select)\r\n })\r\n\r\n const update = () => {\r\n this.pickers.forEach((picker) => {\r\n if (picker instanceof ColorPicker) return\r\n picker.update()\r\n })\r\n }\r\n this.quill.on(FluentEditor.events.EDITOR_CHANGE, update)\r\n }\r\n\r\n extendToolbar(toolbar) {\r\n const icons = FluentEditor.import('ui/icons') as Record<string, any>\r\n toolbar.container.classList.add('ql-snow')\r\n this.buildButtons(toolbar.container.querySelectorAll('button'), icons)\r\n this.buildPickers(toolbar.container.querySelectorAll('select'), icons)\r\n this.tooltip = new LinkTooltip(this.quill, this.options.bounds)\r\n }\r\n}\r\n\r\nfunction fillSelect(select, values, defaultValue = false) {\r\n values.forEach((value) => {\r\n const option = document.createElement('option')\r\n if (value === defaultValue) {\r\n option.setAttribute('selected', 'selected')\r\n }\r\n else {\r\n option.setAttribute('value', value)\r\n }\r\n select.appendChild(option)\r\n })\r\n}\r\n\r\nfunction fillColorSelect(\r\n select: HTMLSelectElement,\r\n values: Array<string | boolean>,\r\n format: string,\r\n defaultValue: unknown = false,\r\n) {\r\n const colorGetter = document.createElement('span') as HTMLElement\r\n for (const value of values) {\r\n const option = document.createElement('option')\r\n if (value === defaultValue) {\r\n option.setAttribute('selected', 'selected')\r\n }\r\n else {\r\n if (value !== 'custom') {\r\n colorGetter.style[format] = String(value)\r\n option.setAttribute('value', colorGetter.style[format])\r\n }\r\n else {\r\n option.setAttribute('value', value)\r\n }\r\n }\r\n select.appendChild(option)\r\n }\r\n}\r\n\r\nexport default SnowTheme\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"snow.es.js","sources":["../../../src/themes/snow.ts"],"sourcesContent":["import type { ThemeOptions } from 'quill/core/theme'\nimport type TypeToolbar from 'quill/modules/toolbar'\nimport type TypeIconPicker from 'quill/ui/icon-picker'\nimport { CHANGE_LANGUAGE_EVENT, inputFile, isNullOrUndefined } from '../config'\nimport FluentEditor from '../core/fluent-editor'\nimport { CustomImageSpec } from '../modules/custom-image/specs/custom-image-spec'\nimport { LinkTooltip } from '../modules/link'\nimport { shortKey } from '../modules/shortcut-key'\nimport { ColorPicker, Picker } from '../modules/toolbar/better-picker'\nimport { FormatPainter } from '../tools/format-painter'\nimport { fullscreenHandler } from '../tools/fullscreen'\nimport { Screenshot } from '../tools/screenshot'\n\nconst OriginSnowTheme = FluentEditor.import('themes/snow') as any\nconst IconPicker = FluentEditor.import('ui/icon-picker') as typeof TypeIconPicker\n\nOriginSnowTheme.DEFAULTS = {\n modules: {\n 'i18n': true,\n 'keyboard': {\n bindings: {\n ...shortKey,\n },\n },\n 'toolbar': {\n handlers: {\n ...(OriginSnowTheme.DEFAULTS as Record<string, any>).modules.toolbar.handlers,\n 'formula': function () {\n if (!this.quill.isEnabled()) return\n const mathlive = this.quill.getModule('mathlive')\n if (!mathlive) {\n this.quill.theme.tooltip.edit('formula')\n }\n else {\n mathlive.createDialog()\n }\n },\n 'undo': function () {\n this.quill.history.undo()\n },\n 'redo': function () {\n this.quill.history.redo()\n },\n 'file': function () {\n const accept = this.quill.uploader.options.mimetypes\n inputFile.call(this, 'file', accept)\n },\n 'image': function () {\n const accept = (this.quill as FluentEditor).uploader.options.mimetypes.filter((type) => {\n if (type === '*') return 'image/*'\n return type.startsWith('image/')\n })\n inputFile.call(this, 'image', accept)\n },\n 'video': function () {\n const accept = (this.quill as FluentEditor).uploader.options.mimetypes.filter((type) => {\n if (type === '*') return 'video/*'\n return type.startsWith('video/')\n })\n inputFile.call(this, 'video', accept)\n },\n 'ai': function () {},\n 'emoji': function () {},\n 'fullscreen': fullscreenHandler,\n [FormatPainter.toolName]: FormatPainter,\n [Screenshot.toolName]: Screenshot,\n 'line-height': function (value) {\n this.quill.format('line-height', value)\n },\n 'divider': function () {\n const range = this.quill.getSelection(true)\n this.quill.insertText(range.index, '\\n', FluentEditor.sources.USER)\n this.quill.insertEmbed(range.index + 1, 'divider', true, FluentEditor.sources.USER)\n this.quill.setSelection(range.index + 2, FluentEditor.sources.SILENT)\n },\n },\n },\n 'image': {\n specs: [CustomImageSpec],\n overlay: {\n style: {\n border: '1px dashed rgb(68, 68, 68)',\n },\n },\n },\n 'shortcut-key': true,\n 'file': true,\n },\n}\n\nconst ALIGNS = [false, 'center', 'right']\nconst COLORS = [\n '',\n 'rgb(255, 255, 255)',\n 'rgb(0, 0, 0)',\n 'rgb(72, 83, 104)',\n 'rgb(41, 114, 244)',\n 'rgb(0, 163, 245)',\n 'rgb(49, 155, 98)',\n 'rgb(222, 60, 54)',\n 'rgb(248, 136, 37)',\n 'rgb(245, 196, 0)',\n 'rgb(153, 56, 215)',\n\n 'rgb(242, 242, 242)',\n 'rgb(127, 127, 127)',\n 'rgb(243, 245, 247)',\n 'rgb(229, 239, 255)',\n 'rgb(229, 246, 255)',\n 'rgb(234, 250, 241)',\n 'rgb(254, 233, 232)',\n 'rgb(254, 243, 235)',\n 'rgb(254, 249, 227)',\n 'rgb(253, 235, 255)',\n\n 'rgb(216, 216, 216)',\n 'rgb(89, 89, 89)',\n 'rgb(197, 202, 211)',\n 'rgb(199, 220, 255)',\n 'rgb(199, 236, 255)',\n 'rgb(195, 234, 213)',\n 'rgb(255, 201, 199)',\n 'rgb(255, 220, 196)',\n 'rgb(255, 238, 173)',\n 'rgb(242, 199, 255)',\n\n 'rgb(191, 191, 191)',\n 'rgb(63, 63, 63)',\n 'rgb(128, 139, 158)',\n 'rgb(153, 190, 255)',\n 'rgb(153, 221, 255)',\n 'rgb(152, 215, 182)',\n 'rgb(255, 156, 153)',\n 'rgb(255, 186, 132)',\n 'rgb(255, 226, 112)',\n 'rgb(213, 142, 255)',\n\n 'rgb(165, 165, 165)',\n 'rgb(38, 38, 38)',\n 'rgb(53, 59, 69)',\n 'rgb(20, 80, 184)',\n 'rgb(18, 116, 165)',\n 'rgb(39, 124, 79)',\n 'rgb(158, 30, 26)',\n 'rgb(184, 96, 20)',\n 'rgb(163, 130, 0)',\n 'rgb(94, 34, 129)',\n\n 'rgb(147, 147, 147)',\n 'rgb(13, 13, 13)',\n 'rgb(36, 39, 46)',\n 'rgb(12, 48, 110)',\n 'rgb(10, 65, 92)',\n 'rgb(24, 78, 50)',\n 'rgb(88, 17, 14)',\n 'rgb(92, 48, 10)',\n 'rgb(102, 82, 0)',\n 'rgb(59, 21, 81)',\n\n 'custom',\n]\nconst FONTS = [false, 'serif', 'monospace']\nconst HEADERS = ['1', '2', '3', false]\nconst SIZES = ['small', false, 'large', 'huge']\nconst LINEHEIGHT = [false, '1.2', '1.5', '2']\n\nclass SnowTheme extends OriginSnowTheme {\n constructor(public quill: FluentEditor, options: ThemeOptions) {\n super(quill, options)\n\n this.quill.emitter.on(CHANGE_LANGUAGE_EVENT, () => {\n this.i18nTextToolbar()\n })\n }\n\n i18nTextToolbar() {\n const toolbar = this.quill.getModule('toolbar') as TypeToolbar\n ColorPicker.clearText = this.quill.getLangText('clear-color')\n ColorPicker.customText = this.quill.getLangText('custom-color')\n\n if (!toolbar || !this.pickers) return\n\n this.pickers.forEach((picker) => {\n if (picker instanceof ColorPicker) {\n // EasyColorPicker have not dts. abd origin quill ColorPicker dts not complete. use any to resovle ts type error\n const colorPicker = picker as any\n colorPicker.options.remove()\n Array.from(colorPicker.select.options).forEach((option: any) => {\n if (option.hasAttribute('custom')) {\n option.remove()\n }\n })\n colorPicker.buildOptions()\n colorPicker.createUsedColor()\n }\n\n if (picker.select && picker.select.classList.contains('ql-header')) {\n const getLabelKey = (v: string | null) => (v ? `header-${v}` : 'header-normal')\n\n // 更新 label 文本\n const labelValue = picker.label.getAttribute('data-value')\n picker.label.setAttribute('data-label', this.quill.getLangText(getLabelKey(labelValue)))\n\n const select = picker.select as HTMLSelectElement\n Array.from(select.options).forEach((option) => {\n const value = option.getAttribute('value')\n option.textContent = this.quill.getLangText(getLabelKey(value))\n })\n\n picker.options.remove()\n picker.buildOptions()\n }\n })\n }\n\n buildPickers(selects: NodeListOf<HTMLSelectElement>, icons: Record<string, string | Record<string, string>>) {\n this.pickers = Array.from(selects).map((select) => {\n if (select.classList.contains('ql-align')) {\n if (isNullOrUndefined(select.querySelector('option'))) {\n fillSelect(select, ALIGNS)\n }\n return new IconPicker(select, icons.align as Record<string, string>)\n }\n\n if (select.classList.contains('ql-background') || select.classList.contains('ql-color')) {\n const format = select.classList.contains('ql-background') ? 'background' : 'color'\n if (isNullOrUndefined(select.querySelector('option'))) {\n fillColorSelect(select, COLORS, format, format === 'background' ? '#ffffff' : '#000000')\n }\n return new ColorPicker(select, icons[format] as string, {\n expandIcon: '<i class=\"icon\" />',\n closeAfterChange: false,\n })\n }\n\n if (isNullOrUndefined(select.querySelector('option'))) {\n if (select.classList.contains('ql-font')) {\n fillSelect(select, FONTS)\n }\n else if (select.classList.contains('ql-header')) {\n fillSelect(select, HEADERS)\n }\n else if (select.classList.contains('ql-size')) {\n fillSelect(select, SIZES)\n }\n else if (select.classList.contains('ql-line-height')) {\n fillSelect(select, LINEHEIGHT)\n }\n }\n return new Picker(select)\n })\n\n const update = () => {\n this.pickers.forEach((picker) => {\n if (picker instanceof ColorPicker) return\n picker.update()\n })\n }\n this.quill.on(FluentEditor.events.EDITOR_CHANGE, update)\n }\n\n extendToolbar(toolbar) {\n const icons = FluentEditor.import('ui/icons') as Record<string, any>\n toolbar.container.classList.add('ql-snow')\n this.buildButtons(toolbar.container.querySelectorAll('button'), icons)\n this.buildPickers(toolbar.container.querySelectorAll('select'), icons)\n this.tooltip = new LinkTooltip(this.quill, this.options.bounds)\n }\n}\n\nfunction fillSelect(select, values, defaultValue = false) {\n values.forEach((value) => {\n const option = document.createElement('option')\n if (value === defaultValue) {\n option.setAttribute('selected', 'selected')\n }\n else {\n option.setAttribute('value', value)\n }\n select.appendChild(option)\n })\n}\n\nfunction fillColorSelect(\n select: HTMLSelectElement,\n values: Array<string | boolean>,\n format: string,\n defaultValue: unknown = false,\n) {\n const colorGetter = document.createElement('span') as HTMLElement\n for (const value of values) {\n const option = document.createElement('option')\n if (value === defaultValue) {\n option.setAttribute('selected', 'selected')\n }\n else {\n if (value !== 'custom') {\n colorGetter.style[format] = String(value)\n option.setAttribute('value', colorGetter.style[format])\n }\n else {\n option.setAttribute('value', value)\n }\n }\n select.appendChild(option)\n }\n}\n\nexport default SnowTheme\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"screenshot.es.js","sources":["../../../src/tools/screenshot.ts"],"sourcesContent":["import type html2canvas from 'html2canvas'\r\nimport type { Options as Html2CanvasOptions } from 'html2canvas'\r\nimport type Toolbar from 'quill/modules/toolbar'\r\nimport Quill from 'quill'\r\nimport { imgToBase64 } from '../utils/image'\r\nimport { lockScroll } from '../utils/scroll-lock'\r\n\r\nconst Delta = Quill.import('delta')\r\n\r\nexport type ScreenShotOptions = Partial<Html2CanvasOptions> & {\r\n Html2Canvas: typeof html2canvas\r\n beforeCreateCanvas: () => void | Promise<void>\r\n beforeCreateImage: (canvas: HTMLCanvasElement) => HTMLCanvasElement | string | Promise<HTMLCanvasElement | string>\r\n}\r\ninterface ScreenShotOptionsInQuill {\r\n quill: {\r\n options: {\r\n screenshot: Partial<ScreenShotOptions>\r\n }\r\n }\r\n}\r\n\r\nfunction resolveOptions(options: Partial<ScreenShotOptions>) {\r\n return Object.assign({\r\n // @ts-ignore\r\n Html2Canvas: window.Html2Canvas,\r\n useCORS: true,\r\n scale: 1,\r\n foreignObjectRendering: true,\r\n beforeCreateImage: undefined,\r\n beforeCreateCanvas: undefined,\r\n }, options)\r\n}\r\n\r\nfunction init() {\r\n const maskExits = document.querySelectorAll('.ql-screenshot-mask')\r\n if (maskExits) {\r\n maskExits.forEach(item => item && item.remove())\r\n }\r\n // 创建截图图层\r\n const wrapper = document.createElement('div')\r\n wrapper.classList.add('ql-screenshot-wrapper')\r\n const mask = document.createElement('div')\r\n mask.className = 'ql-screenshot-mask'\r\n const cutter = document.createElement('div')\r\n cutter.className = 'ql-screenshot-cutter'\r\n const coordinate = document.createElement('p')\r\n coordinate.className = 'ql-screenshot-coordinate'\r\n cutter.appendChild(coordinate)\r\n wrapper.appendChild(mask)\r\n wrapper.appendChild(cutter)\r\n document.body.appendChild(wrapper)\r\n return { wrapper, mask, cutter, coordinate }\r\n}\r\n\r\nfunction findParentFixed(dom: HTMLElement) {\r\n if (dom.tagName === 'BODY') return false\r\n if (['fixed', 'sticky'].includes(dom.parentElement.style.position)) return true\r\n return findParentFixed(dom.parentElement)\r\n}\r\nasync function renderImage(\r\n Html2Canvas: typeof html2canvas,\r\n html2canvasOptions: Partial<Html2CanvasOptions>,\r\n rect: DOMRect,\r\n options?: Omit<ScreenShotOptions, 'Html2Canvas' | keyof Html2CanvasOptions>,\r\n) {\r\n if (options && options.beforeCreateCanvas) {\r\n await options.beforeCreateCanvas()\r\n }\r\n const canvas: CanvasImageSource = await Html2Canvas(document.body, {\r\n ...html2canvasOptions,\r\n onclone: async (doc: Document, el: HTMLElement) => {\r\n // find all fixed or sticky dom\r\n const fixedDom = Array.from(doc.querySelectorAll('*[style*=\"position: fixed\"]')) as HTMLElement[]\r\n const stickyDom = Array.from(doc.querySelectorAll('*[style*=\"position: sticky\"]')) as HTMLElement[]\r\n const fixedDomList = new Set([...fixedDom, ...stickyDom])\r\n for (const dom of fixedDomList) {\r\n // if parent dom already has fixed or sticky style\r\n // means that transform will be settle. skip\r\n if (findParentFixed(dom)) continue\r\n // use transform move to correct position\r\n let x = 0\r\n let y = 0\r\n if (dom.style.top !== 'auto') {\r\n y = window.scrollY\r\n }\r\n if (dom.style.left !== 'auto') {\r\n x = window.scrollX\r\n }\r\n if (x !== 0 || y !== 0) {\r\n dom.style.transform = `translate(${x}px, ${y}px)`\r\n }\r\n }\r\n\r\n const imgs = doc.querySelectorAll('img')\r\n const promises = Array.from(imgs).map(async (img) => {\r\n img.src = await imgToBase64(img.src)\r\n })\r\n await Promise.all(promises)\r\n html2canvasOptions.onclone && await html2canvasOptions.onclone(doc, el)\r\n },\r\n })\r\n // 当前canvas为body全局截图,从当前截图中截取想要的部分重新绘制转成base64插入富文本\r\n let cropCanvas: HTMLCanvasElement | string = document.createElement('canvas')\r\n cropCanvas.width = rect.width\r\n cropCanvas.height = rect.height\r\n const cropCanvasCtx = cropCanvas.getContext('2d')\r\n cropCanvasCtx.drawImage(\r\n canvas,\r\n rect.x + window.scrollX,\r\n rect.y + window.scrollY,\r\n rect.width,\r\n rect.height,\r\n 0,\r\n 0,\r\n rect.width,\r\n rect.height,\r\n )\r\n if (options && options.beforeCreateImage) {\r\n cropCanvas = await options.beforeCreateImage(cropCanvas)\r\n }\r\n return typeof cropCanvas === 'string' ? cropCanvas : cropCanvas.toDataURL()\r\n}\r\n\r\nexport function Screenshot(this: Toolbar & ScreenShotOptionsInQuill) {\r\n this.quill.options.screenshot = resolveOptions(this.quill.options.screenshot)\r\n const options = this.quill.options.screenshot\r\n // @ts-ignore\r\n const { Html2Canvas, beforeCreateImage, beforeCreateCanvas, ...html2CanvasOptions } = options\r\n if (!Html2Canvas) {\r\n throw new Error('ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor.')\r\n }\r\n const range = this.quill.getSelection()\r\n const { wrapper, mask, cutter, coordinate } = init()\r\n const status: {\r\n leftClickLockFlag: boolean\r\n start?: {\r\n x: number\r\n y: number\r\n }\r\n } = {\r\n leftClickLockFlag: false,\r\n start: undefined,\r\n }\r\n const cleanLock = lockScroll()\r\n\r\n const removeContextmenu = (event: Event) => {\r\n event.preventDefault()\r\n wrapper.remove()\r\n cleanLock()\r\n document.removeEventListener('contextmenu', removeContextmenu)\r\n }\r\n const afterShotCtrl = async (event: MouseEvent) => {\r\n document.removeEventListener('mousedown', toggleRect)\r\n const cutterRect = cutter.getBoundingClientRect()\r\n const target = event.target as HTMLElement\r\n wrapper.remove()\r\n cleanLock()\r\n if (target && target.className === 'ql-screenshot-confirm') {\r\n const image = await renderImage(Html2Canvas, html2CanvasOptions, cutterRect, { beforeCreateCanvas, beforeCreateImage })\r\n\r\n const delta = new Delta()\r\n .retain(range.index)\r\n .delete(range.length)\r\n .insert({ image })\r\n this.quill.updateContents(delta, Quill.sources.USER)\r\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\r\n }\r\n status.start = undefined\r\n }\r\n const drawRect = (event: MouseEvent) => {\r\n // 通过鼠标移动描绘截图图层\r\n const startX = status.start.x\r\n const startY = status.start.y\r\n const endX = event.clientX\r\n const endY = event.clientY\r\n const width = Math.abs(endX - startX)\r\n const height = Math.abs(endY - startY)\r\n const top = startY < endY ? startY : endY\r\n const left = startX < endX ? startX : endX\r\n const bottom = window.innerHeight - height - top\r\n const right = window.innerWidth - width - left\r\n\r\n const maskPath = `\r\n linear-gradient(to top, #fff, #fff) top / 100% ${top}px,\r\n linear-gradient(to bottom, #fff, #fff) bottom /100% ${bottom}px,\r\n linear-gradient(to left, #fff, #fff) left / ${left}px 100%,\r\n linear-gradient(to right, #fff, #fff) right / ${right}px 100%\r\n `\r\n Object.assign(cutter.style, {\r\n width: `${width}px`,\r\n height: `${height}px`,\r\n left: `${left}px`,\r\n top: `${top}px`,\r\n })\r\n Object.assign(mask.style, {\r\n 'mask': maskPath,\r\n '-webkit-mask-repeat': 'no-repeat',\r\n })\r\n coordinate.textContent = `${width}, ${height}`\r\n }\r\n const toggleRect = (event: MouseEvent) => {\r\n // 右键取消截图操作\r\n if (event.button === 2) {\r\n document.removeEventListener('mousemove', drawRect)\r\n document.removeEventListener('mousedown', toggleRect)\r\n document.addEventListener('contextmenu', removeContextmenu)\r\n return\r\n }\r\n if (!status.leftClickLockFlag) {\r\n if (status.start) {\r\n // 如果有起点,则当前触发坐标为终点,移除监听事件并添加确认和取消按钮\r\n document.removeEventListener('mousemove', drawRect)\r\n const doneBtn = document.createElement('div')\r\n doneBtn.innerHTML = `<div class=\"ql-screenshot-confirm\"></div><div class=\"ql-screenshot-cancel\"></div>`\r\n doneBtn.className = 'ql-screenshot-done'\r\n doneBtn.addEventListener('click', afterShotCtrl)\r\n coordinate.remove()\r\n cutter.appendChild(doneBtn)\r\n status.leftClickLockFlag = true\r\n }\r\n else {\r\n // 无起点则设置起点坐标,监听鼠标移动\r\n status.start = { x: event.clientX, y: event.clientY }\r\n document.addEventListener('mousemove', drawRect)\r\n }\r\n }\r\n }\r\n document.addEventListener('mousedown', toggleRect)\r\n}\r\nScreenshot.toolName = 'screenshot'\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"screenshot.es.js","sources":["../../../src/tools/screenshot.ts"],"sourcesContent":["import type html2canvas from 'html2canvas'\nimport type { Options as Html2CanvasOptions } from 'html2canvas'\nimport type Toolbar from 'quill/modules/toolbar'\nimport Quill from 'quill'\nimport { imgToBase64 } from '../utils/image'\nimport { lockScroll } from '../utils/scroll-lock'\n\nconst Delta = Quill.import('delta')\n\nexport type ScreenShotOptions = Partial<Html2CanvasOptions> & {\n Html2Canvas: typeof html2canvas\n beforeCreateCanvas: () => void | Promise<void>\n beforeCreateImage: (canvas: HTMLCanvasElement) => HTMLCanvasElement | string | Promise<HTMLCanvasElement | string>\n}\ninterface ScreenShotOptionsInQuill {\n quill: {\n options: {\n screenshot: Partial<ScreenShotOptions>\n }\n }\n}\n\nfunction resolveOptions(options: Partial<ScreenShotOptions>) {\n return Object.assign({\n // @ts-ignore\n Html2Canvas: window.Html2Canvas,\n useCORS: true,\n scale: 1,\n foreignObjectRendering: true,\n beforeCreateImage: undefined,\n beforeCreateCanvas: undefined,\n }, options)\n}\n\nfunction init() {\n const maskExits = document.querySelectorAll('.ql-screenshot-mask')\n if (maskExits) {\n maskExits.forEach(item => item && item.remove())\n }\n // 创建截图图层\n const wrapper = document.createElement('div')\n wrapper.classList.add('ql-screenshot-wrapper')\n const mask = document.createElement('div')\n mask.className = 'ql-screenshot-mask'\n const cutter = document.createElement('div')\n cutter.className = 'ql-screenshot-cutter'\n const coordinate = document.createElement('p')\n coordinate.className = 'ql-screenshot-coordinate'\n cutter.appendChild(coordinate)\n wrapper.appendChild(mask)\n wrapper.appendChild(cutter)\n document.body.appendChild(wrapper)\n return { wrapper, mask, cutter, coordinate }\n}\n\nfunction findParentFixed(dom: HTMLElement) {\n if (dom.tagName === 'BODY') return false\n if (['fixed', 'sticky'].includes(dom.parentElement.style.position)) return true\n return findParentFixed(dom.parentElement)\n}\nasync function renderImage(\n Html2Canvas: typeof html2canvas,\n html2canvasOptions: Partial<Html2CanvasOptions>,\n rect: DOMRect,\n options?: Omit<ScreenShotOptions, 'Html2Canvas' | keyof Html2CanvasOptions>,\n) {\n if (options && options.beforeCreateCanvas) {\n await options.beforeCreateCanvas()\n }\n const canvas: CanvasImageSource = await Html2Canvas(document.body, {\n ...html2canvasOptions,\n onclone: async (doc: Document, el: HTMLElement) => {\n // find all fixed or sticky dom\n const fixedDom = Array.from(doc.querySelectorAll('*[style*=\"position: fixed\"]')) as HTMLElement[]\n const stickyDom = Array.from(doc.querySelectorAll('*[style*=\"position: sticky\"]')) as HTMLElement[]\n const fixedDomList = new Set([...fixedDom, ...stickyDom])\n for (const dom of fixedDomList) {\n // if parent dom already has fixed or sticky style\n // means that transform will be settle. skip\n if (findParentFixed(dom)) continue\n // use transform move to correct position\n let x = 0\n let y = 0\n if (dom.style.top !== 'auto') {\n y = window.scrollY\n }\n if (dom.style.left !== 'auto') {\n x = window.scrollX\n }\n if (x !== 0 || y !== 0) {\n dom.style.transform = `translate(${x}px, ${y}px)`\n }\n }\n\n const imgs = doc.querySelectorAll('img')\n const promises = Array.from(imgs).map(async (img) => {\n img.src = await imgToBase64(img.src)\n })\n await Promise.all(promises)\n html2canvasOptions.onclone && await html2canvasOptions.onclone(doc, el)\n },\n })\n // 当前canvas为body全局截图,从当前截图中截取想要的部分重新绘制转成base64插入富文本\n let cropCanvas: HTMLCanvasElement | string = document.createElement('canvas')\n cropCanvas.width = rect.width\n cropCanvas.height = rect.height\n const cropCanvasCtx = cropCanvas.getContext('2d')\n cropCanvasCtx.drawImage(\n canvas,\n rect.x + window.scrollX,\n rect.y + window.scrollY,\n rect.width,\n rect.height,\n 0,\n 0,\n rect.width,\n rect.height,\n )\n if (options && options.beforeCreateImage) {\n cropCanvas = await options.beforeCreateImage(cropCanvas)\n }\n return typeof cropCanvas === 'string' ? cropCanvas : cropCanvas.toDataURL()\n}\n\nexport function Screenshot(this: Toolbar & ScreenShotOptionsInQuill) {\n this.quill.options.screenshot = resolveOptions(this.quill.options.screenshot)\n const options = this.quill.options.screenshot\n // @ts-ignore\n const { Html2Canvas, beforeCreateImage, beforeCreateCanvas, ...html2CanvasOptions } = options\n if (!Html2Canvas) {\n throw new Error('ScreenShot module requires html2canvas. Please include the library on the page before FluentEditor.')\n }\n const range = this.quill.getSelection()\n const { wrapper, mask, cutter, coordinate } = init()\n const status: {\n leftClickLockFlag: boolean\n start?: {\n x: number\n y: number\n }\n } = {\n leftClickLockFlag: false,\n start: undefined,\n }\n const cleanLock = lockScroll()\n\n const removeContextmenu = (event: Event) => {\n event.preventDefault()\n wrapper.remove()\n cleanLock()\n document.removeEventListener('contextmenu', removeContextmenu)\n }\n const afterShotCtrl = async (event: MouseEvent) => {\n document.removeEventListener('mousedown', toggleRect)\n const cutterRect = cutter.getBoundingClientRect()\n const target = event.target as HTMLElement\n wrapper.remove()\n cleanLock()\n if (target && target.className === 'ql-screenshot-confirm') {\n const image = await renderImage(Html2Canvas, html2CanvasOptions, cutterRect, { beforeCreateCanvas, beforeCreateImage })\n\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert({ image })\n this.quill.updateContents(delta, Quill.sources.USER)\n this.quill.setSelection(range.index + 1, Quill.sources.SILENT)\n }\n status.start = undefined\n }\n const drawRect = (event: MouseEvent) => {\n // 通过鼠标移动描绘截图图层\n const startX = status.start.x\n const startY = status.start.y\n const endX = event.clientX\n const endY = event.clientY\n const width = Math.abs(endX - startX)\n const height = Math.abs(endY - startY)\n const top = startY < endY ? startY : endY\n const left = startX < endX ? startX : endX\n const bottom = window.innerHeight - height - top\n const right = window.innerWidth - width - left\n\n const maskPath = `\n linear-gradient(to top, #fff, #fff) top / 100% ${top}px,\n linear-gradient(to bottom, #fff, #fff) bottom /100% ${bottom}px,\n linear-gradient(to left, #fff, #fff) left / ${left}px 100%,\n linear-gradient(to right, #fff, #fff) right / ${right}px 100%\n `\n Object.assign(cutter.style, {\n width: `${width}px`,\n height: `${height}px`,\n left: `${left}px`,\n top: `${top}px`,\n })\n Object.assign(mask.style, {\n 'mask': maskPath,\n '-webkit-mask-repeat': 'no-repeat',\n })\n coordinate.textContent = `${width}, ${height}`\n }\n const toggleRect = (event: MouseEvent) => {\n // 右键取消截图操作\n if (event.button === 2) {\n document.removeEventListener('mousemove', drawRect)\n document.removeEventListener('mousedown', toggleRect)\n document.addEventListener('contextmenu', removeContextmenu)\n return\n }\n if (!status.leftClickLockFlag) {\n if (status.start) {\n // 如果有起点,则当前触发坐标为终点,移除监听事件并添加确认和取消按钮\n document.removeEventListener('mousemove', drawRect)\n const doneBtn = document.createElement('div')\n doneBtn.innerHTML = `<div class=\"ql-screenshot-confirm\"></div><div class=\"ql-screenshot-cancel\"></div>`\n doneBtn.className = 'ql-screenshot-done'\n doneBtn.addEventListener('click', afterShotCtrl)\n coordinate.remove()\n cutter.appendChild(doneBtn)\n status.leftClickLockFlag = true\n }\n else {\n // 无起点则设置起点坐标,监听鼠标移动\n status.start = { x: event.clientX, y: event.clientY }\n document.addEventListener('mousemove', drawRect)\n }\n }\n }\n document.addEventListener('mousedown', toggleRect)\n}\nScreenshot.toolName = 'screenshot'\n"],"names":[],"mappings":"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"}