@opentiny/fluent-editor 3.20.3 → 3.20.4-alpha.0

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 (147) hide show
  1. package/es/config/editor.utils.es.js +7 -0
  2. package/es/config/editor.utils.es.js.map +1 -1
  3. package/es/config/icons.config.es.js +6 -0
  4. package/es/config/icons.config.es.js.map +1 -1
  5. package/es/config/index.es.js +6 -3
  6. package/es/config/index.es.js.map +1 -1
  7. package/es/config/types/editor-toolbar.interface.es.js +2 -0
  8. package/es/config/types/editor-toolbar.interface.es.js.map +1 -0
  9. package/es/config/types/index.es.js +1 -0
  10. package/es/config/types/index.es.js.map +1 -1
  11. package/es/custom-image/BlotFormatter.es.js +0 -1
  12. package/es/custom-image/BlotFormatter.es.js.map +1 -1
  13. package/es/fluent-editor.es.js +7 -6
  14. package/es/fluent-editor.es.js.map +1 -1
  15. package/es/fullscreen/handler.es.js +51 -0
  16. package/es/fullscreen/handler.es.js.map +1 -0
  17. package/es/index.es.js +3 -2
  18. package/es/link/formats/link.es.js +11 -6
  19. package/es/link/formats/link.es.js.map +1 -1
  20. package/es/link/index.es.js +3 -3
  21. package/es/link/index.es.js.map +1 -1
  22. package/es/link/modules/tooltip.es.js +22 -7
  23. package/es/link/modules/tooltip.es.js.map +1 -1
  24. package/lib/config/editor.utils.cjs.js +7 -0
  25. package/lib/config/editor.utils.cjs.js.map +1 -1
  26. package/lib/config/icons.config.cjs.js +6 -0
  27. package/lib/config/icons.config.cjs.js.map +1 -1
  28. package/lib/config/index.cjs.js +4 -1
  29. package/lib/config/index.cjs.js.map +1 -1
  30. package/lib/config/types/editor-toolbar.interface.cjs.js +2 -0
  31. package/lib/config/types/editor-toolbar.interface.cjs.js.map +1 -0
  32. package/lib/config/types/index.cjs.js +1 -0
  33. package/lib/config/types/index.cjs.js.map +1 -1
  34. package/lib/custom-image/BlotFormatter.cjs.js +0 -1
  35. package/lib/custom-image/BlotFormatter.cjs.js.map +1 -1
  36. package/lib/fluent-editor.cjs.js +7 -6
  37. package/lib/fluent-editor.cjs.js.map +1 -1
  38. package/lib/fullscreen/handler.cjs.js +51 -0
  39. package/lib/fullscreen/handler.cjs.js.map +1 -0
  40. package/lib/index.cjs.js +1 -0
  41. package/lib/index.cjs.js.map +1 -1
  42. package/lib/link/formats/link.cjs.js +10 -5
  43. package/lib/link/formats/link.cjs.js.map +1 -1
  44. package/lib/link/index.cjs.js +3 -3
  45. package/lib/link/index.cjs.js.map +1 -1
  46. package/lib/link/modules/tooltip.cjs.js +24 -9
  47. package/lib/link/modules/tooltip.cjs.js.map +1 -1
  48. package/package.json +4 -2
  49. package/style.css +28 -0
  50. package/types/attributors/index.d.ts +4 -0
  51. package/types/config/base64-image.d.ts +3 -0
  52. package/types/config/editor.config.d.ts +95 -0
  53. package/types/config/editor.utils.d.ts +42 -0
  54. package/types/config/i18n/en-us.d.ts +86 -0
  55. package/types/config/i18n/zh-cn.d.ts +86 -0
  56. package/types/config/icons.config.d.ts +34 -0
  57. package/types/config/index.d.ts +49 -0
  58. package/types/config/types/additional-toolbar-item.interface.d.ts +8 -0
  59. package/types/config/types/content-change.interface.d.ts +13 -0
  60. package/types/config/types/content-save.interface.d.ts +6 -0
  61. package/types/config/types/counter-option.interface.d.ts +9 -0
  62. package/types/config/types/editor-config.interface.d.ts +21 -0
  63. package/types/config/types/editor-modules.interface.d.ts +31 -0
  64. package/types/config/types/editor-toolbar.interface.d.ts +6 -0
  65. package/types/config/types/file-operation.interface.d.ts +12 -0
  66. package/types/config/types/focus-change.interface.d.ts +4 -0
  67. package/types/config/types/fullscreen-module.interface.d.ts +4 -0
  68. package/types/config/types/help-panel-item.interface.d.ts +5 -0
  69. package/types/config/types/help-panel-option.interface.d.ts +7 -0
  70. package/types/config/types/image-module.interface.d.ts +3 -0
  71. package/types/config/types/image-upload.interface.d.ts +7 -0
  72. package/types/config/types/index.d.ts +23 -0
  73. package/types/config/types/load-on-demand-module.interface.d.ts +5 -0
  74. package/types/config/types/mention-module.interface.d.ts +8 -0
  75. package/types/config/types/paste-change.interface.d.ts +6 -0
  76. package/types/config/types/quick-menu-module.interface.d.ts +3 -0
  77. package/types/config/types/range.interface.d.ts +4 -0
  78. package/types/config/types/registry-options.interface.d.ts +5 -0
  79. package/types/config/types/selection-change.interface.d.ts +8 -0
  80. package/types/config/types/toolbar-item.interface.d.ts +13 -0
  81. package/types/config/types/type.d.ts +5 -0
  82. package/types/config/types/validate-error.interface.d.ts +13 -0
  83. package/types/counter/index.d.ts +12 -0
  84. package/types/custom-clipboard.d.ts +26 -0
  85. package/types/custom-image/BlotFormatter.d.ts +24 -0
  86. package/types/custom-image/Options.d.ts +36 -0
  87. package/types/custom-image/actions/Action.d.ts +7 -0
  88. package/types/custom-image/actions/CustomResizeAction.d.ts +24 -0
  89. package/types/custom-image/actions/DeleteAction.d.ts +7 -0
  90. package/types/custom-image/image.d.ts +28 -0
  91. package/types/custom-image/specs/BlotSpec.d.ts +13 -0
  92. package/types/custom-image/specs/CustomImageSpec.d.ts +21 -0
  93. package/types/custom-image/specs/ImageSpec.d.ts +10 -0
  94. package/types/custom-uploader.d.ts +30 -0
  95. package/types/emoji/emoji-list/index.d.ts +1 -0
  96. package/types/emoji/emoji-list/people.d.ts +1 -0
  97. package/types/emoji/emoji-list.d.ts +2 -0
  98. package/types/emoji/emoji-map.d.ts +2 -0
  99. package/types/emoji/formats/emoji-blot.d.ts +13 -0
  100. package/types/emoji/index.d.ts +10 -0
  101. package/types/emoji/modules/emoji.d.ts +38 -0
  102. package/types/emoji/modules/toolbar-emoji.d.ts +8 -0
  103. package/types/emoji/utils.d.ts +1 -0
  104. package/types/file/formats/file.d.ts +15 -0
  105. package/types/file/index.d.ts +11 -0
  106. package/types/file/modules/file-bar.d.ts +14 -0
  107. package/types/fluent-editor.d.ts +9 -0
  108. package/types/format-painter/index.d.ts +15 -0
  109. package/types/fullscreen/handler.d.ts +3 -0
  110. package/types/global-link/constants.d.ts +3 -0
  111. package/types/global-link/formats/customer-widget-link.d.ts +14 -0
  112. package/types/global-link/formats/doc-link.d.ts +17 -0
  113. package/types/global-link/formats/wiki-link.d.ts +16 -0
  114. package/types/global-link/formats/work-item-link.d.ts +16 -0
  115. package/types/global-link/global-link-panel.d.ts +19 -0
  116. package/types/global-link/index.d.ts +18 -0
  117. package/types/global-link/utils/createTable.d.ts +1 -0
  118. package/types/index.d.ts +4 -0
  119. package/types/link/formats/link.d.ts +16 -0
  120. package/types/link/index.d.ts +6 -0
  121. package/types/link/modules/tooltip.d.ts +32 -0
  122. package/types/mention/Mention.d.ts +56 -0
  123. package/types/mention/MentionLink.d.ts +18 -0
  124. package/types/mention/constants.d.ts +3 -0
  125. package/types/quick-menu/index.d.ts +22 -0
  126. package/types/screenshot/index.d.ts +20 -0
  127. package/types/soft-break/index.d.ts +14 -0
  128. package/types/strike/index.d.ts +7 -0
  129. package/types/syntax/index.d.ts +14 -0
  130. package/types/table/better-table.d.ts +27 -0
  131. package/types/table/formats/header.d.ts +22 -0
  132. package/types/table/formats/list.d.ts +34 -0
  133. package/types/table/formats/table.d.ts +147 -0
  134. package/types/table/modules/table-column-tool.d.ts +23 -0
  135. package/types/table/modules/table-operation-menu.d.ts +32 -0
  136. package/types/table/modules/table-scroll-bar.d.ts +33 -0
  137. package/types/table/modules/table-selection.d.ts +37 -0
  138. package/types/table/table-config.d.ts +38 -0
  139. package/types/table/utils/index.d.ts +17 -0
  140. package/types/table/utils/node-matchers.d.ts +9 -0
  141. package/types/toolbar/better-picker.d.ts +1 -0
  142. package/types/toolbar/index.d.ts +8 -0
  143. package/types/utils/debounce.d.ts +6 -0
  144. package/types/utils/image.d.ts +1 -0
  145. package/types/utils/method.d.ts +7 -0
  146. package/types/utils/scroll-lock.d.ts +6 -0
  147. package/types/video/index.d.ts +16 -0
@@ -11,6 +11,7 @@ const customUploader = require("./custom-uploader.cjs.js");
11
11
  const index$6 = require("./emoji/index.cjs.js");
12
12
  const index$4 = require("./file/index.cjs.js");
13
13
  const index$1 = require("./format-painter/index.cjs.js");
14
+ const handler = require("./fullscreen/handler.cjs.js");
14
15
  const index$7 = require("./link/index.cjs.js");
15
16
  const Mention = require("./mention/Mention.cjs.js");
16
17
  const index$2 = require("./screenshot/index.cjs.js");
@@ -27,13 +28,13 @@ const textIndent = require("./attributors/text-indent.cjs.js");
27
28
  class FluentEditor extends Quill {
28
29
  constructor(container, options = {}) {
29
30
  super(container, options);
31
+ this.isFullscreen = false;
30
32
  }
31
33
  }
32
34
  const registerModules = function() {
33
- const Icons = Quill.imports["ui/icons"];
34
- const iconKeys = Object.keys(index.ICONS_CONFIG);
35
- iconKeys.forEach((iconKey) => {
36
- Icons[iconKey] = index.ICONS_CONFIG[iconKey];
35
+ const Icons = Quill.import("ui/icons");
36
+ Object.entries(index.ICONS_CONFIG).forEach(([key, icon]) => {
37
+ Icons[key] = icon;
37
38
  });
38
39
  const SnowTheme = Quill.imports["themes/snow"];
39
40
  SnowTheme.DEFAULTS = {
@@ -67,8 +68,7 @@ const registerModules = function() {
67
68
  },
68
69
  "emoji": function() {
69
70
  },
70
- "fullscreen": function() {
71
- },
71
+ "fullscreen": handler.fullscreenHandler,
72
72
  "list": function(value) {
73
73
  var _a, _b;
74
74
  const range = this.quill.getSelection();
@@ -161,5 +161,6 @@ const registerModules = function() {
161
161
  return FluentEditor;
162
162
  };
163
163
  const FluentEditor$1 = registerModules();
164
+ exports.FluentEditor = FluentEditor;
164
165
  exports.default = FluentEditor$1;
165
166
  //# sourceMappingURL=fluent-editor.cjs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fluent-editor.cjs.js","sources":["../../src/fluent-editor.ts"],"sourcesContent":["import type { Module, Parchment as TypeParchment } from 'quill'\r\nimport type { IEditorConfig } from './config/types'\r\nimport Quill from 'quill'\r\nimport { FontStyle, LineHeightStyle, SizeStyle, TextIndentStyle } from './attributors'\r\nimport { getListValue, ICONS_CONFIG, inputFile, TABLE_RIGHT_MENU_CONFIG } from './config'\r\nimport Counter from './counter' // 字符统计\r\nimport CustomClipboard from './custom-clipboard' // 粘贴板\r\nimport CustomImage from './custom-image/BlotFormatter' // 图片\r\nimport { CustomImageSpec } from './custom-image/specs/CustomImageSpec' // 图片拉伸模块\r\nimport CustomUploader from './custom-uploader' // 上传\r\nimport Emoji from './emoji' // 表情\r\nimport FileModule from './file' // 文件\r\nimport { FormatPainter } from './format-painter'\r\nimport Link from './link' // 超链接\r\nimport Mention from './mention/Mention' // @提醒\r\nimport { Screenshot } from './screenshot'// 截图\r\nimport SoftBreak from './soft-break' // 软回车\r\nimport Strike from './strike' // 删除线\r\nimport CustomSyntax from './syntax' // 代码块高亮\r\nimport BetterTable from './table/better-table' // 表格\r\nimport Toolbar from './toolbar' // 工具栏\r\nimport Video from './video' // 视频\r\n// import GlobalLink from './global-link' // 全局链接\r\n// import QuickMenu from './quick-menu' // 快捷菜单\r\n\r\nclass FluentEditor extends Quill {\r\n constructor(container: HTMLElement | string, options: IEditorConfig = {}) {\r\n super(container, options)\r\n }\r\n}\r\n\r\nconst registerModules = function () {\r\n const Icons = Quill.imports['ui/icons']\r\n const iconKeys = Object.keys(ICONS_CONFIG)\r\n iconKeys.forEach((iconKey) => {\r\n Icons[iconKey] = ICONS_CONFIG[iconKey]\r\n })\r\n\r\n const SnowTheme = Quill.imports['themes/snow'] as typeof Module\r\n SnowTheme.DEFAULTS = {\r\n modules: {\r\n 'keyboard': {\r\n bindings: {\r\n ...BetterTable.keyboardBindings,\r\n },\r\n },\r\n 'toolbar': {\r\n handlers: {\r\n ...(SnowTheme.DEFAULTS as Record<string, any>).modules.toolbar.handlers,\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 'better-table': function () {\r\n this.quill.getModule('better-table').insertTable(3, 3)\r\n },\r\n 'file': function () {\r\n const accept = this.quill.options?.uploadOption?.fileAccept\r\n inputFile.call(this, 'file', accept)\r\n },\r\n 'image': function () {\r\n const accept = this.quill.options?.uploadOption?.imageAccept\r\n inputFile.call(this, 'image', accept)\r\n },\r\n 'emoji': function () {},\r\n 'fullscreen': function () {},\r\n 'list': function (value) {\r\n const range = this.quill.getSelection()\r\n const formats = this.quill.getFormat(range)\r\n const preListValue = Array.isArray(formats.list) ? formats.list[0]?.value : formats.list?.value\r\n const curListValue = getListValue(value, preListValue)\r\n // 如果设置list的选区中有表格,判断第一个table-col位置,将表格前的内容设置为list格式\r\n const lines = this.quill.getLines(range.index, range.length)\r\n const tableCols = lines.filter(line => line.statics.blotName === 'table-col' && !line.prev)\r\n if (tableCols.length) {\r\n let start = range.index\r\n // 遍历table-col群组,以之获取表格,将表格前选区设置为对应list格式\r\n tableCols.forEach((item, index) => {\r\n const table = item.domNode.closest('table.quill-better-table')\r\n const tableBlot = Quill.find(table) as TypeParchment.Blot\r\n const tableLength = tableBlot.length()\r\n const tableStart = this.quill.getIndex(item)\r\n const tableEnd = tableStart + tableLength\r\n const beforeTableRangeLength = tableStart - start\r\n // 在表格前设置列表\r\n this.quill.setSelection(start, beforeTableRangeLength, Quill.sources.SILENT)\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n table.parentNode.classList.remove('quill-better-table-selected')\r\n // 当前表格末尾为下一个选取的开始\r\n start = tableEnd\r\n if (index === tableCols.length - 1) {\r\n // 将最后一个表格之后所有选区内容设置list格式\r\n this.quill.setSelection(tableEnd, range.index + range.length - tableEnd)\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n }\r\n })\r\n }\r\n else {\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n }\r\n },\r\n [FormatPainter.toolName]: FormatPainter,\r\n [Screenshot.toolName]: Screenshot,\r\n },\r\n },\r\n 'better-table': {\r\n operationMenu: {\r\n items: TABLE_RIGHT_MENU_CONFIG,\r\n color: true,\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 align: {\r\n icons: {\r\n left: '<i class=\"icon-text-align-left\"></i>',\r\n center: '<i class=\"icon-text-align-center\"></i>',\r\n right: '<i class=\"icon-text-align-right\"></i>',\r\n },\r\n },\r\n },\r\n },\r\n }\r\n\r\n FluentEditor.register(\r\n {\r\n 'modules/toolbar': Toolbar,\r\n 'modules/mention': Mention,\r\n 'modules/better-table': BetterTable,\r\n 'modules/clipboard': CustomClipboard,\r\n 'modules/uploader': CustomUploader, // 三者关联性最强\r\n 'modules/image': CustomImage, // 三者关联性最强\r\n 'modules/file': FileModule, // 三者关联性最强\r\n 'modules/counter': Counter,\r\n 'modules/emoji-toolbar': Emoji.ToolbarEmoji,\r\n 'modules/emoji-shortname': Emoji.ShortNameEmoji,\r\n // 'modules/global-link': GlobalLink,//暂未开发\r\n 'modules/link': Link, // 报错\r\n // 'modules/quickmenu': QuickMenu,//暂未开发\r\n 'modules/syntax': CustomSyntax,\r\n\r\n 'formats/strike': Strike,\r\n 'formats/softBreak': SoftBreak,\r\n 'formats/video': Video,\r\n 'formats/emoji': Emoji.EmojiBlot,\r\n 'formats/font': FontStyle,\r\n 'formats/size': SizeStyle,\r\n 'formats/line-height': LineHeightStyle,\r\n 'formats/text-indent': TextIndentStyle,\r\n },\r\n true, // 覆盖内部模块\r\n )\r\n\r\n return FluentEditor\r\n}\r\n\r\nexport default registerModules()\r\n"],"names":["ICONS_CONFIG","BetterTable","inputFile","getListValue","index","FormatPainter","Screenshot","TABLE_RIGHT_MENU_CONFIG","CustomImageSpec","Toolbar","Mention","CustomClipboard","CustomUploader","CustomImage","FileModule","Counter","Emoji","Link","CustomSyntax","Strike","SoftBreak","Video","FontStyle","SizeStyle","LineHeightStyle","TextIndentStyle"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAyBA,MAAM,qBAAqB,MAAM;AAAA,EAC/B,YAAY,WAAiC,UAAyB,IAAI;AACxE,UAAM,WAAW,OAAO;AAAA,EAC1B;AACF;AAEA,MAAM,kBAAkB,WAAY;AAC5B,QAAA,QAAQ,MAAM,QAAQ,UAAU;AAChC,QAAA,WAAW,OAAO,KAAKA,MAAY,YAAA;AAChC,WAAA,QAAQ,CAAC,YAAY;AACtB,UAAA,OAAO,IAAIA,MAAA,aAAa,OAAO;AAAA,EAAA,CACtC;AAEK,QAAA,YAAY,MAAM,QAAQ,aAAa;AAC7C,YAAU,WAAW;AAAA,IACnB,SAAS;AAAA,MACP,YAAY;AAAA,QACV,UAAU;AAAA,UACR,GAAGC,YAAY,QAAA;AAAA,QACjB;AAAA,MACF;AAAA,MACA,WAAW;AAAA,QACT,UAAU;AAAA,UACR,GAAI,UAAU,SAAiC,QAAQ,QAAQ;AAAA,UAC/D,QAAQ,WAAY;AACb,iBAAA,MAAM,QAAQ;UACrB;AAAA,UACA,QAAQ,WAAY;AACb,iBAAA,MAAM,QAAQ;UACrB;AAAA,UACA,gBAAgB,WAAY;AAC1B,iBAAK,MAAM,UAAU,cAAc,EAAE,YAAY,GAAG,CAAC;AAAA,UACvD;AAAA,UACA,QAAQ,WAAY;;AAClB,kBAAM,UAAS,gBAAK,MAAM,YAAX,mBAAoB,iBAApB,mBAAkC;AACvCC,kBAAAA,UAAA,KAAK,MAAM,QAAQ,MAAM;AAAA,UACrC;AAAA,UACA,SAAS,WAAY;;AACnB,kBAAM,UAAS,gBAAK,MAAM,YAAX,mBAAoB,iBAApB,mBAAkC;AACvCA,kBAAAA,UAAA,KAAK,MAAM,SAAS,MAAM;AAAA,UACtC;AAAA,UACA,SAAS,WAAY;AAAA,UAAC;AAAA,UACtB,cAAc,WAAY;AAAA,UAAC;AAAA,UAC3B,QAAQ,SAAU,OAAO;;AACjB,kBAAA,QAAQ,KAAK,MAAM,aAAa;AACtC,kBAAM,UAAU,KAAK,MAAM,UAAU,KAAK;AAC1C,kBAAM,eAAe,MAAM,QAAQ,QAAQ,IAAI,KAAI,aAAQ,KAAK,CAAC,MAAd,mBAAiB,SAAQ,aAAQ,SAAR,mBAAc;AACpF,kBAAA,eAAeC,MAAAA,aAAa,OAAO,YAAY;AAErD,kBAAM,QAAQ,KAAK,MAAM,SAAS,MAAM,OAAO,MAAM,MAAM;AACrD,kBAAA,YAAY,MAAM,OAAO,CAAQ,SAAA,KAAK,QAAQ,aAAa,eAAe,CAAC,KAAK,IAAI;AAC1F,gBAAI,UAAU,QAAQ;AACpB,kBAAI,QAAQ,MAAM;AAER,wBAAA,QAAQ,CAAC,MAAMC,WAAU;AACjC,sBAAM,QAAQ,KAAK,QAAQ,QAAQ,0BAA0B;AACvD,sBAAA,YAAY,MAAM,KAAK,KAAK;AAC5B,sBAAA,cAAc,UAAU;AAC9B,sBAAM,aAAa,KAAK,MAAM,SAAS,IAAI;AAC3C,sBAAM,WAAW,aAAa;AAC9B,sBAAM,yBAAyB,aAAa;AAE5C,qBAAK,MAAM,aAAa,OAAO,wBAAwB,MAAM,QAAQ,MAAM;AAC3E,qBAAK,MAAM,OAAO,QAAQ,cAAc,MAAM,QAAQ,IAAI;AACpD,sBAAA,WAAW,UAAU,OAAO,6BAA6B;AAEvD,wBAAA;AACJ,oBAAAA,WAAU,UAAU,SAAS,GAAG;AAElC,uBAAK,MAAM,aAAa,UAAU,MAAM,QAAQ,MAAM,SAAS,QAAQ;AACvE,uBAAK,MAAM,OAAO,QAAQ,cAAc,MAAM,QAAQ,IAAI;AAAA,gBAC5D;AAAA,cAAA,CACD;AAAA,YAAA,OAEE;AACH,mBAAK,MAAM,OAAO,QAAQ,cAAc,MAAM,QAAQ,IAAI;AAAA,YAC5D;AAAA,UACF;AAAA,UACA,CAACC,QAAAA,cAAc,QAAQ,GAAGA,QAAA;AAAA,UAC1B,CAACC,QAAAA,WAAW,QAAQ,GAAGA,QAAA;AAAA,QACzB;AAAA,MACF;AAAA,MACA,gBAAgB;AAAA,QACd,eAAe;AAAA,UACb,OAAOC,MAAA;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACP,OAAO,CAACC,gBAAAA,eAAe;AAAA,QACvB,SAAS;AAAA,UACP,OAAO;AAAA,YACL,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA,OAAO;AAAA,UACL,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ;AAAA,YACR,OAAO;AAAA,UACT;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EAAA;AAGW,eAAA;AAAA,IACX;AAAA,MACE,mBAAmBC,QAAA;AAAA,MACnB,mBAAmBC,QAAA;AAAA,MACnB,wBAAwBT,YAAA;AAAA,MACxB,qBAAqBU,gBAAA;AAAA,MACrB,oBAAoBC,eAAA;AAAA;AAAA,MACpB,iBAAiBC,cAAA;AAAA;AAAA,MACjB,gBAAgBC,QAAA;AAAA;AAAA,MAChB,mBAAmBC,QAAA;AAAA,MACnB,yBAAyBC,QAAM,QAAA;AAAA,MAC/B,2BAA2BA,QAAM,QAAA;AAAA;AAAA,MAEjC,gBAAgBC,QAAA;AAAA;AAAA;AAAA,MAEhB,kBAAkBC,QAAA;AAAA,MAElB,kBAAkBC,QAAA;AAAA,MAClB,qBAAqBC,QAAA;AAAA,MACrB,iBAAiBC,QAAA;AAAA,MACjB,iBAAiBL,QAAM,QAAA;AAAA,MACvB,gBAAgBM,UAAA;AAAA,MAChB,gBAAgBC,SAAA;AAAA,MAChB,uBAAuBC,WAAA;AAAA,MACvB,uBAAuBC,WAAA;AAAA,IACzB;AAAA,IACA;AAAA;AAAA,EAAA;AAGK,SAAA;AACT;AAEA,MAAA,iBAAe,gBAAgB;;"}
1
+ {"version":3,"file":"fluent-editor.cjs.js","sources":["../../src/fluent-editor.ts"],"sourcesContent":["import type { Module, Parchment as TypeParchment } from 'quill'\r\nimport type { IEditorConfig } from './config/types'\r\nimport Quill from 'quill'\r\nimport { FontStyle, LineHeightStyle, SizeStyle, TextIndentStyle } from './attributors'\r\nimport { getListValue, ICONS_CONFIG, inputFile, TABLE_RIGHT_MENU_CONFIG } from './config'\r\nimport Counter from './counter' // 字符统计\r\nimport CustomClipboard from './custom-clipboard' // 粘贴板\r\nimport CustomImage from './custom-image/BlotFormatter' // 图片\r\nimport { CustomImageSpec } from './custom-image/specs/CustomImageSpec' // 图片拉伸模块\r\nimport CustomUploader from './custom-uploader' // 上传\r\nimport Emoji from './emoji' // 表情\r\nimport FileModule from './file' // 文件\r\nimport { FormatPainter } from './format-painter'\r\nimport { fullscreenHandler } from './fullscreen/handler'\r\nimport Link from './link' // 超链接\r\nimport Mention from './mention/Mention' // @提醒\r\nimport { Screenshot } from './screenshot'// 截图\r\nimport SoftBreak from './soft-break' // 软回车\r\nimport Strike from './strike' // 删除线\r\nimport CustomSyntax from './syntax' // 代码块高亮\r\nimport BetterTable from './table/better-table' // 表格\r\nimport Toolbar from './toolbar' // 工具栏\r\nimport Video from './video' // 视频\r\n// import GlobalLink from './global-link' // 全局链接\r\n// import QuickMenu from './quick-menu' // 快捷菜单\r\n\r\nexport class FluentEditor extends Quill {\r\n isFullscreen: boolean = false\r\n constructor(container: HTMLElement | string, options: IEditorConfig = {}) {\r\n super(container, options)\r\n }\r\n}\r\n\r\nconst registerModules = function () {\r\n const Icons = Quill.import('ui/icons')\r\n Object.entries(ICONS_CONFIG).forEach(([key, icon]) => {\r\n Icons[key] = icon\r\n })\r\n\r\n const SnowTheme = Quill.imports['themes/snow'] as typeof Module\r\n SnowTheme.DEFAULTS = {\r\n modules: {\r\n 'keyboard': {\r\n bindings: {\r\n ...BetterTable.keyboardBindings,\r\n },\r\n },\r\n 'toolbar': {\r\n handlers: {\r\n ...(SnowTheme.DEFAULTS as Record<string, any>).modules.toolbar.handlers,\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 'better-table': function () {\r\n this.quill.getModule('better-table').insertTable(3, 3)\r\n },\r\n 'file': function () {\r\n const accept = this.quill.options?.uploadOption?.fileAccept\r\n inputFile.call(this, 'file', accept)\r\n },\r\n 'image': function () {\r\n const accept = this.quill.options?.uploadOption?.imageAccept\r\n inputFile.call(this, 'image', accept)\r\n },\r\n 'emoji': function () {},\r\n 'fullscreen': fullscreenHandler,\r\n 'list': function (value) {\r\n const range = this.quill.getSelection()\r\n const formats = this.quill.getFormat(range)\r\n const preListValue = Array.isArray(formats.list) ? formats.list[0]?.value : formats.list?.value\r\n const curListValue = getListValue(value, preListValue)\r\n // 如果设置list的选区中有表格,判断第一个table-col位置,将表格前的内容设置为list格式\r\n const lines = this.quill.getLines(range.index, range.length)\r\n const tableCols = lines.filter(line => line.statics.blotName === 'table-col' && !line.prev)\r\n if (tableCols.length) {\r\n let start = range.index\r\n // 遍历table-col群组,以之获取表格,将表格前选区设置为对应list格式\r\n tableCols.forEach((item, index) => {\r\n const table = item.domNode.closest('table.quill-better-table')\r\n const tableBlot = Quill.find(table) as TypeParchment.Blot\r\n const tableLength = tableBlot.length()\r\n const tableStart = this.quill.getIndex(item)\r\n const tableEnd = tableStart + tableLength\r\n const beforeTableRangeLength = tableStart - start\r\n // 在表格前设置列表\r\n this.quill.setSelection(start, beforeTableRangeLength, Quill.sources.SILENT)\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n table.parentNode.classList.remove('quill-better-table-selected')\r\n // 当前表格末尾为下一个选取的开始\r\n start = tableEnd\r\n if (index === tableCols.length - 1) {\r\n // 将最后一个表格之后所有选区内容设置list格式\r\n this.quill.setSelection(tableEnd, range.index + range.length - tableEnd)\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n }\r\n })\r\n }\r\n else {\r\n this.quill.format('list', curListValue, Quill.sources.USER)\r\n }\r\n },\r\n [FormatPainter.toolName]: FormatPainter,\r\n [Screenshot.toolName]: Screenshot,\r\n },\r\n },\r\n 'better-table': {\r\n operationMenu: {\r\n items: TABLE_RIGHT_MENU_CONFIG,\r\n color: true,\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 align: {\r\n icons: {\r\n left: '<i class=\"icon-text-align-left\"></i>',\r\n center: '<i class=\"icon-text-align-center\"></i>',\r\n right: '<i class=\"icon-text-align-right\"></i>',\r\n },\r\n },\r\n },\r\n },\r\n }\r\n\r\n FluentEditor.register(\r\n {\r\n 'modules/toolbar': Toolbar,\r\n 'modules/mention': Mention,\r\n 'modules/better-table': BetterTable,\r\n 'modules/clipboard': CustomClipboard,\r\n 'modules/uploader': CustomUploader, // 三者关联性最强\r\n 'modules/image': CustomImage, // 三者关联性最强\r\n 'modules/file': FileModule, // 三者关联性最强\r\n 'modules/counter': Counter,\r\n 'modules/emoji-toolbar': Emoji.ToolbarEmoji,\r\n 'modules/emoji-shortname': Emoji.ShortNameEmoji,\r\n // 'modules/global-link': GlobalLink,//暂未开发\r\n 'modules/link': Link, // 报错\r\n // 'modules/quickmenu': QuickMenu,//暂未开发\r\n 'modules/syntax': CustomSyntax,\r\n\r\n 'formats/strike': Strike,\r\n 'formats/softBreak': SoftBreak,\r\n 'formats/video': Video,\r\n 'formats/emoji': Emoji.EmojiBlot,\r\n 'formats/font': FontStyle,\r\n 'formats/size': SizeStyle,\r\n 'formats/line-height': LineHeightStyle,\r\n 'formats/text-indent': TextIndentStyle,\r\n },\r\n true, // 覆盖内部模块\r\n )\r\n\r\n return FluentEditor\r\n}\r\n\r\nexport default registerModules()\r\n"],"names":["ICONS_CONFIG","BetterTable","inputFile","fullscreenHandler","getListValue","index","FormatPainter","Screenshot","TABLE_RIGHT_MENU_CONFIG","CustomImageSpec","Toolbar","Mention","CustomClipboard","CustomUploader","CustomImage","FileModule","Counter","Emoji","Link","CustomSyntax","Strike","SoftBreak","Video","FontStyle","SizeStyle","LineHeightStyle","TextIndentStyle"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const index = require("../config/index.cjs.js");
4
+ const scrollLock = require("../utils/scroll-lock.cjs.js");
5
+ let exitEscHandlerBindToolbar;
6
+ let resizeHandlerBindToolbar;
7
+ let cleanLock;
8
+ let originScrollTop = 0;
9
+ function exitEscHandler(toolbar, e) {
10
+ if (e.code === "Escape") {
11
+ exitFullscreen(toolbar);
12
+ }
13
+ }
14
+ function updateToolbarHeight(toolbar) {
15
+ const toolbarRect = toolbar.container.getBoundingClientRect();
16
+ toolbar.quill.container.style.setProperty(`--${index.namespace}-top`, `${toolbarRect.height}px`);
17
+ }
18
+ function intoFullscreen(toolbar) {
19
+ toolbar.quill.isFullscreen = true;
20
+ originScrollTop = document.documentElement.scrollTop;
21
+ toolbar.container.classList.add("fullscreen");
22
+ toolbar.quill.container.classList.add("fullscreen");
23
+ cleanLock = scrollLock.lockScroll();
24
+ resizeHandlerBindToolbar();
25
+ const [, btn] = toolbar.controls.find((item) => item[0] === "fullscreen");
26
+ btn.innerHTML = index.ICONS_CONFIG["fullscreen-exit"];
27
+ window.addEventListener("resize", resizeHandlerBindToolbar);
28
+ document.addEventListener("keydown", exitEscHandlerBindToolbar);
29
+ }
30
+ function exitFullscreen(toolbar) {
31
+ toolbar.quill.isFullscreen = false;
32
+ toolbar.container.classList.remove("fullscreen");
33
+ toolbar.quill.container.classList.remove("fullscreen");
34
+ cleanLock();
35
+ document.documentElement.scrollTop = originScrollTop;
36
+ const [, btn] = toolbar.controls.find((item) => item[0] === "fullscreen");
37
+ btn.innerHTML = index.ICONS_CONFIG.fullscreen;
38
+ window.removeEventListener("resize", resizeHandlerBindToolbar);
39
+ document.removeEventListener("keydown", exitEscHandlerBindToolbar);
40
+ }
41
+ function fullscreenHandler() {
42
+ if (this.quill.isFullscreen) {
43
+ exitFullscreen(this);
44
+ } else {
45
+ exitEscHandlerBindToolbar = exitEscHandler.bind(void 0, this);
46
+ resizeHandlerBindToolbar = updateToolbarHeight.bind(void 0, this);
47
+ intoFullscreen(this);
48
+ }
49
+ }
50
+ exports.fullscreenHandler = fullscreenHandler;
51
+ //# sourceMappingURL=handler.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.cjs.js","sources":["../../../src/fullscreen/handler.ts"],"sourcesContent":["import type { FluentEditorToolbar } from '../config/types'\r\nimport { ICONS_CONFIG, namespace } from '../config'\r\nimport { lockScroll } from '../utils/scroll-lock'\r\n\r\nlet exitEscHandlerBindToolbar: (e: KeyboardEvent) => void\r\nlet resizeHandlerBindToolbar: () => void\r\nlet cleanLock: ReturnType<typeof lockScroll>\r\nlet originScrollTop = 0\r\nfunction exitEscHandler(toolbar: FluentEditorToolbar, e: KeyboardEvent) {\r\n if (e.code === 'Escape') {\r\n exitFullscreen(toolbar)\r\n }\r\n}\r\nfunction updateToolbarHeight(toolbar: FluentEditorToolbar) {\r\n const toolbarRect = toolbar.container.getBoundingClientRect()\r\n toolbar.quill.container.style.setProperty(`--${namespace}-top`, `${toolbarRect.height}px`)\r\n}\r\nfunction intoFullscreen(toolbar: FluentEditorToolbar) {\r\n toolbar.quill.isFullscreen = true\r\n originScrollTop = document.documentElement.scrollTop\r\n toolbar.container.classList.add('fullscreen')\r\n toolbar.quill.container.classList.add('fullscreen')\r\n cleanLock = lockScroll()\r\n resizeHandlerBindToolbar()\r\n const [, btn] = toolbar.controls.find(item => item[0] === 'fullscreen')\r\n btn.innerHTML = ICONS_CONFIG['fullscreen-exit']\r\n window.addEventListener('resize', resizeHandlerBindToolbar)\r\n document.addEventListener('keydown', exitEscHandlerBindToolbar)\r\n}\r\nfunction exitFullscreen(toolbar: FluentEditorToolbar) {\r\n toolbar.quill.isFullscreen = false\r\n toolbar.container.classList.remove('fullscreen')\r\n toolbar.quill.container.classList.remove('fullscreen')\r\n cleanLock()\r\n document.documentElement.scrollTop = originScrollTop\r\n const [, btn] = toolbar.controls.find(item => item[0] === 'fullscreen')\r\n btn.innerHTML = ICONS_CONFIG.fullscreen\r\n window.removeEventListener('resize', resizeHandlerBindToolbar)\r\n document.removeEventListener('keydown', exitEscHandlerBindToolbar)\r\n}\r\nexport function fullscreenHandler(this: FluentEditorToolbar) {\r\n if (this.quill.isFullscreen) {\r\n exitFullscreen(this)\r\n }\r\n else {\r\n exitEscHandlerBindToolbar = exitEscHandler.bind(undefined, this)\r\n resizeHandlerBindToolbar = updateToolbarHeight.bind(undefined, this)\r\n intoFullscreen(this)\r\n }\r\n}\r\n"],"names":["namespace","lockScroll","ICONS_CONFIG"],"mappings":";;;;AAIA,IAAI;AACJ,IAAI;AACJ,IAAI;AACJ,IAAI,kBAAkB;AACtB,SAAS,eAAe,SAA8B,GAAkB;AAClE,MAAA,EAAE,SAAS,UAAU;AACvB,mBAAe,OAAO;AAAA,EACxB;AACF;AACA,SAAS,oBAAoB,SAA8B;AACnD,QAAA,cAAc,QAAQ,UAAU,sBAAsB;AACpD,UAAA,MAAM,UAAU,MAAM,YAAY,KAAKA,MAAS,SAAA,QAAQ,GAAG,YAAY,MAAM,IAAI;AAC3F;AACA,SAAS,eAAe,SAA8B;AACpD,UAAQ,MAAM,eAAe;AAC7B,oBAAkB,SAAS,gBAAgB;AACnC,UAAA,UAAU,UAAU,IAAI,YAAY;AAC5C,UAAQ,MAAM,UAAU,UAAU,IAAI,YAAY;AAClD,cAAYC,WAAW,WAAA;AACE;AACnB,QAAA,GAAG,GAAG,IAAI,QAAQ,SAAS,KAAK,CAAQ,SAAA,KAAK,CAAC,MAAM,YAAY;AAClE,MAAA,YAAYC,mBAAa,iBAAiB;AACvC,SAAA,iBAAiB,UAAU,wBAAwB;AACjD,WAAA,iBAAiB,WAAW,yBAAyB;AAChE;AACA,SAAS,eAAe,SAA8B;AACpD,UAAQ,MAAM,eAAe;AACrB,UAAA,UAAU,UAAU,OAAO,YAAY;AAC/C,UAAQ,MAAM,UAAU,UAAU,OAAO,YAAY;AAC3C;AACV,WAAS,gBAAgB,YAAY;AAC/B,QAAA,GAAG,GAAG,IAAI,QAAQ,SAAS,KAAK,CAAQ,SAAA,KAAK,CAAC,MAAM,YAAY;AACtE,MAAI,YAAYA,MAAa,aAAA;AACtB,SAAA,oBAAoB,UAAU,wBAAwB;AACpD,WAAA,oBAAoB,WAAW,yBAAyB;AACnE;AACO,SAAS,oBAA6C;AACvD,MAAA,KAAK,MAAM,cAAc;AAC3B,mBAAe,IAAI;AAAA,EAAA,OAEhB;AACyB,gCAAA,eAAe,KAAK,QAAW,IAAI;AACpC,+BAAA,oBAAoB,KAAK,QAAW,IAAI;AACnE,mBAAe,IAAI;AAAA,EACrB;AACF;;"}
package/lib/index.cjs.js CHANGED
@@ -8,6 +8,7 @@ exports.ICONS_CONFIG = index.ICONS_CONFIG;
8
8
  exports.TABLE_RIGHT_MENU_CONFIG = index.TABLE_RIGHT_MENU_CONFIG;
9
9
  exports.getListValue = index.getListValue;
10
10
  exports.inputFile = index.inputFile;
11
+ exports.namespace = index.namespace;
11
12
  exports.AUDIO_VIDEO_UPLOADER_MIME_TYPES = editor_config.AUDIO_VIDEO_UPLOADER_MIME_TYPES;
12
13
  exports.BIG_DELTA_LIMIT = editor_config.BIG_DELTA_LIMIT;
13
14
  exports.COMPRESSED_UPLOADER_MIME_TYPES = editor_config.COMPRESSED_UPLOADER_MIME_TYPES;
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;"}
@@ -1,12 +1,17 @@
1
1
  "use strict";
2
+ var _a;
2
3
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
4
  const Quill = require("quill");
4
5
  const editor_utils = require("../../config/editor.utils.cjs.js");
5
- const Inline = Quill.imports["blots/inline"];
6
- let Link$1 = class Link extends Inline {
6
+ const Inline = Quill.import("blots/inline");
7
+ let Link$1 = (_a = class extends Inline {
7
8
  static create(value) {
8
9
  const node = super.create(value);
9
- const href = this.sanitize(value);
10
+ let href = value;
11
+ if (!editor_utils.hadProtocol(href) && this.autoProtocol) {
12
+ href = `${this.autoProtocol}://${value}`;
13
+ }
14
+ href = this.sanitize(href);
10
15
  node.setAttribute("href", href);
11
16
  node.setAttribute("target", "_blank");
12
17
  return node;
@@ -21,10 +26,10 @@ let Link$1 = class Link extends Inline {
21
26
  if (name !== this.statics.blotName || [false, null].includes(value)) {
22
27
  super.format(name, value);
23
28
  } else {
24
- this.domNode.setAttribute("href", Link.sanitize(value));
29
+ this.domNode.setAttribute("href", _a.sanitize(value));
25
30
  }
26
31
  }
27
- };
32
+ }, _a.autoProtocol = "", _a);
28
33
  Link$1.blotName = "link";
29
34
  Link$1.tagName = "A";
30
35
  Link$1.SANITIZED_URL = "about:blank";
@@ -1 +1 @@
1
- {"version":3,"file":"link.cjs.js","sources":["../../../../src/link/formats/link.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport { sanitize } from '../../config/editor.utils'\r\n\r\nconst Inline = Quill.imports['blots/inline']\r\n\r\n// @dynamic\r\nexport default class Link extends Inline {\r\n static blotName: string\r\n static tagName: string\r\n static SANITIZED_URL: string\r\n static PROTOCOL_WHITELIST: string[]\r\n static className: string\r\n statics: any\r\n domNode: any\r\n static create(value) {\r\n const node = super.create(value)\r\n const href = this.sanitize(value)\r\n node.setAttribute('href', href)\r\n node.setAttribute('target', '_blank')\r\n return node\r\n }\r\n\r\n static formats(domNode) {\r\n return domNode.getAttribute('href')\r\n }\r\n\r\n static sanitize(url) {\r\n return sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL\r\n }\r\n\r\n format(name, value) {\r\n if (name !== this.statics.blotName || [false, null].includes(value)) {\r\n super.format(name, value)\r\n }\r\n else {\r\n this.domNode.setAttribute('href', Link.sanitize(value))\r\n }\r\n }\r\n}\r\nLink.blotName = 'link'\r\nLink.tagName = 'A'\r\nLink.SANITIZED_URL = 'about:blank'\r\nLink.PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel']\r\nLink.className = 'ql-normal-link'\r\n"],"names":["sanitize","Link"],"mappings":";;;;AAGA,MAAM,SAAS,MAAM,QAAQ,cAAc;aAG3C,MAAqB,aAAa,OAAO;AAAA,EAQvC,OAAO,OAAO,OAAO;AACb,UAAA,OAAO,MAAM,OAAO,KAAK;AACzB,UAAA,OAAO,KAAK,SAAS,KAAK;AAC3B,SAAA,aAAa,QAAQ,IAAI;AACzB,SAAA,aAAa,UAAU,QAAQ;AAC7B,WAAA;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ,SAAS;AACf,WAAA,QAAQ,aAAa,MAAM;AAAA,EACpC;AAAA,EAEA,OAAO,SAAS,KAAK;AACnB,WAAOA,aAAAA,SAAS,KAAK,KAAK,kBAAkB,IAAI,MAAM,KAAK;AAAA,EAC7D;AAAA,EAEA,OAAO,MAAM,OAAO;AACd,QAAA,SAAS,KAAK,QAAQ,YAAY,CAAC,OAAO,IAAI,EAAE,SAAS,KAAK,GAAG;AAC7D,YAAA,OAAO,MAAM,KAAK;AAAA,IAAA,OAErB;AACH,WAAK,QAAQ,aAAa,QAAQ,KAAK,SAAS,KAAK,CAAC;AAAA,IACxD;AAAA,EACF;AACF;AACAC,OAAK,WAAW;AAChBA,OAAK,UAAU;AACfA,OAAK,gBAAgB;AACrBA,OAAK,qBAAqB,CAAC,QAAQ,SAAS,UAAU,KAAK;AAC3DA,OAAK,YAAY;;"}
1
+ {"version":3,"file":"link.cjs.js","sources":["../../../../src/link/formats/link.ts"],"sourcesContent":["import type TypeInline from 'quill/blots/inline'\r\nimport Quill from 'quill'\r\nimport { hadProtocol, sanitize } from '../../config/editor.utils'\r\n\r\nconst Inline = Quill.import('blots/inline') as typeof TypeInline\r\n\r\n// @dynamic\r\nexport default class Link extends Inline {\r\n static blotName: string\r\n static tagName: string\r\n static SANITIZED_URL: string\r\n static PROTOCOL_WHITELIST: string[]\r\n static className: string\r\n static autoProtocol: string = ''\r\n static create(value) {\r\n const node = super.create(value)\r\n let href = value\r\n if (!hadProtocol(href) && this.autoProtocol) {\r\n href = `${this.autoProtocol}://${value}`\r\n }\r\n href = this.sanitize(href)\r\n node.setAttribute('href', href)\r\n node.setAttribute('target', '_blank')\r\n return node\r\n }\r\n\r\n static formats(domNode) {\r\n return domNode.getAttribute('href')\r\n }\r\n\r\n static sanitize(url) {\r\n return sanitize(url, this.PROTOCOL_WHITELIST) ? url : this.SANITIZED_URL\r\n }\r\n\r\n format(name, value) {\r\n if (name !== this.statics.blotName || [false, null].includes(value)) {\r\n super.format(name, value)\r\n }\r\n else {\r\n this.domNode.setAttribute('href', Link.sanitize(value))\r\n }\r\n }\r\n}\r\nLink.blotName = 'link'\r\nLink.tagName = 'A'\r\nLink.SANITIZED_URL = 'about:blank'\r\nLink.PROTOCOL_WHITELIST = ['http', 'https', 'mailto', 'tel']\r\nLink.className = 'ql-normal-link'\r\n"],"names":["hadProtocol","sanitize","Link"],"mappings":";;;;;AAIA,MAAM,SAAS,MAAM,OAAO,cAAc;cAG1C,mBAAkC,OAAO;AAAA,EAOvC,OAAO,OAAO,OAAO;AACb,UAAA,OAAO,MAAM,OAAO,KAAK;AAC/B,QAAI,OAAO;AACX,QAAI,CAACA,aAAAA,YAAY,IAAI,KAAK,KAAK,cAAc;AAC3C,aAAO,GAAG,KAAK,YAAY,MAAM,KAAK;AAAA,IACxC;AACO,WAAA,KAAK,SAAS,IAAI;AACpB,SAAA,aAAa,QAAQ,IAAI;AACzB,SAAA,aAAa,UAAU,QAAQ;AAC7B,WAAA;AAAA,EACT;AAAA,EAEA,OAAO,QAAQ,SAAS;AACf,WAAA,QAAQ,aAAa,MAAM;AAAA,EACpC;AAAA,EAEA,OAAO,SAAS,KAAK;AACnB,WAAOC,aAAAA,SAAS,KAAK,KAAK,kBAAkB,IAAI,MAAM,KAAK;AAAA,EAC7D;AAAA,EAEA,OAAO,MAAM,OAAO;AACd,QAAA,SAAS,KAAK,QAAQ,YAAY,CAAC,OAAO,IAAI,EAAE,SAAS,KAAK,GAAG;AAC7D,YAAA,OAAO,MAAM,KAAK;AAAA,IAAA,OAErB;AACH,WAAK,QAAQ,aAAa,QAAQ,GAAK,SAAS,KAAK,CAAC;AAAA,IACxD;AAAA,EACF;AACF,GA7BE,GAAO,eAAuB,IANhC;AAoCAC,OAAK,WAAW;AAChBA,OAAK,UAAU;AACfA,OAAK,gBAAgB;AACrBA,OAAK,qBAAqB,CAAC,QAAQ,SAAS,UAAU,KAAK;AAC3DA,OAAK,YAAY;;"}
@@ -3,9 +3,9 @@ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toString
3
3
  const Quill = require("quill");
4
4
  const link = require("./formats/link.cjs.js");
5
5
  const tooltip = require("./modules/tooltip.cjs.js");
6
- const icons = Quill.imports["ui/icons"];
7
- const SnowTheme = Quill.imports["themes/snow"];
8
- const Module = Quill.imports["core/module"];
6
+ const icons = Quill.import("ui/icons");
7
+ const SnowTheme = Quill.import("themes/snow");
8
+ const Module = Quill.import("core/module");
9
9
  class Link extends Module {
10
10
  static register() {
11
11
  Quill.register("blots/link", link.default, true);
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs.js","sources":["../../../src/link/index.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport LinkBlot from './formats/link'\r\nimport Tooltip from './modules/tooltip'\r\n\r\nconst icons = Quill.imports['ui/icons']\r\nconst SnowTheme = Quill.imports['themes/snow']\r\nconst Module = Quill.imports['core/module']\r\n\r\n// @dynamic\r\nclass Link extends Module {\r\n static register() {\r\n Quill.register('blots/link', LinkBlot, true)\r\n }\r\n\r\n constructor(quill, options) {\r\n super(quill, options)\r\n }\r\n}\r\n\r\nSnowTheme.prototype.extendToolbar = function (toolbar) {\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 Tooltip(this.quill, this.options.bounds)\r\n if (toolbar.container.querySelector('.ql-link')) {\r\n this.quill.keyboard.addBinding(\r\n { key: 'k', shortKey: true },\r\n (_range, context) => {\r\n toolbar.handlers.link.call(toolbar, !context.format.link)\r\n },\r\n )\r\n }\r\n}\r\n\r\nexport default Link\r\n"],"names":["LinkBlot","Tooltip"],"mappings":";;;;;AAIA,MAAM,QAAQ,MAAM,QAAQ,UAAU;AACtC,MAAM,YAAY,MAAM,QAAQ,aAAa;AAC7C,MAAM,SAAS,MAAM,QAAQ,aAAa;AAG1C,MAAM,aAAa,OAAO;AAAA,EACxB,OAAO,WAAW;AACV,UAAA,SAAS,cAAcA,KAAA,SAAU,IAAI;AAAA,EAC7C;AAAA,EAEA,YAAY,OAAO,SAAS;AAC1B,UAAM,OAAO,OAAO;AAAA,EACtB;AACF;AAEA,UAAU,UAAU,gBAAgB,SAAU,SAAS;AAC7C,UAAA,UAAU,UAAU,IAAI,SAAS;AACzC,OAAK,aAAa,QAAQ,UAAU,iBAAiB,QAAQ,GAAG,KAAK;AACrE,OAAK,aAAa,QAAQ,UAAU,iBAAiB,QAAQ,GAAG,KAAK;AACrE,OAAK,UAAU,IAAIC,gBAAQ,KAAK,OAAO,KAAK,QAAQ,MAAM;AAC1D,MAAI,QAAQ,UAAU,cAAc,UAAU,GAAG;AAC/C,SAAK,MAAM,SAAS;AAAA,MAClB,EAAE,KAAK,KAAK,UAAU,KAAK;AAAA,MAC3B,CAAC,QAAQ,YAAY;AACnB,gBAAQ,SAAS,KAAK,KAAK,SAAS,CAAC,QAAQ,OAAO,IAAI;AAAA,MAC1D;AAAA,IAAA;AAAA,EAEJ;AACF;;"}
1
+ {"version":3,"file":"index.cjs.js","sources":["../../../src/link/index.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport LinkBlot from './formats/link'\r\nimport Tooltip from './modules/tooltip'\r\n\r\nconst icons = Quill.import('ui/icons')\r\nconst SnowTheme = Quill.import('themes/snow')\r\nconst Module = Quill.import('core/module')\r\n\r\n// @dynamic\r\nclass Link extends Module {\r\n static register() {\r\n Quill.register('blots/link', LinkBlot, true)\r\n }\r\n\r\n constructor(quill, options) {\r\n super(quill, options)\r\n }\r\n}\r\n\r\n// @ts-expect-error\r\nSnowTheme.prototype.extendToolbar = function (toolbar) {\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 Tooltip(this.quill, this.options.bounds)\r\n if (toolbar.container.querySelector('.ql-link')) {\r\n this.quill.keyboard.addBinding(\r\n { key: 'k', shortKey: true },\r\n (_range, context) => {\r\n toolbar.handlers.link.call(toolbar, !context.format.link)\r\n },\r\n )\r\n }\r\n}\r\n\r\nexport default Link\r\n"],"names":["LinkBlot","Tooltip"],"mappings":";;;;;AAIA,MAAM,QAAQ,MAAM,OAAO,UAAU;AACrC,MAAM,YAAY,MAAM,OAAO,aAAa;AAC5C,MAAM,SAAS,MAAM,OAAO,aAAa;AAGzC,MAAM,aAAa,OAAO;AAAA,EACxB,OAAO,WAAW;AACV,UAAA,SAAS,cAAcA,KAAA,SAAU,IAAI;AAAA,EAC7C;AAAA,EAEA,YAAY,OAAO,SAAS;AAC1B,UAAM,OAAO,OAAO;AAAA,EACtB;AACF;AAGA,UAAU,UAAU,gBAAgB,SAAU,SAAS;AAC7C,UAAA,UAAU,UAAU,IAAI,SAAS;AACzC,OAAK,aAAa,QAAQ,UAAU,iBAAiB,QAAQ,GAAG,KAAK;AACrE,OAAK,aAAa,QAAQ,UAAU,iBAAiB,QAAQ,GAAG,KAAK;AACrE,OAAK,UAAU,IAAIC,gBAAQ,KAAK,OAAO,KAAK,QAAQ,MAAM;AAC1D,MAAI,QAAQ,UAAU,cAAc,UAAU,GAAG;AAC/C,SAAK,MAAM,SAAS;AAAA,MAClB,EAAE,KAAK,KAAK,UAAU,KAAK;AAAA,MAC3B,CAAC,QAAQ,YAAY;AACnB,gBAAQ,SAAS,KAAK,KAAK,SAAS,CAAC,QAAQ,OAAO,IAAI;AAAA,MAC1D;AAAA,IAAA;AAAA,EAEJ;AACF;;"}
@@ -2,7 +2,6 @@
2
2
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
3
  const Quill = require("quill");
4
4
  const Emitter = require("quill/core/emitter");
5
- const selection = require("quill/core/selection");
6
5
  const base = require("quill/themes/base");
7
6
  const debounce = require("../../utils/debounce.cjs.js");
8
7
  const editor_config = require("../../config/editor.config.cjs.js");
@@ -11,11 +10,27 @@ const link = require("../formats/link.cjs.js");
11
10
  class Tooltip extends base.BaseTooltip {
12
11
  constructor(quill, bounds) {
13
12
  super(quill, bounds);
13
+ this.options = {
14
+ autoProtocol: "https"
15
+ };
14
16
  this.isInputFocus = false;
15
17
  this.isHover = false;
18
+ this.resolveOptions();
19
+ link.default.autoProtocol = this.options.autoProtocol;
16
20
  this.debouncedHideToolTip = debounce.debounce(this.hideToolTip, 300);
17
21
  this.debouncedShowToolTip = debounce.debounce(this.showToolTip, 300);
18
22
  }
23
+ resolveOptions() {
24
+ this.options = {
25
+ autoProtocol: "https"
26
+ };
27
+ const value = this.quill.options.autoProtocol;
28
+ if (value && typeof value === "string") {
29
+ this.options.autoProtocol = value;
30
+ } else if (typeof value === "boolean" && !value) {
31
+ this.options.autoProtocol = "";
32
+ }
33
+ }
19
34
  shouldHide() {
20
35
  return !this.isHover && !this.isInputFocus;
21
36
  }
@@ -54,7 +69,7 @@ class Tooltip extends base.BaseTooltip {
54
69
  index
55
70
  );
56
71
  const length = link$1 && link$1.length();
57
- this.linkRange = new selection.Range(index - offset, length);
72
+ this.linkRange = new Quill.Range(index - offset, length);
58
73
  this.debouncedShowToolTip("link", preview, this.linkRange);
59
74
  }
60
75
  listen() {
@@ -119,7 +134,7 @@ class Tooltip extends base.BaseTooltip {
119
134
  range.index
120
135
  );
121
136
  if (!editor_utils.isNullOrUndefined(link$1)) {
122
- this.linkRange = new selection.Range(range.index - offset, link$1.length());
137
+ this.linkRange = new Quill.Range(range.index - offset, link$1.length());
123
138
  const preview = link.default.formats(link$1.domNode);
124
139
  if (!preview.startsWith("#")) {
125
140
  this.edit("link", preview, this.linkRange);
@@ -135,8 +150,8 @@ class Tooltip extends base.BaseTooltip {
135
150
  this.quill.on(
136
151
  Emitter.events.TEXT_CHANGE,
137
152
  () => {
138
- const selection2 = this.quill.getSelection();
139
- const index = selection2 && selection2.index;
153
+ const selection = this.quill.getSelection();
154
+ const index = selection && selection.index;
140
155
  setTimeout(() => {
141
156
  const link$1 = this.quill.scroll.descendant(
142
157
  link.default,
@@ -156,8 +171,7 @@ class Tooltip extends base.BaseTooltip {
156
171
  switch (this.root.getAttribute("data-mode")) {
157
172
  case "link": {
158
173
  const { scrollTop } = this.quill.root;
159
- const { autoProtocol } = this.quill.options;
160
- if (autoProtocol) {
174
+ if (this.options.autoProtocol) {
161
175
  value = this.addHttpProtocol(value);
162
176
  }
163
177
  if (this.linkRange) {
@@ -231,6 +245,7 @@ class Tooltip extends base.BaseTooltip {
231
245
  }
232
246
  return shift;
233
247
  }
248
+ // @ts-expect-error
234
249
  edit(mode = "link", preview = null, range) {
235
250
  this.linkRange = range || this.quill.selection.savedRange;
236
251
  this.root.classList.remove("ql-hidden");
@@ -259,8 +274,8 @@ class Tooltip extends base.BaseTooltip {
259
274
  if (!url) {
260
275
  return "";
261
276
  }
262
- if (!/^(?:f|ht)tps?\:\/\//.test(url)) {
263
- result = `http://${url}`;
277
+ if (!editor_utils.hadProtocol(url)) {
278
+ result = `${this.options.autoProtocol}://${url}`;
264
279
  }
265
280
  return result;
266
281
  }
@@ -1 +1 @@
1
- {"version":3,"file":"tooltip.cjs.js","sources":["../../../../src/link/modules/tooltip.ts"],"sourcesContent":["import Quill from 'quill'\r\nimport Emitter from 'quill/core/emitter'\r\nimport { Range } from 'quill/core/selection'\r\nimport { BaseTooltip } from 'quill/themes/base'\r\nimport { debounce } from '../../../src/utils/debounce'\r\nimport { LANG_CONF } from '../../config/editor.config'\r\nimport { isNullOrUndefined } from '../../config/editor.utils'\r\nimport LinkBlot from '../formats/link'\r\n\r\n// const Emitter = Quill.imports['core/emitter'];\r\n// const BaseTooltip = Quill.imports['themes/BaseTooltip'];\r\n// const Range = Quill.imports['core/selection/range'];\r\n\r\n// @dynamic\r\nexport default class Tooltip extends BaseTooltip {\r\n static TEMPLATE: string\r\n isInputFocus: boolean\r\n isHover: boolean\r\n debouncedHideToolTip: any\r\n debouncedShowToolTip: any\r\n hide: any\r\n linkRange: any\r\n quill: any\r\n root: any\r\n restoreFocus: any\r\n textbox: any\r\n boundsContainer: any\r\n\r\n constructor(quill, bounds) {\r\n super(quill, bounds)\r\n this.isInputFocus = false\r\n this.isHover = false\r\n\r\n this.debouncedHideToolTip = debounce(this.hideToolTip, 300)\r\n this.debouncedShowToolTip = debounce(this.showToolTip, 300)\r\n }\r\n\r\n shouldHide() {\r\n return !this.isHover && !this.isInputFocus\r\n }\r\n\r\n hideToolTip() {\r\n if (this.shouldHide()) {\r\n this.hide()\r\n }\r\n }\r\n\r\n showToolTip(name, value, range) {\r\n if (!this.shouldHide()) {\r\n this.edit(name, value, range)\r\n }\r\n }\r\n\r\n handleMouseLeave() {\r\n this.isHover = false\r\n this.debouncedHideToolTip()\r\n }\r\n\r\n handleMouseEnter(event) {\r\n const isTooltipShow = !this.root.classList.contains('ql-hidden')\r\n if (isTooltipShow) {\r\n return\r\n }\r\n\r\n if (this.isInputFocus) {\r\n this.save()\r\n }\r\n this.isHover = true\r\n const linkNode = event.target\r\n const preview = LinkBlot.formats(linkNode)\r\n if (preview.startsWith('#')) {\r\n return\r\n }\r\n const linkBlot = Quill.find(linkNode)\r\n const index = this.quill.getIndex(linkBlot)\r\n const [link, offset] = this.quill.scroll.descendant(\r\n LinkBlot,\r\n index,\r\n )\r\n const length = link && link.length()\r\n this.linkRange = new Range(index - offset, length)\r\n this.debouncedShowToolTip('link', preview, this.linkRange)\r\n }\r\n\r\n listen() {\r\n super.listen()\r\n\r\n this.root.querySelector('a.ql-remove').addEventListener('click', (event) => {\r\n if (!isNullOrUndefined(this.linkRange)) {\r\n const range = this.linkRange\r\n this.restoreFocus()\r\n this.quill.formatText(range, 'link', false, Emitter.sources.API)\r\n delete this.linkRange\r\n }\r\n event.preventDefault()\r\n this.hide()\r\n })\r\n\r\n this.quill.root.addEventListener(\r\n 'mouseover',\r\n (event) => {\r\n if (\r\n (event.target.tagName.toUpperCase() !== 'A'\r\n || !event.target.classList.contains(LinkBlot.className))\r\n && !event.target.closest(`a.${LinkBlot.className}`)\r\n ) {\r\n return\r\n }\r\n this.handleMouseEnter(event)\r\n },\r\n false,\r\n )\r\n\r\n this.quill.root.addEventListener(\r\n 'mouseout',\r\n (event) => {\r\n if (event.target.tagName.toUpperCase() !== 'A' && !event.target.closest(`a.${LinkBlot.className}`)) {\r\n return\r\n }\r\n this.handleMouseLeave()\r\n },\r\n false,\r\n )\r\n\r\n this.root.addEventListener(\r\n 'mouseenter',\r\n () => {\r\n this.isHover = true\r\n },\r\n false,\r\n )\r\n\r\n this.root.addEventListener('mouseleave', this.handleMouseLeave.bind(this), false)\r\n\r\n this.root.querySelector('a.ql-preview').addEventListener('click', (event) => {\r\n const link = LinkBlot.sanitize(this.textbox.value)\r\n window.open(link, '_blank')\r\n event.preventDefault()\r\n })\r\n this.root.querySelector('input[type=\"text\"]').addEventListener('focus', () => {\r\n this.isInputFocus = true\r\n })\r\n this.root.querySelector('input[type=\"text\"]').addEventListener('blur', () => {\r\n this.isInputFocus = false\r\n this.save()\r\n })\r\n this.quill.on(\r\n Emitter.events.SELECTION_CHANGE,\r\n (range, _oldRange, source) => {\r\n if (isNullOrUndefined(range)) return\r\n if (source === Emitter.sources.USER) {\r\n const [link, offset] = this.quill.scroll.descendant(\r\n LinkBlot,\r\n range.index,\r\n )\r\n\r\n if (!isNullOrUndefined(link)) {\r\n this.linkRange = new Range(range.index - offset, link.length())\r\n const preview = LinkBlot.formats(link.domNode)\r\n if (!preview.startsWith('#')) {\r\n this.edit('link', preview, this.linkRange)\r\n }\r\n return\r\n }\r\n }\r\n if (this.shouldHide()) {\r\n this.hide()\r\n }\r\n },\r\n )\r\n this.quill.on(\r\n Emitter.events.TEXT_CHANGE,\r\n () => {\r\n const selection = this.quill.getSelection()\r\n const index = selection && selection.index\r\n setTimeout(() => {\r\n const link = this.quill.scroll.descendant(\r\n LinkBlot,\r\n index,\r\n )[0]\r\n if (!link) {\r\n this.handleMouseLeave()\r\n }\r\n })\r\n },\r\n )\r\n }\r\n\r\n save() {\r\n let value = this.textbox.value\r\n if (!value) return\r\n this.textbox.value = ''\r\n switch (this.root.getAttribute('data-mode')) {\r\n case 'link': {\r\n const { scrollTop } = this.quill.root\r\n const { autoProtocol } = this.quill.options\r\n if (autoProtocol) {\r\n value = this.addHttpProtocol(value)\r\n }\r\n\r\n if (this.linkRange) {\r\n this.quill.formatText(\r\n this.linkRange,\r\n 'link',\r\n value,\r\n Emitter.sources.USER,\r\n )\r\n this.restoreFocus()\r\n }\r\n else {\r\n this.restoreFocus()\r\n this.quill.format('link', value, Emitter.sources.USER)\r\n }\r\n this.quill.root.scrollTop = scrollTop\r\n break\r\n }\r\n case 'formula': {\r\n const range = this.quill.getSelection(true)\r\n if (!isNullOrUndefined(range)) {\r\n const index = range.index + range.length\r\n this.quill.insertEmbed(\r\n index,\r\n this.root.getAttribute('data-mode'),\r\n value,\r\n Emitter.sources.USER,\r\n )\r\n if (this.root.getAttribute('data-mode') === 'formula') {\r\n this.quill.insertText(index + 1, ' ', Emitter.sources.USER)\r\n }\r\n this.quill.setSelection(index + 2, Emitter.sources.USER)\r\n }\r\n break\r\n }\r\n case 'video': {\r\n const range = this.quill.getSelection(true)\r\n this.quill.insertText(range.index, '\\n', Emitter.sources.USER)\r\n this.quill.insertEmbed(range.index + 1, 'video', { src: value }, Emitter.sources.USER)\r\n this.quill.insertText(range.index + 2, '\\n', Emitter.sources.USER)\r\n this.quill.setSelection(range.index + 3, Emitter.sources.SILENT)\r\n this.textbox.value = ''\r\n this.hide()\r\n break\r\n }\r\n default:\r\n }\r\n }\r\n\r\n position(reference) {\r\n const left = reference.left\r\n const top = reference.bottom + this.quill.root.scrollTop\r\n this.root.style.left = `${left}px`\r\n this.root.style.top = `${top}px`\r\n this.root.classList.remove('ql-flip')\r\n const containerBounds = this.boundsContainer.getBoundingClientRect()\r\n const rootBounds = this.root.getBoundingClientRect()\r\n let shift = 0\r\n if (rootBounds.right > containerBounds.right) {\r\n shift = containerBounds.right - rootBounds.right\r\n this.root.style.left = `${left + shift}px`\r\n }\r\n if (rootBounds.left < containerBounds.left) {\r\n shift = containerBounds.left - rootBounds.left\r\n this.root.style.left = `${left + shift}px`\r\n }\r\n if (rootBounds.bottom > containerBounds.bottom) {\r\n const height = rootBounds.bottom - rootBounds.top\r\n const verticalShift = reference.bottom - reference.top + height\r\n const fixedTop = top - verticalShift\r\n this.root.style.top = `${fixedTop < 0 ? this.quill.root.scrollTop + reference.top : fixedTop}px`\r\n this.root.classList.add('ql-flip')\r\n }\r\n return shift\r\n }\r\n\r\n edit(mode = 'link', preview = null, range) {\r\n this.linkRange = range || this.quill.selection.savedRange\r\n this.root.classList.remove('ql-hidden')\r\n this.root.classList.add('ql-editing')\r\n if (!isNullOrUndefined(preview)) {\r\n this.textbox.value = preview\r\n }\r\n else if (mode !== this.root.getAttribute('data-mode')) {\r\n this.textbox.value = ''\r\n }\r\n this.position(this.quill.getBounds(range || this.quill.selection.savedRange))\r\n if (this.textbox.value === '') {\r\n this.textbox.focus()\r\n }\r\n this.textbox.setAttribute(\r\n 'placeholder',\r\n this.textbox.getAttribute(`data-${mode}`) || '',\r\n )\r\n this.root.setAttribute('data-mode', mode)\r\n }\r\n\r\n show() {\r\n super.show()\r\n this.root.removeAttribute('data-mode')\r\n }\r\n\r\n addHttpProtocol(url) {\r\n let result = url\r\n if (!url) {\r\n return ''\r\n }\r\n if (!/^(?:f|ht)tps?\\:\\/\\//.test(url)) {\r\n result = `http://${url}`\r\n }\r\n return result\r\n }\r\n}\r\n\r\nTooltip.TEMPLATE = [\r\n `<input type=\"text\" data-formula=\"e=mc^2\" data-link=\"${LANG_CONF.linkplaceholder}\" data-video=\"Embed URL\" style=\"width: 225px;\">`,\r\n '<span class=\"ql-split\"></span>',\r\n '<a class=\"ql-preview\"><i class=\"icon-share\"></i></a>',\r\n '<a class=\"ql-remove\"><i class=\"icon-delete\"></i></a>',\r\n].join('')\r\n"],"names":["BaseTooltip","debounce","LinkBlot","link","Range","isNullOrUndefined","selection","LANG_CONF"],"mappings":";;;;;;;;;;AAcA,MAAqB,gBAAgBA,KAAAA,YAAY;AAAA,EAc/C,YAAY,OAAO,QAAQ;AACzB,UAAM,OAAO,MAAM;AACnB,SAAK,eAAe;AACpB,SAAK,UAAU;AAEf,SAAK,uBAAuBC,SAAA,SAAS,KAAK,aAAa,GAAG;AAC1D,SAAK,uBAAuBA,SAAA,SAAS,KAAK,aAAa,GAAG;AAAA,EAC5D;AAAA,EAEA,aAAa;AACX,WAAO,CAAC,KAAK,WAAW,CAAC,KAAK;AAAA,EAChC;AAAA,EAEA,cAAc;AACR,QAAA,KAAK,cAAc;AACrB,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,YAAY,MAAM,OAAO,OAAO;AAC1B,QAAA,CAAC,KAAK,cAAc;AACjB,WAAA,KAAK,MAAM,OAAO,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,mBAAmB;AACjB,SAAK,UAAU;AACf,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEA,iBAAiB,OAAO;AACtB,UAAM,gBAAgB,CAAC,KAAK,KAAK,UAAU,SAAS,WAAW;AAC/D,QAAI,eAAe;AACjB;AAAA,IACF;AAEA,QAAI,KAAK,cAAc;AACrB,WAAK,KAAK;AAAA,IACZ;AACA,SAAK,UAAU;AACf,UAAM,WAAW,MAAM;AACjB,UAAA,UAAUC,KAAAA,QAAS,QAAQ,QAAQ;AACrC,QAAA,QAAQ,WAAW,GAAG,GAAG;AAC3B;AAAA,IACF;AACM,UAAA,WAAW,MAAM,KAAK,QAAQ;AACpC,UAAM,QAAQ,KAAK,MAAM,SAAS,QAAQ;AAC1C,UAAM,CAACC,QAAM,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,MACvCD,KAAA;AAAA,MACA;AAAA,IAAA;AAEI,UAAA,SAASC,UAAQA,OAAK,OAAO;AACnC,SAAK,YAAY,IAAIC,UAAAA,MAAM,QAAQ,QAAQ,MAAM;AACjD,SAAK,qBAAqB,QAAQ,SAAS,KAAK,SAAS;AAAA,EAC3D;AAAA,EAEA,SAAS;AACP,UAAM,OAAO;AAEb,SAAK,KAAK,cAAc,aAAa,EAAE,iBAAiB,SAAS,CAAC,UAAU;AAC1E,UAAI,CAACC,aAAA,kBAAkB,KAAK,SAAS,GAAG;AACtC,cAAM,QAAQ,KAAK;AACnB,aAAK,aAAa;AAClB,aAAK,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,QAAQ,GAAG;AAC/D,eAAO,KAAK;AAAA,MACd;AACA,YAAM,eAAe;AACrB,WAAK,KAAK;AAAA,IAAA,CACX;AAED,SAAK,MAAM,KAAK;AAAA,MACd;AAAA,MACA,CAAC,UAAU;AAEN,aAAA,MAAM,OAAO,QAAQ,kBAAkB,OACnC,CAAC,MAAM,OAAO,UAAU,SAASH,aAAS,SAAS,MACnD,CAAC,MAAM,OAAO,QAAQ,KAAKA,KAAA,QAAS,SAAS,EAAE,GACpD;AACA;AAAA,QACF;AACA,aAAK,iBAAiB,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,IAAA;AAGF,SAAK,MAAM,KAAK;AAAA,MACd;AAAA,MACA,CAAC,UAAU;AACT,YAAI,MAAM,OAAO,QAAQ,kBAAkB,OAAO,CAAC,MAAM,OAAO,QAAQ,KAAKA,KAAS,QAAA,SAAS,EAAE,GAAG;AAClG;AAAA,QACF;AACA,aAAK,iBAAiB;AAAA,MACxB;AAAA,MACA;AAAA,IAAA;AAGF,SAAK,KAAK;AAAA,MACR;AAAA,MACA,MAAM;AACJ,aAAK,UAAU;AAAA,MACjB;AAAA,MACA;AAAA,IAAA;AAGG,SAAA,KAAK,iBAAiB,cAAc,KAAK,iBAAiB,KAAK,IAAI,GAAG,KAAK;AAEhF,SAAK,KAAK,cAAc,cAAc,EAAE,iBAAiB,SAAS,CAAC,UAAU;AAC3E,YAAMC,SAAOD,KAAAA,QAAS,SAAS,KAAK,QAAQ,KAAK;AAC1C,aAAA,KAAKC,QAAM,QAAQ;AAC1B,YAAM,eAAe;AAAA,IAAA,CACtB;AACD,SAAK,KAAK,cAAc,oBAAoB,EAAE,iBAAiB,SAAS,MAAM;AAC5E,WAAK,eAAe;AAAA,IAAA,CACrB;AACD,SAAK,KAAK,cAAc,oBAAoB,EAAE,iBAAiB,QAAQ,MAAM;AAC3E,WAAK,eAAe;AACpB,WAAK,KAAK;AAAA,IAAA,CACX;AACD,SAAK,MAAM;AAAA,MACT,QAAQ,OAAO;AAAA,MACf,CAAC,OAAO,WAAW,WAAW;AACxB,YAAAE,aAAA,kBAAkB,KAAK,EAAG;AAC1B,YAAA,WAAW,QAAQ,QAAQ,MAAM;AACnC,gBAAM,CAACF,QAAM,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,YACvCD,KAAA;AAAA,YACA,MAAM;AAAA,UAAA;AAGJ,cAAA,CAACG,aAAAA,kBAAkBF,MAAI,GAAG;AACvB,iBAAA,YAAY,IAAIC,UAAAA,MAAM,MAAM,QAAQ,QAAQD,OAAK,QAAQ;AAC9D,kBAAM,UAAUD,KAAA,QAAS,QAAQC,OAAK,OAAO;AAC7C,gBAAI,CAAC,QAAQ,WAAW,GAAG,GAAG;AAC5B,mBAAK,KAAK,QAAQ,SAAS,KAAK,SAAS;AAAA,YAC3C;AACA;AAAA,UACF;AAAA,QACF;AACI,YAAA,KAAK,cAAc;AACrB,eAAK,KAAK;AAAA,QACZ;AAAA,MACF;AAAA,IAAA;AAEF,SAAK,MAAM;AAAA,MACT,QAAQ,OAAO;AAAA,MACf,MAAM;AACE,cAAAG,aAAY,KAAK,MAAM,aAAa;AACpC,cAAA,QAAQA,cAAaA,WAAU;AACrC,mBAAW,MAAM;AACT,gBAAAH,SAAO,KAAK,MAAM,OAAO;AAAA,YAC7BD,KAAA;AAAA,YACA;AAAA,YACA,CAAC;AACH,cAAI,CAACC,QAAM;AACT,iBAAK,iBAAiB;AAAA,UACxB;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO;AACD,QAAA,QAAQ,KAAK,QAAQ;AACzB,QAAI,CAAC,MAAO;AACZ,SAAK,QAAQ,QAAQ;AACrB,YAAQ,KAAK,KAAK,aAAa,WAAW,GAAG;AAAA,MAC3C,KAAK,QAAQ;AACX,cAAM,EAAE,UAAc,IAAA,KAAK,MAAM;AACjC,cAAM,EAAE,aAAiB,IAAA,KAAK,MAAM;AACpC,YAAI,cAAc;AACR,kBAAA,KAAK,gBAAgB,KAAK;AAAA,QACpC;AAEA,YAAI,KAAK,WAAW;AAClB,eAAK,MAAM;AAAA,YACT,KAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA,QAAQ,QAAQ;AAAA,UAAA;AAElB,eAAK,aAAa;AAAA,QAAA,OAEf;AACH,eAAK,aAAa;AAClB,eAAK,MAAM,OAAO,QAAQ,OAAO,QAAQ,QAAQ,IAAI;AAAA,QACvD;AACK,aAAA,MAAM,KAAK,YAAY;AAC5B;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,cAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AACtC,YAAA,CAACE,aAAAA,kBAAkB,KAAK,GAAG;AACvB,gBAAA,QAAQ,MAAM,QAAQ,MAAM;AAClC,eAAK,MAAM;AAAA,YACT;AAAA,YACA,KAAK,KAAK,aAAa,WAAW;AAAA,YAClC;AAAA,YACA,QAAQ,QAAQ;AAAA,UAAA;AAElB,cAAI,KAAK,KAAK,aAAa,WAAW,MAAM,WAAW;AACrD,iBAAK,MAAM,WAAW,QAAQ,GAAG,KAAK,QAAQ,QAAQ,IAAI;AAAA,UAC5D;AACA,eAAK,MAAM,aAAa,QAAQ,GAAG,QAAQ,QAAQ,IAAI;AAAA,QACzD;AACA;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AAC1C,aAAK,MAAM,WAAW,MAAM,OAAO,MAAM,QAAQ,QAAQ,IAAI;AAC7D,aAAK,MAAM,YAAY,MAAM,QAAQ,GAAG,SAAS,EAAE,KAAK,MAAM,GAAG,QAAQ,QAAQ,IAAI;AAChF,aAAA,MAAM,WAAW,MAAM,QAAQ,GAAG,MAAM,QAAQ,QAAQ,IAAI;AACjE,aAAK,MAAM,aAAa,MAAM,QAAQ,GAAG,QAAQ,QAAQ,MAAM;AAC/D,aAAK,QAAQ,QAAQ;AACrB,aAAK,KAAK;AACV;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS,WAAW;AAClB,UAAM,OAAO,UAAU;AACvB,UAAM,MAAM,UAAU,SAAS,KAAK,MAAM,KAAK;AAC/C,SAAK,KAAK,MAAM,OAAO,GAAG,IAAI;AAC9B,SAAK,KAAK,MAAM,MAAM,GAAG,GAAG;AACvB,SAAA,KAAK,UAAU,OAAO,SAAS;AAC9B,UAAA,kBAAkB,KAAK,gBAAgB,sBAAsB;AAC7D,UAAA,aAAa,KAAK,KAAK,sBAAsB;AACnD,QAAI,QAAQ;AACR,QAAA,WAAW,QAAQ,gBAAgB,OAAO;AACpC,cAAA,gBAAgB,QAAQ,WAAW;AAC3C,WAAK,KAAK,MAAM,OAAO,GAAG,OAAO,KAAK;AAAA,IACxC;AACI,QAAA,WAAW,OAAO,gBAAgB,MAAM;AAClC,cAAA,gBAAgB,OAAO,WAAW;AAC1C,WAAK,KAAK,MAAM,OAAO,GAAG,OAAO,KAAK;AAAA,IACxC;AACI,QAAA,WAAW,SAAS,gBAAgB,QAAQ;AACxC,YAAA,SAAS,WAAW,SAAS,WAAW;AAC9C,YAAM,gBAAgB,UAAU,SAAS,UAAU,MAAM;AACzD,YAAM,WAAW,MAAM;AACvB,WAAK,KAAK,MAAM,MAAM,GAAG,WAAW,IAAI,KAAK,MAAM,KAAK,YAAY,UAAU,MAAM,QAAQ;AACvF,WAAA,KAAK,UAAU,IAAI,SAAS;AAAA,IACnC;AACO,WAAA;AAAA,EACT;AAAA,EAEA,KAAK,OAAO,QAAQ,UAAU,MAAM,OAAO;AACzC,SAAK,YAAY,SAAS,KAAK,MAAM,UAAU;AAC1C,SAAA,KAAK,UAAU,OAAO,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,YAAY;AAChC,QAAA,CAACA,aAAAA,kBAAkB,OAAO,GAAG;AAC/B,WAAK,QAAQ,QAAQ;AAAA,IAAA,WAEd,SAAS,KAAK,KAAK,aAAa,WAAW,GAAG;AACrD,WAAK,QAAQ,QAAQ;AAAA,IACvB;AACK,SAAA,SAAS,KAAK,MAAM,UAAU,SAAS,KAAK,MAAM,UAAU,UAAU,CAAC;AACxE,QAAA,KAAK,QAAQ,UAAU,IAAI;AAC7B,WAAK,QAAQ;IACf;AACA,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK,QAAQ,aAAa,QAAQ,IAAI,EAAE,KAAK;AAAA,IAAA;AAE1C,SAAA,KAAK,aAAa,aAAa,IAAI;AAAA,EAC1C;AAAA,EAEA,OAAO;AACL,UAAM,KAAK;AACN,SAAA,KAAK,gBAAgB,WAAW;AAAA,EACvC;AAAA,EAEA,gBAAgB,KAAK;AACnB,QAAI,SAAS;AACb,QAAI,CAAC,KAAK;AACD,aAAA;AAAA,IACT;AACA,QAAI,CAAC,sBAAsB,KAAK,GAAG,GAAG;AACpC,eAAS,UAAU,GAAG;AAAA,IACxB;AACO,WAAA;AAAA,EACT;AACF;AAEA,QAAQ,WAAW;AAAA,EACjB,uDAAuDE,cAAAA,UAAU,eAAe;AAAA,EAChF;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,EAAE;;"}
1
+ {"version":3,"file":"tooltip.cjs.js","sources":["../../../../src/link/modules/tooltip.ts"],"sourcesContent":["import Quill, { Range } from 'quill'\r\nimport Emitter from 'quill/core/emitter'\r\nimport { BaseTooltip } from 'quill/themes/base'\r\nimport { debounce } from '../../../src/utils/debounce'\r\nimport { LANG_CONF } from '../../config/editor.config'\r\nimport { hadProtocol, isNullOrUndefined } from '../../config/editor.utils'\r\nimport LinkBlot from '../formats/link'\r\n\r\n// const Emitter = Quill.imports['core/emitter'];\r\n// const BaseTooltip = Quill.imports['themes/BaseTooltip'];\r\n\r\n// @dynamic\r\nexport default class Tooltip extends BaseTooltip {\r\n static TEMPLATE: string\r\n isInputFocus: boolean\r\n isHover: boolean\r\n debouncedHideToolTip: any\r\n debouncedShowToolTip: any\r\n hide: any\r\n linkRange: any\r\n quill: any\r\n root: any\r\n restoreFocus: any\r\n textbox: any\r\n boundsContainer: any\r\n options: { autoProtocol: string } = {\r\n autoProtocol: 'https',\r\n }\r\n\r\n constructor(quill, bounds) {\r\n super(quill, bounds)\r\n this.isInputFocus = false\r\n this.isHover = false\r\n\r\n this.resolveOptions()\r\n LinkBlot.autoProtocol = this.options.autoProtocol\r\n this.debouncedHideToolTip = debounce(this.hideToolTip, 300)\r\n this.debouncedShowToolTip = debounce(this.showToolTip, 300)\r\n }\r\n\r\n resolveOptions() {\r\n this.options = {\r\n autoProtocol: 'https',\r\n }\r\n const value = this.quill.options.autoProtocol\r\n if (value && typeof value === 'string') {\r\n this.options.autoProtocol = value\r\n }\r\n else if (typeof value === 'boolean' && !value) {\r\n this.options.autoProtocol = ''\r\n }\r\n }\r\n\r\n shouldHide() {\r\n return !this.isHover && !this.isInputFocus\r\n }\r\n\r\n hideToolTip() {\r\n if (this.shouldHide()) {\r\n this.hide()\r\n }\r\n }\r\n\r\n showToolTip(name, value, range) {\r\n if (!this.shouldHide()) {\r\n this.edit(name, value, range)\r\n }\r\n }\r\n\r\n handleMouseLeave() {\r\n this.isHover = false\r\n this.debouncedHideToolTip()\r\n }\r\n\r\n handleMouseEnter(event) {\r\n const isTooltipShow = !this.root.classList.contains('ql-hidden')\r\n if (isTooltipShow) {\r\n return\r\n }\r\n\r\n if (this.isInputFocus) {\r\n this.save()\r\n }\r\n this.isHover = true\r\n const linkNode = event.target\r\n const preview = LinkBlot.formats(linkNode)\r\n if (preview.startsWith('#')) {\r\n return\r\n }\r\n const linkBlot = Quill.find(linkNode)\r\n const index = this.quill.getIndex(linkBlot)\r\n const [link, offset] = this.quill.scroll.descendant(\r\n LinkBlot,\r\n index,\r\n )\r\n const length = link && link.length()\r\n this.linkRange = new Range(index - offset, length)\r\n this.debouncedShowToolTip('link', preview, this.linkRange)\r\n }\r\n\r\n listen() {\r\n super.listen()\r\n\r\n this.root.querySelector('a.ql-remove').addEventListener('click', (event) => {\r\n if (!isNullOrUndefined(this.linkRange)) {\r\n const range = this.linkRange\r\n this.restoreFocus()\r\n this.quill.formatText(range, 'link', false, Emitter.sources.API)\r\n delete this.linkRange\r\n }\r\n event.preventDefault()\r\n this.hide()\r\n })\r\n\r\n this.quill.root.addEventListener(\r\n 'mouseover',\r\n (event) => {\r\n if (\r\n (event.target.tagName.toUpperCase() !== 'A'\r\n || !event.target.classList.contains(LinkBlot.className))\r\n && !event.target.closest(`a.${LinkBlot.className}`)\r\n ) {\r\n return\r\n }\r\n this.handleMouseEnter(event)\r\n },\r\n false,\r\n )\r\n\r\n this.quill.root.addEventListener(\r\n 'mouseout',\r\n (event) => {\r\n if (event.target.tagName.toUpperCase() !== 'A' && !event.target.closest(`a.${LinkBlot.className}`)) {\r\n return\r\n }\r\n this.handleMouseLeave()\r\n },\r\n false,\r\n )\r\n\r\n this.root.addEventListener(\r\n 'mouseenter',\r\n () => {\r\n this.isHover = true\r\n },\r\n false,\r\n )\r\n\r\n this.root.addEventListener('mouseleave', this.handleMouseLeave.bind(this), false)\r\n\r\n this.root.querySelector('a.ql-preview').addEventListener('click', (event) => {\r\n const link = LinkBlot.sanitize(this.textbox.value)\r\n window.open(link, '_blank')\r\n event.preventDefault()\r\n })\r\n this.root.querySelector('input[type=\"text\"]').addEventListener('focus', () => {\r\n this.isInputFocus = true\r\n })\r\n this.root.querySelector('input[type=\"text\"]').addEventListener('blur', () => {\r\n this.isInputFocus = false\r\n this.save()\r\n })\r\n this.quill.on(\r\n Emitter.events.SELECTION_CHANGE,\r\n (range, _oldRange, source) => {\r\n if (isNullOrUndefined(range)) return\r\n if (source === Emitter.sources.USER) {\r\n const [link, offset] = this.quill.scroll.descendant(\r\n LinkBlot,\r\n range.index,\r\n )\r\n\r\n if (!isNullOrUndefined(link)) {\r\n this.linkRange = new Range(range.index - offset, link.length())\r\n const preview = LinkBlot.formats(link.domNode)\r\n if (!preview.startsWith('#')) {\r\n this.edit('link', preview, this.linkRange)\r\n }\r\n return\r\n }\r\n }\r\n if (this.shouldHide()) {\r\n this.hide()\r\n }\r\n },\r\n )\r\n this.quill.on(\r\n Emitter.events.TEXT_CHANGE,\r\n () => {\r\n const selection = this.quill.getSelection()\r\n const index = selection && selection.index\r\n setTimeout(() => {\r\n const link = this.quill.scroll.descendant(\r\n LinkBlot,\r\n index,\r\n )[0]\r\n if (!link) {\r\n this.handleMouseLeave()\r\n }\r\n })\r\n },\r\n )\r\n }\r\n\r\n save() {\r\n let value = this.textbox.value\r\n if (!value) return\r\n this.textbox.value = ''\r\n switch (this.root.getAttribute('data-mode')) {\r\n case 'link': {\r\n const { scrollTop } = this.quill.root\r\n if (this.options.autoProtocol) {\r\n value = this.addHttpProtocol(value)\r\n }\r\n\r\n if (this.linkRange) {\r\n this.quill.formatText(\r\n this.linkRange,\r\n 'link',\r\n value,\r\n Emitter.sources.USER,\r\n )\r\n this.restoreFocus()\r\n }\r\n else {\r\n this.restoreFocus()\r\n this.quill.format('link', value, Emitter.sources.USER)\r\n }\r\n this.quill.root.scrollTop = scrollTop\r\n break\r\n }\r\n case 'formula': {\r\n const range = this.quill.getSelection(true)\r\n if (!isNullOrUndefined(range)) {\r\n const index = range.index + range.length\r\n this.quill.insertEmbed(\r\n index,\r\n this.root.getAttribute('data-mode'),\r\n value,\r\n Emitter.sources.USER,\r\n )\r\n if (this.root.getAttribute('data-mode') === 'formula') {\r\n this.quill.insertText(index + 1, ' ', Emitter.sources.USER)\r\n }\r\n this.quill.setSelection(index + 2, Emitter.sources.USER)\r\n }\r\n break\r\n }\r\n case 'video': {\r\n const range = this.quill.getSelection(true)\r\n this.quill.insertText(range.index, '\\n', Emitter.sources.USER)\r\n this.quill.insertEmbed(range.index + 1, 'video', { src: value }, Emitter.sources.USER)\r\n this.quill.insertText(range.index + 2, '\\n', Emitter.sources.USER)\r\n this.quill.setSelection(range.index + 3, Emitter.sources.SILENT)\r\n this.textbox.value = ''\r\n this.hide()\r\n break\r\n }\r\n default:\r\n }\r\n }\r\n\r\n position(reference) {\r\n const left = reference.left\r\n const top = reference.bottom + this.quill.root.scrollTop\r\n this.root.style.left = `${left}px`\r\n this.root.style.top = `${top}px`\r\n this.root.classList.remove('ql-flip')\r\n const containerBounds = this.boundsContainer.getBoundingClientRect()\r\n const rootBounds = this.root.getBoundingClientRect()\r\n let shift = 0\r\n if (rootBounds.right > containerBounds.right) {\r\n shift = containerBounds.right - rootBounds.right\r\n this.root.style.left = `${left + shift}px`\r\n }\r\n if (rootBounds.left < containerBounds.left) {\r\n shift = containerBounds.left - rootBounds.left\r\n this.root.style.left = `${left + shift}px`\r\n }\r\n if (rootBounds.bottom > containerBounds.bottom) {\r\n const height = rootBounds.bottom - rootBounds.top\r\n const verticalShift = reference.bottom - reference.top + height\r\n const fixedTop = top - verticalShift\r\n this.root.style.top = `${fixedTop < 0 ? this.quill.root.scrollTop + reference.top : fixedTop}px`\r\n this.root.classList.add('ql-flip')\r\n }\r\n return shift\r\n }\r\n\r\n // @ts-expect-error\r\n edit(mode: string = 'link', preview = null, range) {\r\n this.linkRange = range || this.quill.selection.savedRange\r\n this.root.classList.remove('ql-hidden')\r\n this.root.classList.add('ql-editing')\r\n if (!isNullOrUndefined(preview)) {\r\n this.textbox.value = preview\r\n }\r\n else if (mode !== this.root.getAttribute('data-mode')) {\r\n this.textbox.value = ''\r\n }\r\n this.position(this.quill.getBounds(range || this.quill.selection.savedRange))\r\n if (this.textbox.value === '') {\r\n this.textbox.focus()\r\n }\r\n this.textbox.setAttribute(\r\n 'placeholder',\r\n this.textbox.getAttribute(`data-${mode}`) || '',\r\n )\r\n this.root.setAttribute('data-mode', mode)\r\n }\r\n\r\n show() {\r\n super.show()\r\n this.root.removeAttribute('data-mode')\r\n }\r\n\r\n addHttpProtocol(url: string) {\r\n let result = url\r\n if (!url) {\r\n return ''\r\n }\r\n if (!hadProtocol(url)) {\r\n result = `${this.options.autoProtocol}://${url}`\r\n }\r\n return result\r\n }\r\n}\r\n\r\nTooltip.TEMPLATE = [\r\n `<input type=\"text\" data-formula=\"e=mc^2\" data-link=\"${LANG_CONF.linkplaceholder}\" data-video=\"Embed URL\" style=\"width: 225px;\">`,\r\n '<span class=\"ql-split\"></span>',\r\n '<a class=\"ql-preview\"><i class=\"icon-share\"></i></a>',\r\n '<a class=\"ql-remove\"><i class=\"icon-delete\"></i></a>',\r\n].join('')\r\n"],"names":["BaseTooltip","LinkBlot","debounce","link","Range","isNullOrUndefined","hadProtocol","LANG_CONF"],"mappings":";;;;;;;;;AAYA,MAAqB,gBAAgBA,KAAAA,YAAY;AAAA,EAiB/C,YAAY,OAAO,QAAQ;AACzB,UAAM,OAAO,MAAM;AALe,SAAA,UAAA;AAAA,MAClC,cAAc;AAAA,IAAA;AAKd,SAAK,eAAe;AACpB,SAAK,UAAU;AAEf,SAAK,eAAe;AACXC,SAAAA,QAAA,eAAe,KAAK,QAAQ;AACrC,SAAK,uBAAuBC,SAAA,SAAS,KAAK,aAAa,GAAG;AAC1D,SAAK,uBAAuBA,SAAA,SAAS,KAAK,aAAa,GAAG;AAAA,EAC5D;AAAA,EAEA,iBAAiB;AACf,SAAK,UAAU;AAAA,MACb,cAAc;AAAA,IAAA;AAEV,UAAA,QAAQ,KAAK,MAAM,QAAQ;AAC7B,QAAA,SAAS,OAAO,UAAU,UAAU;AACtC,WAAK,QAAQ,eAAe;AAAA,IAErB,WAAA,OAAO,UAAU,aAAa,CAAC,OAAO;AAC7C,WAAK,QAAQ,eAAe;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,aAAa;AACX,WAAO,CAAC,KAAK,WAAW,CAAC,KAAK;AAAA,EAChC;AAAA,EAEA,cAAc;AACR,QAAA,KAAK,cAAc;AACrB,WAAK,KAAK;AAAA,IACZ;AAAA,EACF;AAAA,EAEA,YAAY,MAAM,OAAO,OAAO;AAC1B,QAAA,CAAC,KAAK,cAAc;AACjB,WAAA,KAAK,MAAM,OAAO,KAAK;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,mBAAmB;AACjB,SAAK,UAAU;AACf,SAAK,qBAAqB;AAAA,EAC5B;AAAA,EAEA,iBAAiB,OAAO;AACtB,UAAM,gBAAgB,CAAC,KAAK,KAAK,UAAU,SAAS,WAAW;AAC/D,QAAI,eAAe;AACjB;AAAA,IACF;AAEA,QAAI,KAAK,cAAc;AACrB,WAAK,KAAK;AAAA,IACZ;AACA,SAAK,UAAU;AACf,UAAM,WAAW,MAAM;AACjB,UAAA,UAAUD,KAAAA,QAAS,QAAQ,QAAQ;AACrC,QAAA,QAAQ,WAAW,GAAG,GAAG;AAC3B;AAAA,IACF;AACM,UAAA,WAAW,MAAM,KAAK,QAAQ;AACpC,UAAM,QAAQ,KAAK,MAAM,SAAS,QAAQ;AAC1C,UAAM,CAACE,QAAM,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,MACvCF,KAAA;AAAA,MACA;AAAA,IAAA;AAEI,UAAA,SAASE,UAAQA,OAAK,OAAO;AACnC,SAAK,YAAY,IAAIC,MAAAA,MAAM,QAAQ,QAAQ,MAAM;AACjD,SAAK,qBAAqB,QAAQ,SAAS,KAAK,SAAS;AAAA,EAC3D;AAAA,EAEA,SAAS;AACP,UAAM,OAAO;AAEb,SAAK,KAAK,cAAc,aAAa,EAAE,iBAAiB,SAAS,CAAC,UAAU;AAC1E,UAAI,CAACC,aAAA,kBAAkB,KAAK,SAAS,GAAG;AACtC,cAAM,QAAQ,KAAK;AACnB,aAAK,aAAa;AAClB,aAAK,MAAM,WAAW,OAAO,QAAQ,OAAO,QAAQ,QAAQ,GAAG;AAC/D,eAAO,KAAK;AAAA,MACd;AACA,YAAM,eAAe;AACrB,WAAK,KAAK;AAAA,IAAA,CACX;AAED,SAAK,MAAM,KAAK;AAAA,MACd;AAAA,MACA,CAAC,UAAU;AAEN,aAAA,MAAM,OAAO,QAAQ,kBAAkB,OACnC,CAAC,MAAM,OAAO,UAAU,SAASJ,aAAS,SAAS,MACnD,CAAC,MAAM,OAAO,QAAQ,KAAKA,KAAA,QAAS,SAAS,EAAE,GACpD;AACA;AAAA,QACF;AACA,aAAK,iBAAiB,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,IAAA;AAGF,SAAK,MAAM,KAAK;AAAA,MACd;AAAA,MACA,CAAC,UAAU;AACT,YAAI,MAAM,OAAO,QAAQ,kBAAkB,OAAO,CAAC,MAAM,OAAO,QAAQ,KAAKA,KAAS,QAAA,SAAS,EAAE,GAAG;AAClG;AAAA,QACF;AACA,aAAK,iBAAiB;AAAA,MACxB;AAAA,MACA;AAAA,IAAA;AAGF,SAAK,KAAK;AAAA,MACR;AAAA,MACA,MAAM;AACJ,aAAK,UAAU;AAAA,MACjB;AAAA,MACA;AAAA,IAAA;AAGG,SAAA,KAAK,iBAAiB,cAAc,KAAK,iBAAiB,KAAK,IAAI,GAAG,KAAK;AAEhF,SAAK,KAAK,cAAc,cAAc,EAAE,iBAAiB,SAAS,CAAC,UAAU;AAC3E,YAAME,SAAOF,KAAAA,QAAS,SAAS,KAAK,QAAQ,KAAK;AAC1C,aAAA,KAAKE,QAAM,QAAQ;AAC1B,YAAM,eAAe;AAAA,IAAA,CACtB;AACD,SAAK,KAAK,cAAc,oBAAoB,EAAE,iBAAiB,SAAS,MAAM;AAC5E,WAAK,eAAe;AAAA,IAAA,CACrB;AACD,SAAK,KAAK,cAAc,oBAAoB,EAAE,iBAAiB,QAAQ,MAAM;AAC3E,WAAK,eAAe;AACpB,WAAK,KAAK;AAAA,IAAA,CACX;AACD,SAAK,MAAM;AAAA,MACT,QAAQ,OAAO;AAAA,MACf,CAAC,OAAO,WAAW,WAAW;AACxB,YAAAE,aAAA,kBAAkB,KAAK,EAAG;AAC1B,YAAA,WAAW,QAAQ,QAAQ,MAAM;AACnC,gBAAM,CAACF,QAAM,MAAM,IAAI,KAAK,MAAM,OAAO;AAAA,YACvCF,KAAA;AAAA,YACA,MAAM;AAAA,UAAA;AAGJ,cAAA,CAACI,aAAAA,kBAAkBF,MAAI,GAAG;AACvB,iBAAA,YAAY,IAAIC,MAAAA,MAAM,MAAM,QAAQ,QAAQD,OAAK,QAAQ;AAC9D,kBAAM,UAAUF,KAAA,QAAS,QAAQE,OAAK,OAAO;AAC7C,gBAAI,CAAC,QAAQ,WAAW,GAAG,GAAG;AAC5B,mBAAK,KAAK,QAAQ,SAAS,KAAK,SAAS;AAAA,YAC3C;AACA;AAAA,UACF;AAAA,QACF;AACI,YAAA,KAAK,cAAc;AACrB,eAAK,KAAK;AAAA,QACZ;AAAA,MACF;AAAA,IAAA;AAEF,SAAK,MAAM;AAAA,MACT,QAAQ,OAAO;AAAA,MACf,MAAM;AACE,cAAA,YAAY,KAAK,MAAM,aAAa;AACpC,cAAA,QAAQ,aAAa,UAAU;AACrC,mBAAW,MAAM;AACT,gBAAAA,SAAO,KAAK,MAAM,OAAO;AAAA,YAC7BF,KAAA;AAAA,YACA;AAAA,YACA,CAAC;AACH,cAAI,CAACE,QAAM;AACT,iBAAK,iBAAiB;AAAA,UACxB;AAAA,QAAA,CACD;AAAA,MACH;AAAA,IAAA;AAAA,EAEJ;AAAA,EAEA,OAAO;AACD,QAAA,QAAQ,KAAK,QAAQ;AACzB,QAAI,CAAC,MAAO;AACZ,SAAK,QAAQ,QAAQ;AACrB,YAAQ,KAAK,KAAK,aAAa,WAAW,GAAG;AAAA,MAC3C,KAAK,QAAQ;AACX,cAAM,EAAE,UAAc,IAAA,KAAK,MAAM;AAC7B,YAAA,KAAK,QAAQ,cAAc;AACrB,kBAAA,KAAK,gBAAgB,KAAK;AAAA,QACpC;AAEA,YAAI,KAAK,WAAW;AAClB,eAAK,MAAM;AAAA,YACT,KAAK;AAAA,YACL;AAAA,YACA;AAAA,YACA,QAAQ,QAAQ;AAAA,UAAA;AAElB,eAAK,aAAa;AAAA,QAAA,OAEf;AACH,eAAK,aAAa;AAClB,eAAK,MAAM,OAAO,QAAQ,OAAO,QAAQ,QAAQ,IAAI;AAAA,QACvD;AACK,aAAA,MAAM,KAAK,YAAY;AAC5B;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AACd,cAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AACtC,YAAA,CAACE,aAAAA,kBAAkB,KAAK,GAAG;AACvB,gBAAA,QAAQ,MAAM,QAAQ,MAAM;AAClC,eAAK,MAAM;AAAA,YACT;AAAA,YACA,KAAK,KAAK,aAAa,WAAW;AAAA,YAClC;AAAA,YACA,QAAQ,QAAQ;AAAA,UAAA;AAElB,cAAI,KAAK,KAAK,aAAa,WAAW,MAAM,WAAW;AACrD,iBAAK,MAAM,WAAW,QAAQ,GAAG,KAAK,QAAQ,QAAQ,IAAI;AAAA,UAC5D;AACA,eAAK,MAAM,aAAa,QAAQ,GAAG,QAAQ,QAAQ,IAAI;AAAA,QACzD;AACA;AAAA,MACF;AAAA,MACA,KAAK,SAAS;AACZ,cAAM,QAAQ,KAAK,MAAM,aAAa,IAAI;AAC1C,aAAK,MAAM,WAAW,MAAM,OAAO,MAAM,QAAQ,QAAQ,IAAI;AAC7D,aAAK,MAAM,YAAY,MAAM,QAAQ,GAAG,SAAS,EAAE,KAAK,MAAM,GAAG,QAAQ,QAAQ,IAAI;AAChF,aAAA,MAAM,WAAW,MAAM,QAAQ,GAAG,MAAM,QAAQ,QAAQ,IAAI;AACjE,aAAK,MAAM,aAAa,MAAM,QAAQ,GAAG,QAAQ,QAAQ,MAAM;AAC/D,aAAK,QAAQ,QAAQ;AACrB,aAAK,KAAK;AACV;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEA,SAAS,WAAW;AAClB,UAAM,OAAO,UAAU;AACvB,UAAM,MAAM,UAAU,SAAS,KAAK,MAAM,KAAK;AAC/C,SAAK,KAAK,MAAM,OAAO,GAAG,IAAI;AAC9B,SAAK,KAAK,MAAM,MAAM,GAAG,GAAG;AACvB,SAAA,KAAK,UAAU,OAAO,SAAS;AAC9B,UAAA,kBAAkB,KAAK,gBAAgB,sBAAsB;AAC7D,UAAA,aAAa,KAAK,KAAK,sBAAsB;AACnD,QAAI,QAAQ;AACR,QAAA,WAAW,QAAQ,gBAAgB,OAAO;AACpC,cAAA,gBAAgB,QAAQ,WAAW;AAC3C,WAAK,KAAK,MAAM,OAAO,GAAG,OAAO,KAAK;AAAA,IACxC;AACI,QAAA,WAAW,OAAO,gBAAgB,MAAM;AAClC,cAAA,gBAAgB,OAAO,WAAW;AAC1C,WAAK,KAAK,MAAM,OAAO,GAAG,OAAO,KAAK;AAAA,IACxC;AACI,QAAA,WAAW,SAAS,gBAAgB,QAAQ;AACxC,YAAA,SAAS,WAAW,SAAS,WAAW;AAC9C,YAAM,gBAAgB,UAAU,SAAS,UAAU,MAAM;AACzD,YAAM,WAAW,MAAM;AACvB,WAAK,KAAK,MAAM,MAAM,GAAG,WAAW,IAAI,KAAK,MAAM,KAAK,YAAY,UAAU,MAAM,QAAQ;AACvF,WAAA,KAAK,UAAU,IAAI,SAAS;AAAA,IACnC;AACO,WAAA;AAAA,EACT;AAAA;AAAA,EAGA,KAAK,OAAe,QAAQ,UAAU,MAAM,OAAO;AACjD,SAAK,YAAY,SAAS,KAAK,MAAM,UAAU;AAC1C,SAAA,KAAK,UAAU,OAAO,WAAW;AACjC,SAAA,KAAK,UAAU,IAAI,YAAY;AAChC,QAAA,CAACA,aAAAA,kBAAkB,OAAO,GAAG;AAC/B,WAAK,QAAQ,QAAQ;AAAA,IAAA,WAEd,SAAS,KAAK,KAAK,aAAa,WAAW,GAAG;AACrD,WAAK,QAAQ,QAAQ;AAAA,IACvB;AACK,SAAA,SAAS,KAAK,MAAM,UAAU,SAAS,KAAK,MAAM,UAAU,UAAU,CAAC;AACxE,QAAA,KAAK,QAAQ,UAAU,IAAI;AAC7B,WAAK,QAAQ;IACf;AACA,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK,QAAQ,aAAa,QAAQ,IAAI,EAAE,KAAK;AAAA,IAAA;AAE1C,SAAA,KAAK,aAAa,aAAa,IAAI;AAAA,EAC1C;AAAA,EAEA,OAAO;AACL,UAAM,KAAK;AACN,SAAA,KAAK,gBAAgB,WAAW;AAAA,EACvC;AAAA,EAEA,gBAAgB,KAAa;AAC3B,QAAI,SAAS;AACb,QAAI,CAAC,KAAK;AACD,aAAA;AAAA,IACT;AACI,QAAA,CAACC,aAAAA,YAAY,GAAG,GAAG;AACrB,eAAS,GAAG,KAAK,QAAQ,YAAY,MAAM,GAAG;AAAA,IAChD;AACO,WAAA;AAAA,EACT;AACF;AAEA,QAAQ,WAAW;AAAA,EACjB,uDAAuDC,cAAAA,UAAU,eAAe;AAAA,EAChF;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK,EAAE;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentiny/fluent-editor",
3
- "version": "3.20.3",
3
+ "version": "3.20.4-alpha.0",
4
4
  "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.",
5
5
  "author": "OpenTiny Team",
6
6
  "license": "MIT",
@@ -24,6 +24,7 @@
24
24
  ],
25
25
  "main": "lib/index.cjs.js",
26
26
  "module": "es/index.es.js",
27
+ "types": "types/index.d.ts",
27
28
  "scripts": {
28
29
  "start": "vite build && vite",
29
30
  "dev": "vite",
@@ -47,6 +48,7 @@
47
48
  "ts-jest": "^26.5.6",
48
49
  "ts-node": "^9.1.1",
49
50
  "typescript": "^4.9.5",
50
- "vite": "^5.0.0"
51
+ "vite": "^5.0.0",
52
+ "vite-plugin-dts": "^4.3.0"
51
53
  }
52
54
  }
package/style.css CHANGED
@@ -916,6 +916,12 @@
916
916
  .ql-container.ql-snow {
917
917
  border: 1px solid #ccc;
918
918
  }
919
+ :root {
920
+ --fe-editor-bg-color: #ffffff;
921
+ }
922
+ :root.dark {
923
+ --fe-editor-bg-color: #161618;
924
+ }
919
925
  .quill-better-table-wrapper {
920
926
  padding: 0;
921
927
  margin: 25px 25px 40px 25px;
@@ -1789,6 +1795,7 @@
1789
1795
  }
1790
1796
  .ql-container.ql-snow {
1791
1797
  border-top: 0;
1798
+ background-color: var(--fe-editor-bg-color);
1792
1799
  }
1793
1800
  .ql-editor {
1794
1801
  padding-bottom: 33px;
@@ -3504,6 +3511,24 @@ li.unchecked > .ql-ui {
3504
3511
  overflow: auto;
3505
3512
  height: 100%;
3506
3513
  }
3514
+ .fullscreen.ql-toolbar, .fullscreen.ql-container {
3515
+ --fe-fullscreen-z-index: 50;
3516
+ position: fixed;
3517
+ width: 100%;
3518
+ left: 0;
3519
+ background-color: var(--fe-editor-bg-color);
3520
+ z-index: var(--fe-fullscreen-z-index);
3521
+ }
3522
+ .fullscreen.ql-toolbar {
3523
+ --fe-fullscreen-container-z-index: calc(var(--fe-fullscreen-z-index) + 1);
3524
+ top: 0;
3525
+ z-index: var(--fe-fullscreen-container-z-index);
3526
+ }
3527
+ .fullscreen.ql-container {
3528
+ --fe-top: 0px;
3529
+ top: var(--fe-top);
3530
+ height: calc(100% - var(--fe-top));
3531
+ }
3507
3532
  .ql-screenshot-wrapper {
3508
3533
  --ql-screenshot-color-bg: rgba(0, 0, 0, 0.5);
3509
3534
  --ql-screenshot-color-confirm: #2196f3;
@@ -3804,6 +3829,9 @@ li.unchecked > .ql-ui {
3804
3829
  .ql-toolbar.toolbar-bottom {
3805
3830
  border-top: 0;
3806
3831
  }
3832
+ .ql-toolbar.ql-snow {
3833
+ background-color: var(--fe-editor-bg-color);
3834
+ }
3807
3835
  .ql-toolbar.ql-snow button {
3808
3836
  display: inline-flex;
3809
3837
  align-items: center;
@@ -0,0 +1,4 @@
1
+ export * from './font-size';
2
+ export * from './font-style';
3
+ export * from './line-height';
4
+ export * from './text-indent';