@chenyomi/leafer-htmltext-editor 1.0.8 → 1.0.10

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 (56) hide show
  1. package/dist/index.cjs +4 -0
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.d.mts +64 -0
  4. package/dist/index.d.ts +51 -5
  5. package/dist/index.mjs +4 -0
  6. package/dist/index.mjs.map +1 -0
  7. package/package.json +16 -8
  8. package/dist/TextEditTool/index.d.ts +0 -17
  9. package/dist/TextEditTool/index.d.ts.map +0 -1
  10. package/dist/TextEditTool/index.js +0 -113
  11. package/dist/TextEditTool/utils.d.ts +0 -8
  12. package/dist/TextEditTool/utils.d.ts.map +0 -1
  13. package/dist/TextEditTool/utils.js +0 -256
  14. package/dist/TextEditor.d.ts +0 -30
  15. package/dist/TextEditor.d.ts.map +0 -1
  16. package/dist/TextEditor.js +0 -169
  17. package/dist/esm/TextEditTool/index.d.ts +0 -17
  18. package/dist/esm/TextEditTool/index.d.ts.map +0 -1
  19. package/dist/esm/TextEditTool/index.js +0 -110
  20. package/dist/esm/TextEditTool/utils.d.ts +0 -8
  21. package/dist/esm/TextEditTool/utils.d.ts.map +0 -1
  22. package/dist/esm/TextEditTool/utils.js +0 -248
  23. package/dist/esm/TextEditor.d.ts +0 -30
  24. package/dist/esm/TextEditor.d.ts.map +0 -1
  25. package/dist/esm/TextEditor.js +0 -166
  26. package/dist/esm/fonts/font.d.ts +0 -17
  27. package/dist/esm/fonts/font.d.ts.map +0 -1
  28. package/dist/esm/fonts/font.js +0 -68
  29. package/dist/esm/fonts/utils.d.ts +0 -9
  30. package/dist/esm/fonts/utils.d.ts.map +0 -1
  31. package/dist/esm/fonts/utils.js +0 -170
  32. package/dist/esm/index.d.ts +0 -18
  33. package/dist/esm/index.d.ts.map +0 -1
  34. package/dist/esm/utils.d.ts +0 -3
  35. package/dist/esm/utils.d.ts.map +0 -1
  36. package/dist/esm/utils.js +0 -266
  37. package/dist/fonts/font.d.ts +0 -17
  38. package/dist/fonts/font.d.ts.map +0 -1
  39. package/dist/fonts/font.js +0 -72
  40. package/dist/fonts/utils.d.ts +0 -9
  41. package/dist/fonts/utils.d.ts.map +0 -1
  42. package/dist/fonts/utils.js +0 -180
  43. package/dist/index.d.ts.map +0 -1
  44. package/dist/index.esm.js +0 -140
  45. package/dist/index.js +0 -178
  46. package/dist/utils.d.ts +0 -3
  47. package/dist/utils.d.ts.map +0 -1
  48. package/dist/utils.js +0 -271
  49. package/src/TextEditTool/index.ts +0 -132
  50. package/src/TextEditTool/utils.ts +0 -288
  51. package/src/TextEditor.ts +0 -213
  52. package/src/fonts/font.ts +0 -86
  53. package/src/fonts/utils.ts +0 -232
  54. package/src/htmltext-editor.css +0 -103
  55. package/src/index.ts +0 -163
  56. package/src/utils.ts +0 -294
package/dist/index.cjs ADDED
@@ -0,0 +1,4 @@
1
+ 'use strict';var editor=require('@leafer-in/editor'),leaferUi=require('leafer-ui'),core=require('@leafer-ui/core'),x=require('quill');require('quill/dist/quill.core.css');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var x__default=/*#__PURE__*/_interopDefault(x);var w=(e,s,t,n)=>{for(var a=s,o=e.length-1,i;o>=0;o--)(i=e[o])&&(a=(i(a))||a);return a};var v=async(e,s,t)=>{let{scaleX:n,scaleY:a}=e.worldTransform,o=Math.max(Math.abs(n),Math.abs(a)),i=document.querySelector("#textInnerEditor");if(i&&e.data.textData?.fontFamily&&(i.style.fontFamily=e.data.textData.fontFamily),i&&e.data.textData?.fontSize&&(i.style.fontSize=`${e.data.textData.fontSize*o}px`),i&&e.data.textData?.lineHeight&&(i.style.lineHeight=e.data.textData.lineHeight),i&&e.data.textData?.letterSpacing&&(i.style.letterSpacing=`${e.data.textData.letterSpacing}px`),i&&e.data.textData?.textShadow?i.style.textShadow=e.data.textData.textShadow:i.style.textShadow="none",i&&e.data.textData?.alignContent){let r=i.querySelector(".ql-editor");r.style.alignContent=e.data.textData.alignContent;}let l=p.getQuill().getSemanticHTML();if(l==="<p></p>"){e.text.includes("<style>@font-face")?e.text=e.text.split("</style>")[0]+"</style>":e.text="";return}if(e.text.includes("<style>@font-face")){let r=e.text.split("</style>")[0];e.text=r+"</style>"+T(e,l,e.data.textData.fontSize,e.data.textData.lineHeight,e.data.textData.letterSpacing,e.data.textData.textShadow,e.data.textData?.alignContent);}else e.text=T(e,l,e.data.textData.fontSize,e.data.textData.lineHeight,e.data.textData.letterSpacing,e.data.textData.textShadow,e.data.textData?.alignContent);},T=(e,s,t=16,n="1.5",a="0",o="none",i="start")=>{let{scaleX:d,scaleY:l}=e.worldTransform,r=Math.max(Math.abs(d),Math.abs(l)),f=document.createElement("div");f.innerHTML=s;let u={fontSize:`${t}px`,lineHeight:n,letterSpacing:`${a}px`,textShadow:o};f.querySelectorAll("p,ol,ul").forEach(L=>{Object.assign(L.style,u);});let c=f.innerHTML;/<p\b[^>]*><\/p>/.test(c)&&(c=c.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>"));let g;document.querySelector("#textInnerEditor");let b=p.getQuill(),h=Number((b.scroll.domNode.scrollHeight/r).toFixed(0));Number((b.scroll.domNode.scrollWidth/r).toFixed(0));["center","end"].includes(e.data.textData.alignContent)?e.parent.height<h?g=(h||e.__layout.boxBounds.height)+"px":g=`${e.parent.height}px`:e.parent.height<h?g=(h||e.__layout.boxBounds.height)+"px":g=`${e.parent.height}px`;let q="<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>",m="";return e.parent.children[0].tag.includes("Shape")?m=q+`<div style="width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;">${c}</div>`:e.data.canChangeBox?m=q+`<div style="width: ${e.parent.width}px;height:${g};overflow-wrap:break-word;word-break:break-all;align-content:${i};">${c}</div>`:e.data.textData.italic?m=q+c:(console.log(h),m=q+`<div style="overflow-wrap:break-word;word-break:break-all;">${c}</div>`),console.log(m,"\u6700\u7EC8\u7684html\u5185\u5BB9"),m};exports.TextEditTool=class y extends editor.EditTool{constructor(t){super(t);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(n=>{v(n);},300);}get tag(){return "TextEditTool"}debounce(t,n){let a=null;return((...o)=>{a!==null&&window.clearTimeout(a),a=window.setTimeout(()=>t.apply(this,o),n);})}addEvent(){let{editor:t}=p.getCanvas(),n=t._target.findOne("HTMLText"),{scaleX:a,scaleY:o}=n.worldTransform,i=Math.max(Math.abs(a),Math.abs(o)),d=document.querySelector("#textInnerEditor"),{style:l}=d;this.eventIds=[t.on_(editor.EditorScaleEvent.SCALE,r=>{n.data.canChangeBox||(n.data.canChangeBox=true),n.data.canChangeBox&&(l.width=n.parent.width*i+"px",l.height="auto");let f=1;n.parent.tag==="Box"&&n.parent.lockRatio&&n.data?.baseSize?.width&&(f=n.parent.width/n.data?.baseSize.width,n.data.textData.fontSize=n.data.textData.fontSize*f),n.data?.baseSize?.width&&(n.data.baseSize.width=n.parent.width),this.updateBoxDebounced(n);}),t.on_(leaferUi.PointerEvent.DOUBLE_TAP,()=>{n.parent.locked||t.openInnerEditor(n,true);})];}onLoad(){let{editor:t}=p.getCanvas();console.log(t._target,123);let n=t._target.findOne("HTMLText"),{scaleX:a,scaleY:o}=n.worldTransform,i=Math.max(Math.abs(a),Math.abs(o));this.addEvent(),this.quill=p.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(n.text);let d=document.querySelector("#textInnerEditor"),{style:l}=d;n.data.canChangeBox?(l.width=n.parent.width*i+"px",l.height=n.parent.height*i+"px"):(l.width="auto",l.height="auto");}updateChangeBoxBound(t){t&&t.set({width:t.__layout.boxBounds.width,height:t.__layout.boxBounds.height});}onUpdate(){let {editor:t}=p.getCanvas(),n=t._target.findOne("HTMLText");t._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=n.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:t}=p.getCanvas();t.off_(this.eventIds);}onDestroy(){}};exports.TextEditTool=w([editor.registerEditTool()],exports.TextEditTool);exports.TextEditor=class S extends editor.InnerEditor{constructor(){super(...arguments);this.config={selectAll:false};this.eventIds=[];this.selectText=void 0;this.inBody=void 0;this.isHTMLText=void 0;this._keyEvent=void 0;this.quill=null;this.isComposing=false;this.misspelledWords=[];this.overlay=null;this.onSelectionChange=async t=>{t&&localStorage.setItem("selection-change",JSON.stringify(t));};this.onInput=async()=>{let{editDom:t}=this;console.log("onInput"),v(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}get isOASystem(){return window.location.host.includes("oa")}onLoad(){let{editor:t}=this,{config:n}=t.app,a=this.editTarget,{scaleX:o,scaleY:i}=a.worldTransform,d=Math.max(Math.abs(o),Math.abs(i));this.isHTMLText=!(a instanceof Text),this._keyEvent=n.keyEvent,n.keyEvent=false;let l=this.editDom=document.querySelector("#textInnerEditor"),{style:r}=l;if(r.visibility="visible",a.data.canChangeBox?(r.width=a.parent.width*d+"px",r.height=a.parent.height*d+"px"):(r.width="auto",r.height="auto"),r.outline="solid #8499EF",a.data.textData.fontSize&&(console.log(a.data.textData.fontSize),l.style.fontSize=`${a.data.textData.fontSize}px`),a.data.textData.fontFamily&&(l.style.fontFamily=`${a.data.textData.fontFamily}`),a.data.textData.lineHeight&&(l.style.lineHeight=a.data.textData.lineHeight),a.data.textData.letterSpacing&&(l.style.letterSpacing=`${a.data.textData.letterSpacing}px`),a.data.textData.textShadow?l.style.textShadow=`${a.data.textData.textShadow}`:l.style.textShadow="none",a.data.textData.alignContent){let f=l.querySelector(".ql-editor");f.style.alignContent=`${a.data.textData.alignContent}`;}this.quill=p.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(a.text),a.parent.children[0].tag.includes("Shape")?(r.width=a.parent.width*d+"px",r.left="0px",this.quill.formatLine(0,this.quill.getLength(),"align","center")):this.quill.setSelection(0,this.quill.getLength()-1),this.quill.on("text-change",this.onInput),this.quill.on("selection-change",this.onSelectionChange),localStorage.removeItem("selection-change"),this.eventIds=[t.app.on_(core.PointerEvent.DOWN,f=>{let{target:u}=f.origin,c=false;for(;u;)u===l&&(c=true),u=u.parentElement;c||(t.closeInnerEditor(),t.cancel());})];}onUpdate(){let{editTarget:t}=this,{scaleX:n,scaleY:a}=t.worldTransform,o=Math.max(Math.abs(n),Math.abs(a)),{width:i,height:d}=t.parent.__local;i*=o,d*=o;let{x:l,y:r}=this.inBody?t.app.clientBounds:t.app.tree.clientBounds,{a:f,b:u,c,d:g,e:C,f:b}=new core.Matrix(t.worldTransform).scale(1/o).translateInner(0,0),{style:h}=this.editDom;h.transform=`matrix(${f},${u},${c},${g},${C},${b})`,h.left=l+"px",h.top=r+"px",t.set({visible:false});}onUnload(){let{editTarget:t,editor:n,editDom:a}=this;t&&(this.onInput(),n.app&&(n.app.config.keyEvent=this._keyEvent),n.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),t.parent&&t.parent.name=="Text"&&t.parent.children.some(o=>o.tag==="Box")?(t.parent.findOne("Box").opacity=1,t.visible=false):t.set({visible:true}),this.quill.getLength()===1&&t.parent.name==="Text"&&t.parent.remove(),console.log("onUnload"),this.quill.off("text-change",this.onInput),this.quill.off("selection-change",this.onSelectionChange);}};exports.TextEditor=w([editor.registerInnerEditor()],exports.TextEditor);function D(e,{insertAt:s}={}){if(typeof document>"u")return;let t=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",s==="top"&&t.firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e));}D(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:"Noto Serif",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:"Noto Serif SC",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:"Noto Serif TC",serif}.ql-font-NotoSerifHongKong{font-family:"Noto Serif HK",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}
2
+ `);var M=class e{constructor(){this.quill=null;this.app_=null;}static getInstance(){return e.instance||(e.instance=new e),e.instance}async init(s){if(this.app_=s,this.quill)return this.quill;let t=document.getElementById("textInnerEditor");if(t)this.quill=this.app_.editor.quill;else return t=document.createElement("div"),t.id="textInnerEditor",t.style.position="fixed",t.style.transformOrigin="left top",t.style.overflowWrap="break-word",t.style.wordBreak="break-all",t.style.visibility="hidden",document.body.appendChild(t),this.quill=new x__default.default("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:n=>{let[a]=this.quill.getLine(n.index),o=x__default.default.import("blots/block");if(!o?.bubbleFormats)return true;let i=o.bubbleFormats(a),d=new x.Delta().retain(n.index).delete(n.length).insert(`
3
+ `,i);return this.quill.updateContents(d,x__default.default.sources.USER),this.quill.setSelection(n.index+1,x__default.default.sources.SILENT),false}}}}}}),this.app_.editor.quill=this.quill,this.registerFonts(),this.quill}getQuill(){if(!this.quill)throw new Error("Quill editor not initialized. Call init() first.");return this.quill}getCanvas(){if(!this.app_)throw new Error("app_ editor not initialized. Call init() first.");return this.app_}registerFonts(){let s=x__default.default.import("attributors/class/font");s.whitelist=["Roboto","RobotoMono","Inter","OpenSans","Montserrat","RobotoCondensed","Arimo","NotoSans","NotoSansSymbols","Merriweather","PlayfairDisplay","NotoSerif","Lato","Spectral","DancingScript","NotoSansSimplifiedChinese","NotoSerifSimplifiedChinese","NotoSansTraditionalChinese","NotoSansHongKong","NotoSerifTraditionalChinese","NotoSerifHongKong","NotoSansJapanese","NotoSansKorean","Poppins"],x__default.default.register(s,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(s,t=0,n){let{editor:a}=this.app_,o=n||a.leafList.list,i=d=>{t&&(d.tag==="Box"||d.name==="Text")?s(d.children?.[0]||d):s(d);};o.length&&(Array.isArray(o)&&o.length>1?(this.app_.lockLayout(),o.forEach(i),this.app_.unlockLayout(),a.updateEditBox()):i(o[0]));}},p=M.getInstance();console.log(111111);core.Plugin.add("text-editor","editor");exports.quillManager=p;//# sourceMappingURL=index.cjs.map
4
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts","../src/TextEditTool/index.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/QuillManager.ts","../src/index.ts"],"names":["updataHtmlText","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","quillManager","style","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","TextEditTool","EditTool","editor","text","func","wait","timeout","args","div","EditorScaleEvent","e","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","QuillManager","_QuillManager","app","el","Quill","range","line","BlockBlot","lineFormats","delta","Delta","FontAttributor","callback","level","listNew","list","applyCallback","leaf","Plugin"],"mappings":"mXAEO,IAAMA,CAAAA,CAAiB,MAAO,EAASC,CAAAA,CAAkBC,CAAAA,GAAkB,CAChF,GAAM,CAAE,MAAA,CAAAC,CAAAA,CAAQ,MAAA,CAAAC,CAAO,EAAI,CAAA,CAAE,cAAA,CACvBC,EAAY,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAIF,CAAM,CAAA,CAAG,IAAA,CAAK,GAAA,CAAIC,CAAM,CAAC,CAAA,CACvDE,CAAAA,CAAW,SAAS,aAAA,CAAc,kBAAkB,EAkB1D,GAjBIA,CAAAA,EAAO,CAAA,CAAE,IAAA,CAAK,QAAA,EAAU,UAAA,GAC1BA,EAAI,KAAA,CAAM,UAAA,CAAa,EAAE,IAAA,CAAK,QAAA,CAAS,YAErCA,CAAAA,EAAO,CAAA,CAAE,IAAA,CAAK,QAAA,EAAU,QAAA,GAC1BA,CAAAA,CAAI,MAAM,QAAA,CAAW,CAAA,EAAG,EAAE,IAAA,CAAK,QAAA,CAAS,SAAWD,CAAS,CAAA,EAAA,CAAA,CAAA,CAE1DC,CAAAA,EAAO,CAAA,CAAE,IAAA,CAAK,QAAA,EAAU,aAC1BA,CAAAA,CAAI,KAAA,CAAM,WAAa,CAAA,CAAE,IAAA,CAAK,SAAS,UAAA,CAAA,CAErCA,CAAAA,EAAO,CAAA,CAAE,IAAA,CAAK,QAAA,EAAU,aAAA,GAC1BA,EAAI,KAAA,CAAM,aAAA,CAAgB,GAAG,CAAA,CAAE,IAAA,CAAK,SAAS,aAAa,CAAA,EAAA,CAAA,CAAA,CAExDA,CAAAA,EAAO,CAAA,CAAE,IAAA,CAAK,QAAA,EAAU,WAC1BA,CAAAA,CAAI,KAAA,CAAM,WAAa,CAAA,CAAE,IAAA,CAAK,SAAS,UAAA,CAEvCA,CAAAA,CAAI,KAAA,CAAM,UAAA,CAAa,MAAA,CAErBA,CAAAA,EAAO,EAAE,IAAA,CAAK,QAAA,EAAU,aAAc,CACxC,IAAMC,EAAgBD,CAAAA,CAAI,aAAA,CAAc,YAAY,CAAA,CACpDC,CAAAA,CAAS,KAAA,CAAM,aAAe,CAAA,CAAE,IAAA,CAAK,SAAS,aAChD,CAGA,IAAMC,CAAAA,CADQC,CAAAA,CAAa,QAAA,EAAS,CACjB,eAAA,EAAgB,CACnC,GAAID,CAAAA,GAAS,SAAA,CAAW,CAClB,CAAA,CAAE,IAAA,CAAK,SAAS,mBAAmB,CAAA,CACrC,CAAA,CAAE,IAAA,CAAO,CAAA,CAAE,IAAA,CAAK,MAAM,UAAU,CAAA,CAAE,CAAC,CAAA,CAAI,UAAA,CAEvC,EAAE,IAAA,CAAO,EAAA,CAEX,MACF,CACA,GAAI,CAAA,CAAE,KAAK,QAAA,CAAS,mBAAmB,EAAG,CAExC,IAAME,EAAQ,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAE,CAAC,EAmBtC,CAAA,CAAE,KACAA,CAAAA,CACA,UAAA,CACAC,CAAAA,CACE,CAAA,CACAH,CAAAA,CACA,CAAA,CAAE,KAAK,QAAA,CAAS,QAAA,CAChB,EAAE,IAAA,CAAK,QAAA,CAAS,WAChB,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,aAAA,CAChB,CAAA,CAAE,IAAA,CAAK,SAAS,UAAA,CAChB,CAAA,CAAE,KAAK,QAAA,EAAU,YACnB,EAEN,CAAA,KAgBE,CAAA,CAAE,KAAOG,CAAAA,CACP,CAAA,CACAH,EACA,CAAA,CAAE,IAAA,CAAK,SAAS,QAAA,CAChB,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAA,CAChB,CAAA,CAAE,KAAK,QAAA,CAAS,aAAA,CAChB,EAAE,IAAA,CAAK,QAAA,CAAS,WAChB,CAAA,CAAE,IAAA,CAAK,QAAA,EAAU,YACnB,EAEJ,CAAA,CACMG,EAAiB,CAAC,CAAA,CAAQH,EAAWI,CAAAA,CAAW,EAAA,CAAIC,EAAa,KAAA,CAAOC,CAAAA,CAAgB,GAAA,CAAKC,CAAAA,CAAa,MAAA,CAAQC,CAAAA,CAAe,UAAY,CACjJ,GAAM,CAAE,MAAA,CAAAb,CAAAA,CAAQ,OAAAC,CAAO,CAAA,CAAI,CAAA,CAAE,cAAA,CACvBC,CAAAA,CAAY,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,CAAIF,CAAM,CAAA,CAAG,IAAA,CAAK,IAAIC,CAAM,CAAC,CAAA,CACvDa,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC5CA,CAAAA,CAAQ,UAAYT,CAAAA,CAEpB,IAAMU,EAAoB,CACxB,QAAA,CAAU,CAAA,EAAGN,CAAQ,CAAA,EAAA,CAAA,CACrB,UAAA,CAAAC,EACA,aAAA,CAAe,CAAA,EAAGC,CAAa,CAAA,EAAA,CAAA,CAC/B,UAAA,CAAAC,CACF,EACAE,CAAAA,CAAQ,gBAAA,CAAiB,SAAS,CAAA,CAAE,OAAA,CAASE,CAAAA,EAAW,CACtD,MAAA,CAAO,MAAA,CAAOA,EAAE,KAAA,CAAOD,CAAY,EACrC,CAAC,CAAA,CAGD,IAAIE,CAAAA,CAAMH,CAAAA,CAAQ,SAAA,CAEd,kBAAkB,IAAA,CAAKG,CAAG,IAC5BA,CAAAA,CAAMA,CAAAA,CAAI,QAAQ,oBAAA,CAAsB,iBAAiB,CAAA,CAAA,CAE3D,IAAIC,CAAAA,CACa,SAAS,aAAA,CAAc,kBAAkB,MACpDC,CAAAA,CAAQb,CAAAA,CAAa,UAAS,CAG9Bc,CAAAA,CAAe,MAAA,CAAA,CAAQD,CAAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,aAAejB,CAAAA,EAAW,OAAA,CAAQ,CAAC,CAAC,CAAA,CAClE,MAAA,CAAA,CAAQiB,CAAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,WAAA,CAAcjB,CAAAA,EAAW,QAAQ,CAAC,CAAC,EAChF,CAAC,QAAA,CAAU,KAAK,CAAA,CAAE,QAAA,CAAS,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,YAAY,EACrD,CAAA,CAAE,MAAA,CAAO,OAASkB,CAAAA,CACpBF,CAAAA,CAAAA,CAAUE,GAAgB,CAAA,CAAE,QAAA,CAAS,SAAA,CAAU,MAAA,EAAU,IAAA,CAEzDF,CAAAA,CAAS,GAAG,CAAA,CAAE,MAAA,CAAO,MAAM,CAAA,EAAA,CAAA,CAGzB,CAAA,CAAE,OAAO,MAAA,CAASE,CAAAA,CACpBF,CAAAA,CAAAA,CAAUE,CAAAA,EAAgB,CAAA,CAAE,QAAA,CAAS,UAAU,MAAA,EAAU,IAAA,CAEzDF,EAAS,CAAA,EAAG,CAAA,CAAE,OAAO,MAAM,CAAA,EAAA,CAAA,CAK/B,IAAMX,CAAAA,CAAQ,ipBAAA,CACVc,CAAAA,CAAS,GACb,OAAI,CAAA,CAAE,OAAO,QAAA,CAAS,CAAC,EAAE,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,CAC3CA,CAAAA,CACEd,CAAAA,CACA,sBAAsB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,WAAA,EAAc,CAAA,CAAE,OAAO,MAAM,CAAA,wEAAA,EAA2EU,CAAG,CAAA,MAAA,CAAA,CACxI,CAAA,CAAE,IAAA,CAAK,aAChBI,CAAAA,CACEd,CAAAA,CACA,sBAAsB,CAAA,CAAE,MAAA,CAAO,KAAK,CAAA,UAAA,EAAaW,CAAM,CAAA,6DAAA,EAAgEL,CAAY,CAAA,GAAA,EAAMI,CAAG,SAG1I,CAAA,CAAE,IAAA,CAAK,SAAS,MAAA,CAClBI,CAAAA,CAASd,EAAQU,CAAAA,EAEjB,OAAA,CAAQ,GAAA,CAAIG,CAAY,CAAA,CACxBC,CAAAA,CAASd,EAAQ,CAAA,4DAAA,EAA+DU,CAAG,UAGvF,OAAA,CAAQ,GAAA,CAAII,EAAQ,oCAAW,CAAA,CACxBA,CACT,CAAA,CC1JaC,oBAAAA,CAAN,gBAA2BC,eAAS,CAQzC,YAAYC,CAAAA,CAAa,CACvB,MAAMA,CAAM,CAAA,CAJd,IAAA,CAAO,KAAA,CAAa,IAAA,CAyFpB,IAAA,CAAQ,iBAAmB,KAAA,CAC3B,IAAA,CAAQ,YAAc,CAAA,CArFpB,IAAA,CAAK,SAAW,EAAC,CACjB,IAAA,CAAK,kBAAA,CAAqB,IAAA,CAAK,QAAA,CAAUC,GAAc,CACrD5B,CAAAA,CAAe4B,CAAI,EACrB,CAAA,CAAG,GAAG,EACR,CAZA,IAAW,GAAA,EAAM,CACf,OAAO,cACT,CAYQ,QAAA,CACNC,CAAAA,CACAC,EACG,CACH,IAAIC,EAAyB,IAAA,CAC7B,OAAQ,CAAA,GAAIC,CAAAA,GAAgB,CACtBD,CAAAA,GAAY,MACd,MAAA,CAAO,YAAA,CAAaA,CAAO,CAAA,CAE7BA,CAAAA,CAAU,OAAO,UAAA,CACf,IAAMF,CAAAA,CAAK,KAAA,CAAM,IAAA,CAAMG,CAAI,EAC3BF,CACF,EACF,EACF,CAEO,QAAA,EAAiB,CACtB,GAAM,CAAE,MAAA,CAAAH,CAAO,CAAA,CAAIlB,CAAAA,CAAa,WAAU,CACpCmB,CAAAA,CAAOD,EAAO,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA,CACxC,CAAE,MAAA,CAAAxB,CAAAA,CAAQ,MAAA,CAAAC,CAAO,EAAIwB,CAAAA,CAAK,cAAA,CAC1BvB,EAAY,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAIF,CAAM,CAAA,CAAG,IAAA,CAAK,GAAA,CAAIC,CAAM,CAAC,CAAA,CACvD6B,CAAAA,CAAW,SAAS,aAAA,CAAc,kBAAkB,EACpD,CAAE,KAAA,CAAAvB,CAAM,CAAA,CAAIuB,CAAAA,CAClB,IAAA,CAAK,SAAW,CACdN,CAAAA,CAAO,IAAIO,uBAAAA,CAAiB,KAAA,CAAQC,GAAW,CACxCP,CAAAA,CAAK,IAAA,CAAK,YAAA,GACbA,CAAAA,CAAK,IAAA,CAAK,aAAe,IAAA,CAAA,CAEvBA,CAAAA,CAAK,KAAK,YAAA,GACZlB,CAAAA,CAAM,MAAQkB,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAQvB,CAAAA,CAAY,IAAA,CAC9CK,CAAAA,CAAM,OAAS,MAAA,CAAA,CAEjB,IAAI0B,EAAQ,CAAA,CACRR,CAAAA,CAAK,OAAO,GAAA,GAAQ,KAAA,EAASA,CAAAA,CAAK,MAAA,CAAO,SAAA,EAAaA,CAAAA,CAAK,MAAM,QAAA,EAAU,KAAA,GAC7EQ,EAAQR,CAAAA,CAAK,MAAA,CAAO,MAAQA,CAAAA,CAAK,IAAA,EAAM,QAAA,CAAS,KAAA,CAChDA,CAAAA,CAAK,IAAA,CAAK,SAAS,QAAA,CAAWA,CAAAA,CAAK,KAAK,QAAA,CAAS,QAAA,CAAWQ,GAG9DR,CAAAA,CAAK,IAAA,EAAM,QAAA,EAAU,KAAA,GAAUA,CAAAA,CAAK,IAAA,CAAK,SAAS,KAAA,CAAQA,CAAAA,CAAK,OAAO,KAAA,CAAA,CACtE,IAAA,CAAK,mBAAmBA,CAAI,EAC9B,CAAC,CAAA,CACDD,CAAAA,CAAO,GAAA,CAAIU,sBAAa,UAAA,CAAY,IAAM,CACnCT,CAAAA,CAAK,MAAA,CAAO,QACfD,CAAAA,CAAO,eAAA,CAAgBC,CAAAA,CAAM,IAAI,EAErC,CAAC,CACH,EACF,CAGO,QAAe,CACpB,GAAM,CAAE,MAAA,CAAAD,CAAO,CAAA,CAAIlB,CAAAA,CAAa,SAAA,EAAU,CAC1C,QAAQ,GAAA,CAAIkB,CAAAA,CAAO,QAAS,GAAG,CAAA,CAC/B,IAAMC,CAAAA,CAAYD,CAAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA,CAE7C,CAAE,MAAA,CAAAxB,CAAAA,CAAQ,MAAA,CAAAC,CAAO,CAAA,CAAIwB,CAAAA,CAAK,eAC1BvB,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAIF,CAAM,EAAG,IAAA,CAAK,GAAA,CAAIC,CAAM,CAAC,CAAA,CAC7D,KAAK,QAAA,EAAS,CACd,IAAA,CAAK,KAAA,CAAQK,CAAAA,CAAa,QAAA,GAC1B,IAAA,CAAK,KAAA,CAAM,UAAU,oBAAA,CAAqBmB,CAAAA,CAAK,IAAI,CAAA,CACnD,IAAMK,CAAAA,CAAW,QAAA,CAAS,aAAA,CAAc,kBAAkB,EACpD,CAAE,KAAA,CAAAvB,CAAM,CAAA,CAAIuB,CAAAA,CAEdL,EAAK,IAAA,CAAK,YAAA,EACZlB,CAAAA,CAAM,KAAA,CAAQkB,CAAAA,CAAK,MAAA,CAAO,MAAQvB,CAAAA,CAAY,IAAA,CAC9CK,EAAM,MAAA,CAASkB,CAAAA,CAAK,OAAO,MAAA,CAASvB,CAAAA,CAAY,IAAA,GAEhDK,CAAAA,CAAM,KAAA,CAAQ,MAAA,CACdA,EAAM,MAAA,CAAS,MAAA,EAQnB,CAIO,oBAAA,CAAqBkB,CAAAA,CAAiB,CAC3CA,CAAAA,EACEA,CAAAA,CAAK,GAAA,CAAI,CACP,KAAA,CAAOA,CAAAA,CAAK,SAAS,SAAA,CAAU,KAAA,CAC/B,OAAQA,CAAAA,CAAK,QAAA,CAAS,UAAU,MAClC,CAAC,EACL,CAEO,QAAA,EAAiB,KAChB,CAAE,MAAA,CAAAD,CAAO,CAAA,CAAIlB,CAAAA,CAAa,WAAU,CACpCmB,CAAAA,CAAOD,CAAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,UAAU,EACnCA,CAAAA,CAAO,QAClB,OAAA,CAAQ,GAAA,CAAI,+BAAW,CAAA,CAEnB,IAAA,CAAK,WAAA,EAAgBC,CAAAA,CAAa,WAAA,EAClC,IAAA,CAAK,iBAMX,CAGO,QAAA,EAAiB,CACtB,GAAM,CAAE,OAAAD,CAAO,CAAA,CAAIlB,CAAAA,CAAa,SAAA,EAAU,CAC1CkB,CAAAA,CAAO,KAAK,IAAA,CAAK,QAAQ,EAC3B,CAGO,SAAA,EAAkB,CAAC,CAC5B,EA/HaF,oBAAAA,CAANa,CAAAA,CAAA,CAFNC,uBAAAA,IAEYd,oBAAAA,CAAAA,CCLAe,kBAAAA,CAAN,gBAAyBC,kBAAY,CAArC,kCAOL,IAAA,CAAO,MAAA,CAAS,CACd,SAAA,CAAW,KACb,CAAA,CAEA,KAAO,QAAA,CAAkB,GAEzB,IAAA,CAAU,UAAA,CAEM,OAChB,IAAA,CAAU,MAAA,CAA8B,MAAA,CACxC,IAAA,CAAU,UAAA,CAAkC,MAAA,CAC5C,KAAU,SAAA,CAAiC,MAAA,CAC3C,KAAO,KAAA,CAAa,IAAA,CACpB,KAAO,WAAA,CAAuB,KAAA,CAG9B,IAAA,CAAQ,eAAA,CAIH,EAAC,CACN,KAAQ,OAAA,CAAiC,IAAA,CAkGzC,KAAQ,iBAAA,CAAoB,MAAON,GAAW,CAC5CA,CAAAA,EAAK,YAAA,CAAa,OAAA,CAAQ,kBAAA,CAAoB,IAAA,CAAK,UAAUA,CAAC,CAAC,EACjE,CAAA,CAEA,IAAA,CAAQ,OAAA,CAAU,SAAY,CAC5B,GAAM,CAAE,OAAA,CAAAO,CAAQ,CAAA,CAAI,KAEpB,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,CACrB1C,CAAAA,CAAe,KAAK,UAAU,EAMhC,CAAA,CA4BA,IAAA,CAAQ,gBAAA,CAAmB,MAAA,CAvK3B,IAAW,GAAA,EAAM,CACf,OAAO,YACT,CA4BA,IAAY,UAAA,EAAsB,CAChC,OAAO,MAAA,CAAO,QAAA,CAAS,IAAA,CAAK,SAAS,IAAI,CAC3C,CACO,MAAA,EAAe,CACpB,GAAM,CAAE,MAAA,CAAA2B,CAAO,CAAA,CAAI,IAAA,CACb,CAAE,OAAAgB,CAAO,CAAA,CAAIhB,EAAO,GAAA,CACpBC,CAAAA,CAAO,KAAK,UAAA,CACZ,CAAE,MAAA,CAAAzB,CAAAA,CAAQ,MAAA,CAAAC,CAAO,EAAIwB,CAAAA,CAAK,cAAA,CAC1BvB,EAAY,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAIF,CAAM,CAAA,CAAG,IAAA,CAAK,GAAA,CAAIC,CAAM,CAAC,CAAA,CAG7D,IAAA,CAAK,WAAa,EAAEwB,CAAAA,YAAgB,MACpC,IAAA,CAAK,SAAA,CAAYe,CAAAA,CAAO,QAAA,CACxBA,CAAAA,CAAO,QAAA,CAAW,MAElB,IAAMV,CAAAA,CAAO,KAAK,OAAA,CAAU,QAAA,CAAS,cAAc,kBAAkB,CAAA,CAC/D,CAAE,KAAA,CAAAvB,CAAM,CAAA,CAAIuB,EAmClB,GAlCAvB,CAAAA,CAAM,WAAa,SAAA,CAIfkB,CAAAA,CAAK,KAAK,YAAA,EACZlB,CAAAA,CAAM,KAAA,CAAQkB,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAQvB,EAAY,IAAA,CAC9CK,CAAAA,CAAM,OAASkB,CAAAA,CAAK,MAAA,CAAO,OAASvB,CAAAA,CAAY,IAAA,GAEhDK,CAAAA,CAAM,KAAA,CAAQ,MAAA,CACdA,CAAAA,CAAM,OAAS,MAAA,CAAA,CAIjBA,CAAAA,CAAM,QAAU,eAAA,CAGZkB,CAAAA,CAAK,KAAK,QAAA,CAAS,QAAA,GACrB,OAAA,CAAQ,GAAA,CAAIA,CAAAA,CAAK,IAAA,CAAK,SAAS,QAAQ,CAAA,CACvCK,EAAI,KAAA,CAAM,QAAA,CAAW,GAAGL,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAQ,CAAA,EAAA,CAAA,CAAA,CAEjDA,CAAAA,CAAK,KAAK,QAAA,CAAS,UAAA,GACrBK,EAAI,KAAA,CAAM,UAAA,CAAa,GAAGL,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,CAAA,CAAA,CAErDA,CAAAA,CAAK,KAAK,QAAA,CAAS,UAAA,GACrBK,EAAI,KAAA,CAAM,UAAA,CAAaL,EAAK,IAAA,CAAK,QAAA,CAAS,UAAA,CAAA,CAExCA,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,gBACrBK,CAAAA,CAAI,KAAA,CAAM,cAAgB,CAAA,EAAGL,CAAAA,CAAK,KAAK,QAAA,CAAS,aAAa,CAAA,EAAA,CAAA,CAAA,CAE3DA,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,WACrBK,CAAAA,CAAI,KAAA,CAAM,WAAa,CAAA,EAAGL,CAAAA,CAAK,KAAK,QAAA,CAAS,UAAU,CAAA,CAAA,CAEvDK,CAAAA,CAAI,KAAA,CAAM,UAAA,CAAa,OAErBL,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,YAAA,CAAc,CACnC,IAAMrB,EAAgB0B,CAAAA,CAAI,aAAA,CAAc,YAAY,CAAA,CACpD1B,CAAAA,CAAS,KAAA,CAAM,aAAe,CAAA,EAAGqB,CAAAA,CAAK,KAAK,QAAA,CAAS,YAAY,GAClE,CAEA,IAAA,CAAK,KAAA,CAAQnB,CAAAA,CAAa,QAAA,EAAS,CAGnC,KAAK,KAAA,CAAM,SAAA,CAAU,qBAAqBmB,CAAAA,CAAK,IAAI,EAE/CA,CAAAA,CAAK,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,CAAE,GAAA,CAAI,SAAS,OAAO,CAAA,EAC9ClB,EAAM,KAAA,CAAQkB,CAAAA,CAAK,OAAO,KAAA,CAAQvB,CAAAA,CAAY,IAAA,CAC9CK,CAAAA,CAAM,IAAA,CAAO,KAAA,CACb,KAAK,KAAA,CAAM,UAAA,CAAW,EAAG,IAAA,CAAK,KAAA,CAAM,WAAU,CAAG,OAAA,CAAS,QAAQ,CAAA,EAElE,IAAA,CAAK,KAAA,CAAM,aAAa,CAAA,CAAG,IAAA,CAAK,MAAM,SAAA,EAAU,CAAI,CAAC,CAAA,CAKvD,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,aAAA,CAAe,IAAA,CAAK,OAAO,CAAA,CACzC,IAAA,CAAK,MAAM,EAAA,CAAG,kBAAA,CAAoB,KAAK,iBAAiB,CAAA,CACxD,YAAA,CAAa,UAAA,CAAW,kBAAkB,CAAA,CAE1C,KAAK,QAAA,CAAW,CAEdiB,EAAO,GAAA,CAAI,GAAA,CAAIU,kBAAa,IAAA,CAAOF,CAAAA,EAAoB,CACrD,GAAI,CAAE,MAAA,CAAAS,CAAO,CAAA,CAAIT,CAAAA,CAAE,OACjBU,CAAAA,CAAgB,KAAA,CAClB,KAAOD,CAAAA,EACDA,CAAAA,GAAWX,CAAAA,GAAKY,CAAAA,CAAO,IAAA,CAAA,CAC3BD,CAAAA,CAASA,EAAO,aAAA,CAEbC,CAAAA,GACHlB,EAAO,gBAAA,EAAiB,CACxBA,EAAO,MAAA,EAAO,EAElB,CAAC,CACH,EAKF,CAiBO,UAAW,CAChB,GAAM,CAAE,UAAA,CAAYC,CAAK,EAAI,IAAA,CACvB,CAAE,MAAA,CAAAzB,CAAAA,CAAQ,MAAA,CAAAC,CAAO,EAAIwB,CAAAA,CAAK,cAAA,CAC1BvB,EAAY,IAAA,CAAK,GAAA,CAAI,KAAK,GAAA,CAAIF,CAAM,CAAA,CAAG,IAAA,CAAK,GAAA,CAAIC,CAAM,CAAC,CAAA,CAGzD,CAAE,MAAA0C,CAAAA,CAAO,MAAA,CAAAzB,CAAO,CAAA,CAAIO,CAAAA,CAAK,MAAA,CAAO,OAAA,CAClCkB,CAAAA,EAASzC,CAAAA,CAAagB,GAAUhB,CAAAA,CAElC,GAAM,CAAE,CAAA,CAAA0C,CAAAA,CAAG,EAAAC,CAAE,CAAA,CAAI,IAAA,CAAK,MAAA,CAClBpB,CAAAA,CAAK,GAAA,CAAI,aACTA,CAAAA,CAAK,GAAA,CAAI,KAAK,YAAA,CACZ,CAAE,EAAAqB,CAAAA,CAAG,CAAA,CAAAC,CAAAA,CAAG,CAAA,CAAG,CAAA,CAAAC,CAAAA,CAAG,EAAAhB,CAAAA,CAAG,CAAA,CAAAiB,CAAE,CAAA,CAAI,IAAIC,YAAOzB,CAAAA,CAAK,cAAc,CAAA,CACxD,KAAA,CAAM,CAAA,CAAIvB,CAAS,EACnB,cAAA,CAAe,CAAA,CAAG,CAAC,CAAA,CAEhB,CAAE,KAAA,CAAAK,CAAM,CAAA,CAAI,IAAA,CAAK,OAAA,CACvBA,CAAAA,CAAM,SAAA,CAAY,CAAA,OAAA,EAAUuC,CAAC,CAAA,CAAA,EAAIC,CAAC,IAAI,CAAC,CAAA,CAAA,EAAIC,CAAC,CAAA,CAAA,EAAIhB,CAAC,CAAA,CAAA,EAAIiB,CAAC,CAAA,CAAA,CAAA,CACtD1C,CAAAA,CAAM,KAAOqC,CAAAA,CAAI,IAAA,CACjBrC,EAAM,GAAA,CAAMsC,CAAAA,CAAI,KAGhBpB,CAAAA,CAAK,GAAA,CAAI,CACP,OAAA,CAAS,KACX,CAAC,EACH,CAEO,QAAA,EAAiB,CACtB,GAAM,CAAE,WAAYA,CAAAA,CAAM,MAAA,CAAAD,CAAAA,CAAQ,OAAA,CAASrB,CAAI,CAAA,CAAI,KAK/CsB,CAAAA,GACF,IAAA,CAAK,SAAQ,CAETD,CAAAA,CAAO,MAAKA,CAAAA,CAAO,GAAA,CAAI,MAAA,CAAO,QAAA,CAAW,IAAA,CAAK,SAAA,CAAA,CAClDA,EAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,CAIzB,IAAA,CAAK,QAAQ,KAAA,CAAM,UAAA,CAAa,QAAA,CAChC,IAAA,CAAK,QAAA,CAAW,IAIhBC,CAAAA,CAAK,MAAA,EACLA,EAAK,MAAA,CAAO,IAAA,EAAQ,QACpBA,CAAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,CAAMO,CAAAA,EAAWA,CAAAA,CAAE,MAAQ,KAAK,CAAA,EAErDP,EAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,OAAA,CAAU,CAAA,CACrCA,CAAAA,CAAK,OAAA,CAAU,KAAA,EAGfA,EAAK,GAAA,CAAI,CACP,QAAS,IACX,CAAC,EAEC,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU,GAAM,CAAA,EAAKA,CAAAA,CAAK,OAAO,IAAA,GAAS,MAAA,EACvDA,EAAK,MAAA,CAAO,MAAA,GAEd,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,CACtB,IAAA,CAAK,KAAA,CAAM,IAAI,aAAA,CAAe,IAAA,CAAK,OAAO,CAAA,CAC1C,IAAA,CAAK,MAAM,GAAA,CAAI,kBAAA,CAAoB,IAAA,CAAK,iBAAiB,EAC3D,CACF,EA/MaY,kBAAAA,CAANF,CAAAA,CAAA,CADNgB,0BAAAA,EAAoB,CAAA,CACRd,oBCJY,SAARe,CAAAA,CAA6BC,EAAK,CAAE,QAAA,CAAAC,CAAS,CAAA,CAAI,EAAC,CAAG,CAC1D,GAAY,OAAO,QAAA,CAAa,IAAa,OAE7C,IAAMC,EAAO,QAAA,CAAS,IAAA,EAAQ,QAAA,CAAS,oBAAA,CAAqB,MAAM,CAAA,CAAE,CAAC,CAAA,CAC/DhD,CAAAA,CAAQ,SAAS,aAAA,CAAc,OAAO,EAC5CA,CAAAA,CAAM,IAAA,CAAO,UAAA,CAET+C,CAAAA,GAAa,KAAA,EACXC,CAAAA,CAAK,WACPA,CAAAA,CAAK,YAAA,CAAahD,EAAOgD,CAAAA,CAAK,UAAU,EAK1CA,CAAAA,CAAK,WAAA,CAAYhD,CAAK,CAAA,CAGpBA,CAAAA,CAAM,UAAA,CACRA,EAAM,UAAA,CAAW,OAAA,CAAU8C,CAAAA,CAE3B9C,CAAAA,CAAM,WAAA,CAAY,QAAA,CAAS,eAAe8C,CAAG,CAAC,EAElD,CCvB8BD,CAAAA,CAAY,CAAA;AAAA,CAAomD,CAAA,CCGxpD,IAAMI,CAAAA,CAAN,MAAMC,CAAa,CAKT,WAAA,EAAc,CAHtB,IAAA,CAAQ,MAAsB,IAAA,CAC9B,IAAA,CAAO,IAAA,CAAmB,KAEH,CAEvB,OAAO,WAAA,EAAc,CACnB,OAAKA,CAAAA,CAAa,QAAA,GAChBA,CAAAA,CAAa,QAAA,CAAW,IAAIA,CAAAA,CAAAA,CAEvBA,CAAAA,CAAa,QACtB,CAEA,MAAM,IAAA,CAAKC,CAAAA,CAAU,CAEnB,GADA,KAAK,IAAA,CAAOA,CAAAA,CACR,IAAA,CAAK,KAAA,CAAO,OAAO,IAAA,CAAK,KAAA,CAE5B,IAAIC,EAAK,QAAA,CAAS,cAAA,CAAe,iBAAiB,CAAA,CAClD,GAAKA,CAAAA,CA4CH,IAAA,CAAK,KAAA,CAAQ,IAAA,CAAK,KAAK,MAAA,CAAO,KAAA,CAAA,KA3C9B,OAAAA,CAAAA,CAAK,SAAS,aAAA,CAAc,KAAK,CAAA,CACjCA,CAAAA,CAAG,GAAK,iBAAA,CACRA,CAAAA,CAAG,KAAA,CAAM,QAAA,CAAW,QACpBA,CAAAA,CAAG,KAAA,CAAM,eAAA,CAAkB,UAAA,CAC3BA,EAAG,KAAA,CAAM,YAAA,CAAe,YAAA,CACxBA,CAAAA,CAAG,KAAA,CAAM,SAAA,CAAY,WAAA,CACrBA,CAAAA,CAAG,MAAM,UAAA,CAAa,QAAA,CACtB,QAAA,CAAS,IAAA,CAAK,YAAYA,CAAE,CAAA,CAC5B,IAAA,CAAK,KAAA,CAAQ,IAAIC,kBAAAA,CAAM,kBAAA,CAAoB,CACzC,KAAA,CAAO,OACP,OAAA,CAAS,CACP,OAAA,CAAS,KAAA,CACT,SAAU,CACR,QAAA,CAAU,CACR,KAAA,CAAO,CACL,GAAA,CAAK,OAAA,CACL,OAAA,CAAUC,CAAAA,EAAe,CACvB,GAAM,CAACC,CAAI,CAAA,CAAI,IAAA,CAAK,KAAA,CAAO,OAAA,CAAQD,CAAAA,CAAM,KAAK,CAAA,CACxCE,CAAAA,CAAiBH,kBAAAA,CAAM,MAAA,CAAO,aAAa,CAAA,CACjD,GAAI,CAACG,CAAAA,EAAW,cAAe,OAAO,KAAA,CAEtC,IAAMC,CAAAA,CAAcD,EAAU,aAAA,CAAcD,CAAI,CAAA,CAC1CG,CAAAA,CAAQ,IAAIC,OAAAA,EAAM,CACrB,MAAA,CAAOL,CAAAA,CAAM,KAAK,CAAA,CAClB,MAAA,CAAOA,CAAAA,CAAM,MAAM,EACnB,MAAA,CAAO;AAAA,CAAA,CAAMG,CAAW,EAE3B,OAAA,IAAA,CAAK,KAAA,CAAO,eAAeC,CAAAA,CAAOL,kBAAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,CACpD,IAAA,CAAK,MAAO,YAAA,CACVC,CAAAA,CAAM,MAAQ,CAAA,CACdD,kBAAAA,CAAM,QAAQ,MAChB,CAAA,CACO,KACT,CACF,CACF,CACF,CACF,CACF,CAAC,EACD,IAAA,CAAK,IAAA,CAAK,OAAO,KAAA,CAAQ,IAAA,CAAK,KAAA,CAC9B,IAAA,CAAK,aAAA,EAAc,CACZ,KAAK,KAOhB,CAEA,QAAA,EAAW,CACT,GAAI,CAAC,KAAK,KAAA,CACR,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAEpE,OAAO,IAAA,CAAK,KACd,CAEA,SAAA,EAAY,CACV,GAAI,CAAC,IAAA,CAAK,IAAA,CACR,MAAM,IAAI,KAAA,CAAM,iDAAiD,CAAA,CAEnE,OAAO,IAAA,CAAK,IACd,CAEQ,aAAA,EAAgB,CACtB,IAAMO,CAAAA,CAAsBP,kBAAAA,CAAM,MAAA,CAAO,wBAAwB,CAAA,CACjEO,EAAe,SAAA,CAAY,CACzB,SACA,YAAA,CACA,OAAA,CACA,WACA,YAAA,CACA,iBAAA,CACA,OAAA,CACA,UAAA,CACA,iBAAA,CACA,cAAA,CACA,kBACA,WAAA,CACA,MAAA,CACA,UAAA,CACA,eAAA,CACA,2BAAA,CACA,4BAAA,CACA,6BACA,kBAAA,CACA,6BAAA,CACA,mBAAA,CACA,kBAAA,CACA,gBAAA,CACA,SACF,EACAP,kBAAAA,CAAM,QAAA,CAASO,EAAgB,IAAI,EACrC,CAEO,aAAA,EAAyB,CAC9B,OAAK,IAAA,CAAK,IAAA,CAAK,MAAA,CACX,KAAK,IAAA,CAAK,MAAA,CAAO,WAAa,IAAA,CADJ,KAMhC,CACO,QAAA,CACLC,CAAAA,CACAC,CAAAA,CAAQ,CAAA,CACRC,CAAAA,CACM,CAEN,GAAM,CAAE,MAAA,CAAA9C,CAAO,CAAA,CAAI,IAAA,CAAK,KAClB+C,CAAAA,CAAOD,CAAAA,EAAoB9C,CAAAA,CAAO,QAAA,CAAS,IAAA,CAC3CgD,CAAAA,CAAiBC,GAAc,CAC/BJ,CAAAA,GAAUI,CAAAA,CAAK,GAAA,GAAQ,KAAA,EAASA,CAAAA,CAAK,OAAS,MAAA,CAAA,CAChDL,CAAAA,CAASK,CAAAA,CAAK,QAAA,GAAW,CAAC,CAAA,EAAKA,CAAI,CAAA,CAEnCL,CAAAA,CAASK,CAAI,EAEjB,CAAA,CACKF,EAAK,MAAA,GACN,KAAA,CAAM,OAAA,CAAQA,CAAI,CAAA,EAAKA,CAAAA,CAAK,OAAS,CAAA,EACvC,IAAA,CAAK,IAAA,CAAK,UAAA,EAAW,CACrBA,CAAAA,CAAK,QAAQC,CAAa,CAAA,CAC1B,IAAA,CAAK,IAAA,CAAK,YAAA,EAAa,CACvBhD,EAAO,aAAA,EAAc,EAErBgD,EAAcD,CAAAA,CAAK,CAAC,CAAC,CAAA,EAEzB,CACF,CAAA,CAEajE,CAAAA,CAAekD,CAAAA,CAAa,WAAA,GCnJzC,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,CAElBkB,WAAAA,CAAO,GAAA,CAAI,aAAA,CAAe,QAAQ,CAAA","file":"index.cjs","sourcesContent":["import { quillManager } from '.'\n// 更新text样式\nexport const updataHtmlText = async (e?: any, base64font?: any, fontObj?: any) => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const dom: any = document.querySelector('#textInnerEditor')\n if (dom && e.data.textData?.fontFamily) {\n dom.style.fontFamily = e.data.textData.fontFamily\n }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow\n } else {\n dom.style.textShadow = 'none'\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector('.ql-editor')\n qlEditor.style.alignContent = e.data.textData.alignContent\n }\n // 如果是空的就把text滞空\n const quill = quillManager.getQuill()\n const html = quill.getSemanticHTML()\n if (html === '<p></p>') {\n if (e.text.includes('<style>@font-face')) {\n e.text = e.text.split('</style>')[0] + '</style>'\n } else {\n e.text = ''\n }\n return\n }\n if (e.text.includes('<style>@font-face')) {\n // text已经加载过字体\n const style = e.text.split('</style>')[0]\n if (fontObj && !style.includes(fontObj.code)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.code};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}`\n e.text =\n style +\n addStyle +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // 样式当前字体已经存在\n e.text =\n style +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n } else if (base64font && fontObj) {\n // 未加载过字体初次添加字体 存在base64font && fontObj才触发\n const style = `<style>@font-face {font-family: ${e.data.textData.fontFamily.split(',')[0]};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}</style>`\n e.text =\n style +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // text没有包含字体就不加字体style\n e.text = addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n}\nconst addFontSizeToP = (e: any, html: any, fontSize = 16, lineHeight = '1.5', letterSpacing = '0', textShadow = 'none', alignContent = 'start') => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const wrapper = document.createElement('div')\n wrapper.innerHTML = html\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow\n }\n wrapper.querySelectorAll('p,ol,ul').forEach((p: any) => {\n Object.assign(p.style, wrapperStyle)\n })\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, '<p$1>&nbsp;</p>')\n }\n let height\n const div: any = document.querySelector('#textInnerEditor')\n const quill = quillManager.getQuill()\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number((quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0))\n const actualWidth = Number((quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0))\n if (['center', 'end'].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`\n let divBox = ''\n if (e.parent.children[0].tag.includes('Shape')) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str\n } else {\n console.log(actualHeight)\n divBox = style + `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`\n }\n }\n console.log(divBox, '最终的html内容')\n return divBox\n}\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = quillManager.getQuill()\n const { editor, canvas } = quillManager.getCanvas()\n console.log(editor, quillManager.getCanvas(), 'editor')\n if (!quill) {\n return\n }\n const range = JSON.parse(localStorage.getItem('selection-change') || '{}')\n\n quillManager.dateEdit(async (e: any) => {\n if (key === 'font') {\n const fontSimpleName = value.code.replace(/\\s+/g, '')\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, fontSimpleName)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n }\n updataHtmlText(e, base64font ?? null, value ?? null)\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n updataHtmlText(e, base64font ?? null, value ?? null)\n }\n } else if (key === 'fontSize') {\n // 字体和字号\n e.data.textData[key] = value\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n updataHtmlText(e, base64font ?? null)\n } else if (key === 'textCase') {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length)\n const formats = quill.getFormat(range.index, range.length)\n quill.deleteText(range.index, range.length)\n let convertedText\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase()\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase()\n } else {\n convertedText = text.toUpperCase()\n }\n\n quill.insertText(range.index, convertedText, formats)\n range && editor.innerEditing && quill.setSelection(range.index, range.length)\n }\n } else if (key === 'script') {\n // 上下标\n let val = 'sub'\n if (value === 'super') val = 'sup'\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, quill.getFormat(range).script === value ? false : val)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n updataHtmlText(e)\n }\n } else if (key === 'align') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n quill.format(key, value)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n updataHtmlText(e)\n } else if (key === 'alignContent') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'color') {\n // 颜色\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, value)\n if (e.tag === 'HTMLText') {\n updataHtmlText(e)\n } else if (e.parent.findOne('HTMLText')) {\n updataHtmlText(e.parent.findOne('HTMLText'))\n }\n } else if (key === 'textShadow') {\n // 阴影\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'list') {\n // 有序无序列表\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.format(key, false)\n } else {\n quill.format(key, value)\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n }\n updataHtmlText(e)\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, !quill.getFormat(range)[key])\n } else {\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n updataHtmlText(e)\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1)\n}\n","import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { quillManager } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'Box' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = quillManager.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = quillManager.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = quillManager.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { quillManager } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n\n // 拼写检查相关属性\n private misspelledWords: Array<{\n word: string;\n offset: number;\n length: number;\n }> = [];\n private overlay: HTMLDivElement | null = null;\n\n // 判断是否为OA系统的属性\n private get isOASystem(): boolean {\n return window.location.host.includes(\"oa\");\n }\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n console.log(text.data.textData.fontSize)\n div.style.fontSize = `${text.data.textData.fontSize}px`;\n }\n if (text.data.textData.fontFamily) {\n div.style.fontFamily = `${text.data.textData.fontFamily}`;\n }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = quillManager.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n this.quill.on(\"selection-change\", this.onSelectionChange);\n localStorage.removeItem(\"selection-change\");\n\n this.eventIds = [\n // 点击空白关闭\n editor.app.on_(PointerEvent.DOWN, (e: PointerEvent) => {\n let { target } = e.origin,\n find: boolean = false;\n while (target) {\n if (target === div) find = true;\n target = target.parentElement;\n }\n if (!find) {\n editor.closeInnerEditor();\n editor.cancel();\n }\n }),\n ];\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = false\n // canvas.app.editor.hittable = false\n }\n private onSelectionChange = async (e: any) => {\n e && localStorage.setItem(\"selection-change\", JSON.stringify(e));\n };\n\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\n console.log(\"onInput\");\n updataHtmlText(this.editTarget);\n // 获取当前文字编辑文字内容的边界 这里是在没有修改过外部尺寸的情况下 自适应文字编辑内容的尺寸\n // updateChangeBoxBound(this.editTarget)\n\n // 如果是清空了 width要从0改成auto\n // editDom.style.width = documentBounds.width ? documentBounds.width : 'auto'\n };\n\n public onUpdate() {\n const { editTarget: text } = this;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n\n // layout\n let { width, height } = text.parent.__local;\n ((width *= zoomScale), (height *= zoomScale));\n\n const { x, y } = this.inBody\n ? text.app.clientBounds\n : text.app.tree.clientBounds;\n const { a, b, c, d, e, f } = new Matrix(text.worldTransform)\n .scale(1 / zoomScale)\n .translateInner(0, 0);\n\n const { style } = this.editDom;\n style.transform = `matrix(${a},${b},${c},${d},${e},${f})`;\n style.left = x + \"px\";\n style.top = y + \"px\";\n\n // 打开内部或者编辑内部文本编辑强制隐藏\n text.set({\n visible: false,\n });\n }\n private isUpdatingPoints = false;\n public onUnload(): void {\n const { editTarget: text, editor, editDom: dom } = this;\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = true\n // canvas.app.editor.hittable = true\n if (text) {\n this.onInput();\n\n if (editor.app) editor.app.config.keyEvent = this._keyEvent;\n editor.off_(this.eventIds);\n\n // dom.remove()\n // this.editDom = this.eventIds = undefined\n this.editDom.style.visibility = \"hidden\";\n this.eventIds = [];\n }\n // 如果大于1\n if (\n text.parent &&\n text.parent.name == \"Text\" &&\n text.parent.children.some((e: any) => e.tag === \"Box\")\n ) {\n text.parent.findOne(\"Box\").opacity = 1;\n text.visible = false;\n } else {\n // 恢复显示\n text.set({\n visible: true,\n });\n }\n if (this.quill.getLength() === 1 && text.parent.name === \"Text\") {\n text.parent.remove();\n }\n console.log(\"onUnload\");\n this.quill.off(\"text-change\", this.onInput);\n this.quill.off(\"selection-change\", this.onSelectionChange);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:\\\"Noto Serif\\\",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:\\\"Noto Serif SC\\\",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:\\\"Noto Serif TC\\\",serif}.ql-font-NotoSerifHongKong{font-family:\\\"Noto Serif HK\\\",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}\\n\")","import Quill, { Delta } from \"quill\";\nimport 'quill/dist/quill.core.css'\nimport './htmltext-editor.css';\nclass QuillManager {\n private static instance: QuillManager;\n private quill: Quill | null = null;\n public app_: any | null = null;\n\n private constructor() {}\n\n static getInstance() {\n if (!QuillManager.instance) {\n QuillManager.instance = new QuillManager();\n }\n return QuillManager.instance;\n }\n\n async init(app: any) {\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill\n\n }\n\n \n }\n\n getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n private registerFonts() {\n const FontAttributor: any = Quill.import(\"attributors/class/font\");\n FontAttributor.whitelist = [\n \"Roboto\",\n \"RobotoMono\",\n \"Inter\",\n \"OpenSans\",\n \"Montserrat\",\n \"RobotoCondensed\",\n \"Arimo\",\n \"NotoSans\",\n \"NotoSansSymbols\",\n \"Merriweather\",\n \"PlayfairDisplay\",\n \"NotoSerif\",\n \"Lato\",\n \"Spectral\",\n \"DancingScript\",\n \"NotoSansSimplifiedChinese\",\n \"NotoSerifSimplifiedChinese\",\n \"NotoSansTraditionalChinese\",\n \"NotoSansHongKong\",\n \"NotoSerifTraditionalChinese\",\n \"NotoSerifHongKong\",\n \"NotoSansJapanese\",\n \"NotoSansKorean\",\n \"Poppins\",\n ];\n Quill.register(FontAttributor, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const quillManager = QuillManager.getInstance();","import \"./TextEditTool\";\nimport \"./TextEditor\";\nexport * from \"./TextEditTool/index\"; // ✅ 去掉注释\nexport * from \"./QuillManager\";\nexport { TextEditor } from './TextEditor';\nexport { TextEditTool } from './TextEditTool' // ✅ 去掉注释\nconsole.log(111111)\nimport { Plugin } from '@leafer-ui/core';\nPlugin.add('text-editor', 'editor');"]}
@@ -0,0 +1,64 @@
1
+ import { EditTool, InnerEditor } from '@leafer-in/editor';
2
+ import Quill from 'quill';
3
+
4
+ declare class TextEditTool extends EditTool {
5
+ get tag(): string;
6
+ quill: any;
7
+ private updateBoxDebounced;
8
+ constructor(editor: any);
9
+ private debounce;
10
+ addEvent(): void;
11
+ onLoad(): void;
12
+ private isUpdatingPoints;
13
+ private curveAmount;
14
+ updateChangeBoxBound(text: any): void;
15
+ onUpdate(): void;
16
+ onUnload(): void;
17
+ onDestroy(): void;
18
+ }
19
+
20
+ declare class TextEditor extends InnerEditor {
21
+ get tag(): string;
22
+ editTarget: any;
23
+ editDom: any;
24
+ config: {
25
+ selectAll: boolean;
26
+ };
27
+ eventIds: any[];
28
+ protected selectText: {
29
+ start: number;
30
+ end: number;
31
+ text: string;
32
+ } | undefined;
33
+ protected inBody: boolean | undefined;
34
+ protected isHTMLText: boolean | undefined;
35
+ protected _keyEvent: boolean | undefined;
36
+ quill: any;
37
+ isComposing: boolean;
38
+ private misspelledWords;
39
+ private overlay;
40
+ private get isOASystem();
41
+ onLoad(): void;
42
+ private onSelectionChange;
43
+ private onInput;
44
+ onUpdate(): void;
45
+ private isUpdatingPoints;
46
+ onUnload(): void;
47
+ }
48
+
49
+ declare class QuillManager {
50
+ private static instance;
51
+ private quill;
52
+ app_: any | null;
53
+ private constructor();
54
+ static getInstance(): QuillManager;
55
+ init(app: any): Promise<Quill | undefined>;
56
+ getQuill(): Quill;
57
+ getCanvas(): any;
58
+ private registerFonts;
59
+ isMultiSelect(): boolean;
60
+ dateEdit(callback: (leaf: any) => void, level?: number, listNew?: any): void;
61
+ }
62
+ declare const quillManager: QuillManager;
63
+
64
+ export { TextEditTool, TextEditor, quillManager };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,51 @@
1
- import Quill from "quill";
2
- export { TextEditTool } from "./TextEditTool";
3
- export { TextEditor } from "./TextEditor";
1
+ import { EditTool, InnerEditor } from '@leafer-in/editor';
2
+ import Quill from 'quill';
3
+
4
+ declare class TextEditTool extends EditTool {
5
+ get tag(): string;
6
+ quill: any;
7
+ private updateBoxDebounced;
8
+ constructor(editor: any);
9
+ private debounce;
10
+ addEvent(): void;
11
+ onLoad(): void;
12
+ private isUpdatingPoints;
13
+ private curveAmount;
14
+ updateChangeBoxBound(text: any): void;
15
+ onUpdate(): void;
16
+ onUnload(): void;
17
+ onDestroy(): void;
18
+ }
19
+
20
+ declare class TextEditor extends InnerEditor {
21
+ get tag(): string;
22
+ editTarget: any;
23
+ editDom: any;
24
+ config: {
25
+ selectAll: boolean;
26
+ };
27
+ eventIds: any[];
28
+ protected selectText: {
29
+ start: number;
30
+ end: number;
31
+ text: string;
32
+ } | undefined;
33
+ protected inBody: boolean | undefined;
34
+ protected isHTMLText: boolean | undefined;
35
+ protected _keyEvent: boolean | undefined;
36
+ quill: any;
37
+ isComposing: boolean;
38
+ private misspelledWords;
39
+ private overlay;
40
+ private get isOASystem();
41
+ onLoad(): void;
42
+ private onSelectionChange;
43
+ private onInput;
44
+ onUpdate(): void;
45
+ private isUpdatingPoints;
46
+ onUnload(): void;
47
+ }
48
+
4
49
  declare class QuillManager {
5
50
  private static instance;
6
51
  private quill;
@@ -14,5 +59,6 @@ declare class QuillManager {
14
59
  isMultiSelect(): boolean;
15
60
  dateEdit(callback: (leaf: any) => void, level?: number, listNew?: any): void;
16
61
  }
17
- export declare const quillManager: QuillManager;
18
- //# sourceMappingURL=index.d.ts.map
62
+ declare const quillManager: QuillManager;
63
+
64
+ export { TextEditTool, TextEditor, quillManager };
package/dist/index.mjs ADDED
@@ -0,0 +1,4 @@
1
+ import {registerEditTool,registerInnerEditor,EditTool,EditorScaleEvent,InnerEditor}from'@leafer-in/editor';import {PointerEvent}from'leafer-ui';import {Plugin,PointerEvent as PointerEvent$1,Matrix}from'@leafer-ui/core';import x,{Delta}from'quill';import'quill/dist/quill.core.css';var w=(e,s,t,n)=>{for(var a=s,o=e.length-1,i;o>=0;o--)(i=e[o])&&(a=(i(a))||a);return a};var v=async(e,s,t)=>{let{scaleX:n,scaleY:a}=e.worldTransform,o=Math.max(Math.abs(n),Math.abs(a)),i=document.querySelector("#textInnerEditor");if(i&&e.data.textData?.fontFamily&&(i.style.fontFamily=e.data.textData.fontFamily),i&&e.data.textData?.fontSize&&(i.style.fontSize=`${e.data.textData.fontSize*o}px`),i&&e.data.textData?.lineHeight&&(i.style.lineHeight=e.data.textData.lineHeight),i&&e.data.textData?.letterSpacing&&(i.style.letterSpacing=`${e.data.textData.letterSpacing}px`),i&&e.data.textData?.textShadow?i.style.textShadow=e.data.textData.textShadow:i.style.textShadow="none",i&&e.data.textData?.alignContent){let r=i.querySelector(".ql-editor");r.style.alignContent=e.data.textData.alignContent;}let l=p.getQuill().getSemanticHTML();if(l==="<p></p>"){e.text.includes("<style>@font-face")?e.text=e.text.split("</style>")[0]+"</style>":e.text="";return}if(e.text.includes("<style>@font-face")){let r=e.text.split("</style>")[0];e.text=r+"</style>"+T(e,l,e.data.textData.fontSize,e.data.textData.lineHeight,e.data.textData.letterSpacing,e.data.textData.textShadow,e.data.textData?.alignContent);}else e.text=T(e,l,e.data.textData.fontSize,e.data.textData.lineHeight,e.data.textData.letterSpacing,e.data.textData.textShadow,e.data.textData?.alignContent);},T=(e,s,t=16,n="1.5",a="0",o="none",i="start")=>{let{scaleX:d,scaleY:l}=e.worldTransform,r=Math.max(Math.abs(d),Math.abs(l)),f=document.createElement("div");f.innerHTML=s;let u={fontSize:`${t}px`,lineHeight:n,letterSpacing:`${a}px`,textShadow:o};f.querySelectorAll("p,ol,ul").forEach(L=>{Object.assign(L.style,u);});let c=f.innerHTML;/<p\b[^>]*><\/p>/.test(c)&&(c=c.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>"));let g;document.querySelector("#textInnerEditor");let b=p.getQuill(),h=Number((b.scroll.domNode.scrollHeight/r).toFixed(0));Number((b.scroll.domNode.scrollWidth/r).toFixed(0));["center","end"].includes(e.data.textData.alignContent)?e.parent.height<h?g=(h||e.__layout.boxBounds.height)+"px":g=`${e.parent.height}px`:e.parent.height<h?g=(h||e.__layout.boxBounds.height)+"px":g=`${e.parent.height}px`;let q="<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>",m="";return e.parent.children[0].tag.includes("Shape")?m=q+`<div style="width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;">${c}</div>`:e.data.canChangeBox?m=q+`<div style="width: ${e.parent.width}px;height:${g};overflow-wrap:break-word;word-break:break-all;align-content:${i};">${c}</div>`:e.data.textData.italic?m=q+c:(console.log(h),m=q+`<div style="overflow-wrap:break-word;word-break:break-all;">${c}</div>`),console.log(m,"\u6700\u7EC8\u7684html\u5185\u5BB9"),m};var y=class extends EditTool{constructor(t){super(t);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(n=>{v(n);},300);}get tag(){return "TextEditTool"}debounce(t,n){let a=null;return((...o)=>{a!==null&&window.clearTimeout(a),a=window.setTimeout(()=>t.apply(this,o),n);})}addEvent(){let{editor:t}=p.getCanvas(),n=t._target.findOne("HTMLText"),{scaleX:a,scaleY:o}=n.worldTransform,i=Math.max(Math.abs(a),Math.abs(o)),d=document.querySelector("#textInnerEditor"),{style:l}=d;this.eventIds=[t.on_(EditorScaleEvent.SCALE,r=>{n.data.canChangeBox||(n.data.canChangeBox=true),n.data.canChangeBox&&(l.width=n.parent.width*i+"px",l.height="auto");let f=1;n.parent.tag==="Box"&&n.parent.lockRatio&&n.data?.baseSize?.width&&(f=n.parent.width/n.data?.baseSize.width,n.data.textData.fontSize=n.data.textData.fontSize*f),n.data?.baseSize?.width&&(n.data.baseSize.width=n.parent.width),this.updateBoxDebounced(n);}),t.on_(PointerEvent.DOUBLE_TAP,()=>{n.parent.locked||t.openInnerEditor(n,true);})];}onLoad(){let{editor:t}=p.getCanvas();console.log(t._target,123);let n=t._target.findOne("HTMLText"),{scaleX:a,scaleY:o}=n.worldTransform,i=Math.max(Math.abs(a),Math.abs(o));this.addEvent(),this.quill=p.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(n.text);let d=document.querySelector("#textInnerEditor"),{style:l}=d;n.data.canChangeBox?(l.width=n.parent.width*i+"px",l.height=n.parent.height*i+"px"):(l.width="auto",l.height="auto");}updateChangeBoxBound(t){t&&t.set({width:t.__layout.boxBounds.width,height:t.__layout.boxBounds.height});}onUpdate(){let {editor:t}=p.getCanvas(),n=t._target.findOne("HTMLText");t._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=n.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:t}=p.getCanvas();t.off_(this.eventIds);}onDestroy(){}};y=w([registerEditTool()],y);var S=class extends InnerEditor{constructor(){super(...arguments);this.config={selectAll:false};this.eventIds=[];this.selectText=void 0;this.inBody=void 0;this.isHTMLText=void 0;this._keyEvent=void 0;this.quill=null;this.isComposing=false;this.misspelledWords=[];this.overlay=null;this.onSelectionChange=async t=>{t&&localStorage.setItem("selection-change",JSON.stringify(t));};this.onInput=async()=>{let{editDom:t}=this;console.log("onInput"),v(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}get isOASystem(){return window.location.host.includes("oa")}onLoad(){let{editor:t}=this,{config:n}=t.app,a=this.editTarget,{scaleX:o,scaleY:i}=a.worldTransform,d=Math.max(Math.abs(o),Math.abs(i));this.isHTMLText=!(a instanceof Text),this._keyEvent=n.keyEvent,n.keyEvent=false;let l=this.editDom=document.querySelector("#textInnerEditor"),{style:r}=l;if(r.visibility="visible",a.data.canChangeBox?(r.width=a.parent.width*d+"px",r.height=a.parent.height*d+"px"):(r.width="auto",r.height="auto"),r.outline="solid #8499EF",a.data.textData.fontSize&&(console.log(a.data.textData.fontSize),l.style.fontSize=`${a.data.textData.fontSize}px`),a.data.textData.fontFamily&&(l.style.fontFamily=`${a.data.textData.fontFamily}`),a.data.textData.lineHeight&&(l.style.lineHeight=a.data.textData.lineHeight),a.data.textData.letterSpacing&&(l.style.letterSpacing=`${a.data.textData.letterSpacing}px`),a.data.textData.textShadow?l.style.textShadow=`${a.data.textData.textShadow}`:l.style.textShadow="none",a.data.textData.alignContent){let f=l.querySelector(".ql-editor");f.style.alignContent=`${a.data.textData.alignContent}`;}this.quill=p.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(a.text),a.parent.children[0].tag.includes("Shape")?(r.width=a.parent.width*d+"px",r.left="0px",this.quill.formatLine(0,this.quill.getLength(),"align","center")):this.quill.setSelection(0,this.quill.getLength()-1),this.quill.on("text-change",this.onInput),this.quill.on("selection-change",this.onSelectionChange),localStorage.removeItem("selection-change"),this.eventIds=[t.app.on_(PointerEvent$1.DOWN,f=>{let{target:u}=f.origin,c=false;for(;u;)u===l&&(c=true),u=u.parentElement;c||(t.closeInnerEditor(),t.cancel());})];}onUpdate(){let{editTarget:t}=this,{scaleX:n,scaleY:a}=t.worldTransform,o=Math.max(Math.abs(n),Math.abs(a)),{width:i,height:d}=t.parent.__local;i*=o,d*=o;let{x:l,y:r}=this.inBody?t.app.clientBounds:t.app.tree.clientBounds,{a:f,b:u,c,d:g,e:C,f:b}=new Matrix(t.worldTransform).scale(1/o).translateInner(0,0),{style:h}=this.editDom;h.transform=`matrix(${f},${u},${c},${g},${C},${b})`,h.left=l+"px",h.top=r+"px",t.set({visible:false});}onUnload(){let{editTarget:t,editor:n,editDom:a}=this;t&&(this.onInput(),n.app&&(n.app.config.keyEvent=this._keyEvent),n.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),t.parent&&t.parent.name=="Text"&&t.parent.children.some(o=>o.tag==="Box")?(t.parent.findOne("Box").opacity=1,t.visible=false):t.set({visible:true}),this.quill.getLength()===1&&t.parent.name==="Text"&&t.parent.remove(),console.log("onUnload"),this.quill.off("text-change",this.onInput),this.quill.off("selection-change",this.onSelectionChange);}};S=w([registerInnerEditor()],S);function D(e,{insertAt:s}={}){if(typeof document>"u")return;let t=document.head||document.getElementsByTagName("head")[0],n=document.createElement("style");n.type="text/css",s==="top"&&t.firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e));}D(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:"Noto Serif",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:"Noto Serif SC",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:"Noto Serif TC",serif}.ql-font-NotoSerifHongKong{font-family:"Noto Serif HK",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}
2
+ `);var M=class e{constructor(){this.quill=null;this.app_=null;}static getInstance(){return e.instance||(e.instance=new e),e.instance}async init(s){if(this.app_=s,this.quill)return this.quill;let t=document.getElementById("textInnerEditor");if(t)this.quill=this.app_.editor.quill;else return t=document.createElement("div"),t.id="textInnerEditor",t.style.position="fixed",t.style.transformOrigin="left top",t.style.overflowWrap="break-word",t.style.wordBreak="break-all",t.style.visibility="hidden",document.body.appendChild(t),this.quill=new x("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:n=>{let[a]=this.quill.getLine(n.index),o=x.import("blots/block");if(!o?.bubbleFormats)return true;let i=o.bubbleFormats(a),d=new Delta().retain(n.index).delete(n.length).insert(`
3
+ `,i);return this.quill.updateContents(d,x.sources.USER),this.quill.setSelection(n.index+1,x.sources.SILENT),false}}}}}}),this.app_.editor.quill=this.quill,this.registerFonts(),this.quill}getQuill(){if(!this.quill)throw new Error("Quill editor not initialized. Call init() first.");return this.quill}getCanvas(){if(!this.app_)throw new Error("app_ editor not initialized. Call init() first.");return this.app_}registerFonts(){let s=x.import("attributors/class/font");s.whitelist=["Roboto","RobotoMono","Inter","OpenSans","Montserrat","RobotoCondensed","Arimo","NotoSans","NotoSansSymbols","Merriweather","PlayfairDisplay","NotoSerif","Lato","Spectral","DancingScript","NotoSansSimplifiedChinese","NotoSerifSimplifiedChinese","NotoSansTraditionalChinese","NotoSansHongKong","NotoSerifTraditionalChinese","NotoSerifHongKong","NotoSansJapanese","NotoSansKorean","Poppins"],x.register(s,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(s,t=0,n){let{editor:a}=this.app_,o=n||a.leafList.list,i=d=>{t&&(d.tag==="Box"||d.name==="Text")?s(d.children?.[0]||d):s(d);};o.length&&(Array.isArray(o)&&o.length>1?(this.app_.lockLayout(),o.forEach(i),this.app_.unlockLayout(),a.updateEditBox()):i(o[0]));}},p=M.getInstance();console.log(111111);Plugin.add("text-editor","editor");export{y as TextEditTool,S as TextEditor,p as quillManager};//# sourceMappingURL=index.mjs.map
4
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts","../src/TextEditTool/index.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/QuillManager.ts","../src/index.ts"],"names":["updataHtmlText","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","quillManager","style","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","TextEditTool","EditTool","editor","text","func","wait","timeout","args","div","EditorScaleEvent","e","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","QuillManager","_QuillManager","app","el","Quill","range","line","BlockBlot","lineFormats","delta","Delta","FontAttributor","callback","level","listNew","list","applyCallback","leaf","Plugin"],"mappings":"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","file":"index.mjs","sourcesContent":["import { quillManager } from '.'\n// 更新text样式\nexport const updataHtmlText = async (e?: any, base64font?: any, fontObj?: any) => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const dom: any = document.querySelector('#textInnerEditor')\n if (dom && e.data.textData?.fontFamily) {\n dom.style.fontFamily = e.data.textData.fontFamily\n }\n if (dom && e.data.textData?.fontSize) {\n dom.style.fontSize = `${e.data.textData.fontSize * zoomScale}px`\n }\n if (dom && e.data.textData?.lineHeight) {\n dom.style.lineHeight = e.data.textData.lineHeight\n }\n if (dom && e.data.textData?.letterSpacing) {\n dom.style.letterSpacing = `${e.data.textData.letterSpacing}px`\n }\n if (dom && e.data.textData?.textShadow) {\n dom.style.textShadow = e.data.textData.textShadow\n } else {\n dom.style.textShadow = 'none'\n }\n if (dom && e.data.textData?.alignContent) {\n const qlEditor: any = dom.querySelector('.ql-editor')\n qlEditor.style.alignContent = e.data.textData.alignContent\n }\n // 如果是空的就把text滞空\n const quill = quillManager.getQuill()\n const html = quill.getSemanticHTML()\n if (html === '<p></p>') {\n if (e.text.includes('<style>@font-face')) {\n e.text = e.text.split('</style>')[0] + '</style>'\n } else {\n e.text = ''\n }\n return\n }\n if (e.text.includes('<style>@font-face')) {\n // text已经加载过字体\n const style = e.text.split('</style>')[0]\n if (fontObj && !style.includes(fontObj.code)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.code};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}`\n e.text =\n style +\n addStyle +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // 样式当前字体已经存在\n e.text =\n style +\n '</style>' +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n } else if (base64font && fontObj) {\n // 未加载过字体初次添加字体 存在base64font && fontObj才触发\n const style = `<style>@font-face {font-family: ${e.data.textData.fontFamily.split(',')[0]};src: url(${base64font}) format('woff2') } .ql-font-${fontObj?.code?.replace(/\\s+/g, '')} {font-family: ${fontObj.name};}</style>`\n e.text =\n style +\n addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n } else {\n // text没有包含字体就不加字体style\n e.text = addFontSizeToP(\n e,\n html,\n e.data.textData.fontSize,\n e.data.textData.lineHeight,\n e.data.textData.letterSpacing,\n e.data.textData.textShadow,\n e.data.textData?.alignContent\n )\n }\n}\nconst addFontSizeToP = (e: any, html: any, fontSize = 16, lineHeight = '1.5', letterSpacing = '0', textShadow = 'none', alignContent = 'start') => {\n const { scaleX, scaleY } = e.worldTransform\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY))\n const wrapper = document.createElement('div')\n wrapper.innerHTML = html\n // 添加的样式 用于HTMLText渲染\n const wrapperStyle: any = {\n fontSize: `${fontSize}px`,\n lineHeight,\n letterSpacing: `${letterSpacing}px`,\n textShadow\n }\n wrapper.querySelectorAll('p,ol,ul').forEach((p: any) => {\n Object.assign(p.style, wrapperStyle)\n })\n\n // 这个上下标还是要控制一下尺寸 因为html和canvas规范不一样 所以这里要控制一下 当然如果存在别的style例如color的style就合并style\n let str = wrapper.innerHTML\n // 排查如果有回车换行的加上一个字符\n if (/<p\\b[^>]*><\\/p>/.test(str)) {\n str = str.replace(/<p\\b([^>]*)><\\/p>/g, '<p$1>&nbsp;</p>')\n }\n let height\n const div: any = document.querySelector('#textInnerEditor')\n const quill = quillManager.getQuill()\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number((quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0))\n const actualWidth = Number((quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0))\n if (['center', 'end'].includes(e.data.textData.alignContent)) {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n } else {\n if (e.parent.height < actualHeight) {\n height = (actualHeight || e.__layout.boxBounds.height) + 'px'\n } else {\n height = `${e.parent.height}px`\n }\n }\n\n // 水平居中相关样式内嵌 因为这个quill居中用的class没用style\n const style = `<style>p{margin:0;}sub,sup{font-size:63%;}.ql-ui{position:absolute}ol,ul{counter-reset:list-0;padding-left:1.5em;margin:0}ol>li,ul>li{counter-increment:list-0;list-style-type:none;position:relative;padding-left:0;margin:0}ol>li::before{content:counter(list-0,decimal) '. ';position:absolute;left:-1.5em;width:1.2em;text-align:right}ul>li::before{content:'\\u2022';position:absolute;left:-1.5em;width:1.2em;text-align:right}li[data-list]{counter-set:list-1 list-2 list-3 list-4 list-5 list-6 list-7 list-8 list-9}.ql-align-center{text-align:center}.ql-align-right{text-align:right}.ql-align-left{text-align:left}.ql-align-justify{text-align:justify}</style>`\n let divBox = ''\n if (e.parent.children[0].tag.includes('Shape')) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height: ${e.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;\">${str}</div>`\n } else if (e.data.canChangeBox) {\n divBox =\n style +\n `<div style=\"width: ${e.parent.width}px;height:${height};overflow-wrap:break-word;word-break:break-all;align-content:${alignContent};\">${str}</div>`\n } else {\n // 斜体补偿宽度 控制\n if (e.data.textData.italic) {\n divBox = style + str\n } else {\n console.log(actualHeight)\n divBox = style + `<div style=\"overflow-wrap:break-word;word-break:break-all;\">${str}</div>`\n }\n }\n console.log(divBox, '最终的html内容')\n return divBox\n}\nexport const setHTMLText = (key: string, value?: any, base64font?: any) => {\n const quill = quillManager.getQuill()\n const { editor, canvas } = quillManager.getCanvas()\n console.log(editor, quillManager.getCanvas(), 'editor')\n if (!quill) {\n return\n }\n const range = JSON.parse(localStorage.getItem('selection-change') || '{}')\n\n quillManager.dateEdit(async (e: any) => {\n if (key === 'font') {\n const fontSimpleName = value.code.replace(/\\s+/g, '')\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, fontSimpleName)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n }\n updataHtmlText(e, base64font ?? null, value ?? null)\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, fontSimpleName)\n updataHtmlText(e, base64font ?? null, value ?? null)\n }\n } else if (key === 'fontSize') {\n // 字体和字号\n e.data.textData[key] = value\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n updataHtmlText(e, base64font ?? null)\n } else if (key === 'textCase') {\n // 大小写\n if (editor.innerEditing) {\n const text = quill.getText(range.index, range.length)\n const formats = quill.getFormat(range.index, range.length)\n quill.deleteText(range.index, range.length)\n let convertedText\n if (text === text.toUpperCase() && /[A-Z]/.test(text)) {\n convertedText = text.toLowerCase()\n } else if (text === text.toLowerCase() && /[a-z]/.test(text)) {\n convertedText = text.toUpperCase()\n } else {\n convertedText = text.toUpperCase()\n }\n\n quill.insertText(range.index, convertedText, formats)\n range && editor.innerEditing && quill.setSelection(range.index, range.length)\n }\n } else if (key === 'script') {\n // 上下标\n let val = 'sub'\n if (value === 'super') val = 'sup'\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, quill.getFormat(range).script === value ? false : val)\n } else {\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, quill.getFormat().script === value ? false : val)\n updataHtmlText(e)\n }\n } else if (key === 'align') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n quill.format(key, value)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n updataHtmlText(e)\n } else if (key === 'alignContent') {\n // 水平居中\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'color') {\n // 颜色\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, value)\n if (e.tag === 'HTMLText') {\n updataHtmlText(e)\n } else if (e.parent.findOne('HTMLText')) {\n updataHtmlText(e.parent.findOne('HTMLText'))\n }\n } else if (key === 'textShadow') {\n // 阴影\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n e.data.textData[key] = value\n updataHtmlText(e)\n } else if (key === 'list') {\n // 有序无序列表\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n if (editor.innerEditing) {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.format(key, false)\n } else {\n quill.format(key, value)\n }\n } else {\n const [line]: any = quill.getLine(range?.index || 0)\n if (line.formats().list) {\n quill.formatLine(0, quill.getLength(), key, false)\n } else {\n quill.formatLine(0, quill.getLength(), key, value)\n }\n }\n updataHtmlText(e)\n } else {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, !quill.getFormat(range)[key])\n } else {\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n }\n } else {\n quillManager.isMultiSelect() && quill.clipboard.dangerouslyPasteHTML(e.text)\n quill.formatText(0, quill.getLength() - 1, key, !quill.getFormat()[key])\n updataHtmlText(e)\n }\n }\n\n // if (e.parent.tag === 'Box' && e.parent.findOne('HTMLText') && e.parent.findOne('Box')) {\n // handleShowCurve(e.parent, false)\n // }\n }, 1)\n}\n","import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { quillManager } from \"../\";\nimport { updataHtmlText } from \"../utils\";\n@registerEditTool()\n// 定义插件类,继承自 EditTool,处理矩形圆角编辑交互\nexport class TextEditTool extends EditTool {\n // 插件标识标签\n public get tag() {\n return \"TextEditTool\";\n }\n public quill: any = null;\n private updateBoxDebounced: (text: any) => void;\n // 构造函数,初始化控制点并加入视图\n constructor(editor: any) {\n super(editor);\n this.eventIds = []; // 存储事件绑定ID\n this.updateBoxDebounced = this.debounce((text: any) => {\n updataHtmlText(text);\n }, 300);\n }\n // 自定义防抖函数替代 lodash/debounce\n private debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n ): T {\n let timeout: number | null = null;\n return ((...args: any[]) => {\n if (timeout !== null) {\n window.clearTimeout(timeout);\n }\n timeout = window.setTimeout(\n () => func.apply(this, args),\n wait,\n ) as unknown as number;\n }) as T;\n }\n // 绑定事件\n public addEvent(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n this.eventIds = [\n editor.on_(EditorScaleEvent.SCALE, (e: any) => {\n if (!text.data.canChangeBox) {\n text.data.canChangeBox = true;\n }\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = \"auto\";\n }\n let ratio = 1\n if (text.parent.tag === 'Box' && text.parent.lockRatio && text.data?.baseSize?.width) {\n ratio = text.parent.width / text.data?.baseSize.width\n text.data.textData.fontSize = text.data.textData.fontSize * ratio\n }\n // // 每次变动尺寸更新child的时候都要更新baseSize\n text.data?.baseSize?.width && (text.data.baseSize.width = text.parent.width)\n this.updateBoxDebounced(text);\n }),\n editor.on_(PointerEvent.DOUBLE_TAP, () => {\n if (!text.parent.locked) {\n editor.openInnerEditor(text, true);\n }\n }),\n ];\n }\n\n // 生命周期钩子:插件加载时绑定事件\n public onLoad(): void {\n const { editor } = quillManager.getCanvas();\n console.log(editor._target, 123);\n const text: any = editor._target.findOne(\"HTMLText\");\n\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n this.addEvent();\n this.quill = quillManager.getQuill();\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n const div: any = document.querySelector(\"#textInnerEditor\");\n const { style } = div;\n\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n // text.data.canChangeBox = false\n }\n\n private isUpdatingPoints = false;\n private curveAmount = 0;\n public updateChangeBoxBound(text: any): void {\n text &&\n text.set({\n width: text.__layout.boxBounds.width,\n height: text.__layout.boxBounds.height,\n });\n }\n // 生命周期钩子:插件更新时,因为这是全局的生命周期所以判断一定要细致仔细\n public onUpdate(): void {\n const { editor } = quillManager.getCanvas();\n const text = editor._target.findOne(\"HTMLText\");\n const el = editor._target;\n console.log(\"文本bound更新\");\n\n if (this.curveAmount == (text as any).curveAmount) return;\n if (this.isUpdatingPoints) return;\n // 每次进来就恢复初始的 canChangeBox 和 自动的宽高\n // text.set({\n // width: 0,\n // height: 0\n // })\n }\n\n // 生命周期钩子:插件卸载时解绑事件\n public onUnload(): void {\n const { editor } = quillManager.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { quillManager } from \".\";\nimport { updataHtmlText } from \"./utils\";\n@registerInnerEditor()\nexport class TextEditor extends InnerEditor {\n public get tag() {\n return \"TextEditor\";\n }\n declare public editTarget: any;\n\n public editDom: any;\n public config = {\n selectAll: false,\n };\n\n public eventIds: any[] = [];\n\n protected selectText:\n | { start: number; end: number; text: string }\n | undefined = undefined;\n protected inBody: boolean | undefined = undefined; // App 的 view 为 canvas 类型时,文本编辑框只能添加到 body 下了\n protected isHTMLText: boolean | undefined = undefined;\n protected _keyEvent: boolean | undefined = undefined;\n public quill: any = null;\n public isComposing: boolean = false;\n\n // 拼写检查相关属性\n private misspelledWords: Array<{\n word: string;\n offset: number;\n length: number;\n }> = [];\n private overlay: HTMLDivElement | null = null;\n\n // 判断是否为OA系统的属性\n private get isOASystem(): boolean {\n return window.location.host.includes(\"oa\");\n }\n public onLoad(): void {\n const { editor } = this;\n const { config } = editor.app;\n const text = this.editTarget;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n // text.textEditing = true\n\n this.isHTMLText = !(text instanceof Text); // HTMLText\n this._keyEvent = config.keyEvent;\n config.keyEvent = false;\n\n const div = (this.editDom = document.querySelector(\"#textInnerEditor\"));\n const { style } = div;\n style.visibility = \"visible\";\n\n // style.boxSizing = 'border-box'\n // 获取外部box的宽高 这个box也是可以手动调整的\n if (text.data.canChangeBox) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.height = text.parent.height * zoomScale + \"px\";\n } else {\n style.width = \"auto\";\n style.height = \"auto\";\n }\n\n // style.border = '1.5px solid #8499EF'\n style.outline = \"solid #8499EF\";\n\n // 初始化文本样式\n if (text.data.textData.fontSize) {\n console.log(text.data.textData.fontSize)\n div.style.fontSize = `${text.data.textData.fontSize}px`;\n }\n if (text.data.textData.fontFamily) {\n div.style.fontFamily = `${text.data.textData.fontFamily}`;\n }\n if (text.data.textData.lineHeight) {\n div.style.lineHeight = text.data.textData.lineHeight;\n }\n if (text.data.textData.letterSpacing) {\n div.style.letterSpacing = `${text.data.textData.letterSpacing}px`;\n }\n if (text.data.textData.textShadow) {\n div.style.textShadow = `${text.data.textData.textShadow}`;\n } else {\n div.style.textShadow = \"none\";\n }\n if (text.data.textData.alignContent) {\n const qlEditor: any = div.querySelector(\".ql-editor\");\n qlEditor.style.alignContent = `${text.data.textData.alignContent}`;\n }\n\n this.quill = quillManager.getQuill();\n\n // 加载文本到编辑器\n this.quill.clipboard.dangerouslyPasteHTML(text.text);\n // this.quill.focus()\n if (text.parent.children[0].tag.includes(\"Shape\")) {\n style.width = text.parent.width * zoomScale + \"px\";\n style.left = \"0px\";\n this.quill.formatLine(0, this.quill.getLength(), \"align\", \"center\");\n } else {\n this.quill.setSelection(0, this.quill.getLength() - 1);\n }\n\n // 获取整个编辑器容器的边界\n // const containerBounds = this.quill.container.getBoundingClientRect()\n this.quill.on(\"text-change\", this.onInput);\n this.quill.on(\"selection-change\", this.onSelectionChange);\n localStorage.removeItem(\"selection-change\");\n\n this.eventIds = [\n // 点击空白关闭\n editor.app.on_(PointerEvent.DOWN, (e: PointerEvent) => {\n let { target } = e.origin,\n find: boolean = false;\n while (target) {\n if (target === div) find = true;\n target = target.parentElement;\n }\n if (!find) {\n editor.closeInnerEditor();\n editor.cancel();\n }\n }),\n ];\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = false\n // canvas.app.editor.hittable = false\n }\n private onSelectionChange = async (e: any) => {\n e && localStorage.setItem(\"selection-change\", JSON.stringify(e));\n };\n\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\n console.log(\"onInput\");\n updataHtmlText(this.editTarget);\n // 获取当前文字编辑文字内容的边界 这里是在没有修改过外部尺寸的情况下 自适应文字编辑内容的尺寸\n // updateChangeBoxBound(this.editTarget)\n\n // 如果是清空了 width要从0改成auto\n // editDom.style.width = documentBounds.width ? documentBounds.width : 'auto'\n };\n\n public onUpdate() {\n const { editTarget: text } = this;\n const { scaleX, scaleY } = text.worldTransform;\n const zoomScale = Math.max(Math.abs(scaleX), Math.abs(scaleY));\n\n // layout\n let { width, height } = text.parent.__local;\n ((width *= zoomScale), (height *= zoomScale));\n\n const { x, y } = this.inBody\n ? text.app.clientBounds\n : text.app.tree.clientBounds;\n const { a, b, c, d, e, f } = new Matrix(text.worldTransform)\n .scale(1 / zoomScale)\n .translateInner(0, 0);\n\n const { style } = this.editDom;\n style.transform = `matrix(${a},${b},${c},${d},${e},${f})`;\n style.left = x + \"px\";\n style.top = y + \"px\";\n\n // 打开内部或者编辑内部文本编辑强制隐藏\n text.set({\n visible: false,\n });\n }\n private isUpdatingPoints = false;\n public onUnload(): void {\n const { editTarget: text, editor, editDom: dom } = this;\n // const { canvas } = useEditor()\n // canvas.app.config.move.drag = false\n // canvas.app.tree.hittable = true\n // canvas.app.editor.hittable = true\n if (text) {\n this.onInput();\n\n if (editor.app) editor.app.config.keyEvent = this._keyEvent;\n editor.off_(this.eventIds);\n\n // dom.remove()\n // this.editDom = this.eventIds = undefined\n this.editDom.style.visibility = \"hidden\";\n this.eventIds = [];\n }\n // 如果大于1\n if (\n text.parent &&\n text.parent.name == \"Text\" &&\n text.parent.children.some((e: any) => e.tag === \"Box\")\n ) {\n text.parent.findOne(\"Box\").opacity = 1;\n text.visible = false;\n } else {\n // 恢复显示\n text.set({\n visible: true,\n });\n }\n if (this.quill.getLength() === 1 && text.parent.name === \"Text\") {\n text.parent.remove();\n }\n console.log(\"onUnload\");\n this.quill.off(\"text-change\", this.onInput);\n this.quill.off(\"selection-change\", this.onSelectionChange);\n }\n}\n","\n export default function styleInject(css, { insertAt } = {}) {\n if (!css || typeof document === 'undefined') return\n \n const head = document.head || document.getElementsByTagName('head')[0]\n const style = document.createElement('style')\n style.type = 'text/css'\n \n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild)\n } else {\n head.appendChild(style)\n }\n } else {\n head.appendChild(style)\n }\n \n if (style.styleSheet) {\n style.styleSheet.cssText = css\n } else {\n style.appendChild(document.createTextNode(css))\n }\n }\n ","import styleInject from '#style-inject';styleInject(\".ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-editor p{margin:0!important}.ql-editor sub,.ql-editor sup{font-size:63%}.ql-editor sup{top:-.58em}.ql-editor sub{bottom:-.38em}.ql-editor ol{padding-left:0!important}.ql-font-Roboto{font-family:Roboto,sans-serif}.ql-font-RobotoMono{font-family:Roboto Mono,monospace}.ql-font-Inter{font-family:Inter,sans-serif}.ql-font-OpenSans{font-family:Open Sans,sans-serif}.ql-font-Montserrat{font-family:Montserrat,sans-serif}.ql-font-RobotoCondensed{font-family:Roboto Condensed,sans-serif}.ql-font-Arimo{font-family:Arimo,sans-serif}.ql-font-NotoSans{font-family:Noto Sans,sans-serif}.ql-font-NotoSansSymbols{font-family:Noto Sans Symbols,sans-serif}.ql-font-Merriweather{font-family:Merriweather,serif}.ql-font-PlayfairDisplay{font-family:Playfair Display,serif}.ql-font-NotoSerif{font-family:\\\"Noto Serif\\\",serif}.ql-font-Lato{font-family:Lato,sans-serif}.ql-font-Spectral{font-family:Spectral,serif}.ql-font-DancingScript{font-family:Dancing Script,cursive}.ql-font-NotoSansSimplifiedChinese{font-family:Noto Sans SC,sans-serif}.ql-font-NotoSerifSimplifiedChinese{font-family:\\\"Noto Serif SC\\\",serif}.ql-font-NotoSansTraditionalChinese{font-family:Noto Sans TC,sans-serif}.ql-font-NotoSansHongKong{font-family:Noto Sans HK,sans-serif}.ql-font-NotoSerifTraditionalChinese{font-family:\\\"Noto Serif TC\\\",serif}.ql-font-NotoSerifHongKong{font-family:\\\"Noto Serif HK\\\",serif}.ql-font-NotoSansJapanese{font-family:Noto Sans JP,sans-serif}.ql-font-NotoSansKorean{font-family:Noto Sans KR,sans-serif}.ql-font-Poppins{font-family:Poppins,sans-serif}\\n\")","import Quill, { Delta } from \"quill\";\nimport 'quill/dist/quill.core.css'\nimport './htmltext-editor.css';\nclass QuillManager {\n private static instance: QuillManager;\n private quill: Quill | null = null;\n public app_: any | null = null;\n\n private constructor() {}\n\n static getInstance() {\n if (!QuillManager.instance) {\n QuillManager.instance = new QuillManager();\n }\n return QuillManager.instance;\n }\n\n async init(app: any) {\n this.app_ = app;\n if (this.quill) return this.quill;\n\n let el = document.getElementById(\"textInnerEditor\");\n if (!el) {\n el = document.createElement(\"div\");\n el.id = \"textInnerEditor\";\n el.style.position = \"fixed\";\n el.style.transformOrigin = \"left top\";\n el.style.overflowWrap = \"break-word\";\n el.style.wordBreak = \"break-all\";\n el.style.visibility = \"hidden\";\n document.body.appendChild(el);\n this.quill = new Quill(\"#textInnerEditor\", {\n theme: undefined,\n modules: {\n toolbar: false,\n keyboard: {\n bindings: {\n enter: {\n key: \"Enter\",\n handler: (range: any) => {\n const [line] = this.quill!.getLine(range.index);\n const BlockBlot: any = Quill.import(\"blots/block\");\n if (!BlockBlot?.bubbleFormats) return true;\n\n const lineFormats = BlockBlot.bubbleFormats(line);\n const delta = new Delta()\n .retain(range.index)\n .delete(range.length)\n .insert(\"\\n\", lineFormats);\n\n this.quill!.updateContents(delta, Quill.sources.USER);\n this.quill!.setSelection(\n range.index + 1,\n Quill.sources.SILENT,\n );\n return false;\n },\n },\n },\n },\n },\n });\n this.app_.editor.quill = this.quill;\n this.registerFonts();\n return this.quill;\n } else {\n this.quill = this.app_.editor.quill\n\n }\n\n \n }\n\n getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n private registerFonts() {\n const FontAttributor: any = Quill.import(\"attributors/class/font\");\n FontAttributor.whitelist = [\n \"Roboto\",\n \"RobotoMono\",\n \"Inter\",\n \"OpenSans\",\n \"Montserrat\",\n \"RobotoCondensed\",\n \"Arimo\",\n \"NotoSans\",\n \"NotoSansSymbols\",\n \"Merriweather\",\n \"PlayfairDisplay\",\n \"NotoSerif\",\n \"Lato\",\n \"Spectral\",\n \"DancingScript\",\n \"NotoSansSimplifiedChinese\",\n \"NotoSerifSimplifiedChinese\",\n \"NotoSansTraditionalChinese\",\n \"NotoSansHongKong\",\n \"NotoSerifTraditionalChinese\",\n \"NotoSerifHongKong\",\n \"NotoSansJapanese\",\n \"NotoSansKorean\",\n \"Poppins\",\n ];\n Quill.register(FontAttributor, true);\n }\n // 判断是否是多选情况下\n public isMultiSelect(): boolean {\n if (!this.app_.editor) return false;\n if (this.app_.editor.multiple === true) {\n return true;\n } else {\n return false;\n }\n }\n public dateEdit(\n callback: (leaf: any) => void,\n level = 0,\n listNew?: any,\n ): void {\n // 添加listNew支持,用来指定检索的数据源,防止因为防抖或者延迟执行造成的活跃对象变更\n const { editor } = this.app_;\n const list = listNew ? listNew : editor.leafList.list;\n const applyCallback = (leaf: any) => {\n if (level && (leaf.tag === \"Box\" || leaf.name === \"Text\")) {\n callback(leaf.children?.[0] || leaf);\n } else {\n callback(leaf);\n }\n };\n if (!list.length) return;\n if (Array.isArray(list) && list.length > 1) {\n this.app_.lockLayout();\n list.forEach(applyCallback);\n this.app_.unlockLayout();\n editor.updateEditBox();\n } else {\n applyCallback(list[0]);\n }\n }\n}\n\nexport const quillManager = QuillManager.getInstance();","import \"./TextEditTool\";\nimport \"./TextEditor\";\nexport * from \"./TextEditTool/index\"; // ✅ 去掉注释\nexport * from \"./QuillManager\";\nexport { TextEditor } from './TextEditor';\nexport { TextEditTool } from './TextEditTool' // ✅ 去掉注释\nconsole.log(111111)\nimport { Plugin } from '@leafer-ui/core';\nPlugin.add('text-editor', 'editor');"]}
package/package.json CHANGED
@@ -1,15 +1,22 @@
1
1
  {
2
2
  "name": "@chenyomi/leafer-htmltext-editor",
3
- "version": "1.0.8",
3
+ "version": "1.0.10",
4
4
  "description": "A text editor plugin for Leafer UI with HTML text support and Quill integration",
5
- "main": "dist/index.js",
6
- "module": "dist/index.esm.js",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.mjs",
7
7
  "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "import": "./dist/index.mjs",
11
+ "require": "./dist/index.cjs",
12
+ "types": "./dist/index.d.ts"
13
+ }
14
+ },
15
+ "sideEffects": true,
8
16
  "scripts": {
9
- "build": "npm run build:cjs && npm run build:esm && npm run build:types",
10
- "build:cjs": "tsc --module commonjs --outDir dist",
11
- "build:esm": "tsc --module esnext --outDir dist/esm && mv dist/esm/index.js dist/index.esm.js",
12
- "build:types": "tsc --declaration --emitDeclarationOnly --outDir dist",
17
+ "build": "tsup",
18
+ "build:dev": "tsup --minify false",
19
+ "build:watch": "tsup --watch",
13
20
  "prepublishOnly": "npm run build"
14
21
  },
15
22
  "keywords": [
@@ -41,11 +48,12 @@
41
48
  "devDependencies": {
42
49
  "@types/lodash": "^4.17.23",
43
50
  "@types/node": "^20.0.0",
51
+ "rimraf": "^5.0.0",
52
+ "tsup": "^8.0.0",
44
53
  "typescript": "^5.0.0"
45
54
  },
46
55
  "files": [
47
56
  "dist",
48
- "src",
49
57
  "README.md",
50
58
  "LICENSE"
51
59
  ],
@@ -1,17 +0,0 @@
1
- import { EditTool } from "@leafer-in/editor";
2
- export declare class TextEditTool extends EditTool {
3
- get tag(): string;
4
- quill: any;
5
- private updateBoxDebounced;
6
- constructor(editor: any);
7
- private debounce;
8
- addEvent(): void;
9
- onLoad(): void;
10
- private isUpdatingPoints;
11
- private curveAmount;
12
- updateChangeBoxBound(text: any): void;
13
- onUpdate(): void;
14
- onUnload(): void;
15
- onDestroy(): void;
16
- }
17
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/TextEditTool/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EAGT,MAAM,mBAAmB,CAAC;AAK3B,qBAEa,YAAa,SAAQ,QAAQ;IAExC,IAAW,GAAG,WAEb;IACM,KAAK,EAAE,GAAG,CAAQ;IACzB,OAAO,CAAC,kBAAkB,CAAsB;gBAEpC,MAAM,EAAE,GAAG;IAQvB,OAAO,CAAC,QAAQ;IAgBT,QAAQ,IAAI,IAAI;IA2BhB,MAAM,IAAI,IAAI;IA4BrB,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAK;IACjB,oBAAoB,CAAC,IAAI,EAAE,GAAG,GAAG,IAAI;IAQrC,QAAQ,IAAI,IAAI;IAgBhB,QAAQ,IAAI,IAAI;IAMhB,SAAS,IAAI,IAAI;CACzB"}