@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.
- package/es/config/editor.utils.es.js.map +1 -1
- package/es/config/i18n/en-us.es.js +2 -0
- package/es/config/i18n/en-us.es.js.map +1 -1
- package/es/config/i18n/zh-cn.es.js +2 -0
- package/es/config/i18n/zh-cn.es.js.map +1 -1
- package/es/config/index.es.js.map +1 -1
- package/es/core/fluent-editor.es.js.map +1 -1
- package/es/fluent-editor.es.js +17 -13
- package/es/fluent-editor.es.js.map +1 -1
- package/es/formats/soft-break.es.js.map +1 -1
- package/es/formats/video.es.js.map +1 -1
- package/es/index.es.js +4 -0
- package/es/index.es.js.map +1 -1
- package/es/modules/ai/constants.es.js.map +1 -1
- package/es/modules/ai/index.es.js +1 -1
- package/es/modules/ai/index.es.js.map +1 -1
- package/es/modules/collaborative-editing/awareness/awareness.es.js +6 -7
- package/es/modules/collaborative-editing/awareness/awareness.es.js.map +1 -1
- package/es/modules/collaborative-editing/awareness/y-indexeddb.es.js +7 -3
- package/es/modules/collaborative-editing/awareness/y-indexeddb.es.js.map +1 -1
- package/es/modules/collaborative-editing/collaborative-editing.es.js +13 -8
- package/es/modules/collaborative-editing/collaborative-editing.es.js.map +1 -1
- package/es/modules/collaborative-editing/module.es.js.map +1 -1
- package/es/modules/collaborative-editing/provider/providerRegistry.es.js.map +1 -1
- package/es/modules/collaborative-editing/provider/webrtc.es.js +8 -4
- package/es/modules/collaborative-editing/provider/webrtc.es.js.map +1 -1
- package/es/modules/collaborative-editing/provider/websocket.es.js +6 -4
- package/es/modules/collaborative-editing/provider/websocket.es.js.map +1 -1
- package/es/modules/counter.es.js.map +1 -1
- package/es/modules/custom-clipboard.es.js.map +1 -1
- package/es/modules/custom-image/actions/action.es.js.map +1 -1
- package/es/modules/custom-image/actions/custom-resize-action.es.js.map +1 -1
- package/es/modules/custom-image/actions/delete-action.es.js.map +1 -1
- package/es/modules/custom-image/actions/image-toolbar-buttons.es.js +1 -1
- package/es/modules/custom-image/actions/image-toolbar-buttons.es.js.map +1 -1
- package/es/modules/custom-image/actions/toolbar-action.es.js.map +1 -1
- package/es/modules/custom-image/actions/toolbar.es.js.map +1 -1
- package/es/modules/custom-image/blot-formatter.es.js.map +1 -1
- package/es/modules/custom-image/image.es.js.map +1 -1
- package/es/modules/custom-image/options.es.js.map +1 -1
- package/es/modules/custom-image/specs/blot-spec.es.js.map +1 -1
- package/es/modules/custom-image/specs/custom-image-spec.es.js.map +1 -1
- package/es/modules/custom-image/specs/image-spec.es.js.map +1 -1
- package/es/modules/custom-uploader.es.js.map +1 -1
- package/es/modules/divider.es.js.map +1 -1
- package/es/modules/emoji.es.js.map +1 -1
- package/es/modules/file/formats/file.es.js.map +1 -1
- package/es/modules/file/modules/file-bar.es.js.map +1 -1
- package/es/modules/file/modules/file-module.es.js.map +1 -1
- package/es/modules/flow-chart/config-utils.es.js +102 -0
- package/es/modules/flow-chart/config-utils.es.js.map +1 -0
- package/es/modules/flow-chart/formats/flow-chart-blot.es.js +369 -0
- package/es/modules/flow-chart/formats/flow-chart-blot.es.js.map +1 -0
- package/es/modules/flow-chart/i18n/en-us.es.js +30 -0
- package/es/modules/flow-chart/i18n/en-us.es.js.map +1 -0
- package/es/modules/flow-chart/i18n/index.es.js +12 -0
- package/es/modules/flow-chart/i18n/index.es.js.map +1 -0
- package/es/modules/flow-chart/i18n/zh-cn.es.js +30 -0
- package/es/modules/flow-chart/i18n/zh-cn.es.js.map +1 -0
- package/es/modules/flow-chart/icons.es.js +27 -0
- package/es/modules/flow-chart/icons.es.js.map +1 -0
- package/es/modules/flow-chart/index.es.js +45 -0
- package/es/modules/flow-chart/index.es.js.map +1 -0
- package/es/modules/flow-chart/modules/context-menu.es.js +184 -0
- package/es/modules/flow-chart/modules/context-menu.es.js.map +1 -0
- package/es/modules/flow-chart/modules/control-panel.es.js +286 -0
- package/es/modules/flow-chart/modules/control-panel.es.js.map +1 -0
- package/es/modules/flow-chart/modules/custom-resize-action.es.js +150 -0
- package/es/modules/flow-chart/modules/custom-resize-action.es.js.map +1 -0
- package/es/modules/i18n.es.js.map +1 -1
- package/es/modules/index.es.js +4 -0
- package/es/modules/index.es.js.map +1 -1
- package/es/modules/link/formats/link.es.js.map +1 -1
- package/es/modules/link/modules/tooltip.es.js.map +1 -1
- package/es/modules/mathlive/formats.es.js.map +1 -1
- package/es/modules/mathlive/module.es.js.map +1 -1
- package/es/modules/mathlive/tooltip.es.js.map +1 -1
- package/es/modules/mention/mention-link.es.js.map +1 -1
- package/es/modules/mention/mention.es.js.map +1 -1
- package/es/modules/mind-map/config-utils.es.js +108 -0
- package/es/modules/mind-map/config-utils.es.js.map +1 -0
- package/es/modules/mind-map/formats/mind-map-blot.es.js +356 -0
- package/es/modules/mind-map/formats/mind-map-blot.es.js.map +1 -0
- package/es/modules/mind-map/i18n/en-us.es.js +29 -0
- package/es/modules/mind-map/i18n/en-us.es.js.map +1 -0
- package/es/modules/mind-map/i18n/index.es.js +12 -0
- package/es/modules/mind-map/i18n/index.es.js.map +1 -0
- package/es/modules/mind-map/i18n/zh-cn.es.js +29 -0
- package/es/modules/mind-map/i18n/zh-cn.es.js.map +1 -0
- package/es/modules/mind-map/icons.es.js +45 -0
- package/es/modules/mind-map/icons.es.js.map +1 -0
- package/es/modules/mind-map/index.es.js +56 -0
- package/es/modules/mind-map/index.es.js.map +1 -0
- package/es/modules/mind-map/modules/context-menu.es.js +128 -0
- package/es/modules/mind-map/modules/context-menu.es.js.map +1 -0
- package/es/modules/mind-map/modules/control-panel.es.js +425 -0
- package/es/modules/mind-map/modules/control-panel.es.js.map +1 -0
- package/es/modules/mind-map/modules/custom-resize-action.es.js +161 -0
- package/es/modules/mind-map/modules/custom-resize-action.es.js.map +1 -0
- package/es/modules/shortcut-key/index.es.js +16 -0
- package/es/modules/shortcut-key/index.es.js.map +1 -1
- package/es/modules/syntax.es.js.map +1 -1
- package/es/modules/table-up/index.es.js.map +1 -1
- package/es/modules/toolbar/better-picker.es.js.map +1 -1
- package/es/modules/toolbar/better-toolbar.es.js.map +1 -1
- package/es/modules/toolbar/toolbar-tip.es.js.map +1 -1
- package/es/themes/snow.es.js.map +1 -1
- package/es/tools/format-painter.es.js.map +1 -1
- package/es/tools/fullscreen.es.js.map +1 -1
- package/es/tools/screenshot.es.js.map +1 -1
- package/es/ui/icons.config.es.js +4 -0
- package/es/ui/icons.config.es.js.map +1 -1
- package/es/ui/icons.es.js +4 -2
- package/es/ui/icons.es.js.map +1 -1
- package/es/utils/debounce.es.js.map +1 -1
- package/es/utils/image.es.js.map +1 -1
- package/es/utils/is.es.js.map +1 -1
- package/es/utils/method.es.js.map +1 -1
- package/es/utils/scroll-lock.es.js.map +1 -1
- package/flow-chart.css +185 -0
- package/lib/config/editor.utils.cjs.js.map +1 -1
- package/lib/config/i18n/en-us.cjs.js +2 -0
- package/lib/config/i18n/en-us.cjs.js.map +1 -1
- package/lib/config/i18n/zh-cn.cjs.js +2 -0
- package/lib/config/i18n/zh-cn.cjs.js.map +1 -1
- package/lib/config/index.cjs.js.map +1 -1
- package/lib/core/fluent-editor.cjs.js.map +1 -1
- package/lib/fluent-editor.cjs.js +23 -19
- package/lib/fluent-editor.cjs.js.map +1 -1
- package/lib/formats/soft-break.cjs.js.map +1 -1
- package/lib/formats/video.cjs.js.map +1 -1
- package/lib/index.cjs.js +9 -5
- package/lib/index.cjs.js.map +1 -1
- package/lib/modules/ai/constants.cjs.js.map +1 -1
- package/lib/modules/ai/index.cjs.js.map +1 -1
- package/lib/modules/collaborative-editing/awareness/awareness.cjs.js +6 -24
- package/lib/modules/collaborative-editing/awareness/awareness.cjs.js.map +1 -1
- package/lib/modules/collaborative-editing/awareness/y-indexeddb.cjs.js +7 -3
- package/lib/modules/collaborative-editing/awareness/y-indexeddb.cjs.js.map +1 -1
- package/lib/modules/collaborative-editing/collaborative-editing.cjs.js +19 -31
- package/lib/modules/collaborative-editing/collaborative-editing.cjs.js.map +1 -1
- package/lib/modules/collaborative-editing/module.cjs.js.map +1 -1
- package/lib/modules/collaborative-editing/provider/providerRegistry.cjs.js.map +1 -1
- package/lib/modules/collaborative-editing/provider/webrtc.cjs.js +10 -23
- package/lib/modules/collaborative-editing/provider/webrtc.cjs.js.map +1 -1
- package/lib/modules/collaborative-editing/provider/websocket.cjs.js +10 -25
- package/lib/modules/collaborative-editing/provider/websocket.cjs.js.map +1 -1
- package/lib/modules/counter.cjs.js.map +1 -1
- package/lib/modules/custom-clipboard.cjs.js.map +1 -1
- package/lib/modules/custom-image/actions/action.cjs.js.map +1 -1
- package/lib/modules/custom-image/actions/custom-resize-action.cjs.js.map +1 -1
- package/lib/modules/custom-image/actions/delete-action.cjs.js.map +1 -1
- package/lib/modules/custom-image/actions/image-toolbar-buttons.cjs.js.map +1 -1
- package/lib/modules/custom-image/actions/toolbar-action.cjs.js.map +1 -1
- package/lib/modules/custom-image/actions/toolbar.cjs.js.map +1 -1
- package/lib/modules/custom-image/blot-formatter.cjs.js.map +1 -1
- package/lib/modules/custom-image/image.cjs.js.map +1 -1
- package/lib/modules/custom-image/options.cjs.js.map +1 -1
- package/lib/modules/custom-image/specs/blot-spec.cjs.js.map +1 -1
- package/lib/modules/custom-image/specs/custom-image-spec.cjs.js.map +1 -1
- package/lib/modules/custom-image/specs/image-spec.cjs.js.map +1 -1
- package/lib/modules/custom-uploader.cjs.js.map +1 -1
- package/lib/modules/divider.cjs.js.map +1 -1
- package/lib/modules/emoji.cjs.js.map +1 -1
- package/lib/modules/file/formats/file.cjs.js.map +1 -1
- package/lib/modules/file/modules/file-bar.cjs.js.map +1 -1
- package/lib/modules/file/modules/file-module.cjs.js.map +1 -1
- package/lib/modules/flow-chart/config-utils.cjs.js +102 -0
- package/lib/modules/flow-chart/config-utils.cjs.js.map +1 -0
- package/lib/modules/flow-chart/formats/flow-chart-blot.cjs.js +369 -0
- package/lib/modules/flow-chart/formats/flow-chart-blot.cjs.js.map +1 -0
- package/lib/modules/flow-chart/i18n/en-us.cjs.js +30 -0
- package/lib/modules/flow-chart/i18n/en-us.cjs.js.map +1 -0
- package/lib/modules/flow-chart/i18n/index.cjs.js +12 -0
- package/lib/modules/flow-chart/i18n/index.cjs.js.map +1 -0
- package/lib/modules/flow-chart/i18n/zh-cn.cjs.js +30 -0
- package/lib/modules/flow-chart/i18n/zh-cn.cjs.js.map +1 -0
- package/lib/modules/flow-chart/icons.cjs.js +27 -0
- package/lib/modules/flow-chart/icons.cjs.js.map +1 -0
- package/lib/modules/flow-chart/index.cjs.js +45 -0
- package/lib/modules/flow-chart/index.cjs.js.map +1 -0
- package/lib/modules/flow-chart/modules/context-menu.cjs.js +184 -0
- package/lib/modules/flow-chart/modules/context-menu.cjs.js.map +1 -0
- package/lib/modules/flow-chart/modules/control-panel.cjs.js +286 -0
- package/lib/modules/flow-chart/modules/control-panel.cjs.js.map +1 -0
- package/lib/modules/flow-chart/modules/custom-resize-action.cjs.js +150 -0
- package/lib/modules/flow-chart/modules/custom-resize-action.cjs.js.map +1 -0
- package/lib/modules/i18n.cjs.js.map +1 -1
- package/lib/modules/index.cjs.js +9 -5
- package/lib/modules/index.cjs.js.map +1 -1
- package/lib/modules/link/formats/link.cjs.js.map +1 -1
- package/lib/modules/link/modules/tooltip.cjs.js.map +1 -1
- package/lib/modules/mathlive/formats.cjs.js.map +1 -1
- package/lib/modules/mathlive/module.cjs.js.map +1 -1
- package/lib/modules/mathlive/tooltip.cjs.js.map +1 -1
- package/lib/modules/mention/mention-link.cjs.js.map +1 -1
- package/lib/modules/mention/mention.cjs.js.map +1 -1
- package/lib/modules/mind-map/config-utils.cjs.js +108 -0
- package/lib/modules/mind-map/config-utils.cjs.js.map +1 -0
- package/lib/modules/mind-map/formats/mind-map-blot.cjs.js +356 -0
- package/lib/modules/mind-map/formats/mind-map-blot.cjs.js.map +1 -0
- package/lib/modules/mind-map/i18n/en-us.cjs.js +29 -0
- package/lib/modules/mind-map/i18n/en-us.cjs.js.map +1 -0
- package/lib/modules/mind-map/i18n/index.cjs.js +12 -0
- package/lib/modules/mind-map/i18n/index.cjs.js.map +1 -0
- package/lib/modules/mind-map/i18n/zh-cn.cjs.js +29 -0
- package/lib/modules/mind-map/i18n/zh-cn.cjs.js.map +1 -0
- package/lib/modules/mind-map/icons.cjs.js +45 -0
- package/lib/modules/mind-map/icons.cjs.js.map +1 -0
- package/lib/modules/mind-map/index.cjs.js +56 -0
- package/lib/modules/mind-map/index.cjs.js.map +1 -0
- package/lib/modules/mind-map/modules/context-menu.cjs.js +128 -0
- package/lib/modules/mind-map/modules/context-menu.cjs.js.map +1 -0
- package/lib/modules/mind-map/modules/control-panel.cjs.js +425 -0
- package/lib/modules/mind-map/modules/control-panel.cjs.js.map +1 -0
- package/lib/modules/mind-map/modules/custom-resize-action.cjs.js +161 -0
- package/lib/modules/mind-map/modules/custom-resize-action.cjs.js.map +1 -0
- package/lib/modules/shortcut-key/index.cjs.js +16 -0
- package/lib/modules/shortcut-key/index.cjs.js.map +1 -1
- package/lib/modules/syntax.cjs.js.map +1 -1
- package/lib/modules/table-up/index.cjs.js.map +1 -1
- package/lib/modules/toolbar/better-picker.cjs.js.map +1 -1
- package/lib/modules/toolbar/better-toolbar.cjs.js.map +1 -1
- package/lib/modules/toolbar/toolbar-tip.cjs.js.map +1 -1
- package/lib/themes/snow.cjs.js.map +1 -1
- package/lib/tools/format-painter.cjs.js.map +1 -1
- package/lib/tools/fullscreen.cjs.js.map +1 -1
- package/lib/tools/screenshot.cjs.js.map +1 -1
- package/lib/ui/icons.cjs.js +3 -1
- package/lib/ui/icons.cjs.js.map +1 -1
- package/lib/ui/icons.config.cjs.js +4 -0
- package/lib/ui/icons.config.cjs.js.map +1 -1
- package/lib/utils/debounce.cjs.js.map +1 -1
- package/lib/utils/image.cjs.js.map +1 -1
- package/lib/utils/is.cjs.js.map +1 -1
- package/lib/utils/method.cjs.js.map +1 -1
- package/lib/utils/scroll-lock.cjs.js.map +1 -1
- package/mind-map.css +224 -0
- package/package.json +1 -34
- package/patches/quill@2.0.3.patch +33 -0
- package/scripts/apply-patches.cjs +248 -0
- package/style.css +3 -1
- package/types/config/i18n/en-us.d.ts +2 -0
- package/types/config/i18n/zh-cn.d.ts +2 -0
- package/types/config/types/editor-modules.interface.d.ts +4 -0
- package/types/modules/collaborative-editing/awareness/awareness.d.ts +2 -2
- package/types/modules/collaborative-editing/awareness/y-indexeddb.d.ts +3 -2
- package/types/modules/collaborative-editing/collaborative-editing.d.ts +4 -3
- package/types/modules/collaborative-editing/provider/providerRegistry.d.ts +2 -1
- package/types/modules/collaborative-editing/provider/webrtc.d.ts +5 -4
- package/types/modules/collaborative-editing/provider/websocket.d.ts +6 -5
- package/types/modules/collaborative-editing/types.d.ts +17 -1
- package/types/modules/flow-chart/config-utils.d.ts +10 -0
- package/types/modules/flow-chart/formats/flow-chart-blot.d.ts +43 -0
- package/types/modules/flow-chart/i18n/en-us.d.ts +26 -0
- package/types/modules/flow-chart/i18n/index.d.ts +1 -0
- package/types/modules/flow-chart/i18n/zh-cn.d.ts +26 -0
- package/types/modules/flow-chart/icons.d.ts +12 -0
- package/types/modules/flow-chart/index.d.ts +10 -0
- package/types/modules/flow-chart/modules/context-menu.d.ts +3 -0
- package/types/modules/flow-chart/modules/control-panel.d.ts +3 -0
- package/types/modules/flow-chart/modules/custom-resize-action.d.ts +22 -0
- package/types/modules/flow-chart/options.d.ts +29 -0
- package/types/modules/index.d.ts +2 -0
- package/types/modules/mind-map/config-utils.d.ts +12 -0
- package/types/modules/mind-map/formats/mind-map-blot.d.ts +44 -0
- package/types/modules/mind-map/i18n/en-us.d.ts +25 -0
- package/types/modules/mind-map/i18n/index.d.ts +1 -0
- package/types/modules/mind-map/i18n/zh-cn.d.ts +25 -0
- package/types/modules/mind-map/icons.d.ts +21 -0
- package/types/modules/mind-map/index.d.ts +10 -0
- package/types/modules/mind-map/modules/context-menu.d.ts +3 -0
- package/types/modules/mind-map/modules/control-panel.d.ts +3 -0
- package/types/modules/mind-map/modules/custom-resize-action.d.ts +23 -0
- package/types/modules/mind-map/options.d.ts +27 -0
- 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,
|
|
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.
|
|
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
|
}
|
|
@@ -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 {
|
|
2
|
-
|
|
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
|
|
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;
|