@opentiny/fluent-editor 4.0.0-alpha.10 → 4.0.0-alpha.12

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 (276) hide show
  1. package/es/config/editor.utils.es.js.map +1 -1
  2. package/es/config/i18n/en-us.es.js +2 -0
  3. package/es/config/i18n/en-us.es.js.map +1 -1
  4. package/es/config/i18n/zh-cn.es.js +2 -0
  5. package/es/config/i18n/zh-cn.es.js.map +1 -1
  6. package/es/config/index.es.js.map +1 -1
  7. package/es/core/fluent-editor.es.js.map +1 -1
  8. package/es/fluent-editor.es.js +17 -13
  9. package/es/fluent-editor.es.js.map +1 -1
  10. package/es/formats/soft-break.es.js.map +1 -1
  11. package/es/formats/video.es.js.map +1 -1
  12. package/es/index.es.js +4 -0
  13. package/es/index.es.js.map +1 -1
  14. package/es/modules/ai/constants.es.js.map +1 -1
  15. package/es/modules/ai/index.es.js +1 -1
  16. package/es/modules/ai/index.es.js.map +1 -1
  17. package/es/modules/collaborative-editing/awareness/awareness.es.js +6 -7
  18. package/es/modules/collaborative-editing/awareness/awareness.es.js.map +1 -1
  19. package/es/modules/collaborative-editing/awareness/y-indexeddb.es.js +7 -3
  20. package/es/modules/collaborative-editing/awareness/y-indexeddb.es.js.map +1 -1
  21. package/es/modules/collaborative-editing/collaborative-editing.es.js +13 -8
  22. package/es/modules/collaborative-editing/collaborative-editing.es.js.map +1 -1
  23. package/es/modules/collaborative-editing/module.es.js.map +1 -1
  24. package/es/modules/collaborative-editing/provider/providerRegistry.es.js.map +1 -1
  25. package/es/modules/collaborative-editing/provider/webrtc.es.js +8 -4
  26. package/es/modules/collaborative-editing/provider/webrtc.es.js.map +1 -1
  27. package/es/modules/collaborative-editing/provider/websocket.es.js +6 -4
  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/actions/image-toolbar-buttons.es.js +1 -1
  35. package/es/modules/custom-image/actions/image-toolbar-buttons.es.js.map +1 -1
  36. package/es/modules/custom-image/actions/toolbar-action.es.js.map +1 -1
  37. package/es/modules/custom-image/actions/toolbar.es.js.map +1 -1
  38. package/es/modules/custom-image/blot-formatter.es.js.map +1 -1
  39. package/es/modules/custom-image/image.es.js.map +1 -1
  40. package/es/modules/custom-image/options.es.js.map +1 -1
  41. package/es/modules/custom-image/specs/blot-spec.es.js.map +1 -1
  42. package/es/modules/custom-image/specs/custom-image-spec.es.js.map +1 -1
  43. package/es/modules/custom-image/specs/image-spec.es.js.map +1 -1
  44. package/es/modules/custom-uploader.es.js.map +1 -1
  45. package/es/modules/divider.es.js.map +1 -1
  46. package/es/modules/emoji.es.js.map +1 -1
  47. package/es/modules/file/formats/file.es.js.map +1 -1
  48. package/es/modules/file/modules/file-bar.es.js.map +1 -1
  49. package/es/modules/file/modules/file-module.es.js.map +1 -1
  50. package/es/modules/flow-chart/config-utils.es.js +102 -0
  51. package/es/modules/flow-chart/config-utils.es.js.map +1 -0
  52. package/es/modules/flow-chart/formats/flow-chart-blot.es.js +369 -0
  53. package/es/modules/flow-chart/formats/flow-chart-blot.es.js.map +1 -0
  54. package/es/modules/flow-chart/i18n/en-us.es.js +30 -0
  55. package/es/modules/flow-chart/i18n/en-us.es.js.map +1 -0
  56. package/es/modules/flow-chart/i18n/index.es.js +12 -0
  57. package/es/modules/flow-chart/i18n/index.es.js.map +1 -0
  58. package/es/modules/flow-chart/i18n/zh-cn.es.js +30 -0
  59. package/es/modules/flow-chart/i18n/zh-cn.es.js.map +1 -0
  60. package/es/modules/flow-chart/icons.es.js +27 -0
  61. package/es/modules/flow-chart/icons.es.js.map +1 -0
  62. package/es/modules/flow-chart/index.es.js +45 -0
  63. package/es/modules/flow-chart/index.es.js.map +1 -0
  64. package/es/modules/flow-chart/modules/context-menu.es.js +184 -0
  65. package/es/modules/flow-chart/modules/context-menu.es.js.map +1 -0
  66. package/es/modules/flow-chart/modules/control-panel.es.js +286 -0
  67. package/es/modules/flow-chart/modules/control-panel.es.js.map +1 -0
  68. package/es/modules/flow-chart/modules/custom-resize-action.es.js +150 -0
  69. package/es/modules/flow-chart/modules/custom-resize-action.es.js.map +1 -0
  70. package/es/modules/i18n.es.js.map +1 -1
  71. package/es/modules/index.es.js +4 -0
  72. package/es/modules/index.es.js.map +1 -1
  73. package/es/modules/link/formats/link.es.js.map +1 -1
  74. package/es/modules/link/modules/tooltip.es.js.map +1 -1
  75. package/es/modules/mathlive/formats.es.js.map +1 -1
  76. package/es/modules/mathlive/module.es.js.map +1 -1
  77. package/es/modules/mathlive/tooltip.es.js.map +1 -1
  78. package/es/modules/mention/mention-link.es.js.map +1 -1
  79. package/es/modules/mention/mention.es.js.map +1 -1
  80. package/es/modules/mind-map/config-utils.es.js +108 -0
  81. package/es/modules/mind-map/config-utils.es.js.map +1 -0
  82. package/es/modules/mind-map/formats/mind-map-blot.es.js +356 -0
  83. package/es/modules/mind-map/formats/mind-map-blot.es.js.map +1 -0
  84. package/es/modules/mind-map/i18n/en-us.es.js +29 -0
  85. package/es/modules/mind-map/i18n/en-us.es.js.map +1 -0
  86. package/es/modules/mind-map/i18n/index.es.js +12 -0
  87. package/es/modules/mind-map/i18n/index.es.js.map +1 -0
  88. package/es/modules/mind-map/i18n/zh-cn.es.js +29 -0
  89. package/es/modules/mind-map/i18n/zh-cn.es.js.map +1 -0
  90. package/es/modules/mind-map/icons.es.js +45 -0
  91. package/es/modules/mind-map/icons.es.js.map +1 -0
  92. package/es/modules/mind-map/index.es.js +56 -0
  93. package/es/modules/mind-map/index.es.js.map +1 -0
  94. package/es/modules/mind-map/modules/context-menu.es.js +128 -0
  95. package/es/modules/mind-map/modules/context-menu.es.js.map +1 -0
  96. package/es/modules/mind-map/modules/control-panel.es.js +425 -0
  97. package/es/modules/mind-map/modules/control-panel.es.js.map +1 -0
  98. package/es/modules/mind-map/modules/custom-resize-action.es.js +161 -0
  99. package/es/modules/mind-map/modules/custom-resize-action.es.js.map +1 -0
  100. package/es/modules/shortcut-key/index.es.js +16 -0
  101. package/es/modules/shortcut-key/index.es.js.map +1 -1
  102. package/es/modules/syntax.es.js.map +1 -1
  103. package/es/modules/table-up/index.es.js.map +1 -1
  104. package/es/modules/toolbar/better-picker.es.js.map +1 -1
  105. package/es/modules/toolbar/better-toolbar.es.js.map +1 -1
  106. package/es/modules/toolbar/toolbar-tip.es.js.map +1 -1
  107. package/es/themes/snow.es.js.map +1 -1
  108. package/es/tools/format-painter.es.js.map +1 -1
  109. package/es/tools/fullscreen.es.js.map +1 -1
  110. package/es/tools/screenshot.es.js.map +1 -1
  111. package/es/ui/icons.config.es.js +4 -0
  112. package/es/ui/icons.config.es.js.map +1 -1
  113. package/es/ui/icons.es.js +4 -2
  114. package/es/ui/icons.es.js.map +1 -1
  115. package/es/utils/debounce.es.js.map +1 -1
  116. package/es/utils/image.es.js.map +1 -1
  117. package/es/utils/is.es.js.map +1 -1
  118. package/es/utils/method.es.js.map +1 -1
  119. package/es/utils/scroll-lock.es.js.map +1 -1
  120. package/flow-chart.css +185 -0
  121. package/lib/config/editor.utils.cjs.js.map +1 -1
  122. package/lib/config/i18n/en-us.cjs.js +2 -0
  123. package/lib/config/i18n/en-us.cjs.js.map +1 -1
  124. package/lib/config/i18n/zh-cn.cjs.js +2 -0
  125. package/lib/config/i18n/zh-cn.cjs.js.map +1 -1
  126. package/lib/config/index.cjs.js.map +1 -1
  127. package/lib/core/fluent-editor.cjs.js.map +1 -1
  128. package/lib/fluent-editor.cjs.js +23 -19
  129. package/lib/fluent-editor.cjs.js.map +1 -1
  130. package/lib/formats/soft-break.cjs.js.map +1 -1
  131. package/lib/formats/video.cjs.js.map +1 -1
  132. package/lib/index.cjs.js +9 -5
  133. package/lib/index.cjs.js.map +1 -1
  134. package/lib/modules/ai/constants.cjs.js.map +1 -1
  135. package/lib/modules/ai/index.cjs.js.map +1 -1
  136. package/lib/modules/collaborative-editing/awareness/awareness.cjs.js +6 -24
  137. package/lib/modules/collaborative-editing/awareness/awareness.cjs.js.map +1 -1
  138. package/lib/modules/collaborative-editing/awareness/y-indexeddb.cjs.js +7 -3
  139. package/lib/modules/collaborative-editing/awareness/y-indexeddb.cjs.js.map +1 -1
  140. package/lib/modules/collaborative-editing/collaborative-editing.cjs.js +19 -31
  141. package/lib/modules/collaborative-editing/collaborative-editing.cjs.js.map +1 -1
  142. package/lib/modules/collaborative-editing/module.cjs.js.map +1 -1
  143. package/lib/modules/collaborative-editing/provider/providerRegistry.cjs.js.map +1 -1
  144. package/lib/modules/collaborative-editing/provider/webrtc.cjs.js +10 -23
  145. package/lib/modules/collaborative-editing/provider/webrtc.cjs.js.map +1 -1
  146. package/lib/modules/collaborative-editing/provider/websocket.cjs.js +10 -25
  147. package/lib/modules/collaborative-editing/provider/websocket.cjs.js.map +1 -1
  148. package/lib/modules/counter.cjs.js.map +1 -1
  149. package/lib/modules/custom-clipboard.cjs.js.map +1 -1
  150. package/lib/modules/custom-image/actions/action.cjs.js.map +1 -1
  151. package/lib/modules/custom-image/actions/custom-resize-action.cjs.js.map +1 -1
  152. package/lib/modules/custom-image/actions/delete-action.cjs.js.map +1 -1
  153. package/lib/modules/custom-image/actions/image-toolbar-buttons.cjs.js.map +1 -1
  154. package/lib/modules/custom-image/actions/toolbar-action.cjs.js.map +1 -1
  155. package/lib/modules/custom-image/actions/toolbar.cjs.js.map +1 -1
  156. package/lib/modules/custom-image/blot-formatter.cjs.js.map +1 -1
  157. package/lib/modules/custom-image/image.cjs.js.map +1 -1
  158. package/lib/modules/custom-image/options.cjs.js.map +1 -1
  159. package/lib/modules/custom-image/specs/blot-spec.cjs.js.map +1 -1
  160. package/lib/modules/custom-image/specs/custom-image-spec.cjs.js.map +1 -1
  161. package/lib/modules/custom-image/specs/image-spec.cjs.js.map +1 -1
  162. package/lib/modules/custom-uploader.cjs.js.map +1 -1
  163. package/lib/modules/divider.cjs.js.map +1 -1
  164. package/lib/modules/emoji.cjs.js.map +1 -1
  165. package/lib/modules/file/formats/file.cjs.js.map +1 -1
  166. package/lib/modules/file/modules/file-bar.cjs.js.map +1 -1
  167. package/lib/modules/file/modules/file-module.cjs.js.map +1 -1
  168. package/lib/modules/flow-chart/config-utils.cjs.js +102 -0
  169. package/lib/modules/flow-chart/config-utils.cjs.js.map +1 -0
  170. package/lib/modules/flow-chart/formats/flow-chart-blot.cjs.js +369 -0
  171. package/lib/modules/flow-chart/formats/flow-chart-blot.cjs.js.map +1 -0
  172. package/lib/modules/flow-chart/i18n/en-us.cjs.js +30 -0
  173. package/lib/modules/flow-chart/i18n/en-us.cjs.js.map +1 -0
  174. package/lib/modules/flow-chart/i18n/index.cjs.js +12 -0
  175. package/lib/modules/flow-chart/i18n/index.cjs.js.map +1 -0
  176. package/lib/modules/flow-chart/i18n/zh-cn.cjs.js +30 -0
  177. package/lib/modules/flow-chart/i18n/zh-cn.cjs.js.map +1 -0
  178. package/lib/modules/flow-chart/icons.cjs.js +27 -0
  179. package/lib/modules/flow-chart/icons.cjs.js.map +1 -0
  180. package/lib/modules/flow-chart/index.cjs.js +45 -0
  181. package/lib/modules/flow-chart/index.cjs.js.map +1 -0
  182. package/lib/modules/flow-chart/modules/context-menu.cjs.js +184 -0
  183. package/lib/modules/flow-chart/modules/context-menu.cjs.js.map +1 -0
  184. package/lib/modules/flow-chart/modules/control-panel.cjs.js +286 -0
  185. package/lib/modules/flow-chart/modules/control-panel.cjs.js.map +1 -0
  186. package/lib/modules/flow-chart/modules/custom-resize-action.cjs.js +150 -0
  187. package/lib/modules/flow-chart/modules/custom-resize-action.cjs.js.map +1 -0
  188. package/lib/modules/i18n.cjs.js.map +1 -1
  189. package/lib/modules/index.cjs.js +9 -5
  190. package/lib/modules/index.cjs.js.map +1 -1
  191. package/lib/modules/link/formats/link.cjs.js.map +1 -1
  192. package/lib/modules/link/modules/tooltip.cjs.js.map +1 -1
  193. package/lib/modules/mathlive/formats.cjs.js.map +1 -1
  194. package/lib/modules/mathlive/module.cjs.js.map +1 -1
  195. package/lib/modules/mathlive/tooltip.cjs.js.map +1 -1
  196. package/lib/modules/mention/mention-link.cjs.js.map +1 -1
  197. package/lib/modules/mention/mention.cjs.js.map +1 -1
  198. package/lib/modules/mind-map/config-utils.cjs.js +108 -0
  199. package/lib/modules/mind-map/config-utils.cjs.js.map +1 -0
  200. package/lib/modules/mind-map/formats/mind-map-blot.cjs.js +356 -0
  201. package/lib/modules/mind-map/formats/mind-map-blot.cjs.js.map +1 -0
  202. package/lib/modules/mind-map/i18n/en-us.cjs.js +29 -0
  203. package/lib/modules/mind-map/i18n/en-us.cjs.js.map +1 -0
  204. package/lib/modules/mind-map/i18n/index.cjs.js +12 -0
  205. package/lib/modules/mind-map/i18n/index.cjs.js.map +1 -0
  206. package/lib/modules/mind-map/i18n/zh-cn.cjs.js +29 -0
  207. package/lib/modules/mind-map/i18n/zh-cn.cjs.js.map +1 -0
  208. package/lib/modules/mind-map/icons.cjs.js +45 -0
  209. package/lib/modules/mind-map/icons.cjs.js.map +1 -0
  210. package/lib/modules/mind-map/index.cjs.js +56 -0
  211. package/lib/modules/mind-map/index.cjs.js.map +1 -0
  212. package/lib/modules/mind-map/modules/context-menu.cjs.js +128 -0
  213. package/lib/modules/mind-map/modules/context-menu.cjs.js.map +1 -0
  214. package/lib/modules/mind-map/modules/control-panel.cjs.js +425 -0
  215. package/lib/modules/mind-map/modules/control-panel.cjs.js.map +1 -0
  216. package/lib/modules/mind-map/modules/custom-resize-action.cjs.js +161 -0
  217. package/lib/modules/mind-map/modules/custom-resize-action.cjs.js.map +1 -0
  218. package/lib/modules/shortcut-key/index.cjs.js +16 -0
  219. package/lib/modules/shortcut-key/index.cjs.js.map +1 -1
  220. package/lib/modules/syntax.cjs.js.map +1 -1
  221. package/lib/modules/table-up/index.cjs.js.map +1 -1
  222. package/lib/modules/toolbar/better-picker.cjs.js.map +1 -1
  223. package/lib/modules/toolbar/better-toolbar.cjs.js.map +1 -1
  224. package/lib/modules/toolbar/toolbar-tip.cjs.js.map +1 -1
  225. package/lib/themes/snow.cjs.js.map +1 -1
  226. package/lib/tools/format-painter.cjs.js.map +1 -1
  227. package/lib/tools/fullscreen.cjs.js.map +1 -1
  228. package/lib/tools/screenshot.cjs.js.map +1 -1
  229. package/lib/ui/icons.cjs.js +3 -1
  230. package/lib/ui/icons.cjs.js.map +1 -1
  231. package/lib/ui/icons.config.cjs.js +4 -0
  232. package/lib/ui/icons.config.cjs.js.map +1 -1
  233. package/lib/utils/debounce.cjs.js.map +1 -1
  234. package/lib/utils/image.cjs.js.map +1 -1
  235. package/lib/utils/is.cjs.js.map +1 -1
  236. package/lib/utils/method.cjs.js.map +1 -1
  237. package/lib/utils/scroll-lock.cjs.js.map +1 -1
  238. package/mind-map.css +224 -0
  239. package/package.json +1 -34
  240. package/patches/quill@2.0.3.patch +33 -0
  241. package/scripts/apply-patches.cjs +248 -0
  242. package/style.css +3 -1
  243. package/types/config/i18n/en-us.d.ts +2 -0
  244. package/types/config/i18n/zh-cn.d.ts +2 -0
  245. package/types/config/types/editor-modules.interface.d.ts +4 -0
  246. package/types/modules/collaborative-editing/awareness/awareness.d.ts +2 -2
  247. package/types/modules/collaborative-editing/awareness/y-indexeddb.d.ts +3 -2
  248. package/types/modules/collaborative-editing/collaborative-editing.d.ts +4 -3
  249. package/types/modules/collaborative-editing/provider/providerRegistry.d.ts +2 -1
  250. package/types/modules/collaborative-editing/provider/webrtc.d.ts +5 -4
  251. package/types/modules/collaborative-editing/provider/websocket.d.ts +6 -5
  252. package/types/modules/collaborative-editing/types.d.ts +17 -1
  253. package/types/modules/flow-chart/config-utils.d.ts +10 -0
  254. package/types/modules/flow-chart/formats/flow-chart-blot.d.ts +43 -0
  255. package/types/modules/flow-chart/i18n/en-us.d.ts +26 -0
  256. package/types/modules/flow-chart/i18n/index.d.ts +1 -0
  257. package/types/modules/flow-chart/i18n/zh-cn.d.ts +26 -0
  258. package/types/modules/flow-chart/icons.d.ts +12 -0
  259. package/types/modules/flow-chart/index.d.ts +10 -0
  260. package/types/modules/flow-chart/modules/context-menu.d.ts +3 -0
  261. package/types/modules/flow-chart/modules/control-panel.d.ts +3 -0
  262. package/types/modules/flow-chart/modules/custom-resize-action.d.ts +22 -0
  263. package/types/modules/flow-chart/options.d.ts +29 -0
  264. package/types/modules/index.d.ts +2 -0
  265. package/types/modules/mind-map/config-utils.d.ts +12 -0
  266. package/types/modules/mind-map/formats/mind-map-blot.d.ts +44 -0
  267. package/types/modules/mind-map/i18n/en-us.d.ts +25 -0
  268. package/types/modules/mind-map/i18n/index.d.ts +1 -0
  269. package/types/modules/mind-map/i18n/zh-cn.d.ts +25 -0
  270. package/types/modules/mind-map/icons.d.ts +21 -0
  271. package/types/modules/mind-map/index.d.ts +10 -0
  272. package/types/modules/mind-map/modules/context-menu.d.ts +3 -0
  273. package/types/modules/mind-map/modules/control-panel.d.ts +3 -0
  274. package/types/modules/mind-map/modules/custom-resize-action.d.ts +23 -0
  275. package/types/modules/mind-map/options.d.ts +27 -0
  276. package/types/ui/icons.config.d.ts +2 -0
@@ -1 +1 @@
1
- {"version":3,"file":"scroll-lock.cjs.js","sources":["../../../src/utils/scroll-lock.ts"],"sourcesContent":["let scrollBarWidth: number\r\nexport function getScrollBarWidth({ target = document.body } = {}): number {\r\n if (scrollBarWidth !== undefined) return scrollBarWidth\r\n\r\n const outer = document.createElement('div')\r\n outer.className = 'scroll__wrap'\r\n outer.style.visibility = 'hidden'\r\n outer.style.width = '100px'\r\n outer.style.position = 'absolute'\r\n outer.style.top = '-9999px'\r\n target.appendChild(outer)\r\n\r\n const widthNoScroll = outer.offsetWidth\r\n outer.style.overflow = 'scroll'\r\n\r\n const inner = document.createElement('div')\r\n inner.style.width = '100%'\r\n outer.appendChild(inner)\r\n\r\n const widthWithScroll = inner.offsetWidth\r\n outer.parentNode?.removeChild(outer)\r\n scrollBarWidth = widthNoScroll - widthWithScroll\r\n\r\n return scrollBarWidth\r\n}\r\n\r\nexport function lockScroll({ target = document.body } = {}) {\r\n let scrollBarWidth = 0\r\n let originWidth = '0'\r\n\r\n const clockClass = 'scroll--lock'\r\n\r\n const cleanLock = () => {\r\n target && (target.style.width = originWidth)\r\n target.classList.remove(clockClass)\r\n }\r\n\r\n const hasHiddenClass = target.classList.contains(clockClass)\r\n if (!hasHiddenClass) {\r\n originWidth = target.style.width\r\n }\r\n scrollBarWidth = getScrollBarWidth({ target })\r\n const hasOverflow = (target === document.body ? document.documentElement : target).clientHeight < target.scrollHeight\r\n const overflowY = window.getComputedStyle(target).overflowY\r\n // only when the scrollbar exists needs to reduce width\r\n if (scrollBarWidth > 0 && (hasOverflow || overflowY === 'scroll') && !hasHiddenClass) {\r\n target.style.width = `calc(100% - ${scrollBarWidth}px)`\r\n }\r\n target.classList.add(clockClass)\r\n\r\n return cleanLock\r\n}\r\n"],"names":["scrollBarWidth"],"mappings":";;AAAA,IAAI;AACG,SAAS,kBAAkB,EAAE,SAAS,SAAS,KAAK,IAAI,CAAA,GAAY;;AACrE,MAAA,mBAAmB,OAAkB,QAAA;AAEnC,QAAA,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,MAAM,aAAa;AACzB,QAAM,MAAM,QAAQ;AACpB,QAAM,MAAM,WAAW;AACvB,QAAM,MAAM,MAAM;AAClB,SAAO,YAAY,KAAK;AAExB,QAAM,gBAAgB,MAAM;AAC5B,QAAM,MAAM,WAAW;AAEjB,QAAA,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,MAAM,QAAQ;AACpB,QAAM,YAAY,KAAK;AAEvB,QAAM,kBAAkB,MAAM;AACxB,cAAA,eAAA,mBAAY,YAAY;AAC9B,mBAAiB,gBAAgB;AAE1B,SAAA;AACT;AAEO,SAAS,WAAW,EAAE,SAAS,SAAS,KAAK,IAAI,CAAA,GAAI;AAC1D,MAAIA,kBAAiB;AACrB,MAAI,cAAc;AAElB,QAAM,aAAa;AAEnB,QAAM,YAAY,MAAM;AACX,eAAA,OAAO,MAAM,QAAQ;AACzB,WAAA,UAAU,OAAO,UAAU;AAAA,EACpC;AAEA,QAAM,iBAAiB,OAAO,UAAU,SAAS,UAAU;AAC3D,MAAI,CAAC,gBAAgB;AACnB,kBAAc,OAAO,MAAM;AAAA,EAAA;AAE7BA,oBAAiB,kBAAkB,EAAE,QAAQ;AACvC,QAAA,eAAe,WAAW,SAAS,OAAO,SAAS,kBAAkB,QAAQ,eAAe,OAAO;AACzG,QAAM,YAAY,OAAO,iBAAiB,MAAM,EAAE;AAElD,MAAIA,kBAAiB,MAAM,eAAe,cAAc,aAAa,CAAC,gBAAgB;AAC7E,WAAA,MAAM,QAAQ,eAAeA,eAAc;AAAA,EAAA;AAE7C,SAAA,UAAU,IAAI,UAAU;AAExB,SAAA;AACT;;;"}
1
+ {"version":3,"file":"scroll-lock.cjs.js","sources":["../../../src/utils/scroll-lock.ts"],"sourcesContent":["let scrollBarWidth: number\r\nexport function getScrollBarWidth({ target = document.body } = {}): number {\r\n if (scrollBarWidth !== undefined) return scrollBarWidth\r\n\r\n const outer = document.createElement('div')\r\n outer.className = 'scroll__wrap'\r\n outer.style.visibility = 'hidden'\r\n outer.style.width = '100px'\r\n outer.style.position = 'absolute'\r\n outer.style.top = '-9999px'\r\n target.appendChild(outer)\r\n\r\n const widthNoScroll = outer.offsetWidth\r\n outer.style.overflow = 'scroll'\r\n\r\n const inner = document.createElement('div')\r\n inner.style.width = '100%'\r\n outer.appendChild(inner)\r\n\r\n const widthWithScroll = inner.offsetWidth\r\n outer.parentNode?.removeChild(outer)\r\n scrollBarWidth = widthNoScroll - widthWithScroll\r\n\r\n return scrollBarWidth\r\n}\r\n\r\nexport function lockScroll({ target = document.body } = {}) {\r\n let scrollBarWidth = 0\r\n let originWidth = '0'\r\n\r\n const clockClass = 'scroll--lock'\r\n\r\n const cleanLock = () => {\r\n target && (target.style.width = originWidth)\r\n target.classList.remove(clockClass)\r\n }\r\n\r\n const hasHiddenClass = target.classList.contains(clockClass)\r\n if (!hasHiddenClass) {\r\n originWidth = target.style.width\r\n }\r\n scrollBarWidth = getScrollBarWidth({ target })\r\n const hasOverflow = (target === document.body ? document.documentElement : target).clientHeight < target.scrollHeight\r\n const overflowY = window.getComputedStyle(target).overflowY\r\n // only when the scrollbar exists needs to reduce width\r\n if (scrollBarWidth > 0 && (hasOverflow || overflowY === 'scroll') && !hasHiddenClass) {\r\n target.style.width = `calc(100% - ${scrollBarWidth}px)`\r\n }\r\n target.classList.add(clockClass)\r\n\r\n return cleanLock\r\n}\r\n"],"names":["scrollBarWidth"],"mappings":";;AAAA,IAAI;AACG,SAAS,kBAAkB,EAAE,SAAS,SAAS,KAAA,IAAS,CAAA,GAAY;;AACzE,MAAI,mBAAmB,OAAW,QAAO;AAEzC,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,YAAY;AAClB,QAAM,MAAM,aAAa;AACzB,QAAM,MAAM,QAAQ;AACpB,QAAM,MAAM,WAAW;AACvB,QAAM,MAAM,MAAM;AAClB,SAAO,YAAY,KAAK;AAExB,QAAM,gBAAgB,MAAM;AAC5B,QAAM,MAAM,WAAW;AAEvB,QAAM,QAAQ,SAAS,cAAc,KAAK;AAC1C,QAAM,MAAM,QAAQ;AACpB,QAAM,YAAY,KAAK;AAEvB,QAAM,kBAAkB,MAAM;AAC9B,cAAM,eAAN,mBAAkB,YAAY;AAC9B,mBAAiB,gBAAgB;AAEjC,SAAO;AACT;AAEO,SAAS,WAAW,EAAE,SAAS,SAAS,KAAA,IAAS,CAAA,GAAI;AAC1D,MAAIA,kBAAiB;AACrB,MAAI,cAAc;AAElB,QAAM,aAAa;AAEnB,QAAM,YAAY,MAAM;AACtB,eAAW,OAAO,MAAM,QAAQ;AAChC,WAAO,UAAU,OAAO,UAAU;AAAA,EACpC;AAEA,QAAM,iBAAiB,OAAO,UAAU,SAAS,UAAU;AAC3D,MAAI,CAAC,gBAAgB;AACnB,kBAAc,OAAO,MAAM;AAAA,EAC7B;AACAA,oBAAiB,kBAAkB,EAAE,QAAQ;AAC7C,QAAM,eAAe,WAAW,SAAS,OAAO,SAAS,kBAAkB,QAAQ,eAAe,OAAO;AACzG,QAAM,YAAY,OAAO,iBAAiB,MAAM,EAAE;AAElD,MAAIA,kBAAiB,MAAM,eAAe,cAAc,aAAa,CAAC,gBAAgB;AACpF,WAAO,MAAM,QAAQ,eAAeA,eAAc;AAAA,EACpD;AACA,SAAO,UAAU,IAAI,UAAU;AAE/B,SAAO;AACT;;;"}
package/mind-map.css ADDED
@@ -0,0 +1,224 @@
1
+ .ql-mind-map-item {
2
+ position: relative;
3
+ width: 100%;
4
+ height: 100%;
5
+ overflow: hidden;
6
+ }
7
+
8
+ .ql-mind-map-control {
9
+ position: absolute;
10
+ top: 8px;
11
+ right: 50px;
12
+ display: none;
13
+ gap: 6px;
14
+ white-space: nowrap;
15
+ pointer-events: auto;
16
+ padding: 5px 5px;
17
+ background-color: rgba(255, 255, 255, 0.85);
18
+ border-radius: 8px;
19
+ box-shadow: 0 3px 15px rgba(0, 0, 0, 0.15);
20
+ }
21
+ .ql-mind-map-control .ql-mind-map-control-item {
22
+ align-items: center;
23
+ cursor: pointer;
24
+ display: flex;
25
+ flex-direction: column;
26
+ justify-content: center;
27
+ padding: 5px 5px;
28
+ border-radius: inherit;
29
+ transition: all 0.2s ease;
30
+ }
31
+ .ql-mind-map-control .ql-mind-map-control-item .ql-mind-map-control-text {
32
+ height: 20px;
33
+ font-size: 12px;
34
+ }
35
+
36
+ .ql-mind-map-left-up-control {
37
+ position: absolute;
38
+ top: 20%;
39
+ left: 2px;
40
+ display: none;
41
+ gap: 6px;
42
+ white-space: nowrap;
43
+ pointer-events: auto;
44
+ flex-direction: column;
45
+ margin: 5px;
46
+ padding: 5px 5px;
47
+ background-color: rgba(255, 255, 255, 0.85);
48
+ border-radius: 8px;
49
+ box-shadow: 0 3px 15px rgba(0, 0, 0, 0.15);
50
+ }
51
+ .ql-mind-map-left-up-control .ql-mind-map-control-item {
52
+ align-items: center;
53
+ cursor: pointer;
54
+ display: flex;
55
+ flex-direction: column;
56
+ justify-content: center;
57
+ padding: 5px 5px;
58
+ border-radius: inherit;
59
+ transition: all 0.2s ease;
60
+ }
61
+ .ql-mind-map-left-up-control .ql-mind-map-control-item .ql-mind-map-control-text {
62
+ height: 20px;
63
+ font-size: 12px;
64
+ }
65
+
66
+ .ql-mind-map-right-up-control {
67
+ position: absolute;
68
+ top: 8px;
69
+ right: 6px;
70
+ display: inline-flex;
71
+ gap: 6px;
72
+ white-space: nowrap;
73
+ pointer-events: auto;
74
+ padding: 5px 5px;
75
+ background-color: rgba(255, 255, 255, 0.85);
76
+ border-radius: 8px;
77
+ box-shadow: 0 3px 15px rgba(0, 0, 0, 0.15);
78
+ }
79
+ .ql-mind-map-right-up-control .ql-mind-map-control-item {
80
+ align-items: center;
81
+ cursor: pointer;
82
+ display: flex;
83
+ flex-direction: column;
84
+ justify-content: center;
85
+ padding: 5px 5px;
86
+ border-radius: inherit;
87
+ transition: all 0.2s ease;
88
+ }
89
+ .ql-mind-map-right-up-control .ql-mind-map-control-item .ql-mind-map-control-text {
90
+ height: 20px;
91
+ font-size: 12px;
92
+ }
93
+
94
+ .ql-mind-map-icon-panel {
95
+ border-radius: inherit;
96
+ width: 200px;
97
+ position: absolute;
98
+ left: 45px;
99
+ top: 60px;
100
+ background-color: white;
101
+ border: 1px solid #ccc;
102
+ padding: 10px;
103
+ z-index: 1000;
104
+ max-height: 400px;
105
+ overflow-y: auto;
106
+ }
107
+ .ql-mind-map-icon-panel .ql-mind-map-icon-group-container {
108
+ display: flex;
109
+ flex-wrap: wrap;
110
+ gap: 6px;
111
+ }
112
+ .ql-mind-map-icon-panel .ql-mind-map-icon-group-container .ql-mind-map-icon-item {
113
+ width: 25px;
114
+ height: 25px;
115
+ display: flex;
116
+ align-items: center;
117
+ justify-content: center;
118
+ cursor: pointer;
119
+ border: 1px solid #eee;
120
+ border-radius: inherit;
121
+ padding: 2px;
122
+ transition: box-shadow 0.3s ease;
123
+ }
124
+ .ql-mind-map-icon-panel .ql-mind-map-icon-group-container .ql-mind-map-icon-item:hover {
125
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
126
+ }
127
+
128
+ .ql-mind-map-layout-panel {
129
+ display: flex;
130
+ flex-wrap: wrap;
131
+ gap: 6px;
132
+ border-radius: inherit;
133
+ width: 200px;
134
+ position: absolute;
135
+ left: 45px;
136
+ top: 60px;
137
+ background-color: white;
138
+ border: 1px solid #ccc;
139
+ padding: 10px;
140
+ z-index: 1000;
141
+ max-height: 400px;
142
+ overflow-y: auto;
143
+ }
144
+ .ql-mind-map-layout-panel .ql-mind-map-layout-item {
145
+ display: flex;
146
+ flex-direction: column;
147
+ align-items: center;
148
+ cursor: pointer;
149
+ border: 1px solid #eee;
150
+ border-radius: inherit;
151
+ padding: 2px;
152
+ width: 100%;
153
+ min-width: 100px;
154
+ transition: box-shadow 0.3s ease;
155
+ }
156
+ .ql-mind-map-layout-panel .ql-mind-map-layout-item:hover {
157
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
158
+ }
159
+ .ql-mind-map-layout-panel .ql-mind-map-layout-item .ql-mind-map-layout-icon-container {
160
+ width: 80px;
161
+ height: 60px;
162
+ }
163
+ .ql-mind-map-layout-panel .ql-mind-map-layout-item .ql-mind-map-layout-icon-container .ql-mind-map-layout-icon {
164
+ background-size: contain;
165
+ background-repeat: no-repeat;
166
+ background-position: center;
167
+ width: 80px;
168
+ height: 60px;
169
+ }
170
+ .ql-mind-map-layout-panel .ql-mind-map-layout-item .ql-mind-map-layout-name {
171
+ font-size: 12px;
172
+ margin-top: 5px;
173
+ }
174
+
175
+ .ql-mind-map-control-item.disabled {
176
+ opacity: 0.5;
177
+ cursor: not-allowed;
178
+ pointer-events: none;
179
+ }
180
+
181
+ .ql-mind-map-control-icon {
182
+ width: 16px;
183
+ height: 16px;
184
+ margin-right: 6px;
185
+ display: flex;
186
+ align-items: center;
187
+ justify-content: center;
188
+ }
189
+
190
+ .ql-mind-map-control-item i {
191
+ background-size: cover;
192
+ display: inline-block;
193
+ height: 20px;
194
+ vertical-align: middle;
195
+ width: 20px;
196
+ }
197
+
198
+ .ql-mind-map-control-item:hover {
199
+ background-color: #efefef;
200
+ }
201
+
202
+ .ql-mind-map-context-menu {
203
+ font-size: 14px;
204
+ color: #333;
205
+ user-select: none;
206
+ display: none;
207
+ position: fixed;
208
+ background: white;
209
+ border-radius: 4px;
210
+ box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
211
+ padding: 5px 0;
212
+ z-index: 1000;
213
+ visibility: visible;
214
+ opacity: 1;
215
+ width: 120px;
216
+ height: auto;
217
+ }
218
+ .ql-mind-map-context-menu .ql-mind-map-context-menu-item:hover {
219
+ background-color: #f5f5f5;
220
+ }
221
+
222
+ .smm-node-edit-wrap {
223
+ display: none !important;
224
+ }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@opentiny/fluent-editor",
3
3
  "type": "module",
4
- "version": "4.0.0-alpha.10",
4
+ "version": "4.0.0-alpha.12",
5
5
  "description": "A rich text editor based on Quill 2.0, which extends rich modules and formats on the basis of Quill. It's powerful and out-of-the-box.",
6
6
  "author": "OpenTiny Team",
7
7
  "license": "MIT",
@@ -26,43 +26,10 @@
26
26
  "main": "lib/index.cjs.js",
27
27
  "module": "es/index.es.js",
28
28
  "types": "types/index.d.ts",
29
- "scripts": {
30
- "dev": "vite build --watch",
31
- "build": "vite build && node scripts/pre-release.cjs",
32
- "test": "jest",
33
- "pub": "cd dist && npm publish"
34
- },
35
29
  "dependencies": {
36
30
  "lodash-es": "^4.17.15",
37
31
  "quill": "^2.0.0",
38
32
  "quill-easy-color": "^0.0.10",
39
33
  "quill-shortcut-key": "^0.0.5"
40
- },
41
- "devDependencies": {
42
- "@emoji-mart/data": "^1.2.1",
43
- "@floating-ui/dom": "^1.7.2",
44
- "@types/jest": "^26.0.23",
45
- "@types/lodash-es": "^4.17.12",
46
- "commander": "^6.2.0",
47
- "emoji-mart": "^5.6.0",
48
- "highlight.js": "^10.2.0",
49
- "html2canvas": "^1.4.1",
50
- "jest": "^26.6.3",
51
- "mathlive": "^0.101.0",
52
- "parchment": "^3.0.0",
53
- "quill-cursors": "^4.0.4",
54
- "sass": "^1.90.0",
55
- "shelljs": "^0.8.4",
56
- "ts-jest": "^26.5.6",
57
- "ts-node": "^9.1.1",
58
- "typescript": "^4.9.5",
59
- "vite": "^5.0.0",
60
- "vite-plugin-dts": "^4.3.0",
61
- "y-indexeddb": "^9.0.12",
62
- "y-protocols": "^1.0.6",
63
- "y-quill": "^1.0.0",
64
- "y-webrtc": "10.3.0",
65
- "y-websocket": "^3.0.0",
66
- "yjs": "^13.6.27"
67
34
  }
68
35
  }
@@ -0,0 +1,33 @@
1
+ diff --git a/core/editor.js b/core/editor.js
2
+ index 07fd544a5857c0c498abf899c66e34a1b6b6a736..62072586605974e6890a919312c0bbd971870b9e 100644
3
+ --- a/core/editor.js
4
+ +++ b/core/editor.js
5
+ @@ -15,7 +15,14 @@ class Editor {
6
+ applyDelta(delta) {
7
+ this.scroll.update();
8
+ let scrollLength = this.scroll.length();
9
+ - this.scroll.batchStart();
10
+ +
11
+ + // Check if a batch already exists (e.g. during composition)
12
+ + const isAlreadyBatching = Boolean(this.scroll.batch);
13
+ +
14
+ + if (!isAlreadyBatching) {
15
+ + this.scroll.batchStart();
16
+ + }
17
+ +
18
+ const normalizedDelta = normalizeDelta(delta);
19
+ const deleteDelta = new Delta();
20
+ const normalizedOps = splitOpLines(normalizedDelta.ops.slice());
21
+ @@ -93,7 +100,11 @@ class Editor {
22
+ }
23
+ return index + Op.length(op);
24
+ }, 0);
25
+ - this.scroll.batchEnd();
26
+ +
27
+ + if (!isAlreadyBatching) {
28
+ + this.scroll.batchEnd();
29
+ + }
30
+ +
31
+ this.scroll.optimize();
32
+ return this.update(normalizedDelta);
33
+ }
@@ -0,0 +1,248 @@
1
+ const { execSync } = require('node:child_process')
2
+ const fs = require('node:fs')
3
+ const path = require('node:path')
4
+
5
+ /*
6
+ * 应用 Quill 补丁脚本
7
+ * 功能:修复 Quill 编辑器输入法状态下的批处理问题,提升中文输入体验
8
+ *
9
+ * 自动应用:安装包时 postinstall 脚本自动应用,支持所有包管理器-受限于 postinstall 规则暂未实现
10
+ *
11
+ * 手动应用:在项目根目录执行
12
+ * node node_modules/@opentiny/fluent-editor/scripts/apply-patches.cjs
13
+ *
14
+ * 工作原理:
15
+ * 1. 检测包管理器类型(pnpm/npm/yarn)
16
+ * 2. 自动检测 Quill 安装位置
17
+ * 3. 根据包管理器类型应用不同的补丁策略
18
+ *
19
+ * 注意事项:
20
+ * - 补丁是幂等的,多次运行无副作用
21
+ * - 需要 node_modules 写入权限
22
+ * - 不影响其他包或项目的补丁
23
+ */
24
+
25
+ // 获取包管理器
26
+ function detectPackageManager() {
27
+ try {
28
+ const lockFiles = {
29
+ 'pnpm-lock.yaml': 'pnpm',
30
+ 'yarn.lock': 'yarn',
31
+ 'package-lock.json': 'npm',
32
+ }
33
+
34
+ for (const [file, manager] of Object.entries(lockFiles)) {
35
+ if (fs.existsSync(file)) return manager
36
+ }
37
+
38
+ const userAgent = process.env.npm_config_user_agent || ''
39
+ if (userAgent.includes('pnpm')) return 'pnpm'
40
+ if (userAgent.includes('yarn')) return 'yarn'
41
+ if (userAgent.includes('npm')) return 'npm'
42
+ }
43
+ catch {
44
+ return 'npm'
45
+ }
46
+
47
+ return 'npm'
48
+ }
49
+
50
+ // 拷贝 patches 文件
51
+ function copyPatchFile() {
52
+ const packageManager = detectPackageManager()
53
+ // 把 patch 文件复制到哪里
54
+ const dest = `patches/${packageManager === 'pnpm' ? 'quill@2.0.3.patch' : 'quill+2.0.3.patch'}`
55
+
56
+ // 文件存在直接返回
57
+ if (fs.existsSync(dest)) {
58
+ return true
59
+ }
60
+
61
+ // 复制 patch 文件的路径
62
+ const src = path.resolve(__dirname, '../patches/quill@2.0.3.patch')
63
+
64
+ if (fs.existsSync(src)) {
65
+ fs.mkdirSync('patches', { recursive: true })
66
+
67
+ if (packageManager === 'pnpm') {
68
+ fs.copyFileSync(src, dest)
69
+ }
70
+ else {
71
+ let content = fs.readFileSync(src, 'utf-8')
72
+ content = content.replaceAll('core/editor.js', 'node_modules/quill/core/editor.js')
73
+ fs.writeFileSync(dest, content)
74
+ }
75
+
76
+ console.log(`✅ 已复制 patch 文件到 ${dest}`)
77
+ return true
78
+ }
79
+ else {
80
+ console.log(`⚠️ 未找到 patch 文件,请手动创建 ${dest}`)
81
+ return false
82
+ }
83
+ }
84
+
85
+ // pnpm 应用 patch 文件
86
+ function setupPnpmPatch() {
87
+ try {
88
+ const packageJsonPath = 'package.json'
89
+ if (!fs.existsSync(packageJsonPath)) {
90
+ console.log('⚠️ 未找到 package.json')
91
+ return false
92
+ }
93
+
94
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
95
+
96
+ // 检查是否已经有 pnpm.patchedDependencies 配置
97
+ if (packageJson.pnpm?.patchedDependencies?.['quill@2.0.3']) {
98
+ console.log('✅ pnpm patchedDependencies 已配置')
99
+ return true
100
+ }
101
+
102
+ // 添加 pnpm.patchedDependencies 配置
103
+ if (!packageJson.pnpm) {
104
+ packageJson.pnpm = {}
105
+ }
106
+
107
+ if (!packageJson.pnpm.patchedDependencies) {
108
+ packageJson.pnpm.patchedDependencies = {}
109
+ }
110
+
111
+ packageJson.pnpm.patchedDependencies['quill@2.0.3'] = 'patches/quill@2.0.3.patch'
112
+
113
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2))
114
+ console.log('✅ 已添加 pnpm patchedDependencies 配置')
115
+
116
+ try {
117
+ execSync('pnpm install', { stdio: 'inherit' })
118
+ console.log('✅ pnpm patch quill@2.0.3 应用成功!')
119
+ }
120
+ catch (error) {
121
+ console.warn('❌ pnpm patch 命令执行失败:', error.message)
122
+ }
123
+
124
+ return true
125
+ }
126
+ catch (error) {
127
+ console.error('❌ pnpm 补丁配置失败:', error.message)
128
+ return false
129
+ }
130
+ }
131
+
132
+ // npm、yarn 应用 patch 文件
133
+ function applyPatchPackage() {
134
+ try {
135
+ const packageManager = detectPackageManager()
136
+
137
+ // 检查 patch-package 是否安装
138
+ let patchPackageInstalled = false
139
+ try {
140
+ require.resolve('patch-package')
141
+ patchPackageInstalled = true
142
+ }
143
+ catch (e) {
144
+ // patch-package 未安装
145
+ }
146
+
147
+ if (!patchPackageInstalled) {
148
+ console.log('📦 正在安装 patch-package...')
149
+ try {
150
+ const installCommand = packageManager === 'yarn' ? 'yarn add --dev patch-package' : 'npm install --save-dev patch-package'
151
+ execSync(installCommand, { stdio: 'inherit' })
152
+ console.log('✅ patch-package 安装成功')
153
+ }
154
+ catch (error) {
155
+ console.error('❌ patch-package 安装失败:', error.message)
156
+ return false
157
+ }
158
+ }
159
+
160
+ // 应用补丁
161
+ console.log('🔄 正在应用 patch...')
162
+ try {
163
+ execSync('npx patch-package', { stdio: 'inherit' })
164
+ console.log('✅ 补丁应用成功')
165
+ }
166
+ catch (error) {
167
+ console.error('❌ 补丁应用失败:', error.message)
168
+ return false
169
+ }
170
+
171
+ // 添加 postinstall 脚本
172
+ const packageJsonPath = 'package.json'
173
+ const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
174
+
175
+ if (!packageJson.scripts) {
176
+ packageJson.scripts = {}
177
+ }
178
+
179
+ if (!packageJson.scripts.postinstall || !packageJson.scripts.postinstall.includes('patch-package')) {
180
+ const existingPostinstall = packageJson.scripts.postinstall || ''
181
+ packageJson.scripts.postinstall = existingPostinstall ? `${existingPostinstall} && npx patch-package` : 'npx patch-package'
182
+
183
+ fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2))
184
+ console.log('✅ 已更新 postinstall 脚本')
185
+ }
186
+
187
+ return true
188
+ }
189
+ catch (error) {
190
+ console.error('❌ patch-package 应用失败:', error.message)
191
+ return false
192
+ }
193
+ }
194
+
195
+ function handlePatchFailure() {
196
+ console.log(`
197
+ ❌ 补丁处理失败,请尝试手动安装
198
+
199
+ 🔧 手动安装:
200
+ 在项目根目录执行:
201
+ node node_modules/@opentiny/fluent-editor/scripts/apply-patches.cjs
202
+
203
+ ⚠️ 注意:未应用补丁可能影响中文输入体验
204
+ `)
205
+ }
206
+
207
+ function applyQuillPatch() {
208
+ const packageManager = detectPackageManager()
209
+ console.log(`🔍 检测到包管理器: ${packageManager}`)
210
+ console.log('📋 准备 patch 文件...')
211
+
212
+ if (!copyPatchFile()) return handlePatchFailure()
213
+
214
+ let strategy
215
+ if (packageManager == 'pnpm') {
216
+ strategy = {
217
+ label: '📦 使用 pnpm 补丁策略...',
218
+ handler: setupPnpmPatch,
219
+ successMsg: '✅ quill@2.0.3.patch 补丁配置已完成',
220
+ }
221
+ }
222
+ else {
223
+ strategy = {
224
+ label: '📦 使用 patch-package 补丁策略...',
225
+ handler: applyPatchPackage,
226
+ successMsg: '🎉 补丁处理完成',
227
+ }
228
+ }
229
+
230
+ if (!strategy) {
231
+ console.log('❌ 不支持的包管理器,仅支持 pnpm、yarn、npm')
232
+ handlePatchFailure()
233
+ return
234
+ }
235
+
236
+ console.log(strategy.label)
237
+ // 调用处理函数
238
+ const success = strategy.handler()
239
+
240
+ if (success) {
241
+ console.log(strategy.successMsg)
242
+ }
243
+ else {
244
+ handlePatchFailure()
245
+ }
246
+ }
247
+
248
+ applyQuillPatch()
package/style.css CHANGED
@@ -2966,7 +2966,6 @@ li.unchecked > .ql-ui {
2966
2966
  position: relative;
2967
2967
  border: solid 1px #adb0b8;
2968
2968
  /* Set dropdown font-families */
2969
- /* Set Dropdown font-size */
2970
2969
  }
2971
2970
  .ql-toolbar .ql-font {
2972
2971
  width: 98px;
@@ -3009,6 +3008,9 @@ li.unchecked > .ql-ui {
3009
3008
  .ql-toolbar .ql-font .ql-picker-options {
3010
3009
  color: #8a8e99;
3011
3010
  }
3011
+ .ql-toolbar {
3012
+ /* Set Dropdown font-size */
3013
+ }
3012
3014
  .ql-toolbar .ql-size {
3013
3015
  width: 98px;
3014
3016
  }
@@ -58,6 +58,8 @@ export declare const EN_US: {
58
58
  strike: string;
59
59
  image: string;
60
60
  file: string;
61
+ 'mind-map': string;
62
+ 'flow-chart': string;
61
63
  link: string;
62
64
  code: string;
63
65
  table: string;
@@ -58,6 +58,8 @@ export declare const ZH_CN: {
58
58
  strike: string;
59
59
  image: string;
60
60
  file: string;
61
+ 'mind-map': string;
62
+ 'flow-chart': string;
61
63
  link: string;
62
64
  divider: string;
63
65
  code: string;
@@ -3,6 +3,8 @@ import { I18NOptions, ICounterOption, MentionOption, ShortCutKeyInputOptions } f
3
3
  import { BlotFormatterOptionsInput } from '../../modules/custom-image/options';
4
4
  import { FileUploaderOptions } from '../../modules/custom-uploader';
5
5
  import { EmojiModuleOptions } from '../../modules/emoji';
6
+ import { FlowChartOptions } from '../../modules/flow-chart/options';
7
+ import { MindMapOptions } from '../../modules/mind-map/options';
6
8
  export type ToolbarOptions = {
7
9
  container?: HTMLElement | (Record<string, any>[] | string[] | (string | Record<string, any>)[])[];
8
10
  } & ToolbarProps;
@@ -38,4 +40,6 @@ export interface IEditorModules {
38
40
  'file'?: boolean;
39
41
  'mathlive'?: boolean;
40
42
  'image'?: boolean | Partial<BlotFormatterOptionsInput>;
43
+ 'mind-map'?: boolean | Partial<MindMapOptions>;
44
+ 'flow-chart'?: boolean | Partial<FlowChartOptions>;
41
45
  }
@@ -1,7 +1,7 @@
1
1
  import { default as QuillCursors } from 'quill-cursors';
2
2
  import { Awareness } from 'y-protocols/awareness';
3
3
  import { default as FluentEditor } from '../../../core/fluent-editor';
4
- import * as Y from 'yjs';
4
+ import type * as Y from 'yjs';
5
5
  export interface AwarenessState {
6
6
  name?: string;
7
7
  color?: string;
@@ -25,4 +25,4 @@ export interface AwarenessOptions {
25
25
  timeout?: number | undefined;
26
26
  }
27
27
  export declare function setupAwareness(options?: AwarenessOptions, defaultAwareness?: Awareness): Awareness | null;
28
- export declare function bindAwarenessToCursors(awareness: Awareness, cursorsModule: QuillCursors, quill: FluentEditor, yText: Y.Text): (() => void) | void;
28
+ export declare function bindAwarenessToCursors(awareness: Awareness, cursorsModule: QuillCursors, quill: FluentEditor, yText: Y.Text, Yjs: typeof Y): (() => void) | void;
@@ -1,2 +1,3 @@
1
- import { Doc } from 'yjs';
2
- export declare function setupIndexedDB(doc: Doc): () => void;
1
+ import { IndexeddbPersistence } from 'y-indexeddb';
2
+ import type * as Y from 'yjs';
3
+ export declare function setupIndexedDB(doc: Y.Doc, IndexeddbPersistenceClass?: typeof IndexeddbPersistence): () => void;
@@ -1,9 +1,9 @@
1
+ import { default as QuillCursors } from 'quill-cursors';
2
+ import { Awareness } from 'y-protocols/awareness';
1
3
  import { default as FluentEditor } from '../../fluent-editor';
2
4
  import { UnifiedProvider } from './provider/providerRegistry';
3
5
  import { YjsOptions } from './types';
4
- import { default as QuillCursors } from 'quill-cursors';
5
- import { Awareness } from 'y-protocols/awareness';
6
- import * as Y from 'yjs';
6
+ import type * as Y from 'yjs';
7
7
  export declare class CollaborativeEditor {
8
8
  quill: FluentEditor;
9
9
  options: YjsOptions;
@@ -13,6 +13,7 @@ export declare class CollaborativeEditor {
13
13
  private cursors;
14
14
  private cleanupBindings;
15
15
  private clearIndexedDB;
16
+ private deps;
16
17
  constructor(quill: FluentEditor, options: YjsOptions);
17
18
  getAwareness(): Awareness;
18
19
  getProvider(): UnifiedProvider;
@@ -1,5 +1,5 @@
1
1
  import { Awareness } from 'y-protocols/awareness';
2
- import { ProviderEventHandlers } from '../types';
2
+ import { CollaborativeEditingDeps, ProviderEventHandlers } from '../types';
3
3
  import type * as Y from 'yjs';
4
4
  export type ProviderRegistry = Record<string, ProviderConstructor>;
5
5
  export type ProviderConstructor<T = any> = new (props: ProviderConstructorProps<T>) => UnifiedProvider;
@@ -7,6 +7,7 @@ export type ProviderConstructorProps<T = any> = {
7
7
  options: T;
8
8
  awareness?: Awareness;
9
9
  doc?: Y.Doc;
10
+ deps?: CollaborativeEditingDeps;
10
11
  } & ProviderEventHandlers;
11
12
  export interface UnifiedProvider extends ProviderEventHandlers {
12
13
  awareness: Awareness;