@maketribe/ms-app 3.2.40 → 3.2.41

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 (30) hide show
  1. package/dist/cjs/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.js +2 -2
  2. package/dist/cjs/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.js.map +1 -1
  3. package/dist/cjs/components/basic/doc-editor/plugins/AutoLinkPlugin/index.vue.js +1 -27
  4. package/dist/cjs/components/basic/doc-editor/plugins/AutoLinkPlugin/index.vue.js.map +1 -1
  5. package/dist/cjs/components/basic/doc-editor/plugins/ToolbarPlugin/ContentStyleTool.vue.js +0 -1
  6. package/dist/cjs/components/basic/doc-editor/plugins/ToolbarPlugin/ContentStyleTool.vue.js.map +1 -1
  7. package/dist/cjs/components/basic/doc-editor/plugins/ToolbarPlugin/FontStyleTool.vue.js +1 -3
  8. package/dist/cjs/components/basic/doc-editor/plugins/ToolbarPlugin/FontStyleTool.vue.js.map +1 -1
  9. package/dist/esm/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.js +2 -2
  10. package/dist/esm/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.js.map +1 -1
  11. package/dist/esm/components/basic/doc-editor/plugins/AutoLinkPlugin/index.vue.js +3 -29
  12. package/dist/esm/components/basic/doc-editor/plugins/AutoLinkPlugin/index.vue.js.map +1 -1
  13. package/dist/esm/components/basic/doc-editor/plugins/ToolbarPlugin/ContentStyleTool.vue.js +0 -1
  14. package/dist/esm/components/basic/doc-editor/plugins/ToolbarPlugin/ContentStyleTool.vue.js.map +1 -1
  15. package/dist/esm/components/basic/doc-editor/plugins/ToolbarPlugin/FontStyleTool.vue.js +2 -4
  16. package/dist/esm/components/basic/doc-editor/plugins/ToolbarPlugin/FontStyleTool.vue.js.map +1 -1
  17. package/dist/types/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.d.ts +1 -1
  18. package/package.json +4 -4
  19. package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue.js +0 -4
  20. package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue.js.map +0 -1
  21. package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue2.js +0 -37
  22. package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue2.js.map +0 -1
  23. package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/shared.js +0 -176
  24. package/dist/cjs/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/shared.js.map +0 -1
  25. package/dist/esm/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue.js +0 -5
  26. package/dist/esm/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue.js.map +0 -1
  27. package/dist/esm/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue2.js +0 -38
  28. package/dist/esm/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue2.js.map +0 -1
  29. package/dist/esm/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/shared.js +0 -176
  30. package/dist/esm/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/shared.js.map +0 -1
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const vue = require("vue");
4
4
  const dm = require("@maketribe/dm");
5
5
  const elementPlus = require("element-plus");
6
- const ShowLinkEditPanel = async (href) => {
6
+ const showLinkEditPanel = async (href) => {
7
7
  return new Promise((resolve, reject) => {
8
8
  const hrefValue = vue.ref(href);
9
9
  const handleCancelClick = () => {
@@ -47,5 +47,5 @@ const ShowLinkEditPanel = async (href) => {
47
47
  });
48
48
  });
49
49
  };
50
- exports.ShowLinkEditPanel = ShowLinkEditPanel;
50
+ exports.showLinkEditPanel = showLinkEditPanel;
51
51
  //# sourceMappingURL=LinkEditDialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LinkEditDialog.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.tsx"],"sourcesContent":["\r\nimport { Fragment,ref,unref } from 'vue'\r\nimport { Dialoger } from '@maketribe/dm'\r\nimport { ElButton ,ElInput } from \"element-plus\";\r\n/**\r\n * \r\n * @param href \r\n * @returns \r\n */\r\nexport const ShowLinkEditPanel = async (href:any) => {\r\n return new Promise((resolve,reject) => {\r\n\r\n const hrefValue = ref(href)\r\n\r\n // 取消编辑\r\n const handleCancelClick = () => {\r\n dialogInstance.destroy();\r\n };\r\n\r\n // 确认编辑\r\n const handleConfirmClick = () => {\r\n dialogInstance.destroy();\r\n resolve(hrefValue.value);\r\n };\r\n\r\n const dialogInstance = Dialoger.customRender({\r\n title: \"设置连接\",\r\n class: \"mk-html-editor-dialog\",\r\n width: \"500px\",\r\n onClose: () => {\r\n dialogInstance.destroy();\r\n },\r\n body: () => {\r\n return <ElInput v-model={hrefValue.value} clearable={true} placeholder='http://www.xxx.com' v-slots={\r\n {\r\n prepend:()=>{\r\n return \"地址:\";\r\n }\r\n }\r\n }></ElInput>\r\n },\r\n footer: () => {\r\n return <Fragment>\r\n <ElButton onClick={handleCancelClick}>取消</ElButton>\r\n <ElButton type=\"primary\" onClick={handleConfirmClick}>\r\n 确定\r\n </ElButton>\r\n </Fragment>\r\n },\r\n });\r\n });\r\n}\r\n"],"names":["ShowLinkEditPanel","href","Promise","resolve","reject","hrefValue","ref","handleCancelClick","dialogInstance","destroy","handleConfirmClick","value","Dialoger","customRender","title","class","width","onClose","body","_createVNode","ElInput","$event","prepend","footer","_Fragment","ElButton","default","_createTextVNode"],"mappings":";;;;;AASaA,MAAAA,oBAAoB,OAAQC,SAAa;AACpD,SAAO,IAAIC,QAAQ,CAACC,SAAQC,WAAW;AAErC,UAAMC,YAAYC,QAAIL,IAAI;AAG1B,UAAMM,oBAAoBA,MAAM;AAC9BC,qBAAeC,QAAO;AAAA;AAIxB,UAAMC,qBAAqBA,MAAM;AAC/BF,qBAAeC,QAAO;AACtBN,cAAQE,UAAUM,KAAK;AAAA;AAGzB,UAAMH,iBAAiBI,GAAQ,SAACC,aAAa;AAAA,MAC3CC,OAAO;AAAA,MACPC,OAAO;AAAA,MACPC,OAAO;AAAA,MACPC,SAASA,MAAM;AACbT,uBAAeC,QAAO;AAAA,MACvB;AAAA,MACDS,MAAMA,MAAM;AACV,eAAAC,IAAAA,YAAAC,YAAAA,SAAA;AAAA,UAAA,cAAyBf,UAAUM;AAAAA,UAAK,uBAAAU,YAAfhB,UAAUM,QAAKU;AAAAA,UAAA,aAAa;AAAA,UAAI,eAAA;AAAA,WACvD;AAAA,UACEC,SAAQA,MAAI;AACV,mBAAO;AAAA,UACT;AAAA,SACD;AAAA,MAEJ;AAAA,MACDC,QAAQA,MAAM;AACZ,eAAAJ,IAAA,YAAAK,IAAA,UAAAL,MAAAA,CAAAA,IAAAA,YAAAM,YAAAA,UAAA;AAAA,UAAA,WACqBlB;AAAAA,QAAiB,GAAA;AAAA,UAAAmB,SAAAA,MAAA,CAAAC,oBAAA,IAAA,CAAA;AAAA,SAAAR,GAAAA,IAAA,YAAAM,sBAAA;AAAA,UAAA,QAAA;AAAA,UAAA,WACFf;AAAAA,QAAkB,GAAA;AAAA,UAAAgB,SAAAA,MAAA,CAAAC,oBAAA,IAAA,CAAA;AAAA,QAAA,CAAA,CAAA,CAAA;AAAA,MAIxD;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;;"}
1
+ {"version":3,"file":"LinkEditDialog.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.tsx"],"sourcesContent":["\r\nimport { Fragment,ref } from 'vue'\r\nimport { Dialoger } from '@maketribe/dm'\r\nimport { ElButton ,ElInput } from \"element-plus\";\r\n/**\r\n * \r\n * @param href \r\n * @returns \r\n */\r\nexport const showLinkEditPanel = async (href:any) => {\r\n return new Promise((resolve,reject) => {\r\n\r\n const hrefValue = ref(href)\r\n\r\n // 取消编辑\r\n const handleCancelClick = () => {\r\n dialogInstance.destroy();\r\n };\r\n\r\n // 确认编辑\r\n const handleConfirmClick = () => {\r\n dialogInstance.destroy();\r\n resolve(hrefValue.value);\r\n };\r\n\r\n const dialogInstance = Dialoger.customRender({\r\n title: \"设置连接\",\r\n class: \"mk-html-editor-dialog\",\r\n width: \"500px\",\r\n onClose: () => {\r\n dialogInstance.destroy();\r\n },\r\n body: () => {\r\n return <ElInput v-model={hrefValue.value} clearable={true} placeholder='http://www.xxx.com' v-slots={\r\n {\r\n prepend:()=>{\r\n return \"地址:\";\r\n }\r\n }\r\n }></ElInput>\r\n },\r\n footer: () => {\r\n return <Fragment>\r\n <ElButton onClick={handleCancelClick}>取消</ElButton>\r\n <ElButton type=\"primary\" onClick={handleConfirmClick}>\r\n 确定\r\n </ElButton>\r\n </Fragment>\r\n },\r\n });\r\n });\r\n}\r\n"],"names":["showLinkEditPanel","href","Promise","resolve","reject","hrefValue","ref","handleCancelClick","dialogInstance","destroy","handleConfirmClick","value","Dialoger","customRender","title","class","width","onClose","body","_createVNode","ElInput","$event","prepend","footer","_Fragment","ElButton","default","_createTextVNode"],"mappings":";;;;;AASaA,MAAAA,oBAAoB,OAAQC,SAAa;AACpD,SAAO,IAAIC,QAAQ,CAACC,SAAQC,WAAW;AAErC,UAAMC,YAAYC,QAAIL,IAAI;AAG1B,UAAMM,oBAAoBA,MAAM;AAC9BC,qBAAeC,QAAO;AAAA;AAIxB,UAAMC,qBAAqBA,MAAM;AAC/BF,qBAAeC,QAAO;AACtBN,cAAQE,UAAUM,KAAK;AAAA;AAGzB,UAAMH,iBAAiBI,GAAQ,SAACC,aAAa;AAAA,MAC3CC,OAAO;AAAA,MACPC,OAAO;AAAA,MACPC,OAAO;AAAA,MACPC,SAASA,MAAM;AACbT,uBAAeC,QAAO;AAAA,MACvB;AAAA,MACDS,MAAMA,MAAM;AACV,eAAAC,IAAAA,YAAAC,YAAAA,SAAA;AAAA,UAAA,cAAyBf,UAAUM;AAAAA,UAAK,uBAAAU,YAAfhB,UAAUM,QAAKU;AAAAA,UAAA,aAAa;AAAA,UAAI,eAAA;AAAA,WACvD;AAAA,UACEC,SAAQA,MAAI;AACV,mBAAO;AAAA,UACT;AAAA,SACD;AAAA,MAEJ;AAAA,MACDC,QAAQA,MAAM;AACZ,eAAAJ,IAAA,YAAAK,IAAA,UAAAL,MAAAA,CAAAA,IAAAA,YAAAM,YAAAA,UAAA;AAAA,UAAA,WACqBlB;AAAAA,QAAiB,GAAA;AAAA,UAAAmB,SAAAA,MAAA,CAAAC,oBAAA,IAAA,CAAA;AAAA,SAAAR,GAAAA,IAAA,YAAAM,sBAAA;AAAA,UAAA,QAAA;AAAA,UAAA,WACFf;AAAAA,QAAkB,GAAA;AAAA,UAAAgB,SAAAA,MAAA,CAAAC,oBAAA,IAAA,CAAA;AAAA,QAAA,CAAA,CAAA,CAAA;AAAA,MAIxD;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;;"}
@@ -1,38 +1,12 @@
1
1
  "use strict";
2
2
  const vue = require("vue");
3
3
  require("../../core/index.js");
4
- const index_vue_vue_type_script_setup_true_lang = require("../../core/plugins/LexicalAutoLinkPlugin/index.vue2.js");
5
4
  const LexicalLinkPlugin_vue_vue_type_script_setup_true_lang = require("../../core/plugins/LexicalLinkPlugin.vue2.js");
6
5
  const _sfc_main = /* @__PURE__ */ vue.defineComponent({
7
6
  __name: "index",
8
7
  setup(__props) {
9
- const URL_MATCHER = /((https?:\/\/(www\.)?)|(www\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/;
10
- const EMAIL_MATCHER = /(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/;
11
- const MATCHERS = [
12
- (text) => {
13
- const match = URL_MATCHER.exec(text);
14
- return match && {
15
- index: match.index,
16
- length: match[0].length,
17
- text: match[0],
18
- url: match[0]
19
- };
20
- },
21
- (text) => {
22
- const match = EMAIL_MATCHER.exec(text);
23
- return match && {
24
- index: match.index,
25
- length: match[0].length,
26
- text: match[0],
27
- url: `mailto:${match[0]}`
28
- };
29
- }
30
- ];
31
8
  return (_ctx, _cache) => {
32
- return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [
33
- vue.createVNode(vue.unref(index_vue_vue_type_script_setup_true_lang), { matchers: MATCHERS }),
34
- vue.createVNode(vue.unref(LexicalLinkPlugin_vue_vue_type_script_setup_true_lang))
35
- ], 64);
9
+ return vue.openBlock(), vue.createBlock(vue.unref(LexicalLinkPlugin_vue_vue_type_script_setup_true_lang));
36
10
  };
37
11
  }
38
12
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.vue.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/AutoLinkPlugin/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { LexicalAutoLinkPlugin,LexicalLinkPlugin } from '../../core'\r\n\r\n\r\nconst URL_MATCHER = /((https?:\\/\\/(www\\.)?)|(www\\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/\r\n\r\nconst EMAIL_MATCHER = /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/\r\n\r\nconst MATCHERS = [\r\n (text: string) => {\r\n const match = URL_MATCHER.exec(text)\r\n return (\r\n match && {\r\n index: match.index,\r\n length: match[0].length,\r\n text: match[0],\r\n url: match[0],\r\n }\r\n )\r\n },\r\n (text: string) => {\r\n const match = EMAIL_MATCHER.exec(text)\r\n return (\r\n match && {\r\n index: match.index,\r\n length: match[0].length,\r\n text: match[0],\r\n url: `mailto:${match[0]}`,\r\n }\r\n )\r\n },\r\n]\r\n</script>\r\n\r\n<template>\r\n <LexicalAutoLinkPlugin :matchers=\"MATCHERS\" />\r\n <LexicalLinkPlugin />\r\n</template>\r\n"],"names":[],"mappings":";;;;;;;;AAIA,UAAM,cAAc;AAEpB,UAAM,gBAAgB;AAEtB,UAAM,WAAW;AAAA,MACf,CAAC,SAAiB;AACV,cAAA,QAAQ,YAAY,KAAK,IAAI;AACnC,eACE,SAAS;AAAA,UACP,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM,CAAC,EAAE;AAAA,UACjB,MAAM,MAAM,CAAC;AAAA,UACb,KAAK,MAAM,CAAC;AAAA,QAAA;AAAA,MAGlB;AAAA,MACA,CAAC,SAAiB;AACV,cAAA,QAAQ,cAAc,KAAK,IAAI;AACrC,eACE,SAAS;AAAA,UACP,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM,CAAC,EAAE;AAAA,UACjB,MAAM,MAAM,CAAC;AAAA,UACb,KAAK,UAAU,MAAM,CAAC,CAAC;AAAA,QAAA;AAAA,MAG7B;AAAA,IAAA;;;;;;;;;;"}
1
+ {"version":3,"file":"index.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
@@ -89,7 +89,6 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
89
89
  const _component_el_dropdown = vue.resolveComponent("el-dropdown");
90
90
  return vue.openBlock(), vue.createBlock(_component_el_dropdown, {
91
91
  "max-height": "300px",
92
- trigger: "click",
93
92
  disabled: disabled.value
94
93
  }, {
95
94
  dropdown: vue.withCtx(() => [
@@ -1 +1 @@
1
- {"version":3,"file":"ContentStyleTool.vue.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/ToolbarPlugin/ContentStyleTool.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport {\r\n $createParagraphNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isRootOrShadowRoot\r\n} from 'lexical'\r\nimport { $patchStyleText,$setBlocksType } from '@lexical/selection'\r\nimport type { HeadingTagType } from '@lexical/rich-text'\r\nimport { $createHeadingNode,$isHeadingNode } from '@lexical/rich-text'\r\nimport { \r\n INSERT_CHECK_LIST_COMMAND, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, \r\n} from '@lexical/list'\r\nimport { $findMatchingParent } from '@lexical/utils'\r\nimport { useLexicalComposer } from '../../core/composables'\r\nimport { onMounted, onUnmounted, ref } from 'vue'\r\n\r\nconst editor = useLexicalComposer()\r\n\r\n// 内容类型\r\nconst CONTENT_TYPE_DEFINES = [\r\n {value:\"paragraph\",label:\"正文\"},\r\n {value:\"bullet\",label:\"无序列表\"},\r\n {value:\"number\",label:\"有序列表\"},\r\n {value:\"h1\",label:\"标题 1\"},\r\n {value:\"h2\",label:\"标题 2\"},\r\n {value:\"h3\",label:\"标题 3\"}\r\n];\r\n\r\nconst disabled = ref(false)\r\n\r\nconst contentType = ref<any>(CONTENT_TYPE_DEFINES[0]);\r\n\r\n\r\n\r\n// 更新状态栏\r\nfunction updateToolbar() {\r\n\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n\r\n const anchorNode = selection.anchor.getNode()\r\n\r\n let element\r\n = anchorNode.getKey() === 'root'\r\n ? anchorNode\r\n : $findMatchingParent(anchorNode, (e) => {\r\n const parent = e.getParent()\r\n return parent !== null && $isRootOrShadowRoot(parent)\r\n })\r\n\r\n if (element === null){ element = anchorNode.getTopLevelElementOrThrow() }\r\n \r\n const elementKey = element.getKey()\r\n const elementDOM = editor.getElementByKey(elementKey)\r\n\r\n if (elementDOM !== null) {\r\n const type = $isHeadingNode(element) ? element.getTag() : element.getType();\r\n contentType.value = CONTENT_TYPE_DEFINES.find(item=>item.value == type) || CONTENT_TYPE_DEFINES[0]\r\n }\r\n disabled.value = false;\r\n }\r\n else{\r\n\r\n disabled.value = true;\r\n }\r\n}\r\n\r\n// 设置内容类型\r\nconst setContentType = (type:any)=>{\r\n\r\n contentType.value = type;\r\n \r\n editor.update(() => {\r\n\r\n const selection = $getSelection()\r\n \r\n if ($isRangeSelection(selection)){\r\n\r\n // 清空字体大小\r\n $patchStyleText(selection, { [\"font-size\"]:\"\" })\r\n \r\n if(type.value == \"paragraph\"){\r\n $setBlocksType(selection, () => $createParagraphNode())\r\n }\r\n else if(type.value == \"bullet\"){\r\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\r\n }\r\n else if(type.value == \"bullet\"){\r\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\r\n }\r\n else if(type.value == \"check-list\"){\r\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined)\r\n }\r\n else{\r\n $setBlocksType(selection, () => {\r\n return $createHeadingNode(type.value as HeadingTagType)\r\n })\r\n }\r\n }\r\n })\r\n}\r\n\r\n// 挂载的时候\r\nonMounted(() => {\r\n\r\nconst unregisterMergeListener = editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => updateToolbar())\r\n})\r\n\r\n\r\nonUnmounted(() => unregisterMergeListener());\r\n})\r\n\r\n</script>\r\n\r\n<template>\r\n <el-dropdown max-height=\"300px\" trigger=\"click\" :disabled=\"disabled\">\r\n <el-button text :disabled=\"disabled\">\r\n {{contentType.label}} <MKSvgIcon iconClass=\"ArrowDownBold\" style=\"margin-left: 8px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :class=\"{active:contentType.label == item.label}\" v-for=\"item in CONTENT_TYPE_DEFINES\" :value=\"item.value\" @click=\"setContentType(item)\">\r\n <template v-if=\"item.value.indexOf('h')!=0 \">\r\n <div class=\"mk-doc-editor-toolbar-content-style-item text\">{{item.label}}</div>\r\n </template>\r\n <template v-else>\r\n <div class=\"mk-doc-editor-toolbar-content-style-item\" v-html=\"`<${item.value}>${item.label}</${item.value}>`\"></div>\r\n </template>\r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n</template>\r\n"],"names":["useLexicalComposer","ref","selection","$getSelection","$isRangeSelection","$findMatchingParent","$isRootOrShadowRoot","$isHeadingNode","$patchStyleText","$setBlocksType","$createParagraphNode","INSERT_UNORDERED_LIST_COMMAND","INSERT_ORDERED_LIST_COMMAND","INSERT_CHECK_LIST_COMMAND","$createHeadingNode","onMounted","onUnmounted"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAiBA,UAAM,SAASA,mBAAAA;AAGf,UAAM,uBAAuB;AAAA,MAC3B,EAAC,OAAM,aAAY,OAAM,KAAI;AAAA,MAC7B,EAAC,OAAM,UAAS,OAAM,OAAM;AAAA,MAC5B,EAAC,OAAM,UAAS,OAAM,OAAM;AAAA,MAC5B,EAAC,OAAM,MAAK,OAAM,OAAM;AAAA,MACxB,EAAC,OAAM,MAAK,OAAM,OAAM;AAAA,MACxB,EAAC,OAAM,MAAK,OAAM,OAAM;AAAA,IAAA;AAGpB,UAAA,WAAWC,QAAI,KAAK;AAE1B,UAAM,cAAcA,IAAA,IAAS,qBAAqB,CAAC,CAAC;AAKpD,aAAS,gBAAgB;AAEvB,YAAMC,aAAYC,QAAAA;AAEd,UAAAC,QAAAA,kBAAkBF,UAAS,GAAG;AAE1B,cAAA,aAAaA,WAAU,OAAO,QAAQ;AAExC,YAAA,UACE,WAAW,aAAa,SACtB,aACAG,MAAA,oBAAoB,YAAY,CAAC,MAAM;AACjC,gBAAA,SAAS,EAAE;AACV,iBAAA,WAAW,QAAQC,QAAA,oBAAoB,MAAM;AAAA,QAAA,CACrD;AAEP,YAAI,YAAY,MAAK;AAAE,oBAAU,WAAW;QAA4B;AAElE,cAAA,aAAa,QAAQ;AACrB,cAAA,aAAa,OAAO,gBAAgB,UAAU;AAEpD,YAAI,eAAe,MAAM;AACjB,gBAAA,OAAOC,wBAAe,OAAO,IAAI,QAAQ,OAAO,IAAI,QAAQ;AACtD,sBAAA,QAAQ,qBAAqB,KAAK,CAAA,SAAM,KAAK,SAAS,IAAI,KAAK,qBAAqB,CAAC;AAAA,QACnG;AACA,iBAAS,QAAQ;AAAA,MAAA,OAEf;AAEF,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAGM,UAAA,iBAAiB,CAAC,SAAW;AAEjC,kBAAY,QAAQ;AAEpB,aAAO,OAAO,MAAM;AAEhB,cAAML,cAAYC,QAAAA;AAEd,YAAAC,QAAAA,kBAAkBF,WAAS,GAAE;AAG/BM,oBAAAA,gBAAgBN,aAAW,EAAE,CAAC,WAAW,GAAE,GAAI,CAAA;AAE5C,cAAA,KAAK,SAAS,aAAY;AACZO,sBAAAA,eAAAP,aAAW,MAAMQ,QAAA,qBAAA,CAAsB;AAAA,UAAA,WAEhD,KAAK,SAAS,UAAS;AACtB,mBAAA,gBAAgBC,oCAA+B,MAAS;AAAA,UAAA,WAEzD,KAAK,SAAS,UAAS;AACtB,mBAAA,gBAAgBC,kCAA6B,MAAS;AAAA,UAAA,WAEvD,KAAK,SAAS,cAAa;AAC1B,mBAAA,gBAAgBC,gCAA2B,MAAS;AAAA,UAAA,OAEzD;AACFJ,sBAAA,eAAeP,aAAW,MAAM;AACvB,qBAAAY,SAAA,mBAAmB,KAAK,KAAwB;AAAA,YAAA,CACxD;AAAA,UACH;AAAA,QACF;AAAA,MAAA,CACH;AAAA,IAAA;AAIHC,QAAAA,UAAU,MAAM;AAEhB,YAAM,0BAA0B,OAAO,uBAAuB,CAAC,EAAE,kBAAkB;AACrE,oBAAA,KAAK,MAAM,cAAA,CAAe;AAAA,MAAA,CACvC;AAGWC,sBAAA,MAAM,yBAAyB;AAAA,IAAA,CAC1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"ContentStyleTool.vue.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/ToolbarPlugin/ContentStyleTool.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport {\r\n $createParagraphNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isRootOrShadowRoot\r\n} from 'lexical'\r\nimport { $patchStyleText,$setBlocksType } from '@lexical/selection'\r\nimport type { HeadingTagType } from '@lexical/rich-text'\r\nimport { $createHeadingNode,$isHeadingNode } from '@lexical/rich-text'\r\nimport { \r\n INSERT_CHECK_LIST_COMMAND, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, \r\n} from '@lexical/list'\r\nimport { $findMatchingParent } from '@lexical/utils'\r\nimport { useLexicalComposer } from '../../core/composables'\r\nimport { onMounted, onUnmounted, ref } from 'vue'\r\n\r\nconst editor = useLexicalComposer()\r\n\r\n// 内容类型\r\nconst CONTENT_TYPE_DEFINES = [\r\n {value:\"paragraph\",label:\"正文\"},\r\n {value:\"bullet\",label:\"无序列表\"},\r\n {value:\"number\",label:\"有序列表\"},\r\n {value:\"h1\",label:\"标题 1\"},\r\n {value:\"h2\",label:\"标题 2\"},\r\n {value:\"h3\",label:\"标题 3\"}\r\n];\r\n\r\nconst disabled = ref(false)\r\n\r\nconst contentType = ref<any>(CONTENT_TYPE_DEFINES[0]);\r\n\r\n\r\n\r\n// 更新状态栏\r\nfunction updateToolbar() {\r\n\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n\r\n const anchorNode = selection.anchor.getNode()\r\n\r\n let element\r\n = anchorNode.getKey() === 'root'\r\n ? anchorNode\r\n : $findMatchingParent(anchorNode, (e) => {\r\n const parent = e.getParent()\r\n return parent !== null && $isRootOrShadowRoot(parent)\r\n })\r\n\r\n if (element === null){ element = anchorNode.getTopLevelElementOrThrow() }\r\n \r\n const elementKey = element.getKey()\r\n const elementDOM = editor.getElementByKey(elementKey)\r\n\r\n if (elementDOM !== null) {\r\n const type = $isHeadingNode(element) ? element.getTag() : element.getType();\r\n contentType.value = CONTENT_TYPE_DEFINES.find(item=>item.value == type) || CONTENT_TYPE_DEFINES[0]\r\n }\r\n disabled.value = false;\r\n }\r\n else{\r\n\r\n disabled.value = true;\r\n }\r\n}\r\n\r\n// 设置内容类型\r\nconst setContentType = (type:any)=>{\r\n\r\n contentType.value = type;\r\n \r\n editor.update(() => {\r\n\r\n const selection = $getSelection()\r\n \r\n if ($isRangeSelection(selection)){\r\n\r\n // 清空字体大小\r\n $patchStyleText(selection, { [\"font-size\"]:\"\" })\r\n \r\n if(type.value == \"paragraph\"){\r\n $setBlocksType(selection, () => $createParagraphNode())\r\n }\r\n else if(type.value == \"bullet\"){\r\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\r\n }\r\n else if(type.value == \"bullet\"){\r\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\r\n }\r\n else if(type.value == \"check-list\"){\r\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined)\r\n }\r\n else{\r\n $setBlocksType(selection, () => {\r\n return $createHeadingNode(type.value as HeadingTagType)\r\n })\r\n }\r\n }\r\n })\r\n}\r\n\r\n// 挂载的时候\r\nonMounted(() => {\r\n\r\nconst unregisterMergeListener = editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => updateToolbar())\r\n})\r\n\r\n\r\nonUnmounted(() => unregisterMergeListener());\r\n})\r\n\r\n</script>\r\n\r\n<template>\r\n <el-dropdown max-height=\"300px\" :disabled=\"disabled\">\r\n <el-button text :disabled=\"disabled\">\r\n {{contentType.label}} <MKSvgIcon iconClass=\"ArrowDownBold\" style=\"margin-left: 8px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :class=\"{active:contentType.label == item.label}\" v-for=\"item in CONTENT_TYPE_DEFINES\" :value=\"item.value\" @click=\"setContentType(item)\">\r\n <template v-if=\"item.value.indexOf('h')!=0 \">\r\n <div class=\"mk-doc-editor-toolbar-content-style-item text\">{{item.label}}</div>\r\n </template>\r\n <template v-else>\r\n <div class=\"mk-doc-editor-toolbar-content-style-item\" v-html=\"`<${item.value}>${item.label}</${item.value}>`\"></div>\r\n </template>\r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n</template>\r\n"],"names":["useLexicalComposer","ref","selection","$getSelection","$isRangeSelection","$findMatchingParent","$isRootOrShadowRoot","$isHeadingNode","$patchStyleText","$setBlocksType","$createParagraphNode","INSERT_UNORDERED_LIST_COMMAND","INSERT_ORDERED_LIST_COMMAND","INSERT_CHECK_LIST_COMMAND","$createHeadingNode","onMounted","onUnmounted"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAiBA,UAAM,SAASA,mBAAAA;AAGf,UAAM,uBAAuB;AAAA,MAC3B,EAAC,OAAM,aAAY,OAAM,KAAI;AAAA,MAC7B,EAAC,OAAM,UAAS,OAAM,OAAM;AAAA,MAC5B,EAAC,OAAM,UAAS,OAAM,OAAM;AAAA,MAC5B,EAAC,OAAM,MAAK,OAAM,OAAM;AAAA,MACxB,EAAC,OAAM,MAAK,OAAM,OAAM;AAAA,MACxB,EAAC,OAAM,MAAK,OAAM,OAAM;AAAA,IAAA;AAGpB,UAAA,WAAWC,QAAI,KAAK;AAE1B,UAAM,cAAcA,IAAA,IAAS,qBAAqB,CAAC,CAAC;AAKpD,aAAS,gBAAgB;AAEvB,YAAMC,aAAYC,QAAAA;AAEd,UAAAC,QAAAA,kBAAkBF,UAAS,GAAG;AAE1B,cAAA,aAAaA,WAAU,OAAO,QAAQ;AAExC,YAAA,UACE,WAAW,aAAa,SACtB,aACAG,MAAA,oBAAoB,YAAY,CAAC,MAAM;AACjC,gBAAA,SAAS,EAAE;AACV,iBAAA,WAAW,QAAQC,QAAA,oBAAoB,MAAM;AAAA,QAAA,CACrD;AAEP,YAAI,YAAY,MAAK;AAAE,oBAAU,WAAW;QAA4B;AAElE,cAAA,aAAa,QAAQ;AACrB,cAAA,aAAa,OAAO,gBAAgB,UAAU;AAEpD,YAAI,eAAe,MAAM;AACjB,gBAAA,OAAOC,wBAAe,OAAO,IAAI,QAAQ,OAAO,IAAI,QAAQ;AACtD,sBAAA,QAAQ,qBAAqB,KAAK,CAAA,SAAM,KAAK,SAAS,IAAI,KAAK,qBAAqB,CAAC;AAAA,QACnG;AACA,iBAAS,QAAQ;AAAA,MAAA,OAEf;AAEF,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAGM,UAAA,iBAAiB,CAAC,SAAW;AAEjC,kBAAY,QAAQ;AAEpB,aAAO,OAAO,MAAM;AAEhB,cAAML,cAAYC,QAAAA;AAEd,YAAAC,QAAAA,kBAAkBF,WAAS,GAAE;AAG/BM,oBAAAA,gBAAgBN,aAAW,EAAE,CAAC,WAAW,GAAE,GAAI,CAAA;AAE5C,cAAA,KAAK,SAAS,aAAY;AACZO,sBAAAA,eAAAP,aAAW,MAAMQ,QAAA,qBAAA,CAAsB;AAAA,UAAA,WAEhD,KAAK,SAAS,UAAS;AACtB,mBAAA,gBAAgBC,oCAA+B,MAAS;AAAA,UAAA,WAEzD,KAAK,SAAS,UAAS;AACtB,mBAAA,gBAAgBC,kCAA6B,MAAS;AAAA,UAAA,WAEvD,KAAK,SAAS,cAAa;AAC1B,mBAAA,gBAAgBC,gCAA2B,MAAS;AAAA,UAAA,OAEzD;AACFJ,sBAAA,eAAeP,aAAW,MAAM;AACvB,qBAAAY,SAAA,mBAAmB,KAAK,KAAwB;AAAA,YAAA,CACxD;AAAA,UACH;AAAA,QACF;AAAA,MAAA,CACH;AAAA,IAAA;AAIHC,QAAAA,UAAU,MAAM;AAEhB,YAAM,0BAA0B,OAAO,uBAAuB,CAAC,EAAE,kBAAkB;AACrE,oBAAA,KAAK,MAAM,cAAA,CAAe;AAAA,MAAA,CACvC;AAGWC,sBAAA,MAAM,yBAAyB;AAAA,IAAA,CAC1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -37,7 +37,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
37
37
  const isLink = vue.ref(false);
38
38
  const linkValue = vue.ref("");
39
39
  async function insertLink() {
40
- const result = await LinkEditDialog.ShowLinkEditPanel(linkValue.value);
40
+ const result = await LinkEditDialog.showLinkEditPanel(linkValue.value);
41
41
  if (result.trim()) {
42
42
  editor.dispatchCommand(link.TOGGLE_LINK_COMMAND, url.sanitizeUrl(result));
43
43
  } else {
@@ -136,7 +136,6 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
136
136
  return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [
137
137
  vue.createVNode(_component_el_dropdown, {
138
138
  "max-height": "300px",
139
- trigger: "click",
140
139
  disabled: disabled.value
141
140
  }, {
142
141
  dropdown: vue.withCtx(() => [
@@ -182,7 +181,6 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
182
181
  vue.createVNode(_component_el_divider, { direction: "vertical" }),
183
182
  vue.createVNode(_component_el_dropdown, {
184
183
  "max-height": "300px",
185
- trigger: "click",
186
184
  disabled: disabled.value
187
185
  }, {
188
186
  dropdown: vue.withCtx(() => [
@@ -1 +1 @@
1
- {"version":3,"file":"FontStyleTool.vue.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/ToolbarPlugin/FontStyleTool.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n $isRootOrShadowRoot,\r\n $isParagraphNode,\r\n FORMAT_TEXT_COMMAND,\r\n FORMAT_ELEMENT_COMMAND,\r\n type ElementFormatType,\r\n} from 'lexical'\r\nimport {\r\n $getSelectionStyleValueForProperty,\r\n $patchStyleText,\r\n} from '@lexical/selection'\r\n\r\nimport { $isLinkNode, TOGGLE_LINK_COMMAND,LinkNode } from '@lexical/link'\r\nimport { sanitizeUrl } from '../../utils/url'\r\nimport { getSelectedNode } from '../../utils/getSelectedNode'\r\nimport { $findMatchingParent,mergeRegister } from '@lexical/utils'\r\nimport { useLexicalComposer } from '../../core/composables'\r\nimport { onMounted, onUnmounted, ref,watch } from 'vue'\r\nimport { FONT_SIZE_OPTIONS,ROOT_FONT_SIZE,FONT_FAMILY_OPTIONS } from \"./FontStyleDefines\"\r\nimport { ShowLinkEditPanel } from \"../AutoLinkPlugin/LinkEditDialog\";\r\n\r\nconst editor = useLexicalComposer()\r\nconst fontSize = ref('14px')\r\nconst fontColor = ref<string>('#000')\r\nconst bgColor = ref<string>('#fff')\r\nconst fontFamily = ref<any>(FONT_FAMILY_OPTIONS[0])\r\nconst isBold = ref(false)\r\nconst isItalic = ref(false)\r\nconst isUnderline = ref(false)\r\nconst isStrikethrough = ref(false)\r\n\r\nconst isSubscript = ref(false)\r\nconst isSuperscript = ref(false)\r\n\r\n// 对齐方式\r\nconst alignList = ref<ElementFormatType[]>([\"left\",\"center\",\"right\",\"justify\"])\r\nconst alignValue = ref(alignList.value[0])\r\nconst disabled = ref(false)\r\nconst isLink = ref(false)\r\nconst linkValue = ref(\"\");\r\n\r\nasync function insertLink() {\r\n\r\n const result:any = await ShowLinkEditPanel(linkValue.value);\r\n\r\n if(result.trim()){\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, sanitizeUrl(result))\r\n }\r\n else{\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\r\n }\r\n}\r\n\r\n// 更新状态栏\r\nfunction updateToolbar() {\r\n\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n\r\n const anchorNode = selection.anchor.getNode()\r\n\r\n let element = anchorNode.getKey() === 'root'\r\n ? anchorNode\r\n : $findMatchingParent(anchorNode, (e) => {\r\n const parent = e.getParent()\r\n return parent !== null && $isRootOrShadowRoot(parent)\r\n });\r\n\r\n\r\n if (element === null){\r\n element = anchorNode.getTopLevelElementOrThrow()\r\n }\r\n\r\n let elementDOM = editor.getElementByKey(element.getKey());\r\n\r\n // 文本对齐\r\n alignValue.value = (elementDOM?.style.textAlign as ElementFormatType) || \"left\";\r\n\r\n if(alignValue.value == \"start\"){ alignValue.value = \"left\"; }\r\n else if(alignValue.value == \"end\"){ alignValue.value = \"right\"; }\r\n\r\n // Update text format\r\n isBold.value = selection.hasFormat('bold')\r\n isItalic.value = selection.hasFormat('italic')\r\n isUnderline.value = selection.hasFormat('underline')\r\n isStrikethrough.value = selection.hasFormat('strikethrough')\r\n isSubscript.value = selection.hasFormat('subscript')\r\n isSuperscript.value = selection.hasFormat('superscript')\r\n\r\n // Handle buttons\r\n var ff = $getSelectionStyleValueForProperty(selection, 'font-family', 'Arial');\r\n let fs = $getSelectionStyleValueForProperty(selection, 'font-size', '1rem');\r\n \r\n if(fs){\r\n fontSize.value = Math.round(parseFloat(fs) * ROOT_FONT_SIZE)+\"px\"\r\n }\r\n \r\n fontColor.value = $getSelectionStyleValueForProperty(selection, 'color', '#000')\r\n bgColor.value = $getSelectionStyleValueForProperty(selection, 'background-color', '#fff')\r\n fontFamily.value = FONT_FAMILY_OPTIONS.find(item=>item.value==ff) || FONT_FAMILY_OPTIONS[0];\r\n\r\n disabled.value = false;\r\n\r\n // Update links\r\n const node = getSelectedNode(selection)\r\n const parent = node.getParent()\r\n isLink.value = $isLinkNode(parent) || $isLinkNode(node)\r\n if(isLink.value){\r\n linkValue.value = $isLinkNode(parent) ? parent.getURL() : (node as LinkNode).getURL()\r\n }\r\n else{\r\n linkValue.value = \"\";\r\n }\r\n }\r\n else{\r\n\r\n disabled.value = true;\r\n }\r\n}\r\n\r\n// 文字样式\r\nconst fontStyleHandle = (data : any,styleName?:any)=>{\r\n fontSize.value = data.label;\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null) {\r\n $patchStyleText(selection, {\r\n [styleName || \"font-size\"]:data.value\r\n })\r\n }\r\n })\r\n}\r\n\r\n// 字体颜色\r\nconst setFontColor = (color:any)=>{\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null){\r\n $patchStyleText(selection, { color })\r\n }\r\n },{})\r\n}\r\n\r\n// bg颜色\r\nconst setBgColor = (color:any)=>{\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null){\r\n $patchStyleText(selection, { 'background-color':color })\r\n }\r\n },{})\r\n}\r\n\r\n\r\n// 挂载的时候\r\nonMounted(() => {\r\n\r\n const unregisterMergeListener = mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => updateToolbar())\r\n })\r\n )\r\n\r\n onUnmounted(() => unregisterMergeListener());\r\n})\r\n\r\n</script>\r\n\r\n<template>\r\n <!-- 字体 -->\r\n <el-dropdown max-height=\"300px\" trigger=\"click\" :disabled=\"disabled\">\r\n <el-button text :style=\"{fontFamily:fontFamily.value}\" :disabled=\"disabled\">\r\n {{fontFamily.label}} <MKSvgIcon iconClass=\"ArrowDownBold\" style=\"margin-left: 8px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :class=\"{active:fontFamily.label == item.label}\" :disabled=\"disabled\" v-for=\"item in FONT_FAMILY_OPTIONS\" :value=\"item.value\" @click=\"fontStyleHandle(item,'font-family')\">\r\n <span :style=\"{fontFamily:item.value}\">\r\n {{item.label}}\r\n </span>\r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n <el-divider direction=\"vertical\" /> \r\n <!-- 字体大小 -->\r\n <el-dropdown max-height=\"300px\" trigger=\"click\" :disabled=\"disabled\">\r\n <el-button text :disabled=\"disabled\">\r\n {{fontSize}} <MKSvgIcon iconClass=\"ArrowDownBold\" style=\"margin-left: 8px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :class=\"{active:fontSize==item.label}\" :disabled=\"disabled\" v-for=\"item in FONT_SIZE_OPTIONS\" :value=\"item.value\" @click=\"fontStyleHandle(item)\">{{item.label}}</el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n <el-divider direction=\"vertical\" /> \r\n <!-- 字体颜色 -->\r\n <el-button text class=\"mk-doc-editor-toolbar__fontcolor\" :disabled=\"disabled\" >\r\n <el-color-picker v-model=\"fontColor\" :disabled=\"disabled\" @change=\"setFontColor\" />\r\n </el-button>\r\n <!-- 背景颜色 -->\r\n <el-button text class=\"mk-doc-editor-toolbar__bgcolor\" :disabled=\"disabled\" >\r\n <el-color-picker v-model=\"bgColor\" :disabled=\"disabled\" />\r\n <MKSvgIcon class=\"view\" iconClass=\"doc-background-color\" @change=\"setBgColor\" /> \r\n </el-button>\r\n\r\n <el-divider direction=\"vertical\" />\r\n <el-button-group>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isBold ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold')\">\r\n <MKSvgIcon iconClass=\"doc-bold\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isItalic ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic')\">\r\n <MKSvgIcon iconClass=\"doc-italic\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isUnderline ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline')\">\r\n <MKSvgIcon iconClass=\"doc-underline\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isStrikethrough ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough')\">\r\n <MKSvgIcon iconClass=\"doc-strikethrough\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isSubscript ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript')\">\r\n <MKSvgIcon iconClass=\"doc-sub\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isSuperscript ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript')\">\r\n <MKSvgIcon iconClass=\"doc-sup\" /> \r\n </el-button>\r\n </el-button-group>\r\n <el-divider direction=\"vertical\" />\r\n <el-dropdown max-height=\"300px\" trigger=\"click\" :disabled=\"disabled\">\r\n <el-button text :style=\"{fontFamily:fontFamily.value}\" :disabled=\"disabled\">\r\n <MKSvgIcon :iconClass=\"`doc-align-${alignValue}`\" style=\"font-size: 18px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :disabled=\"disabled\" :class=\"{active:alignValue == item}\" v-for=\"item in alignList\" :value=\"item\" @click=\"editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, item)\">\r\n <MKSvgIcon :iconClass=\"`doc-align-${item}`\" style=\"font-size: 18px;\" /> \r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n <el-divider direction=\"vertical\" />\r\n <!-- 链接 -->\r\n <el-button-group>\r\n <el-button text :disabled=\"disabled\" :class=\"`${isLink ? 'active' : ''}`\" @click=\"insertLink\">\r\n <MKSvgIcon iconClass=\"doc-link\" /> \r\n </el-button>\r\n </el-button-group>\r\n</template>\r\n"],"names":["useLexicalComposer","ref","FONT_FAMILY_OPTIONS","ShowLinkEditPanel","TOGGLE_LINK_COMMAND","sanitizeUrl","selection","$getSelection","$isRangeSelection","$findMatchingParent","parent","$isRootOrShadowRoot","$getSelectionStyleValueForProperty","ROOT_FONT_SIZE","getSelectedNode","$isLinkNode","$patchStyleText","onMounted","mergeRegister","onUnmounted"],"mappings":"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"}
1
+ {"version":3,"file":"FontStyleTool.vue.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/ToolbarPlugin/FontStyleTool.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n $isRootOrShadowRoot,\r\n $isParagraphNode,\r\n FORMAT_TEXT_COMMAND,\r\n FORMAT_ELEMENT_COMMAND,\r\n type ElementFormatType,\r\n} from 'lexical'\r\nimport {\r\n $getSelectionStyleValueForProperty,\r\n $patchStyleText,\r\n} from '@lexical/selection'\r\n\r\nimport { $isLinkNode, TOGGLE_LINK_COMMAND,LinkNode } from '@lexical/link'\r\nimport { sanitizeUrl } from '../../utils/url'\r\nimport { getSelectedNode } from '../../utils/getSelectedNode'\r\nimport { $findMatchingParent,mergeRegister } from '@lexical/utils'\r\nimport { useLexicalComposer } from '../../core/composables'\r\nimport { onMounted, onUnmounted, ref,watch } from 'vue'\r\nimport { FONT_SIZE_OPTIONS,ROOT_FONT_SIZE,FONT_FAMILY_OPTIONS } from \"./FontStyleDefines\"\r\nimport { showLinkEditPanel } from \"../AutoLinkPlugin/LinkEditDialog\";\r\n\r\nconst editor = useLexicalComposer()\r\nconst fontSize = ref('14px')\r\nconst fontColor = ref<string>('#000')\r\nconst bgColor = ref<string>('#fff')\r\nconst fontFamily = ref<any>(FONT_FAMILY_OPTIONS[0])\r\nconst isBold = ref(false)\r\nconst isItalic = ref(false)\r\nconst isUnderline = ref(false)\r\nconst isStrikethrough = ref(false)\r\n\r\nconst isSubscript = ref(false)\r\nconst isSuperscript = ref(false)\r\n\r\n// 对齐方式\r\nconst alignList = ref<ElementFormatType[]>([\"left\",\"center\",\"right\",\"justify\"])\r\nconst alignValue = ref(alignList.value[0])\r\nconst disabled = ref(false)\r\nconst isLink = ref(false)\r\nconst linkValue = ref(\"\");\r\n\r\nasync function insertLink() {\r\n\r\n const result:any = await showLinkEditPanel(linkValue.value);\r\n\r\n if(result.trim()){\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, sanitizeUrl(result))\r\n }\r\n else{\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\r\n }\r\n}\r\n\r\n// 更新状态栏\r\nfunction updateToolbar() {\r\n\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n\r\n const anchorNode = selection.anchor.getNode()\r\n\r\n let element = anchorNode.getKey() === 'root'\r\n ? anchorNode\r\n : $findMatchingParent(anchorNode, (e) => {\r\n const parent = e.getParent()\r\n return parent !== null && $isRootOrShadowRoot(parent)\r\n });\r\n\r\n\r\n if (element === null){\r\n element = anchorNode.getTopLevelElementOrThrow()\r\n }\r\n\r\n let elementDOM = editor.getElementByKey(element.getKey());\r\n\r\n // 文本对齐\r\n alignValue.value = (elementDOM?.style.textAlign as ElementFormatType) || \"left\";\r\n\r\n if(alignValue.value == \"start\"){ alignValue.value = \"left\"; }\r\n else if(alignValue.value == \"end\"){ alignValue.value = \"right\"; }\r\n\r\n // Update text format\r\n isBold.value = selection.hasFormat('bold')\r\n isItalic.value = selection.hasFormat('italic')\r\n isUnderline.value = selection.hasFormat('underline')\r\n isStrikethrough.value = selection.hasFormat('strikethrough')\r\n isSubscript.value = selection.hasFormat('subscript')\r\n isSuperscript.value = selection.hasFormat('superscript')\r\n\r\n // Handle buttons\r\n var ff = $getSelectionStyleValueForProperty(selection, 'font-family', 'Arial');\r\n let fs = $getSelectionStyleValueForProperty(selection, 'font-size', '1rem');\r\n \r\n if(fs){\r\n fontSize.value = Math.round(parseFloat(fs) * ROOT_FONT_SIZE)+\"px\"\r\n }\r\n \r\n fontColor.value = $getSelectionStyleValueForProperty(selection, 'color', '#000')\r\n bgColor.value = $getSelectionStyleValueForProperty(selection, 'background-color', '#fff')\r\n fontFamily.value = FONT_FAMILY_OPTIONS.find(item=>item.value==ff) || FONT_FAMILY_OPTIONS[0];\r\n\r\n disabled.value = false;\r\n\r\n // Update links\r\n const node = getSelectedNode(selection)\r\n const parent = node.getParent()\r\n isLink.value = $isLinkNode(parent) || $isLinkNode(node)\r\n if(isLink.value){\r\n linkValue.value = $isLinkNode(parent) ? parent.getURL() : (node as LinkNode).getURL()\r\n }\r\n else{\r\n linkValue.value = \"\";\r\n }\r\n }\r\n else{\r\n\r\n disabled.value = true;\r\n }\r\n}\r\n\r\n// 文字样式\r\nconst fontStyleHandle = (data : any,styleName?:any)=>{\r\n fontSize.value = data.label;\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null) {\r\n $patchStyleText(selection, {\r\n [styleName || \"font-size\"]:data.value\r\n })\r\n }\r\n })\r\n}\r\n\r\n// 字体颜色\r\nconst setFontColor = (color:any)=>{\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null){\r\n $patchStyleText(selection, { color })\r\n }\r\n },{})\r\n}\r\n\r\n// bg颜色\r\nconst setBgColor = (color:any)=>{\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null){\r\n $patchStyleText(selection, { 'background-color':color })\r\n }\r\n },{})\r\n}\r\n\r\n\r\n// 挂载的时候\r\nonMounted(() => {\r\n\r\n const unregisterMergeListener = mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => updateToolbar())\r\n })\r\n )\r\n\r\n onUnmounted(() => unregisterMergeListener());\r\n})\r\n\r\n</script>\r\n\r\n<template>\r\n <!-- 字体 -->\r\n <el-dropdown max-height=\"300px\" :disabled=\"disabled\">\r\n <el-button text :style=\"{fontFamily:fontFamily.value}\" :disabled=\"disabled\">\r\n {{fontFamily.label}} <MKSvgIcon iconClass=\"ArrowDownBold\" style=\"margin-left: 8px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :class=\"{active:fontFamily.label == item.label}\" :disabled=\"disabled\" v-for=\"item in FONT_FAMILY_OPTIONS\" :value=\"item.value\" @click=\"fontStyleHandle(item,'font-family')\">\r\n <span :style=\"{fontFamily:item.value}\">\r\n {{item.label}}\r\n </span>\r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n <el-divider direction=\"vertical\" /> \r\n <!-- 字体大小 -->\r\n <el-dropdown max-height=\"300px\" :disabled=\"disabled\">\r\n <el-button text :disabled=\"disabled\">\r\n {{fontSize}} <MKSvgIcon iconClass=\"ArrowDownBold\" style=\"margin-left: 8px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :class=\"{active:fontSize==item.label}\" :disabled=\"disabled\" v-for=\"item in FONT_SIZE_OPTIONS\" :value=\"item.value\" @click=\"fontStyleHandle(item)\">{{item.label}}</el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n <el-divider direction=\"vertical\" /> \r\n <!-- 字体颜色 -->\r\n <el-button text class=\"mk-doc-editor-toolbar__fontcolor\" :disabled=\"disabled\" >\r\n <el-color-picker v-model=\"fontColor\" :disabled=\"disabled\" @change=\"setFontColor\" />\r\n </el-button>\r\n <!-- 背景颜色 -->\r\n <el-button text class=\"mk-doc-editor-toolbar__bgcolor\" :disabled=\"disabled\" >\r\n <el-color-picker v-model=\"bgColor\" :disabled=\"disabled\" />\r\n <MKSvgIcon class=\"view\" iconClass=\"doc-background-color\" @change=\"setBgColor\" /> \r\n </el-button>\r\n\r\n <el-divider direction=\"vertical\" />\r\n <el-button-group>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isBold ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold')\">\r\n <MKSvgIcon iconClass=\"doc-bold\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isItalic ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic')\">\r\n <MKSvgIcon iconClass=\"doc-italic\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isUnderline ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline')\">\r\n <MKSvgIcon iconClass=\"doc-underline\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isStrikethrough ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough')\">\r\n <MKSvgIcon iconClass=\"doc-strikethrough\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isSubscript ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript')\">\r\n <MKSvgIcon iconClass=\"doc-sub\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isSuperscript ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript')\">\r\n <MKSvgIcon iconClass=\"doc-sup\" /> \r\n </el-button>\r\n </el-button-group>\r\n <el-divider direction=\"vertical\" />\r\n <el-dropdown max-height=\"300px\" trigger=\"click\" :disabled=\"disabled\">\r\n <el-button text :style=\"{fontFamily:fontFamily.value}\" :disabled=\"disabled\">\r\n <MKSvgIcon :iconClass=\"`doc-align-${alignValue}`\" style=\"font-size: 18px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :disabled=\"disabled\" :class=\"{active:alignValue == item}\" v-for=\"item in alignList\" :value=\"item\" @click=\"editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, item)\">\r\n <MKSvgIcon :iconClass=\"`doc-align-${item}`\" style=\"font-size: 18px;\" /> \r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n <el-divider direction=\"vertical\" />\r\n <!-- 链接 -->\r\n <el-button-group>\r\n <el-button text :disabled=\"disabled\" :class=\"`${isLink ? 'active' : ''}`\" @click=\"insertLink\">\r\n <MKSvgIcon iconClass=\"doc-link\" /> \r\n </el-button>\r\n </el-button-group>\r\n</template>\r\n"],"names":["useLexicalComposer","ref","FONT_FAMILY_OPTIONS","showLinkEditPanel","TOGGLE_LINK_COMMAND","sanitizeUrl","selection","$getSelection","$isRangeSelection","$findMatchingParent","parent","$isRootOrShadowRoot","$getSelectionStyleValueForProperty","ROOT_FONT_SIZE","getSelectedNode","$isLinkNode","$patchStyleText","onMounted","mergeRegister","onUnmounted"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { ref, createVNode, Fragment, createTextVNode } from "vue";
2
2
  import { Dialoger } from "@maketribe/dm";
3
3
  import { ElInput, ElButton } from "element-plus";
4
- const ShowLinkEditPanel = async (href) => {
4
+ const showLinkEditPanel = async (href) => {
5
5
  return new Promise((resolve, reject) => {
6
6
  const hrefValue = ref(href);
7
7
  const handleCancelClick = () => {
@@ -46,6 +46,6 @@ const ShowLinkEditPanel = async (href) => {
46
46
  });
47
47
  };
48
48
  export {
49
- ShowLinkEditPanel
49
+ showLinkEditPanel
50
50
  };
51
51
  //# sourceMappingURL=LinkEditDialog.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LinkEditDialog.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.tsx"],"sourcesContent":["\r\nimport { Fragment,ref,unref } from 'vue'\r\nimport { Dialoger } from '@maketribe/dm'\r\nimport { ElButton ,ElInput } from \"element-plus\";\r\n/**\r\n * \r\n * @param href \r\n * @returns \r\n */\r\nexport const ShowLinkEditPanel = async (href:any) => {\r\n return new Promise((resolve,reject) => {\r\n\r\n const hrefValue = ref(href)\r\n\r\n // 取消编辑\r\n const handleCancelClick = () => {\r\n dialogInstance.destroy();\r\n };\r\n\r\n // 确认编辑\r\n const handleConfirmClick = () => {\r\n dialogInstance.destroy();\r\n resolve(hrefValue.value);\r\n };\r\n\r\n const dialogInstance = Dialoger.customRender({\r\n title: \"设置连接\",\r\n class: \"mk-html-editor-dialog\",\r\n width: \"500px\",\r\n onClose: () => {\r\n dialogInstance.destroy();\r\n },\r\n body: () => {\r\n return <ElInput v-model={hrefValue.value} clearable={true} placeholder='http://www.xxx.com' v-slots={\r\n {\r\n prepend:()=>{\r\n return \"地址:\";\r\n }\r\n }\r\n }></ElInput>\r\n },\r\n footer: () => {\r\n return <Fragment>\r\n <ElButton onClick={handleCancelClick}>取消</ElButton>\r\n <ElButton type=\"primary\" onClick={handleConfirmClick}>\r\n 确定\r\n </ElButton>\r\n </Fragment>\r\n },\r\n });\r\n });\r\n}\r\n"],"names":["ShowLinkEditPanel","href","Promise","resolve","reject","hrefValue","ref","handleCancelClick","dialogInstance","destroy","handleConfirmClick","value","Dialoger","customRender","title","class","width","onClose","body","_createVNode","ElInput","$event","prepend","footer","_Fragment","ElButton","default","_createTextVNode"],"mappings":";;;AASaA,MAAAA,oBAAoB,OAAQC,SAAa;AACpD,SAAO,IAAIC,QAAQ,CAACC,SAAQC,WAAW;AAErC,UAAMC,YAAYC,IAAIL,IAAI;AAG1B,UAAMM,oBAAoBA,MAAM;AAC9BC,qBAAeC,QAAO;AAAA;AAIxB,UAAMC,qBAAqBA,MAAM;AAC/BF,qBAAeC,QAAO;AACtBN,cAAQE,UAAUM,KAAK;AAAA;AAGzB,UAAMH,iBAAiBI,SAASC,aAAa;AAAA,MAC3CC,OAAO;AAAA,MACPC,OAAO;AAAA,MACPC,OAAO;AAAA,MACPC,SAASA,MAAM;AACbT,uBAAeC,QAAO;AAAA,MACvB;AAAA,MACDS,MAAMA,MAAM;AACV,eAAAC,YAAAC,SAAA;AAAA,UAAA,cAAyBf,UAAUM;AAAAA,UAAK,uBAAAU,YAAfhB,UAAUM,QAAKU;AAAAA,UAAA,aAAa;AAAA,UAAI,eAAA;AAAA,WACvD;AAAA,UACEC,SAAQA,MAAI;AACV,mBAAO;AAAA,UACT;AAAA,SACD;AAAA,MAEJ;AAAA,MACDC,QAAQA,MAAM;AACZ,eAAAJ,YAAAK,UAAAL,MAAAA,CAAAA,YAAAM,UAAA;AAAA,UAAA,WACqBlB;AAAAA,QAAiB,GAAA;AAAA,UAAAmB,SAAAA,MAAA,CAAAC,gBAAA,IAAA,CAAA;AAAA,SAAAR,GAAAA,YAAAM,UAAA;AAAA,UAAA,QAAA;AAAA,UAAA,WACFf;AAAAA,QAAkB,GAAA;AAAA,UAAAgB,SAAAA,MAAA,CAAAC,gBAAA,IAAA,CAAA;AAAA,QAAA,CAAA,CAAA,CAAA;AAAA,MAIxD;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;"}
1
+ {"version":3,"file":"LinkEditDialog.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/AutoLinkPlugin/LinkEditDialog.tsx"],"sourcesContent":["\r\nimport { Fragment,ref } from 'vue'\r\nimport { Dialoger } from '@maketribe/dm'\r\nimport { ElButton ,ElInput } from \"element-plus\";\r\n/**\r\n * \r\n * @param href \r\n * @returns \r\n */\r\nexport const showLinkEditPanel = async (href:any) => {\r\n return new Promise((resolve,reject) => {\r\n\r\n const hrefValue = ref(href)\r\n\r\n // 取消编辑\r\n const handleCancelClick = () => {\r\n dialogInstance.destroy();\r\n };\r\n\r\n // 确认编辑\r\n const handleConfirmClick = () => {\r\n dialogInstance.destroy();\r\n resolve(hrefValue.value);\r\n };\r\n\r\n const dialogInstance = Dialoger.customRender({\r\n title: \"设置连接\",\r\n class: \"mk-html-editor-dialog\",\r\n width: \"500px\",\r\n onClose: () => {\r\n dialogInstance.destroy();\r\n },\r\n body: () => {\r\n return <ElInput v-model={hrefValue.value} clearable={true} placeholder='http://www.xxx.com' v-slots={\r\n {\r\n prepend:()=>{\r\n return \"地址:\";\r\n }\r\n }\r\n }></ElInput>\r\n },\r\n footer: () => {\r\n return <Fragment>\r\n <ElButton onClick={handleCancelClick}>取消</ElButton>\r\n <ElButton type=\"primary\" onClick={handleConfirmClick}>\r\n 确定\r\n </ElButton>\r\n </Fragment>\r\n },\r\n });\r\n });\r\n}\r\n"],"names":["showLinkEditPanel","href","Promise","resolve","reject","hrefValue","ref","handleCancelClick","dialogInstance","destroy","handleConfirmClick","value","Dialoger","customRender","title","class","width","onClose","body","_createVNode","ElInput","$event","prepend","footer","_Fragment","ElButton","default","_createTextVNode"],"mappings":";;;AASaA,MAAAA,oBAAoB,OAAQC,SAAa;AACpD,SAAO,IAAIC,QAAQ,CAACC,SAAQC,WAAW;AAErC,UAAMC,YAAYC,IAAIL,IAAI;AAG1B,UAAMM,oBAAoBA,MAAM;AAC9BC,qBAAeC,QAAO;AAAA;AAIxB,UAAMC,qBAAqBA,MAAM;AAC/BF,qBAAeC,QAAO;AACtBN,cAAQE,UAAUM,KAAK;AAAA;AAGzB,UAAMH,iBAAiBI,SAASC,aAAa;AAAA,MAC3CC,OAAO;AAAA,MACPC,OAAO;AAAA,MACPC,OAAO;AAAA,MACPC,SAASA,MAAM;AACbT,uBAAeC,QAAO;AAAA,MACvB;AAAA,MACDS,MAAMA,MAAM;AACV,eAAAC,YAAAC,SAAA;AAAA,UAAA,cAAyBf,UAAUM;AAAAA,UAAK,uBAAAU,YAAfhB,UAAUM,QAAKU;AAAAA,UAAA,aAAa;AAAA,UAAI,eAAA;AAAA,WACvD;AAAA,UACEC,SAAQA,MAAI;AACV,mBAAO;AAAA,UACT;AAAA,SACD;AAAA,MAEJ;AAAA,MACDC,QAAQA,MAAM;AACZ,eAAAJ,YAAAK,UAAAL,MAAAA,CAAAA,YAAAM,UAAA;AAAA,UAAA,WACqBlB;AAAAA,QAAiB,GAAA;AAAA,UAAAmB,SAAAA,MAAA,CAAAC,gBAAA,IAAA,CAAA;AAAA,SAAAR,GAAAA,YAAAM,UAAA;AAAA,UAAA,QAAA;AAAA,UAAA,WACFf;AAAAA,QAAkB,GAAA;AAAA,UAAAgB,SAAAA,MAAA,CAAAC,gBAAA,IAAA,CAAA;AAAA,QAAA,CAAA,CAAA,CAAA;AAAA,MAIxD;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;"}
@@ -1,37 +1,11 @@
1
- import { defineComponent, openBlock, createElementBlock, Fragment, createVNode, unref } from "vue";
1
+ import { defineComponent, openBlock, createBlock, unref } from "vue";
2
2
  import "../../core/index.js";
3
- import _sfc_main$1 from "../../core/plugins/LexicalAutoLinkPlugin/index.vue2.js";
4
- import _sfc_main$2 from "../../core/plugins/LexicalLinkPlugin.vue2.js";
3
+ import _sfc_main$1 from "../../core/plugins/LexicalLinkPlugin.vue2.js";
5
4
  const _sfc_main = /* @__PURE__ */ defineComponent({
6
5
  __name: "index",
7
6
  setup(__props) {
8
- const URL_MATCHER = /((https?:\/\/(www\.)?)|(www\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/;
9
- const EMAIL_MATCHER = /(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))/;
10
- const MATCHERS = [
11
- (text) => {
12
- const match = URL_MATCHER.exec(text);
13
- return match && {
14
- index: match.index,
15
- length: match[0].length,
16
- text: match[0],
17
- url: match[0]
18
- };
19
- },
20
- (text) => {
21
- const match = EMAIL_MATCHER.exec(text);
22
- return match && {
23
- index: match.index,
24
- length: match[0].length,
25
- text: match[0],
26
- url: `mailto:${match[0]}`
27
- };
28
- }
29
- ];
30
7
  return (_ctx, _cache) => {
31
- return openBlock(), createElementBlock(Fragment, null, [
32
- createVNode(unref(_sfc_main$1), { matchers: MATCHERS }),
33
- createVNode(unref(_sfc_main$2))
34
- ], 64);
8
+ return openBlock(), createBlock(unref(_sfc_main$1));
35
9
  };
36
10
  }
37
11
  });
@@ -1 +1 @@
1
- {"version":3,"file":"index.vue.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/AutoLinkPlugin/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { LexicalAutoLinkPlugin,LexicalLinkPlugin } from '../../core'\r\n\r\n\r\nconst URL_MATCHER = /((https?:\\/\\/(www\\.)?)|(www\\.))[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/\r\n\r\nconst EMAIL_MATCHER = /(([^<>()[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))/\r\n\r\nconst MATCHERS = [\r\n (text: string) => {\r\n const match = URL_MATCHER.exec(text)\r\n return (\r\n match && {\r\n index: match.index,\r\n length: match[0].length,\r\n text: match[0],\r\n url: match[0],\r\n }\r\n )\r\n },\r\n (text: string) => {\r\n const match = EMAIL_MATCHER.exec(text)\r\n return (\r\n match && {\r\n index: match.index,\r\n length: match[0].length,\r\n text: match[0],\r\n url: `mailto:${match[0]}`,\r\n }\r\n )\r\n },\r\n]\r\n</script>\r\n\r\n<template>\r\n <LexicalAutoLinkPlugin :matchers=\"MATCHERS\" />\r\n <LexicalLinkPlugin />\r\n</template>\r\n"],"names":[],"mappings":";;;;;;;AAIA,UAAM,cAAc;AAEpB,UAAM,gBAAgB;AAEtB,UAAM,WAAW;AAAA,MACf,CAAC,SAAiB;AACV,cAAA,QAAQ,YAAY,KAAK,IAAI;AACnC,eACE,SAAS;AAAA,UACP,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM,CAAC,EAAE;AAAA,UACjB,MAAM,MAAM,CAAC;AAAA,UACb,KAAK,MAAM,CAAC;AAAA,QAAA;AAAA,MAGlB;AAAA,MACA,CAAC,SAAiB;AACV,cAAA,QAAQ,cAAc,KAAK,IAAI;AACrC,eACE,SAAS;AAAA,UACP,OAAO,MAAM;AAAA,UACb,QAAQ,MAAM,CAAC,EAAE;AAAA,UACjB,MAAM,MAAM,CAAC;AAAA,UACb,KAAK,UAAU,MAAM,CAAC,CAAC;AAAA,QAAA;AAAA,MAG7B;AAAA,IAAA;;;;;;;;;"}
1
+ {"version":3,"file":"index.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
@@ -88,7 +88,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
88
88
  const _component_el_dropdown = resolveComponent("el-dropdown");
89
89
  return openBlock(), createBlock(_component_el_dropdown, {
90
90
  "max-height": "300px",
91
- trigger: "click",
92
91
  disabled: disabled.value
93
92
  }, {
94
93
  dropdown: withCtx(() => [
@@ -1 +1 @@
1
- {"version":3,"file":"ContentStyleTool.vue.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/ToolbarPlugin/ContentStyleTool.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport {\r\n $createParagraphNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isRootOrShadowRoot\r\n} from 'lexical'\r\nimport { $patchStyleText,$setBlocksType } from '@lexical/selection'\r\nimport type { HeadingTagType } from '@lexical/rich-text'\r\nimport { $createHeadingNode,$isHeadingNode } from '@lexical/rich-text'\r\nimport { \r\n INSERT_CHECK_LIST_COMMAND, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, \r\n} from '@lexical/list'\r\nimport { $findMatchingParent } from '@lexical/utils'\r\nimport { useLexicalComposer } from '../../core/composables'\r\nimport { onMounted, onUnmounted, ref } from 'vue'\r\n\r\nconst editor = useLexicalComposer()\r\n\r\n// 内容类型\r\nconst CONTENT_TYPE_DEFINES = [\r\n {value:\"paragraph\",label:\"正文\"},\r\n {value:\"bullet\",label:\"无序列表\"},\r\n {value:\"number\",label:\"有序列表\"},\r\n {value:\"h1\",label:\"标题 1\"},\r\n {value:\"h2\",label:\"标题 2\"},\r\n {value:\"h3\",label:\"标题 3\"}\r\n];\r\n\r\nconst disabled = ref(false)\r\n\r\nconst contentType = ref<any>(CONTENT_TYPE_DEFINES[0]);\r\n\r\n\r\n\r\n// 更新状态栏\r\nfunction updateToolbar() {\r\n\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n\r\n const anchorNode = selection.anchor.getNode()\r\n\r\n let element\r\n = anchorNode.getKey() === 'root'\r\n ? anchorNode\r\n : $findMatchingParent(anchorNode, (e) => {\r\n const parent = e.getParent()\r\n return parent !== null && $isRootOrShadowRoot(parent)\r\n })\r\n\r\n if (element === null){ element = anchorNode.getTopLevelElementOrThrow() }\r\n \r\n const elementKey = element.getKey()\r\n const elementDOM = editor.getElementByKey(elementKey)\r\n\r\n if (elementDOM !== null) {\r\n const type = $isHeadingNode(element) ? element.getTag() : element.getType();\r\n contentType.value = CONTENT_TYPE_DEFINES.find(item=>item.value == type) || CONTENT_TYPE_DEFINES[0]\r\n }\r\n disabled.value = false;\r\n }\r\n else{\r\n\r\n disabled.value = true;\r\n }\r\n}\r\n\r\n// 设置内容类型\r\nconst setContentType = (type:any)=>{\r\n\r\n contentType.value = type;\r\n \r\n editor.update(() => {\r\n\r\n const selection = $getSelection()\r\n \r\n if ($isRangeSelection(selection)){\r\n\r\n // 清空字体大小\r\n $patchStyleText(selection, { [\"font-size\"]:\"\" })\r\n \r\n if(type.value == \"paragraph\"){\r\n $setBlocksType(selection, () => $createParagraphNode())\r\n }\r\n else if(type.value == \"bullet\"){\r\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\r\n }\r\n else if(type.value == \"bullet\"){\r\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\r\n }\r\n else if(type.value == \"check-list\"){\r\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined)\r\n }\r\n else{\r\n $setBlocksType(selection, () => {\r\n return $createHeadingNode(type.value as HeadingTagType)\r\n })\r\n }\r\n }\r\n })\r\n}\r\n\r\n// 挂载的时候\r\nonMounted(() => {\r\n\r\nconst unregisterMergeListener = editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => updateToolbar())\r\n})\r\n\r\n\r\nonUnmounted(() => unregisterMergeListener());\r\n})\r\n\r\n</script>\r\n\r\n<template>\r\n <el-dropdown max-height=\"300px\" trigger=\"click\" :disabled=\"disabled\">\r\n <el-button text :disabled=\"disabled\">\r\n {{contentType.label}} <MKSvgIcon iconClass=\"ArrowDownBold\" style=\"margin-left: 8px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :class=\"{active:contentType.label == item.label}\" v-for=\"item in CONTENT_TYPE_DEFINES\" :value=\"item.value\" @click=\"setContentType(item)\">\r\n <template v-if=\"item.value.indexOf('h')!=0 \">\r\n <div class=\"mk-doc-editor-toolbar-content-style-item text\">{{item.label}}</div>\r\n </template>\r\n <template v-else>\r\n <div class=\"mk-doc-editor-toolbar-content-style-item\" v-html=\"`<${item.value}>${item.label}</${item.value}>`\"></div>\r\n </template>\r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n</template>\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAiBA,UAAM,SAAS;AAGf,UAAM,uBAAuB;AAAA,MAC3B,EAAC,OAAM,aAAY,OAAM,KAAI;AAAA,MAC7B,EAAC,OAAM,UAAS,OAAM,OAAM;AAAA,MAC5B,EAAC,OAAM,UAAS,OAAM,OAAM;AAAA,MAC5B,EAAC,OAAM,MAAK,OAAM,OAAM;AAAA,MACxB,EAAC,OAAM,MAAK,OAAM,OAAM;AAAA,MACxB,EAAC,OAAM,MAAK,OAAM,OAAM;AAAA,IAAA;AAGpB,UAAA,WAAW,IAAI,KAAK;AAE1B,UAAM,cAAc,IAAS,qBAAqB,CAAC,CAAC;AAKpD,aAAS,gBAAgB;AAEvB,YAAM,YAAY;AAEd,UAAA,kBAAkB,SAAS,GAAG;AAE1B,cAAA,aAAa,UAAU,OAAO,QAAQ;AAExC,YAAA,UACE,WAAW,aAAa,SACtB,aACA,oBAAoB,YAAY,CAAC,MAAM;AACjC,gBAAA,SAAS,EAAE;AACV,iBAAA,WAAW,QAAQ,oBAAoB,MAAM;AAAA,QAAA,CACrD;AAEP,YAAI,YAAY,MAAK;AAAE,oBAAU,WAAW;QAA4B;AAElE,cAAA,aAAa,QAAQ;AACrB,cAAA,aAAa,OAAO,gBAAgB,UAAU;AAEpD,YAAI,eAAe,MAAM;AACjB,gBAAA,OAAO,eAAe,OAAO,IAAI,QAAQ,OAAO,IAAI,QAAQ;AACtD,sBAAA,QAAQ,qBAAqB,KAAK,CAAA,SAAM,KAAK,SAAS,IAAI,KAAK,qBAAqB,CAAC;AAAA,QACnG;AACA,iBAAS,QAAQ;AAAA,MAAA,OAEf;AAEF,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAGM,UAAA,iBAAiB,CAAC,SAAW;AAEjC,kBAAY,QAAQ;AAEpB,aAAO,OAAO,MAAM;AAEhB,cAAM,YAAY;AAEd,YAAA,kBAAkB,SAAS,GAAE;AAG/B,0BAAgB,WAAW,EAAE,CAAC,WAAW,GAAE,GAAI,CAAA;AAE5C,cAAA,KAAK,SAAS,aAAY;AACZ,2BAAA,WAAW,MAAM,qBAAA,CAAsB;AAAA,UAAA,WAEhD,KAAK,SAAS,UAAS;AACtB,mBAAA,gBAAgB,+BAA+B,MAAS;AAAA,UAAA,WAEzD,KAAK,SAAS,UAAS;AACtB,mBAAA,gBAAgB,6BAA6B,MAAS;AAAA,UAAA,WAEvD,KAAK,SAAS,cAAa;AAC1B,mBAAA,gBAAgB,2BAA2B,MAAS;AAAA,UAAA,OAEzD;AACF,2BAAe,WAAW,MAAM;AACvB,qBAAA,mBAAmB,KAAK,KAAwB;AAAA,YAAA,CACxD;AAAA,UACH;AAAA,QACF;AAAA,MAAA,CACH;AAAA,IAAA;AAIH,cAAU,MAAM;AAEhB,YAAM,0BAA0B,OAAO,uBAAuB,CAAC,EAAE,kBAAkB;AACrE,oBAAA,KAAK,MAAM,cAAA,CAAe;AAAA,MAAA,CACvC;AAGW,kBAAA,MAAM,yBAAyB;AAAA,IAAA,CAC1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"ContentStyleTool.vue.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/ToolbarPlugin/ContentStyleTool.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport {\r\n $createParagraphNode,\r\n $getSelection,\r\n $isRangeSelection,\r\n $isRootOrShadowRoot\r\n} from 'lexical'\r\nimport { $patchStyleText,$setBlocksType } from '@lexical/selection'\r\nimport type { HeadingTagType } from '@lexical/rich-text'\r\nimport { $createHeadingNode,$isHeadingNode } from '@lexical/rich-text'\r\nimport { \r\n INSERT_CHECK_LIST_COMMAND, INSERT_ORDERED_LIST_COMMAND, INSERT_UNORDERED_LIST_COMMAND, \r\n} from '@lexical/list'\r\nimport { $findMatchingParent } from '@lexical/utils'\r\nimport { useLexicalComposer } from '../../core/composables'\r\nimport { onMounted, onUnmounted, ref } from 'vue'\r\n\r\nconst editor = useLexicalComposer()\r\n\r\n// 内容类型\r\nconst CONTENT_TYPE_DEFINES = [\r\n {value:\"paragraph\",label:\"正文\"},\r\n {value:\"bullet\",label:\"无序列表\"},\r\n {value:\"number\",label:\"有序列表\"},\r\n {value:\"h1\",label:\"标题 1\"},\r\n {value:\"h2\",label:\"标题 2\"},\r\n {value:\"h3\",label:\"标题 3\"}\r\n];\r\n\r\nconst disabled = ref(false)\r\n\r\nconst contentType = ref<any>(CONTENT_TYPE_DEFINES[0]);\r\n\r\n\r\n\r\n// 更新状态栏\r\nfunction updateToolbar() {\r\n\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n\r\n const anchorNode = selection.anchor.getNode()\r\n\r\n let element\r\n = anchorNode.getKey() === 'root'\r\n ? anchorNode\r\n : $findMatchingParent(anchorNode, (e) => {\r\n const parent = e.getParent()\r\n return parent !== null && $isRootOrShadowRoot(parent)\r\n })\r\n\r\n if (element === null){ element = anchorNode.getTopLevelElementOrThrow() }\r\n \r\n const elementKey = element.getKey()\r\n const elementDOM = editor.getElementByKey(elementKey)\r\n\r\n if (elementDOM !== null) {\r\n const type = $isHeadingNode(element) ? element.getTag() : element.getType();\r\n contentType.value = CONTENT_TYPE_DEFINES.find(item=>item.value == type) || CONTENT_TYPE_DEFINES[0]\r\n }\r\n disabled.value = false;\r\n }\r\n else{\r\n\r\n disabled.value = true;\r\n }\r\n}\r\n\r\n// 设置内容类型\r\nconst setContentType = (type:any)=>{\r\n\r\n contentType.value = type;\r\n \r\n editor.update(() => {\r\n\r\n const selection = $getSelection()\r\n \r\n if ($isRangeSelection(selection)){\r\n\r\n // 清空字体大小\r\n $patchStyleText(selection, { [\"font-size\"]:\"\" })\r\n \r\n if(type.value == \"paragraph\"){\r\n $setBlocksType(selection, () => $createParagraphNode())\r\n }\r\n else if(type.value == \"bullet\"){\r\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\r\n }\r\n else if(type.value == \"bullet\"){\r\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\r\n }\r\n else if(type.value == \"check-list\"){\r\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined)\r\n }\r\n else{\r\n $setBlocksType(selection, () => {\r\n return $createHeadingNode(type.value as HeadingTagType)\r\n })\r\n }\r\n }\r\n })\r\n}\r\n\r\n// 挂载的时候\r\nonMounted(() => {\r\n\r\nconst unregisterMergeListener = editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => updateToolbar())\r\n})\r\n\r\n\r\nonUnmounted(() => unregisterMergeListener());\r\n})\r\n\r\n</script>\r\n\r\n<template>\r\n <el-dropdown max-height=\"300px\" :disabled=\"disabled\">\r\n <el-button text :disabled=\"disabled\">\r\n {{contentType.label}} <MKSvgIcon iconClass=\"ArrowDownBold\" style=\"margin-left: 8px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :class=\"{active:contentType.label == item.label}\" v-for=\"item in CONTENT_TYPE_DEFINES\" :value=\"item.value\" @click=\"setContentType(item)\">\r\n <template v-if=\"item.value.indexOf('h')!=0 \">\r\n <div class=\"mk-doc-editor-toolbar-content-style-item text\">{{item.label}}</div>\r\n </template>\r\n <template v-else>\r\n <div class=\"mk-doc-editor-toolbar-content-style-item\" v-html=\"`<${item.value}>${item.label}</${item.value}>`\"></div>\r\n </template>\r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n</template>\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AAiBA,UAAM,SAAS;AAGf,UAAM,uBAAuB;AAAA,MAC3B,EAAC,OAAM,aAAY,OAAM,KAAI;AAAA,MAC7B,EAAC,OAAM,UAAS,OAAM,OAAM;AAAA,MAC5B,EAAC,OAAM,UAAS,OAAM,OAAM;AAAA,MAC5B,EAAC,OAAM,MAAK,OAAM,OAAM;AAAA,MACxB,EAAC,OAAM,MAAK,OAAM,OAAM;AAAA,MACxB,EAAC,OAAM,MAAK,OAAM,OAAM;AAAA,IAAA;AAGpB,UAAA,WAAW,IAAI,KAAK;AAE1B,UAAM,cAAc,IAAS,qBAAqB,CAAC,CAAC;AAKpD,aAAS,gBAAgB;AAEvB,YAAM,YAAY;AAEd,UAAA,kBAAkB,SAAS,GAAG;AAE1B,cAAA,aAAa,UAAU,OAAO,QAAQ;AAExC,YAAA,UACE,WAAW,aAAa,SACtB,aACA,oBAAoB,YAAY,CAAC,MAAM;AACjC,gBAAA,SAAS,EAAE;AACV,iBAAA,WAAW,QAAQ,oBAAoB,MAAM;AAAA,QAAA,CACrD;AAEP,YAAI,YAAY,MAAK;AAAE,oBAAU,WAAW;QAA4B;AAElE,cAAA,aAAa,QAAQ;AACrB,cAAA,aAAa,OAAO,gBAAgB,UAAU;AAEpD,YAAI,eAAe,MAAM;AACjB,gBAAA,OAAO,eAAe,OAAO,IAAI,QAAQ,OAAO,IAAI,QAAQ;AACtD,sBAAA,QAAQ,qBAAqB,KAAK,CAAA,SAAM,KAAK,SAAS,IAAI,KAAK,qBAAqB,CAAC;AAAA,QACnG;AACA,iBAAS,QAAQ;AAAA,MAAA,OAEf;AAEF,iBAAS,QAAQ;AAAA,MACnB;AAAA,IACF;AAGM,UAAA,iBAAiB,CAAC,SAAW;AAEjC,kBAAY,QAAQ;AAEpB,aAAO,OAAO,MAAM;AAEhB,cAAM,YAAY;AAEd,YAAA,kBAAkB,SAAS,GAAE;AAG/B,0BAAgB,WAAW,EAAE,CAAC,WAAW,GAAE,GAAI,CAAA;AAE5C,cAAA,KAAK,SAAS,aAAY;AACZ,2BAAA,WAAW,MAAM,qBAAA,CAAsB;AAAA,UAAA,WAEhD,KAAK,SAAS,UAAS;AACtB,mBAAA,gBAAgB,+BAA+B,MAAS;AAAA,UAAA,WAEzD,KAAK,SAAS,UAAS;AACtB,mBAAA,gBAAgB,6BAA6B,MAAS;AAAA,UAAA,WAEvD,KAAK,SAAS,cAAa;AAC1B,mBAAA,gBAAgB,2BAA2B,MAAS;AAAA,UAAA,OAEzD;AACF,2BAAe,WAAW,MAAM;AACvB,qBAAA,mBAAmB,KAAK,KAAwB;AAAA,YAAA,CACxD;AAAA,UACH;AAAA,QACF;AAAA,MAAA,CACH;AAAA,IAAA;AAIH,cAAU,MAAM;AAEhB,YAAM,0BAA0B,OAAO,uBAAuB,CAAC,EAAE,kBAAkB;AACrE,oBAAA,KAAK,MAAM,cAAA,CAAe;AAAA,MAAA,CACvC;AAGW,kBAAA,MAAM,yBAAyB;AAAA,IAAA,CAC1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -15,7 +15,7 @@ import "@lexical/dragon";
15
15
  import "@lexical/plain-text";
16
16
  import "@lexical/rich-text";
17
17
  import { FONT_FAMILY_OPTIONS, FONT_SIZE_OPTIONS, ROOT_FONT_SIZE } from "./FontStyleDefines.js";
18
- import { ShowLinkEditPanel } from "../AutoLinkPlugin/LinkEditDialog.js";
18
+ import { showLinkEditPanel } from "../AutoLinkPlugin/LinkEditDialog.js";
19
19
  const _sfc_main = /* @__PURE__ */ defineComponent({
20
20
  __name: "FontStyleTool",
21
21
  setup(__props) {
@@ -36,7 +36,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
36
36
  const isLink = ref(false);
37
37
  const linkValue = ref("");
38
38
  async function insertLink() {
39
- const result = await ShowLinkEditPanel(linkValue.value);
39
+ const result = await showLinkEditPanel(linkValue.value);
40
40
  if (result.trim()) {
41
41
  editor.dispatchCommand(TOGGLE_LINK_COMMAND, sanitizeUrl(result));
42
42
  } else {
@@ -135,7 +135,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
135
135
  return openBlock(), createElementBlock(Fragment, null, [
136
136
  createVNode(_component_el_dropdown, {
137
137
  "max-height": "300px",
138
- trigger: "click",
139
138
  disabled: disabled.value
140
139
  }, {
141
140
  dropdown: withCtx(() => [
@@ -181,7 +180,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
181
180
  createVNode(_component_el_divider, { direction: "vertical" }),
182
181
  createVNode(_component_el_dropdown, {
183
182
  "max-height": "300px",
184
- trigger: "click",
185
183
  disabled: disabled.value
186
184
  }, {
187
185
  dropdown: withCtx(() => [
@@ -1 +1 @@
1
- {"version":3,"file":"FontStyleTool.vue.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/ToolbarPlugin/FontStyleTool.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n $isRootOrShadowRoot,\r\n $isParagraphNode,\r\n FORMAT_TEXT_COMMAND,\r\n FORMAT_ELEMENT_COMMAND,\r\n type ElementFormatType,\r\n} from 'lexical'\r\nimport {\r\n $getSelectionStyleValueForProperty,\r\n $patchStyleText,\r\n} from '@lexical/selection'\r\n\r\nimport { $isLinkNode, TOGGLE_LINK_COMMAND,LinkNode } from '@lexical/link'\r\nimport { sanitizeUrl } from '../../utils/url'\r\nimport { getSelectedNode } from '../../utils/getSelectedNode'\r\nimport { $findMatchingParent,mergeRegister } from '@lexical/utils'\r\nimport { useLexicalComposer } from '../../core/composables'\r\nimport { onMounted, onUnmounted, ref,watch } from 'vue'\r\nimport { FONT_SIZE_OPTIONS,ROOT_FONT_SIZE,FONT_FAMILY_OPTIONS } from \"./FontStyleDefines\"\r\nimport { ShowLinkEditPanel } from \"../AutoLinkPlugin/LinkEditDialog\";\r\n\r\nconst editor = useLexicalComposer()\r\nconst fontSize = ref('14px')\r\nconst fontColor = ref<string>('#000')\r\nconst bgColor = ref<string>('#fff')\r\nconst fontFamily = ref<any>(FONT_FAMILY_OPTIONS[0])\r\nconst isBold = ref(false)\r\nconst isItalic = ref(false)\r\nconst isUnderline = ref(false)\r\nconst isStrikethrough = ref(false)\r\n\r\nconst isSubscript = ref(false)\r\nconst isSuperscript = ref(false)\r\n\r\n// 对齐方式\r\nconst alignList = ref<ElementFormatType[]>([\"left\",\"center\",\"right\",\"justify\"])\r\nconst alignValue = ref(alignList.value[0])\r\nconst disabled = ref(false)\r\nconst isLink = ref(false)\r\nconst linkValue = ref(\"\");\r\n\r\nasync function insertLink() {\r\n\r\n const result:any = await ShowLinkEditPanel(linkValue.value);\r\n\r\n if(result.trim()){\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, sanitizeUrl(result))\r\n }\r\n else{\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\r\n }\r\n}\r\n\r\n// 更新状态栏\r\nfunction updateToolbar() {\r\n\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n\r\n const anchorNode = selection.anchor.getNode()\r\n\r\n let element = anchorNode.getKey() === 'root'\r\n ? anchorNode\r\n : $findMatchingParent(anchorNode, (e) => {\r\n const parent = e.getParent()\r\n return parent !== null && $isRootOrShadowRoot(parent)\r\n });\r\n\r\n\r\n if (element === null){\r\n element = anchorNode.getTopLevelElementOrThrow()\r\n }\r\n\r\n let elementDOM = editor.getElementByKey(element.getKey());\r\n\r\n // 文本对齐\r\n alignValue.value = (elementDOM?.style.textAlign as ElementFormatType) || \"left\";\r\n\r\n if(alignValue.value == \"start\"){ alignValue.value = \"left\"; }\r\n else if(alignValue.value == \"end\"){ alignValue.value = \"right\"; }\r\n\r\n // Update text format\r\n isBold.value = selection.hasFormat('bold')\r\n isItalic.value = selection.hasFormat('italic')\r\n isUnderline.value = selection.hasFormat('underline')\r\n isStrikethrough.value = selection.hasFormat('strikethrough')\r\n isSubscript.value = selection.hasFormat('subscript')\r\n isSuperscript.value = selection.hasFormat('superscript')\r\n\r\n // Handle buttons\r\n var ff = $getSelectionStyleValueForProperty(selection, 'font-family', 'Arial');\r\n let fs = $getSelectionStyleValueForProperty(selection, 'font-size', '1rem');\r\n \r\n if(fs){\r\n fontSize.value = Math.round(parseFloat(fs) * ROOT_FONT_SIZE)+\"px\"\r\n }\r\n \r\n fontColor.value = $getSelectionStyleValueForProperty(selection, 'color', '#000')\r\n bgColor.value = $getSelectionStyleValueForProperty(selection, 'background-color', '#fff')\r\n fontFamily.value = FONT_FAMILY_OPTIONS.find(item=>item.value==ff) || FONT_FAMILY_OPTIONS[0];\r\n\r\n disabled.value = false;\r\n\r\n // Update links\r\n const node = getSelectedNode(selection)\r\n const parent = node.getParent()\r\n isLink.value = $isLinkNode(parent) || $isLinkNode(node)\r\n if(isLink.value){\r\n linkValue.value = $isLinkNode(parent) ? parent.getURL() : (node as LinkNode).getURL()\r\n }\r\n else{\r\n linkValue.value = \"\";\r\n }\r\n }\r\n else{\r\n\r\n disabled.value = true;\r\n }\r\n}\r\n\r\n// 文字样式\r\nconst fontStyleHandle = (data : any,styleName?:any)=>{\r\n fontSize.value = data.label;\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null) {\r\n $patchStyleText(selection, {\r\n [styleName || \"font-size\"]:data.value\r\n })\r\n }\r\n })\r\n}\r\n\r\n// 字体颜色\r\nconst setFontColor = (color:any)=>{\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null){\r\n $patchStyleText(selection, { color })\r\n }\r\n },{})\r\n}\r\n\r\n// bg颜色\r\nconst setBgColor = (color:any)=>{\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null){\r\n $patchStyleText(selection, { 'background-color':color })\r\n }\r\n },{})\r\n}\r\n\r\n\r\n// 挂载的时候\r\nonMounted(() => {\r\n\r\n const unregisterMergeListener = mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => updateToolbar())\r\n })\r\n )\r\n\r\n onUnmounted(() => unregisterMergeListener());\r\n})\r\n\r\n</script>\r\n\r\n<template>\r\n <!-- 字体 -->\r\n <el-dropdown max-height=\"300px\" trigger=\"click\" :disabled=\"disabled\">\r\n <el-button text :style=\"{fontFamily:fontFamily.value}\" :disabled=\"disabled\">\r\n {{fontFamily.label}} <MKSvgIcon iconClass=\"ArrowDownBold\" style=\"margin-left: 8px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :class=\"{active:fontFamily.label == item.label}\" :disabled=\"disabled\" v-for=\"item in FONT_FAMILY_OPTIONS\" :value=\"item.value\" @click=\"fontStyleHandle(item,'font-family')\">\r\n <span :style=\"{fontFamily:item.value}\">\r\n {{item.label}}\r\n </span>\r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n <el-divider direction=\"vertical\" /> \r\n <!-- 字体大小 -->\r\n <el-dropdown max-height=\"300px\" trigger=\"click\" :disabled=\"disabled\">\r\n <el-button text :disabled=\"disabled\">\r\n {{fontSize}} <MKSvgIcon iconClass=\"ArrowDownBold\" style=\"margin-left: 8px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :class=\"{active:fontSize==item.label}\" :disabled=\"disabled\" v-for=\"item in FONT_SIZE_OPTIONS\" :value=\"item.value\" @click=\"fontStyleHandle(item)\">{{item.label}}</el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n <el-divider direction=\"vertical\" /> \r\n <!-- 字体颜色 -->\r\n <el-button text class=\"mk-doc-editor-toolbar__fontcolor\" :disabled=\"disabled\" >\r\n <el-color-picker v-model=\"fontColor\" :disabled=\"disabled\" @change=\"setFontColor\" />\r\n </el-button>\r\n <!-- 背景颜色 -->\r\n <el-button text class=\"mk-doc-editor-toolbar__bgcolor\" :disabled=\"disabled\" >\r\n <el-color-picker v-model=\"bgColor\" :disabled=\"disabled\" />\r\n <MKSvgIcon class=\"view\" iconClass=\"doc-background-color\" @change=\"setBgColor\" /> \r\n </el-button>\r\n\r\n <el-divider direction=\"vertical\" />\r\n <el-button-group>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isBold ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold')\">\r\n <MKSvgIcon iconClass=\"doc-bold\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isItalic ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic')\">\r\n <MKSvgIcon iconClass=\"doc-italic\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isUnderline ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline')\">\r\n <MKSvgIcon iconClass=\"doc-underline\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isStrikethrough ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough')\">\r\n <MKSvgIcon iconClass=\"doc-strikethrough\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isSubscript ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript')\">\r\n <MKSvgIcon iconClass=\"doc-sub\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isSuperscript ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript')\">\r\n <MKSvgIcon iconClass=\"doc-sup\" /> \r\n </el-button>\r\n </el-button-group>\r\n <el-divider direction=\"vertical\" />\r\n <el-dropdown max-height=\"300px\" trigger=\"click\" :disabled=\"disabled\">\r\n <el-button text :style=\"{fontFamily:fontFamily.value}\" :disabled=\"disabled\">\r\n <MKSvgIcon :iconClass=\"`doc-align-${alignValue}`\" style=\"font-size: 18px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :disabled=\"disabled\" :class=\"{active:alignValue == item}\" v-for=\"item in alignList\" :value=\"item\" @click=\"editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, item)\">\r\n <MKSvgIcon :iconClass=\"`doc-align-${item}`\" style=\"font-size: 18px;\" /> \r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n <el-divider direction=\"vertical\" />\r\n <!-- 链接 -->\r\n <el-button-group>\r\n <el-button text :disabled=\"disabled\" :class=\"`${isLink ? 'active' : ''}`\" @click=\"insertLink\">\r\n <MKSvgIcon iconClass=\"doc-link\" /> \r\n </el-button>\r\n </el-button-group>\r\n</template>\r\n"],"names":["parent"],"mappings":"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"}
1
+ {"version":3,"file":"FontStyleTool.vue.js","sources":["../../../../../../../src/components/basic/doc-editor/plugins/ToolbarPlugin/FontStyleTool.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport {\r\n $getSelection,\r\n $isRangeSelection,\r\n $isRootOrShadowRoot,\r\n $isParagraphNode,\r\n FORMAT_TEXT_COMMAND,\r\n FORMAT_ELEMENT_COMMAND,\r\n type ElementFormatType,\r\n} from 'lexical'\r\nimport {\r\n $getSelectionStyleValueForProperty,\r\n $patchStyleText,\r\n} from '@lexical/selection'\r\n\r\nimport { $isLinkNode, TOGGLE_LINK_COMMAND,LinkNode } from '@lexical/link'\r\nimport { sanitizeUrl } from '../../utils/url'\r\nimport { getSelectedNode } from '../../utils/getSelectedNode'\r\nimport { $findMatchingParent,mergeRegister } from '@lexical/utils'\r\nimport { useLexicalComposer } from '../../core/composables'\r\nimport { onMounted, onUnmounted, ref,watch } from 'vue'\r\nimport { FONT_SIZE_OPTIONS,ROOT_FONT_SIZE,FONT_FAMILY_OPTIONS } from \"./FontStyleDefines\"\r\nimport { showLinkEditPanel } from \"../AutoLinkPlugin/LinkEditDialog\";\r\n\r\nconst editor = useLexicalComposer()\r\nconst fontSize = ref('14px')\r\nconst fontColor = ref<string>('#000')\r\nconst bgColor = ref<string>('#fff')\r\nconst fontFamily = ref<any>(FONT_FAMILY_OPTIONS[0])\r\nconst isBold = ref(false)\r\nconst isItalic = ref(false)\r\nconst isUnderline = ref(false)\r\nconst isStrikethrough = ref(false)\r\n\r\nconst isSubscript = ref(false)\r\nconst isSuperscript = ref(false)\r\n\r\n// 对齐方式\r\nconst alignList = ref<ElementFormatType[]>([\"left\",\"center\",\"right\",\"justify\"])\r\nconst alignValue = ref(alignList.value[0])\r\nconst disabled = ref(false)\r\nconst isLink = ref(false)\r\nconst linkValue = ref(\"\");\r\n\r\nasync function insertLink() {\r\n\r\n const result:any = await showLinkEditPanel(linkValue.value);\r\n\r\n if(result.trim()){\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, sanitizeUrl(result))\r\n }\r\n else{\r\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null)\r\n }\r\n}\r\n\r\n// 更新状态栏\r\nfunction updateToolbar() {\r\n\r\n const selection = $getSelection()\r\n\r\n if ($isRangeSelection(selection)) {\r\n\r\n const anchorNode = selection.anchor.getNode()\r\n\r\n let element = anchorNode.getKey() === 'root'\r\n ? anchorNode\r\n : $findMatchingParent(anchorNode, (e) => {\r\n const parent = e.getParent()\r\n return parent !== null && $isRootOrShadowRoot(parent)\r\n });\r\n\r\n\r\n if (element === null){\r\n element = anchorNode.getTopLevelElementOrThrow()\r\n }\r\n\r\n let elementDOM = editor.getElementByKey(element.getKey());\r\n\r\n // 文本对齐\r\n alignValue.value = (elementDOM?.style.textAlign as ElementFormatType) || \"left\";\r\n\r\n if(alignValue.value == \"start\"){ alignValue.value = \"left\"; }\r\n else if(alignValue.value == \"end\"){ alignValue.value = \"right\"; }\r\n\r\n // Update text format\r\n isBold.value = selection.hasFormat('bold')\r\n isItalic.value = selection.hasFormat('italic')\r\n isUnderline.value = selection.hasFormat('underline')\r\n isStrikethrough.value = selection.hasFormat('strikethrough')\r\n isSubscript.value = selection.hasFormat('subscript')\r\n isSuperscript.value = selection.hasFormat('superscript')\r\n\r\n // Handle buttons\r\n var ff = $getSelectionStyleValueForProperty(selection, 'font-family', 'Arial');\r\n let fs = $getSelectionStyleValueForProperty(selection, 'font-size', '1rem');\r\n \r\n if(fs){\r\n fontSize.value = Math.round(parseFloat(fs) * ROOT_FONT_SIZE)+\"px\"\r\n }\r\n \r\n fontColor.value = $getSelectionStyleValueForProperty(selection, 'color', '#000')\r\n bgColor.value = $getSelectionStyleValueForProperty(selection, 'background-color', '#fff')\r\n fontFamily.value = FONT_FAMILY_OPTIONS.find(item=>item.value==ff) || FONT_FAMILY_OPTIONS[0];\r\n\r\n disabled.value = false;\r\n\r\n // Update links\r\n const node = getSelectedNode(selection)\r\n const parent = node.getParent()\r\n isLink.value = $isLinkNode(parent) || $isLinkNode(node)\r\n if(isLink.value){\r\n linkValue.value = $isLinkNode(parent) ? parent.getURL() : (node as LinkNode).getURL()\r\n }\r\n else{\r\n linkValue.value = \"\";\r\n }\r\n }\r\n else{\r\n\r\n disabled.value = true;\r\n }\r\n}\r\n\r\n// 文字样式\r\nconst fontStyleHandle = (data : any,styleName?:any)=>{\r\n fontSize.value = data.label;\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null) {\r\n $patchStyleText(selection, {\r\n [styleName || \"font-size\"]:data.value\r\n })\r\n }\r\n })\r\n}\r\n\r\n// 字体颜色\r\nconst setFontColor = (color:any)=>{\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null){\r\n $patchStyleText(selection, { color })\r\n }\r\n },{})\r\n}\r\n\r\n// bg颜色\r\nconst setBgColor = (color:any)=>{\r\n editor.update(() => {\r\n const selection = $getSelection()\r\n if (selection !== null){\r\n $patchStyleText(selection, { 'background-color':color })\r\n }\r\n },{})\r\n}\r\n\r\n\r\n// 挂载的时候\r\nonMounted(() => {\r\n\r\n const unregisterMergeListener = mergeRegister(\r\n editor.registerUpdateListener(({ editorState }) => {\r\n editorState.read(() => updateToolbar())\r\n })\r\n )\r\n\r\n onUnmounted(() => unregisterMergeListener());\r\n})\r\n\r\n</script>\r\n\r\n<template>\r\n <!-- 字体 -->\r\n <el-dropdown max-height=\"300px\" :disabled=\"disabled\">\r\n <el-button text :style=\"{fontFamily:fontFamily.value}\" :disabled=\"disabled\">\r\n {{fontFamily.label}} <MKSvgIcon iconClass=\"ArrowDownBold\" style=\"margin-left: 8px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :class=\"{active:fontFamily.label == item.label}\" :disabled=\"disabled\" v-for=\"item in FONT_FAMILY_OPTIONS\" :value=\"item.value\" @click=\"fontStyleHandle(item,'font-family')\">\r\n <span :style=\"{fontFamily:item.value}\">\r\n {{item.label}}\r\n </span>\r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n <el-divider direction=\"vertical\" /> \r\n <!-- 字体大小 -->\r\n <el-dropdown max-height=\"300px\" :disabled=\"disabled\">\r\n <el-button text :disabled=\"disabled\">\r\n {{fontSize}} <MKSvgIcon iconClass=\"ArrowDownBold\" style=\"margin-left: 8px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :class=\"{active:fontSize==item.label}\" :disabled=\"disabled\" v-for=\"item in FONT_SIZE_OPTIONS\" :value=\"item.value\" @click=\"fontStyleHandle(item)\">{{item.label}}</el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n <el-divider direction=\"vertical\" /> \r\n <!-- 字体颜色 -->\r\n <el-button text class=\"mk-doc-editor-toolbar__fontcolor\" :disabled=\"disabled\" >\r\n <el-color-picker v-model=\"fontColor\" :disabled=\"disabled\" @change=\"setFontColor\" />\r\n </el-button>\r\n <!-- 背景颜色 -->\r\n <el-button text class=\"mk-doc-editor-toolbar__bgcolor\" :disabled=\"disabled\" >\r\n <el-color-picker v-model=\"bgColor\" :disabled=\"disabled\" />\r\n <MKSvgIcon class=\"view\" iconClass=\"doc-background-color\" @change=\"setBgColor\" /> \r\n </el-button>\r\n\r\n <el-divider direction=\"vertical\" />\r\n <el-button-group>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isBold ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'bold')\">\r\n <MKSvgIcon iconClass=\"doc-bold\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isItalic ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'italic')\">\r\n <MKSvgIcon iconClass=\"doc-italic\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isUnderline ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'underline')\">\r\n <MKSvgIcon iconClass=\"doc-underline\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isStrikethrough ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'strikethrough')\">\r\n <MKSvgIcon iconClass=\"doc-strikethrough\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isSubscript ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'subscript')\">\r\n <MKSvgIcon iconClass=\"doc-sub\" /> \r\n </el-button>\r\n <el-button :disabled=\"disabled\" text :class=\"`${isSuperscript ? 'active' : ''}`\" @click=\"editor.dispatchCommand(FORMAT_TEXT_COMMAND, 'superscript')\">\r\n <MKSvgIcon iconClass=\"doc-sup\" /> \r\n </el-button>\r\n </el-button-group>\r\n <el-divider direction=\"vertical\" />\r\n <el-dropdown max-height=\"300px\" trigger=\"click\" :disabled=\"disabled\">\r\n <el-button text :style=\"{fontFamily:fontFamily.value}\" :disabled=\"disabled\">\r\n <MKSvgIcon :iconClass=\"`doc-align-${alignValue}`\" style=\"font-size: 18px;\" /> \r\n </el-button>\r\n <template #dropdown>\r\n <el-dropdown-menu>\r\n <el-dropdown-item :disabled=\"disabled\" :class=\"{active:alignValue == item}\" v-for=\"item in alignList\" :value=\"item\" @click=\"editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, item)\">\r\n <MKSvgIcon :iconClass=\"`doc-align-${item}`\" style=\"font-size: 18px;\" /> \r\n </el-dropdown-item>\r\n </el-dropdown-menu>\r\n </template>\r\n </el-dropdown>\r\n <el-divider direction=\"vertical\" />\r\n <!-- 链接 -->\r\n <el-button-group>\r\n <el-button text :disabled=\"disabled\" :class=\"`${isLink ? 'active' : ''}`\" @click=\"insertLink\">\r\n <MKSvgIcon iconClass=\"doc-link\" /> \r\n </el-button>\r\n </el-button-group>\r\n</template>\r\n"],"names":["parent"],"mappings":"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"}
@@ -3,4 +3,4 @@
3
3
  * @param href
4
4
  * @returns
5
5
  */
6
- export declare const ShowLinkEditPanel: (href: any) => Promise<unknown>;
6
+ export declare const showLinkEditPanel: (href: any) => Promise<unknown>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@maketribe/ms-app",
3
- "version": "3.2.40",
3
+ "version": "3.2.41",
4
4
  "description": "",
5
5
  "main": "dist/cjs",
6
6
  "module": "dist/esm",
@@ -50,10 +50,10 @@
50
50
  "vue-codemirror": "^6.1.1",
51
51
  "vue-cropper": "^1.1.4",
52
52
  "vue-router": "^4.2.4",
53
- "@maketribe/locale": "^3.2.0",
54
53
  "@maketribe/dm": "^3.2.11",
55
- "@maketribe/request": "^3.2.3",
56
- "@maketribe/utils": "^3.2.1"
54
+ "@maketribe/locale": "^3.2.0",
55
+ "@maketribe/utils": "^3.2.1",
56
+ "@maketribe/request": "^3.2.3"
57
57
  },
58
58
  "devDependencies": {
59
59
  "@types/sortablejs": "^1.15.8"
@@ -1,4 +0,0 @@
1
- "use strict";
2
- const index_vue_vue_type_script_setup_true_lang = require("./index.vue2.js");
3
- module.exports = index_vue_vue_type_script_setup_true_lang;
4
- //# sourceMappingURL=index.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;"}
@@ -1,37 +0,0 @@
1
- "use strict";
2
- const vue = require("vue");
3
- require("@lexical/text");
4
- require("@lexical/utils");
5
- require("@lexical/overflow");
6
- require("lexical");
7
- require("tiny-invariant");
8
- require("@lexical/history");
9
- const useLexicalComposer = require("../../composables/useLexicalComposer.js");
10
- require("@lexical/list");
11
- require("@lexical/dragon");
12
- require("@lexical/plain-text");
13
- require("@lexical/rich-text");
14
- const shared = require("./shared.js");
15
- const _sfc_main = /* @__PURE__ */ vue.defineComponent({
16
- __name: "index",
17
- props: {
18
- matchers: {}
19
- },
20
- emits: ["change"],
21
- setup(__props, { emit: __emit }) {
22
- const props = __props;
23
- const emit = __emit;
24
- const editor = useLexicalComposer.useLexicalComposer();
25
- shared.useAutoLink(editor, props.matchers, (url, prevUrl) => {
26
- emit("change", {
27
- url,
28
- prevUrl
29
- });
30
- });
31
- return (_ctx, _cache) => {
32
- return null;
33
- };
34
- }
35
- });
36
- module.exports = _sfc_main;
37
- //# sourceMappingURL=index.vue2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.vue2.js","sources":["../../../../../../../../src/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { useLexicalComposer } from '../../composables'\r\nimport { type LinkMatcher, useAutoLink } from './shared'\r\n\r\nconst props = defineProps<{\r\n matchers: LinkMatcher[]\r\n}>()\r\n\r\nconst emit = defineEmits<{\r\n (e: 'change', value: { url: string | null, prevUrl: string | null }): void\r\n}>()\r\n\r\nconst editor = useLexicalComposer()\r\n\r\nuseAutoLink(editor, props.matchers, (url: string | null, prevUrl: string | null) => {\r\n emit('change', {\r\n url,\r\n prevUrl,\r\n })\r\n})\r\n</script>\r\n\r\n<template />\r\n"],"names":["useLexicalComposer","useAutoLink"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAIA,UAAM,QAAQ;AAId,UAAM,OAAO;AAIb,UAAM,SAASA,mBAAAA;AAEfC,WAAA,YAAY,QAAQ,MAAM,UAAU,CAAC,KAAoB,YAA2B;AAClF,WAAK,UAAU;AAAA,QACb;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IAAA,CACF;;;;;;;"}
@@ -1,176 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const vue = require("vue");
4
- const invariant = require("tiny-invariant");
5
- const link = require("@lexical/link");
6
- const utils = require("@lexical/utils");
7
- const lexical = require("lexical");
8
- function findFirstMatch(text, matchers) {
9
- for (let i = 0; i < matchers.length; i++) {
10
- const match = matchers[i](text);
11
- if (match)
12
- return match;
13
- }
14
- return null;
15
- }
16
- const PUNCTUATION_OR_SPACE = /[.,;\s]/;
17
- function isSeparator(char) {
18
- return PUNCTUATION_OR_SPACE.test(char);
19
- }
20
- function endsWithSeparator(textContent) {
21
- return isSeparator(textContent[textContent.length - 1]);
22
- }
23
- function startsWithSeparator(textContent) {
24
- return isSeparator(textContent[0]);
25
- }
26
- function isPreviousNodeValid(node) {
27
- let previousNode = node.getPreviousSibling();
28
- if (lexical.$isElementNode(previousNode))
29
- previousNode = previousNode.getLastDescendant();
30
- return previousNode === null || lexical.$isLineBreakNode(previousNode) || lexical.$isTextNode(previousNode) && endsWithSeparator(previousNode.getTextContent());
31
- }
32
- function isNextNodeValid(node) {
33
- let nextNode = node.getNextSibling();
34
- if (lexical.$isElementNode(nextNode))
35
- nextNode = nextNode.getFirstDescendant();
36
- return nextNode === null || lexical.$isLineBreakNode(nextNode) || lexical.$isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent());
37
- }
38
- function isContentAroundIsValid(matchStart, matchEnd, text, node) {
39
- const contentBeforeIsValid = matchStart > 0 ? isSeparator(text[matchStart - 1]) : isPreviousNodeValid(node);
40
- if (!contentBeforeIsValid)
41
- return false;
42
- const contentAfterIsValid = matchEnd < text.length ? isSeparator(text[matchEnd]) : isNextNodeValid(node);
43
- return contentAfterIsValid;
44
- }
45
- function handleLinkCreation(node, matchers, onChange) {
46
- const nodeText = node.getTextContent();
47
- let text = nodeText;
48
- let invalidMatchEnd = 0;
49
- let remainingTextNode = node;
50
- let match;
51
- while ((match = findFirstMatch(text, matchers)) && match !== null) {
52
- const matchStart = match.index;
53
- const matchLength = match.length;
54
- const matchEnd = matchStart + matchLength;
55
- const isValid = isContentAroundIsValid(
56
- invalidMatchEnd + matchStart,
57
- invalidMatchEnd + matchEnd,
58
- nodeText,
59
- node
60
- );
61
- if (isValid) {
62
- let linkTextNode;
63
- if (invalidMatchEnd + matchStart === 0) {
64
- [linkTextNode, remainingTextNode] = remainingTextNode.splitText(
65
- invalidMatchEnd + matchLength
66
- );
67
- } else {
68
- [, linkTextNode, remainingTextNode] = remainingTextNode.splitText(
69
- invalidMatchEnd + matchStart,
70
- invalidMatchEnd + matchStart + matchLength
71
- );
72
- }
73
- const linkNode = link.$createAutoLinkNode(match.url, match.attributes);
74
- const textNode = lexical.$createTextNode(match.text);
75
- textNode.setFormat(linkTextNode.getFormat());
76
- textNode.setDetail(linkTextNode.getDetail());
77
- linkNode.append(textNode);
78
- linkTextNode.replace(linkNode);
79
- onChange(match.url, null);
80
- invalidMatchEnd = 0;
81
- } else {
82
- invalidMatchEnd += matchEnd;
83
- }
84
- text = text.substring(matchEnd);
85
- }
86
- }
87
- function handleLinkEdit(linkNode, matchers, onChange) {
88
- const children = linkNode.getChildren();
89
- const childrenLength = children.length;
90
- for (let i = 0; i < childrenLength; i++) {
91
- const child = children[i];
92
- if (!lexical.$isTextNode(child) || !child.isSimpleText()) {
93
- replaceWithChildren(linkNode);
94
- onChange(null, linkNode.getURL());
95
- return;
96
- }
97
- }
98
- const text = linkNode.getTextContent();
99
- const match = findFirstMatch(text, matchers);
100
- if (match === null || match.text !== text) {
101
- replaceWithChildren(linkNode);
102
- onChange(null, linkNode.getURL());
103
- return;
104
- }
105
- if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {
106
- replaceWithChildren(linkNode);
107
- onChange(null, linkNode.getURL());
108
- return;
109
- }
110
- const url = linkNode.getURL();
111
- if (url !== match.url) {
112
- linkNode.setURL(match.url);
113
- onChange(match.url, url);
114
- }
115
- if (match.attributes) {
116
- const rel = linkNode.getRel();
117
- if (rel !== match.attributes.rel) {
118
- linkNode.setRel(match.attributes.rel || null);
119
- onChange(match.attributes.rel || null, rel);
120
- }
121
- const target = linkNode.getTarget();
122
- if (target !== match.attributes.target) {
123
- linkNode.setTarget(match.attributes.target || null);
124
- onChange(match.attributes.target || null, target);
125
- }
126
- }
127
- }
128
- function handleBadNeighbors(textNode, onChange) {
129
- const previousSibling = textNode.getPreviousSibling();
130
- const nextSibling = textNode.getNextSibling();
131
- const text = textNode.getTextContent();
132
- if (link.$isAutoLinkNode(previousSibling) && !startsWithSeparator(text)) {
133
- replaceWithChildren(previousSibling);
134
- onChange(null, previousSibling.getURL());
135
- }
136
- if (link.$isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {
137
- replaceWithChildren(nextSibling);
138
- onChange(null, nextSibling.getURL());
139
- }
140
- }
141
- function replaceWithChildren(node) {
142
- const children = node.getChildren();
143
- const childrenLength = children.length;
144
- for (let j = childrenLength - 1; j >= 0; j--)
145
- node.insertAfter(children[j]);
146
- node.remove();
147
- return children.map((child) => child.getLatest());
148
- }
149
- function useAutoLink(editor, matchers, onChange) {
150
- vue.watchEffect((onInvalidate) => {
151
- if (!editor.hasNodes([link.AutoLinkNode]))
152
- invariant(false, "LexicalAutoLinkPlugin: AutoLinkNode not registered on editor");
153
- const onChangeWrapped = (url, prevUrl) => {
154
- if (onChange)
155
- onChange(url, prevUrl);
156
- };
157
- const fn = utils.mergeRegister(
158
- editor.registerNodeTransform(lexical.TextNode, (textNode) => {
159
- const parent = textNode.getParentOrThrow();
160
- if (link.$isAutoLinkNode(parent)) {
161
- handleLinkEdit(parent, vue.unref(matchers), onChangeWrapped);
162
- } else if (!link.$isLinkNode(parent)) {
163
- if (textNode.isSimpleText())
164
- handleLinkCreation(textNode, vue.unref(matchers), onChangeWrapped);
165
- handleBadNeighbors(textNode, onChangeWrapped);
166
- }
167
- }),
168
- editor.registerNodeTransform(link.AutoLinkNode, (linkNode) => {
169
- handleLinkEdit(linkNode, vue.unref(matchers), onChangeWrapped);
170
- })
171
- );
172
- onInvalidate(fn);
173
- });
174
- }
175
- exports.useAutoLink = useAutoLink;
176
- //# sourceMappingURL=shared.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared.js","sources":["../../../../../../../../src/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/shared.ts"],"sourcesContent":["import type { LinkAttributes } from '@lexical/link'\r\nimport type { ElementNode, LexicalEditor, LexicalNode } from 'lexical'\r\nimport { unref, watchEffect } from 'vue'\r\nimport invariant from 'tiny-invariant'\r\n\r\nimport {\r\n $createAutoLinkNode,\r\n $isAutoLinkNode,\r\n $isLinkNode,\r\n AutoLinkNode,\r\n} from '@lexical/link'\r\nimport { mergeRegister } from '@lexical/utils'\r\nimport {\r\n $createTextNode,\r\n $isElementNode,\r\n $isLineBreakNode,\r\n $isTextNode,\r\n TextNode,\r\n} from 'lexical'\r\nimport type { MaybeRef } from 'vue'\r\n\r\ntype ChangeHandler = (url: string | null, prevUrl: string | null) => void\r\n\r\ninterface LinkMatcherResult {\r\n attributes?: LinkAttributes\r\n index: number\r\n length: number\r\n text: string\r\n url: string\r\n}\r\n\r\nexport type LinkMatcher = (text: string) => LinkMatcherResult | null\r\n\r\nfunction findFirstMatch(\r\n text: string,\r\n matchers: Array<LinkMatcher>,\r\n): LinkMatcherResult | null {\r\n for (let i = 0; i < matchers.length; i++) {\r\n const match = matchers[i](text)\r\n\r\n if (match)\r\n return match\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst PUNCTUATION_OR_SPACE = /[.,;\\s]/\r\n\r\nfunction isSeparator(char: string): boolean {\r\n return PUNCTUATION_OR_SPACE.test(char)\r\n}\r\n\r\nfunction endsWithSeparator(textContent: string): boolean {\r\n return isSeparator(textContent[textContent.length - 1])\r\n}\r\n\r\nfunction startsWithSeparator(textContent: string): boolean {\r\n return isSeparator(textContent[0])\r\n}\r\n\r\nfunction isPreviousNodeValid(node: LexicalNode): boolean {\r\n let previousNode = node.getPreviousSibling()\r\n if ($isElementNode(previousNode))\r\n previousNode = previousNode.getLastDescendant()\r\n\r\n return (\r\n previousNode === null\r\n || $isLineBreakNode(previousNode)\r\n || ($isTextNode(previousNode)\r\n && endsWithSeparator(previousNode.getTextContent()))\r\n )\r\n}\r\n\r\nfunction isNextNodeValid(node: LexicalNode): boolean {\r\n let nextNode = node.getNextSibling()\r\n if ($isElementNode(nextNode))\r\n nextNode = nextNode.getFirstDescendant()\r\n\r\n return (\r\n nextNode === null\r\n || $isLineBreakNode(nextNode)\r\n || ($isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent()))\r\n )\r\n}\r\n\r\nfunction isContentAroundIsValid(\r\n matchStart: number,\r\n matchEnd: number,\r\n text: string,\r\n node: TextNode,\r\n): boolean {\r\n const contentBeforeIsValid\r\n = matchStart > 0\r\n ? isSeparator(text[matchStart - 1])\r\n : isPreviousNodeValid(node)\r\n if (!contentBeforeIsValid)\r\n return false\r\n\r\n const contentAfterIsValid\r\n = matchEnd < text.length\r\n ? isSeparator(text[matchEnd])\r\n : isNextNodeValid(node)\r\n return contentAfterIsValid\r\n}\r\n\r\nfunction handleLinkCreation(\r\n node: TextNode,\r\n matchers: Array<LinkMatcher>,\r\n onChange: ChangeHandler,\r\n): void {\r\n const nodeText = node.getTextContent()\r\n let text = nodeText\r\n let invalidMatchEnd = 0\r\n let remainingTextNode = node\r\n let match\r\n\r\n // eslint-disable-next-line no-cond-assign\r\n while ((match = findFirstMatch(text, matchers)) && match !== null) {\r\n const matchStart = match.index\r\n const matchLength = match.length\r\n const matchEnd = matchStart + matchLength\r\n const isValid = isContentAroundIsValid(\r\n invalidMatchEnd + matchStart,\r\n invalidMatchEnd + matchEnd,\r\n nodeText,\r\n node,\r\n )\r\n\r\n if (isValid) {\r\n let linkTextNode\r\n if (invalidMatchEnd + matchStart === 0) {\r\n [linkTextNode, remainingTextNode] = remainingTextNode.splitText(\r\n invalidMatchEnd + matchLength,\r\n )\r\n }\r\n else {\r\n [, linkTextNode, remainingTextNode] = remainingTextNode.splitText(\r\n invalidMatchEnd + matchStart,\r\n invalidMatchEnd + matchStart + matchLength,\r\n )\r\n }\r\n const linkNode = $createAutoLinkNode(match.url, match.attributes)\r\n const textNode = $createTextNode(match.text)\r\n textNode.setFormat(linkTextNode.getFormat())\r\n textNode.setDetail(linkTextNode.getDetail())\r\n linkNode.append(textNode)\r\n linkTextNode.replace(linkNode)\r\n onChange(match.url, null)\r\n invalidMatchEnd = 0\r\n }\r\n else {\r\n invalidMatchEnd += matchEnd\r\n }\r\n\r\n text = text.substring(matchEnd)\r\n }\r\n}\r\n\r\nfunction handleLinkEdit(\r\n linkNode: AutoLinkNode,\r\n matchers: Array<LinkMatcher>,\r\n onChange: ChangeHandler,\r\n): void {\r\n // Check children are simple text\r\n const children = linkNode.getChildren()\r\n const childrenLength = children.length\r\n for (let i = 0; i < childrenLength; i++) {\r\n const child = children[i]\r\n if (!$isTextNode(child) || !child.isSimpleText()) {\r\n replaceWithChildren(linkNode)\r\n onChange(null, linkNode.getURL())\r\n return\r\n }\r\n }\r\n\r\n // Check text content fully matches\r\n const text = linkNode.getTextContent()\r\n const match = findFirstMatch(text, matchers)\r\n if (match === null || match.text !== text) {\r\n replaceWithChildren(linkNode)\r\n onChange(null, linkNode.getURL())\r\n return\r\n }\r\n\r\n // Check neighbors\r\n if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {\r\n replaceWithChildren(linkNode)\r\n onChange(null, linkNode.getURL())\r\n return\r\n }\r\n\r\n const url = linkNode.getURL()\r\n if (url !== match.url) {\r\n linkNode.setURL(match.url)\r\n onChange(match.url, url)\r\n }\r\n\r\n if (match.attributes) {\r\n const rel = linkNode.getRel()\r\n if (rel !== match.attributes.rel) {\r\n linkNode.setRel(match.attributes.rel || null)\r\n onChange(match.attributes.rel || null, rel)\r\n }\r\n\r\n const target = linkNode.getTarget()\r\n if (target !== match.attributes.target) {\r\n linkNode.setTarget(match.attributes.target || null)\r\n onChange(match.attributes.target || null, target)\r\n }\r\n }\r\n}\r\n\r\n// Bad neighbours are edits in neighbor nodes that make AutoLinks incompatible.\r\n// Given the creation preconditions, these can only be simple text nodes.\r\nfunction handleBadNeighbors(textNode: TextNode, onChange: ChangeHandler): void {\r\n const previousSibling = textNode.getPreviousSibling()\r\n const nextSibling = textNode.getNextSibling()\r\n const text = textNode.getTextContent()\r\n\r\n if ($isAutoLinkNode(previousSibling) && !startsWithSeparator(text)) {\r\n replaceWithChildren(previousSibling)\r\n onChange(null, previousSibling.getURL())\r\n }\r\n\r\n if ($isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {\r\n replaceWithChildren(nextSibling)\r\n onChange(null, nextSibling.getURL())\r\n }\r\n}\r\n\r\nfunction replaceWithChildren(node: ElementNode): Array<LexicalNode> {\r\n const children = node.getChildren()\r\n const childrenLength = children.length\r\n\r\n for (let j = childrenLength - 1; j >= 0; j--)\r\n node.insertAfter(children[j])\r\n\r\n node.remove()\r\n return children.map(child => child.getLatest())\r\n}\r\n\r\nexport function useAutoLink(\r\n editor: LexicalEditor,\r\n matchers: MaybeRef<Array<LinkMatcher>>,\r\n onChange?: ChangeHandler,\r\n) {\r\n watchEffect((onInvalidate) => {\r\n if (!editor.hasNodes([AutoLinkNode]))\r\n invariant(false, 'LexicalAutoLinkPlugin: AutoLinkNode not registered on editor')\r\n\r\n const onChangeWrapped = (url: string | null, prevUrl: string | null) => {\r\n if (onChange)\r\n onChange(url, prevUrl)\r\n }\r\n\r\n const fn = mergeRegister(\r\n editor.registerNodeTransform(TextNode, (textNode: TextNode) => {\r\n const parent = textNode.getParentOrThrow()\r\n if ($isAutoLinkNode(parent)) {\r\n handleLinkEdit(parent, unref(matchers), onChangeWrapped)\r\n }\r\n else if (!$isLinkNode(parent)) {\r\n if (textNode.isSimpleText())\r\n handleLinkCreation(textNode, unref(matchers), onChangeWrapped)\r\n\r\n handleBadNeighbors(textNode, onChangeWrapped)\r\n }\r\n }),\r\n\r\n editor.registerNodeTransform(AutoLinkNode, (linkNode: AutoLinkNode) => {\r\n handleLinkEdit(linkNode, unref(matchers), onChangeWrapped)\r\n }),\r\n )\r\n\r\n onInvalidate(fn)\r\n })\r\n}\r\n"],"names":["$isElementNode","$isLineBreakNode","$isTextNode","$createAutoLinkNode","$createTextNode","$isAutoLinkNode","watchEffect","AutoLinkNode","mergeRegister","TextNode","unref","$isLinkNode"],"mappings":"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"}
@@ -1,5 +0,0 @@
1
- import _sfc_main from "./index.vue2.js";
2
- export {
3
- _sfc_main as default
4
- };
5
- //# sourceMappingURL=index.vue.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
@@ -1,38 +0,0 @@
1
- import { defineComponent } from "vue";
2
- import "@lexical/text";
3
- import "@lexical/utils";
4
- import "@lexical/overflow";
5
- import "lexical";
6
- import "tiny-invariant";
7
- import "@lexical/history";
8
- import { useLexicalComposer } from "../../composables/useLexicalComposer.js";
9
- import "@lexical/list";
10
- import "@lexical/dragon";
11
- import "@lexical/plain-text";
12
- import "@lexical/rich-text";
13
- import { useAutoLink } from "./shared.js";
14
- const _sfc_main = /* @__PURE__ */ defineComponent({
15
- __name: "index",
16
- props: {
17
- matchers: {}
18
- },
19
- emits: ["change"],
20
- setup(__props, { emit: __emit }) {
21
- const props = __props;
22
- const emit = __emit;
23
- const editor = useLexicalComposer();
24
- useAutoLink(editor, props.matchers, (url, prevUrl) => {
25
- emit("change", {
26
- url,
27
- prevUrl
28
- });
29
- });
30
- return (_ctx, _cache) => {
31
- return null;
32
- };
33
- }
34
- });
35
- export {
36
- _sfc_main as default
37
- };
38
- //# sourceMappingURL=index.vue2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.vue2.js","sources":["../../../../../../../../src/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { useLexicalComposer } from '../../composables'\r\nimport { type LinkMatcher, useAutoLink } from './shared'\r\n\r\nconst props = defineProps<{\r\n matchers: LinkMatcher[]\r\n}>()\r\n\r\nconst emit = defineEmits<{\r\n (e: 'change', value: { url: string | null, prevUrl: string | null }): void\r\n}>()\r\n\r\nconst editor = useLexicalComposer()\r\n\r\nuseAutoLink(editor, props.matchers, (url: string | null, prevUrl: string | null) => {\r\n emit('change', {\r\n url,\r\n prevUrl,\r\n })\r\n})\r\n</script>\r\n\r\n<template />\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAIA,UAAM,QAAQ;AAId,UAAM,OAAO;AAIb,UAAM,SAAS;AAEf,gBAAY,QAAQ,MAAM,UAAU,CAAC,KAAoB,YAA2B;AAClF,WAAK,UAAU;AAAA,QACb;AAAA,QACA;AAAA,MAAA,CACD;AAAA,IAAA,CACF;;;;;;"}
@@ -1,176 +0,0 @@
1
- import { watchEffect, unref } from "vue";
2
- import invariant from "tiny-invariant";
3
- import { AutoLinkNode, $isAutoLinkNode, $isLinkNode, $createAutoLinkNode } from "@lexical/link";
4
- import { mergeRegister } from "@lexical/utils";
5
- import { TextNode, $createTextNode, $isTextNode, $isElementNode, $isLineBreakNode } from "lexical";
6
- function findFirstMatch(text, matchers) {
7
- for (let i = 0; i < matchers.length; i++) {
8
- const match = matchers[i](text);
9
- if (match)
10
- return match;
11
- }
12
- return null;
13
- }
14
- const PUNCTUATION_OR_SPACE = /[.,;\s]/;
15
- function isSeparator(char) {
16
- return PUNCTUATION_OR_SPACE.test(char);
17
- }
18
- function endsWithSeparator(textContent) {
19
- return isSeparator(textContent[textContent.length - 1]);
20
- }
21
- function startsWithSeparator(textContent) {
22
- return isSeparator(textContent[0]);
23
- }
24
- function isPreviousNodeValid(node) {
25
- let previousNode = node.getPreviousSibling();
26
- if ($isElementNode(previousNode))
27
- previousNode = previousNode.getLastDescendant();
28
- return previousNode === null || $isLineBreakNode(previousNode) || $isTextNode(previousNode) && endsWithSeparator(previousNode.getTextContent());
29
- }
30
- function isNextNodeValid(node) {
31
- let nextNode = node.getNextSibling();
32
- if ($isElementNode(nextNode))
33
- nextNode = nextNode.getFirstDescendant();
34
- return nextNode === null || $isLineBreakNode(nextNode) || $isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent());
35
- }
36
- function isContentAroundIsValid(matchStart, matchEnd, text, node) {
37
- const contentBeforeIsValid = matchStart > 0 ? isSeparator(text[matchStart - 1]) : isPreviousNodeValid(node);
38
- if (!contentBeforeIsValid)
39
- return false;
40
- const contentAfterIsValid = matchEnd < text.length ? isSeparator(text[matchEnd]) : isNextNodeValid(node);
41
- return contentAfterIsValid;
42
- }
43
- function handleLinkCreation(node, matchers, onChange) {
44
- const nodeText = node.getTextContent();
45
- let text = nodeText;
46
- let invalidMatchEnd = 0;
47
- let remainingTextNode = node;
48
- let match;
49
- while ((match = findFirstMatch(text, matchers)) && match !== null) {
50
- const matchStart = match.index;
51
- const matchLength = match.length;
52
- const matchEnd = matchStart + matchLength;
53
- const isValid = isContentAroundIsValid(
54
- invalidMatchEnd + matchStart,
55
- invalidMatchEnd + matchEnd,
56
- nodeText,
57
- node
58
- );
59
- if (isValid) {
60
- let linkTextNode;
61
- if (invalidMatchEnd + matchStart === 0) {
62
- [linkTextNode, remainingTextNode] = remainingTextNode.splitText(
63
- invalidMatchEnd + matchLength
64
- );
65
- } else {
66
- [, linkTextNode, remainingTextNode] = remainingTextNode.splitText(
67
- invalidMatchEnd + matchStart,
68
- invalidMatchEnd + matchStart + matchLength
69
- );
70
- }
71
- const linkNode = $createAutoLinkNode(match.url, match.attributes);
72
- const textNode = $createTextNode(match.text);
73
- textNode.setFormat(linkTextNode.getFormat());
74
- textNode.setDetail(linkTextNode.getDetail());
75
- linkNode.append(textNode);
76
- linkTextNode.replace(linkNode);
77
- onChange(match.url, null);
78
- invalidMatchEnd = 0;
79
- } else {
80
- invalidMatchEnd += matchEnd;
81
- }
82
- text = text.substring(matchEnd);
83
- }
84
- }
85
- function handleLinkEdit(linkNode, matchers, onChange) {
86
- const children = linkNode.getChildren();
87
- const childrenLength = children.length;
88
- for (let i = 0; i < childrenLength; i++) {
89
- const child = children[i];
90
- if (!$isTextNode(child) || !child.isSimpleText()) {
91
- replaceWithChildren(linkNode);
92
- onChange(null, linkNode.getURL());
93
- return;
94
- }
95
- }
96
- const text = linkNode.getTextContent();
97
- const match = findFirstMatch(text, matchers);
98
- if (match === null || match.text !== text) {
99
- replaceWithChildren(linkNode);
100
- onChange(null, linkNode.getURL());
101
- return;
102
- }
103
- if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {
104
- replaceWithChildren(linkNode);
105
- onChange(null, linkNode.getURL());
106
- return;
107
- }
108
- const url = linkNode.getURL();
109
- if (url !== match.url) {
110
- linkNode.setURL(match.url);
111
- onChange(match.url, url);
112
- }
113
- if (match.attributes) {
114
- const rel = linkNode.getRel();
115
- if (rel !== match.attributes.rel) {
116
- linkNode.setRel(match.attributes.rel || null);
117
- onChange(match.attributes.rel || null, rel);
118
- }
119
- const target = linkNode.getTarget();
120
- if (target !== match.attributes.target) {
121
- linkNode.setTarget(match.attributes.target || null);
122
- onChange(match.attributes.target || null, target);
123
- }
124
- }
125
- }
126
- function handleBadNeighbors(textNode, onChange) {
127
- const previousSibling = textNode.getPreviousSibling();
128
- const nextSibling = textNode.getNextSibling();
129
- const text = textNode.getTextContent();
130
- if ($isAutoLinkNode(previousSibling) && !startsWithSeparator(text)) {
131
- replaceWithChildren(previousSibling);
132
- onChange(null, previousSibling.getURL());
133
- }
134
- if ($isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {
135
- replaceWithChildren(nextSibling);
136
- onChange(null, nextSibling.getURL());
137
- }
138
- }
139
- function replaceWithChildren(node) {
140
- const children = node.getChildren();
141
- const childrenLength = children.length;
142
- for (let j = childrenLength - 1; j >= 0; j--)
143
- node.insertAfter(children[j]);
144
- node.remove();
145
- return children.map((child) => child.getLatest());
146
- }
147
- function useAutoLink(editor, matchers, onChange) {
148
- watchEffect((onInvalidate) => {
149
- if (!editor.hasNodes([AutoLinkNode]))
150
- invariant(false, "LexicalAutoLinkPlugin: AutoLinkNode not registered on editor");
151
- const onChangeWrapped = (url, prevUrl) => {
152
- if (onChange)
153
- onChange(url, prevUrl);
154
- };
155
- const fn = mergeRegister(
156
- editor.registerNodeTransform(TextNode, (textNode) => {
157
- const parent = textNode.getParentOrThrow();
158
- if ($isAutoLinkNode(parent)) {
159
- handleLinkEdit(parent, unref(matchers), onChangeWrapped);
160
- } else if (!$isLinkNode(parent)) {
161
- if (textNode.isSimpleText())
162
- handleLinkCreation(textNode, unref(matchers), onChangeWrapped);
163
- handleBadNeighbors(textNode, onChangeWrapped);
164
- }
165
- }),
166
- editor.registerNodeTransform(AutoLinkNode, (linkNode) => {
167
- handleLinkEdit(linkNode, unref(matchers), onChangeWrapped);
168
- })
169
- );
170
- onInvalidate(fn);
171
- });
172
- }
173
- export {
174
- useAutoLink
175
- };
176
- //# sourceMappingURL=shared.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"shared.js","sources":["../../../../../../../../src/components/basic/doc-editor/core/plugins/LexicalAutoLinkPlugin/shared.ts"],"sourcesContent":["import type { LinkAttributes } from '@lexical/link'\r\nimport type { ElementNode, LexicalEditor, LexicalNode } from 'lexical'\r\nimport { unref, watchEffect } from 'vue'\r\nimport invariant from 'tiny-invariant'\r\n\r\nimport {\r\n $createAutoLinkNode,\r\n $isAutoLinkNode,\r\n $isLinkNode,\r\n AutoLinkNode,\r\n} from '@lexical/link'\r\nimport { mergeRegister } from '@lexical/utils'\r\nimport {\r\n $createTextNode,\r\n $isElementNode,\r\n $isLineBreakNode,\r\n $isTextNode,\r\n TextNode,\r\n} from 'lexical'\r\nimport type { MaybeRef } from 'vue'\r\n\r\ntype ChangeHandler = (url: string | null, prevUrl: string | null) => void\r\n\r\ninterface LinkMatcherResult {\r\n attributes?: LinkAttributes\r\n index: number\r\n length: number\r\n text: string\r\n url: string\r\n}\r\n\r\nexport type LinkMatcher = (text: string) => LinkMatcherResult | null\r\n\r\nfunction findFirstMatch(\r\n text: string,\r\n matchers: Array<LinkMatcher>,\r\n): LinkMatcherResult | null {\r\n for (let i = 0; i < matchers.length; i++) {\r\n const match = matchers[i](text)\r\n\r\n if (match)\r\n return match\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst PUNCTUATION_OR_SPACE = /[.,;\\s]/\r\n\r\nfunction isSeparator(char: string): boolean {\r\n return PUNCTUATION_OR_SPACE.test(char)\r\n}\r\n\r\nfunction endsWithSeparator(textContent: string): boolean {\r\n return isSeparator(textContent[textContent.length - 1])\r\n}\r\n\r\nfunction startsWithSeparator(textContent: string): boolean {\r\n return isSeparator(textContent[0])\r\n}\r\n\r\nfunction isPreviousNodeValid(node: LexicalNode): boolean {\r\n let previousNode = node.getPreviousSibling()\r\n if ($isElementNode(previousNode))\r\n previousNode = previousNode.getLastDescendant()\r\n\r\n return (\r\n previousNode === null\r\n || $isLineBreakNode(previousNode)\r\n || ($isTextNode(previousNode)\r\n && endsWithSeparator(previousNode.getTextContent()))\r\n )\r\n}\r\n\r\nfunction isNextNodeValid(node: LexicalNode): boolean {\r\n let nextNode = node.getNextSibling()\r\n if ($isElementNode(nextNode))\r\n nextNode = nextNode.getFirstDescendant()\r\n\r\n return (\r\n nextNode === null\r\n || $isLineBreakNode(nextNode)\r\n || ($isTextNode(nextNode) && startsWithSeparator(nextNode.getTextContent()))\r\n )\r\n}\r\n\r\nfunction isContentAroundIsValid(\r\n matchStart: number,\r\n matchEnd: number,\r\n text: string,\r\n node: TextNode,\r\n): boolean {\r\n const contentBeforeIsValid\r\n = matchStart > 0\r\n ? isSeparator(text[matchStart - 1])\r\n : isPreviousNodeValid(node)\r\n if (!contentBeforeIsValid)\r\n return false\r\n\r\n const contentAfterIsValid\r\n = matchEnd < text.length\r\n ? isSeparator(text[matchEnd])\r\n : isNextNodeValid(node)\r\n return contentAfterIsValid\r\n}\r\n\r\nfunction handleLinkCreation(\r\n node: TextNode,\r\n matchers: Array<LinkMatcher>,\r\n onChange: ChangeHandler,\r\n): void {\r\n const nodeText = node.getTextContent()\r\n let text = nodeText\r\n let invalidMatchEnd = 0\r\n let remainingTextNode = node\r\n let match\r\n\r\n // eslint-disable-next-line no-cond-assign\r\n while ((match = findFirstMatch(text, matchers)) && match !== null) {\r\n const matchStart = match.index\r\n const matchLength = match.length\r\n const matchEnd = matchStart + matchLength\r\n const isValid = isContentAroundIsValid(\r\n invalidMatchEnd + matchStart,\r\n invalidMatchEnd + matchEnd,\r\n nodeText,\r\n node,\r\n )\r\n\r\n if (isValid) {\r\n let linkTextNode\r\n if (invalidMatchEnd + matchStart === 0) {\r\n [linkTextNode, remainingTextNode] = remainingTextNode.splitText(\r\n invalidMatchEnd + matchLength,\r\n )\r\n }\r\n else {\r\n [, linkTextNode, remainingTextNode] = remainingTextNode.splitText(\r\n invalidMatchEnd + matchStart,\r\n invalidMatchEnd + matchStart + matchLength,\r\n )\r\n }\r\n const linkNode = $createAutoLinkNode(match.url, match.attributes)\r\n const textNode = $createTextNode(match.text)\r\n textNode.setFormat(linkTextNode.getFormat())\r\n textNode.setDetail(linkTextNode.getDetail())\r\n linkNode.append(textNode)\r\n linkTextNode.replace(linkNode)\r\n onChange(match.url, null)\r\n invalidMatchEnd = 0\r\n }\r\n else {\r\n invalidMatchEnd += matchEnd\r\n }\r\n\r\n text = text.substring(matchEnd)\r\n }\r\n}\r\n\r\nfunction handleLinkEdit(\r\n linkNode: AutoLinkNode,\r\n matchers: Array<LinkMatcher>,\r\n onChange: ChangeHandler,\r\n): void {\r\n // Check children are simple text\r\n const children = linkNode.getChildren()\r\n const childrenLength = children.length\r\n for (let i = 0; i < childrenLength; i++) {\r\n const child = children[i]\r\n if (!$isTextNode(child) || !child.isSimpleText()) {\r\n replaceWithChildren(linkNode)\r\n onChange(null, linkNode.getURL())\r\n return\r\n }\r\n }\r\n\r\n // Check text content fully matches\r\n const text = linkNode.getTextContent()\r\n const match = findFirstMatch(text, matchers)\r\n if (match === null || match.text !== text) {\r\n replaceWithChildren(linkNode)\r\n onChange(null, linkNode.getURL())\r\n return\r\n }\r\n\r\n // Check neighbors\r\n if (!isPreviousNodeValid(linkNode) || !isNextNodeValid(linkNode)) {\r\n replaceWithChildren(linkNode)\r\n onChange(null, linkNode.getURL())\r\n return\r\n }\r\n\r\n const url = linkNode.getURL()\r\n if (url !== match.url) {\r\n linkNode.setURL(match.url)\r\n onChange(match.url, url)\r\n }\r\n\r\n if (match.attributes) {\r\n const rel = linkNode.getRel()\r\n if (rel !== match.attributes.rel) {\r\n linkNode.setRel(match.attributes.rel || null)\r\n onChange(match.attributes.rel || null, rel)\r\n }\r\n\r\n const target = linkNode.getTarget()\r\n if (target !== match.attributes.target) {\r\n linkNode.setTarget(match.attributes.target || null)\r\n onChange(match.attributes.target || null, target)\r\n }\r\n }\r\n}\r\n\r\n// Bad neighbours are edits in neighbor nodes that make AutoLinks incompatible.\r\n// Given the creation preconditions, these can only be simple text nodes.\r\nfunction handleBadNeighbors(textNode: TextNode, onChange: ChangeHandler): void {\r\n const previousSibling = textNode.getPreviousSibling()\r\n const nextSibling = textNode.getNextSibling()\r\n const text = textNode.getTextContent()\r\n\r\n if ($isAutoLinkNode(previousSibling) && !startsWithSeparator(text)) {\r\n replaceWithChildren(previousSibling)\r\n onChange(null, previousSibling.getURL())\r\n }\r\n\r\n if ($isAutoLinkNode(nextSibling) && !endsWithSeparator(text)) {\r\n replaceWithChildren(nextSibling)\r\n onChange(null, nextSibling.getURL())\r\n }\r\n}\r\n\r\nfunction replaceWithChildren(node: ElementNode): Array<LexicalNode> {\r\n const children = node.getChildren()\r\n const childrenLength = children.length\r\n\r\n for (let j = childrenLength - 1; j >= 0; j--)\r\n node.insertAfter(children[j])\r\n\r\n node.remove()\r\n return children.map(child => child.getLatest())\r\n}\r\n\r\nexport function useAutoLink(\r\n editor: LexicalEditor,\r\n matchers: MaybeRef<Array<LinkMatcher>>,\r\n onChange?: ChangeHandler,\r\n) {\r\n watchEffect((onInvalidate) => {\r\n if (!editor.hasNodes([AutoLinkNode]))\r\n invariant(false, 'LexicalAutoLinkPlugin: AutoLinkNode not registered on editor')\r\n\r\n const onChangeWrapped = (url: string | null, prevUrl: string | null) => {\r\n if (onChange)\r\n onChange(url, prevUrl)\r\n }\r\n\r\n const fn = mergeRegister(\r\n editor.registerNodeTransform(TextNode, (textNode: TextNode) => {\r\n const parent = textNode.getParentOrThrow()\r\n if ($isAutoLinkNode(parent)) {\r\n handleLinkEdit(parent, unref(matchers), onChangeWrapped)\r\n }\r\n else if (!$isLinkNode(parent)) {\r\n if (textNode.isSimpleText())\r\n handleLinkCreation(textNode, unref(matchers), onChangeWrapped)\r\n\r\n handleBadNeighbors(textNode, onChangeWrapped)\r\n }\r\n }),\r\n\r\n editor.registerNodeTransform(AutoLinkNode, (linkNode: AutoLinkNode) => {\r\n handleLinkEdit(linkNode, unref(matchers), onChangeWrapped)\r\n }),\r\n )\r\n\r\n onInvalidate(fn)\r\n })\r\n}\r\n"],"names":[],"mappings":";;;;;AAiCA,SAAS,eACP,MACA,UAC0B;AAC1B,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;AACxC,UAAM,QAAQ,SAAS,CAAC,EAAE,IAAI;AAE1B,QAAA;AACK,aAAA;AAAA,EACX;AAEO,SAAA;AACT;AAEA,MAAM,uBAAuB;AAE7B,SAAS,YAAY,MAAuB;AACnC,SAAA,qBAAqB,KAAK,IAAI;AACvC;AAEA,SAAS,kBAAkB,aAA8B;AACvD,SAAO,YAAY,YAAY,YAAY,SAAS,CAAC,CAAC;AACxD;AAEA,SAAS,oBAAoB,aAA8B;AAClD,SAAA,YAAY,YAAY,CAAC,CAAC;AACnC;AAEA,SAAS,oBAAoB,MAA4B;AACnD,MAAA,eAAe,KAAK;AACxB,MAAI,eAAe,YAAY;AAC7B,mBAAe,aAAa;AAG5B,SAAA,iBAAiB,QACd,iBAAiB,YAAY,KAC5B,YAAY,YAAY,KACzB,kBAAkB,aAAa,eAAgB,CAAA;AAEtD;AAEA,SAAS,gBAAgB,MAA4B;AAC/C,MAAA,WAAW,KAAK;AACpB,MAAI,eAAe,QAAQ;AACzB,eAAW,SAAS;AAGpB,SAAA,aAAa,QACV,iBAAiB,QAAQ,KACxB,YAAY,QAAQ,KAAK,oBAAoB,SAAS,eAAgB,CAAA;AAE9E;AAEA,SAAS,uBACP,YACA,UACA,MACA,MACS;AACH,QAAA,uBACF,aAAa,IACX,YAAY,KAAK,aAAa,CAAC,CAAC,IAChC,oBAAoB,IAAI;AAC9B,MAAI,CAAC;AACI,WAAA;AAEH,QAAA,sBACF,WAAW,KAAK,SACd,YAAY,KAAK,QAAQ,CAAC,IAC1B,gBAAgB,IAAI;AACnB,SAAA;AACT;AAEA,SAAS,mBACP,MACA,UACA,UACM;AACA,QAAA,WAAW,KAAK;AACtB,MAAI,OAAO;AACX,MAAI,kBAAkB;AACtB,MAAI,oBAAoB;AACpB,MAAA;AAGJ,UAAQ,QAAQ,eAAe,MAAM,QAAQ,MAAM,UAAU,MAAM;AACjE,UAAM,aAAa,MAAM;AACzB,UAAM,cAAc,MAAM;AAC1B,UAAM,WAAW,aAAa;AAC9B,UAAM,UAAU;AAAA,MACd,kBAAkB;AAAA,MAClB,kBAAkB;AAAA,MAClB;AAAA,MACA;AAAA,IAAA;AAGF,QAAI,SAAS;AACP,UAAA;AACA,UAAA,kBAAkB,eAAe,GAAG;AACrC,SAAA,cAAc,iBAAiB,IAAI,kBAAkB;AAAA,UACpD,kBAAkB;AAAA,QAAA;AAAA,MACpB,OAEG;AACH,SAAA,EAAG,cAAc,iBAAiB,IAAI,kBAAkB;AAAA,UACtD,kBAAkB;AAAA,UAClB,kBAAkB,aAAa;AAAA,QAAA;AAAA,MAEnC;AACA,YAAM,WAAW,oBAAoB,MAAM,KAAK,MAAM,UAAU;AAC1D,YAAA,WAAW,gBAAgB,MAAM,IAAI;AAClC,eAAA,UAAU,aAAa,UAAW,CAAA;AAClC,eAAA,UAAU,aAAa,UAAW,CAAA;AAC3C,eAAS,OAAO,QAAQ;AACxB,mBAAa,QAAQ,QAAQ;AACpB,eAAA,MAAM,KAAK,IAAI;AACN,wBAAA;AAAA,IAAA,OAEf;AACgB,yBAAA;AAAA,IACrB;AAEO,WAAA,KAAK,UAAU,QAAQ;AAAA,EAChC;AACF;AAEA,SAAS,eACP,UACA,UACA,UACM;AAEA,QAAA,WAAW,SAAS;AAC1B,QAAM,iBAAiB,SAAS;AAChC,WAAS,IAAI,GAAG,IAAI,gBAAgB,KAAK;AACjC,UAAA,QAAQ,SAAS,CAAC;AACxB,QAAI,CAAC,YAAY,KAAK,KAAK,CAAC,MAAM,gBAAgB;AAChD,0BAAoB,QAAQ;AACnB,eAAA,MAAM,SAAS,OAAQ,CAAA;AAChC;AAAA,IACF;AAAA,EACF;AAGM,QAAA,OAAO,SAAS;AAChB,QAAA,QAAQ,eAAe,MAAM,QAAQ;AAC3C,MAAI,UAAU,QAAQ,MAAM,SAAS,MAAM;AACzC,wBAAoB,QAAQ;AACnB,aAAA,MAAM,SAAS,OAAQ,CAAA;AAChC;AAAA,EACF;AAGA,MAAI,CAAC,oBAAoB,QAAQ,KAAK,CAAC,gBAAgB,QAAQ,GAAG;AAChE,wBAAoB,QAAQ;AACnB,aAAA,MAAM,SAAS,OAAQ,CAAA;AAChC;AAAA,EACF;AAEM,QAAA,MAAM,SAAS;AACjB,MAAA,QAAQ,MAAM,KAAK;AACZ,aAAA,OAAO,MAAM,GAAG;AAChB,aAAA,MAAM,KAAK,GAAG;AAAA,EACzB;AAEA,MAAI,MAAM,YAAY;AACd,UAAA,MAAM,SAAS;AACjB,QAAA,QAAQ,MAAM,WAAW,KAAK;AAChC,eAAS,OAAO,MAAM,WAAW,OAAO,IAAI;AAC5C,eAAS,MAAM,WAAW,OAAO,MAAM,GAAG;AAAA,IAC5C;AAEM,UAAA,SAAS,SAAS;AACpB,QAAA,WAAW,MAAM,WAAW,QAAQ;AACtC,eAAS,UAAU,MAAM,WAAW,UAAU,IAAI;AAClD,eAAS,MAAM,WAAW,UAAU,MAAM,MAAM;AAAA,IAClD;AAAA,EACF;AACF;AAIA,SAAS,mBAAmB,UAAoB,UAA+B;AACvE,QAAA,kBAAkB,SAAS;AAC3B,QAAA,cAAc,SAAS;AACvB,QAAA,OAAO,SAAS;AAEtB,MAAI,gBAAgB,eAAe,KAAK,CAAC,oBAAoB,IAAI,GAAG;AAClE,wBAAoB,eAAe;AAC1B,aAAA,MAAM,gBAAgB,OAAQ,CAAA;AAAA,EACzC;AAEA,MAAI,gBAAgB,WAAW,KAAK,CAAC,kBAAkB,IAAI,GAAG;AAC5D,wBAAoB,WAAW;AACtB,aAAA,MAAM,YAAY,OAAQ,CAAA;AAAA,EACrC;AACF;AAEA,SAAS,oBAAoB,MAAuC;AAC5D,QAAA,WAAW,KAAK;AACtB,QAAM,iBAAiB,SAAS;AAEhC,WAAS,IAAI,iBAAiB,GAAG,KAAK,GAAG;AAClC,SAAA,YAAY,SAAS,CAAC,CAAC;AAE9B,OAAK,OAAO;AACZ,SAAO,SAAS,IAAI,CAAS,UAAA,MAAM,WAAW;AAChD;AAEgB,SAAA,YACd,QACA,UACA,UACA;AACA,cAAY,CAAC,iBAAiB;AAC5B,QAAI,CAAC,OAAO,SAAS,CAAC,YAAY,CAAC;AACjC,gBAAU,OAAO,8DAA8D;AAE3E,UAAA,kBAAkB,CAAC,KAAoB,YAA2B;AAClE,UAAA;AACF,iBAAS,KAAK,OAAO;AAAA,IAAA;AAGzB,UAAM,KAAK;AAAA,MACT,OAAO,sBAAsB,UAAU,CAAC,aAAuB;AACvD,cAAA,SAAS,SAAS;AACpB,YAAA,gBAAgB,MAAM,GAAG;AAC3B,yBAAe,QAAQ,MAAM,QAAQ,GAAG,eAAe;AAAA,QAAA,WAEhD,CAAC,YAAY,MAAM,GAAG;AAC7B,cAAI,SAAS,aAAa;AACxB,+BAAmB,UAAU,MAAM,QAAQ,GAAG,eAAe;AAE/D,6BAAmB,UAAU,eAAe;AAAA,QAC9C;AAAA,MAAA,CACD;AAAA,MAED,OAAO,sBAAsB,cAAc,CAAC,aAA2B;AACrE,uBAAe,UAAU,MAAM,QAAQ,GAAG,eAAe;AAAA,MAAA,CAC1D;AAAA,IAAA;AAGH,iBAAa,EAAE;AAAA,EAAA,CAChB;AACH;"}