@chenyomi/leafer-htmltext-edit 2.1.5 → 2.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -96,7 +96,6 @@ module.exports = {
96
96
  };
97
97
  ```
98
98
 
99
-
100
99
  ### 在 Vue 3 中使用
101
100
 
102
101
  ```vue
@@ -114,15 +113,16 @@ import {
114
113
  setHTMLText,
115
114
  HtmlText,
116
115
  } from "@chenyomi/leafer-htmltext-edit";
117
- // 1. 设置 License(必须在 init 之前)
118
- const licenseKey = "授权请联系作者";
119
- const success = setLicense(licenseKey);
120
116
 
121
- if (!success) {
122
- console.error("License validation failed");
123
- // 可以显示错误提示给用户
124
- }
125
- onMounted(() => {
117
+ onMounted(async () => {
118
+ // 1. 设置 License(必须在 init 之前)
119
+ const licenseKey = "授权请联系作者";
120
+ const success = await setLicense(licenseKey);
121
+
122
+ if (!success) {
123
+ console.error("License validation failed");
124
+ // 可以显示错误提示给用户
125
+ }
126
126
  const leafer = new App({
127
127
  view: "leafer-view",
128
128
  fill: "#ffffff",
@@ -310,6 +310,7 @@ setHTMLText("fontSize", 24, null, editor, false);
310
310
  ```typescript
311
311
  import { setHTMLText } from "@chenyomi/leafer-htmltext-edit";
312
312
  ```
313
+
313
314
  ```html
314
315
  <button @click="setHTMLText('bold')">加粗</button>
315
316
  <button @click="setHTMLText('italic')">斜体</button>
@@ -437,9 +438,13 @@ quill.setContents([
437
438
  ## 🔤 支持的字体
438
439
 
439
440
  ### 自定义字体(重要‼️)
441
+
440
442
  ### 编辑器分为内部编辑器和外部编辑器
443
+
441
444
  ### 内部编辑器的字体要在当前项目加载好
445
+
442
446
  ### 外部编辑器的字体要在下面的方式传入base64用于显示Html转成Svg内嵌的字体
447
+
443
448
  ```typescript
444
449
  import { HtmlTextManage } from "@chenyomi/leafer-htmltext-edit";
445
450
 
@@ -447,12 +452,10 @@ import { HtmlTextManage } from "@chenyomi/leafer-htmltext-edit";
447
452
  const quill = HtmlTextManage.getQuill();
448
453
 
449
454
  const fontFamily = '"Dancing Script", cursive';
450
- const fontBase64 = "字体的base64编码"
455
+ const fontBase64 = "字体的base64编码";
451
456
  setHTMLText("font", fontFamily, fontBase64);
452
-
453
457
  ```
454
458
 
455
-
456
459
  ### TypeScript 配置
457
460
 
458
461
  确保 `tsconfig.json` 包含正确的类型定义:
@@ -485,7 +488,7 @@ npm install
485
488
 
486
489
  ### 构建
487
490
 
488
- ```bash
491
+ ````bash
489
492
  # 生产构建(混淆压缩)
490
493
  npm run build
491
494
 
@@ -498,7 +501,7 @@ A: 插件的 CSS 会自动注入,无需手动导入。如果遇到样式问题
498
501
 
499
502
  ```typescript
500
503
  import "quill/dist/quill.core.css";
501
- ```
504
+ ````
502
505
 
503
506
  ### Q: 为什么编辑器不显示?
504
507
 
package/dist/index.cjs CHANGED
@@ -1,5 +1,4 @@
1
- 'use strict';var editor=require('@leafer-in/editor'),leaferUi=require('leafer-ui'),core=require('@leafer-ui/core'),S=require('quill');require('quill/dist/quill.core.css');var font=require('quill/formats/font'),html=require('@leafer-in/html');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var S__default=/*#__PURE__*/_interopDefault(S);var y=(t,n,i,e)=>{for(var a=n,s=t.length-1,o;s>=0;s--)(o=t[s])&&(a=(o(a))||a);return a};var f=async(t,n,i)=>{let{scaleX:e,scaleY:a}=t.worldTransform,s=Math.max(Math.abs(e),Math.abs(a)),o=document.querySelector("#textInnerEditor");if(o&&t.data.textData?.fontSize&&(o.style.fontSize=`${t.data.textData.fontSize*s}px`),o&&t.data.textData?.lineHeight&&(o.style.lineHeight=t.data.textData.lineHeight),o&&t.data.textData?.letterSpacing&&(o.style.letterSpacing=`${t.data.textData.letterSpacing}px`),o&&t.data.textData?.textShadow?o.style.textShadow=t.data.textData.textShadow:o.style.textShadow="none",o&&t.data.textData?.alignContent){let c=o.querySelector(".ql-editor");c.style.alignContent=t.data.textData.alignContent;}let r=d.getQuill().getSemanticHTML();if(r==="<p></p>"){t.text.includes("<style>@font-face")?t.text=t.text.split("</style>")[0]+"</style>":t.text="";return}if(t.text.includes("<style>@font-face")){let c=t.text.split("</style>")[0];if(i&&!c.includes(i)){let u=`@font-face {font-family: ${i.split(",")[0]};src: url(${n}) format('woff2') }</style>`;t.text=c+u+T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=c+"</style>"+T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else if(n&&i){let c=`<style>@font-face {font-family: ${i.split(",")[0]};src: url(${n}) format('woff2') }</style>`;t.text=c+T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},T=(t,n,i=20.67,e=1.5,a=0,s="none",o="start")=>{let{scaleX:l,scaleY:r}=t.worldTransform,c=Math.max(Math.abs(l),Math.abs(r)),u=document.createElement("div");u.innerHTML=n;let g={fontSize:`${i}px`,lineHeight:e,letterSpacing:`${a}px`,textShadow:s};u.querySelectorAll("p,ol,ul").forEach($=>{Object.assign($.style,g);});let p=u.innerHTML;/<p\b[^>]*><\/p>/.test(p)&&(p=p.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>")),/&quot;/.test(p)&&(p=p.replace(/&quot;/g,""));let x;document.querySelector("#textInnerEditor");let L=d.getQuill(),h=Number((L.scroll.domNode.scrollHeight/c).toFixed(0));Number((L.scroll.domNode.scrollWidth/c).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<h?x=(h||t.__layout.boxBounds.height)+"px":x=`${t.parent.height}px`:t.parent.height<h?x=(h||t.__layout.boxBounds.height)+"px":x=`${t.parent.height}px`;let w="<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 t.parent.children[0].tag.includes("Shape")?m=w+`<div style="width: ${t.parent.width}px;height: ${t.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;">${p}</div>`:t.data.canChangeBox?m=w+`<div style="width: ${t.parent.width}px;height:${x};overflow-wrap:break-word;word-break:break-all;align-content:${o};">${p}</div>`:t.data.textData.italic?m=w+p:m=w+`<div style="overflow-wrap:break-word;word-break:break-all;">${p}</div>`,console.log(m,"\u6700\u7EC8\u7684html\u5185\u5BB9"),m},dt=(t,n,i)=>{let e=d.getQuill(),{editor:a,canvas:s}=d.getCanvas();if(!e)return;let o=e.selection.savedRange;d.dateEdit(async l=>{if(t==="font")a.innerEditing?(o&&o.length?e.formatText(o.index,o.length,t,n):e.formatText(0,e.getLength()-1,t,n),l.data.textData.fontFamily=n,f(l,i??null,n??null)):(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,n),l.data.textData.fontFamily=n,f(l,i??null,n??null));else if(t==="fontSize")l.data.textData[t]=n,d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),f(l,i??null);else if(t==="textCase"){if(a.innerEditing){let r=e.getText(o.index,o.length),c=e.getFormat(o.index,o.length);e.deleteText(o.index,o.length);let u;r===r.toUpperCase()&&/[A-Z]/.test(r)?u=r.toLowerCase():(r===r.toLowerCase()&&/[a-z]/.test(r),u=r.toUpperCase()),e.insertText(o.index,u,c),o&&a.innerEditing&&e.setSelection(o.index,o.length);}}else if(t==="script"){let r="sub";n==="super"&&(r="sup"),a.innerEditing?o&&o.length?e.formatText(o.index,o.length,t,e.getFormat(o).script===n?false:r):e.formatText(0,e.getLength()-1,t,e.getFormat().script===n?false:r):(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,e.getFormat().script===n?false:r),f(l));}else if(t==="align")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),a.innerEditing?e.format(t,n):e.formatLine(0,e.getLength(),t,n),f(l);else if(t==="alignContent")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=n,f(l);else if(t==="lineHeight"||t==="letterSpacing")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=n,f(l);else if(t==="color")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),o&&o.length?e.formatText(o.index,o.length,t,n):e.formatText(0,e.getLength()-1,t,n),l.tag==="HTMLText"?f(l):l.parent.findOne("HTMLText")&&f(l.parent.findOne("HTMLText"));else if(t==="textShadow")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=n,f(l);else if(t==="list"){if(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),a.innerEditing){let[r]=e.getLine(o?.index||0);r.formats().list?e.format(t,false):e.format(t,n);}else {let[r]=e.getLine(o?.index||0);r.formats().list?e.formatLine(0,e.getLength(),t,false):e.formatLine(0,e.getLength(),t,n);}f(l);}else a.innerEditing?o&&o.length?e.formatText(o.index,o.length,t,n===void 0?!e.getFormat(o)[t]:n):e.formatText(0,e.getLength()-1,t,n===void 0?!e.getFormat()[t]:n):(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,n===void 0?!e.getFormat()[t]:n),f(l));},1);};var v=class extends editor.EditTool{constructor(i){super(i);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(e=>{f(e);},300);}get tag(){return "TextEditTool"}debounce(i,e){let a=null;return((...s)=>{a!==null&&window.clearTimeout(a),a=window.setTimeout(()=>i.apply(this,s),e);})}addEvent(){let{editor:i}=d.getCanvas(),e=i._target.findOne("HTMLText"),{scaleX:a,scaleY:s}=e.worldTransform,o=Math.max(Math.abs(a),Math.abs(s)),l=document.querySelector("#textInnerEditor"),{style:r}=l;this.eventIds=[i.on_(editor.EditorScaleEvent.SCALE,c=>{e.data.canChangeBox||(e.data.canChangeBox=true),e.data.canChangeBox&&(r.width=e.parent.width*o+"px",r.height="auto");let u=1;e.parent.tag==="HtmlText"&&e.parent.lockRatio&&e.data?.baseSize?.width&&(u=e.parent.width/e.data?.baseSize.width,e.data.textData.fontSize=e.data.textData.fontSize*u),e.data?.baseSize?.width&&(e.data.baseSize.width=e.parent.width),this.updateBoxDebounced(e);}),i.on_(leaferUi.PointerEvent.DOUBLE_TAP,()=>{e.parent.locked||i.openInnerEditor(e,true);})];}onLoad(){let{editor:i}=d.getCanvas();console.log(i._target,123);let e=i._target.findOne("HTMLText"),{scaleX:a,scaleY:s}=e.worldTransform,o=Math.max(Math.abs(a),Math.abs(s));this.addEvent(),this.quill=d.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(e.text);let l=document.querySelector("#textInnerEditor"),{style:r}=l;e.data.canChangeBox?(r.width=e.parent.width*o+"px",r.height=e.parent.height*o+"px"):(r.width="auto",r.height="auto");}updateChangeBoxBound(i){i&&i.set({width:i.__layout.boxBounds.width,height:i.__layout.boxBounds.height});}onUpdate(){let {editor:i}=d.getCanvas(),e=i._target.findOne("HTMLText");i._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=e.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:i}=d.getCanvas();i.off_(this.eventIds);}onDestroy(){}};v=y([editor.registerEditTool()],v);var D=class 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.onInput=async()=>{let{editDom:i}=this;f(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}onLoad(){let{editor:i}=this,{config:e}=i.app,a=this.editTarget,{scaleX:s,scaleY:o}=a.worldTransform,l=Math.max(Math.abs(s),Math.abs(o));this.isHTMLText=!(a instanceof Text),this._keyEvent=e.keyEvent,e.keyEvent=false;let r=this.editDom=document.querySelector("#textInnerEditor"),{style:c}=r;if(c.visibility="visible",a.data.canChangeBox?(c.width=a.parent.width*l+"px",c.height=a.parent.height*l+"px"):(c.width="auto",c.height="auto"),c.outline="solid #8499EF",a.data.textData.fontSize&&(r.style.fontSize=`${a.data.textData.fontSize*l}px`),a.data.textData.lineHeight&&(r.style.lineHeight=a.data.textData.lineHeight),a.data.textData.letterSpacing&&(r.style.letterSpacing=`${a.data.textData.letterSpacing}px`),a.data.textData.textShadow?r.style.textShadow=`${a.data.textData.textShadow}`:r.style.textShadow="none",a.data.textData.alignContent){let u=r.querySelector(".ql-editor");u.style.alignContent=`${a.data.textData.alignContent}`;}this.quill=d.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(a.text),a.parent.children[0].tag.includes("Shape")?(c.width=a.parent.width*l+"px",c.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.eventIds=[i.app.on_(core.PointerEvent.DOWN,u=>{let{target:g}=u.origin,p=false;for(;g;)g===r&&(p=true),g=g.parentElement;p||(i.closeInnerEditor(),i.cancel());})];}onUpdate(){let{editTarget:i}=this,{scaleX:e,scaleY:a}=i.worldTransform,s=Math.max(Math.abs(e),Math.abs(a)),{width:o,height:l}=i.parent.__local;o*=s,l*=s;let{x:r,y:c}=this.inBody?i.app.clientBounds:i.app.tree.clientBounds,{a:u,b:g,c:p,d:x,e:U,f:L}=new core.Matrix(i.worldTransform).scale(1/s).translateInner(0,0),{style:h}=this.editDom;h.transform=`matrix(${u},${g},${p},${x},${U},${L})`,h.left=r+"px",h.top=c+"px",i.set({visible:false});}onUnload(){let{editTarget:i,editor:e,editDom:a}=this;i&&(this.onInput(),e.app&&(e.app.config.keyEvent=this._keyEvent),e.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),i.parent&&i.parent.name=="Text"&&i.parent.children.some(s=>s.tag==="Box")?(i.parent.findOne("Box").opacity=1,i.visible=false):i.set({visible:true}),this.quill.getLength()===1&&i.parent.name==="Text"&&i.parent.remove(),this.quill.off("text-change",this.onInput);}};D=y([editor.registerInnerEditor()],D);function C(t,{insertAt:n}={}){if(typeof document>"u")return;let i=document.head||document.getElementsByTagName("head")[0],e=document.createElement("style");e.type="text/css",n==="top"&&i.firstChild?i.insertBefore(e,i.firstChild):i.appendChild(e),e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t));}C(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.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}
2
- `);var F="LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFxaUFnU1hWM3dMKzh2YkZ2OVkwQwpEN1dBUjhPa2I4bjlmTWxpQjF3enZodTBrdVdZUWEvMUxvVDhHWVh6WWlRQVFBRk9zTTA0MGp2dlNRT2hRSWpiCjRaYXZ1NHUvWVA5bElPYjFKYnZnYkFoYVVOQnphL0l2UmFnaFlKYTJBc1cyRVhnZkVrdmMyUENNMS9zbVlFNnoKNjZiUmx1dnREK3FJZkpLVCtUUXJRRmp5TnNTZ0c2Z2R4MThrZTRMSStBejFPcklMbUsyMHlBU2tlRXpYT1BTVAplM3RNYThleHpZdmUzV0wyNHRHUHg5WHNvN1JyUEl1elZlajh0NDYrZ0c1Y0pQaVh0N1lqa0V2NEJOUUt5eUpoCkltOVRJdVZ6clFpa2NJNE14dExNSGdUMHpLcU9ZZ1NzcmEvTHNDd2ZOdzdtYWxITkU2c21YZWYyQ2E5RGhZODQKS1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==";function O(t){let n=t.replace(/-----BEGIN PUBLIC KEY-----/,"").replace(/-----END PUBLIC KEY-----/,"").replace(/\s/g,"");return P(n)}function P(t){let n=atob(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n.charCodeAt(e);return i.buffer}async function J(){let t=atob(F),n=O(t);return await crypto.subtle.importKey("spki",n,{name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},false,["verify"])}async function z(t,n){try{let i=await J(),e=new TextEncoder().encode(t),a=P(n);return await crypto.subtle.verify("RSASSA-PKCS1-v1_5",i,a,e)}catch(i){return console.error("[RSA] Signature verification failed:",i),false}}async function j(t){try{let n=atob(t),i=JSON.parse(n);if(!i.data||!i.signature)return console.error("[License] Invalid license format"),null;if(!await z(i.data,i.signature))return console.error("[License] Invalid signature - License may be tampered or forged"),null;let a=JSON.parse(i.data);return console.log("[License] Signature verified successfully"),a}catch(n){return console.error("[License] Failed to parse license:",n),null}}function X(t){if(!t||t.length===0)return true;let n=window.location.hostname;if(n==="localhost"||n==="127.0.0.1")return console.log("[License] Local development environment detected"),true;let i=t.some(e=>{if(e.startsWith("*.")){let a=e.slice(2);return n.endsWith(a)}return n===e});return i||(console.error(`[License] Domain not authorized: ${n}`),console.error("[License] Allowed domains:",t)),i}function G(t){if(!t)return true;try{let n=new Date(t),i=new Date;if(i>=n)return console.error(`[License] License has expired on ${t}`),!1;let e=Math.ceil((n.getTime()-i.getTime())/(1e3*60*60*24));return e<=7&&console.warn(`[License] License will expire in ${e} days`),!0}catch{return console.error("[License] Invalid expire date format:",t),false}}function tt(t){if(!t)return true;try{return new Date(t)>new Date?(console.error("[License] License issue date is in the future"),!1):!0}catch{return true}}async function H(t){try{let n=await j(t);return n?tt(n.issueDate)?X(n.domains)?G(n.expireDate)?(console.log("[License] All validations passed"),console.log("[License] License info:",{key:n.key,domains:n.domains,expireDate:n.expireDate,features:n.features}),{valid:!0,data:n}):{valid:!1,error:"License has expired",data:n}:{valid:!1,error:`License not valid for domain: ${window.location.hostname}`,data:n}:{valid:!1,error:"Invalid license issue date",data:n}:{valid:!1,error:"Invalid license key or signature verification failed"}}catch(n){return console.error("[License] Validation error:",n),{valid:false,error:"License validation failed"}}}var E=null,M=null,b=false;async function et(t){console.log("[License] Activating license...");let n=await H(t);return n.valid&&n.data?(E=t,M=n.data,b=true,console.log("[License] \u2705 License activated successfully"),console.log(`[License] Valid until: ${n.data.expireDate||"unlimited"}`),true):(E=null,M=null,b=false,console.error("[License] \u274C License activation failed:",n.error),false)}async function I(){if(!E)return console.warn("[License] No license key provided"),false;if(!b)return console.warn("[License] License is not valid"),false;let t=await H(E);return b=t.valid,b||(console.error("[License] License validation failed:",t.error),M=null),b}function nt(){return M}var B=class t{constructor(){this.quill=null;this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(n){if(!await I())throw new Error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=n,this.quill)return this.quill;let e=document.getElementById("textInnerEditor");if(e)this.quill=this.app_.editor.quill;else return e=document.createElement("div"),e.id="textInnerEditor",e.style.position="fixed",e.style.transformOrigin="left top",e.style.overflowWrap="break-word",e.style.wordBreak="break-all",e.style.visibility="hidden",document.body.appendChild(e),this.quill=new S__default.default("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:a=>{let[s]=this.quill.getLine(a.index),o=S__default.default.import("blots/block");if(!o?.bubbleFormats)return true;let l=o.bubbleFormats(s),r=new S.Delta().retain(a.index).delete(a.length).insert(`
3
- `,l);return this.quill.updateContents(r,S__default.default.sources.USER),this.quill.setSelection(a.index+1,S__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_}getSelection(){return console.log(this.quill?.selection.savedRange,"this.quill?.selection.savedRange"),this.quill?.selection.savedRange}registerFonts(){font.FontStyle.whitelist=void 0,S__default.default.register("formats/font",font.FontStyle,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(n,i=0,e){let{editor:a}=this.app_,s=e||a.leafList.list,o=l=>{i&&(l.tag==="Box"||l.name==="Text")?n(l.children?.[0]||l):n(l);};s.length&&(Array.isArray(s)&&s.length>1?(this.app_.lockLayout(),s.forEach(o),this.app_.unlockLayout(),a.updateEditBox()):o(s[0]));}},d=B.getInstance();exports.HtmlText=class q extends core.Box{get __tag(){return "HtmlText"}constructor(n){let{text:i,fontSize:e,fontFamily:a,lineHeight:s,letterSpacing:o,textShadow:l,alignContent:r,...c}=n||{};super({editOuter:"TextEditTool",name:"HtmlText",x:0,y:0,editable:true,draggable:true,overflow:"show",...c}),n&&this.createTextElement(n);}createTextElement(n){let{text:i,fontSize:e,fontFamily:a,lineHeight:s,letterSpacing:o,textShadow:l,alignContent:r}=n,c="<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>",u=`<div style="ove
4
- rflow-wrap:break-word;word-break:break-all;"><p style="font-size: ${e}px; line-height: ${s}; letter-spacing: ${o}px; text-shadow: ${l};"><strong>Hello World</strong></p></div>`,g=new html.HTMLText({name:"Text",text:c+(i||u),x:0,y:0,data:{canChangeBox:false,textData:{fontFamily:a,fontSize:e,lineHeight:s,letterSpacing:o||0,textShadow:l,alignContent:r}},editConfig:{selectedStyle:{strokeWidth:0}}});this.add(g);}};exports.HtmlText=y([core.registerUI()],exports.HtmlText);exports.checkLicense=I;exports.getLicenseInfo=nt;exports.htmlTextManage=d;exports.setHTMLText=dt;exports.setLicense=et;exports.updataHtmlText=f;//# sourceMappingURL=index.cjs.map
5
- //# sourceMappingURL=index.cjs.map
1
+ 'use strict';var editor=require('@leafer-in/editor'),leaferUi=require('leafer-ui'),core=require('@leafer-ui/core'),y=require('quill');require('quill/dist/quill.core.css');var font=require('quill/formats/font'),x=require('crypto-js'),html=require('@leafer-in/html');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var y__default=/*#__PURE__*/_interopDefault(y);var x__default=/*#__PURE__*/_interopDefault(x);var f=async(t,e,n)=>{let{scaleX:i,scaleY:o}=t.worldTransform,l=Math.max(Math.abs(i),Math.abs(o)),a=document.querySelector("#textInnerEditor");if(a&&t.data.textData?.fontSize&&(a.style.fontSize=`${t.data.textData.fontSize*l}px`),a&&t.data.textData?.lineHeight&&(a.style.lineHeight=t.data.textData.lineHeight),a&&t.data.textData?.letterSpacing&&(a.style.letterSpacing=`${t.data.textData.letterSpacing}px`),a&&t.data.textData?.textShadow?a.style.textShadow=t.data.textData.textShadow:a.style.textShadow="none",a&&t.data.textData?.alignContent){let d=a.querySelector(".ql-editor");d.style.alignContent=t.data.textData.alignContent;}let s=c.getQuill().getSemanticHTML();if(s==="<p></p>"){t.text.includes("<style>@font-face")?t.text=t.text.split("</style>")[0]+"</style>":t.text="";return}if(t.text.includes("<style>@font-face")){let d=t.text.split("</style>")[0];if(n&&!d.includes(n)){let u=`@font-face {font-family: ${n.split(",")[0]};src: url(${e}) format('woff2') }</style>`;t.text=d+u+T(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=d+"</style>"+T(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else if(e&&n){let d=`<style>@font-face {font-family: ${n.split(",")[0]};src: url(${e}) format('woff2') }</style>`;t.text=d+T(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=T(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},T=(t,e,n=20.67,i=1.5,o=0,l="none",a="start")=>{let{scaleX:r,scaleY:s}=t.worldTransform,d=Math.max(Math.abs(r),Math.abs(s)),u=document.createElement("div");u.innerHTML=e;let L={fontSize:`${n}px`,lineHeight:i,letterSpacing:`${o}px`,textShadow:l};u.querySelectorAll("p,ol,ul").forEach(N=>{Object.assign(N.style,L);});let p=u.innerHTML;/<p\b[^>]*><\/p>/.test(p)&&(p=p.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>")),/&quot;/.test(p)&&(p=p.replace(/&quot;/g,""));let h;document.querySelector("#textInnerEditor");let B=c.getQuill(),w=Number((B.scroll.domNode.scrollHeight/d).toFixed(0));Number((B.scroll.domNode.scrollWidth/d).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<w?h=(w||t.__layout.boxBounds.height)+"px":h=`${t.parent.height}px`:t.parent.height<w?h=(w||t.__layout.boxBounds.height)+"px":h=`${t.parent.height}px`;let b="<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>",g="";return t.parent.children[0].tag.includes("Shape")?g=b+`<div style="width: ${t.parent.width}px;height: ${t.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;">${p}</div>`:t.data.canChangeBox?g=b+`<div style="width: ${t.parent.width}px;height:${h};overflow-wrap:break-word;word-break:break-all;align-content:${a};">${p}</div>`:t.data.textData.italic?g=b+p:g=b+`<div style="overflow-wrap:break-word;word-break:break-all;">${p}</div>`,console.log(g,"\u6700\u7EC8\u7684html\u5185\u5BB9"),g},St=(t,e,n)=>{let i=c.getQuill(),{editor:o,canvas:l}=c.getCanvas();if(!i)return;let a=i.selection.savedRange;c.dateEdit(async r=>{if(t==="font")o.innerEditing?(a&&a.length?i.formatText(a.index,a.length,t,e):i.formatText(0,i.getLength()-1,t,e),r.data.textData.fontFamily=e,f(r,n??null,e??null)):(c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),i.formatText(0,i.getLength()-1,t,e),r.data.textData.fontFamily=e,f(r,n??null,e??null));else if(t==="fontSize")r.data.textData[t]=e,c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),f(r,n??null);else if(t==="textCase"){if(o.innerEditing){let s=i.getText(a.index,a.length),d=i.getFormat(a.index,a.length);i.deleteText(a.index,a.length);let u;s===s.toUpperCase()&&/[A-Z]/.test(s)?u=s.toLowerCase():(s===s.toLowerCase()&&/[a-z]/.test(s),u=s.toUpperCase()),i.insertText(a.index,u,d),a&&o.innerEditing&&i.setSelection(a.index,a.length);}}else if(t==="script"){let s="sub";e==="super"&&(s="sup"),o.innerEditing?a&&a.length?i.formatText(a.index,a.length,t,i.getFormat(a).script===e?false:s):i.formatText(0,i.getLength()-1,t,i.getFormat().script===e?false:s):(c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),i.formatText(0,i.getLength()-1,t,i.getFormat().script===e?false:s),f(r));}else if(t==="align")c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),o.innerEditing?i.format(t,e):i.formatLine(0,i.getLength(),t,e),f(r);else if(t==="alignContent")c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),r.data.textData[t]=e,f(r);else if(t==="lineHeight"||t==="letterSpacing")c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),r.data.textData[t]=e,f(r);else if(t==="color")c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),a&&a.length?i.formatText(a.index,a.length,t,e):i.formatText(0,i.getLength()-1,t,e),r.tag==="HTMLText"?f(r):r.parent.findOne("HTMLText")&&f(r.parent.findOne("HTMLText"));else if(t==="textShadow")c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),r.data.textData[t]=e,f(r);else if(t==="list"){if(c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),o.innerEditing){let[s]=i.getLine(a?.index||0);s.formats().list?i.format(t,false):i.format(t,e);}else {let[s]=i.getLine(a?.index||0);s.formats().list?i.formatLine(0,i.getLength(),t,false):i.formatLine(0,i.getLength(),t,e);}f(r);}else o.innerEditing?a&&a.length?i.formatText(a.index,a.length,t,e===void 0?!i.getFormat(a)[t]:e):i.formatText(0,i.getLength()-1,t,e===void 0?!i.getFormat()[t]:e):(c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),i.formatText(0,i.getLength()-1,t,e===void 0?!i.getFormat()[t]:e),f(r));},1);};var Y=(t,e,n,i)=>{for(var o=e,l=t.length-1,a;l>=0;l--)(a=t[l])&&(o=(a(o))||o);return o},H=class extends editor.EditTool{constructor(t){super(t),this.quill=null,this.isUpdatingPoints=false,this.curveAmount=0,this.eventIds=[],this.updateBoxDebounced=this.debounce(e=>{f(e);},300);}get tag(){return "TextEditTool"}debounce(t,e){let n=null;return((...i)=>{n!==null&&window.clearTimeout(n),n=window.setTimeout(()=>t.apply(this,i),e);})}addEvent(){let{editor:t}=c.getCanvas(),e=t._target.findOne("HTMLText"),{scaleX:n,scaleY:i}=e.worldTransform,o=Math.max(Math.abs(n),Math.abs(i)),l=document.querySelector("#textInnerEditor"),{style:a}=l;this.eventIds=[t.on_(editor.EditorScaleEvent.SCALE,r=>{e.data.canChangeBox||(e.data.canChangeBox=true),e.data.canChangeBox&&(a.width=e.parent.width*o+"px",a.height="auto");let s=1;e.parent.tag==="HtmlText"&&e.parent.lockRatio&&e.data?.baseSize?.width&&(s=e.parent.width/e.data?.baseSize.width,e.data.textData.fontSize=e.data.textData.fontSize*s),e.data?.baseSize?.width&&(e.data.baseSize.width=e.parent.width),this.updateBoxDebounced(e);}),t.on_(leaferUi.PointerEvent.DOUBLE_TAP,()=>{e.parent.locked||t.openInnerEditor(e,true);})];}onLoad(){let{editor:t}=c.getCanvas();console.log(t._target,123);let e=t._target.findOne("HTMLText"),{scaleX:n,scaleY:i}=e.worldTransform,o=Math.max(Math.abs(n),Math.abs(i));this.addEvent(),this.quill=c.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(e.text);let l=document.querySelector("#textInnerEditor"),{style:a}=l;e.data.canChangeBox?(a.width=e.parent.width*o+"px",a.height=e.parent.height*o+"px"):(a.width="auto",a.height="auto");}updateChangeBoxBound(t){t&&t.set({width:t.__layout.boxBounds.width,height:t.__layout.boxBounds.height});}onUpdate(){let {editor:t}=c.getCanvas(),e=t._target.findOne("HTMLText");t._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=e.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:t}=c.getCanvas();t.off_(this.eventIds);}onDestroy(){}};H=Y([editor.registerEditTool()],H);var k=(t,e,n,i)=>{for(var o=e,l=t.length-1,a;l>=0;l--)(a=t[l])&&(o=(a(o))||o);return o},_=class 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.onInput=async()=>{let{editDom:t}=this;f(this.editTarget);},this.isUpdatingPoints=false;}get tag(){return "TextEditor"}onLoad(){let{editor:t}=this,{config:e}=t.app,n=this.editTarget,{scaleX:i,scaleY:o}=n.worldTransform,l=Math.max(Math.abs(i),Math.abs(o));this.isHTMLText=!(n instanceof Text),this._keyEvent=e.keyEvent,e.keyEvent=false;let a=this.editDom=document.querySelector("#textInnerEditor"),{style:r}=a;if(r.visibility="visible",n.data.canChangeBox?(r.width=n.parent.width*l+"px",r.height=n.parent.height*l+"px"):(r.width="auto",r.height="auto"),r.outline="solid #8499EF",n.data.textData.fontSize&&(a.style.fontSize=`${n.data.textData.fontSize*l}px`),n.data.textData.lineHeight&&(a.style.lineHeight=n.data.textData.lineHeight),n.data.textData.letterSpacing&&(a.style.letterSpacing=`${n.data.textData.letterSpacing}px`),n.data.textData.textShadow?a.style.textShadow=`${n.data.textData.textShadow}`:a.style.textShadow="none",n.data.textData.alignContent){let s=a.querySelector(".ql-editor");s.style.alignContent=`${n.data.textData.alignContent}`;}this.quill=c.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(n.text),n.parent.children[0].tag.includes("Shape")?(r.width=n.parent.width*l+"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.eventIds=[t.app.on_(core.PointerEvent.DOWN,s=>{let{target:d}=s.origin,u=false;for(;d;)d===a&&(u=true),d=d.parentElement;u||(t.closeInnerEditor(),t.cancel());})];}onUpdate(){let{editTarget:t}=this,{scaleX:e,scaleY:n}=t.worldTransform,i=Math.max(Math.abs(e),Math.abs(n)),{width:o,height:l}=t.parent.__local;o*=i,l*=i;let{x:a,y:r}=this.inBody?t.app.clientBounds:t.app.tree.clientBounds,{a:s,b:d,c:u,d:L,e:p,f:h}=new core.Matrix(t.worldTransform).scale(1/i).translateInner(0,0),{style:S}=this.editDom;S.transform=`matrix(${s},${d},${u},${L},${p},${h})`,S.left=a+"px",S.top=r+"px",t.set({visible:false});}onUnload(){let{editTarget:t,editor:e,editDom:n}=this;t&&(this.onInput(),e.app&&(e.app.config.keyEvent=this._keyEvent),e.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),t.parent&&t.parent.name=="Text"&&t.parent.children.some(i=>i.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(),this.quill.off("text-change",this.onInput);}};_=k([editor.registerInnerEditor()],_);function D(t,{insertAt:e}={}){if(typeof document>"u")return;let n=document.head||document.getElementsByTagName("head")[0],i=document.createElement("style");i.type="text/css",e==="top"&&n.firstChild?n.insertBefore(i,n.firstChild):n.appendChild(i),i.styleSheet?i.styleSheet.cssText=t:i.appendChild(document.createTextNode(t));}D(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.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}
2
+ `);var U="LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFxaUFnU1hWM3dMKzh2YkZ2OVkwQwpEN1dBUjhPa2I4bjlmTWxpQjF3enZodTBrdVdZUWEvMUxvVDhHWVh6WWlRQVFBRk9zTTA0MGp2dlNRT2hRSWpiCjRaYXZ1NHUvWVA5bElPYjFKYnZnYkFoYVVOQnphL0l2UmFnaFlKYTJBc1cyRVhnZkVrdmMyUENNMS9zbVlFNnoKNjZiUmx1dnREK3FJZkpLVCtUUXJRRmp5TnNTZ0c2Z2R4MThrZTRMSStBejFPcklMbUsyMHlBU2tlRXpYT1BTVAplM3RNYThleHpZdmUzV0wyNHRHUHg5WHNvN1JyUEl1elZlajh0NDYrZ0c1Y0pQaVh0N1lqa0V2NEJOUUt5eUpoCkltOVRJdVZ6clFpa2NJNE14dExNSGdUMHpLcU9ZZ1NzcmEvTHNDd2ZOdzdtYWxITkU2c21YZWYyQ2E5RGhZODQKS1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==";function it(t){let e=t.replace(/-----BEGIN PUBLIC KEY-----/,"").replace(/-----END PUBLIC KEY-----/,"").replace(/\s/g,"");return F(e)}function F(t){let e=atob(t),n=new Uint8Array(e.length);for(let i=0;i<e.length;i++)n[i]=e.charCodeAt(i);return n.buffer}async function nt(){let t=atob(U),e=it(t);return await crypto.subtle.importKey("spki",e,{name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},false,["verify"])}async function A(t,e){try{let n=await nt(),i=new TextEncoder().encode(t),o=F(e);return await crypto.subtle.verify("RSASSA-PKCS1-v1_5",n,o,i)}catch(n){return console.error("[RSA] Signature verification failed:",n),false}}var P="c19496eb17719960b6c3cebab0ef5eddfce5d0315ab8c5af86a52fbda434fea9",I="ce1e3e8974f1392b3c5803b34ecf659f";function z(t){try{let e=x__default.default.enc.Hex.parse(P),n=x__default.default.enc.Hex.parse(I),o=x__default.default.AES.decrypt(t,e,{iv:n,mode:x__default.default.mode.CBC,padding:x__default.default.pad.Pkcs7}).toString(x__default.default.enc.Utf8);if(!o)throw new Error("Decryption resulted in empty string - invalid ciphertext or wrong key");return o}catch(e){throw console.error("[AES] Decryption failed:",e),e}}async function at(t){try{let e=atob(t),n=JSON.parse(e);if(!n.data||!n.signature||!await A(n.data,n.signature))return null;let o=n.data;if(n.encrypted)try{o=z(n.data);}catch{return null}return JSON.parse(o)}catch{return null}}function ot(t){if(!t||t.length===0)return true;let e=window.location.hostname;if(e==="localhost"||e==="127.0.0.1")return console.log("[License] Local development environment detected"),true;let n=t.some(i=>{if(i.startsWith("*.")){let o=i.slice(2);return e.endsWith(o)}return e===i});return n||(console.error(`[License] Domain not authorized: ${e}`),console.error("[License] Allowed domains:",t)),n}function rt(t){if(!t)return true;try{let e=new Date(t),n=new Date;if(n>=e)return console.error(`[License] License has expired on ${t}`),!1;let i=Math.ceil((e.getTime()-n.getTime())/(1e3*60*60*24));return i<=7&&console.warn(`[License] License will expire in ${i} days`),!0}catch{return console.error("[License] Invalid expire date format:",t),false}}function lt(t){if(!t)return true;try{return new Date(t)>new Date?(console.error("[License] License issue date is in the future"),!1):!0}catch{return true}}async function C(t){try{let e=await at(t);return e?lt(e.issueDate)?ot(e.domains)?rt(e.expireDate)?(console.log("[License] License info:",{key:e.key,domains:e.domains,expireDate:e.expireDate,features:e.features}),{valid:!0,data:e}):{valid:!1,error:"License has expired",data:e}:{valid:!1,error:`License not valid for domain: ${window.location.hostname}`,data:e}:{valid:!1,error:"Invalid license issue date",data:e}:{valid:!1,error:"Invalid license key or signature verification failed"}}catch(e){return console.error("[License] Validation error:",e),{valid:false,error:"License validation failed"}}}var E=null,v=null,m=false;async function st(t){console.log("[License] Activating license...");let e=await C(t);return e.valid&&e.data?(E=t,v=e.data,m=true,console.log("[License] \u2705 License activated successfully"),console.log(`[License] Valid until: ${e.data.expireDate||"unlimited"}`),true):(E=null,v=null,m=false,console.error("[License] \u274C License activation failed:",e.error),false)}async function M(){if(!E)return console.warn("[License] No license key provided"),false;if(!m)return console.warn("[License] License is not valid"),false;let t=await C(E);return m=t.valid,m||(console.error("[License] License validation failed:",t.error),v=null),m}function ct(){return v}var q=class t{constructor(){this.quill=null,this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(e){if(!await M())throw new Error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=e,this.quill)return this.quill;let i=document.getElementById("textInnerEditor");if(i)this.quill=this.app_.editor.quill;else return i=document.createElement("div"),i.id="textInnerEditor",i.style.position="fixed",i.style.transformOrigin="left top",i.style.overflowWrap="break-word",i.style.wordBreak="break-all",i.style.visibility="hidden",document.body.appendChild(i),this.quill=new y__default.default("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:o=>{let[l]=this.quill.getLine(o.index),a=y__default.default.import("blots/block");if(!a?.bubbleFormats)return true;let r=a.bubbleFormats(l),s=new y.Delta().retain(o.index).delete(o.length).insert(`
3
+ `,r);return this.quill.updateContents(s,y__default.default.sources.USER),this.quill.setSelection(o.index+1,y__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_}getSelection(){return console.log(this.quill?.selection.savedRange,"this.quill?.selection.savedRange"),this.quill?.selection.savedRange}registerFonts(){font.FontStyle.whitelist=void 0,y__default.default.register("formats/font",font.FontStyle,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(e,n=0,i){let{editor:o}=this.app_,l=i||o.leafList.list,a=r=>{n&&(r.tag==="Box"||r.name==="Text")?e(r.children?.[0]||r):e(r);};l.length&&(Array.isArray(l)&&l.length>1?(this.app_.lockLayout(),l.forEach(a),this.app_.unlockLayout(),o.updateEditBox()):a(l[0]));}},c=q.getInstance();var pt=(t,e,n,i)=>{for(var o=e,l=t.length-1,a;l>=0;l--)(a=t[l])&&(o=(a(o))||o);return o};exports.HtmlText=class R extends core.Box{get __tag(){return "HtmlText"}constructor(t){let{text:e,fontSize:n,fontFamily:i,lineHeight:o,letterSpacing:l,textShadow:a,alignContent:r,...s}=t||{};super({editOuter:"TextEditTool",name:"HtmlText",x:0,y:0,editable:true,draggable:true,overflow:"show",...s}),t&&this.createTextElement(t);}createTextElement(t){let{text:e,fontSize:n,fontFamily:i,lineHeight:o,letterSpacing:l,textShadow:a,alignContent:r}=t,s="<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>",d=`<div style="ove
4
+ rflow-wrap:break-word;word-break:break-all;"><p style="font-size: ${n}px; line-height: ${o}; letter-spacing: ${l}px; text-shadow: ${a};"><strong>Hello World</strong></p></div>`,u=new html.HTMLText({name:"Text",text:s+(e||d),x:0,y:0,data:{canChangeBox:false,textData:{fontFamily:i,fontSize:n,lineHeight:o,letterSpacing:l||0,textShadow:a,alignContent:r}},editConfig:{selectedStyle:{strokeWidth:0}}});this.add(u);}};exports.HtmlText=pt([core.registerUI()],exports.HtmlText);exports.checkLicense=M;exports.getLicenseInfo=ct;exports.htmlTextManage=c;exports.setHTMLText=St;exports.setLicense=st;exports.updataHtmlText=f;
package/dist/index.d.mts CHANGED
@@ -39,12 +39,13 @@ declare class HtmlText extends Box {
39
39
  }
40
40
 
41
41
  /**
42
- * License 验证器 V2 (RSA 签名版本)
42
+ * License 验证器 V3 (RSA 签名 + AES 加密双重验证版本)
43
43
  *
44
44
  * 主要改进:
45
- * 1. 使用 RSA 签名防止 License 伪造
46
- * 2. 保留原有的域名和过期时间验证
47
- * 3. 向后兼容旧版 License
45
+ * 1. 使用 AES-256-CBC 加密 License 数据
46
+ * 2. 使用 RSA 签名防止 License 伪造
47
+ * 3. 保留原有的域名和过期时间验证
48
+ * 4. 向后兼容旧版 License (仅 RSA 签名)
48
49
  */
49
50
  interface LicenseData {
50
51
  key: string;
package/dist/index.d.ts CHANGED
@@ -39,12 +39,13 @@ declare class HtmlText extends Box {
39
39
  }
40
40
 
41
41
  /**
42
- * License 验证器 V2 (RSA 签名版本)
42
+ * License 验证器 V3 (RSA 签名 + AES 加密双重验证版本)
43
43
  *
44
44
  * 主要改进:
45
- * 1. 使用 RSA 签名防止 License 伪造
46
- * 2. 保留原有的域名和过期时间验证
47
- * 3. 向后兼容旧版 License
45
+ * 1. 使用 AES-256-CBC 加密 License 数据
46
+ * 2. 使用 RSA 签名防止 License 伪造
47
+ * 3. 保留原有的域名和过期时间验证
48
+ * 4. 向后兼容旧版 License (仅 RSA 签名)
48
49
  */
49
50
  interface LicenseData {
50
51
  key: string;
package/dist/index.mjs CHANGED
@@ -1,5 +1,4 @@
1
- import {registerEditTool,registerInnerEditor,EditTool,EditorScaleEvent,InnerEditor}from'@leafer-in/editor';import {PointerEvent}from'leafer-ui';import {registerUI,Box,PointerEvent as PointerEvent$1,Matrix}from'@leafer-ui/core';import S,{Delta}from'quill';import'quill/dist/quill.core.css';import {FontStyle}from'quill/formats/font';import {HTMLText}from'@leafer-in/html';var y=(t,n,i,e)=>{for(var a=n,s=t.length-1,o;s>=0;s--)(o=t[s])&&(a=(o(a))||a);return a};var f=async(t,n,i)=>{let{scaleX:e,scaleY:a}=t.worldTransform,s=Math.max(Math.abs(e),Math.abs(a)),o=document.querySelector("#textInnerEditor");if(o&&t.data.textData?.fontSize&&(o.style.fontSize=`${t.data.textData.fontSize*s}px`),o&&t.data.textData?.lineHeight&&(o.style.lineHeight=t.data.textData.lineHeight),o&&t.data.textData?.letterSpacing&&(o.style.letterSpacing=`${t.data.textData.letterSpacing}px`),o&&t.data.textData?.textShadow?o.style.textShadow=t.data.textData.textShadow:o.style.textShadow="none",o&&t.data.textData?.alignContent){let c=o.querySelector(".ql-editor");c.style.alignContent=t.data.textData.alignContent;}let r=d.getQuill().getSemanticHTML();if(r==="<p></p>"){t.text.includes("<style>@font-face")?t.text=t.text.split("</style>")[0]+"</style>":t.text="";return}if(t.text.includes("<style>@font-face")){let c=t.text.split("</style>")[0];if(i&&!c.includes(i)){let u=`@font-face {font-family: ${i.split(",")[0]};src: url(${n}) format('woff2') }</style>`;t.text=c+u+T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=c+"</style>"+T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else if(n&&i){let c=`<style>@font-face {font-family: ${i.split(",")[0]};src: url(${n}) format('woff2') }</style>`;t.text=c+T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=T(t,r,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},T=(t,n,i=20.67,e=1.5,a=0,s="none",o="start")=>{let{scaleX:l,scaleY:r}=t.worldTransform,c=Math.max(Math.abs(l),Math.abs(r)),u=document.createElement("div");u.innerHTML=n;let g={fontSize:`${i}px`,lineHeight:e,letterSpacing:`${a}px`,textShadow:s};u.querySelectorAll("p,ol,ul").forEach($=>{Object.assign($.style,g);});let p=u.innerHTML;/<p\b[^>]*><\/p>/.test(p)&&(p=p.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>")),/&quot;/.test(p)&&(p=p.replace(/&quot;/g,""));let x;document.querySelector("#textInnerEditor");let L=d.getQuill(),h=Number((L.scroll.domNode.scrollHeight/c).toFixed(0));Number((L.scroll.domNode.scrollWidth/c).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<h?x=(h||t.__layout.boxBounds.height)+"px":x=`${t.parent.height}px`:t.parent.height<h?x=(h||t.__layout.boxBounds.height)+"px":x=`${t.parent.height}px`;let w="<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 t.parent.children[0].tag.includes("Shape")?m=w+`<div style="width: ${t.parent.width}px;height: ${t.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;">${p}</div>`:t.data.canChangeBox?m=w+`<div style="width: ${t.parent.width}px;height:${x};overflow-wrap:break-word;word-break:break-all;align-content:${o};">${p}</div>`:t.data.textData.italic?m=w+p:m=w+`<div style="overflow-wrap:break-word;word-break:break-all;">${p}</div>`,console.log(m,"\u6700\u7EC8\u7684html\u5185\u5BB9"),m},dt=(t,n,i)=>{let e=d.getQuill(),{editor:a,canvas:s}=d.getCanvas();if(!e)return;let o=e.selection.savedRange;d.dateEdit(async l=>{if(t==="font")a.innerEditing?(o&&o.length?e.formatText(o.index,o.length,t,n):e.formatText(0,e.getLength()-1,t,n),l.data.textData.fontFamily=n,f(l,i??null,n??null)):(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,n),l.data.textData.fontFamily=n,f(l,i??null,n??null));else if(t==="fontSize")l.data.textData[t]=n,d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),f(l,i??null);else if(t==="textCase"){if(a.innerEditing){let r=e.getText(o.index,o.length),c=e.getFormat(o.index,o.length);e.deleteText(o.index,o.length);let u;r===r.toUpperCase()&&/[A-Z]/.test(r)?u=r.toLowerCase():(r===r.toLowerCase()&&/[a-z]/.test(r),u=r.toUpperCase()),e.insertText(o.index,u,c),o&&a.innerEditing&&e.setSelection(o.index,o.length);}}else if(t==="script"){let r="sub";n==="super"&&(r="sup"),a.innerEditing?o&&o.length?e.formatText(o.index,o.length,t,e.getFormat(o).script===n?false:r):e.formatText(0,e.getLength()-1,t,e.getFormat().script===n?false:r):(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,e.getFormat().script===n?false:r),f(l));}else if(t==="align")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),a.innerEditing?e.format(t,n):e.formatLine(0,e.getLength(),t,n),f(l);else if(t==="alignContent")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=n,f(l);else if(t==="lineHeight"||t==="letterSpacing")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=n,f(l);else if(t==="color")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),o&&o.length?e.formatText(o.index,o.length,t,n):e.formatText(0,e.getLength()-1,t,n),l.tag==="HTMLText"?f(l):l.parent.findOne("HTMLText")&&f(l.parent.findOne("HTMLText"));else if(t==="textShadow")d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),l.data.textData[t]=n,f(l);else if(t==="list"){if(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),a.innerEditing){let[r]=e.getLine(o?.index||0);r.formats().list?e.format(t,false):e.format(t,n);}else {let[r]=e.getLine(o?.index||0);r.formats().list?e.formatLine(0,e.getLength(),t,false):e.formatLine(0,e.getLength(),t,n);}f(l);}else a.innerEditing?o&&o.length?e.formatText(o.index,o.length,t,n===void 0?!e.getFormat(o)[t]:n):e.formatText(0,e.getLength()-1,t,n===void 0?!e.getFormat()[t]:n):(d.isMultiSelect()&&e.clipboard.dangerouslyPasteHTML(l.text),e.formatText(0,e.getLength()-1,t,n===void 0?!e.getFormat()[t]:n),f(l));},1);};var v=class extends EditTool{constructor(i){super(i);this.quill=null;this.isUpdatingPoints=false;this.curveAmount=0;this.eventIds=[],this.updateBoxDebounced=this.debounce(e=>{f(e);},300);}get tag(){return "TextEditTool"}debounce(i,e){let a=null;return((...s)=>{a!==null&&window.clearTimeout(a),a=window.setTimeout(()=>i.apply(this,s),e);})}addEvent(){let{editor:i}=d.getCanvas(),e=i._target.findOne("HTMLText"),{scaleX:a,scaleY:s}=e.worldTransform,o=Math.max(Math.abs(a),Math.abs(s)),l=document.querySelector("#textInnerEditor"),{style:r}=l;this.eventIds=[i.on_(EditorScaleEvent.SCALE,c=>{e.data.canChangeBox||(e.data.canChangeBox=true),e.data.canChangeBox&&(r.width=e.parent.width*o+"px",r.height="auto");let u=1;e.parent.tag==="HtmlText"&&e.parent.lockRatio&&e.data?.baseSize?.width&&(u=e.parent.width/e.data?.baseSize.width,e.data.textData.fontSize=e.data.textData.fontSize*u),e.data?.baseSize?.width&&(e.data.baseSize.width=e.parent.width),this.updateBoxDebounced(e);}),i.on_(PointerEvent.DOUBLE_TAP,()=>{e.parent.locked||i.openInnerEditor(e,true);})];}onLoad(){let{editor:i}=d.getCanvas();console.log(i._target,123);let e=i._target.findOne("HTMLText"),{scaleX:a,scaleY:s}=e.worldTransform,o=Math.max(Math.abs(a),Math.abs(s));this.addEvent(),this.quill=d.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(e.text);let l=document.querySelector("#textInnerEditor"),{style:r}=l;e.data.canChangeBox?(r.width=e.parent.width*o+"px",r.height=e.parent.height*o+"px"):(r.width="auto",r.height="auto");}updateChangeBoxBound(i){i&&i.set({width:i.__layout.boxBounds.width,height:i.__layout.boxBounds.height});}onUpdate(){let {editor:i}=d.getCanvas(),e=i._target.findOne("HTMLText");i._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=e.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:i}=d.getCanvas();i.off_(this.eventIds);}onDestroy(){}};v=y([registerEditTool()],v);var D=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.onInput=async()=>{let{editDom:i}=this;f(this.editTarget);};this.isUpdatingPoints=false;}get tag(){return "TextEditor"}onLoad(){let{editor:i}=this,{config:e}=i.app,a=this.editTarget,{scaleX:s,scaleY:o}=a.worldTransform,l=Math.max(Math.abs(s),Math.abs(o));this.isHTMLText=!(a instanceof Text),this._keyEvent=e.keyEvent,e.keyEvent=false;let r=this.editDom=document.querySelector("#textInnerEditor"),{style:c}=r;if(c.visibility="visible",a.data.canChangeBox?(c.width=a.parent.width*l+"px",c.height=a.parent.height*l+"px"):(c.width="auto",c.height="auto"),c.outline="solid #8499EF",a.data.textData.fontSize&&(r.style.fontSize=`${a.data.textData.fontSize*l}px`),a.data.textData.lineHeight&&(r.style.lineHeight=a.data.textData.lineHeight),a.data.textData.letterSpacing&&(r.style.letterSpacing=`${a.data.textData.letterSpacing}px`),a.data.textData.textShadow?r.style.textShadow=`${a.data.textData.textShadow}`:r.style.textShadow="none",a.data.textData.alignContent){let u=r.querySelector(".ql-editor");u.style.alignContent=`${a.data.textData.alignContent}`;}this.quill=d.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(a.text),a.parent.children[0].tag.includes("Shape")?(c.width=a.parent.width*l+"px",c.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.eventIds=[i.app.on_(PointerEvent$1.DOWN,u=>{let{target:g}=u.origin,p=false;for(;g;)g===r&&(p=true),g=g.parentElement;p||(i.closeInnerEditor(),i.cancel());})];}onUpdate(){let{editTarget:i}=this,{scaleX:e,scaleY:a}=i.worldTransform,s=Math.max(Math.abs(e),Math.abs(a)),{width:o,height:l}=i.parent.__local;o*=s,l*=s;let{x:r,y:c}=this.inBody?i.app.clientBounds:i.app.tree.clientBounds,{a:u,b:g,c:p,d:x,e:U,f:L}=new Matrix(i.worldTransform).scale(1/s).translateInner(0,0),{style:h}=this.editDom;h.transform=`matrix(${u},${g},${p},${x},${U},${L})`,h.left=r+"px",h.top=c+"px",i.set({visible:false});}onUnload(){let{editTarget:i,editor:e,editDom:a}=this;i&&(this.onInput(),e.app&&(e.app.config.keyEvent=this._keyEvent),e.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),i.parent&&i.parent.name=="Text"&&i.parent.children.some(s=>s.tag==="Box")?(i.parent.findOne("Box").opacity=1,i.visible=false):i.set({visible:true}),this.quill.getLength()===1&&i.parent.name==="Text"&&i.parent.remove(),this.quill.off("text-change",this.onInput);}};D=y([registerInnerEditor()],D);function C(t,{insertAt:n}={}){if(typeof document>"u")return;let i=document.head||document.getElementsByTagName("head")[0],e=document.createElement("style");e.type="text/css",n==="top"&&i.firstChild?i.insertBefore(e,i.firstChild):i.appendChild(e),e.styleSheet?e.styleSheet.cssText=t:e.appendChild(document.createTextNode(t));}C(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.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}
2
- `);var F="LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFxaUFnU1hWM3dMKzh2YkZ2OVkwQwpEN1dBUjhPa2I4bjlmTWxpQjF3enZodTBrdVdZUWEvMUxvVDhHWVh6WWlRQVFBRk9zTTA0MGp2dlNRT2hRSWpiCjRaYXZ1NHUvWVA5bElPYjFKYnZnYkFoYVVOQnphL0l2UmFnaFlKYTJBc1cyRVhnZkVrdmMyUENNMS9zbVlFNnoKNjZiUmx1dnREK3FJZkpLVCtUUXJRRmp5TnNTZ0c2Z2R4MThrZTRMSStBejFPcklMbUsyMHlBU2tlRXpYT1BTVAplM3RNYThleHpZdmUzV0wyNHRHUHg5WHNvN1JyUEl1elZlajh0NDYrZ0c1Y0pQaVh0N1lqa0V2NEJOUUt5eUpoCkltOVRJdVZ6clFpa2NJNE14dExNSGdUMHpLcU9ZZ1NzcmEvTHNDd2ZOdzdtYWxITkU2c21YZWYyQ2E5RGhZODQKS1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==";function O(t){let n=t.replace(/-----BEGIN PUBLIC KEY-----/,"").replace(/-----END PUBLIC KEY-----/,"").replace(/\s/g,"");return P(n)}function P(t){let n=atob(t),i=new Uint8Array(n.length);for(let e=0;e<n.length;e++)i[e]=n.charCodeAt(e);return i.buffer}async function J(){let t=atob(F),n=O(t);return await crypto.subtle.importKey("spki",n,{name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},false,["verify"])}async function z(t,n){try{let i=await J(),e=new TextEncoder().encode(t),a=P(n);return await crypto.subtle.verify("RSASSA-PKCS1-v1_5",i,a,e)}catch(i){return console.error("[RSA] Signature verification failed:",i),false}}async function j(t){try{let n=atob(t),i=JSON.parse(n);if(!i.data||!i.signature)return console.error("[License] Invalid license format"),null;if(!await z(i.data,i.signature))return console.error("[License] Invalid signature - License may be tampered or forged"),null;let a=JSON.parse(i.data);return console.log("[License] Signature verified successfully"),a}catch(n){return console.error("[License] Failed to parse license:",n),null}}function X(t){if(!t||t.length===0)return true;let n=window.location.hostname;if(n==="localhost"||n==="127.0.0.1")return console.log("[License] Local development environment detected"),true;let i=t.some(e=>{if(e.startsWith("*.")){let a=e.slice(2);return n.endsWith(a)}return n===e});return i||(console.error(`[License] Domain not authorized: ${n}`),console.error("[License] Allowed domains:",t)),i}function G(t){if(!t)return true;try{let n=new Date(t),i=new Date;if(i>=n)return console.error(`[License] License has expired on ${t}`),!1;let e=Math.ceil((n.getTime()-i.getTime())/(1e3*60*60*24));return e<=7&&console.warn(`[License] License will expire in ${e} days`),!0}catch{return console.error("[License] Invalid expire date format:",t),false}}function tt(t){if(!t)return true;try{return new Date(t)>new Date?(console.error("[License] License issue date is in the future"),!1):!0}catch{return true}}async function H(t){try{let n=await j(t);return n?tt(n.issueDate)?X(n.domains)?G(n.expireDate)?(console.log("[License] All validations passed"),console.log("[License] License info:",{key:n.key,domains:n.domains,expireDate:n.expireDate,features:n.features}),{valid:!0,data:n}):{valid:!1,error:"License has expired",data:n}:{valid:!1,error:`License not valid for domain: ${window.location.hostname}`,data:n}:{valid:!1,error:"Invalid license issue date",data:n}:{valid:!1,error:"Invalid license key or signature verification failed"}}catch(n){return console.error("[License] Validation error:",n),{valid:false,error:"License validation failed"}}}var E=null,M=null,b=false;async function et(t){console.log("[License] Activating license...");let n=await H(t);return n.valid&&n.data?(E=t,M=n.data,b=true,console.log("[License] \u2705 License activated successfully"),console.log(`[License] Valid until: ${n.data.expireDate||"unlimited"}`),true):(E=null,M=null,b=false,console.error("[License] \u274C License activation failed:",n.error),false)}async function I(){if(!E)return console.warn("[License] No license key provided"),false;if(!b)return console.warn("[License] License is not valid"),false;let t=await H(E);return b=t.valid,b||(console.error("[License] License validation failed:",t.error),M=null),b}function nt(){return M}var B=class t{constructor(){this.quill=null;this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(n){if(!await I())throw new Error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=n,this.quill)return this.quill;let e=document.getElementById("textInnerEditor");if(e)this.quill=this.app_.editor.quill;else return e=document.createElement("div"),e.id="textInnerEditor",e.style.position="fixed",e.style.transformOrigin="left top",e.style.overflowWrap="break-word",e.style.wordBreak="break-all",e.style.visibility="hidden",document.body.appendChild(e),this.quill=new S("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:a=>{let[s]=this.quill.getLine(a.index),o=S.import("blots/block");if(!o?.bubbleFormats)return true;let l=o.bubbleFormats(s),r=new Delta().retain(a.index).delete(a.length).insert(`
3
- `,l);return this.quill.updateContents(r,S.sources.USER),this.quill.setSelection(a.index+1,S.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_}getSelection(){return console.log(this.quill?.selection.savedRange,"this.quill?.selection.savedRange"),this.quill?.selection.savedRange}registerFonts(){FontStyle.whitelist=void 0,S.register("formats/font",FontStyle,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(n,i=0,e){let{editor:a}=this.app_,s=e||a.leafList.list,o=l=>{i&&(l.tag==="Box"||l.name==="Text")?n(l.children?.[0]||l):n(l);};s.length&&(Array.isArray(s)&&s.length>1?(this.app_.lockLayout(),s.forEach(o),this.app_.unlockLayout(),a.updateEditBox()):o(s[0]));}},d=B.getInstance();var q=class extends Box{get __tag(){return "HtmlText"}constructor(n){let{text:i,fontSize:e,fontFamily:a,lineHeight:s,letterSpacing:o,textShadow:l,alignContent:r,...c}=n||{};super({editOuter:"TextEditTool",name:"HtmlText",x:0,y:0,editable:true,draggable:true,overflow:"show",...c}),n&&this.createTextElement(n);}createTextElement(n){let{text:i,fontSize:e,fontFamily:a,lineHeight:s,letterSpacing:o,textShadow:l,alignContent:r}=n,c="<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>",u=`<div style="ove
4
- rflow-wrap:break-word;word-break:break-all;"><p style="font-size: ${e}px; line-height: ${s}; letter-spacing: ${o}px; text-shadow: ${l};"><strong>Hello World</strong></p></div>`,g=new HTMLText({name:"Text",text:c+(i||u),x:0,y:0,data:{canChangeBox:false,textData:{fontFamily:a,fontSize:e,lineHeight:s,letterSpacing:o||0,textShadow:l,alignContent:r}},editConfig:{selectedStyle:{strokeWidth:0}}});this.add(g);}};q=y([registerUI()],q);export{q as HtmlText,I as checkLicense,nt as getLicenseInfo,d as htmlTextManage,dt as setHTMLText,et as setLicense,f as updataHtmlText};//# sourceMappingURL=index.mjs.map
5
- //# sourceMappingURL=index.mjs.map
1
+ import {registerEditTool,registerInnerEditor,EditTool,EditorScaleEvent,InnerEditor}from'@leafer-in/editor';import {PointerEvent}from'leafer-ui';import {registerUI,Box,PointerEvent as PointerEvent$1,Matrix}from'@leafer-ui/core';import y,{Delta}from'quill';import'quill/dist/quill.core.css';import {FontStyle}from'quill/formats/font';import x from'crypto-js';import {HTMLText}from'@leafer-in/html';var f=async(t,e,n)=>{let{scaleX:i,scaleY:o}=t.worldTransform,l=Math.max(Math.abs(i),Math.abs(o)),a=document.querySelector("#textInnerEditor");if(a&&t.data.textData?.fontSize&&(a.style.fontSize=`${t.data.textData.fontSize*l}px`),a&&t.data.textData?.lineHeight&&(a.style.lineHeight=t.data.textData.lineHeight),a&&t.data.textData?.letterSpacing&&(a.style.letterSpacing=`${t.data.textData.letterSpacing}px`),a&&t.data.textData?.textShadow?a.style.textShadow=t.data.textData.textShadow:a.style.textShadow="none",a&&t.data.textData?.alignContent){let d=a.querySelector(".ql-editor");d.style.alignContent=t.data.textData.alignContent;}let s=c.getQuill().getSemanticHTML();if(s==="<p></p>"){t.text.includes("<style>@font-face")?t.text=t.text.split("</style>")[0]+"</style>":t.text="";return}if(t.text.includes("<style>@font-face")){let d=t.text.split("</style>")[0];if(n&&!d.includes(n)){let u=`@font-face {font-family: ${n.split(",")[0]};src: url(${e}) format('woff2') }</style>`;t.text=d+u+T(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=d+"</style>"+T(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else if(e&&n){let d=`<style>@font-face {font-family: ${n.split(",")[0]};src: url(${e}) format('woff2') }</style>`;t.text=d+T(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);}else t.text=T(t,s,t.data.textData.fontSize,t.data.textData.lineHeight,t.data.textData.letterSpacing,t.data.textData.textShadow,t.data.textData?.alignContent);},T=(t,e,n=20.67,i=1.5,o=0,l="none",a="start")=>{let{scaleX:r,scaleY:s}=t.worldTransform,d=Math.max(Math.abs(r),Math.abs(s)),u=document.createElement("div");u.innerHTML=e;let L={fontSize:`${n}px`,lineHeight:i,letterSpacing:`${o}px`,textShadow:l};u.querySelectorAll("p,ol,ul").forEach(N=>{Object.assign(N.style,L);});let p=u.innerHTML;/<p\b[^>]*><\/p>/.test(p)&&(p=p.replace(/<p\b([^>]*)><\/p>/g,"<p$1>&nbsp;</p>")),/&quot;/.test(p)&&(p=p.replace(/&quot;/g,""));let h;document.querySelector("#textInnerEditor");let B=c.getQuill(),w=Number((B.scroll.domNode.scrollHeight/d).toFixed(0));Number((B.scroll.domNode.scrollWidth/d).toFixed(0));["center","end"].includes(t.data.textData.alignContent)?t.parent.height<w?h=(w||t.__layout.boxBounds.height)+"px":h=`${t.parent.height}px`:t.parent.height<w?h=(w||t.__layout.boxBounds.height)+"px":h=`${t.parent.height}px`;let b="<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>",g="";return t.parent.children[0].tag.includes("Shape")?g=b+`<div style="width: ${t.parent.width}px;height: ${t.parent.height}px;overflow-wrap:break-word;word-break:break-all;align-content:center;">${p}</div>`:t.data.canChangeBox?g=b+`<div style="width: ${t.parent.width}px;height:${h};overflow-wrap:break-word;word-break:break-all;align-content:${a};">${p}</div>`:t.data.textData.italic?g=b+p:g=b+`<div style="overflow-wrap:break-word;word-break:break-all;">${p}</div>`,console.log(g,"\u6700\u7EC8\u7684html\u5185\u5BB9"),g},St=(t,e,n)=>{let i=c.getQuill(),{editor:o,canvas:l}=c.getCanvas();if(!i)return;let a=i.selection.savedRange;c.dateEdit(async r=>{if(t==="font")o.innerEditing?(a&&a.length?i.formatText(a.index,a.length,t,e):i.formatText(0,i.getLength()-1,t,e),r.data.textData.fontFamily=e,f(r,n??null,e??null)):(c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),i.formatText(0,i.getLength()-1,t,e),r.data.textData.fontFamily=e,f(r,n??null,e??null));else if(t==="fontSize")r.data.textData[t]=e,c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),f(r,n??null);else if(t==="textCase"){if(o.innerEditing){let s=i.getText(a.index,a.length),d=i.getFormat(a.index,a.length);i.deleteText(a.index,a.length);let u;s===s.toUpperCase()&&/[A-Z]/.test(s)?u=s.toLowerCase():(s===s.toLowerCase()&&/[a-z]/.test(s),u=s.toUpperCase()),i.insertText(a.index,u,d),a&&o.innerEditing&&i.setSelection(a.index,a.length);}}else if(t==="script"){let s="sub";e==="super"&&(s="sup"),o.innerEditing?a&&a.length?i.formatText(a.index,a.length,t,i.getFormat(a).script===e?false:s):i.formatText(0,i.getLength()-1,t,i.getFormat().script===e?false:s):(c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),i.formatText(0,i.getLength()-1,t,i.getFormat().script===e?false:s),f(r));}else if(t==="align")c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),o.innerEditing?i.format(t,e):i.formatLine(0,i.getLength(),t,e),f(r);else if(t==="alignContent")c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),r.data.textData[t]=e,f(r);else if(t==="lineHeight"||t==="letterSpacing")c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),r.data.textData[t]=e,f(r);else if(t==="color")c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),a&&a.length?i.formatText(a.index,a.length,t,e):i.formatText(0,i.getLength()-1,t,e),r.tag==="HTMLText"?f(r):r.parent.findOne("HTMLText")&&f(r.parent.findOne("HTMLText"));else if(t==="textShadow")c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),r.data.textData[t]=e,f(r);else if(t==="list"){if(c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),o.innerEditing){let[s]=i.getLine(a?.index||0);s.formats().list?i.format(t,false):i.format(t,e);}else {let[s]=i.getLine(a?.index||0);s.formats().list?i.formatLine(0,i.getLength(),t,false):i.formatLine(0,i.getLength(),t,e);}f(r);}else o.innerEditing?a&&a.length?i.formatText(a.index,a.length,t,e===void 0?!i.getFormat(a)[t]:e):i.formatText(0,i.getLength()-1,t,e===void 0?!i.getFormat()[t]:e):(c.isMultiSelect()&&i.clipboard.dangerouslyPasteHTML(r.text),i.formatText(0,i.getLength()-1,t,e===void 0?!i.getFormat()[t]:e),f(r));},1);};var Y=(t,e,n,i)=>{for(var o=e,l=t.length-1,a;l>=0;l--)(a=t[l])&&(o=(a(o))||o);return o},H=class extends EditTool{constructor(t){super(t),this.quill=null,this.isUpdatingPoints=false,this.curveAmount=0,this.eventIds=[],this.updateBoxDebounced=this.debounce(e=>{f(e);},300);}get tag(){return "TextEditTool"}debounce(t,e){let n=null;return((...i)=>{n!==null&&window.clearTimeout(n),n=window.setTimeout(()=>t.apply(this,i),e);})}addEvent(){let{editor:t}=c.getCanvas(),e=t._target.findOne("HTMLText"),{scaleX:n,scaleY:i}=e.worldTransform,o=Math.max(Math.abs(n),Math.abs(i)),l=document.querySelector("#textInnerEditor"),{style:a}=l;this.eventIds=[t.on_(EditorScaleEvent.SCALE,r=>{e.data.canChangeBox||(e.data.canChangeBox=true),e.data.canChangeBox&&(a.width=e.parent.width*o+"px",a.height="auto");let s=1;e.parent.tag==="HtmlText"&&e.parent.lockRatio&&e.data?.baseSize?.width&&(s=e.parent.width/e.data?.baseSize.width,e.data.textData.fontSize=e.data.textData.fontSize*s),e.data?.baseSize?.width&&(e.data.baseSize.width=e.parent.width),this.updateBoxDebounced(e);}),t.on_(PointerEvent.DOUBLE_TAP,()=>{e.parent.locked||t.openInnerEditor(e,true);})];}onLoad(){let{editor:t}=c.getCanvas();console.log(t._target,123);let e=t._target.findOne("HTMLText"),{scaleX:n,scaleY:i}=e.worldTransform,o=Math.max(Math.abs(n),Math.abs(i));this.addEvent(),this.quill=c.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(e.text);let l=document.querySelector("#textInnerEditor"),{style:a}=l;e.data.canChangeBox?(a.width=e.parent.width*o+"px",a.height=e.parent.height*o+"px"):(a.width="auto",a.height="auto");}updateChangeBoxBound(t){t&&t.set({width:t.__layout.boxBounds.width,height:t.__layout.boxBounds.height});}onUpdate(){let {editor:t}=c.getCanvas(),e=t._target.findOne("HTMLText");t._target;console.log("\u6587\u672Cbound\u66F4\u65B0"),this.curveAmount!=e.curveAmount&&this.isUpdatingPoints;}onUnload(){let{editor:t}=c.getCanvas();t.off_(this.eventIds);}onDestroy(){}};H=Y([registerEditTool()],H);var k=(t,e,n,i)=>{for(var o=e,l=t.length-1,a;l>=0;l--)(a=t[l])&&(o=(a(o))||o);return o},_=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.onInput=async()=>{let{editDom:t}=this;f(this.editTarget);},this.isUpdatingPoints=false;}get tag(){return "TextEditor"}onLoad(){let{editor:t}=this,{config:e}=t.app,n=this.editTarget,{scaleX:i,scaleY:o}=n.worldTransform,l=Math.max(Math.abs(i),Math.abs(o));this.isHTMLText=!(n instanceof Text),this._keyEvent=e.keyEvent,e.keyEvent=false;let a=this.editDom=document.querySelector("#textInnerEditor"),{style:r}=a;if(r.visibility="visible",n.data.canChangeBox?(r.width=n.parent.width*l+"px",r.height=n.parent.height*l+"px"):(r.width="auto",r.height="auto"),r.outline="solid #8499EF",n.data.textData.fontSize&&(a.style.fontSize=`${n.data.textData.fontSize*l}px`),n.data.textData.lineHeight&&(a.style.lineHeight=n.data.textData.lineHeight),n.data.textData.letterSpacing&&(a.style.letterSpacing=`${n.data.textData.letterSpacing}px`),n.data.textData.textShadow?a.style.textShadow=`${n.data.textData.textShadow}`:a.style.textShadow="none",n.data.textData.alignContent){let s=a.querySelector(".ql-editor");s.style.alignContent=`${n.data.textData.alignContent}`;}this.quill=c.getQuill(),this.quill.clipboard.dangerouslyPasteHTML(n.text),n.parent.children[0].tag.includes("Shape")?(r.width=n.parent.width*l+"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.eventIds=[t.app.on_(PointerEvent$1.DOWN,s=>{let{target:d}=s.origin,u=false;for(;d;)d===a&&(u=true),d=d.parentElement;u||(t.closeInnerEditor(),t.cancel());})];}onUpdate(){let{editTarget:t}=this,{scaleX:e,scaleY:n}=t.worldTransform,i=Math.max(Math.abs(e),Math.abs(n)),{width:o,height:l}=t.parent.__local;o*=i,l*=i;let{x:a,y:r}=this.inBody?t.app.clientBounds:t.app.tree.clientBounds,{a:s,b:d,c:u,d:L,e:p,f:h}=new Matrix(t.worldTransform).scale(1/i).translateInner(0,0),{style:S}=this.editDom;S.transform=`matrix(${s},${d},${u},${L},${p},${h})`,S.left=a+"px",S.top=r+"px",t.set({visible:false});}onUnload(){let{editTarget:t,editor:e,editDom:n}=this;t&&(this.onInput(),e.app&&(e.app.config.keyEvent=this._keyEvent),e.off_(this.eventIds),this.editDom.style.visibility="hidden",this.eventIds=[]),t.parent&&t.parent.name=="Text"&&t.parent.children.some(i=>i.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(),this.quill.off("text-change",this.onInput);}};_=k([registerInnerEditor()],_);function D(t,{insertAt:e}={}){if(typeof document>"u")return;let n=document.head||document.getElementsByTagName("head")[0],i=document.createElement("style");i.type="text/css",e==="top"&&n.firstChild?n.insertBefore(i,n.firstChild):n.appendChild(i),i.styleSheet?i.styleSheet.cssText=t:i.appendChild(document.createTextNode(t));}D(`.ql-editor{padding:0!important;line-height:unset!important;overflow:unset!important;outline:0}.ql-container{font-family:unset!important}.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}
2
+ `);var U="LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFxaUFnU1hWM3dMKzh2YkZ2OVkwQwpEN1dBUjhPa2I4bjlmTWxpQjF3enZodTBrdVdZUWEvMUxvVDhHWVh6WWlRQVFBRk9zTTA0MGp2dlNRT2hRSWpiCjRaYXZ1NHUvWVA5bElPYjFKYnZnYkFoYVVOQnphL0l2UmFnaFlKYTJBc1cyRVhnZkVrdmMyUENNMS9zbVlFNnoKNjZiUmx1dnREK3FJZkpLVCtUUXJRRmp5TnNTZ0c2Z2R4MThrZTRMSStBejFPcklMbUsyMHlBU2tlRXpYT1BTVAplM3RNYThleHpZdmUzV0wyNHRHUHg5WHNvN1JyUEl1elZlajh0NDYrZ0c1Y0pQaVh0N1lqa0V2NEJOUUt5eUpoCkltOVRJdVZ6clFpa2NJNE14dExNSGdUMHpLcU9ZZ1NzcmEvTHNDd2ZOdzdtYWxITkU2c21YZWYyQ2E5RGhZODQKS1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==";function it(t){let e=t.replace(/-----BEGIN PUBLIC KEY-----/,"").replace(/-----END PUBLIC KEY-----/,"").replace(/\s/g,"");return F(e)}function F(t){let e=atob(t),n=new Uint8Array(e.length);for(let i=0;i<e.length;i++)n[i]=e.charCodeAt(i);return n.buffer}async function nt(){let t=atob(U),e=it(t);return await crypto.subtle.importKey("spki",e,{name:"RSASSA-PKCS1-v1_5",hash:"SHA-256"},false,["verify"])}async function A(t,e){try{let n=await nt(),i=new TextEncoder().encode(t),o=F(e);return await crypto.subtle.verify("RSASSA-PKCS1-v1_5",n,o,i)}catch(n){return console.error("[RSA] Signature verification failed:",n),false}}var P="c19496eb17719960b6c3cebab0ef5eddfce5d0315ab8c5af86a52fbda434fea9",I="ce1e3e8974f1392b3c5803b34ecf659f";function z(t){try{let e=x.enc.Hex.parse(P),n=x.enc.Hex.parse(I),o=x.AES.decrypt(t,e,{iv:n,mode:x.mode.CBC,padding:x.pad.Pkcs7}).toString(x.enc.Utf8);if(!o)throw new Error("Decryption resulted in empty string - invalid ciphertext or wrong key");return o}catch(e){throw console.error("[AES] Decryption failed:",e),e}}async function at(t){try{let e=atob(t),n=JSON.parse(e);if(!n.data||!n.signature||!await A(n.data,n.signature))return null;let o=n.data;if(n.encrypted)try{o=z(n.data);}catch{return null}return JSON.parse(o)}catch{return null}}function ot(t){if(!t||t.length===0)return true;let e=window.location.hostname;if(e==="localhost"||e==="127.0.0.1")return console.log("[License] Local development environment detected"),true;let n=t.some(i=>{if(i.startsWith("*.")){let o=i.slice(2);return e.endsWith(o)}return e===i});return n||(console.error(`[License] Domain not authorized: ${e}`),console.error("[License] Allowed domains:",t)),n}function rt(t){if(!t)return true;try{let e=new Date(t),n=new Date;if(n>=e)return console.error(`[License] License has expired on ${t}`),!1;let i=Math.ceil((e.getTime()-n.getTime())/(1e3*60*60*24));return i<=7&&console.warn(`[License] License will expire in ${i} days`),!0}catch{return console.error("[License] Invalid expire date format:",t),false}}function lt(t){if(!t)return true;try{return new Date(t)>new Date?(console.error("[License] License issue date is in the future"),!1):!0}catch{return true}}async function C(t){try{let e=await at(t);return e?lt(e.issueDate)?ot(e.domains)?rt(e.expireDate)?(console.log("[License] License info:",{key:e.key,domains:e.domains,expireDate:e.expireDate,features:e.features}),{valid:!0,data:e}):{valid:!1,error:"License has expired",data:e}:{valid:!1,error:`License not valid for domain: ${window.location.hostname}`,data:e}:{valid:!1,error:"Invalid license issue date",data:e}:{valid:!1,error:"Invalid license key or signature verification failed"}}catch(e){return console.error("[License] Validation error:",e),{valid:false,error:"License validation failed"}}}var E=null,v=null,m=false;async function st(t){console.log("[License] Activating license...");let e=await C(t);return e.valid&&e.data?(E=t,v=e.data,m=true,console.log("[License] \u2705 License activated successfully"),console.log(`[License] Valid until: ${e.data.expireDate||"unlimited"}`),true):(E=null,v=null,m=false,console.error("[License] \u274C License activation failed:",e.error),false)}async function M(){if(!E)return console.warn("[License] No license key provided"),false;if(!m)return console.warn("[License] License is not valid"),false;let t=await C(E);return m=t.valid,m||(console.error("[License] License validation failed:",t.error),v=null),m}function ct(){return v}var q=class t{constructor(){this.quill=null,this.app_=null;}static getInstance(){return t.instance||(t.instance=new t),t.instance}async init(e){if(!await M())throw new Error("[HtmlTextManage] \u6388\u6743\u5931\u8D25\u8BF7\u8054\u7CFB\u4F5C\u8005\u83B7\u53D6\u6388\u6743 \u90AE\u7BB1 : 408550179@qq.com \u5FAE\u4FE1 : cym5640");if(this.app_=e,this.quill)return this.quill;let i=document.getElementById("textInnerEditor");if(i)this.quill=this.app_.editor.quill;else return i=document.createElement("div"),i.id="textInnerEditor",i.style.position="fixed",i.style.transformOrigin="left top",i.style.overflowWrap="break-word",i.style.wordBreak="break-all",i.style.visibility="hidden",document.body.appendChild(i),this.quill=new y("#textInnerEditor",{theme:void 0,modules:{toolbar:false,keyboard:{bindings:{enter:{key:"Enter",handler:o=>{let[l]=this.quill.getLine(o.index),a=y.import("blots/block");if(!a?.bubbleFormats)return true;let r=a.bubbleFormats(l),s=new Delta().retain(o.index).delete(o.length).insert(`
3
+ `,r);return this.quill.updateContents(s,y.sources.USER),this.quill.setSelection(o.index+1,y.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_}getSelection(){return console.log(this.quill?.selection.savedRange,"this.quill?.selection.savedRange"),this.quill?.selection.savedRange}registerFonts(){FontStyle.whitelist=void 0,y.register("formats/font",FontStyle,true);}isMultiSelect(){return this.app_.editor?this.app_.editor.multiple===true:false}dateEdit(e,n=0,i){let{editor:o}=this.app_,l=i||o.leafList.list,a=r=>{n&&(r.tag==="Box"||r.name==="Text")?e(r.children?.[0]||r):e(r);};l.length&&(Array.isArray(l)&&l.length>1?(this.app_.lockLayout(),l.forEach(a),this.app_.unlockLayout(),o.updateEditBox()):a(l[0]));}},c=q.getInstance();var pt=(t,e,n,i)=>{for(var o=e,l=t.length-1,a;l>=0;l--)(a=t[l])&&(o=(a(o))||o);return o},R=class extends Box{get __tag(){return "HtmlText"}constructor(t){let{text:e,fontSize:n,fontFamily:i,lineHeight:o,letterSpacing:l,textShadow:a,alignContent:r,...s}=t||{};super({editOuter:"TextEditTool",name:"HtmlText",x:0,y:0,editable:true,draggable:true,overflow:"show",...s}),t&&this.createTextElement(t);}createTextElement(t){let{text:e,fontSize:n,fontFamily:i,lineHeight:o,letterSpacing:l,textShadow:a,alignContent:r}=t,s="<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>",d=`<div style="ove
4
+ rflow-wrap:break-word;word-break:break-all;"><p style="font-size: ${n}px; line-height: ${o}; letter-spacing: ${l}px; text-shadow: ${a};"><strong>Hello World</strong></p></div>`,u=new HTMLText({name:"Text",text:s+(e||d),x:0,y:0,data:{canChangeBox:false,textData:{fontFamily:i,fontSize:n,lineHeight:o,letterSpacing:l||0,textShadow:a,alignContent:r}},editConfig:{selectedStyle:{strokeWidth:0}}});this.add(u);}};R=pt([registerUI()],R);export{R as HtmlText,M as checkLicense,ct as getLicenseInfo,c as htmlTextManage,St as setHTMLText,st as setLicense,f as updataHtmlText};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chenyomi/leafer-htmltext-edit",
3
- "version": "2.1.5",
3
+ "version": "2.1.7",
4
4
  "description": "A text editor plugin for Leafer UI with HTML text support",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
@@ -39,15 +39,17 @@
39
39
  "@types/crypto-js": "^4.2.2",
40
40
  "@types/lodash": "^4.17.23",
41
41
  "@types/node": "^20.0.0",
42
+ "esbuild-plugin-obfuscator": "^1.4.0",
43
+ "javascript-obfuscator": "^5.2.1",
42
44
  "tsup": "^8.0.0",
43
45
  "typescript": "^5.0.0"
44
46
  },
45
- "peerDependencies": {
46
- "@leafer-in/editor": "^2.0.0",
47
- "@leafer-in/html": "^2.0.0",
48
- "@leafer-ui/core": "^2.0.0",
49
- "leafer-ui": "^2.0.0",
50
- "quill": "^2.0.0"
47
+ "peerDependencies": {
48
+ "@leafer-in/editor": "^2.0.0",
49
+ "@leafer-in/html": "^2.0.0",
50
+ "@leafer-ui/core": "^2.0.0",
51
+ "leafer-ui": "^2.0.0",
52
+ "quill": "^2.0.0"
51
53
  },
52
54
  "dependencies": {
53
55
  "crypto-js": "^4.2.0"
@@ -60,4 +62,4 @@
60
62
  "publishConfig": {
61
63
  "access": "public"
62
64
  }
63
- }
65
+ }
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/TextEditTool/index.ts","../src/utils.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/public-key.ts","../src/license/rsa-verify.ts","../src/license/validator.ts","../src/license/index.ts","../src/HtmlTextManage.ts","../src/HtmlText.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","htmlTextManage","style","addStyle","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","setHTMLText","key","value","editor","canvas","range","text","formats","convertedText","val","line","TextEditTool","EditTool","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","PUBLIC_KEY_BASE64","pemToArrayBuffer","pem","base64","base64ToArrayBuffer","binaryString","bytes","i","importPublicKey","publicKeyPem","publicKeyBuffer","verifySignature","data","signature","publicKey","dataBuffer","signatureBuffer","error","parseLicense","license","decoded","licensePackage","validateDomain","allowedDomains","currentDomain","isValid","domain","baseDomain","validateExpireDate","expireDate","expire","now","daysRemaining","validateIssueDate","issueDate","validateLicense","licenseKey","licenseData","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","HtmlTextManage","_HtmlTextManage","app","el","Quill","BlockBlot","lineFormats","delta","Delta","FontStyle","callback","level","listNew","list","applyCallback","leaf","HtmlText","Box","fontFamily","boxData","fontContent","noText","textElement","HTMLText","registerUI"],"mappings":"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","file":"index.cjs","sourcesContent":["import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { htmlTextManage } 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 } = htmlTextManage.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 === 'HtmlText' && 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 } = htmlTextManage.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 = htmlTextManage.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 } = htmlTextManage.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 } = htmlTextManage.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { htmlTextManage } from \".\";\n// 更新text样式\nexport const updataHtmlText = async (\n e?: any,\n base64font?: any,\n fontObj?: any,\n) => {\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 = htmlTextManage.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)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.split(\",\")[0]};src: url(${base64font}) format('woff2') }</style>`;\n e.text =\n style +\n addStyle +\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: ${fontObj.split(\",\")[0]};src: url(${base64font}) format('woff2') }</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 = (\n e: any,\n html: any,\n fontSize = 20.67,\n lineHeight = 1.5,\n letterSpacing = 0,\n textShadow = \"none\",\n alignContent = \"start\",\n) => {\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 if (/&quot;/.test(str)) {\n str = str.replace(/&quot;/g, \"\");\n }\n\n let height;\n const div: any = document.querySelector(\"#textInnerEditor\");\n const quill = htmlTextManage.getQuill();\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number(\n (quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0),\n );\n const actualWidth = Number(\n (quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0),\n );\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 divBox =\n style +\n `<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 = htmlTextManage.getQuill();\n const { editor, canvas } = htmlTextManage.getCanvas();\n // console.log(editor, htmlTextManage.getCanvas(), \"editor\");\n if (!quill) {\n return;\n }\n const range = quill.selection.savedRange;\n htmlTextManage.dateEdit(async (e: any) => {\n if (key === \"font\") {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, value ?? null);\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(0, quill.getLength() - 1, key, value);\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, value ?? null);\n }\n } else if (key === \"fontSize\") {\n // 字体和字号\n e.data.textData[key] = value;\n htmlTextManage.isMultiSelect() &&\n 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 &&\n editor.innerEditing &&\n 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(\n range.index,\n range.length,\n key,\n quill.getFormat(range).script === value ? false : val,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n updataHtmlText(e);\n }\n } else if (key === \"align\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n 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 htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"lineHeight\" || key === \"letterSpacing\") {\n // 行高\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"color\") {\n // 颜色\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\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 htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"list\") {\n // 有序无序列表\n htmlTextManage.isMultiSelect() &&\n 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(\n range.index,\n range.length,\n key,\n value === undefined ? !quill.getFormat(range)[key] : value,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n value === undefined ? !quill.getFormat()[key] : value,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n\n value === undefined ? !quill.getFormat()[key] : value,\n );\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 { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { htmlTextManage } 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 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 if (text.data.textData.fontSize) {\n div.style.fontSize = `${text.data.textData.fontSize * zoomScale}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 = htmlTextManage.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\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\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\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 this.quill.off(\"text-change\", this.onInput);\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-container{font-family:unset!important}.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}\\n\")","/**\n * RSA 公钥 (自动生成)\n * 用于验证 License 签名\n * \n * 注意: 这个公钥是公开的,不需要保密\n */\n\nexport const PUBLIC_KEY_BASE64 = `LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFxaUFnU1hWM3dMKzh2YkZ2OVkwQwpEN1dBUjhPa2I4bjlmTWxpQjF3enZodTBrdVdZUWEvMUxvVDhHWVh6WWlRQVFBRk9zTTA0MGp2dlNRT2hRSWpiCjRaYXZ1NHUvWVA5bElPYjFKYnZnYkFoYVVOQnphL0l2UmFnaFlKYTJBc1cyRVhnZkVrdmMyUENNMS9zbVlFNnoKNjZiUmx1dnREK3FJZkpLVCtUUXJRRmp5TnNTZ0c2Z2R4MThrZTRMSStBejFPcklMbUsyMHlBU2tlRXpYT1BTVAplM3RNYThleHpZdmUzV0wyNHRHUHg5WHNvN1JyUEl1elZlajh0NDYrZ0c1Y0pQaVh0N1lqa0V2NEJOUUt5eUpoCkltOVRJdVZ6clFpa2NJNE14dExNSGdUMHpLcU9ZZ1NzcmEvTHNDd2ZOdzdtYWxITkU2c21YZWYyQ2E5RGhZODQKS1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==`;\n","/**\n * RSA 签名验证工具 (浏览器版本)\n * \n * 使用 Web Crypto API 验证 RSA-SHA256 签名\n */\n\nimport { PUBLIC_KEY_BASE64 } from './public-key';\n\n/**\n * 将 PEM 格式公钥转换为 ArrayBuffer\n */\nfunction pemToArrayBuffer(pem: string): ArrayBuffer {\n // 移除 PEM 头尾和换行符\n const base64 = pem\n .replace(/-----BEGIN PUBLIC KEY-----/, '')\n .replace(/-----END PUBLIC KEY-----/, '')\n .replace(/\\s/g, '');\n \n return base64ToArrayBuffer(base64);\n}\n\n/**\n * Base64 字符串转 ArrayBuffer\n */\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n \n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n \n return bytes.buffer;\n}\n\n/**\n * 导入 RSA 公钥\n */\nasync function importPublicKey(): Promise<CryptoKey> {\n // 解码 Base64 公钥\n const publicKeyPem = atob(PUBLIC_KEY_BASE64);\n const publicKeyBuffer = pemToArrayBuffer(publicKeyPem);\n\n // 导入公钥\n const publicKey = await crypto.subtle.importKey(\n 'spki',\n publicKeyBuffer,\n {\n name: 'RSASSA-PKCS1-v1_5',\n hash: 'SHA-256',\n },\n false,\n ['verify']\n );\n\n return publicKey;\n}\n\n/**\n * 验证 RSA 签名\n * \n * @param data - 原始数据字符串\n * @param signature - Base64 编码的签名\n * @returns 签名是否有效\n */\nexport async function verifySignature(\n data: string,\n signature: string\n): Promise<boolean> {\n try {\n // 导入公钥\n const publicKey = await importPublicKey();\n\n // 准备数据\n const dataBuffer = new TextEncoder().encode(data);\n const signatureBuffer = base64ToArrayBuffer(signature);\n\n // 验证签名\n const isValid = await crypto.subtle.verify(\n 'RSASSA-PKCS1-v1_5',\n publicKey,\n signatureBuffer,\n dataBuffer\n );\n\n return isValid;\n } catch (error) {\n console.error('[RSA] Signature verification failed:', error);\n return false;\n }\n}\n\n/**\n * 测试 RSA 验证是否正常工作\n */\nexport async function testRSAVerification(): Promise<boolean> {\n try {\n // 尝试导入公钥\n await importPublicKey();\n console.log('[RSA] Public key loaded successfully');\n return true;\n } catch (error) {\n console.error('[RSA] Failed to load public key:', error);\n return false;\n }\n}","/**\n * License 验证器 V2 (RSA 签名版本)\n * \n * 主要改进:\n * 1. 使用 RSA 签名防止 License 伪造\n * 2. 保留原有的域名和过期时间验证\n * 3. 向后兼容旧版 License\n */\n\nimport { verifySignature } from './rsa-verify';\n\nexport interface LicenseData {\n key: string; // License Key (格式: XXXX-XXXX-XXXX-XXXX)\n domains?: string[]; // 允许的域名列表\n expireDate?: string; // 过期时间 YYYY-MM-DD\n issueDate?: string; // 签发时间 YYYY-MM-DD\n features?: string[]; // 功能列表\n userId?: string; // 用户ID\n email?: string; // 用户邮箱\n version?: string; // License 版本\n}\n\ninterface LicensePackage {\n data: string; // JSON 序列化的 LicenseData\n signature: string; // RSA 签名\n}\n\n/**\n * 解析 License\n */\nasync function parseLicense(license: string): Promise<LicenseData | null> {\n try {\n // 1. Base64 解码\n const decoded = atob(license);\n \n // 2. 解析 JSON\n const licensePackage: LicensePackage = JSON.parse(decoded);\n\n // 验证格式\n if (!licensePackage.data || !licensePackage.signature) {\n console.error('[License] Invalid license format');\n return null;\n }\n\n // 3. 验证 RSA 签名\n const signatureValid = await verifySignature(\n licensePackage.data,\n licensePackage.signature\n );\n\n if (!signatureValid) {\n console.error('[License] Invalid signature - License may be tampered or forged');\n return null;\n }\n\n // 4. 解析数据\n const data: LicenseData = JSON.parse(licensePackage.data);\n \n console.log('[License] Signature verified successfully');\n return data;\n\n } catch (error) {\n console.error('[License] Failed to parse license:', error);\n return null;\n }\n}\n\n/**\n * 验证域名\n */\nfunction validateDomain(allowedDomains?: string[]): boolean {\n // 如果没有域名限制,直接通过\n if (!allowedDomains || allowedDomains.length === 0) {\n return true;\n }\n\n // 获取当前域名\n const currentDomain = window.location.hostname;\n\n // 本地开发环境自动通过\n if (currentDomain === 'localhost' || currentDomain === '127.0.0.1') {\n console.log('[License] Local development environment detected');\n return true;\n }\n\n // 检查域名是否在允许列表中\n const isValid = allowedDomains.some(domain => {\n // 支持通配符 *.example.com\n if (domain.startsWith('*.')) {\n const baseDomain = domain.slice(2);\n return currentDomain.endsWith(baseDomain);\n }\n return currentDomain === domain;\n });\n\n if (!isValid) {\n console.error(`[License] Domain not authorized: ${currentDomain}`);\n console.error(`[License] Allowed domains:`, allowedDomains);\n }\n\n return isValid;\n}\n\n/**\n * 验证过期时间\n */\nfunction validateExpireDate(expireDate?: string): boolean {\n if (!expireDate) return true;\n\n try {\n const expire = new Date(expireDate);\n const now = new Date();\n \n if (now >= expire) {\n console.error(`[License] License has expired on ${expireDate}`);\n return false;\n }\n\n // 计算剩余天数\n const daysRemaining = Math.ceil((expire.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n \n if (daysRemaining <= 7) {\n console.warn(`[License] License will expire in ${daysRemaining} days`);\n }\n\n return true;\n } catch (error) {\n console.error('[License] Invalid expire date format:', expireDate);\n return false;\n }\n}\n\n/**\n * 验证签发时间(防止使用未来时间)\n */\nfunction validateIssueDate(issueDate?: string): boolean {\n if (!issueDate) return true;\n\n try {\n const issue = new Date(issueDate);\n const now = new Date();\n \n if (issue > now) {\n console.error('[License] License issue date is in the future');\n return false;\n }\n\n return true;\n } catch {\n return true; // 如果没有签发时间,跳过此检查\n }\n}\n\n/**\n * 验证 License (主函数)\n */\nexport async function validateLicense(license: string): Promise<{\n valid: boolean;\n error?: string;\n data?: LicenseData;\n}> {\n try {\n // 1. 解析 License 并验证签名\n const data = await parseLicense(license);\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key or signature verification failed'\n };\n }\n\n // 2. 验证签发时间\n if (!validateIssueDate(data.issueDate)) {\n return {\n valid: false,\n error: 'Invalid license issue date',\n data\n };\n }\n\n // 3. 验证域名\n if (!validateDomain(data.domains)) {\n return {\n valid: false,\n error: `License not valid for domain: ${window.location.hostname}`,\n data\n };\n }\n\n // 4. 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n };\n }\n\n // 5. 所有验证通过\n console.log('[License] All validations passed');\n console.log('[License] License info:', {\n key: data.key,\n domains: data.domains,\n expireDate: data.expireDate,\n features: data.features\n });\n\n return {\n valid: true,\n data\n };\n\n } catch (error) {\n console.error('[License] Validation error:', error);\n return {\n valid: false,\n error: 'License validation failed'\n };\n }\n}\n\n/**\n * 检查是否有特定功能权限\n */\nexport function hasFeature(data: LicenseData | null, feature: string): boolean {\n if (!data || !data.features) return false;\n return data.features.includes(feature);\n}","/**\n * License 管理器\n *\n * 提供统一的 License 管理接口\n */\n\nimport { validateLicense, hasFeature, type LicenseData } from \"./validator\";\n\n// 全局状态\nlet licenseKey: string | null = null;\nlet licenseData: LicenseData | null = null;\nlet isLicenseValid = false;\n\n/**\n * 设置 License\n *\n * @param license - License Key 字符串\n * @returns 是否激活成功\n */\nexport async function setLicense(license: string): Promise<boolean> {\n console.log(\"[License] Activating license...\");\n\n const result = await validateLicense(license);\n\n if (result.valid && result.data) {\n licenseKey = license;\n licenseData = result.data;\n isLicenseValid = true;\n\n console.log(\"[License] ✅ License activated successfully\");\n console.log(\n `[License] Valid until: ${result.data.expireDate || \"unlimited\"}`,\n );\n\n return true;\n } else {\n licenseKey = null;\n licenseData = null;\n isLicenseValid = false;\n\n console.error(\"[License] ❌ License activation failed:\", result.error);\n\n return false;\n }\n}\n\n/**\n * 检查 License 是否有效\n *\n * @returns License 是否有效\n */\nexport async function checkLicense(): Promise<boolean> {\n if (!licenseKey) {\n console.warn(\"[License] No license key provided\");\n return false;\n }\n\n if (!isLicenseValid) {\n console.warn(\"[License] License is not valid\");\n return false;\n }\n\n // 重新验证(防止过期或域名变化)\n const result = await validateLicense(licenseKey);\n isLicenseValid = result.valid;\n\n if (!isLicenseValid) {\n console.error(\"[License] License validation failed:\", result.error);\n licenseData = null;\n }\n\n return isLicenseValid;\n}\n\n/**\n * 获取 License 信息\n *\n * @returns License 数据或 null\n */\nexport function getLicenseInfo(): LicenseData | null {\n return licenseData;\n}\n\n/**\n * 检查是否有特定功能权限\n *\n * @param feature - 功能名称\n * @returns 是否有权限\n */\nexport function checkFeature(feature: string): boolean {\n if (!isLicenseValid || !licenseData) {\n return false;\n }\n\n return hasFeature(licenseData, feature);\n}\n\n/**\n * 清除 License\n */\nexport function clearLicense(): void {\n licenseKey = null;\n licenseData = null;\n isLicenseValid = false;\n console.log(\"[License] License cleared\");\n}\n\n/**\n * 获取 License 状态摘要\n */\nexport function getLicenseStatus(): {\n activated: boolean;\n key?: string;\n expireDate?: string;\n domains?: string[];\n features?: string[];\n} {\n if (!isLicenseValid || !licenseData) {\n return { activated: false };\n }\n\n return {\n activated: true,\n key: licenseData.key,\n expireDate: licenseData.expireDate,\n domains: licenseData.domains,\n features: licenseData.features,\n };\n}\n\nexport function assertLicenseValid(): void {\n // if (!isLicenseValid || !licenseData) {\n console.log(isLicenseValid)\n if (!isLicenseValid) {\n throw new Error(\n \"[Plugin] License validation failed. Plugin execution has been blocked. Please contact the plugin developer for assistance. Email: 408550179@qq.com\",\n );\n }\n}\n\n// 导出类型\nexport type { LicenseData } from \"./validator\";\n","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { FontStyle } from \"quill/formats/font\";\n\nimport { checkLicense } from \"./license\";\nclass HtmlTextManage {\n private static instance: HtmlTextManage;\n private quill: Quill | null = null;\n public app_: any | null = null;\n private constructor() {}\n\n static getInstance() {\n if (!HtmlTextManage.instance) {\n HtmlTextManage.instance = new HtmlTextManage();\n }\n return HtmlTextManage.instance;\n }\n\n async init(app: any) {\n // 检查授权\n const seccess = await checkLicense();\n if (!seccess) {\n throw new Error(\n \"[HtmlTextManage] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\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 public getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n public getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n public getSelection() {\n console.log(\n this.quill?.selection.savedRange,\n \"this.quill?.selection.savedRange\",\n );\n return this.quill?.selection.savedRange;\n }\n\n private registerFonts() {\n // 注册 FontStyle 作为字体格式\n FontStyle.whitelist = undefined;\n Quill.register(\"formats/font\", FontStyle, 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 htmlTextManage = HtmlTextManage.getInstance();\n","import { Box, registerUI } from \"@leafer-ui/core\";\nimport { HTMLText } from \"@leafer-in/html\";\nimport { IBoxInputData } from \"@leafer-ui/interface\";\n\n// 文本样式属性\ninterface IHtmlTextContentData {\n text?: string;\n fontSize: number;\n fontFamily?: string;\n lineHeight?: number;\n letterSpacing?: number;\n textShadow?: string;\n alignContent?: string;\n}\n\n// 使用交叉类型而非继承\ntype IHtmlTextInputData = IBoxInputData & IHtmlTextContentData;\n\n@registerUI()\nclass HtmlText extends Box {\n public get __tag() {\n return \"HtmlText\";\n }\n\n constructor(data?: IHtmlTextInputData) {\n // 提取文本属性,其余传递给 Box\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n ...boxData\n } = data || {};\n\n super({\n editOuter: \"TextEditTool\",\n name: \"HtmlText\",\n x: 0,\n y: 0,\n editable: true,\n draggable: true,\n overflow: \"show\",\n ...boxData,\n });\n if (data) {\n this.createTextElement(data);\n }\n }\n\n private createTextElement(data: IHtmlTextInputData) {\n // 提取文本相关属性\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n } = data;\n const fontContent = `<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:'•';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 const noText = `<div style=\"ove\n rflow-wrap:break-word;word-break:break-all;\"><p style=\"font-size: ${fontSize}px; line-height: ${lineHeight}; letter-spacing: ${letterSpacing}px; text-shadow: ${textShadow};\"><strong>Hello World</strong></p></div>`;\n const textElement = new HTMLText({\n name: \"Text\",\n text: fontContent + (text || noText),\n x: 0,\n y: 0,\n data: {\n canChangeBox: false,\n textData: {\n fontFamily: fontFamily,\n fontSize: fontSize,\n lineHeight: lineHeight,\n letterSpacing: letterSpacing || 0,\n textShadow: textShadow,\n alignContent: alignContent,\n },\n },\n editConfig: {\n selectedStyle: {\n strokeWidth: 0,\n },\n },\n });\n\n this.add(textElement);\n }\n}\n\nexport { HtmlText };\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/TextEditTool/index.ts","../src/utils.ts","../src/TextEditor.ts","#style-inject:#style-inject","../src/htmltext-editor.css","../src/license/public-key.ts","../src/license/rsa-verify.ts","../src/license/validator.ts","../src/license/index.ts","../src/HtmlTextManage.ts","../src/HtmlText.ts"],"names":["updataHtmlText","e","base64font","fontObj","scaleX","scaleY","zoomScale","dom","qlEditor","html","htmlTextManage","style","addStyle","addFontSizeToP","fontSize","lineHeight","letterSpacing","textShadow","alignContent","wrapper","wrapperStyle","p","str","height","quill","actualHeight","divBox","setHTMLText","key","value","editor","canvas","range","text","formats","convertedText","val","line","TextEditTool","EditTool","func","wait","timeout","args","div","EditorScaleEvent","ratio","PointerEvent","__decorateClass","registerEditTool","TextEditor","InnerEditor","editDom","config","target","find","width","x","y","a","b","c","d","f","Matrix","registerInnerEditor","styleInject","css","insertAt","head","PUBLIC_KEY_BASE64","pemToArrayBuffer","pem","base64","base64ToArrayBuffer","binaryString","bytes","i","importPublicKey","publicKeyPem","publicKeyBuffer","verifySignature","data","signature","publicKey","dataBuffer","signatureBuffer","error","parseLicense","license","decoded","licensePackage","validateDomain","allowedDomains","currentDomain","isValid","domain","baseDomain","validateExpireDate","expireDate","expire","now","daysRemaining","validateIssueDate","issueDate","validateLicense","licenseKey","licenseData","isLicenseValid","setLicense","result","checkLicense","getLicenseInfo","HtmlTextManage","_HtmlTextManage","app","el","Quill","BlockBlot","lineFormats","delta","Delta","FontStyle","callback","level","listNew","list","applyCallback","leaf","HtmlText","Box","fontFamily","boxData","fontContent","noText","textElement","HTMLText","registerUI"],"mappings":"mXAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,IAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,MAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,IAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,CAAA,GAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA,CCEO,IAAMA,CAAAA,CAAiB,MAC5BC,CAAAA,CACAC,CAAAA,CACAC,CAAAA,GACG,CACH,GAAM,CAAE,MAAA,CAAAC,CAAAA,CAAQ,MAAA,CAAAC,CAAO,CAAA,CAAIJ,CAAAA,CAAE,cAAA,CACvBK,CAAAA,CAAY,KAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAIF,CAAM,CAAA,CAAG,IAAA,CAAK,GAAA,CAAIC,CAAM,CAAC,CAAA,CACvDE,CAAAA,CAAW,QAAA,CAAS,aAAA,CAAc,kBAAkB,CAAA,CAkB1D,GAdIA,CAAAA,EAAON,CAAAA,CAAE,IAAA,CAAK,QAAA,EAAU,QAAA,GAC1BM,CAAAA,CAAI,KAAA,CAAM,QAAA,CAAW,CAAA,EAAGN,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,QAAA,CAAWK,CAAS,CAAA,EAAA,CAAA,CAAA,CAE1DC,CAAAA,EAAON,EAAE,IAAA,CAAK,QAAA,EAAU,UAAA,GAC1BM,CAAAA,CAAI,KAAA,CAAM,UAAA,CAAaN,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAA,CAAA,CAErCM,CAAAA,EAAON,CAAAA,CAAE,IAAA,CAAK,QAAA,EAAU,aAAA,GAC1BM,CAAAA,CAAI,KAAA,CAAM,aAAA,CAAgB,CAAA,EAAGN,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,aAAa,CAAA,EAAA,CAAA,CAAA,CAExDM,CAAAA,EAAON,CAAAA,CAAE,IAAA,CAAK,QAAA,EAAU,UAAA,CAC1BM,CAAAA,CAAI,KAAA,CAAM,UAAA,CAAaN,EAAE,IAAA,CAAK,QAAA,CAAS,UAAA,CAEvCM,CAAAA,CAAI,KAAA,CAAM,UAAA,CAAa,MAAA,CAErBA,CAAAA,EAAON,CAAAA,CAAE,IAAA,CAAK,QAAA,EAAU,YAAA,CAAc,CACxC,IAAMO,CAAAA,CAAgBD,CAAAA,CAAI,cAAc,YAAY,CAAA,CACpDC,CAAAA,CAAS,KAAA,CAAM,YAAA,CAAeP,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,aAChD,CAGA,IAAMQ,CAAAA,CADQC,CAAAA,CAAe,QAAA,EAAS,CACnB,eAAA,GACnB,GAAID,CAAAA,GAAS,SAAA,CAAW,CAClBR,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,mBAAmB,CAAA,CACrCA,CAAAA,CAAE,IAAA,CAAOA,CAAAA,CAAE,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAE,CAAC,CAAA,CAAI,UAAA,CAEvCA,CAAAA,CAAE,IAAA,CAAO,EAAA,CAEX,MACF,CACA,GAAIA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,mBAAmB,CAAA,CAAG,CAExC,IAAMU,EAAQV,CAAAA,CAAE,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA,CAAE,CAAC,CAAA,CACxC,GAAIE,CAAAA,EAAW,CAACQ,CAAAA,CAAM,QAAA,CAASR,CAAO,CAAA,CAAG,CAEvC,IAAMS,EAAW,CAAA,yBAAA,EAA4BT,CAAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,UAAA,EAAaD,CAAU,CAAA,2BAAA,CAAA,CACzFD,CAAAA,CAAE,IAAA,CACAU,CAAAA,CACAC,CAAAA,CACAC,CAAAA,CACEZ,CAAAA,CACAQ,EACAR,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,QAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,aAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,EAAU,YACnB,EACJ,CAAA,KAEEA,CAAAA,CAAE,IAAA,CACAU,CAAAA,CACA,UAAA,CACAE,CAAAA,CACEZ,CAAAA,CACAQ,CAAAA,CACAR,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,SAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,aAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,EAAU,YACnB,EAEN,CAAA,KAAA,GAAWC,CAAAA,EAAcC,CAAAA,CAAS,CAEhC,IAAMQ,CAAAA,CAAQ,CAAA,gCAAA,EAAmCR,CAAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAC,CAAA,UAAA,EAAaD,CAAU,CAAA,2BAAA,CAAA,CAC7FD,EAAE,IAAA,CACAU,CAAAA,CACAE,CAAAA,CACEZ,CAAAA,CACAQ,CAAAA,CACAR,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,QAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,aAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,EAAU,YACnB,EACJ,CAAA,KAEEA,CAAAA,CAAE,IAAA,CAAOY,CAAAA,CACPZ,CAAAA,CACAQ,CAAAA,CACAR,EAAE,IAAA,CAAK,QAAA,CAAS,QAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,aAAA,CAChBA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAA,CAChBA,CAAAA,CAAE,KAAK,QAAA,EAAU,YACnB,EAEJ,CAAA,CACMY,CAAAA,CAAiB,CACrBZ,CAAAA,CACAQ,CAAAA,CACAK,CAAAA,CAAW,KAAA,CACXC,CAAAA,CAAa,GAAA,CACbC,CAAAA,CAAgB,CAAA,CAChBC,CAAAA,CAAa,MAAA,CACbC,EAAe,OAAA,GACZ,CACH,GAAM,CAAE,MAAA,CAAAd,CAAAA,CAAQ,MAAA,CAAAC,CAAO,CAAA,CAAIJ,CAAAA,CAAE,cAAA,CACvBK,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAIF,CAAM,CAAA,CAAG,IAAA,CAAK,GAAA,CAAIC,CAAM,CAAC,CAAA,CACvDc,CAAAA,CAAU,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CAC5CA,CAAAA,CAAQ,SAAA,CAAYV,CAAAA,CAEpB,IAAMW,EAAoB,CACxB,QAAA,CAAU,CAAA,EAAGN,CAAQ,CAAA,EAAA,CAAA,CACrB,UAAA,CAAAC,CAAAA,CACA,aAAA,CAAe,CAAA,EAAGC,CAAa,CAAA,EAAA,CAAA,CAC/B,UAAA,CAAAC,CACF,CAAA,CACAE,CAAAA,CAAQ,gBAAA,CAAiB,SAAS,CAAA,CAAE,OAAA,CAASE,CAAAA,EAAW,CACtD,MAAA,CAAO,MAAA,CAAOA,CAAAA,CAAE,KAAA,CAAOD,CAAY,EACrC,CAAC,CAAA,CAGD,IAAIE,CAAAA,CAAMH,CAAAA,CAAQ,SAAA,CAEd,kBAAkB,IAAA,CAAKG,CAAG,CAAA,GAC5BA,CAAAA,CAAMA,CAAAA,CAAI,OAAA,CAAQ,oBAAA,CAAsB,iBAAiB,CAAA,CAAA,CAEvD,QAAA,CAAS,IAAA,CAAKA,CAAG,CAAA,GACnBA,CAAAA,CAAMA,CAAAA,CAAI,OAAA,CAAQ,SAAA,CAAW,EAAE,CAAA,CAAA,CAGjC,IAAIC,CAAAA,CACa,QAAA,CAAS,aAAA,CAAc,kBAAkB,CAAA,KACpDC,CAAAA,CAAQd,CAAAA,CAAe,QAAA,EAAS,CAGhCe,CAAAA,CAAe,MAAA,CAAA,CAClBD,EAAM,MAAA,CAAO,OAAA,CAAQ,YAAA,CAAelB,CAAAA,EAAW,OAAA,CAAQ,CAAC,CAC3D,CAAA,CACoB,MAAA,CAAA,CACjBkB,CAAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,WAAA,CAAclB,CAAAA,EAAW,OAAA,CAAQ,CAAC,CAC1D,EACI,CAAC,QAAA,CAAU,KAAK,CAAA,CAAE,QAAA,CAASL,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,CACrDA,CAAAA,CAAE,MAAA,CAAO,MAAA,CAASwB,CAAAA,CACpBF,GAAUE,CAAAA,EAAgBxB,CAAAA,CAAE,QAAA,CAAS,SAAA,CAAU,MAAA,EAAU,IAAA,CAEzDsB,CAAAA,CAAS,CAAA,EAAGtB,CAAAA,CAAE,MAAA,CAAO,MAAM,CAAA,EAAA,CAAA,CAGzBA,CAAAA,CAAE,MAAA,CAAO,MAAA,CAASwB,CAAAA,CACpBF,CAAAA,CAAAA,CAAUE,CAAAA,EAAgBxB,CAAAA,CAAE,QAAA,CAAS,SAAA,CAAU,MAAA,EAAU,IAAA,CAEzDsB,CAAAA,CAAS,CAAA,EAAGtB,CAAAA,CAAE,MAAA,CAAO,MAAM,CAAA,EAAA,CAAA,CAK/B,IAAMU,CAAAA,CAAQ,ipBAAA,CACVe,EAAS,EAAA,CACb,OAAIzB,CAAAA,CAAE,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,CAAE,GAAA,CAAI,QAAA,CAAS,OAAO,CAAA,CAC3CyB,CAAAA,CACEf,CAAAA,CACA,CAAA,mBAAA,EAAsBV,CAAAA,CAAE,MAAA,CAAO,KAAK,CAAA,WAAA,EAAcA,CAAAA,CAAE,MAAA,CAAO,MAAM,CAAA,wEAAA,EAA2EqB,CAAG,CAAA,MAAA,CAAA,CACxIrB,CAAAA,CAAE,IAAA,CAAK,YAAA,CAChByB,CAAAA,CACEf,CAAAA,CACA,CAAA,mBAAA,EAAsBV,CAAAA,CAAE,MAAA,CAAO,KAAK,aAAasB,CAAM,CAAA,6DAAA,EAAgEL,CAAY,CAAA,GAAA,EAAMI,CAAG,CAAA,MAAA,CAAA,CAG1IrB,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,MAAA,CAClByB,CAAAA,CAASf,CAAAA,CAAQW,CAAAA,CAEjBI,CAAAA,CACEf,CAAAA,CACA,CAAA,4DAAA,EAA+DW,CAAG,CAAA,MAAA,CAAA,CAGxE,OAAA,CAAQ,GAAA,CAAII,CAAAA,CAAQ,oCAAW,CAAA,CACxBA,CACT,CAAA,CACaC,EAAAA,CAAc,CAACC,CAAAA,CAAaC,CAAAA,CAAa3B,CAAAA,GAAqB,CACzE,IAAMsB,EAAQd,CAAAA,CAAe,QAAA,EAAS,CAChC,CAAE,MAAA,CAAAoB,CAAAA,CAAQ,MAAA,CAAAC,CAAO,CAAA,CAAIrB,CAAAA,CAAe,SAAA,EAAU,CAEpD,GAAI,CAACc,CAAAA,CACH,OAEF,IAAMQ,CAAAA,CAAQR,CAAAA,CAAM,SAAA,CAAU,UAAA,CAC9Bd,CAAAA,CAAe,QAAA,CAAS,MAAOT,CAAAA,EAAW,CACxC,GAAI2B,CAAAA,GAAQ,MAAA,CACNE,CAAAA,CAAO,YAAA,EACLE,CAAAA,EAASA,EAAM,MAAA,CACjBR,CAAAA,CAAM,UAAA,CAAWQ,CAAAA,CAAM,KAAA,CAAOA,CAAAA,CAAM,MAAA,CAAQJ,CAAAA,CAAKC,CAAK,CAAA,CAEtDL,CAAAA,CAAM,UAAA,CAAW,CAAA,CAAGA,CAAAA,CAAM,SAAA,EAAU,CAAI,CAAA,CAAGI,CAAAA,CAAKC,CAAK,CAAA,CAEvD5B,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAA,CAAa4B,CAAAA,CAC7B7B,CAAAA,CAAeC,CAAAA,CAAGC,CAAAA,EAAc,IAAA,CAAM2B,CAAAA,EAAS,IAAI,CAAA,GAEnDnB,EAAe,aAAA,EAAc,EAC3Bc,CAAAA,CAAM,SAAA,CAAU,oBAAA,CAAqBvB,CAAAA,CAAE,IAAI,CAAA,CAC7CuB,CAAAA,CAAM,UAAA,CAAW,CAAA,CAAGA,CAAAA,CAAM,SAAA,EAAU,CAAI,CAAA,CAAGI,CAAAA,CAAKC,CAAK,CAAA,CACrD5B,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS,UAAA,CAAa4B,CAAAA,CAC7B7B,CAAAA,CAAeC,CAAAA,CAAGC,CAAAA,EAAc,IAAA,CAAM2B,CAAAA,EAAS,IAAI,CAAA,CAAA,CAAA,KAAA,GAE5CD,CAAAA,GAAQ,UAAA,CAEjB3B,CAAAA,CAAE,KAAK,QAAA,CAAS2B,CAAG,CAAA,CAAIC,CAAAA,CACvBnB,CAAAA,CAAe,aAAA,EAAc,EAC3Bc,CAAAA,CAAM,SAAA,CAAU,oBAAA,CAAqBvB,CAAAA,CAAE,IAAI,CAAA,CAC7CD,CAAAA,CAAeC,CAAAA,CAAGC,CAAAA,EAAc,IAAI,CAAA,CAAA,KAAA,GAC3B0B,CAAAA,GAAQ,UAAA,CAAA,CAEjB,GAAIE,CAAAA,CAAO,YAAA,CAAc,CACvB,IAAMG,CAAAA,CAAOT,CAAAA,CAAM,OAAA,CAAQQ,CAAAA,CAAM,KAAA,CAAOA,CAAAA,CAAM,MAAM,EAC9CE,CAAAA,CAAUV,CAAAA,CAAM,SAAA,CAAUQ,CAAAA,CAAM,KAAA,CAAOA,CAAAA,CAAM,MAAM,CAAA,CACzDR,CAAAA,CAAM,UAAA,CAAWQ,CAAAA,CAAM,KAAA,CAAOA,CAAAA,CAAM,MAAM,CAAA,CAC1C,IAAIG,EACAF,CAAAA,GAASA,CAAAA,CAAK,WAAA,EAAY,EAAK,OAAA,CAAQ,IAAA,CAAKA,CAAI,CAAA,CAClDE,CAAAA,CAAgBF,CAAAA,CAAK,WAAA,EAAY,EACxBA,CAAAA,GAASA,CAAAA,CAAK,WAAA,EAAY,EAAK,QAAQ,IAAA,CAAKA,CAAI,CAAA,CACzDE,CAAAA,CAAgBF,CAAAA,CAAK,WAAA,EAAY,CAAA,CAKnCT,CAAAA,CAAM,UAAA,CAAWQ,CAAAA,CAAM,KAAA,CAAOG,CAAAA,CAAeD,CAAO,CAAA,CACpDF,CAAAA,EACEF,CAAAA,CAAO,YAAA,EACPN,CAAAA,CAAM,YAAA,CAAaQ,CAAAA,CAAM,KAAA,CAAOA,CAAAA,CAAM,MAAM,EAChD,CAAA,CAAA,KAAA,GACSJ,CAAAA,GAAQ,QAAA,CAAU,CAE3B,IAAIQ,CAAAA,CAAM,KAAA,CACNP,CAAAA,GAAU,UAASO,CAAAA,CAAM,KAAA,CAAA,CACzBN,CAAAA,CAAO,YAAA,CACLE,CAAAA,EAASA,CAAAA,CAAM,MAAA,CACjBR,CAAAA,CAAM,UAAA,CACJQ,CAAAA,CAAM,KAAA,CACNA,CAAAA,CAAM,MAAA,CACNJ,CAAAA,CACAJ,CAAAA,CAAM,SAAA,CAAUQ,CAAK,CAAA,CAAE,MAAA,GAAWH,CAAAA,CAAQ,KAAA,CAAQO,CACpD,CAAA,CAEAZ,CAAAA,CAAM,UAAA,CACJ,CAAA,CACAA,CAAAA,CAAM,SAAA,EAAU,CAAI,CAAA,CACpBI,CAAAA,CACAJ,CAAAA,CAAM,SAAA,GAAY,MAAA,GAAWK,CAAAA,CAAQ,KAAA,CAAQO,CAC/C,CAAA,EAGF1B,CAAAA,CAAe,aAAA,EAAc,EAC3Bc,CAAAA,CAAM,SAAA,CAAU,oBAAA,CAAqBvB,CAAAA,CAAE,IAAI,CAAA,CAC7CuB,CAAAA,CAAM,UAAA,CACJ,CAAA,CACAA,CAAAA,CAAM,SAAA,EAAU,CAAI,CAAA,CACpBI,CAAAA,CACAJ,CAAAA,CAAM,SAAA,EAAU,CAAE,MAAA,GAAWK,CAAAA,CAAQ,KAAA,CAAQO,CAC/C,CAAA,CACApC,CAAAA,CAAeC,CAAC,GAEpB,CAAA,KAAA,GAAW2B,CAAAA,GAAQ,OAAA,CAEjBlB,CAAAA,CAAe,aAAA,EAAc,EAC3Bc,CAAAA,CAAM,SAAA,CAAU,oBAAA,CAAqBvB,CAAAA,CAAE,IAAI,CAAA,CACzC6B,CAAAA,CAAO,YAAA,CACTN,CAAAA,CAAM,MAAA,CAAOI,EAAKC,CAAK,CAAA,CAEvBL,CAAAA,CAAM,UAAA,CAAW,CAAA,CAAGA,CAAAA,CAAM,SAAA,EAAU,CAAGI,CAAAA,CAAKC,CAAK,CAAA,CAEnD7B,CAAAA,CAAeC,CAAC,CAAA,CAAA,KAAA,GACP2B,CAAAA,GAAQ,cAAA,CAEjBlB,EAAe,aAAA,EAAc,EAC3Bc,CAAAA,CAAM,SAAA,CAAU,oBAAA,CAAqBvB,CAAAA,CAAE,IAAI,CAAA,CAC7CA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS2B,CAAG,CAAA,CAAIC,CAAAA,CACvB7B,CAAAA,CAAeC,CAAC,CAAA,CAAA,KAAA,GACP2B,CAAAA,GAAQ,YAAA,EAAgBA,CAAAA,GAAQ,eAAA,CAEzClB,CAAAA,CAAe,aAAA,EAAc,EAC3Bc,CAAAA,CAAM,SAAA,CAAU,oBAAA,CAAqBvB,CAAAA,CAAE,IAAI,CAAA,CAC7CA,CAAAA,CAAE,IAAA,CAAK,SAAS2B,CAAG,CAAA,CAAIC,CAAAA,CACvB7B,CAAAA,CAAeC,CAAC,CAAA,CAAA,KAAA,GACP2B,CAAAA,GAAQ,OAAA,CAEjBlB,CAAAA,CAAe,aAAA,EAAc,EAC3Bc,CAAAA,CAAM,SAAA,CAAU,oBAAA,CAAqBvB,CAAAA,CAAE,IAAI,EACzC+B,CAAAA,EAASA,CAAAA,CAAM,MAAA,CACjBR,CAAAA,CAAM,UAAA,CAAWQ,CAAAA,CAAM,KAAA,CAAOA,CAAAA,CAAM,MAAA,CAAQJ,CAAAA,CAAKC,CAAK,CAAA,CAEtDL,CAAAA,CAAM,UAAA,CAAW,CAAA,CAAGA,CAAAA,CAAM,WAAU,CAAI,CAAA,CAAGI,CAAAA,CAAKC,CAAK,CAAA,CAEnD5B,CAAAA,CAAE,GAAA,GAAQ,UAAA,CACZD,CAAAA,CAAeC,CAAC,CAAA,CACPA,CAAAA,CAAE,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EACpCD,CAAAA,CAAeC,CAAAA,CAAE,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAC,CAAA,CAAA,KAAA,GAEpC2B,CAAAA,GAAQ,YAAA,CAEjBlB,CAAAA,CAAe,aAAA,EAAc,EAC3Bc,CAAAA,CAAM,SAAA,CAAU,oBAAA,CAAqBvB,CAAAA,CAAE,IAAI,CAAA,CAC7CA,CAAAA,CAAE,IAAA,CAAK,QAAA,CAAS2B,CAAG,CAAA,CAAIC,CAAAA,CACvB7B,CAAAA,CAAeC,CAAC,CAAA,CAAA,KAAA,GACP2B,CAAAA,GAAQ,MAAA,CAAQ,CAIzB,GAFAlB,CAAAA,CAAe,aAAA,IACbc,CAAAA,CAAM,SAAA,CAAU,oBAAA,CAAqBvB,CAAAA,CAAE,IAAI,CAAA,CACzC6B,CAAAA,CAAO,YAAA,CAAc,CACvB,GAAM,CAACO,CAAI,CAAA,CAASb,CAAAA,CAAM,OAAA,CAAQQ,CAAAA,EAAO,OAAS,CAAC,CAAA,CAC/CK,CAAAA,CAAK,OAAA,EAAQ,CAAE,IAAA,CACjBb,CAAAA,CAAM,MAAA,CAAOI,CAAAA,CAAK,KAAK,CAAA,CAEvBJ,CAAAA,CAAM,MAAA,CAAOI,CAAAA,CAAKC,CAAK,EAE3B,CAAA,KAAO,CACL,GAAM,CAACQ,CAAI,CAAA,CAASb,CAAAA,CAAM,OAAA,CAAQQ,CAAAA,EAAO,KAAA,EAAS,CAAC,CAAA,CAC/CK,CAAAA,CAAK,OAAA,EAAQ,CAAE,IAAA,CACjBb,EAAM,UAAA,CAAW,CAAA,CAAGA,CAAAA,CAAM,SAAA,EAAU,CAAGI,CAAAA,CAAK,KAAK,CAAA,CAEjDJ,CAAAA,CAAM,UAAA,CAAW,CAAA,CAAGA,CAAAA,CAAM,SAAA,EAAU,CAAGI,CAAAA,CAAKC,CAAK,EAErD,CACA7B,CAAAA,CAAeC,CAAC,EAClB,CAAA,KACM6B,CAAAA,CAAO,YAAA,CACLE,CAAAA,EAASA,CAAAA,CAAM,MAAA,CACjBR,CAAAA,CAAM,UAAA,CACJQ,CAAAA,CAAM,KAAA,CACNA,CAAAA,CAAM,MAAA,CACNJ,EACAC,CAAAA,GAAU,MAAA,CAAY,CAACL,CAAAA,CAAM,SAAA,CAAUQ,CAAK,CAAA,CAAEJ,CAAG,CAAA,CAAIC,CACvD,CAAA,CAEAL,CAAAA,CAAM,UAAA,CACJ,CAAA,CACAA,CAAAA,CAAM,SAAA,EAAU,CAAI,CAAA,CACpBI,CAAAA,CACAC,CAAAA,GAAU,MAAA,CAAY,CAACL,CAAAA,CAAM,SAAA,EAAU,CAAEI,CAAG,CAAA,CAAIC,CAClD,CAAA,EAGFnB,CAAAA,CAAe,aAAA,EAAc,EAC3Bc,EAAM,SAAA,CAAU,oBAAA,CAAqBvB,CAAAA,CAAE,IAAI,CAAA,CAC7CuB,CAAAA,CAAM,UAAA,CACJ,CAAA,CACAA,CAAAA,CAAM,SAAA,EAAU,CAAI,CAAA,CACpBI,CAAAA,CAEAC,CAAAA,GAAU,MAAA,CAAY,CAACL,CAAAA,CAAM,SAAA,EAAU,CAAEI,CAAG,CAAA,CAAIC,CAClD,CAAA,CACA7B,CAAAA,CAAeC,CAAC,CAAA,EAOtB,CAAA,CAAG,CAAC,EACN,EDlWO,IAAMqC,CAAAA,CAAN,cAA2BC,QAAS,CAQzC,WAAA,CAAYT,CAAAA,CAAa,CACvB,KAAA,CAAMA,CAAM,CAAA,CAJd,IAAA,CAAO,KAAA,CAAa,IAAA,CAyFpB,IAAA,CAAQ,gBAAA,CAAmB,KAAA,CAC3B,IAAA,CAAQ,WAAA,CAAc,CAAA,CArFpB,IAAA,CAAK,QAAA,CAAW,EAAC,CACjB,IAAA,CAAK,kBAAA,CAAqB,IAAA,CAAK,QAAA,CAAUG,CAAAA,EAAc,CACrDjC,CAAAA,CAAeiC,CAAI,EACrB,CAAA,CAAG,GAAG,EACR,CAZA,IAAW,GAAA,EAAM,CACf,OAAO,cACT,CAYQ,QAAA,CACNO,CAAAA,CACAC,CAAAA,CACG,CACH,IAAIC,CAAAA,CAAyB,IAAA,CAC7B,OAAQ,CAAA,GAAIC,IAAgB,CACtBD,CAAAA,GAAY,IAAA,EACd,MAAA,CAAO,YAAA,CAAaA,CAAO,CAAA,CAE7BA,CAAAA,CAAU,MAAA,CAAO,UAAA,CACf,IAAMF,CAAAA,CAAK,KAAA,CAAM,IAAA,CAAMG,CAAI,CAAA,CAC3BF,CACF,EACF,CAAA,CACF,CAEO,QAAA,EAAiB,CACtB,GAAM,CAAE,MAAA,CAAAX,CAAO,CAAA,CAAIpB,CAAAA,CAAe,SAAA,EAAU,CACtCuB,CAAAA,CAAOH,CAAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA,CACxC,CAAE,MAAA,CAAA1B,CAAAA,CAAQ,MAAA,CAAAC,CAAO,CAAA,CAAI4B,CAAAA,CAAK,cAAA,CAC1B3B,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAIF,CAAM,CAAA,CAAG,IAAA,CAAK,GAAA,CAAIC,CAAM,CAAC,CAAA,CACvDuC,CAAAA,CAAW,QAAA,CAAS,aAAA,CAAc,kBAAkB,CAAA,CACpD,CAAE,KAAA,CAAAjC,CAAM,CAAA,CAAIiC,CAAAA,CAClB,KAAK,QAAA,CAAW,CACdd,CAAAA,CAAO,GAAA,CAAIe,gBAAAA,CAAiB,KAAA,CAAQ5C,CAAAA,EAAW,CACxCgC,CAAAA,CAAK,IAAA,CAAK,YAAA,GACbA,CAAAA,CAAK,IAAA,CAAK,YAAA,CAAe,IAAA,CAAA,CAEvBA,CAAAA,CAAK,KAAK,YAAA,GACZtB,CAAAA,CAAM,KAAA,CAAQsB,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAQ3B,CAAAA,CAAY,IAAA,CAC9CK,CAAAA,CAAM,MAAA,CAAS,MAAA,CAAA,CAEjB,IAAImC,CAAAA,CAAQ,CAAA,CACRb,CAAAA,CAAK,MAAA,CAAO,GAAA,GAAQ,UAAA,EAAcA,CAAAA,CAAK,MAAA,CAAO,SAAA,EAAaA,CAAAA,CAAK,IAAA,EAAM,QAAA,EAAU,KAAA,GAClFa,CAAAA,CAAQb,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAQA,CAAAA,CAAK,IAAA,EAAM,QAAA,CAAS,MAChDA,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAA,CAAWA,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAA,CAAWa,CAAAA,CAAAA,CAG9Db,CAAAA,CAAK,IAAA,EAAM,QAAA,EAAU,KAAA,GAAUA,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,MAAQA,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAA,CACtE,IAAA,CAAK,kBAAA,CAAmBA,CAAI,EAC9B,CAAC,CAAA,CACDH,CAAAA,CAAO,GAAA,CAAIiB,YAAAA,CAAa,UAAA,CAAY,IAAM,CACnCd,CAAAA,CAAK,OAAO,MAAA,EACfH,CAAAA,CAAO,eAAA,CAAgBG,CAAAA,CAAM,IAAI,EAErC,CAAC,CACH,EACF,CAGO,MAAA,EAAe,CACpB,GAAM,CAAE,MAAA,CAAAH,CAAO,CAAA,CAAIpB,CAAAA,CAAe,SAAA,EAAU,CAC5C,OAAA,CAAQ,GAAA,CAAIoB,CAAAA,CAAO,OAAA,CAAS,GAAG,CAAA,CAC/B,IAAMG,CAAAA,CAAYH,CAAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,UAAU,EAE7C,CAAE,MAAA,CAAA1B,CAAAA,CAAQ,MAAA,CAAAC,CAAO,CAAA,CAAI4B,CAAAA,CAAK,cAAA,CAC1B3B,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAIF,CAAM,CAAA,CAAG,IAAA,CAAK,IAAIC,CAAM,CAAC,CAAA,CAC7D,IAAA,CAAK,QAAA,EAAS,CACd,IAAA,CAAK,KAAA,CAAQK,CAAAA,CAAe,QAAA,EAAS,CACrC,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,oBAAA,CAAqBuB,CAAAA,CAAK,IAAI,CAAA,CACnD,IAAMW,CAAAA,CAAW,QAAA,CAAS,aAAA,CAAc,kBAAkB,CAAA,CACpD,CAAE,KAAA,CAAAjC,CAAM,CAAA,CAAIiC,CAAAA,CAEdX,CAAAA,CAAK,IAAA,CAAK,YAAA,EACZtB,CAAAA,CAAM,KAAA,CAAQsB,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAQ3B,CAAAA,CAAY,IAAA,CAC9CK,CAAAA,CAAM,MAAA,CAASsB,CAAAA,CAAK,MAAA,CAAO,MAAA,CAAS3B,CAAAA,CAAY,IAAA,GAEhDK,CAAAA,CAAM,KAAA,CAAQ,MAAA,CACdA,EAAM,MAAA,CAAS,MAAA,EAQnB,CAIO,oBAAA,CAAqBsB,CAAAA,CAAiB,CAC3CA,CAAAA,EACEA,CAAAA,CAAK,GAAA,CAAI,CACP,KAAA,CAAOA,CAAAA,CAAK,QAAA,CAAS,SAAA,CAAU,KAAA,CAC/B,MAAA,CAAQA,EAAK,QAAA,CAAS,SAAA,CAAU,MAClC,CAAC,EACL,CAEO,QAAA,EAAiB,CACtB,IAAM,CAAE,MAAA,CAAAH,CAAO,CAAA,CAAIpB,CAAAA,CAAe,SAAA,EAAU,CACtCuB,EAAOH,CAAAA,CAAO,OAAA,CAAQ,OAAA,CAAQ,UAAU,CAAA,CACnCA,CAAAA,CAAO,QAClB,OAAA,CAAQ,GAAA,CAAI,+BAAW,CAAA,CAEnB,IAAA,CAAK,WAAA,EAAgBG,CAAAA,CAAa,WAAA,EAClC,IAAA,CAAK,iBAMX,CAGO,QAAA,EAAiB,CACtB,GAAM,CAAE,MAAA,CAAAH,CAAO,CAAA,CAAIpB,CAAAA,CAAe,SAAA,EAAU,CAC5CoB,CAAAA,CAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,EAC3B,CAGO,SAAA,EAAkB,CAAC,CAC5B,CAAA,CA/HaQ,CAAAA,CAANU,CAAAA,CAAA,CAFNC,gBAAAA,EAAiB,CAAA,CAELX,CAAAA,CAAAA,CELN,IAAMY,CAAAA,CAAN,cAAyBC,WAAY,CAArC,WAAA,EAAA,CAAA,KAAA,CAAA,GAAA,SAAA,CAAA,CAOL,IAAA,CAAO,MAAA,CAAS,CACd,UAAW,KACb,CAAA,CAEA,IAAA,CAAO,QAAA,CAAkB,EAAC,CAE1B,IAAA,CAAU,UAAA,CAEM,MAAA,CAChB,IAAA,CAAU,MAAA,CAA8B,MAAA,CACxC,IAAA,CAAU,UAAA,CAAkC,MAAA,CAC5C,IAAA,CAAU,SAAA,CAAiC,MAAA,CAC3C,IAAA,CAAO,KAAA,CAAa,IAAA,CACpB,IAAA,CAAO,WAAA,CAAuB,KAAA,CA0F9B,IAAA,CAAQ,OAAA,CAAU,SAAY,CAC5B,GAAM,CAAE,OAAA,CAAAC,CAAQ,EAAI,IAAA,CAEpBpD,CAAAA,CAAe,IAAA,CAAK,UAAU,EAMhC,CAAA,CA4BA,IAAA,CAAQ,gBAAA,CAAmB,MAAA,CAlJ3B,IAAW,GAAA,EAAM,CACf,OAAO,YACT,CAkBO,MAAA,EAAe,CACpB,GAAM,CAAE,MAAA,CAAA8B,CAAO,CAAA,CAAI,IAAA,CACb,CAAE,MAAA,CAAAuB,CAAO,CAAA,CAAIvB,CAAAA,CAAO,GAAA,CACpBG,CAAAA,CAAO,IAAA,CAAK,UAAA,CACZ,CAAE,OAAA7B,CAAAA,CAAQ,MAAA,CAAAC,CAAO,CAAA,CAAI4B,CAAAA,CAAK,cAAA,CAC1B3B,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAIF,CAAM,CAAA,CAAG,IAAA,CAAK,GAAA,CAAIC,CAAM,CAAC,CAAA,CAG7D,IAAA,CAAK,UAAA,CAAa,EAAE4B,CAAAA,YAAgB,IAAA,CAAA,CACpC,IAAA,CAAK,SAAA,CAAYoB,CAAAA,CAAO,QAAA,CACxBA,CAAAA,CAAO,QAAA,CAAW,KAAA,CAElB,IAAMT,CAAAA,CAAO,KAAK,OAAA,CAAU,QAAA,CAAS,aAAA,CAAc,kBAAkB,CAAA,CAC/D,CAAE,KAAA,CAAAjC,CAAM,CAAA,CAAIiC,CAAAA,CAiClB,GAhCAjC,CAAAA,CAAM,UAAA,CAAa,SAAA,CAIfsB,CAAAA,CAAK,IAAA,CAAK,cACZtB,CAAAA,CAAM,KAAA,CAAQsB,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAQ3B,CAAAA,CAAY,IAAA,CAC9CK,CAAAA,CAAM,MAAA,CAASsB,CAAAA,CAAK,MAAA,CAAO,MAAA,CAAS3B,CAAAA,CAAY,IAAA,GAEhDK,CAAAA,CAAM,KAAA,CAAQ,OACdA,CAAAA,CAAM,MAAA,CAAS,MAAA,CAAA,CAIjBA,CAAAA,CAAM,OAAA,CAAU,eAAA,CAEZsB,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAA,GACrBW,CAAAA,CAAI,KAAA,CAAM,QAAA,CAAW,CAAA,EAAGX,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,QAAA,CAAW3B,CAAS,CAAA,EAAA,CAAA,CAAA,CAK7D2B,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,UAAA,GACrBW,CAAAA,CAAI,KAAA,CAAM,UAAA,CAAaX,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,UAAA,CAAA,CAExCA,CAAAA,CAAK,KAAK,QAAA,CAAS,aAAA,GACrBW,CAAAA,CAAI,KAAA,CAAM,aAAA,CAAgB,CAAA,EAAGX,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,aAAa,CAAA,EAAA,CAAA,CAAA,CAE3DA,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,UAAA,CACrBW,CAAAA,CAAI,MAAM,UAAA,CAAa,CAAA,EAAGX,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,UAAU,CAAA,CAAA,CAEvDW,CAAAA,CAAI,KAAA,CAAM,UAAA,CAAa,MAAA,CAErBX,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,YAAA,CAAc,CACnC,IAAMzB,CAAAA,CAAgBoC,CAAAA,CAAI,aAAA,CAAc,YAAY,CAAA,CACpDpC,CAAAA,CAAS,KAAA,CAAM,YAAA,CAAe,CAAA,EAAGyB,CAAAA,CAAK,IAAA,CAAK,QAAA,CAAS,YAAY,CAAA,EAClE,CAEA,IAAA,CAAK,KAAA,CAAQvB,CAAAA,CAAe,QAAA,EAAS,CAGrC,IAAA,CAAK,KAAA,CAAM,SAAA,CAAU,oBAAA,CAAqBuB,CAAAA,CAAK,IAAI,CAAA,CAE/CA,CAAAA,CAAK,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,CAAE,IAAI,QAAA,CAAS,OAAO,CAAA,EAC9CtB,CAAAA,CAAM,KAAA,CAAQsB,CAAAA,CAAK,MAAA,CAAO,KAAA,CAAQ3B,CAAAA,CAAY,IAAA,CAC9CK,CAAAA,CAAM,IAAA,CAAO,KAAA,CACb,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,EAAG,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU,CAAG,OAAA,CAAS,QAAQ,CAAA,EAElE,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,CAAA,CAAG,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU,CAAI,CAAC,EAKvD,IAAA,CAAK,KAAA,CAAM,EAAA,CAAG,aAAA,CAAe,IAAA,CAAK,OAAO,CAAA,CAEzC,IAAA,CAAK,QAAA,CAAW,CAEdmB,CAAAA,CAAO,GAAA,CAAI,GAAA,CAAIiB,cAAAA,CAAa,IAAA,CAAO9C,CAAAA,EAAoB,CACrD,GAAI,CAAE,MAAA,CAAAqD,CAAO,CAAA,CAAIrD,CAAAA,CAAE,MAAA,CACjBsD,CAAAA,CAAgB,KAAA,CAClB,KAAOD,CAAAA,EACDA,CAAAA,GAAWV,CAAAA,GAAKW,CAAAA,CAAO,IAAA,CAAA,CAC3BD,EAASA,CAAAA,CAAO,aAAA,CAEbC,CAAAA,GACHzB,CAAAA,CAAO,gBAAA,EAAiB,CACxBA,CAAAA,CAAO,MAAA,EAAO,EAElB,CAAC,CACH,EAKF,CAaO,QAAA,EAAW,CAChB,GAAM,CAAE,UAAA,CAAYG,CAAK,CAAA,CAAI,IAAA,CACvB,CAAE,MAAA,CAAA7B,CAAAA,CAAQ,MAAA,CAAAC,CAAO,CAAA,CAAI4B,CAAAA,CAAK,cAAA,CAC1B3B,CAAAA,CAAY,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,IAAIF,CAAM,CAAA,CAAG,IAAA,CAAK,GAAA,CAAIC,CAAM,CAAC,CAAA,CAGzD,CAAE,KAAA,CAAAmD,CAAAA,CAAO,MAAA,CAAAjC,CAAO,CAAA,CAAIU,CAAAA,CAAK,MAAA,CAAO,OAAA,CAClCuB,CAAAA,EAASlD,CAAAA,CAAaiB,CAAAA,EAAUjB,CAAAA,CAElC,GAAM,CAAE,CAAA,CAAAmD,CAAAA,CAAG,CAAA,CAAAC,CAAE,CAAA,CAAI,IAAA,CAAK,MAAA,CAClBzB,CAAAA,CAAK,GAAA,CAAI,YAAA,CACTA,EAAK,GAAA,CAAI,IAAA,CAAK,YAAA,CACZ,CAAE,CAAA,CAAA0B,CAAAA,CAAG,CAAA,CAAAC,CAAAA,CAAG,CAAA,CAAAC,CAAAA,CAAG,CAAA,CAAAC,CAAAA,CAAG,CAAA,CAAA7D,CAAAA,CAAG,CAAA,CAAA8D,CAAE,EAAI,IAAIC,MAAAA,CAAO/B,CAAAA,CAAK,cAAc,CAAA,CACxD,KAAA,CAAM,CAAA,CAAI3B,CAAS,CAAA,CACnB,cAAA,CAAe,CAAA,CAAG,CAAC,CAAA,CAEhB,CAAE,KAAA,CAAAK,CAAM,EAAI,IAAA,CAAK,OAAA,CACvBA,CAAAA,CAAM,SAAA,CAAY,CAAA,OAAA,EAAUgD,CAAC,CAAA,CAAA,EAAIC,CAAC,CAAA,CAAA,EAAIC,CAAC,CAAA,CAAA,EAAIC,CAAC,CAAA,CAAA,EAAI7D,CAAC,CAAA,CAAA,EAAI8D,CAAC,CAAA,CAAA,CAAA,CACtDpD,CAAAA,CAAM,IAAA,CAAO8C,CAAAA,CAAI,IAAA,CACjB9C,CAAAA,CAAM,GAAA,CAAM+C,CAAAA,CAAI,IAAA,CAGhBzB,CAAAA,CAAK,GAAA,CAAI,CACP,OAAA,CAAS,KACX,CAAC,EACH,CAEO,QAAA,EAAiB,CACtB,GAAM,CAAE,UAAA,CAAYA,CAAAA,CAAM,MAAA,CAAAH,CAAAA,CAAQ,OAAA,CAASvB,CAAI,CAAA,CAAI,IAAA,CAK/C0B,CAAAA,GACF,IAAA,CAAK,OAAA,EAAQ,CAETH,EAAO,GAAA,GAAKA,CAAAA,CAAO,GAAA,CAAI,MAAA,CAAO,QAAA,CAAW,IAAA,CAAK,SAAA,CAAA,CAClDA,CAAAA,CAAO,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA,CAIzB,IAAA,CAAK,OAAA,CAAQ,KAAA,CAAM,UAAA,CAAa,SAChC,IAAA,CAAK,QAAA,CAAW,EAAC,CAAA,CAIjBG,CAAAA,CAAK,MAAA,EACLA,CAAAA,CAAK,MAAA,CAAO,IAAA,EAAQ,MAAA,EACpBA,CAAAA,CAAK,MAAA,CAAO,QAAA,CAAS,IAAA,CAAMhC,CAAAA,EAAWA,CAAAA,CAAE,GAAA,GAAQ,KAAK,CAAA,EAErDgC,CAAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,KAAK,CAAA,CAAE,OAAA,CAAU,CAAA,CACrCA,CAAAA,CAAK,OAAA,CAAU,KAAA,EAGfA,CAAAA,CAAK,GAAA,CAAI,CACP,QAAS,IACX,CAAC,CAAA,CAEC,IAAA,CAAK,KAAA,CAAM,SAAA,EAAU,GAAM,CAAA,EAAKA,CAAAA,CAAK,MAAA,CAAO,IAAA,GAAS,MAAA,EACvDA,CAAAA,CAAK,MAAA,CAAO,MAAA,EAAO,CAErB,KAAK,KAAA,CAAM,GAAA,CAAI,aAAA,CAAe,IAAA,CAAK,OAAO,EAC5C,CACF,CAAA,CAxLaiB,CAAAA,CAANF,CAAAA,CAAA,CADNiB,mBAAAA,EAAoB,CAAA,CACRf,CAAAA,CAAAA,CCJY,SAARgB,CAAAA,CAA6BC,CAAAA,CAAK,CAAE,QAAA,CAAAC,CAAS,CAAA,CAAI,EAAC,CAAG,CAC1D,GAAY,OAAO,QAAA,CAAa,GAAA,CAAa,OAE7C,IAAMC,CAAAA,CAAO,QAAA,CAAS,IAAA,EAAQ,QAAA,CAAS,oBAAA,CAAqB,MAAM,CAAA,CAAE,CAAC,CAAA,CAC/D1D,CAAAA,CAAQ,SAAS,aAAA,CAAc,OAAO,CAAA,CAC5CA,CAAAA,CAAM,IAAA,CAAO,UAAA,CAETyD,CAAAA,GAAa,KAAA,EACXC,CAAAA,CAAK,UAAA,CACPA,CAAAA,CAAK,YAAA,CAAa1D,CAAAA,CAAO0D,CAAAA,CAAK,UAAU,CAAA,CAK1CA,EAAK,WAAA,CAAY1D,CAAK,CAAA,CAGpBA,CAAAA,CAAM,UAAA,CACRA,CAAAA,CAAM,UAAA,CAAW,OAAA,CAAUwD,CAAAA,CAE3BxD,CAAAA,CAAM,WAAA,CAAY,QAAA,CAAS,cAAA,CAAewD,CAAG,CAAC,EAElD,CCvB8BD,CAAAA,CAAY,CAAA;AAAA,CAAsT,ECOnW,IAAMI,EAAoB,8lBAAA,CCIjC,SAASC,EAAiBC,CAAAA,CAA0B,CAElD,IAAMC,CAAAA,CAASD,CAAAA,CACZ,QAAQ,4BAAA,CAA8B,EAAE,EACxC,OAAA,CAAQ,0BAAA,CAA4B,EAAE,CAAA,CACtC,QAAQ,KAAA,CAAO,EAAE,EAEpB,OAAOE,CAAAA,CAAoBD,CAAM,CACnC,CAKA,SAASC,CAAAA,CAAoBD,CAAAA,CAA6B,CACxD,IAAME,CAAAA,CAAe,KAAKF,CAAM,CAAA,CAC1BG,EAAQ,IAAI,UAAA,CAAWD,CAAAA,CAAa,MAAM,EAEhD,IAAA,IAASE,CAAAA,CAAI,EAAGA,CAAAA,CAAIF,CAAAA,CAAa,OAAQE,CAAAA,EAAAA,CACvCD,CAAAA,CAAMC,CAAC,CAAA,CAAIF,CAAAA,CAAa,WAAWE,CAAC,CAAA,CAGtC,OAAOD,CAAAA,CAAM,MACf,CAKA,eAAeE,CAAAA,EAAsC,CAEnD,IAAMC,CAAAA,CAAe,KAAKT,CAAiB,CAAA,CACrCU,EAAkBT,CAAAA,CAAiBQ,CAAY,EAcrD,OAXkB,MAAM,OAAO,MAAA,CAAO,SAAA,CACpC,OACAC,CAAAA,CACA,CACE,KAAM,mBAAA,CACN,IAAA,CAAM,SACR,CAAA,CACA,KAAA,CACA,CAAC,QAAQ,CACX,CAGF,CASA,eAAsBC,CAAAA,CACpBC,CAAAA,CACAC,EACkB,CAClB,GAAI,CAEF,IAAMC,CAAAA,CAAY,MAAMN,CAAAA,EAAgB,CAGlCO,EAAa,IAAI,WAAA,GAAc,MAAA,CAAOH,CAAI,CAAA,CAC1CI,CAAAA,CAAkBZ,EAAoBS,CAAS,CAAA,CAUrD,OAPgB,MAAM,MAAA,CAAO,OAAO,MAAA,CAClC,mBAAA,CACAC,EACAE,CAAAA,CACAD,CACF,CAGF,CAAA,MAASE,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,uCAAwCA,CAAK,CAAA,CACpD,KACT,CACF,CC5DA,eAAeC,CAAAA,CAAaC,EAA8C,CACxE,GAAI,CAEF,IAAMC,CAAAA,CAAU,KAAKD,CAAO,CAAA,CAGtBE,EAAiC,IAAA,CAAK,KAAA,CAAMD,CAAO,CAAA,CAGzD,GAAI,CAACC,CAAAA,CAAe,IAAA,EAAQ,CAACA,CAAAA,CAAe,SAAA,CAC1C,eAAQ,KAAA,CAAM,kCAAkC,EACzC,IAAA,CAST,GAAI,CALmB,MAAMV,CAAAA,CAC3BU,EAAe,IAAA,CACfA,CAAAA,CAAe,SACjB,CAAA,CAGE,OAAA,OAAA,CAAQ,MAAM,iEAAiE,CAAA,CACxE,KAIT,IAAMT,CAAAA,CAAoB,IAAA,CAAK,KAAA,CAAMS,EAAe,IAAI,CAAA,CAExD,eAAQ,GAAA,CAAI,2CAA2C,EAChDT,CAET,CAAA,MAASK,EAAO,CACd,OAAA,OAAA,CAAQ,MAAM,oCAAA,CAAsCA,CAAK,EAClD,IACT,CACF,CAKA,SAASK,CAAAA,CAAeC,CAAAA,CAAoC,CAE1D,GAAI,CAACA,CAAAA,EAAkBA,EAAe,MAAA,GAAW,CAAA,CAC/C,OAAO,KAAA,CAIT,IAAMC,EAAgB,MAAA,CAAO,QAAA,CAAS,SAGtC,GAAIA,CAAAA,GAAkB,aAAeA,CAAAA,GAAkB,WAAA,CACrD,eAAQ,GAAA,CAAI,kDAAkD,CAAA,CACvD,IAAA,CAIT,IAAMC,CAAAA,CAAUF,CAAAA,CAAe,KAAKG,CAAAA,EAAU,CAE5C,GAAIA,CAAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAAG,CAC3B,IAAMC,CAAAA,CAAaD,CAAAA,CAAO,MAAM,CAAC,CAAA,CACjC,OAAOF,CAAAA,CAAc,QAAA,CAASG,CAAU,CAC1C,CACA,OAAOH,CAAAA,GAAkBE,CAC3B,CAAC,CAAA,CAED,OAAKD,IACH,OAAA,CAAQ,KAAA,CAAM,oCAAoCD,CAAa,CAAA,CAAE,EACjE,OAAA,CAAQ,KAAA,CAAM,6BAA8BD,CAAc,CAAA,CAAA,CAGrDE,CACT,CAKA,SAASG,CAAAA,CAAmBC,CAAAA,CAA8B,CACxD,GAAI,CAACA,EAAY,OAAO,KAAA,CAExB,GAAI,CACF,IAAMC,EAAS,IAAI,IAAA,CAAKD,CAAU,CAAA,CAC5BE,CAAAA,CAAM,IAAI,IAAA,CAEhB,GAAIA,GAAOD,CAAAA,CACT,OAAA,OAAA,CAAQ,MAAM,CAAA,iCAAA,EAAoCD,CAAU,EAAE,CAAA,CACvD,CAAA,CAAA,CAIT,IAAMG,CAAAA,CAAgB,IAAA,CAAK,MAAMF,CAAAA,CAAO,OAAA,GAAYC,CAAAA,CAAI,OAAA,KAAc,GAAA,CAAO,EAAA,CAAK,GAAK,EAAA,CAAG,CAAA,CAE1F,OAAIC,CAAAA,EAAiB,CAAA,EACnB,OAAA,CAAQ,IAAA,CAAK,oCAAoCA,CAAa,CAAA,KAAA,CAAO,EAGhE,CAAA,CACT,CAAA,KAAgB,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,wCAAyCH,CAAU,CAAA,CAC1D,KACT,CACF,CAKA,SAASI,EAAAA,CAAkBC,CAAAA,CAA6B,CACtD,GAAI,CAACA,EAAW,OAAO,KAAA,CAEvB,GAAI,CAIF,OAHc,IAAI,IAAA,CAAKA,CAAS,EACpB,IAAI,IAAA,EAGd,QAAQ,KAAA,CAAM,+CAA+C,EACtD,CAAA,CAAA,EAGF,CAAA,CACT,MAAQ,CACN,OAAO,KACT,CACF,CAKA,eAAsBC,CAAAA,CAAgBhB,EAInC,CACD,GAAI,CAEF,IAAMP,CAAAA,CAAO,MAAMM,CAAAA,CAAaC,CAAO,EAEvC,OAAKP,CAAAA,CAQAqB,GAAkBrB,CAAAA,CAAK,SAAS,EAShCU,CAAAA,CAAeV,CAAAA,CAAK,OAAO,CAAA,CAS3BgB,CAAAA,CAAmBhB,CAAAA,CAAK,UAAU,GASvC,OAAA,CAAQ,GAAA,CAAI,kCAAkC,CAAA,CAC9C,OAAA,CAAQ,IAAI,yBAAA,CAA2B,CACrC,IAAKA,CAAAA,CAAK,GAAA,CACV,QAASA,CAAAA,CAAK,OAAA,CACd,WAAYA,CAAAA,CAAK,UAAA,CACjB,SAAUA,CAAAA,CAAK,QACjB,CAAC,CAAA,CAEM,CACL,KAAA,CAAO,CAAA,CAAA,CACP,KAAAA,CACF,CAAA,EAnBS,CACL,KAAA,CAAO,CAAA,CAAA,CACP,MAAO,qBAAA,CACP,IAAA,CAAAA,CACF,CAAA,CAbO,CACL,MAAO,CAAA,CAAA,CACP,KAAA,CAAO,iCAAiC,MAAA,CAAO,QAAA,CAAS,QAAQ,CAAA,CAAA,CAChE,IAAA,CAAAA,CACF,CAAA,CAbO,CACL,MAAO,CAAA,CAAA,CACP,KAAA,CAAO,6BACP,IAAA,CAAAA,CACF,EAZO,CACL,KAAA,CAAO,GACP,KAAA,CAAO,sDACT,CA4CJ,CAAA,MAASK,CAAAA,CAAO,CACd,OAAA,OAAA,CAAQ,KAAA,CAAM,6BAAA,CAA+BA,CAAK,EAC3C,CACL,KAAA,CAAO,MACP,KAAA,CAAO,2BACT,CACF,CACF,CCnNA,IAAImB,CAAAA,CAA4B,IAAA,CAC5BC,EAAkC,IAAA,CAClCC,CAAAA,CAAiB,MAQrB,eAAsBC,EAAAA,CAAWpB,EAAmC,CAClE,OAAA,CAAQ,GAAA,CAAI,iCAAiC,EAE7C,IAAMqB,CAAAA,CAAS,MAAML,CAAAA,CAAgBhB,CAAO,EAE5C,OAAIqB,CAAAA,CAAO,OAASA,CAAAA,CAAO,IAAA,EACzBJ,EAAajB,CAAAA,CACbkB,CAAAA,CAAcG,EAAO,IAAA,CACrBF,CAAAA,CAAiB,KAEjB,OAAA,CAAQ,GAAA,CAAI,iDAA4C,CAAA,CACxD,QAAQ,GAAA,CACN,CAAA,uBAAA,EAA0BE,EAAO,IAAA,CAAK,UAAA,EAAc,WAAW,CAAA,CACjE,CAAA,CAEO,OAEPJ,CAAAA,CAAa,IAAA,CACbC,EAAc,IAAA,CACdC,CAAAA,CAAiB,MAEjB,OAAA,CAAQ,KAAA,CAAM,8CAA0CE,CAAAA,CAAO,KAAK,EAE7D,KAAA,CAEX,CAOA,eAAsBC,CAAAA,EAAiC,CACrD,GAAI,CAACL,CAAAA,CACH,eAAQ,IAAA,CAAK,mCAAmC,EACzC,KAAA,CAGT,GAAI,CAACE,CAAAA,CACH,OAAA,OAAA,CAAQ,KAAK,gCAAgC,CAAA,CACtC,MAIT,IAAME,CAAAA,CAAS,MAAML,CAAAA,CAAgBC,CAAU,CAAA,CAC/C,OAAAE,EAAiBE,CAAAA,CAAO,KAAA,CAEnBF,IACH,OAAA,CAAQ,KAAA,CAAM,uCAAwCE,CAAAA,CAAO,KAAK,EAClEH,CAAAA,CAAc,IAAA,CAAA,CAGTC,CACT,CAOO,SAASI,IAAqC,CACnD,OAAOL,CACT,KC3EMM,CAAAA,CAAN,MAAMC,CAAe,CAIX,WAAA,EAAc,CAFtB,IAAA,CAAQ,KAAA,CAAsB,KAC9B,IAAA,CAAO,IAAA,CAAmB,KACH,CAEvB,OAAO,aAAc,CACnB,OAAKA,EAAe,QAAA,GAClBA,CAAAA,CAAe,QAAA,CAAW,IAAIA,GAEzBA,CAAAA,CAAe,QACxB,CAEA,MAAM,IAAA,CAAKC,EAAU,CAGnB,GAAI,CADY,MAAMJ,CAAAA,GAEpB,MAAM,IAAI,MACR,wJACF,CAAA,CAGF,GADA,IAAA,CAAK,IAAA,CAAOI,EACR,IAAA,CAAK,KAAA,CAAO,OAAO,IAAA,CAAK,KAAA,CAE5B,IAAIC,CAAAA,CAAK,QAAA,CAAS,eAAe,iBAAiB,CAAA,CAClD,GAAKA,CAAAA,CA4CH,IAAA,CAAK,MAAQ,IAAA,CAAK,IAAA,CAAK,OAAO,KAAA,CAAA,KA3C9B,OAAAA,EAAK,QAAA,CAAS,aAAA,CAAc,KAAK,CAAA,CACjCA,EAAG,EAAA,CAAK,iBAAA,CACRA,EAAG,KAAA,CAAM,QAAA,CAAW,QACpBA,CAAAA,CAAG,KAAA,CAAM,gBAAkB,UAAA,CAC3BA,CAAAA,CAAG,MAAM,YAAA,CAAe,YAAA,CACxBA,EAAG,KAAA,CAAM,SAAA,CAAY,YACrBA,CAAAA,CAAG,KAAA,CAAM,WAAa,QAAA,CACtB,QAAA,CAAS,KAAK,WAAA,CAAYA,CAAE,EAC5B,IAAA,CAAK,KAAA,CAAQ,IAAIC,CAAAA,CAAM,kBAAA,CAAoB,CACzC,KAAA,CAAO,MAAA,CACP,QAAS,CACP,OAAA,CAAS,MACT,QAAA,CAAU,CACR,SAAU,CACR,KAAA,CAAO,CACL,GAAA,CAAK,QACL,OAAA,CAAUrF,CAAAA,EAAe,CACvB,GAAM,CAACK,CAAI,CAAA,CAAI,IAAA,CAAK,MAAO,OAAA,CAAQL,CAAAA,CAAM,KAAK,CAAA,CACxCsF,CAAAA,CAAiBD,EAAM,MAAA,CAAO,aAAa,EACjD,GAAI,CAACC,GAAW,aAAA,CAAe,OAAO,MAEtC,IAAMC,CAAAA,CAAcD,EAAU,aAAA,CAAcjF,CAAI,EAC1CmF,CAAAA,CAAQ,IAAIC,OAAM,CACrB,MAAA,CAAOzF,EAAM,KAAK,CAAA,CAClB,OAAOA,CAAAA,CAAM,MAAM,EACnB,MAAA,CAAO;AAAA,CAAA,CAAMuF,CAAW,CAAA,CAE3B,OAAA,IAAA,CAAK,KAAA,CAAO,cAAA,CAAeC,CAAAA,CAAOH,CAAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,CACpD,IAAA,CAAK,KAAA,CAAO,aACVrF,CAAAA,CAAM,KAAA,CAAQ,CAAA,CACdqF,CAAAA,CAAM,OAAA,CAAQ,MAChB,CAAA,CACO,KACT,CACF,CACF,CACF,CACF,CACF,CAAC,CAAA,CACD,IAAA,CAAK,IAAA,CAAK,OAAO,KAAA,CAAQ,IAAA,CAAK,KAAA,CAC9B,IAAA,CAAK,aAAA,EAAc,CACZ,IAAA,CAAK,KAIhB,CAEO,QAAA,EAAW,CAChB,GAAI,CAAC,IAAA,CAAK,KAAA,CACR,MAAM,IAAI,KAAA,CAAM,kDAAkD,CAAA,CAEpE,OAAO,IAAA,CAAK,KACd,CAEO,SAAA,EAAY,CACjB,GAAI,CAAC,IAAA,CAAK,IAAA,CACR,MAAM,IAAI,KAAA,CAAM,iDAAiD,EAEnE,OAAO,IAAA,CAAK,IACd,CAEO,YAAA,EAAe,CACpB,OAAA,OAAA,CAAQ,GAAA,CACN,IAAA,CAAK,KAAA,EAAO,SAAA,CAAU,UAAA,CACtB,kCACF,CAAA,CACO,IAAA,CAAK,KAAA,EAAO,UAAU,UAC/B,CAEQ,aAAA,EAAgB,CAEtBK,SAAAA,CAAU,SAAA,CAAY,MAAA,CACtBL,CAAAA,CAAM,SAAS,cAAA,CAAgBK,SAAAA,CAAW,IAAI,EAChD,CAEO,aAAA,EAAyB,CAC9B,OAAK,KAAK,IAAA,CAAK,MAAA,CACX,IAAA,CAAK,IAAA,CAAK,MAAA,CAAO,QAAA,GAAa,IAAA,CADJ,KAMhC,CACO,QAAA,CACLC,CAAAA,CACAC,CAAAA,CAAQ,CAAA,CACRC,CAAAA,CACM,CAEN,GAAM,CAAE,OAAA/F,CAAO,CAAA,CAAI,IAAA,CAAK,IAAA,CAClBgG,CAAAA,CAAOD,CAAAA,EAAoB/F,CAAAA,CAAO,QAAA,CAAS,KAC3CiG,CAAAA,CAAiBC,CAAAA,EAAc,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,CAAAA,CAAK,MAAA,GACN,KAAA,CAAM,OAAA,CAAQA,CAAI,CAAA,EAAKA,CAAAA,CAAK,MAAA,CAAS,CAAA,EACvC,IAAA,CAAK,IAAA,CAAK,UAAA,EAAW,CACrBA,EAAK,OAAA,CAAQC,CAAa,CAAA,CAC1B,IAAA,CAAK,IAAA,CAAK,YAAA,EAAa,CACvBjG,CAAAA,CAAO,eAAc,EAErBiG,CAAAA,CAAcD,CAAAA,CAAK,CAAC,CAAC,CAAA,EAEzB,CACF,CAAA,CAEapH,EAAiBuG,CAAAA,CAAe,WAAA,GC3H7C,IAAMgB,CAAAA,CAAN,cAAuBC,GAAI,CACzB,IAAW,KAAA,EAAQ,CACjB,OAAO,UACT,CAEA,WAAA,CAAYhD,CAAAA,CAA2B,CAErC,GAAM,CACJ,IAAA,CAAAjD,CAAAA,CACA,QAAA,CAAAnB,CAAAA,CACA,UAAA,CAAAqH,CAAAA,CACA,UAAA,CAAApH,CAAAA,CACA,aAAA,CAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CAAAA,CACA,GAAGkH,CACL,CAAA,CAAIlD,CAAAA,EAAQ,EAAC,CAEb,KAAA,CAAM,CACJ,SAAA,CAAW,eACX,IAAA,CAAM,UAAA,CACN,CAAA,CAAG,CAAA,CACH,CAAA,CAAG,CAAA,CACH,QAAA,CAAU,IAAA,CACV,UAAW,IAAA,CACX,QAAA,CAAU,MAAA,CACV,GAAGkD,CACL,CAAC,CAAA,CACGlD,CAAAA,EACF,KAAK,iBAAA,CAAkBA,CAAI,EAE/B,CAEQ,iBAAA,CAAkBA,CAAAA,CAA0B,CAElD,GAAM,CACJ,IAAA,CAAAjD,CAAAA,CACA,QAAA,CAAAnB,CAAAA,CACA,UAAA,CAAAqH,CAAAA,CACA,UAAA,CAAApH,CAAAA,CACA,cAAAC,CAAAA,CACA,UAAA,CAAAC,CAAAA,CACA,YAAA,CAAAC,CACF,CAAA,CAAIgE,CAAAA,CACEmD,CAAAA,CAAc,kpBACdC,CAAAA,CAAS,CAAA;AAAA,sEAAA,EACqDxH,CAAQ,CAAA,iBAAA,EAAoBC,CAAU,CAAA,kBAAA,EAAqBC,CAAa,CAAA,iBAAA,EAAoBC,CAAU,CAAA,yCAAA,CAAA,CACpKsH,CAAAA,CAAc,IAAIC,QAAAA,CAAS,CAC/B,IAAA,CAAM,MAAA,CACN,IAAA,CAAMH,CAAAA,EAAepG,CAAAA,EAAQqG,CAAAA,CAAAA,CAC7B,CAAA,CAAG,CAAA,CACH,CAAA,CAAG,CAAA,CACH,IAAA,CAAM,CACJ,YAAA,CAAc,KAAA,CACd,QAAA,CAAU,CACR,WAAYH,CAAAA,CACZ,QAAA,CAAUrH,CAAAA,CACV,UAAA,CAAYC,CAAAA,CACZ,aAAA,CAAeC,CAAAA,EAAiB,CAAA,CAChC,UAAA,CAAYC,CAAAA,CACZ,YAAA,CAAcC,CAChB,CACF,CAAA,CACA,UAAA,CAAY,CACV,cAAe,CACb,WAAA,CAAa,CACf,CACF,CACF,CAAC,CAAA,CAED,IAAA,CAAK,GAAA,CAAIqH,CAAW,EACtB,CACF,EAxEMN,CAAAA,CAANjF,CAAAA,CAAA,CADCyF,YAAW,CAAA,CACNR,CAAAA,CAAAA","file":"index.mjs","sourcesContent":["import {\n EditTool,\n EditorScaleEvent,\n registerEditTool,\n} from \"@leafer-in/editor\";\nimport { PointerEvent } from \"leafer-ui\";\nimport { htmlTextManage } 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 } = htmlTextManage.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 === 'HtmlText' && 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 } = htmlTextManage.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 = htmlTextManage.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 } = htmlTextManage.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 } = htmlTextManage.getCanvas();\n editor.off_(this.eventIds);\n }\n\n // 生命周期钩子:销毁插件时清理资源\n public onDestroy(): void {}\n}\n","import { htmlTextManage } from \".\";\n// 更新text样式\nexport const updataHtmlText = async (\n e?: any,\n base64font?: any,\n fontObj?: any,\n) => {\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 = htmlTextManage.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)) {\n // 在字体style标签检索是否有当前字体 没有就添加字体style\n const addStyle = `@font-face {font-family: ${fontObj.split(\",\")[0]};src: url(${base64font}) format('woff2') }</style>`;\n e.text =\n style +\n addStyle +\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: ${fontObj.split(\",\")[0]};src: url(${base64font}) format('woff2') }</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 = (\n e: any,\n html: any,\n fontSize = 20.67,\n lineHeight = 1.5,\n letterSpacing = 0,\n textShadow = \"none\",\n alignContent = \"start\",\n) => {\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 if (/&quot;/.test(str)) {\n str = str.replace(/&quot;/g, \"\");\n }\n\n let height;\n const div: any = document.querySelector(\"#textInnerEditor\");\n const quill = htmlTextManage.getQuill();\n // 这里别动\n // 获取包含自动换行的实际内容高度\n const actualHeight = Number(\n (quill.scroll.domNode.scrollHeight / zoomScale).toFixed(0),\n );\n const actualWidth = Number(\n (quill.scroll.domNode.scrollWidth / zoomScale).toFixed(0),\n );\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 divBox =\n style +\n `<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 = htmlTextManage.getQuill();\n const { editor, canvas } = htmlTextManage.getCanvas();\n // console.log(editor, htmlTextManage.getCanvas(), \"editor\");\n if (!quill) {\n return;\n }\n const range = quill.selection.savedRange;\n htmlTextManage.dateEdit(async (e: any) => {\n if (key === \"font\") {\n if (editor.innerEditing) {\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, value ?? null);\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(0, quill.getLength() - 1, key, value);\n e.data.textData.fontFamily = value;\n updataHtmlText(e, base64font ?? null, value ?? null);\n }\n } else if (key === \"fontSize\") {\n // 字体和字号\n e.data.textData[key] = value;\n htmlTextManage.isMultiSelect() &&\n 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 &&\n editor.innerEditing &&\n 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(\n range.index,\n range.length,\n key,\n quill.getFormat(range).script === value ? false : val,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n quill.getFormat().script === value ? false : val,\n );\n updataHtmlText(e);\n }\n } else if (key === \"align\") {\n // 水平居中\n htmlTextManage.isMultiSelect() &&\n 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 htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"lineHeight\" || key === \"letterSpacing\") {\n // 行高\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"color\") {\n // 颜色\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n if (range && range.length) {\n quill.formatText(range.index, range.length, key, value);\n } else {\n quill.formatText(0, quill.getLength() - 1, key, value);\n }\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 htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n e.data.textData[key] = value;\n updataHtmlText(e);\n } else if (key === \"list\") {\n // 有序无序列表\n htmlTextManage.isMultiSelect() &&\n 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(\n range.index,\n range.length,\n key,\n value === undefined ? !quill.getFormat(range)[key] : value,\n );\n } else {\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n value === undefined ? !quill.getFormat()[key] : value,\n );\n }\n } else {\n htmlTextManage.isMultiSelect() &&\n quill.clipboard.dangerouslyPasteHTML(e.text);\n quill.formatText(\n 0,\n quill.getLength() - 1,\n key,\n\n value === undefined ? !quill.getFormat()[key] : value,\n );\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 { InnerEditor, registerInnerEditor } from \"@leafer-in/editor\";\nimport { Matrix, PointerEvent } from \"@leafer-ui/core\";\nimport { htmlTextManage } 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 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 if (text.data.textData.fontSize) {\n div.style.fontSize = `${text.data.textData.fontSize * zoomScale}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 = htmlTextManage.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\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\n private onInput = async () => {\n const { editDom } = this;\n // 主要是更新编辑内容\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 this.quill.off(\"text-change\", this.onInput);\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-container{font-family:unset!important}.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}\\n\")","/**\n * RSA 公钥 (自动生成)\n * 用于验证 License 签名\n * \n * 注意: 这个公钥是公开的,不需要保密\n */\n\nexport const PUBLIC_KEY_BASE64 = `LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFxaUFnU1hWM3dMKzh2YkZ2OVkwQwpEN1dBUjhPa2I4bjlmTWxpQjF3enZodTBrdVdZUWEvMUxvVDhHWVh6WWlRQVFBRk9zTTA0MGp2dlNRT2hRSWpiCjRaYXZ1NHUvWVA5bElPYjFKYnZnYkFoYVVOQnphL0l2UmFnaFlKYTJBc1cyRVhnZkVrdmMyUENNMS9zbVlFNnoKNjZiUmx1dnREK3FJZkpLVCtUUXJRRmp5TnNTZ0c2Z2R4MThrZTRMSStBejFPcklMbUsyMHlBU2tlRXpYT1BTVAplM3RNYThleHpZdmUzV0wyNHRHUHg5WHNvN1JyUEl1elZlajh0NDYrZ0c1Y0pQaVh0N1lqa0V2NEJOUUt5eUpoCkltOVRJdVZ6clFpa2NJNE14dExNSGdUMHpLcU9ZZ1NzcmEvTHNDd2ZOdzdtYWxITkU2c21YZWYyQ2E5RGhZODQKS1FJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0tCg==`;\n","/**\n * RSA 签名验证工具 (浏览器版本)\n * \n * 使用 Web Crypto API 验证 RSA-SHA256 签名\n */\n\nimport { PUBLIC_KEY_BASE64 } from './public-key';\n\n/**\n * 将 PEM 格式公钥转换为 ArrayBuffer\n */\nfunction pemToArrayBuffer(pem: string): ArrayBuffer {\n // 移除 PEM 头尾和换行符\n const base64 = pem\n .replace(/-----BEGIN PUBLIC KEY-----/, '')\n .replace(/-----END PUBLIC KEY-----/, '')\n .replace(/\\s/g, '');\n \n return base64ToArrayBuffer(base64);\n}\n\n/**\n * Base64 字符串转 ArrayBuffer\n */\nfunction base64ToArrayBuffer(base64: string): ArrayBuffer {\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n \n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n \n return bytes.buffer;\n}\n\n/**\n * 导入 RSA 公钥\n */\nasync function importPublicKey(): Promise<CryptoKey> {\n // 解码 Base64 公钥\n const publicKeyPem = atob(PUBLIC_KEY_BASE64);\n const publicKeyBuffer = pemToArrayBuffer(publicKeyPem);\n\n // 导入公钥\n const publicKey = await crypto.subtle.importKey(\n 'spki',\n publicKeyBuffer,\n {\n name: 'RSASSA-PKCS1-v1_5',\n hash: 'SHA-256',\n },\n false,\n ['verify']\n );\n\n return publicKey;\n}\n\n/**\n * 验证 RSA 签名\n * \n * @param data - 原始数据字符串\n * @param signature - Base64 编码的签名\n * @returns 签名是否有效\n */\nexport async function verifySignature(\n data: string,\n signature: string\n): Promise<boolean> {\n try {\n // 导入公钥\n const publicKey = await importPublicKey();\n\n // 准备数据\n const dataBuffer = new TextEncoder().encode(data);\n const signatureBuffer = base64ToArrayBuffer(signature);\n\n // 验证签名\n const isValid = await crypto.subtle.verify(\n 'RSASSA-PKCS1-v1_5',\n publicKey,\n signatureBuffer,\n dataBuffer\n );\n\n return isValid;\n } catch (error) {\n console.error('[RSA] Signature verification failed:', error);\n return false;\n }\n}\n\n/**\n * 测试 RSA 验证是否正常工作\n */\nexport async function testRSAVerification(): Promise<boolean> {\n try {\n // 尝试导入公钥\n await importPublicKey();\n console.log('[RSA] Public key loaded successfully');\n return true;\n } catch (error) {\n console.error('[RSA] Failed to load public key:', error);\n return false;\n }\n}","/**\n * License 验证器 V2 (RSA 签名版本)\n * \n * 主要改进:\n * 1. 使用 RSA 签名防止 License 伪造\n * 2. 保留原有的域名和过期时间验证\n * 3. 向后兼容旧版 License\n */\n\nimport { verifySignature } from './rsa-verify';\n\nexport interface LicenseData {\n key: string; // License Key (格式: XXXX-XXXX-XXXX-XXXX)\n domains?: string[]; // 允许的域名列表\n expireDate?: string; // 过期时间 YYYY-MM-DD\n issueDate?: string; // 签发时间 YYYY-MM-DD\n features?: string[]; // 功能列表\n userId?: string; // 用户ID\n email?: string; // 用户邮箱\n version?: string; // License 版本\n}\n\ninterface LicensePackage {\n data: string; // JSON 序列化的 LicenseData\n signature: string; // RSA 签名\n}\n\n/**\n * 解析 License\n */\nasync function parseLicense(license: string): Promise<LicenseData | null> {\n try {\n // 1. Base64 解码\n const decoded = atob(license);\n \n // 2. 解析 JSON\n const licensePackage: LicensePackage = JSON.parse(decoded);\n\n // 验证格式\n if (!licensePackage.data || !licensePackage.signature) {\n console.error('[License] Invalid license format');\n return null;\n }\n\n // 3. 验证 RSA 签名\n const signatureValid = await verifySignature(\n licensePackage.data,\n licensePackage.signature\n );\n\n if (!signatureValid) {\n console.error('[License] Invalid signature - License may be tampered or forged');\n return null;\n }\n\n // 4. 解析数据\n const data: LicenseData = JSON.parse(licensePackage.data);\n \n console.log('[License] Signature verified successfully');\n return data;\n\n } catch (error) {\n console.error('[License] Failed to parse license:', error);\n return null;\n }\n}\n\n/**\n * 验证域名\n */\nfunction validateDomain(allowedDomains?: string[]): boolean {\n // 如果没有域名限制,直接通过\n if (!allowedDomains || allowedDomains.length === 0) {\n return true;\n }\n\n // 获取当前域名\n const currentDomain = window.location.hostname;\n\n // 本地开发环境自动通过\n if (currentDomain === 'localhost' || currentDomain === '127.0.0.1') {\n console.log('[License] Local development environment detected');\n return true;\n }\n\n // 检查域名是否在允许列表中\n const isValid = allowedDomains.some(domain => {\n // 支持通配符 *.example.com\n if (domain.startsWith('*.')) {\n const baseDomain = domain.slice(2);\n return currentDomain.endsWith(baseDomain);\n }\n return currentDomain === domain;\n });\n\n if (!isValid) {\n console.error(`[License] Domain not authorized: ${currentDomain}`);\n console.error(`[License] Allowed domains:`, allowedDomains);\n }\n\n return isValid;\n}\n\n/**\n * 验证过期时间\n */\nfunction validateExpireDate(expireDate?: string): boolean {\n if (!expireDate) return true;\n\n try {\n const expire = new Date(expireDate);\n const now = new Date();\n \n if (now >= expire) {\n console.error(`[License] License has expired on ${expireDate}`);\n return false;\n }\n\n // 计算剩余天数\n const daysRemaining = Math.ceil((expire.getTime() - now.getTime()) / (1000 * 60 * 60 * 24));\n \n if (daysRemaining <= 7) {\n console.warn(`[License] License will expire in ${daysRemaining} days`);\n }\n\n return true;\n } catch (error) {\n console.error('[License] Invalid expire date format:', expireDate);\n return false;\n }\n}\n\n/**\n * 验证签发时间(防止使用未来时间)\n */\nfunction validateIssueDate(issueDate?: string): boolean {\n if (!issueDate) return true;\n\n try {\n const issue = new Date(issueDate);\n const now = new Date();\n \n if (issue > now) {\n console.error('[License] License issue date is in the future');\n return false;\n }\n\n return true;\n } catch {\n return true; // 如果没有签发时间,跳过此检查\n }\n}\n\n/**\n * 验证 License (主函数)\n */\nexport async function validateLicense(license: string): Promise<{\n valid: boolean;\n error?: string;\n data?: LicenseData;\n}> {\n try {\n // 1. 解析 License 并验证签名\n const data = await parseLicense(license);\n \n if (!data) {\n return {\n valid: false,\n error: 'Invalid license key or signature verification failed'\n };\n }\n\n // 2. 验证签发时间\n if (!validateIssueDate(data.issueDate)) {\n return {\n valid: false,\n error: 'Invalid license issue date',\n data\n };\n }\n\n // 3. 验证域名\n if (!validateDomain(data.domains)) {\n return {\n valid: false,\n error: `License not valid for domain: ${window.location.hostname}`,\n data\n };\n }\n\n // 4. 验证过期时间\n if (!validateExpireDate(data.expireDate)) {\n return {\n valid: false,\n error: 'License has expired',\n data\n };\n }\n\n // 5. 所有验证通过\n console.log('[License] All validations passed');\n console.log('[License] License info:', {\n key: data.key,\n domains: data.domains,\n expireDate: data.expireDate,\n features: data.features\n });\n\n return {\n valid: true,\n data\n };\n\n } catch (error) {\n console.error('[License] Validation error:', error);\n return {\n valid: false,\n error: 'License validation failed'\n };\n }\n}\n\n/**\n * 检查是否有特定功能权限\n */\nexport function hasFeature(data: LicenseData | null, feature: string): boolean {\n if (!data || !data.features) return false;\n return data.features.includes(feature);\n}","/**\n * License 管理器\n *\n * 提供统一的 License 管理接口\n */\n\nimport { validateLicense, hasFeature, type LicenseData } from \"./validator\";\n\n// 全局状态\nlet licenseKey: string | null = null;\nlet licenseData: LicenseData | null = null;\nlet isLicenseValid = false;\n\n/**\n * 设置 License\n *\n * @param license - License Key 字符串\n * @returns 是否激活成功\n */\nexport async function setLicense(license: string): Promise<boolean> {\n console.log(\"[License] Activating license...\");\n\n const result = await validateLicense(license);\n\n if (result.valid && result.data) {\n licenseKey = license;\n licenseData = result.data;\n isLicenseValid = true;\n\n console.log(\"[License] ✅ License activated successfully\");\n console.log(\n `[License] Valid until: ${result.data.expireDate || \"unlimited\"}`,\n );\n\n return true;\n } else {\n licenseKey = null;\n licenseData = null;\n isLicenseValid = false;\n\n console.error(\"[License] ❌ License activation failed:\", result.error);\n\n return false;\n }\n}\n\n/**\n * 检查 License 是否有效\n *\n * @returns License 是否有效\n */\nexport async function checkLicense(): Promise<boolean> {\n if (!licenseKey) {\n console.warn(\"[License] No license key provided\");\n return false;\n }\n\n if (!isLicenseValid) {\n console.warn(\"[License] License is not valid\");\n return false;\n }\n\n // 重新验证(防止过期或域名变化)\n const result = await validateLicense(licenseKey);\n isLicenseValid = result.valid;\n\n if (!isLicenseValid) {\n console.error(\"[License] License validation failed:\", result.error);\n licenseData = null;\n }\n\n return isLicenseValid;\n}\n\n/**\n * 获取 License 信息\n *\n * @returns License 数据或 null\n */\nexport function getLicenseInfo(): LicenseData | null {\n return licenseData;\n}\n\n/**\n * 检查是否有特定功能权限\n *\n * @param feature - 功能名称\n * @returns 是否有权限\n */\nexport function checkFeature(feature: string): boolean {\n if (!isLicenseValid || !licenseData) {\n return false;\n }\n\n return hasFeature(licenseData, feature);\n}\n\n/**\n * 清除 License\n */\nexport function clearLicense(): void {\n licenseKey = null;\n licenseData = null;\n isLicenseValid = false;\n console.log(\"[License] License cleared\");\n}\n\n/**\n * 获取 License 状态摘要\n */\nexport function getLicenseStatus(): {\n activated: boolean;\n key?: string;\n expireDate?: string;\n domains?: string[];\n features?: string[];\n} {\n if (!isLicenseValid || !licenseData) {\n return { activated: false };\n }\n\n return {\n activated: true,\n key: licenseData.key,\n expireDate: licenseData.expireDate,\n domains: licenseData.domains,\n features: licenseData.features,\n };\n}\n\nexport function assertLicenseValid(): void {\n // if (!isLicenseValid || !licenseData) {\n console.log(isLicenseValid)\n if (!isLicenseValid) {\n throw new Error(\n \"[Plugin] License validation failed. Plugin execution has been blocked. Please contact the plugin developer for assistance. Email: 408550179@qq.com\",\n );\n }\n}\n\n// 导出类型\nexport type { LicenseData } from \"./validator\";\n","import Quill, { Delta } from \"quill\";\nimport \"quill/dist/quill.core.css\";\nimport \"./htmltext-editor.css\";\nimport { FontStyle } from \"quill/formats/font\";\n\nimport { checkLicense } from \"./license\";\nclass HtmlTextManage {\n private static instance: HtmlTextManage;\n private quill: Quill | null = null;\n public app_: any | null = null;\n private constructor() {}\n\n static getInstance() {\n if (!HtmlTextManage.instance) {\n HtmlTextManage.instance = new HtmlTextManage();\n }\n return HtmlTextManage.instance;\n }\n\n async init(app: any) {\n // 检查授权\n const seccess = await checkLicense();\n if (!seccess) {\n throw new Error(\n \"[HtmlTextManage] 授权失败请联系作者获取授权 邮箱 : 408550179@qq.com 微信 : cym5640\",\n );\n }\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 public getQuill() {\n if (!this.quill) {\n throw new Error(\"Quill editor not initialized. Call init() first.\");\n }\n return this.quill;\n }\n\n public getCanvas() {\n if (!this.app_) {\n throw new Error(\"app_ editor not initialized. Call init() first.\");\n }\n return this.app_;\n }\n\n public getSelection() {\n console.log(\n this.quill?.selection.savedRange,\n \"this.quill?.selection.savedRange\",\n );\n return this.quill?.selection.savedRange;\n }\n\n private registerFonts() {\n // 注册 FontStyle 作为字体格式\n FontStyle.whitelist = undefined;\n Quill.register(\"formats/font\", FontStyle, 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 htmlTextManage = HtmlTextManage.getInstance();\n","import { Box, registerUI } from \"@leafer-ui/core\";\nimport { HTMLText } from \"@leafer-in/html\";\nimport { IBoxInputData } from \"@leafer-ui/interface\";\n\n// 文本样式属性\ninterface IHtmlTextContentData {\n text?: string;\n fontSize: number;\n fontFamily?: string;\n lineHeight?: number;\n letterSpacing?: number;\n textShadow?: string;\n alignContent?: string;\n}\n\n// 使用交叉类型而非继承\ntype IHtmlTextInputData = IBoxInputData & IHtmlTextContentData;\n\n@registerUI()\nclass HtmlText extends Box {\n public get __tag() {\n return \"HtmlText\";\n }\n\n constructor(data?: IHtmlTextInputData) {\n // 提取文本属性,其余传递给 Box\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n ...boxData\n } = data || {};\n\n super({\n editOuter: \"TextEditTool\",\n name: \"HtmlText\",\n x: 0,\n y: 0,\n editable: true,\n draggable: true,\n overflow: \"show\",\n ...boxData,\n });\n if (data) {\n this.createTextElement(data);\n }\n }\n\n private createTextElement(data: IHtmlTextInputData) {\n // 提取文本相关属性\n const {\n text,\n fontSize,\n fontFamily,\n lineHeight,\n letterSpacing,\n textShadow,\n alignContent,\n } = data;\n const fontContent = `<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:'•';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 const noText = `<div style=\"ove\n rflow-wrap:break-word;word-break:break-all;\"><p style=\"font-size: ${fontSize}px; line-height: ${lineHeight}; letter-spacing: ${letterSpacing}px; text-shadow: ${textShadow};\"><strong>Hello World</strong></p></div>`;\n const textElement = new HTMLText({\n name: \"Text\",\n text: fontContent + (text || noText),\n x: 0,\n y: 0,\n data: {\n canChangeBox: false,\n textData: {\n fontFamily: fontFamily,\n fontSize: fontSize,\n lineHeight: lineHeight,\n letterSpacing: letterSpacing || 0,\n textShadow: textShadow,\n alignContent: alignContent,\n },\n },\n editConfig: {\n selectedStyle: {\n strokeWidth: 0,\n },\n },\n });\n\n this.add(textElement);\n }\n}\n\nexport { HtmlText };\n"]}