tulih-editor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +331 -0
  3. package/dist/tulih-editor.css +1 -0
  4. package/dist/tulih-editor.es.js +3051 -0
  5. package/dist/tulih-editor.es.js.map +1 -0
  6. package/dist/tulih-editor.umd.js +8 -0
  7. package/dist/tulih-editor.umd.js.map +1 -0
  8. package/dist/types/core/Editor.d.ts +20 -0
  9. package/dist/types/core/PluginManager.d.ts +22 -0
  10. package/dist/types/core/helpers.d.ts +22 -0
  11. package/dist/types/index.d.ts +5 -0
  12. package/dist/types/plugins/align.d.ts +3 -0
  13. package/dist/types/plugins/autoLinkify.d.ts +3 -0
  14. package/dist/types/plugins/autosave.d.ts +3 -0
  15. package/dist/types/plugins/block.d.ts +3 -0
  16. package/dist/types/plugins/caseTransform.d.ts +3 -0
  17. package/dist/types/plugins/codeBlock.d.ts +3 -0
  18. package/dist/types/plugins/colors.d.ts +3 -0
  19. package/dist/types/plugins/darkMode.d.ts +3 -0
  20. package/dist/types/plugins/direction.d.ts +3 -0
  21. package/dist/types/plugins/dragDrop.d.ts +3 -0
  22. package/dist/types/plugins/emoji.d.ts +3 -0
  23. package/dist/types/plugins/emojiAutocomplete.d.ts +3 -0
  24. package/dist/types/plugins/findReplace.d.ts +3 -0
  25. package/dist/types/plugins/floatingToolbar.d.ts +3 -0
  26. package/dist/types/plugins/fontFamily.d.ts +3 -0
  27. package/dist/types/plugins/fontSize.d.ts +3 -0
  28. package/dist/types/plugins/fullscreen.d.ts +3 -0
  29. package/dist/types/plugins/history.d.ts +3 -0
  30. package/dist/types/plugins/hr.d.ts +3 -0
  31. package/dist/types/plugins/iframe.d.ts +3 -0
  32. package/dist/types/plugins/image.d.ts +3 -0
  33. package/dist/types/plugins/imageProps.d.ts +3 -0
  34. package/dist/types/plugins/imageTools.d.ts +3 -0
  35. package/dist/types/plugins/indent.d.ts +3 -0
  36. package/dist/types/plugins/index.d.ts +2 -0
  37. package/dist/types/plugins/inline.d.ts +3 -0
  38. package/dist/types/plugins/inlineCode.d.ts +3 -0
  39. package/dist/types/plugins/keyboardShortcuts.d.ts +3 -0
  40. package/dist/types/plugins/lineHeight.d.ts +3 -0
  41. package/dist/types/plugins/link.d.ts +3 -0
  42. package/dist/types/plugins/linkTooltip.d.ts +3 -0
  43. package/dist/types/plugins/list.d.ts +3 -0
  44. package/dist/types/plugins/markdown.d.ts +3 -0
  45. package/dist/types/plugins/mediaEmbed.d.ts +3 -0
  46. package/dist/types/plugins/pasteImage.d.ts +3 -0
  47. package/dist/types/plugins/pastePlain.d.ts +3 -0
  48. package/dist/types/plugins/pre.d.ts +3 -0
  49. package/dist/types/plugins/readOnly.d.ts +3 -0
  50. package/dist/types/plugins/shortcutCustomizer.d.ts +3 -0
  51. package/dist/types/plugins/shortcutsHelp.d.ts +3 -0
  52. package/dist/types/plugins/source.d.ts +3 -0
  53. package/dist/types/plugins/specialChars.d.ts +3 -0
  54. package/dist/types/plugins/statusBar.d.ts +3 -0
  55. package/dist/types/plugins/subSuper.d.ts +3 -0
  56. package/dist/types/plugins/table.d.ts +3 -0
  57. package/dist/types/plugins/tableBg.d.ts +3 -0
  58. package/dist/types/plugins/tableTools.d.ts +3 -0
  59. package/dist/types/plugins/toolbarCollapse.d.ts +3 -0
  60. package/dist/types/plugins/unlink.d.ts +3 -0
  61. package/dist/types/plugins/wordCount.d.ts +3 -0
  62. package/dist/types/types.d.ts +226 -0
  63. package/package.json +66 -0
  64. package/src/core/Editor.ts +460 -0
  65. package/src/core/PluginManager.ts +140 -0
  66. package/src/core/helpers.ts +209 -0
  67. package/src/css.d.ts +2 -0
  68. package/src/index.ts +87 -0
  69. package/src/plugins/align.ts +72 -0
  70. package/src/plugins/autoLinkify.ts +34 -0
  71. package/src/plugins/autosave.ts +69 -0
  72. package/src/plugins/block.ts +32 -0
  73. package/src/plugins/caseTransform.ts +54 -0
  74. package/src/plugins/codeBlock.ts +93 -0
  75. package/src/plugins/colors.ts +68 -0
  76. package/src/plugins/darkMode.ts +123 -0
  77. package/src/plugins/direction.ts +30 -0
  78. package/src/plugins/dragDrop.ts +68 -0
  79. package/src/plugins/emoji.ts +188 -0
  80. package/src/plugins/emojiAutocomplete.ts +183 -0
  81. package/src/plugins/findReplace.ts +229 -0
  82. package/src/plugins/floatingToolbar.ts +258 -0
  83. package/src/plugins/fontFamily.ts +41 -0
  84. package/src/plugins/fontSize.ts +32 -0
  85. package/src/plugins/fullscreen.ts +36 -0
  86. package/src/plugins/history.ts +14 -0
  87. package/src/plugins/hr.ts +118 -0
  88. package/src/plugins/iframe.ts +88 -0
  89. package/src/plugins/image.ts +107 -0
  90. package/src/plugins/imageProps.ts +119 -0
  91. package/src/plugins/imageTools.ts +344 -0
  92. package/src/plugins/indent.ts +29 -0
  93. package/src/plugins/index.ts +101 -0
  94. package/src/plugins/inline.ts +17 -0
  95. package/src/plugins/inlineCode.ts +21 -0
  96. package/src/plugins/keyboardShortcuts.ts +92 -0
  97. package/src/plugins/lineHeight.ts +40 -0
  98. package/src/plugins/link.ts +344 -0
  99. package/src/plugins/linkTooltip.ts +63 -0
  100. package/src/plugins/list.ts +141 -0
  101. package/src/plugins/markdown.ts +61 -0
  102. package/src/plugins/mediaEmbed.ts +44 -0
  103. package/src/plugins/pasteImage.ts +61 -0
  104. package/src/plugins/pastePlain.ts +43 -0
  105. package/src/plugins/pre.ts +11 -0
  106. package/src/plugins/readOnly.ts +46 -0
  107. package/src/plugins/shortcutCustomizer.ts +125 -0
  108. package/src/plugins/shortcutsHelp.ts +51 -0
  109. package/src/plugins/source.ts +77 -0
  110. package/src/plugins/specialChars.ts +64 -0
  111. package/src/plugins/statusBar.ts +85 -0
  112. package/src/plugins/subSuper.ts +20 -0
  113. package/src/plugins/table.ts +166 -0
  114. package/src/plugins/tableBg.ts +11 -0
  115. package/src/plugins/tableTools.ts +475 -0
  116. package/src/plugins/toolbarCollapse.ts +14 -0
  117. package/src/plugins/unlink.ts +29 -0
  118. package/src/plugins/wordCount.ts +34 -0
  119. package/src/styles/base.css +258 -0
  120. package/src/styles/editor.css +309 -0
  121. package/src/styles/index.css +6 -0
  122. package/src/types.ts +278 -0
@@ -0,0 +1,8 @@
1
+ (function(Z,Q){typeof exports=="object"&&typeof module<"u"?module.exports=Q():typeof define=="function"&&define.amd?define(Q):(Z=typeof globalThis<"u"?globalThis:Z||self,Z.TulihEditor=Q())})(this,(function(){"use strict";class Z{constructor(){this._plugins=[],this._map={},this._injectedCSS=new Set,this._cssInjected=!1}register(t,o){if(this._map[t])throw new Error('Plugin "'+t+'" is already registered');return o.name=t,o.deps=o.deps||[],o.order=o.order||100,this._plugins.push(o),this._map[t]=o,this}unregister(t){const o=this._map[t];if(!o)return;o.destroy&&o.destroy(void 0);const r=this._plugins.indexOf(o);r!==-1&&this._plugins.splice(r,1),delete this._map[t]}get(t){return this._map[t]||null}has(t){return!!this._map[t]}getNames(){return Object.keys(this._map)}_resolveOrder(){const t=[],o={},r={},n=this._map;function a(c){if(o[c])return;if(r[c])throw new Error("Circular dependency: "+c);r[c]=!0;const d=n[c];d&&d.deps&&d.deps.forEach(p=>{if(!n[p])throw new Error('Plugin "'+c+'" depends on "'+p+'" but not registered');a(p)}),r[c]=!1,o[c]=!0,t.push(n[c])}return this._plugins.slice().sort((c,d)=>(c.order||0)-(d.order||0)).forEach(c=>a(c.name)),t}initAll(t){this._resolveOrder().forEach(o=>{o.init&&o.init(t)})}destroyAll(t){this._plugins.slice().reverse().forEach(r=>{r.destroy&&r.destroy(t)})}getToolbarHTML(t,o){if(o&&Array.isArray(o)){const i=[];return o.forEach((c,d)=>{d>0&&i.push('<div class="te-divider"></div>'),c.forEach(p=>{const s=this._map[p];if(!s||t[p]===!1)return;const u=typeof s.toolbarHTML=="function"?s.toolbarHTML(t):s.toolbarHTML;u&&i.push(u)})}),i.join(`
2
+ `)}const r=this._resolveOrder().filter(i=>t[i.name]!==!1&&i.toolbarHTML),n=[];let a=-1;return r.forEach(i=>{const c=typeof i.toolbarHTML=="function"?i.toolbarHTML(t):i.toolbarHTML;if(!c)return;const d=Math.floor((i.order||0)/10);a!==-1&&d!==a&&n.push('<div class="te-divider"></div>'),n.push(c),a=d}),n.join(`
3
+ `)}getModalHTML(t){return this._resolveOrder().filter(r=>t[r.name]!==!1&&r.modalHTML).map(r=>typeof r.modalHTML=="function"?r.modalHTML(t):r.modalHTML).filter(Boolean).join(`
4
+ `)}injectAllCSS(){this._cssInjected||(this._cssInjected=!0,this._resolveOrder().forEach(t=>{if(!t.css||this._injectedCSS.has(t.name))return;this._injectedCSS.add(t.name);const o=typeof t.css=="function"?t.css({}):t.css;if(!o)return;const r=document.createElement("style");r.setAttribute("data-te-css",t.name),r.textContent=o,document.head.appendChild(r)}))}}const Q="p,h1,h2,h3,blockquote,pre,ul,ol,li,table,hr,iframe,.te-embed",Ae=["A","B","I","U","S","STRONG","EM","SPAN","SMALL","MARK","CODE","KBD","SUB","SUP"];function qe(e){return!!e.querySelector(Q)}function He(e){if(e.nodeType!==1)return!1;const t=e.tagName;return t==="IMG"||t==="BR"||t==="IFRAME"?!0:Ae.indexOf(t)!==-1}function ce(e){const t=document.createElement("p");return e.parentNode.insertBefore(t,e),t.appendChild(e),t}function Me(e){if(!e||e.tagName!=="IFRAME")return;const t=document.createElement("div");return t.className="te-embed",t.setAttribute("contenteditable","false"),e.setAttribute("contenteditable","false"),e.setAttribute("draggable","false"),e.setAttribute("tabindex","-1"),e.parentNode.insertBefore(t,e),t.appendChild(e),t}function K(e){if(!e)return;let t=e.firstChild;for(;t;){const o=t.nextSibling;if(t.nodeType===3)(t.textContent||"").trim()===""?e.removeChild(t):ce(t);else if(t.nodeType===1){const r=t,n=r.tagName;if(n==="DIV"){if(!(r.classList.contains("te-embed")||r.querySelector("iframe,video,audio,.te-embed"))){if(!qe(r)){const a=document.createElement("p");for(;r.firstChild;)a.appendChild(r.firstChild);e.replaceChild(a,r)}}}else n==="IFRAME"?Me(r):He(r)&&ce(r)}t=o}}function W(e){if(!e||e.querySelector(Q))return;if(!e.firstChild){const o=document.createElement("p");o.innerHTML="<br>",e.appendChild(o);return}const t=document.createElement("p");for(;e.firstChild;)t.appendChild(e.firstChild);e.appendChild(t)}function re(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;")}function Re(e,t){return'<div class="te-container"> <div class="te-toolbar mb-0">'+e+' </div> <div class="te-editor" contenteditable="true" placeholder="Start typing..."></div>'+t+"</div>"}const ue={block:!1,inline:!1,inlineCode:!1,subSuper:!1,removeFormat:!1,codeBlock:!1,mediaEmbed:!1,dragDrop:!1,readOnly:!1,linkTooltip:!1,emojiAutocomplete:!1,statusBar:!1,pastePlain:!1,findReplace:!1,indent:!1,list:!1,autoLinkify:!1,caseTransform:!1,shortcutsHelp:!1,lineHeight:!1,fontSize:!1,fontFamily:!1,specialChars:!1,colors:!1,tableBg:!1,align:!1,markdown:!1,link:!1,image:!1,imageProps:!1,imageTools:!1,iframe:!1,table:!1,tableTools:!1,hr:!1,unlink:!1,emoji:!1,direction:!1,source:!1,history:!1,fullscreen:!1,toolbarCollapse:!1,autosave:!1,floatingToolbar:!1,darkMode:!1,shortcutCustomizer:!1,minimal:!1},Ne={allowedTags:["p","h1","h2","h3","h4","h5","h6","blockquote","pre","code","strong","em","u","s","span","a","img","iframe","ul","ol","li","table","thead","tbody","tfoot","tr","th","td","br","hr"],allowedAttributes:["href","src","alt","title","width","height","class","id","style","target","rel","allow","allowfullscreen","frameborder"]},Be=["http","https","mailto","tel"],ze=["http","https","data"],Ie=["youtube.com","www.youtube.com","youtu.be","player.vimeo.com","vimeo.com"],_e="allow-scripts allow-same-origin allow-presentation",De="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share";class pe{constructor(t,o,r){this.container=null,this.editor=null,this.toolbar=null,this._ctx=null;const n=typeof t=="string"?document.querySelector(t):t;if(!n)return;const a=String(n.tagName).toUpperCase()==="TEXTAREA",i=n.matches&&n.matches("textarea[data-tulih-editor]");if(!a&&!i)return;const c=n.nextElementSibling;if(c&&c.querySelector&&c.querySelector(".te-editor"))return;const d=o||{},p=n,s=d.minimal||d.features&&d.features.minimal;if(s)this.features=Object.assign({},ue,{floatingToolbar:!0,link:!0,linkTooltip:!0},d.features||{});else{const w={};Object.keys(ue).forEach(g=>{g!=="minimal"&&(w[g]=!0)}),this.features=Object.assign({},w,d.features||{})}this.options={sanitize:Object.assign({},Ne,d.sanitize||{}),urlSchemes:Array.isArray(d.allowedUrlSchemes)?d.allowedUrlSchemes:Be,imageSchemes:Array.isArray(d.allowedImageSchemes)?d.allowedImageSchemes:ze,iframeAllowlist:Array.isArray(d.iframeAllowlist)?d.iframeAllowlist:Ie,iframeSandbox:typeof d.iframeSandbox=="string"?d.iframeSandbox:_e,iframeAllow:typeof d.iframeAllow=="string"?d.iframeAllow:De,readOnly:!!d.readOnly};const u=this;function b(w,g){const M=new Set(g&&g.allowedTags||[]),y=new Set(g&&g.allowedAttributes||[]),h=document.createElement("div");h.innerHTML=String(w||"");const L=document.createTreeWalker(h,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_COMMENT,null),N=[],A=[];for(;L.nextNode();){const C=L.currentNode;if(C.nodeType===8){A.push(C);continue}const I=C.tagName?C.tagName.toLowerCase():"";if(I&&!M.has(I)){N.push(C);continue}if(C.attributes&&Array.prototype.slice.call(C.attributes).forEach(D=>{const U=D.name.toLowerCase();if(U.startsWith("on")){C.removeAttribute(D.name);return}if(!y.has(U)){C.removeAttribute(D.name);return}U==="href"&&D.value&&(k(D.value,u.options.urlSchemes)||C.removeAttribute(D.name)),U==="src"&&D.value&&I==="img"&&(k(D.value,u.options.imageSchemes)||C.removeAttribute(D.name))}),I==="iframe"){const z=C.getAttribute("src")||"";T(z)?(u.options.iframeSandbox&&C.setAttribute("sandbox",u.options.iframeSandbox),u.options.iframeAllow&&C.setAttribute("allow",u.options.iframeAllow),C.setAttribute("frameborder","0"),C.style.maxWidth="100%",C.style.border="0"):N.push(C)}}return A.forEach(C=>{C.parentNode&&C.parentNode.removeChild(C)}),N.forEach(C=>{if(C.parentNode){for(;C.firstChild;)C.parentNode.insertBefore(C.firstChild,C);C.parentNode.removeChild(C)}}),h.innerHTML}function k(w,g){try{const M=new URL(w,window.location.origin);return g.indexOf(M.protocol.replace(":",""))!==-1}catch{return!1}}function T(w){try{const M=new URL(w,window.location.origin).hostname.toLowerCase();return u.options.iframeAllowlist.some(y=>M===y||M.endsWith("."+y))}catch{return!1}}this.utils={sanitizeHTML:b,isSafeUrl:k,isAllowedIframeUrl:T};const x=r.pluginManager.getToolbarHTML(u.features,d.toolbar),m=r.pluginManager.getModalHTML(u.features),v=document.createElement("div");v.innerHTML=Re(x,m),n.style.display="none",n.parentNode.insertBefore(v,n.nextSibling);const l=v.querySelector(".te-editor"),f=v.querySelector(".te-toolbar");try{const w=p.value||"",g=b(w,u.options.sanitize);l.innerHTML=g}catch{}try{K(l),W(l)}catch{}try{W(l)}catch{}d.height&&(l.style.height=typeof d.height=="number"?d.height+"px":String(d.height),l.style.overflow="auto"),this.container=v,this.editor=l,this.toolbar=f,this.textarea=p;try{document.execCommand("defaultParagraphSeparator",!1,"p")}catch{}function S(){try{["bold","italic","underline","strikeThrough"].forEach(z=>{const D=f.querySelector('[data-cmd="'+z+'"]');D&&(document.queryCommandState(z)?D.classList.add("active"):D.classList.remove("active"))});const w=f.querySelector('[data-cmd="undo"]'),g=f.querySelector('[data-cmd="redo"]'),M=l._tableHist;if(w){const z=document.queryCommandEnabled("undo")||M&&M.undo.length>0;w.toggleAttribute("disabled",!z)}if(g){const z=document.queryCommandEnabled("redo")||M&&M.redo.length>0;g.toggleAttribute("disabled",!z)}const y=window.getSelection();let h=y&&y.anchorNode;h&&h.nodeType===3&&(h=h.parentNode);const L=h,N=L&&L.closest&&L.closest("ol"),A=L&&L.closest&&L.closest("ul"),C=f.querySelector('[data-cmd="insertOrderedList"]'),I=f.querySelector('[data-cmd="insertUnorderedList"]');C&&C.classList.toggle("active",!!N),I&&I.classList.toggle("active",!!A)}catch{}}document.addEventListener("selectionchange",()=>{v.contains(document.activeElement)&&S()}),f.querySelectorAll("[data-cmd]").forEach(w=>{w.addEventListener("click",()=>{const g=w.getAttribute("data-cmd"),M=w.getAttribute("data-val")||void 0;if(g==="createLink"||g==="insertImage"||g==="insertIframe"||g==="insertTable"||g==="editSource"||g==="indent"||g==="outdent"||g==="findReplace"||g==="togglePastePlain"||g==="specialChars"||g==="fullscreen"||g==="emoji"||g==="codeBlock"||g==="toggleReadOnly"||g==="shortcutsHelp"||g==="alignLeft"||g==="alignCenter"||g==="alignRight"||g==="alignJustify"||g==="toggleDark"||g==="customizeShortcuts")return;function y(){l.querySelectorAll(".te-fr-match, .te-fr-active").forEach(h=>{const L=h.parentNode;if(L){for(;h.firstChild;)L.insertBefore(h.firstChild,h);L.removeChild(h)}})}if(g==="undo"){const h=l._tableHist;if(h&&h.undo.length){y(),h.redo.push(l.innerHTML),l.contentEditable="false",l.innerHTML=h.undo.pop(),l.contentEditable="true",y(),l.focus(),S();return}}if(g==="redo"){const h=l._tableHist;if(h&&h.redo.length){y(),h.undo.push(l.innerHTML),l.contentEditable="false",l.innerHTML=h.redo.pop(),l.contentEditable="true",y(),l.focus(),S();return}}document.execCommand(g,!1,M),l.focus(),S()})}),v.querySelectorAll("[data-te-close]").forEach(w=>{w.addEventListener("click",()=>{const g=w.closest(".te-modal");g&&g.classList.remove("is-open")})});try{W(l)}catch{}function E(){const w=window.getSelection();w&&w.rangeCount>0&&(v.__savedRange=w.getRangeAt(0).cloneRange())}function q(){const w=v.__savedRange;if(!w)return;const g=window.getSelection();g&&(g.removeAllRanges(),g.addRange(w))}function H(w){(r.onUploadImage||function(M,y){const h=new FileReader;h.onload=()=>{y(h.result)},h.readAsDataURL(M)})(w,M=>{if(!M)return;const y=w.name||"",h='<img src="'+M.replace(/"/g,"&quot;")+'" alt="'+y.replace(/"/g,"&quot;")+'" style="max-width:100%;" />';document.execCommand("insertHTML",!1,h)})}function B(w){if(!w)return"";let g=String(w);return g.indexOf("mso-")===-1&&g.indexOf("xmlns:o")===-1&&g.indexOf("google-docs")===-1||(g=g.replace(/<!--[\s\S]*?-->/g,""),g=g.replace(/<meta[^>]*>/gi,""),g=g.replace(/<link[^>]*>/gi,""),g=g.replace(/<o:[^>]*>[\s\S]*?<\/o:[^>]*>/gi,""),g=g.replace(/<w:[^>]*>[\s\S]*?<\/w:[^>]*>/gi,""),g=g.replace(/<style[^>]*>[\s\S]*?<\/style>/gi,""),g=g.replace(/ class="[^"]*Mso[^"]*"/gi,""),g=g.replace(/ class="[^"]*" style=""/gi,""),g=g.replace(/ style="[^"]*mso-[^;]*[^"]*"/gi,""),g=g.replace(/<span[^>]*style="[^"]*mso-[^"]*"[^>]*>/gi,"<span>"),g=g.replace(/<span[^>]*><\/span>/gi,""),g=g.replace(/(<(p|h[1-6]|div|span|b|i|u|strong|em))[^>]*>/gi,"$1>")),g}l.addEventListener("paste",w=>{try{const g=w.clipboardData&&w.clipboardData.files;if(g&&g.length>0){let A=!1;for(let C=0;C<g.length;C++)/^image\//i.test(g[C].type)&&(A||(w.preventDefault(),A=!0),H(g[C]));if(A)return}const M=w.clipboardData&&w.clipboardData.items;if(M&&M.length>0){for(let A=0;A<M.length;A++)if(M[A].kind==="file"&&/^image\//i.test(M[A].type)){w.preventDefault();const C=M[A].getAsFile();C&&H(C);return}}window.navigator&&window.navigator.clipboard&&typeof window.navigator.clipboard.read=="function"&&window.navigator.clipboard.read().then(A=>{for(let C=0;C<A.length;C++){const I=A[C].types||[];for(let z=0;z<I.length;z++)if(/^image\//i.test(I[z])){A[C].getType(I[z]).then(D=>{H(D)});break}}}).catch(()=>{}),w.preventDefault();const y=w.clipboardData&&w.clipboardData.getData("text/html")||"",h=w.clipboardData&&w.clipboardData.getData("text/plain")||"",L=B(y)||(h?"<p>"+h.replace(/\n/g,"<br>")+"</p>":""),N=b(L,u.options.sanitize);document.execCommand("insertHTML",!1,N),setTimeout(()=>{try{W(l),K(l)}catch{}},0)}catch{setTimeout(()=>{K(l)},0)}}),l.addEventListener("focus",()=>{try{W(l)}catch{}}),l.addEventListener("input",()=>{setTimeout(()=>{try{W(l),K(l)}catch{}},0)});const _={wrapper:v,editor:l,toolbar:f,textarea:p,features:u.features,options:u.options,utils:u.utils,TulihEditor:r,saveSel:E,restoreSel:q,updateActiveStates:S};s&&v.classList.add("te-minimal"),u._ctx=_,r.pluginManager.initAll(_),r.instances.push(this)}getContent(){return this.editor?this.editor.innerHTML:""}setContent(t){if(!this.editor)return;const o=this.utils.sanitizeHTML(t,this.options.sanitize);this.editor.innerHTML=o;try{W(this.editor),K(this.editor)}catch{}}getText(){return this.editor&&this.editor.textContent||""}getWordCount(){const t=this.getText().trim();return t?t.split(/\s+/).length:0}getCharCount(){return this.getText().length}setReadOnly(t){if(!this._ctx)return;const o=this._ctx,r=o.editor.contentEditable==="false";if(t===r)return;const n=o.wrapper.querySelector('[data-cmd="toggleReadOnly"]');n&&n.click()}isReadOnly(){return!!(this._ctx&&this._ctx.editor&&this._ctx.editor.contentEditable==="false")}destroy(){if(!this.container||!this.container.parentNode)return;const t=this._ctx?this._ctx.TulihEditor.instances:[],o=t.indexOf(this);o!==-1&&t.splice(o,1),this._ctx&&this._ctx.TulihEditor.pluginManager.destroyAll(this._ctx);const r=this.textarea;r&&this.editor&&(r.value=this.editor.innerHTML,r.style.display=""),this.container.parentNode.removeChild(this.container),this.editor=null,this.container=null,this.toolbar=null,this._ctx=null}}const Oe={name:"block",order:10,toolbarHTML:'<select class="te-block form-select form-select-sm"> <option value="p">Paragraph</option> <option value="h1">Heading 1</option> <option value="h2">Heading 2</option> <option value="h3">Heading 3</option> <option value="h4">Heading 4</option> <option value="h5">Heading 5</option> <option value="h6">Heading 6</option> <option value="blockquote">Quote</option> <option value="pre">Code</option></select>',init(e){if(!e.features.block)return;const t=e.wrapper.querySelector(".te-block");t&&t.addEventListener("change",()=>{const o=t.value;o&&(document.execCommand("formatBlock",!1,o),e.editor.focus(),e.updateActiveStates())})}},je={name:"inline",order:20,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Bold" data-cmd="bold"><i class="ti ti-bold"></i></button><button type="button" class="btn btn-sm btn-light" title="Italic" data-cmd="italic"><i class="ti ti-italic"></i></button><button type="button" class="btn btn-sm btn-light" title="Underline" data-cmd="underline"><i class="ti ti-underline"></i></button><button type="button" class="btn btn-sm btn-light" title="Strikethrough" data-cmd="strikeThrough"><s>S</s></button><div class="te-divider"></div><button type="button" class="btn btn-sm btn-light" title="Quote" data-cmd="formatBlock" data-val="blockquote"><strong>"</strong></button>',init(e){}},Pe={name:"pre",order:21,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Preformatted" data-cmd="formatBlock" data-val="pre"><i class="ti ti-code"></i></button>',init(e){}},Ue={name:"inlineCode",order:22,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Inline code" data-cmd="inlineCode"><i class="ti ti-code-circle"></i></button>',init(e){if(e.features.inlineCode){var t=e.wrapper.querySelector('[data-cmd="inlineCode"]');t&&t.addEventListener("click",function(){var o=re(window.getSelection().toString()||"code"),r="<code>"+o+"</code>";document.execCommand("insertHTML",!1,r),e.editor.focus()})}}},Fe={name:"subSuper",order:26,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Subscript" data-cmd="subscript">xโ‚‚</button><button type="button" class="btn btn-sm btn-light" title="Superscript" data-cmd="superscript">xยฒ</button>',init(e){e.features.subSuper&&e.wrapper.querySelectorAll('[data-cmd="subscript"],[data-cmd="superscript"]').forEach(function(t){t.addEventListener("click",function(){document.execCommand(t.getAttribute("data-cmd"),!1,void 0),e.editor.focus()})})}};var We="te-shortcut-map",Je={Bold:{key:"b",ctrl:!0,shift:!1},Italic:{key:"i",ctrl:!0,shift:!1},Underline:{key:"u",ctrl:!0,shift:!1},Strike:{key:"s",ctrl:!0,shift:!1},Undo:{key:"z",ctrl:!0,shift:!1},Redo:{key:"z",ctrl:!0,shift:!0},RedoAlt:{key:"y",ctrl:!0,shift:!1},Link:{key:"k",ctrl:!0,shift:!1}};function Xe(){try{var e=localStorage.getItem(We);if(e)return JSON.parse(e)}catch{}return JSON.parse(JSON.stringify(Je))}const Ke={name:"keyboardShortcuts",order:5,init(e){if(e.features.keyboardShortcuts!==!1){var t=e.editor,o=Xe();t.addEventListener("keydown",function(r){if(!(!r.ctrlKey&&!r.metaKey))for(var n in o){var a=o[n];if(r.key.toLowerCase()===a.key&&r.ctrlKey===a.ctrl&&r.shiftKey===a.shift){if(r.preventDefault(),n==="Bold")document.execCommand("bold");else if(n==="Italic")document.execCommand("italic");else if(n==="Underline")document.execCommand("underline");else if(n==="Strike")document.execCommand("strikeThrough");else if(n==="Undo"){var i=t._tableHist;i&&i.undo.length?(t.querySelectorAll(".te-fr-match, .te-fr-active").forEach(function(d){var p=d.parentNode;if(p){for(;d.firstChild;)p.insertBefore(d.firstChild,d);p.removeChild(d)}}),i.redo.push(t.innerHTML),t.contentEditable="false",t.innerHTML=i.undo.pop(),t.contentEditable="true",t.querySelectorAll(".te-fr-match, .te-fr-active").forEach(function(d){var p=d.parentNode;if(p){for(;d.firstChild;)p.insertBefore(d.firstChild,d);p.removeChild(d)}}),t.focus()):(document.execCommand("undo"),t.focus())}else if(n==="Redo"||n==="RedoAlt"){var i=t._tableHist;i&&i.redo.length?(t.querySelectorAll(".te-fr-match, .te-fr-active").forEach(function(p){var s=p.parentNode;if(s){for(;p.firstChild;)s.insertBefore(p.firstChild,p);s.removeChild(p)}}),i.undo.push(t.innerHTML),t.contentEditable="false",t.innerHTML=i.redo.pop(),t.contentEditable="true",t.querySelectorAll(".te-fr-match, .te-fr-active").forEach(function(p){var s=p.parentNode;if(s){for(;p.firstChild;)s.insertBefore(p.firstChild,p);s.removeChild(p)}}),t.focus()):(document.execCommand("redo"),t.focus())}else if(n==="Link"){var c=e.wrapper.querySelector('[data-cmd="createLink"]');c&&c.click()}return}}})}}};function fe(e,t){var o=e.wrapper.querySelector('[data-cmd="toggleReadOnly"]');t?(e.editor.contentEditable="false",e.wrapper.classList.add("te-readonly"),o&&(o.innerHTML='<i class="ti ti-lock-open"></i>')):(e.editor.contentEditable="true",e.wrapper.classList.remove("te-readonly"),o&&(o.innerHTML='<i class="ti ti-lock"></i>')),o&&o.classList.toggle("active",t)}const $e={name:"readOnly",order:75,css:".te-readonly-btn.active { background: #fff3cd; border-color: #ffecb5; }.te-readonly .te-toolbar select,.te-readonly .te-toolbar input,.te-readonly .te-toolbar .btn { opacity: .5; pointer-events: none;}.te-readonly .te-editor { background: #f8f9fa; cursor: default; }",toolbarHTML:"",init(e){if(e.features.readOnly!==!1){e.options.readOnly&&fe(e,!0);var t=e.wrapper.querySelector('[data-cmd="toggleReadOnly"]');t&&t.addEventListener("click",function(){var o=e.editor.contentEditable!=="false";fe(e,!o)})}}},Ye={name:"linkTooltip",order:4,css:".te-link-tooltip { position: fixed; z-index: 9999; background: #333; color: #fff; padding: 4px 8px; border-radius: 4px; font-size: .75rem; line-height: 1.4; max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; pointer-events: none; opacity: 0; transition: opacity .15s;}.te-link-tooltip.show { opacity: 1; }",init(e){if(e.features.linkTooltip===!1)return;var t=e.editor,o=document.createElement("div");o.className="te-link-tooltip",document.body.appendChild(o);var r=null;t.addEventListener("mouseover",function(i){var c=i.target&&i.target.closest&&i.target.closest("a");if(!c||!t.contains(c)){a();return}clearTimeout(r);var d=c.getAttribute("href")||"";o.textContent=d,n(i),o.classList.add("show")}),t.addEventListener("mousemove",function(i){o.classList.contains("show")&&n(i)}),t.addEventListener("mouseout",function(i){var c=i.target&&i.target.closest&&i.target.closest("a");c&&(r=setTimeout(a,200))});function n(i){var c=i.clientX+12,d=i.clientY+12;c+310>window.innerWidth&&(c=window.innerWidth-310),d+30>window.innerHeight&&(d=i.clientY-30),o.style.left=c+"px",o.style.top=d+"px"}function a(){o.classList.remove("show")}}};var Ge="๐Ÿ˜€๐Ÿ˜ƒ๐Ÿ˜„๐Ÿ˜๐Ÿ˜†๐Ÿ˜…๐Ÿคฃ๐Ÿ˜‚๐Ÿ™‚๐Ÿ™ƒ๐Ÿ˜‰๐Ÿ˜Š๐Ÿ˜‡๐Ÿฅฐ๐Ÿ˜๐Ÿคฉ๐Ÿ˜˜๐Ÿ˜—๐Ÿ˜š๐Ÿ˜‹๐Ÿ˜›๐Ÿ˜œ๐Ÿคช๐Ÿ˜๐Ÿค‘๐Ÿค—๐Ÿคญ๐Ÿคซ๐Ÿค”๐Ÿค๐Ÿคจ๐Ÿ˜๐Ÿ˜‘๐Ÿ˜ถ๐Ÿ˜๐Ÿ˜’๐Ÿ™„๐Ÿ˜ฌ๐Ÿคฅ๐Ÿ˜Œ๐Ÿ˜”๐Ÿ˜ช๐Ÿคค๐Ÿ˜ด๐Ÿ˜ท๐Ÿค’๐Ÿค•๐Ÿคข๐Ÿคฎ๐Ÿคง๐Ÿฅต๐Ÿฅถ๐Ÿฅด๐Ÿ˜ต๐Ÿคฏ๐Ÿค ๐Ÿฅณ๐Ÿฅธ๐Ÿ˜Ž๐Ÿค“๐Ÿง๐Ÿ˜•๐Ÿ˜Ÿ๐Ÿ™๐Ÿ˜ฎ๐Ÿ˜ฏ๐Ÿ˜ฒ๐Ÿ˜ณ๐Ÿฅบ๐Ÿ˜ฆ๐Ÿ˜ง๐Ÿ˜จ๐Ÿ˜ฐ๐Ÿ˜ฅ๐Ÿ˜ข๐Ÿ˜ญ๐Ÿ˜ฑ๐Ÿ˜–๐Ÿ˜ฃ๐Ÿ˜ž๐Ÿ˜“๐Ÿ˜ฉ๐Ÿ˜ซ๐Ÿฅฑ๐Ÿ˜ค๐Ÿ˜ก๐Ÿ˜ ๐Ÿคฌ๐Ÿ˜ˆ๐Ÿ‘ฟ๐Ÿ’€โ˜ ๐Ÿ’ฉ๐Ÿคก๐Ÿ‘น๐Ÿ‘บ๐Ÿ‘ป๐Ÿ‘ฝ๐Ÿ‘พ๐Ÿค–".match(/.{1,2}/g)||[],Ve={"๐Ÿ˜€":"grinning laugh happy","๐Ÿ˜ƒ":"grinning smile","๐Ÿ˜„":"smile happy","๐Ÿ˜":"beaming grin","๐Ÿ˜†":"laughing grinning","๐Ÿคฃ":"rolling floor laugh","๐Ÿ˜‚":"tears joy cry","๐Ÿ™‚":"slight smile","๐Ÿ™ƒ":"upside down","๐Ÿ˜‰":"winking wink","๐Ÿ˜Š":"blush smile","๐Ÿ˜‡":"innocent angel","๐Ÿฅฐ":"love heart","๐Ÿ˜":"heart eyes","๐Ÿคฉ":"star struck","๐Ÿ˜˜":"kiss blowing","๐Ÿ˜—":"kissing","๐Ÿ˜š":"kiss closed","๐Ÿ˜‹":"savor yum","๐Ÿ˜›":"tongue","๐Ÿ˜œ":"wink tongue silly","๐Ÿคช":"crazy wild","๐Ÿ˜":"squint tongue","๐Ÿค‘":"money tongue","๐Ÿค—":"hug","๐Ÿคญ":"hand over mouth secret","๐Ÿคซ":"shush quiet silent","๐Ÿค”":"thinking think","๐Ÿค":"zipper mouth secret","๐Ÿคจ":"raised eyebrow suspicious","๐Ÿ˜":"neutral straight","๐Ÿ˜‘":"expressionless blank","๐Ÿ˜ถ":"no mouth silent","๐Ÿ˜":"smirk smug","๐Ÿ˜’":"unamified","๐Ÿ™„":"eye roll","๐Ÿ˜ฌ":"grimace awkward","๐Ÿคฅ":"lying liar nose","๐Ÿ˜Œ":"relieved","๐Ÿ˜”":"pensive sad","๐Ÿ˜ช":"sleepy tired","๐Ÿคค":"drooling","๐Ÿ˜ด":"sleeping zzz","๐Ÿ˜ท":"mask sick","๐Ÿค’":"fever","๐Ÿค•":"hurt bandage","๐Ÿคข":"nauseous sick","๐Ÿคฎ":"vomiting","๐Ÿคง":"sneeze","๐Ÿฅต":"hot sweat","๐Ÿฅถ":"cold freeze","๐Ÿฅด":"dizzy","๐Ÿ˜ต":"dizzy confused","๐Ÿคฏ":"mind blown exploding","๐Ÿค ":"cowboy","๐Ÿฅณ":"party celebration","๐Ÿฅธ":"disguise","๐Ÿ˜Ž":"sunglasses cool","๐Ÿค“":"nerd geek","๐Ÿง":"monocle","๐Ÿ˜•":"confused","๐Ÿ˜Ÿ":"worried","๐Ÿ™":"frown sad","๐Ÿ˜ฎ":"surprised shock","๐Ÿ˜ฏ":"hushed","๐Ÿ˜ฒ":"astonished","๐Ÿ˜ณ":"flushed embarrassed","๐Ÿฅบ":"pleading puppy eyes","๐Ÿ˜ฆ":"frown","๐Ÿ˜ง":"anguish","๐Ÿ˜จ":"fearful afraid","๐Ÿ˜ฐ":"anxious worry","๐Ÿ˜ฅ":"disappointed","๐Ÿ˜ข":"cry sad tear","๐Ÿ˜ญ":"sobbing cry","๐Ÿ˜ฑ":"scream horror","๐Ÿ˜–":"confounded","๐Ÿ˜ฃ":"struggle","๐Ÿ˜ž":"disappointed","๐Ÿ˜“":"sweat","๐Ÿ˜ฉ":"weary","๐Ÿ˜ซ":"tired exhausted","๐Ÿฅฑ":"yawn sleepy","๐Ÿ˜ค":"frustrated","๐Ÿ˜ก":"angry rage","๐Ÿ˜ ":"angry mad","๐Ÿคฌ":"cursing swear","๐Ÿ˜ˆ":"devil evil grin","๐Ÿ‘ฟ":"devil evil angry","๐Ÿ’€":"skull death","โ˜ ":"skull crossbones danger","๐Ÿ’ฉ":"poop","๐Ÿคก":"clown","๐Ÿ‘น":"ogre monster","๐Ÿ‘บ":"goblin","๐Ÿ‘ป":"ghost halloween","๐Ÿ‘ฝ":"alien ufo","๐Ÿ‘พ":"alien monster","๐Ÿค–":"robot","๐Ÿ’‹":"kiss lips","๐Ÿ‘‹":"wave hello bye","โœ‹":"raised hand stop","๐Ÿ‘Œ":"ok perfect","๐Ÿค":"pinching small","๐Ÿคž":"crossed fingers luck","๐ŸคŸ":"love gesture","๐Ÿค˜":"horns rock","๐Ÿค™":"call me","๐Ÿ‘ˆ":"point left","๐Ÿ‘‰":"point right","๐Ÿ‘†":"point up","๐Ÿ–•":"middle finger","๐Ÿ‘":"thumbs up like","๐Ÿ‘Ž":"thumbs down dislike","โœŠ":"fist raised power","๐Ÿ‘Š":"fist punch","๐Ÿค›":"fist left","๐Ÿคœ":"fist right","๐Ÿ‘":"clap applause","๐Ÿ™Œ":"celebration","๐Ÿ‘":"open hands","๐Ÿคฒ":"palms together pray","๐Ÿค":"handshake deal","๐Ÿ™":"pray please thank","โœ":"writing","๐Ÿ’…":"nail polish","๐Ÿ‘‚":"ear listen","๐Ÿ‘ƒ":"nose smell","๐Ÿ‘ฃ":"footsteps","๐Ÿ‘€":"eyes","๐Ÿ‘…":"tongue","๐Ÿ‘„":"mouth lips"};const Ze={name:"emojiAutocomplete",order:6,css:".te-emoji-ac { position: fixed; z-index: 9999; background: #fff; border: 1px solid #dee2e6; border-radius: .375rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); padding: .25rem; display: none; max-height: 160px; overflow-y: auto; min-width: 120px;}.te-emoji-ac-item { display: flex; align-items: center; gap: 6px; padding: 4px 8px; cursor: pointer; border-radius: .25rem; font-size: 1rem;}.te-emoji-ac-item:hover, .te-emoji-ac-item.active { background: #e7f1ff;}",init(e){if(e.features.emojiAutocomplete===!1)return;var t=e.editor,o=document.createElement("div");o.className="te-emoji-ac",document.body.appendChild(o);var r="",n=0,a=[];function i(s){s=s||"",o.innerHTML="",a=[],n=0;var u=s.toLowerCase();if(Ge.forEach(function(b){var k=(Ve[b]||"").toLowerCase();if(!(u&&k.indexOf(u)===-1)){var T=document.createElement("div");T.className="te-emoji-ac-item",T.textContent=b,T.setAttribute("data-emoji",b),o.appendChild(T)}}),a=Array.prototype.slice.call(o.children),a.length===0){o.style.display="none";return}a[0].classList.add("active"),o.style.display="block",c()}function c(){var s=window.getSelection();if(!(!s||!s.rangeCount)){var u=s.getRangeAt(0),b=u.getBoundingClientRect();o.style.left=Math.max(4,b.left)+"px",o.style.top=b.bottom+4+"px";var k=o.getBoundingClientRect();k.right>window.innerWidth-4&&(o.style.left=window.innerWidth-k.width-4+"px"),k.bottom>window.innerHeight-4&&(o.style.top=b.top-k.height-4+"px")}}function d(s){t.focus();var u=window.getSelection();if(u&&u.rangeCount>0&&r){var b=u.getRangeAt(0),k=r.length+1;b.startOffset>=k&&b.startContainer.nodeType===3&&(b.setStart(b.startContainer,b.startOffset-k),b.deleteContents())}document.execCommand("insertText",!1,s),o.style.display="none",r=""}function p(s){a.length!==0&&(a[n].classList.remove("active"),n=(n+s+a.length)%a.length,a[n].classList.add("active"),a[n].scrollIntoView({block:"nearest"}))}t.addEventListener("keydown",function(s){if(o.style.display!=="none"){if(s.key==="ArrowDown"){s.preventDefault(),p(1);return}if(s.key==="ArrowUp"){s.preventDefault(),p(-1);return}if(s.key==="Enter"||s.key==="Tab"){s.preventDefault();var u=o.querySelector(".active");if(u){var b=u.getAttribute("data-emoji");b&&d(b)}return}if(s.key==="Escape"){o.style.display="none",r="";return}}}),t.addEventListener("input",function(){var s=window.getSelection();if(!(!s||!s.rangeCount||!s.anchorNode)){var u=s.anchorNode,b=u.textContent||"",k=s.anchorOffset,T=b.slice(0,k),x=T.lastIndexOf(":");if(x!==-1&&T.indexOf(" ",x)===-1&&x!==k-1){if(r=T.slice(x+1),r.indexOf(":")!==-1){o.style.display="none";return}i(r)}else x!==-1&&x===k-1?(r="",i("")):(o.style.display="none",r="")}}),o.addEventListener("mousedown",function(s){var u=s.target&&s.target.closest&&s.target.closest(".te-emoji-ac-item");if(u){s.preventDefault();var b=u.getAttribute("data-emoji");b&&d(b)}})}},Qe={name:"statusBar",order:100,css:".te-statusbar { display: flex; justify-content: space-between; gap: 1rem; padding: 4px 8px; font-size: .75rem; color: #6c757d; background: #f8f9fa; border: 1px solid #dee2e6; border-top: none; border-radius: 0 0 .375rem .375rem;}.te-statusbar .te-status-tag { font-weight: 600; font-family: monospace;}",init(e){if(e.features.statusBar===!1)return;var t=e.editor,o=document.createElement("div");o.className="te-statusbar",o.innerHTML='<span class="te-status-tag"></span><span class="te-status-right"><span class="te-status-words">0 words</span><span class="te-status-chars">0 characters</span></span>',t.parentNode.insertBefore(o,t.nextSibling);function r(){var a=window.getSelection();if(!a||a.rangeCount===0)return"";var i=a.anchorNode;if(i&&i.nodeType===3&&(i=i.parentNode),!i||!t.contains(i))return"";for(var c="",d=i;d&&d!==t;){var p=d.tagName?d.tagName.toLowerCase():"";if(["p","h1","h2","h3","h4","h5","h6","div","blockquote","pre","li","td","th","ol","ul","table","thead","tbody","tfoot","tr"].indexOf(p)!==-1){c=p;break}d=d.parentElement}return c}function n(){var a=window.getSelection(),i=a&&!a.isCollapsed&&t.contains(a.anchorNode)&&t.contains(a.focusNode),c=t.textContent||"",d=c.trim()?c.trim().split(/\s+/).length:0,p=c.length,s=o.querySelector(".te-status-tag"),u=o.querySelector(".te-status-right");if(s&&(s.textContent=r()),u){var b=u.querySelector(".te-status-words"),k=u.querySelector(".te-status-chars");if((!b||!k)&&(u.innerHTML='<span class="te-status-words"></span><span class="te-status-chars"></span>',b=u.querySelector(".te-status-words"),k=u.querySelector(".te-status-chars")),b&&(b.textContent=d+" word"+(d!==1?"s":"")),k&&(k.textContent=p+" character"+(p!==1?"s":"")),i){var T=a.toString(),x=T.trim()?T.trim().split(/\s+/).length:0,m=x+" word"+(x!==1?"s":"")+", "+T.length+" char selected | "+d+" word"+(d!==1?"s":"")+", "+p+" characters";b&&(b.style.display="none"),k&&(k.textContent=m)}else b&&(b.style.display="")}}t.addEventListener("input",n),t.addEventListener("paste",function(){setTimeout(n,100)}),document.addEventListener("selectionchange",function(){(document.activeElement===t||t.contains(document.activeElement))&&n()}),n()}};var et=[{id:"none",label:"Plain text"},{id:"markup",label:"HTML"},{id:"css",label:"CSS"},{id:"javascript",label:"JavaScript"},{id:"php",label:"PHP"},{id:"python",label:"Python"},{id:"java",label:"Java"},{id:"c",label:"C"},{id:"cpp",label:"C++"},{id:"sql",label:"SQL"},{id:"bash",label:"Bash"},{id:"json",label:"JSON"},{id:"typescript",label:"TypeScript"},{id:"go",label:"Go"},{id:"rust",label:"Rust"},{id:"ruby",label:"Ruby"}];const tt={name:"codeBlock",order:23,css:'.te-codeblock-popup { position: absolute; z-index: 3000; background: #fff; border: 1px solid #dee2e6; border-radius: .375rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); padding: .5rem; min-width: 160px;}.te-codeblock-popup select { width: 100%; margin-bottom: .5rem;}.te-codeblock-popup .btn { width: 100%; }.te-editor pre { background: #1e1e2e; border: 1px solid #45475a; border-left: 4px solid #89b4fa; border-radius: .375rem; padding: .75rem; overflow-x: auto; margin: .5rem 0; font-family: "JetBrains Mono", "Fira Code", "Cascadia Code", Consolas, monospace; font-size: .875rem; line-height: 1.6; color: #cdd6f4;}.te-editor pre code { background: none; padding: 0; font-size: inherit; line-height: inherit; color: inherit;}',toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Code block" data-cmd="codeBlock"><i class="ti ti-codeblock"></i></button>',init(e){if(e.features.codeBlock!==!1){var t=e.wrapper.querySelector('[data-cmd="codeBlock"]');if(t){var o=document.createElement("div");o.className="te-codeblock-popup",o.style.display="none",o.innerHTML='<select class="te-codeblock-lang form-select form-select-sm">'+et.map(function(r){return'<option value="'+r.id+'">'+r.label+"</option>"}).join("")+'</select><button type="button" class="btn btn-sm btn-primary te-codeblock-insert">Insert</button>',document.body.appendChild(o),t.addEventListener("click",function(r){var n=t.getBoundingClientRect();o.style.left=window.scrollX+n.left+"px",o.style.top=window.scrollY+n.bottom+4+"px",o.style.display=o.style.display==="none"?"block":"none"}),o.querySelector(".te-codeblock-insert").addEventListener("click",function(){var r=o.querySelector(".te-codeblock-lang").value,n=window.getSelection(),a=n?n.toString():"";a||(a="code");var i=r&&r!=="none"?' class="language-'+r+'"':"",c="<pre><code"+i+">"+a.replace(/</g,"&lt;").replace(/>/g,"&gt;")+"</code></pre>";document.execCommand("insertHTML",!1,c),o.style.display="none",e.editor.focus()}),document.addEventListener("click",function(r){o.style.display!=="none"&&!o.contains(r.target)&&r.target!==t&&(o.style.display="none")})}}}};var oe=[{match:/(?:https?:\/\/)?(?:www\.)?(?:youtube\.com\/(?:watch\?v=|embed\/|shorts\/)|youtu\.be\/)([a-zA-Z0-9_-]{11})/,embed:function(e){return'<iframe src="https://www.youtube.com/embed/'+e+'" style="max-width:100%;border:0;aspect-ratio:16/9;" allowfullscreen></iframe>'}},{match:/(?:https?:\/\/)?(?:www\.)?vimeo\.com\/(\d+)/,embed:function(e){return'<iframe src="https://player.vimeo.com/video/'+e+'" style="max-width:100%;border:0;aspect-ratio:16/9;" allowfullscreen></iframe>'}}];const rt={name:"mediaEmbed",order:2,init(e){if(e.features.mediaEmbed!==!1){var t=e.editor;t.addEventListener("paste",function(o){var r=o.clipboardData&&o.clipboardData.getData("text/plain")||"";if(r){r=r.trim();for(var n=0;n<oe.length;n++){var a=r.match(oe[n].match);if(a&&a[1]){o.preventDefault(),o.stopImmediatePropagation();var i=oe[n].embed(a[1]);document.execCommand("insertHTML",!1,i),setTimeout(function(){try{K(t),W(t)}catch{}},0);return}}}},!0)}}},ot={name:"dragDrop",order:3,css:".te-editor.te-dragover { outline: 3px dashed rgba(13,110,253,.5); outline-offset: -6px; background: rgba(13,110,253,.03);}",init(e){if(e.features.dragDrop===!1)return;var t=e.editor;function o(n){return n&&/^image\/(png|jpe?g|gif|webp|svg\+xml|bmp)$/i.test(n.type)}function r(n,a){var i=new FileReader;i.onload=function(){a(i.result)},i.readAsDataURL(n)}t.addEventListener("dragenter",function(n){n.preventDefault(),n.stopPropagation(),t.classList.add("te-dragover")}),t.addEventListener("dragover",function(n){n.preventDefault(),n.stopPropagation()}),t.addEventListener("dragleave",function(n){n.preventDefault(),n.stopPropagation(),t.contains(n.relatedTarget)||t.classList.remove("te-dragover")}),t.addEventListener("drop",function(n){n.preventDefault(),n.stopPropagation(),t.classList.remove("te-dragover");var a=n.dataTransfer&&n.dataTransfer.files;if(!(!a||a.length===0))for(var i=0;i<a.length;i++){var c=a[i];if(o(c)){var d=e.TulihEditor&&e.TulihEditor.onUploadImage||r;d(c,function(p){if(p){var s='<img src="'+p.replace(/"/g,"&quot;")+'" alt="'+(c.name||"").replace(/"/g,"&quot;")+'" style="max-width:100%;" />';document.execCommand("insertHTML",!1,s)}})}}})}},nt={name:"pastePlain",order:24,css:".te-pasteplain-btn.active { background: #e7f1ff; border-color: #b6d4fe; }",toolbarHTML:'<button type="button" class="btn btn-sm btn-light te-pasteplain-btn" title="Paste as plain text" data-cmd="togglePastePlain"><i class="ti ti-clipboard"></i></button>',init(e){if(e.features.pastePlain){var t=e.editor;e._pastePlain=!1;var o=e.wrapper.querySelector('[data-cmd="togglePastePlain"]');o&&o.addEventListener("click",function(){e._pastePlain=!e._pastePlain,o.classList.toggle("active",e._pastePlain)}),t.addEventListener("paste",function(r){if(e._pastePlain){r.stopImmediatePropagation(),r.preventDefault();var n=r.clipboardData&&r.clipboardData.getData("text/plain")||"";if(n){var a=re(n),i="<p>"+a.replace(/\n{2,}/g,"</p><p>").replace(/\n/g,"<br>")+"</p>";document.execCommand("insertHTML",!1,i)}setTimeout(function(){try{K(t),W(t)}catch{}},0)}},!0)}}},at={name:"findReplace",order:31,css:".te-fr-popup { position: absolute; z-index: 3000; background: #fff; border: 1px solid #dee2e6; border-radius: .5rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); padding: .75rem; width: 320px;}.te-fr-popup .te-fr-row { display: flex; gap: .5rem; margin-bottom: .5rem; }.te-fr-popup .te-fr-row:last-child { margin-bottom: 0; }.te-fr-popup input { flex: 1; }.te-fr-popup .btn { white-space: nowrap; }.te-fr-count { font-size: .8rem; color: #6c757d; padding: .25rem .5rem; }.te-fr-match { background: #fff3cd; outline: 2px solid #ffc107; }.te-fr-active { background: #f0ad4e; outline: 2px solid #e68600; }",toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Find & Replace" data-cmd="findReplace"><i class="ti ti-search"></i></button>',init(e){if(!e.features.findReplace)return;var t=e.editor,o=document.createElement("div");o.className="te-fr-popup",o.style.display="none",o.innerHTML='<div class="te-fr-row"><input type="text" class="form-control form-control-sm te-fr-find" placeholder="Find..." /><button type="button" class="btn btn-sm btn-outline-primary te-fr-prev" title="Previous">&uarr;</button><button type="button" class="btn btn-sm btn-primary te-fr-next" title="Next">&darr;</button></div><div class="te-fr-row"><input type="text" class="form-control form-control-sm te-fr-replace" placeholder="Replace..." /><button type="button" class="btn btn-sm btn-outline-secondary te-fr-replace-btn">Replace</button><button type="button" class="btn btn-sm btn-outline-secondary te-fr-replace-all">All</button></div><div class="te-fr-row"><span class="te-fr-count"></span><button type="button" class="btn btn-sm btn-outline-secondary te-fr-close ms-auto" title="Close">&times;</button></div>',document.body.appendChild(o);var r=o.querySelector(".te-fr-find"),n=o.querySelector(".te-fr-replace"),a=o.querySelector(".te-fr-count");function i(f){return f.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function c(){t.querySelectorAll(".te-fr-match, .te-fr-active").forEach(function(f){var S=f.parentNode;if(S){for(;f.firstChild;)S.insertBefore(f.firstChild,f);S.removeChild(f)}}),t.normalize()}function d(f){if(t.querySelectorAll(".te-fr-active").forEach(function(q){q.classList.remove("te-fr-active"),q.classList.add("te-fr-match")}),!!f){f.classList.remove("te-fr-match"),f.classList.add("te-fr-active"),f.scrollIntoView({block:"nearest"});var S=document.createRange();S.selectNodeContents(f);var E=window.getSelection();E.removeAllRanges(),E.addRange(S)}}var p=[],s=-1;function u(){c();var f=r.value.trim();if(f){for(var S=[],E=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,null);E.nextNode();)S.push(E.currentNode);p=[],S.forEach(function(q){for(var H=q.textContent,B=new RegExp(i(f),"gi"),_=[],w;(w=B.exec(H))!==null;)_.push({idx:w.index,len:w[0].length});for(var g=_.length-1;g>=0;g--){var M=_[g],y=document.createElement("span");y.className="te-fr-match",y.textContent=H.substring(M.idx,M.idx+M.len),q.splitText(M.idx+M.len);var h=q.splitText(M.idx);h.parentNode.replaceChild(y,h),p.push(y)}}),a.textContent=p.length+" matches"}}function b(){if(p.length)s=(s+1)%p.length;else{if(u(),!p.length)return;s=0}d(p[s])}function k(){if(p.length)s=(s-1+p.length)%p.length;else{if(u(),!p.length)return;s=p.length-1}d(p[s])}function T(f){u(),p.length&&(s=0,d(p[s]))}o.querySelector(".te-fr-next").addEventListener("click",b),o.querySelector(".te-fr-prev").addEventListener("click",k);function x(){o.style.display="none",c(),t.focus()}r.addEventListener("input",function(){u()}),r.addEventListener("keydown",function(f){f.key==="Enter"&&(f.preventDefault(),T()),f.key==="Escape"&&(f.preventDefault(),x())}),n.addEventListener("keydown",function(f){f.key==="Enter"&&(f.preventDefault(),o.querySelector(".te-fr-replace-btn").click()),f.key==="Escape"&&(f.preventDefault(),x())});function m(){c(),t._tableHist||(t._tableHist={undo:[],redo:[]}),t._tableHist.undo.push(t.innerHTML),t._tableHist.undo.length>50&&t._tableHist.undo.shift(),t._tableHist.redo=[]}function v(){var f=e.wrapper.querySelector('[data-cmd="undo"]'),S=e.wrapper.querySelector('[data-cmd="redo"]'),E=t._tableHist;f&&f.toggleAttribute("disabled",!E||!E.undo.length),S&&S.toggleAttribute("disabled",!E||!E.redo.length)}o.querySelector(".te-fr-replace-btn").addEventListener("click",function(){if(p.length){var f=t.querySelector(".te-fr-active");if(f){m();var S=n.value,E=f.parentNode;E&&E.replaceChild(document.createTextNode(S),f),p.splice(s,1),a.textContent=p.length+" matches",p.length?(s=Math.min(s,p.length-1),d(p[s])):a.textContent="0 matches",v()}}}),o.querySelector(".te-fr-replace-all").addEventListener("click",function(){var f=r.value.trim(),S=n.value;if(f){m(),c();for(var E=new RegExp(i(f),"gi"),q=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,null),H=[];q.nextNode();)H.push(q.currentNode);var B=0;H.forEach(function(_){var w=_.textContent;E.test(w)&&(E.lastIndex=0,_.textContent=w.replace(E,function(){return B++,S}))}),a.textContent=B+" replaced",p=[],s=-1,v()}}),o.querySelector(".te-fr-close").addEventListener("click",x);var l=e.wrapper.querySelector('[data-cmd="findReplace"]');l&&(l.addEventListener("click",function(f){var S=l.getBoundingClientRect();o.style.left=window.scrollX+S.left+"px",o.style.top=window.scrollY+S.bottom+4+"px",o.style.display=o.style.display==="none"?"block":"none",o.style.display!=="none"&&(r.value="",n.value="",a.textContent="",c(),p=[],s=-1,r.focus())}),document.addEventListener("click",function(f){o.style.display!=="none"&&!o.contains(f.target)&&f.target!==l&&(o.style.display="none",c())}))}},it={name:"indent",order:25,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Indent" data-cmd="indent"><i class="ti ti-indent-increase"></i></button><button type="button" class="btn btn-sm btn-light" title="Outdent" data-cmd="outdent"><i class="ti ti-indent-decrease"></i></button>',init(e){if(!e.features.indent)return;const t=e.wrapper.querySelector('[data-cmd="indent"]');t&&t.addEventListener("click",function(){document.execCommand("indent",!1,void 0),e.editor.focus()});const o=e.wrapper.querySelector('[data-cmd="outdent"]');o&&o.addEventListener("click",function(){document.execCommand("outdent",!1,void 0),e.editor.focus()})}};var lt=/\bte-list-\S+/g,be=[{val:"decimal",label:"1.",cls:""},{val:"upper-alpha",label:"A.",cls:"te-list-upper-alpha"},{val:"lower-alpha",label:"a.",cls:"te-list-lower-alpha"},{val:"upper-roman",label:"I.",cls:"te-list-upper-roman"},{val:"lower-roman",label:"i.",cls:"te-list-lower-roman"}],me=[{val:"disc",label:"โ€ข",cls:""},{val:"circle",label:"โ—‹",cls:"te-list-circle"},{val:"square",label:"โ– ",cls:"te-list-square"}];function ne(e,t,o){e&&(e.className=(e.className||"").replace(lt,"").trim(),o&&e.classList.add(o),e.style.listStyleType=t||"")}function te(e){for(;e&&e.nodeType===1;){if(e.tagName==="OL"||e.tagName==="UL")return e;e=e.parentElement}return null}function ge(e){for(var t='<option value="">โ€”</option>',o=0;o<e.length;o++)t+='<option value="'+e[o].val+'">'+e[o].label+"</option>";return t}function ve(e,t,o,r){var n=t.value;t.value="";var a=window.getSelection();if(!(!a||!a.anchorNode)){var i=a.anchorNode;i.nodeType===3&&(i=i.parentNode);var c=te(i),d=o==="OL"?"insertOrderedList":"insertUnorderedList";if(!n){c&&c.tagName===o&&document.execCommand(d,!1,void 0),e.editor.focus();return}for(var p=null,s=0;s<r.length;s++)if(r[s].val===n){p=r[s];break}if(p){if(c)if(c.tagName===o)ne(c,n,p.cls);else{document.execCommand(d,!1,void 0);var u=a.focusNode;u&&u.nodeType===3&&(u=u.parentNode);var b=te(u);b&&b.tagName===o&&ne(b,n,p.cls)}else{document.execCommand(d,!1,void 0);var u=a.focusNode;u&&u.nodeType===3&&(u=u.parentNode);var b=te(u);b&&ne(b,n,p.cls)}e.editor.focus()}}}const st={name:"list",order:25,css:".te-list-select { width: auto; }.te-editor ol.te-list-upper-alpha { list-style-type: upper-alpha; }.te-editor ol.te-list-lower-alpha { list-style-type: lower-alpha; }.te-editor ol.te-list-upper-roman { list-style-type: upper-roman; }.te-editor ol.te-list-lower-roman { list-style-type: lower-roman; }.te-editor ul.te-list-circle { list-style-type: circle; }.te-editor ul.te-list-square { list-style-type: square; }",toolbarHTML:'<select class="te-list-ol form-select form-select-sm te-list-select" title="Ordered list style">'+ge(be)+'</select><select class="te-list-ul form-select form-select-sm te-list-select" title="Unordered list style">'+ge(me)+"</select>",init(e){if(e.features.list!==!1){var t=e.wrapper.querySelector(".te-list-ol"),o=e.wrapper.querySelector(".te-list-ul");t&&t.addEventListener("change",function(){ve(e,t,"OL",be)}),o&&o.addEventListener("change",function(){ve(e,o,"UL",me)}),e.editor.addEventListener("keydown",function(r){if(r.key==="Tab"){var n=window.getSelection();if(!n||!n.anchorNode)return;var a=n.anchorNode;a.nodeType===3&&(a=a.parentNode);var i=te(a);i&&(r.preventDefault(),document.execCommand(r.shiftKey?"outdent":"indent",!1,void 0),e.editor.focus())}})}}},dt={name:"lineHeight",order:26,css:".te-lh-select { width: auto; }",toolbarHTML:'<select class="te-lh form-select form-select-sm te-lh-select" title="Line height"> <option value="" disabled selected>Line Height</option> <option value="1">1</option> <option value="1.15">1.15</option> <option value="1.5">1.5</option> <option value="1.8">1.8</option> <option value="2">2</option> <option value="2.5">2.5</option> <option value="3">3</option></select>',init(e){if(e.features.lineHeight){var t=e.wrapper.querySelector(".te-lh");t&&t.addEventListener("change",function(){var o=t.value;if(o){document.execCommand("formatBlock",!1,"p");var r=window.getSelection();if(!(!r||!r.rangeCount)){var n=r.anchorNode;n&&n.nodeType===3&&(n=n.parentNode);var a=n&&n.closest&&n.closest("p,h1,h2,h3,h4,h5,h6,div,li,blockquote");a&&e.wrapper.contains(a)&&(a.style.lineHeight=o),e.editor.focus()}}})}}};var ct=["8","9","10","11","12","13","14","16","18","20","22","24","26","28","36","48","72"];const ut={name:"fontSize",order:27,css:".te-fontsize-select { width: auto; }",toolbarHTML:'<span class="te-dropdown-icon te-dropdown-icon-text">Aa</span><select class="te-fontsize form-select form-select-sm te-fontsize-select" title="Font size"> <option value="">Normal</option>'+ct.map(function(e){return'<option value="'+e+'">'+e+"</option>"}).join("")+"</select>",init(e){if(e.features.fontSize){var t=e.wrapper.querySelector(".te-fontsize");t&&t.addEventListener("change",function(){var o=t.value;if(o){var r=re(window.getSelection().toString()||"text"),n='<span style="font-size:'+o+'px">'+r+"</span>";document.execCommand("insertHTML",!1,n),e.editor.focus()}})}}};var pt=["Arial","Arial Black","Comic Sans MS","Courier New","Georgia","Impact","Lucida Console","Tahoma","Times New Roman","Trebuchet MS","Verdana"];const ft={name:"fontFamily",order:28,css:".te-fontfamily-select { width: auto; }",toolbarHTML:'<span class="te-dropdown-icon"><i class="ti ti-typography"></i></span><select class="te-fontfamily form-select form-select-sm te-fontfamily-select" title="Font family"> <option value="">Normal</option>'+pt.map(function(e){return'<option value="'+e+'">'+e+"</option>"}).join("")+"</select>",init(e){if(e.features.fontFamily){var t=e.wrapper.querySelector(".te-fontfamily");t&&t.addEventListener("change",function(){var o=t.value;o&&(document.execCommand("fontName",!1,o),e.editor.focus())})}}};var bt="ยฉยฎโ„ขยงยฑโ€ขยทโ€ โ€กโ€ขยถโ€ฒโ€ณโ†โ†‘โ†’โ†“โ†”โ†•โ‡’โ‡”โˆžโ‰ˆโ‰ โ‰คโ‰ฅโˆšโˆ›โˆœรทร—โˆ‘โˆโˆซโˆ‚โˆ‡โˆ…โˆˆโˆ‰โˆ‹โˆงโˆจโˆฉโˆชโŠ‚โŠƒโІโЇยฌโˆงโˆจโ‡’โ‡”โˆ€โˆƒโˆ„โˆตโˆดโˆทโˆ โˆŸโˆกโˆฅโˆฆโˆผโ‰…โ‰œโ‰›โ‰โ‰Ÿโ‰ โ‰กโ‰ขโ‰คโ‰ฅโ‰ฆโ‰งโ‰จโ‰ฉโ‰ชโ‰ซโ‰ฌโ‰ญโ‰ฎโ‰ฏโ‰ฐโ‰ฑโ‰ฒโ‰ณโ‰ดโ‰ตโ‰ถโ‰ทโ‰ธโ‰นโ‰บโ‰ปโ‰ผโ‰ฝโ‰พโ‰ฟโŠ€โЁโŠ‚โŠƒโŠ„โŠ…โІโЇโŠˆโЉโŠŠโŠ‹โŠŒโŠโŠŽโŠโАโŠ‘โŠ’โŠ“โŠ”โŠ•โŠ–โŠ—โŠ˜โŠ™โŠšโŠ›โŠœโŠโŠžโŠŸโŠ โŠกโŠขโŠฃโŠคโŠฅโŠฆโŠงโŠจโŠฉโŠชโŠซโŠฌโŠญโŠฎโŠฏโŠฐโŠฑโŠฒโŠณโŠดโŠตโŠถโŠทโŠธโŠนโŠบโŠปโŠผโŠฝโŠพโŠฟโ‹€โ‹โ‹‚โ‹ƒโ‹„โ‹…โ‹†โ‹‡โ‹ˆโ‹‰โ‹Šโ‹‹โ‹Œโ‹โ‹Žโ‹โ‹โ‹‘โ‹’โ‹“โ‹”โ‹•โ‹–โ‹—โ‹˜โ‹™โ‹šโ‹›โ‹œโ‹โ‹žโ‹Ÿโ‚ฌยฃยฅโ‚ฉโ‚ฝโ‚จโ‚ชโ‚ซโ‚ญโ‚ฎโ‚ฐโ‚ฑโ‚ฒโ‚ณโ‚ดโ‚ตโ‚ถโ‚ทโ‚ธโ‚นโ‚บโ‚ปโ‚ผโ‚ฝโ‚พโ‚ฟ".split("");const mt={name:"specialChars",order:29,css:".te-sc-popup { position: absolute; z-index: 3000; display: grid; grid-template-columns: repeat(10, 1fr); gap: 2px; background: #fff; border: 1px solid #dee2e6; border-radius: .5rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); padding: .5rem; max-width: 320px; max-height: 200px; overflow-y: auto;}.te-sc-popup button { background: none; border: none; font-size: 1rem; padding: .25rem; cursor: pointer; border-radius: .25rem; text-align: center;}.te-sc-popup button:hover { background: #f0f0f0; }",toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Special characters" data-cmd="specialChars"><i class="ti ti-hash"></i></button>',init(e){if(e.features.specialChars){var t=document.createElement("div");t.className="te-sc-popup",t.style.display="none",bt.forEach(function(r){var n=document.createElement("button");n.type="button",n.textContent=r,n.setAttribute("data-sc",r),t.appendChild(n)}),document.body.appendChild(t);var o=e.wrapper.querySelector('[data-cmd="specialChars"]');o&&o.addEventListener("click",function(r){var n=o.getBoundingClientRect();t.style.left=window.scrollX+n.left+"px",t.style.top=window.scrollY+n.bottom+4+"px",t.style.display=t.style.display==="none"?"grid":"none"}),t.addEventListener("click",function(r){var n=r.target&&r.target.getAttribute("data-sc");n&&(document.execCommand("insertHTML",!1,n),t.style.display="none",e.editor.focus())}),document.addEventListener("click",function(r){t.style.display!=="none"&&!t.contains(r.target)&&r.target!==o&&(t.style.display="none")})}}},gt={name:"colors",order:30,css:'.te-color-btn { position: relative; padding: .15rem .35rem !important; min-width: 28px; text-align: center;}.te-color-preview { display: block; font-size: 1rem; line-height: 1;}.te-color-preview::after { content: ""; display: block; height: 3px; border-radius: 1px; margin-top: 2px;}.te-fore-btn .te-color-preview::after { background: currentColor;}.te-back-btn .te-color-preview::after { background: var(--te-back-color, #ffff00);}.te-color-input { position: absolute; top: 0; left: 0; width: 100%; height: 100%; opacity: 0; cursor: pointer; border: none; padding: 0;}',toolbarHTML:'<button type="button" class="btn btn-sm btn-light te-color-btn te-fore-btn" title="Text color"><span class="te-color-preview" style="color:#000000">A</span><input type="color" class="te-color-input te-fore-color" value="#000000"></button><button type="button" class="btn btn-sm btn-light te-color-btn te-back-btn" title="Background color"><span class="te-color-preview" style="--te-back-color:#ffff00;color:#000">A</span><input type="color" class="te-color-input te-back-color" value="#ffff00"></button>',init(e){if(e.features.colors){var t=e.wrapper.querySelector(".te-fore-color"),o=e.wrapper.querySelector(".te-fore-btn");o&&t&&t.addEventListener("change",function(){var a=o.querySelector(".te-color-preview");a.style.color=t.value,document.execCommand("foreColor",!1,t.value),e.editor.focus()});var r=e.wrapper.querySelector(".te-back-color"),n=e.wrapper.querySelector(".te-back-btn");n&&r&&r.addEventListener("change",function(){var a=n.querySelector(".te-color-preview");a.style.setProperty("--te-back-color",r.value);try{document.execCommand("hiliteColor",!1,r.value)}catch{document.execCommand("backColor",!1,r.value)}e.editor.focus()})}}},vt={name:"tableBg",order:56,init(e){}};var ae={alignLeft:{exec:"justifyLeft",match:"left"},alignCenter:{exec:"justifyCenter",match:"center"},alignRight:{exec:"justifyRight",match:"right"},alignJustify:{exec:"justifyFull",match:"justify"}};function he(e){if((!e||e.nodeType===3)&&(e=e?e.parentNode:null),!e)return"";var t=e.closest?e.closest("p,h1,h2,h3,h4,h5,h6,li,div,blockquote"):null;if(!t)return"";try{var o=window.getComputedStyle(t),r=o.textAlign.toLowerCase();return r==="start"?"left":r}catch{return""}}const ht={name:"align",order:40,css:"",toolbarHTML:'<button type="button" class="btn btn-sm btn-light te-align-btn" title="Align left" data-cmd="alignLeft"><i class="ti ti-align-left"></i></button><button type="button" class="btn btn-sm btn-light te-align-btn" title="Align center" data-cmd="alignCenter"><i class="ti ti-align-center"></i></button><button type="button" class="btn btn-sm btn-light te-align-btn" title="Align right" data-cmd="alignRight"><i class="ti ti-align-right"></i></button><button type="button" class="btn btn-sm btn-light te-align-btn" title="Justify" data-cmd="alignJustify"><i class="ti ti-align-justified"></i></button>',init(e){if(!e.features.align)return;var t=Object.keys(ae);t.forEach(function(r){var n=e.wrapper.querySelector('[data-cmd="'+r+'"]');if(n){var a=ae[r];n.addEventListener("click",function(){var i=he(window.getSelection().anchorNode);i===a.match?document.execCommand("justifyLeft",!1,void 0):document.execCommand(a.exec,!1,void 0),e.editor.focus(),o()})}});function o(){var r=window.getSelection().anchorNode;if(!(!r||!e.wrapper.contains(r))){var n=he(r);t.forEach(function(a){var i=e.wrapper.querySelector('[data-cmd="'+a+'"]');i&&i.classList.toggle("active",n===ae[a].match)})}}document.addEventListener("selectionchange",function(){(document.activeElement===e.editor||e.editor.contains(document.activeElement))&&o()})}};var ye=[{re:/^#{6}\s$/,cmd:"formatBlock",val:"h6"},{re:/^#{5}\s$/,cmd:"formatBlock",val:"h5"},{re:/^#{4}\s$/,cmd:"formatBlock",val:"h4"},{re:/^#{3}\s$/,cmd:"formatBlock",val:"h3"},{re:/^#{2}\s$/,cmd:"formatBlock",val:"h2"},{re:/^#{1}\s$/,cmd:"formatBlock",val:"h1"},{re:/^>\s$/,cmd:"formatBlock",val:"blockquote"},{re:/^[-*]\s$/,cmd:"insertUnorderedList",val:null},{re:/^1[.)]\s$/,cmd:"insertOrderedList",val:null}];const yt={name:"markdown",order:5,init(e){e.features.markdown&&e.editor.addEventListener("keydown",function(t){if(!(t.key!==" "&&t.key!=="Enter")){var o=window.getSelection();if(!(!o||o.rangeCount===0||!o.isCollapsed)){var r=o.anchorNode;if(!(!r||r.nodeType!==3)){for(var n=r.textContent||"",a=0;a<ye.length;a++){var i=ye[a];if(i.re.test(n)){if(t.preventDefault(),t.key==="Enter"){r.textContent=n.slice(0,-1),setTimeout(function(){document.execCommand(i.cmd,!1,i.val||void 0)},0);return}r.textContent="",document.execCommand(i.cmd,!1,i.val||void 0),e.editor.focus();return}}if(t.key==="Enter"&&n.trim()===""){var c=r.parentNode;c&&(c.tagName==="BLOCKQUOTE"||c.tagName==="PRE")&&(t.preventDefault(),document.execCommand("formatBlock",!1,"p"))}}}}})}},wt={name:"link",order:50,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Link" data-cmd="createLink"><i class="ti ti-link"></i></button>',css:".te-link-tools { position: fixed; display: none; z-index: 3000; background: #fff; border: 1px solid #dee2e6; border-radius: .375rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); padding: .25rem .35rem; gap: .2rem; align-items: center; white-space: nowrap;}.te-link-tools .btn { padding: .2rem .45rem !important; font-size: .75rem !important; line-height: 1 !important;}.te-link-tools .btn i,.te-link-tools .btn svg { width: 12px !important; height: 12px !important; pointer-events: none;}.te-link-tools .te-divider-v { display: inline-block; width: 1px; height: 14px; background: #dee2e6; margin: 0 .15rem; vertical-align: middle;}.te-link-edit-popup { position: fixed; display: none; z-index: 3001; background: #fff; border: 1px solid #dee2e6; border-radius: .375rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); padding: .35rem; gap: .25rem; align-items: center; white-space: nowrap;}.te-link-edit-popup input { width: 220px; padding: .2rem .4rem; font-size: .8rem; border: 1px solid #dee2e6; border-radius: .25rem; outline: none;}.te-link-edit-popup input:focus { border-color: #86b7fe; box-shadow: 0 0 0 2px rgba(13,110,253,.15);}.te-link-edit-popup .btn { padding: .2rem .5rem !important; font-size: .75rem !important; line-height: 1 !important;}",modalHTML:'<div class="te-link-modal te-modal" aria-hidden="true"> <div class="te-modal-backdrop" data-te-close></div> <div class="te-modal-dialog"> <div class="te-modal-header"> <h5 class="te-modal-title m-0">Insert Link</h5> <button type="button" class="btn-close" data-te-close aria-label="Close"></button> </div> <form class="te-link-form"> <div class="te-modal-body"> <div class="mb-3"> <label class="form-label">URL</label> <input type="url" class="te-link-url form-control" placeholder="https://example.com" required> </div> <div class="mb-3"> <label class="form-label">Text (optional)</label> <input type="text" class="te-link-text form-control" placeholder="Link text"> </div> <div class="mb-3"> <label class="form-label">Rel (optional)</label> <input type="text" class="te-link-rel form-control" placeholder="noopener noreferrer, nofollow, ugc, sponsored"> </div> <div class="form-check"> <input class="te-link-blank form-check-input" type="checkbox" checked> <label class="form-check-label">Open in new tab</label> </div> </div> <div class="te-modal-footer"> <button type="button" class="btn btn-outline-secondary" data-te-close>Cancel</button> <button type="submit" class="btn btn-primary">Insert</button> </div> </form> </div></div>',init(e){if(!e.features.link)return;var t=null,o=document.createElement("div");o.className="te-link-tools",o.innerHTML='<button type="button" class="btn btn-sm btn-light" data-te-link="edit" title="Edit link"><i class="ti ti-edit"></i> Edit</button><button type="button" class="btn btn-sm btn-light" data-te-link="remove" title="Remove link"><i class="ti ti-link-off"></i> Remove</button>',document.body.appendChild(o);var r=document.createElement("div");r.className="te-link-edit-popup",r.innerHTML='<input type="url" class="te-link-edit-url" placeholder="https://example.com" /><button type="button" class="btn btn-sm btn-primary" data-te-link-edit="apply">Apply</button><button type="button" class="btn btn-sm btn-light" data-te-link-edit="cancel">Cancel</button>',document.body.appendChild(r);function n(l){var f=l.getBoundingClientRect(),S=e.editor.getBoundingClientRect();o.style.display="flex",o.style.visibility="hidden";var E=o.offsetWidth,q=o.offsetHeight,H=f.left+f.width/2-E/2;H<S.left&&(H=S.left),H+E>S.right&&(H=S.right-E),o.style.left=H+"px";var B=window.innerHeight-f.bottom,_=B>=q+6?f.bottom+6:f.top-q-6;_<S.top&&(_=f.bottom+6),o.style.top=_+"px",o.style.visibility=""}function a(){o.style.display="none",t=null}var i=0;function c(l){Date.now()-i<200||(r.style.display="none")}function d(l){i=Date.now();var f=l.getBoundingClientRect(),S=e.editor.getBoundingClientRect();r.style.display="flex",r.style.visibility="hidden";var E=r.offsetWidth||350,q=r.offsetHeight||32,H=f.left+f.width/2-E/2;H<S.left&&(H=S.left),H+E>S.right&&(H=S.right-E),r.style.left=H+"px";var B=window.innerHeight-f.bottom;r.style.top=(B>=q+6?f.bottom+6:f.top-q-6)+"px",r.style.visibility="",r.querySelector(".te-link-edit-url").value=l.getAttribute("href")||"",setTimeout(function(){r.querySelector(".te-link-edit-url").focus()},0)}function p(){e.saveSel();var l=e.wrapper.querySelector(".te-link-modal");l&&l.classList.add("is-open")}function s(){var l=e.wrapper.querySelector(".te-link-modal");l&&l.classList.remove("is-open")}function u(l){var f=e.wrapper.querySelector(".te-link-url"),S=e.wrapper.querySelector(".te-link-text"),E=e.wrapper.querySelector(".te-link-rel"),q=e.wrapper.querySelector(".te-link-blank"),H=e.wrapper.querySelector('.te-link-form button[type="submit"]');f&&(f.value=l.getAttribute("href")||""),S&&(S.value=l.textContent||""),E&&(E.value=l.getAttribute("rel")||""),q&&(q.checked=l.getAttribute("target")==="_blank"),H&&(H.textContent="Update")}function b(){var l=window.getSelection();return l&&l.toString().trim()||""}var k=e.wrapper.querySelector('[data-cmd="createLink"]');k&&k.addEventListener("click",function(){t=null,a(),c();var l=e.wrapper.querySelector(".te-link-url"),f=e.wrapper.querySelector(".te-link-text"),S=e.wrapper.querySelector(".te-link-rel"),E=e.wrapper.querySelector(".te-link-blank"),q=e.wrapper.querySelector('.te-link-form button[type="submit"]');l&&(l.value=""),f&&(f.value=b()||""),S&&(S.value=""),E&&(E.checked=!0),q&&(q.textContent="Insert"),p()}),e.editor.addEventListener("click",function(l){var f=l.target.closest&&l.target.closest("a");!f||!e.editor.contains(f)||e.wrapper.contains(f)&&((l.ctrlKey||l.metaKey)&&l.preventDefault(),l.stopPropagation(),c(),t=f,u(f),n(f))}),o.addEventListener("mousedown",function(l){l.preventDefault(),l.stopPropagation();var f=l.target.closest&&l.target.closest("[data-te-link]");if(f){var S=f.getAttribute("data-te-link"),E=t;if(S==="edit")E&&e.editor.contains(E)&&(t=E,d(E),setTimeout(function(){o.style.display="none"},0));else if(S==="remove"&&(a(),E&&e.editor.contains(E))){for(var q=E.parentNode;E.firstChild;)q.insertBefore(E.firstChild,E);q.removeChild(E),e.editor.focus()}}});function T(l){!t||!e.editor.contains(t)||(!/^https?:\/\//i.test(l)&&!/^mailto:/i.test(l)&&!/^tel:/i.test(l)&&(l="https://"+l),t.setAttribute("href",l),c(),t=null,e.editor.focus())}r.addEventListener("click",function(l){l.stopPropagation()}),r.addEventListener("mousedown",function(l){l.preventDefault(),l.stopPropagation();var f=l.target.closest&&l.target.closest("[data-te-link-edit]");if(f){var S=f.getAttribute("data-te-link-edit");if(S==="cancel"){c(),t=null,e.editor.focus();return}if(S==="apply"){var E=r.querySelector(".te-link-edit-url").value.trim();if(!E)return;T(E)}}}),r.addEventListener("keydown",function(l){if(l.key==="Enter"){l.preventDefault();var f=r.querySelector(".te-link-edit-url").value.trim();if(!f)return;T(f)}l.key==="Escape"&&(c(),t=null,e.editor.focus())}),o.addEventListener("click",function(l){l.stopPropagation()}),document.addEventListener("click",function(l){if(o.style.display!=="none"&&!o.contains(l.target)&&a(),r.style.display!=="none"&&!r.contains(l.target)){var f=l.target.closest&&l.target.closest(".te-link-tools");f||Date.now()-i<200||(c(),t=null)}});var x=e.wrapper.querySelector(".te-link-form");x&&x.addEventListener("submit",function(l){l.preventDefault();var f=(e.wrapper.querySelector(".te-link-url").value||"").trim(),S=(e.wrapper.querySelector(".te-link-text").value||"").trim(),E=e.wrapper.querySelector(".te-link-blank").checked,q=(e.wrapper.querySelector(".te-link-rel").value||"").trim();if(f){var H=e.utils.isSafeUrl?e.utils.isSafeUrl(f,e.options.urlSchemes||["http","https"]):!0;if(H){if(t&&e.editor.contains(t)){t.setAttribute("href",f),E?t.setAttribute("target","_blank"):t.removeAttribute("target"),q?t.setAttribute("rel",q):t.removeAttribute("rel"),S&&(t.textContent=S),s(),e.editor.focus();return}e.restoreSel();var B=q||(E?"noopener noreferrer":""),_=(S||f).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),w='<a href="'+f.replace(/"/g,"&quot;")+'"'+(E?' target="_blank"':"")+(B?' rel="'+B.replace(/"/g,"&quot;")+'"':"")+">"+_+"</a>";document.execCommand("insertHTML",!1,w),s(),e.editor.focus()}}});for(var m=e.wrapper.querySelectorAll("[data-te-close]"),v=0;v<m.length;v++)m[v].addEventListener("click",function(){t=null})}},kt={name:"image",order:51,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Image" data-cmd="insertImage"><i class="ti ti-photo"></i></button>',modalHTML:'<div class="te-image-modal te-modal" aria-hidden="true"> <div class="te-modal-backdrop" data-te-close></div> <div class="te-modal-dialog"> <div class="te-modal-header"> <h5 class="te-modal-title m-0">Insert Image</h5> <button type="button" class="btn-close" data-te-close aria-label="Close"></button> </div> <form class="te-image-form"> <div class="te-modal-body"> <div class="mb-3"> <label class="form-label">Image URL</label> <input type="text" class="te-image-url form-control" placeholder="/path/to/image.jpg or https://..." required> <div class="mt-2"><button type="button" class="te-image-browse btn btn-sm btn-outline-secondary"><i class="ti ti-folder"></i> Browse...</button></div> </div> <div class="mb-3"> <label class="form-label">Alt text (optional)</label> <input type="text" class="te-image-alt form-control" placeholder="Description"> </div> </div> <div class="te-modal-footer"> <button type="button" class="btn btn-outline-secondary" data-te-close>Cancel</button> <button type="submit" class="btn btn-primary">Insert</button> </div> </form> </div></div>',init(e){if(e.features.image){var t=e.wrapper.querySelector('[data-cmd="insertImage"]');t&&t.addEventListener("click",function(){e.saveSel();var a=e.wrapper.querySelector(".te-image-modal");a&&a.classList.add("is-open")});var o=e.wrapper.querySelector(".te-image-url"),r=e.wrapper.querySelector(".te-image-browse");r&&r.addEventListener("click",function(a){if(a.preventDefault(),e.TulihEditor&&typeof e.TulihEditor.onBrowseImage=="function"){e.TulihEditor.onBrowseImage({container:e.wrapper,editor:e.editor},function(c){c&&o&&(o.value=c,o.focus())});return}var i=document.createElement("input");i.type="file",i.accept="image/*",i.style.display="none",document.body.appendChild(i),i.addEventListener("change",function(){var c=i.files&&i.files[0];if(!c){document.body.removeChild(i);return}var d=new FileReader;d.onload=function(){o&&(o.value=d.result,o.focus()),document.body.removeChild(i)},d.readAsDataURL(c)}),i.click()});var n=e.wrapper.querySelector(".te-image-form");n&&n.addEventListener("submit",function(a){a.preventDefault();var i=(e.wrapper.querySelector(".te-image-url").value||"").trim(),c=(e.wrapper.querySelector(".te-image-alt").value||"").trim();if(i){var d=e.utils.isSafeUrl?e.utils.isSafeUrl(i,e.options.imageSchemes||["http","https","data"]):!0;if(d){e.restoreSel(),e.editor.focus();var p=document.createElement("img");p.src=i,c&&(p.alt=c);var s=window.getSelection();if(s&&s.rangeCount>0){var u=s.getRangeAt(0);u.deleteContents(),u.insertNode(p),u.setStartAfter(p),u.collapse(!0),s.removeAllRanges(),s.addRange(u)}n.closest(".te-modal").classList.remove("is-open")}}})}}},St={name:"imageProps",order:52,deps:["image"],modalHTML:'<div class="te-image-props-modal te-modal" aria-hidden="true"> <div class="te-modal-backdrop" data-te-close></div> <div class="te-modal-dialog"> <div class="te-modal-header"> <h5 class="te-modal-title m-0">Image Properties</h5> <button type="button" class="btn-close" data-te-close aria-label="Close"></button> </div> <form class="te-image-props-form"> <div class="te-modal-body"> <div class="row g-2 mb-3"> <div class="col"> <label class="form-label">Width</label> <input type="number" min="0" class="te-image-props-width form-control" placeholder="e.g. 800"> </div> <div class="col"> <label class="form-label">Height</label> <input type="number" min="0" class="te-image-props-height form-control" placeholder="e.g. 600"> </div> </div> <div class="mb-3"> <label class="form-label">Alt</label> <input type="text" class="te-image-props-alt form-control" placeholder="Alternative text"> </div> <div class="row g-2"> <div class="col"> <label class="form-label">Class</label> <input type="text" class="te-image-props-class form-control" placeholder="class-1 class-2"> </div> <div class="col"> <label class="form-label">ID</label> <input type="text" class="te-image-props-id form-control" placeholder="optional-id"> </div> </div> <div class="mb-3 mt-3"> <label class="form-label">Style (inline CSS)</label> <input type="text" class="te-image-props-style form-control" placeholder="max-width:100%; height:auto;"> </div> </div> <div class="te-modal-footer"> <button type="button" class="btn btn-outline-secondary" data-te-close>Cancel</button> <button type="submit" class="btn btn-primary">Apply</button> </div> </form> </div></div>',init(e){if(!(!e.features.image||!e.features.imageProps)){var t=e.wrapper.querySelector(".te-image-props-modal"),o=e.wrapper.querySelector(".te-image-props-form"),r=e.wrapper.querySelector(".te-image-props-alt"),n=e.wrapper.querySelector(".te-image-props-width"),a=e.wrapper.querySelector(".te-image-props-height"),i=e.wrapper.querySelector(".te-image-props-class"),c=e.wrapper.querySelector(".te-image-props-id"),d=e.wrapper.querySelector(".te-image-props-style"),p=null;e.editor.addEventListener("dblclick",function(s){var u=s.target&&s.target.closest&&s.target.closest("img");u&&e.wrapper.contains(u)&&t&&(p=u,r&&(r.value=u.getAttribute("alt")||""),n&&(n.value=u.getAttribute("width")||""),a&&(a.value=u.getAttribute("height")||""),i&&(i.value=u.getAttribute("class")||""),c&&(c.value=u.getAttribute("id")||""),d&&(d.value=u.getAttribute("style")||""),t.classList.add("is-open"))}),o&&o.addEventListener("submit",function(s){if(s.preventDefault(),!p){t&&t.classList.remove("is-open");return}var u=r&&r.value||"",b=n&&n.value||"",k=a&&a.value||"",T=i&&i.value||"",x=c&&c.value||"",m=d&&d.value||"";if(m){var v=[];m.split(";").forEach(function(l){var f=l.indexOf(":");if(f!==-1){var S=l.slice(0,f).trim().toLowerCase(),E=l.slice(f+1).trim(),q=["color","background-color","font-family","font-size","font-style","font-weight","text-align","text-decoration","line-height","letter-spacing","word-spacing","margin","margin-top","margin-right","margin-bottom","margin-left","padding","padding-top","padding-right","padding-bottom","padding-left","border","border-collapse","border-color","border-style","border-width","border-radius","width","height","max-width","max-height","min-width","min-height","float","clear","vertical-align","direction","white-space"];q.indexOf(S)!==-1&&v.push(S+":"+E)}}),m=v.join(";")}u?p.setAttribute("alt",u):p.removeAttribute("alt"),b?p.setAttribute("width",b):p.removeAttribute("width"),k?p.setAttribute("height",k):p.removeAttribute("height"),T?p.setAttribute("class",T):p.removeAttribute("class"),x?p.setAttribute("id",x):p.removeAttribute("id"),m?p.setAttribute("style",m):p.removeAttribute("style"),t&&t.classList.remove("is-open"),p=null})}}},Lt={name:"imageTools",order:56,deps:["image","imageProps"],css:".te-image-tools { position: absolute; display: none; z-index: 2000; background: #fff; border: 1px solid #dee2e6; border-radius: .375rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); padding: .375rem; gap: .25rem; align-items: center;}.te-image-tools .btn { padding: .2rem .4rem; font-size: .8rem; }.te-image-tools svg, .te-image-tools i { pointer-events: none; }.te-image-tools .te-image-tools-alt { width: 130px; height: 26px; font-size: .8rem; padding: 0 .35rem; border: 1px solid #dee2e6; border-radius: .25rem;}.te-image-tools .te-image-tools-alt:focus { outline: none; border-color: #86b7fe; box-shadow: 0 0 0 2px rgba(13,110,253,.25); }.te-image-tools .te-divider-v { width: 1px; height: 20px; background: #dee2e6;}.te-image-tools .active { background: #e7f1ff; border-color: #b6d4fe; }.te-editor img.te-focused { outline: 3px solid rgba(13,110,253,.4); outline-offset: 1px;}.te-image-resize { position: absolute; display: none; z-index: 2001; width: 10px; height: 10px; background: #0d6efd; border: 2px solid #fff; border-radius: 50%; cursor: nwse-resize; box-shadow: 0 1px 4px rgba(0,0,0,.3);}.te-image-resize:hover { transform: scale(1.2); }.te-figure { display: inline-block; margin: .5rem 0; text-align: center; max-width: 100%;}.te-figure figcaption { font-size: .85rem; color: #6c757d; padding: .25rem .5rem; font-style: italic;}",init(e){if(!e.features.image||!e.features.imageTools)return;var t=e.wrapper,o=e.editor,r=null,n=document.createElement("div");n.className="te-image-tools",n.innerHTML='<input type="text" class="te-image-tools-alt" placeholder="Alt text" title="Alt text (Enter to apply)" /><div class="te-divider-v"></div><button type="button" class="btn btn-sm btn-light" data-te-image="align-default" title="Inline"><i class="ti ti-align-left"></i></button><button type="button" class="btn btn-sm btn-light" data-te-image="align-left" title="Float left"><i class="ti ti-align-left"></i></button><button type="button" class="btn btn-sm btn-light" data-te-image="align-center" title="Center"><i class="ti ti-align-center"></i></button><button type="button" class="btn btn-sm btn-light" data-te-image="align-right" title="Float right"><i class="ti ti-align-right"></i></button><button type="button" class="btn btn-sm btn-light" data-te-image="caption" title="Caption (toggle)"><i class="ti ti-typography"></i></button><div class="te-divider-v"></div><button type="button" class="btn btn-sm btn-light" data-te-image="width-100" title="Width 100%">100%</button><button type="button" class="btn btn-sm btn-light" data-te-image="width-75" title="Width 75%">75%</button><button type="button" class="btn btn-sm btn-light" data-te-image="width-50" title="Width 50%">50%</button><button type="button" class="btn btn-sm btn-light" data-te-image="width-orig" title="Original size">Orig</button><div class="te-divider-v"></div><button type="button" class="btn btn-sm btn-light" data-te-image="border" title="Toggle border">Brdr</button><button type="button" class="btn btn-sm btn-light" data-te-image="rounded" title="Toggle rounded corners">Rnd</button><div class="te-divider-v"></div><button type="button" class="btn btn-sm btn-outline-secondary" data-te-image="props" title="Image Properties"><i class="ti ti-settings"></i></button><button type="button" class="btn btn-sm btn-outline-danger" data-te-image="delete" title="Delete image"><i class="ti ti-x"></i></button>',document.body.appendChild(n);var a=document.createElement("div");a.className="te-image-resize",document.body.appendChild(a);function i(m){var v=m.style;return v.float==="left"?"left":v.float==="right"?"right":v.display==="block"&&v.marginLeft==="auto"&&v.marginRight==="auto"?"center":"default"}function c(m,v){v==="default"?(m.style.float="",m.style.display="",m.style.marginLeft="",m.style.marginRight=""):v==="left"?(m.style.float="left",m.style.display="",m.style.marginLeft="0",m.style.marginRight="1em"):v==="right"?(m.style.float="right",m.style.display="",m.style.marginLeft="1em",m.style.marginRight="0"):v==="center"&&(m.style.float="",m.style.display="block",m.style.marginLeft="auto",m.style.marginRight="auto")}function d(){if(o){var m=o.querySelector(".te-focused");m&&m.classList.remove("te-focused")}}function p(m){var v=m.getBoundingClientRect();a.style.left=window.scrollX+v.right-5+"px",a.style.top=window.scrollY+v.bottom-5+"px",a.style.display="block"}function s(m){var v=i(m);n.querySelectorAll('[data-te-image^="align-"]').forEach(function(l){l.classList.toggle("active",l.getAttribute("data-te-image")==="align-"+v)})}function u(m){var v=m.getBoundingClientRect(),l=n.querySelector(".te-image-tools-alt");l&&(l.value=m.getAttribute("alt")||""),n.style.display="flex",n.style.left=window.scrollX+v.left+"px",n.style.visibility="hidden";var f=n.offsetHeight,S=t.getBoundingClientRect(),E=v.bottom+6+f,q=v.top-6-f;E>S.bottom&&q>S.top?n.style.top=window.scrollY+v.top-6-f+"px":n.style.top=window.scrollY+v.bottom+6+"px",n.style.visibility="",p(m),s(m);var H=n.querySelector('[data-te-image="caption"]');H&&H.classList.toggle("active",!!(m.parentNode&&m.parentNode.tagName==="FIGURE"));var B=n.querySelector('[data-te-image="border"]');if(B){var _=m.style.border||"";B.classList.toggle("active",!!(_&&_!=="none"))}var w=n.querySelector('[data-te-image="rounded"]');if(w){var g=m.style.borderRadius||"";w.classList.toggle("active",!!(g&&g!=="0px"&&g!==""))}}function b(){n.style.display="none",a.style.display="none",d(),r=null}o.addEventListener("click",function(m){var v=m.target&&(m.target.closest?m.target.closest("img"):null);if(v&&t.contains(v)){m.stopPropagation(),r=v,d(),v.classList.add("te-focused"),v.setAttribute("tabindex","-1");try{v.focus({preventScroll:!0})}catch{}u(v)}else!n.contains(m.target)&&m.target!==a&&b()}),o.addEventListener("dblclick",function(){b()}),document.addEventListener("selectionchange",function(){if(r&&document.activeElement!==r&&!n.contains(document.activeElement)){var m=window.getSelection();(!m||m.isCollapsed)&&b()}}),n.addEventListener("click",function(m){var v=m.target&&m.target.closest("[data-te-image]"),l=v&&v.getAttribute("data-te-image");if(!(!l||!r)){if(m.preventDefault(),m.stopPropagation(),l==="width-100")r.setAttribute("width","100%"),r.style&&(r.style.maxWidth="100%"),u(r);else if(l==="width-75")r.setAttribute("width","75%"),u(r);else if(l==="width-50")r.setAttribute("width","50%"),u(r);else if(l==="width-orig")r.removeAttribute("width"),r.removeAttribute("height"),r.style&&(r.style.maxWidth=""),u(r);else if(l==="delete"){var f=r.parentNode;f&&f.removeChild(r),b()}else if(l==="props"){var S=new MouseEvent("dblclick",{bubbles:!0});r.dispatchEvent(S),b()}else if(l.indexOf("align-")===0){var E=l.replace("align-","");c(r,E),s(r),u(r)}else if(l==="border"){var q=r.style.border||"";q&&q!=="none"?(r.style.border="",r.removeAttribute("border")):r.style.border="2px solid #dee2e6",u(r)}else if(l==="rounded"){var H=r.style.borderRadius||"";H&&H!=="0px"?r.style.borderRadius="":r.style.borderRadius="8px",u(r)}else if(l==="caption"){var B=r.parentNode;if(B&&B.tagName==="FIGURE"&&B.classList.contains("te-figure")){var f=B.parentNode,_=B.querySelector("img")||B.querySelector("figcaption");_&&(f.insertBefore(_,B),f.removeChild(B))}else{var w=document.createElement("figure");w.className="te-figure";var g=document.createElement("figcaption");g.textContent="Caption",r.parentNode.insertBefore(w,r),w.appendChild(r),w.appendChild(g),g.contentEditable="true"}u(r)}}}),n.addEventListener("keydown",function(m){if(m.key==="Enter"&&r){var v=n.querySelector(".te-image-tools-alt");if(v){var l=v.value.trim();l?r.setAttribute("alt",l):r.removeAttribute("alt")}}});var k=null;a.addEventListener("mousedown",function(m){if(m.preventDefault(),m.stopPropagation(),!!r){var v=r.parentNode?r.parentNode.clientWidth:r.clientWidth,l=r.clientWidth/v*100,f=r.getBoundingClientRect();k={startX:m.clientX,parentW:v,startPct:l,startH:f.height},document.addEventListener("mousemove",T),document.addEventListener("mouseup",x)}});function T(m){if(!(!k||!r)){var v=m.clientX-k.startX,l=v/k.parentW*100,f=Math.max(5,k.startPct+l);r.style.width=f+"%",r.style.height="auto",r.removeAttribute("width"),r.removeAttribute("height"),p(r)}}function x(){document.removeEventListener("mousemove",T),document.removeEventListener("mouseup",x),k=null,r&&u(r)}window.addEventListener("scroll",function(){r&&n.style.display!=="none"&&u(r)}),window.addEventListener("resize",function(){r&&n.style.display!=="none"&&u(r)})}},xt={name:"iframe",order:53,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Iframe" data-cmd="insertIframe"><i class="ti ti-video"></i></button>',modalHTML:'<div class="te-iframe-modal te-modal" aria-hidden="true"> <div class="te-modal-backdrop" data-te-close></div> <div class="te-modal-dialog"> <div class="te-modal-header"> <h5 class="te-modal-title m-0">Insert Iframe</h5> <button type="button" class="btn-close" data-te-close aria-label="Close"></button> </div> <form class="te-iframe-form"> <div class="te-modal-body"> <div class="mb-3"> <label class="form-label">Src URL</label> <input type="url" class="te-iframe-src form-control" placeholder="https://..." required> </div> <div class="row g-2 mb-3"> <div class="col"> <label class="form-label">Width (px)</label> <input type="number" min="0" class="te-iframe-width form-control" placeholder="640"> </div> <div class="col"> <label class="form-label">Height (px)</label> <input type="number" min="0" class="te-iframe-height form-control" placeholder="360"> </div> </div> <div class="mb-3"> <label class="form-label">Allow (optional)</label> <input type="text" class="te-iframe-allow form-control" placeholder="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"> </div> <div class="form-check mb-2"> <input class="te-iframe-allowfullscreen form-check-input" type="checkbox" checked> <label class="form-check-label">Allow Fullscreen</label> </div> <div class="mb-2"> <label class="form-label">Title (accessibility, optional)</label> <input type="text" class="te-iframe-title form-control" placeholder="Embedded content description"> </div> </div> <div class="te-modal-footer"> <button type="button" class="btn btn-outline-secondary" data-te-close>Cancel</button> <button type="submit" class="btn btn-primary">Insert</button> </div> </form> </div></div>',init(e){if(e.features.iframe){var t=e.wrapper.querySelector('[data-cmd="insertIframe"]');t&&t.addEventListener("click",function(){e.saveSel();var r=e.wrapper.querySelector(".te-iframe-modal");r&&r.classList.add("is-open")});var o=e.wrapper.querySelector(".te-iframe-form");o&&o.addEventListener("submit",function(r){r.preventDefault(),e.restoreSel();var n=(e.wrapper.querySelector(".te-iframe-src").value||"").trim(),a=(e.wrapper.querySelector(".te-iframe-width").value||"").trim(),i=(e.wrapper.querySelector(".te-iframe-height").value||"").trim();if(n){var c=e.utils.isAllowedIframeUrl?e.utils.isAllowedIframeUrl(n):!0;if(c){var d=' src="'+n.replace(/"/g,"&quot;")+'"';a&&(d+=' width="'+a.replace(/"/g,"&quot;")+'"'),i&&(d+=' height="'+i.replace(/"/g,"&quot;")+'"');var p=e.options&&e.options.iframeSandbox||"",s=e.options&&e.options.iframeAllow||"";p&&(d+=' sandbox="'+p.replace(/"/g,"&quot;")+'"'),s&&(d+=' allow="'+s.replace(/"/g,"&quot;")+'"');var u="<iframe"+d+' style="max-width:100%;border:0;"></iframe>';document.execCommand("insertHTML",!1,u),o.closest(".te-modal").classList.remove("is-open")}}})}}};var we=10,Ct=10;const Et={name:"table",order:54,css:'.te-table-grid { position: absolute; z-index: 3000; background: #fff; border: 1px solid #dee2e6; border-radius: .5rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); padding: .75rem;}.te-table-grid .te-tg-label { font-size: .8rem; color: #6c757d; text-align: center; margin-bottom: .5rem;}.te-table-grid .te-tg-cells { display: grid; gap: 2px;}.te-table-grid .te-tg-cell { width: 18px; height: 18px; background: #f0f0f0; border: 1px solid #dee2e6; border-radius: 2px; cursor: pointer;}.te-table-grid .te-tg-cell.active { background: #86b7fe; border-color: #0d6efd;}.te-tg-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: .5rem;}.te-toolbar [data-cmd="insertTable"] svg { pointer-events: none; }',toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Table" data-cmd="insertTable"><i class="ti ti-table-plus"></i></button>',modalHTML:'<div class="te-table-props-modal te-modal" aria-hidden="true"> <div class="te-modal-backdrop" data-te-close></div> <div class="te-modal-dialog"> <div class="te-modal-header"> <h5 class="te-modal-title m-0">Table Properties</h5> <button type="button" class="btn-close" data-te-close aria-label="Close"></button> </div> <form class="te-table-props-form"> <div class="te-modal-body"> <div class="mb-3"> <label class="form-label">Width (e.g. 100% or 800px)</label> <input type="text" class="te-table-props-width form-control" placeholder="100%"> </div> <div class="mb-3"> <label class="form-label">Caption</label> <input type="text" class="te-table-props-caption form-control" placeholder="Optional caption"> </div> </div> <div class="te-modal-footer"> <button type="button" class="btn btn-outline-secondary" data-te-close>Cancel</button> <button type="submit" class="btn btn-primary">Apply</button> </div> </form> </div></div>',init(e){if(!e.features.table)return;var t=document.createElement("div");t.className="te-table-grid",t.style.display="none",t.innerHTML='<div class="te-tg-header"><span class="te-tg-label">0 &times; 0</span><button type="button" class="btn-close te-tg-close" aria-label="Close"></button></div><div class="te-tg-cells" style="grid-template-columns: repeat('+we+', 18px);"></div>';for(var o=t.querySelector(".te-tg-cells"),r=t.querySelector(".te-tg-label"),n=0;n<Ct;n++)for(var a=0;a<we;a++){var i=document.createElement("div");i.className="te-tg-cell",i.setAttribute("data-r",n.toString()),i.setAttribute("data-c",a.toString()),o.appendChild(i)}function c(){t.querySelectorAll(".te-tg-cell.active").forEach(function(u){u.classList.remove("active")})}function d(u,b){c(),t.querySelectorAll(".te-tg-cell").forEach(function(k){var T=parseInt(k.getAttribute("data-r"),10),x=parseInt(k.getAttribute("data-c"),10);T<=u&&x<=b&&k.classList.add("active")}),r.textContent=b+1+" ร— "+(u+1)}o.addEventListener("mouseover",function(u){var b=u.target.closest(".te-tg-cell");if(b){var k=parseInt(b.getAttribute("data-r"),10),T=parseInt(b.getAttribute("data-c"),10);d(k,T)}}),o.addEventListener("mouseleave",function(){c(),r.textContent="0 ร— 0"});function p(u,b){e.restoreSel();for(var k='<table class="te-table"><tbody>',T=0;T<b;T++){k+="<tr>";for(var x=0;x<u;x++)k+="<td><br></td>";k+="</tr>"}k+="</tbody></table>",document.execCommand("insertHTML",!1,k)}o.addEventListener("click",function(u){var b=u.target.closest(".te-tg-cell");if(b){var k=parseInt(b.getAttribute("data-c"),10)+1,T=parseInt(b.getAttribute("data-r"),10)+1;t.style.display="none",p(k,T),e.editor.focus()}}),document.body.appendChild(t),t.querySelector(".te-tg-close").addEventListener("click",function(){t.style.display="none"});var s=e.wrapper.querySelector('[data-cmd="insertTable"]');s&&s.addEventListener("click",function(u){u.stopPropagation(),e.saveSel();var b=s.getBoundingClientRect();t.style.left=window.scrollX+b.left+"px",t.style.top=window.scrollY+b.bottom+4+"px",t.style.display=t.style.display==="none"?"block":"none"}),document.addEventListener("click",function(u){t.style.display!=="none"&&!t.contains(u.target)&&u.target!==s&&(t.style.display="none")})}},Tt={name:"tableTools",order:55,deps:["table"],css:".te-table-tools { position: absolute; display: none; z-index: 2000; background: #fff; border: 1px solid #dee2e6; border-radius: .375rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); padding: .2rem .3rem; gap: .1rem; align-items: center; white-space: nowrap;}.te-table-tools .btn { padding: .15rem .35rem !important; font-size: .7rem !important; line-height: 1 !important;}.te-table-tools .btn svg { width: 12px !important; height: 12px !important; margin-right: 2px; vertical-align: middle;}.te-table-tools .te-divider-v { display: inline-block; width: 1px; height: 16px; background: #dee2e6; margin: 0 .2rem;}.te-table-tools .tt-label { font-size: .6rem; color: #6c757d; text-transform: uppercase; letter-spacing: .5px; margin: 0 .15rem;}.te-table-tools .te-bg-input { width: 26px !important; height: 20px !important; padding: 1px !important; border: 1px solid #dee2e6; border-radius: 3px; cursor: pointer;}.te-cell-selected { outline: 2px solid #0d6efd !important; outline-offset: -1px;}",init(e){if(!e.features.table||!e.features.tableTools)return;var t=e.wrapper,o=e.editor,r=e.editor,n=document.createElement("div");n.className="te-table-tools",n.style.display="none",n.innerHTML='<span class="tt-label">Add</span><button type="button" class="btn btn-sm btn-light" data-te-table="row-before" title="Row above"><i class="ti ti-chevron-up"></i> Row</button><button type="button" class="btn btn-sm btn-light" data-te-table="row-after" title="Row below"><i class="ti ti-chevron-down"></i> Row</button><button type="button" class="btn btn-sm btn-light" data-te-table="col-before" title="Column before"><i class="ti ti-chevron-left"></i> Col</button><button type="button" class="btn btn-sm btn-light" data-te-table="col-after" title="Column after"><i class="ti ti-chevron-right"></i> Col</button><span class="te-divider-v"></span><span class="tt-label">Del</span><button type="button" class="btn btn-sm btn-outline-danger" data-te-table="del-row" title="Delete row"><i class="ti ti-x"></i> Row</button><button type="button" class="btn btn-sm btn-outline-danger" data-te-table="del-col" title="Delete column"><i class="ti ti-x"></i> Col</button><button type="button" class="btn btn-sm btn-outline-danger" data-te-table="del-table" title="Delete table"><i class="ti ti-trash"></i> Tbl</button><span class="te-divider-v"></span><button type="button" class="btn btn-sm btn-light" data-te-table="merge" title="Merge selected cells"><i class="ti ti-maximize"></i> Merge</button><button type="button" class="btn btn-sm btn-light" data-te-table="unmerge" title="Unmerge cells" style="display:none"><i class="ti ti-minimize"></i> Unmerge</button><span class="te-divider-v"></span><button type="button" class="btn btn-sm btn-outline-secondary" data-te-table="toggle-header" title="Toggle header"><i class="ti ti-typography"></i> Hdr</button><button type="button" class="btn btn-sm btn-outline-secondary" data-te-table="toggle-caption" title="Toggle caption"><i class="ti ti-align-left"></i> Cap</button><span class="te-divider-v"></span><span class="tt-label">BG</span><input type="color" class="te-bg-input form-control form-control-color" value="#ffffff" title="Cell background color" /><button type="button" class="btn btn-sm btn-light" data-te-table="bg-apply" title="Apply background color">Apply</button><button type="button" class="btn btn-sm btn-light" data-te-table="bg-clear" title="Remove background color">Clear</button><span class="te-divider-v"></span><span class="tt-label">V</span><button type="button" class="btn btn-sm btn-light" data-te-table="valign-top" title="Align top">Top</button><button type="button" class="btn btn-sm btn-light" data-te-table="valign-middle" title="Align middle">Mid</button><button type="button" class="btn btn-sm btn-light" data-te-table="valign-bottom" title="Align bottom">Bot</button>',document.body.appendChild(n);var a=null,i=null,c=null,d=null,p=[];function s(){r._tableHist||(r._tableHist={undo:[],redo:[]}),r._tableHist.undo.push(o.innerHTML),r._tableHist.redo=[],r._tableHist.undo.length>50&&r._tableHist.undo.shift()}function u(){var y=n.querySelector('[data-te-table="merge"]');y&&(y.style.display=p.length>=2?"":"none")}function b(){p.forEach(function(y){y.classList.remove("te-cell-selected")}),p=[],u()}function k(y){var h=p.indexOf(y);h!==-1?(p.splice(h,1),y.classList.remove("te-cell-selected")):(p.push(y),y.classList.add("te-cell-selected")),u()}o.addEventListener("click",function(y){var h=y.target.closest&&y.target.closest("td,th");!h||!o.contains(h)||(y.ctrlKey||y.metaKey?(y.preventDefault(),k(h)):y.shiftKey||b())});function T(y){var h=n.querySelector('[data-te-table="unmerge"]');if(h){var L=parseInt(y.getAttribute("colspan"),10)||1,N=parseInt(y.getAttribute("rowspan"),10)||1;h.style.display=L>1||N>1?"":"none"}}function x(y){n.querySelectorAll('[data-te-table^="valign-"]').forEach(function(h){var L=h.getAttribute("data-te-table").replace("valign-",""),N=(y.style.verticalAlign||"").toLowerCase();h.classList.toggle("active",N===L)})}function m(y){var h=y.getBoundingClientRect();n.style.display="flex",n.style.visibility="hidden";var L=n.offsetWidth,N=n.offsetHeight,A=o.getBoundingClientRect(),C=window.scrollX,I=window.scrollY,z=h.left+C,D=A.left+C+2,U=A.right+C-L-2;z<D&&(z=D),z>U&&(z=U),n.style.left=z+"px";var j=A.bottom-(h.bottom+6),F=h.top-6-A.top,O;j>=N||j>=F?O=h.bottom+6+I:O=h.top-6-N+I;var R=A.top+I+2,$=A.bottom+I-N-2;O<R&&(O=R),O>$&&(O=$),n.style.top=O+"px",n.style.visibility="",u(),T(y),x(y);var X=n.querySelector('[data-te-table="toggle-caption"]');X&&i&&X.classList.toggle("active",!!i.querySelector("caption"))}function v(){n.style.display="none",a=null,i=null}function l(){var y=window.getSelection();if(!y||y.rangeCount===0){v();return}var h=y.anchorNode;if(h&&h.nodeType===3&&(h=h.parentNode),!h||!t.contains(h)){v();return}var L=h.closest&&h.closest("td,th");L&&o.contains(L)?(a=L,i=L.closest("table"),c=a,d=i,m(L)):v()}function f(){var y=n.querySelectorAll(".te-cell-selected");if(y.length)return Array.prototype.slice.call(y);var h=window.getSelection();if(!h||h.rangeCount===0)return null;var L=h.getRangeAt(0),N=i||d;if(!N)return null;var A=[];return N.querySelectorAll("td,th").forEach(function(C){L.intersectsNode(C)&&A.push(C)}),A.length?A:null}function S(y){var h=f();if(h)for(var L=0;L<h.length;L++)h[L].style.backgroundColor=y}function E(){var y=f();if(y)for(var h=0;h<y.length;h++)y[h].style.backgroundColor=""}var q=n.querySelector(".te-bg-input");q&&q.addEventListener("change",function(){(a||c)&&S(q.value)}),document.addEventListener("selectionchange",l),window.addEventListener("scroll",function(){a&&m(a)}),window.addEventListener("resize",function(){a&&m(a)});function H(y){for(var h=0,L=y;L&&L.previousElementSibling;)h++,L=L.previousElementSibling;return h}function B(y,h){["thead","tbody"].forEach(function(L){var N=y.querySelector(L);N&&Array.prototype.forEach.call(N.rows,function(A){h(A,L)})})}var _;function w(){_&&clearTimeout(_),_=setTimeout(function(){e.editor.focus(),l(),_=null},0)}function g(){var y=i||d;if(y){var h=Array.prototype.slice.call(y.querySelectorAll("tr"));if(h.length){var L;if(p.length>1)L=p.slice();else{var N=window.getSelection();if(!N||N.rangeCount===0)return;var A=N.getRangeAt(0);L=[],y.querySelectorAll("td,th").forEach(function(R){A.intersectsNode(R)&&L.push(R)})}if(!(L.length<2)){s();var C=L.map(function(R){return{cell:R,row:h.indexOf(R.parentElement),col:H(R)}}),I=Math.min.apply(null,C.map(function(R){return R.row})),z=Math.max.apply(null,C.map(function(R){return R.row})),D=Math.min.apply(null,C.map(function(R){return R.col})),U=Math.max.apply(null,C.map(function(R){return R.col}));if(I!==z&&D!==U){var j=n.querySelector('[data-te-table="merge"]');j&&(j.style.outline="2px solid #dc3545",j.style.outlineOffset="1px",setTimeout(function(){j.style.outline="",j.style.outlineOffset=""},600));return}var F=L.map(function(R){return R.innerHTML}),O=C.filter(function(R){return R.row===I&&R.col===D})[0];O||(O=C[0]),L.forEach(function(R){R!==O.cell&&R.parentNode.removeChild(R)}),O.cell.setAttribute("colspan",String(U-D+1)),O.cell.setAttribute("rowspan",String(z-I+1)),O.cell.innerHTML=F.join(""),b()}}}}function M(y){var h=parseInt(y.getAttribute("colspan"),10)||1,L=parseInt(y.getAttribute("rowspan"),10)||1;if(!(h===1&&L===1)){var N=y.tagName,A=y.closest("table"),C=Array.prototype.slice.call(A.querySelectorAll("tr")),I=y.parentElement,z=C.indexOf(I),D=H(y);y.removeAttribute("colspan"),y.removeAttribute("rowspan"),y.innerHTML="<br>";for(var U=y.nextSibling,j=1;j<h;j++){var F=document.createElement(N);F.innerHTML="<br>",I.insertBefore(F,U)}for(var O=1;O<L;O++){var R=C[z+O];if(!R)break;for(var $=R.cells[D]||null,j=0;j<h;j++){var F=document.createElement(N);F.innerHTML="<br>",R.insertBefore(F,$)}}}}n.addEventListener("mousedown",function(y){var h=y.target&&y.target.closest("[data-te-table]"),L=h&&h.getAttribute("data-te-table");if(L){y.preventDefault();var N=a||c,A=i||d;if(!(!N||!A)){s();var C=N.parentElement,I=H(N);if(L==="row-before"||L==="row-after"){var z=C.cloneNode(!0);Array.prototype.forEach.call(z.cells,function(P){P.innerHTML="<br>",P.removeAttribute("colspan"),P.removeAttribute("rowspan")}),L==="row-before"?C.parentNode.insertBefore(z,C):C.parentNode.insertBefore(z,C.nextSibling),w()}else if(L==="col-before"||L==="col-after"){var D=L==="col-after";B(A,function(P,Y){var G=P.cells[I],V=document.createElement(Y==="thead"?"th":"td");V.innerHTML="<br>",D&&G&&G.nextSibling?P.insertBefore(V,G.nextSibling):G?P.insertBefore(V,G):P.appendChild(V)}),w()}else if(L==="del-row")C.parentNode.removeChild(C),A.querySelector("tr")?w():(A.parentNode.removeChild(A),v());else if(L==="del-col"){B(A,function(P){P.cells[I]&&P.deleteCell(I)});var U=A.querySelector("tr");U&&U.cells.length===0?(A.parentNode.removeChild(A),v()):w()}else if(L==="del-table")A.parentNode.removeChild(A),v();else if(L==="bg-apply")S(q?q.value:"#ffffff"),w();else if(L==="bg-clear")E(),w();else if(L==="valign-top"||L==="valign-middle"||L==="valign-bottom"){var j=f();(!j||!j.length)&&(j=[N]);for(var F=L.replace("valign-",""),O=0;O<j.length;O++)j[O].style.verticalAlign=F;w()}else if(L==="merge")g(),w();else if(L==="unmerge")M(N),w();else if(L==="toggle-header"){var R=A.querySelector("thead");if(R){var $=A.querySelector("tbody")||(function(){var P=document.createElement("tbody");return A.appendChild(P),P})();Array.prototype.slice.call(R.rows).forEach(function(P){var Y=document.createElement("tr");Array.prototype.forEach.call(P.cells,function(G){var V=document.createElement("td");V.innerHTML=G.innerHTML||"<br>",Y.appendChild(V)}),$.insertBefore(Y,$.firstChild)}),R.parentNode.removeChild(R)}else{var X=A.querySelector("tbody");if(X&&X.rows.length){var Ce=X.rows[0],Ee=document.createElement("thead"),Te=document.createElement("tr");Array.prototype.forEach.call(Ce.cells,function(P){var Y=document.createElement("th");Y.innerHTML=P.innerHTML||"<br>",Te.appendChild(Y)}),Ee.appendChild(Te),A.insertBefore(Ee,X),X.removeChild(Ce)}}w()}else if(L==="toggle-caption"){var de=A.querySelector("caption");if(de)de.parentNode.removeChild(de);else{var J=document.createElement("caption");J.innerHTML="<br>",J.contentEditable="true",J.style.captionSide="bottom",J.style.textAlign="left",J.style.padding="4px 6px",J.style.fontStyle="italic",J.style.color="#6c757d",A.insertBefore(J,A.firstChild),setTimeout(function(){J.focus()},0)}w()}}}})}},At={name:"hr",order:55,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Horizontal rule" data-cmd="insertHR"><i class="ti ti-minus"></i></button>',css:'.te-hr-popup { position: fixed; display: none; z-index: 3000; background: #fff; border: 1px solid #dee2e6; border-radius: .375rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); padding: .5rem; white-space: nowrap;}.te-hr-popup .btn { padding: .15rem .4rem !important; font-size: 1rem !important; line-height: 1 !important; margin-right: 2px;}.te-hr-popup .btn.active { background: #e7f1ff; border-color: #b6d4fe; }.te-hr-popup input[type="color"] { width: 26px; height: 22px; padding: 1px; border: 1px solid #dee2e6; border-radius: 3px; cursor: pointer; vertical-align: middle;}',init(e){if(!e.features.hr)return;var t=e.wrapper.querySelector('[data-cmd="insertHR"]');if(!t)return;var o=document.createElement("div");o.className="te-hr-popup",o.innerHTML='<button type="button" class="btn btn-sm btn-light active" data-te-hr="solid" title="Solid">โ”</button><button type="button" class="btn btn-sm btn-light" data-te-hr="dashed" title="Dashed">โ”…</button><button type="button" class="btn btn-sm btn-light" data-te-hr="dotted" title="Dotted">โ”ˆ</button><input type="color" class="te-hr-color" value="#cccccc" title="HR color" />',document.body.appendChild(o);var r="solid",n="#cccccc",a=null;function i(){var b=window.getSelection();b&&b.rangeCount>0?a=b.getRangeAt(0).cloneRange():a=null}function c(){if(a){var b=window.getSelection();b.removeAllRanges(),b.addRange(a)}}function d(){var b=t.getBoundingClientRect(),k=o.offsetWidth||200,T=b.left+b.width/2-k/2;T<4&&(T=4),T+k>window.innerWidth-4&&(T=window.innerWidth-k-4),o.style.left=T+"px",o.style.top=b.bottom+4+"px"}function p(){e.editor.focus(),c();var b="border: none; border-top: 2px "+r+" "+n+"; margin: 1em 0;";document.execCommand("insertHTML",!1,'<hr style="'+b+'">'),s()}function s(){o.style.display="none"}function u(){i(),o.style.display="block",d()}t.addEventListener("click",function(b){if(b.preventDefault(),b.stopPropagation(),o.style.display==="block"){s();return}u()}),o.addEventListener("mousedown",function(b){var k=b.target.closest("[data-te-hr]");if(k){b.preventDefault(),r=k.getAttribute("data-te-hr"),o.querySelectorAll("[data-te-hr]").forEach(function(T){T.classList.remove("active")}),k.classList.add("active"),p();return}}),o.addEventListener("change",function(b){var k=b.target.closest(".te-hr-color");k&&(n=k.value,p())}),document.addEventListener("click",function(b){o.style.display==="block"&&!o.contains(b.target)&&b.target!==t&&!t.contains(b.target)&&s()}),window.addEventListener("scroll",function(){o.style.display==="block"&&d()}),window.addEventListener("resize",function(){o.style.display==="block"&&d()})}},qt={name:"unlink",order:58,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Remove link" data-cmd="unlink"><i class="ti ti-x"></i></button>',init(e){if(e.features.unlink){var t=e.wrapper.querySelector('[data-cmd="unlink"]');t&&t.addEventListener("click",function(){var o=window.getSelection();if(!(!o||o.rangeCount===0)){var r=o.anchorNode;r&&r.nodeType===3&&(r=r.parentNode);var n=r&&r.closest&&r.closest("a");if(n){for(var a=n.parentNode;n.firstChild;)a.insertBefore(n.firstChild,n);a.removeChild(n)}else document.execCommand("unlink",!1,void 0);e.editor.focus()}})}}};var Ht="๐Ÿ˜€๐Ÿ˜ƒ๐Ÿ˜„๐Ÿ˜๐Ÿ˜†๐Ÿ˜…๐Ÿคฃ๐Ÿ˜‚๐Ÿ™‚๐Ÿ™ƒ๐Ÿ˜‰๐Ÿ˜Š๐Ÿ˜‡๐Ÿฅฐ๐Ÿ˜๐Ÿคฉ๐Ÿ˜˜๐Ÿ˜—๐Ÿ˜š๐Ÿ˜‹๐Ÿ˜›๐Ÿ˜œ๐Ÿคช๐Ÿ˜๐Ÿค‘๐Ÿค—๐Ÿคญ๐Ÿคซ๐Ÿค”๐Ÿค๐Ÿคจ๐Ÿ˜๐Ÿ˜‘๐Ÿ˜ถ๐Ÿ˜๐Ÿ˜’๐Ÿ™„๐Ÿ˜ฌ๐Ÿคฅ๐Ÿ˜Œ๐Ÿ˜”๐Ÿ˜ช๐Ÿคค๐Ÿ˜ด๐Ÿ˜ท๐Ÿค’๐Ÿค•๐Ÿคข๐Ÿคฎ๐Ÿคง๐Ÿฅต๐Ÿฅถ๐Ÿฅด๐Ÿ˜ต๐Ÿคฏ๐Ÿค ๐Ÿฅณ๐Ÿฅธ๐Ÿ˜Ž๐Ÿค“๐Ÿง๐Ÿ˜•๐Ÿ˜Ÿ๐Ÿ™๐Ÿ˜ฎ๐Ÿ˜ฏ๐Ÿ˜ฒ๐Ÿ˜ณ๐Ÿฅบ๐Ÿ˜ฆ๐Ÿ˜ง๐Ÿ˜จ๐Ÿ˜ฐ๐Ÿ˜ฅ๐Ÿ˜ข๐Ÿ˜ญ๐Ÿ˜ฑ๐Ÿ˜–๐Ÿ˜ฃ๐Ÿ˜ž๐Ÿ˜“๐Ÿ˜ฉ๐Ÿ˜ซ๐Ÿฅฑ๐Ÿ˜ค๐Ÿ˜ก๐Ÿ˜ ๐Ÿคฌ๐Ÿ˜ˆ๐Ÿ‘ฟ๐Ÿ’€โ˜ ๐Ÿ’ฉ๐Ÿคก๐Ÿ‘น๐Ÿ‘บ๐Ÿ‘ป๐Ÿ‘ฝ๐Ÿ‘พ๐Ÿค–๐Ÿ’‹๐Ÿ‘‹โœ‹๐Ÿ‘Œ๐Ÿค๐Ÿคž๐ŸคŸ๐Ÿค˜๐Ÿค™๐Ÿ‘ˆ๐Ÿ‘‰๐Ÿ‘†๐Ÿ–•๐Ÿ‘๐Ÿ‘ŽโœŠ๐Ÿ‘Š๐Ÿค›๐Ÿคœ๐Ÿ‘๐Ÿ™Œ๐Ÿ‘๐Ÿคฒ๐Ÿค๐Ÿ™โœ๐Ÿ’…๐Ÿ‘‚๐Ÿ‘ƒ๐Ÿ‘ฃ๐Ÿ‘€๐Ÿ‘…๐Ÿ‘„".match(/.{1,2}/g)||[],ke={"๐Ÿ˜€":"grinning laugh happy","๐Ÿ˜ƒ":"grinning smile happy","๐Ÿ˜„":"grinning smile happy","๐Ÿ˜":"beaming grin happy","๐Ÿ˜†":"laughing grinning","๐Ÿคฃ":"rolling floor laughing","๐Ÿ˜‚":"tears joy laughing cry","๐Ÿ™‚":"slight smile","๐Ÿ™ƒ":"upside down","๐Ÿ˜‰":"winking wink","๐Ÿ˜Š":"blush smile happy","๐Ÿ˜‡":"innocent halo angel","๐Ÿฅฐ":"love heart smile","๐Ÿ˜":"heart eyes love","๐Ÿคฉ":"star struck","๐Ÿ˜˜":"kiss blowing heart","๐Ÿ˜—":"kissing kiss","๐Ÿ˜š":"kiss closed eyes","๐Ÿ˜‹":"savor tongue yum","๐Ÿ˜›":"tongue playful","๐Ÿ˜œ":"wink tongue silly","๐Ÿคช":"crazy wild","๐Ÿ˜":"squint tongue","๐Ÿค‘":"money tongue rich","๐Ÿค—":"hug open hands","๐Ÿคญ":"hand over mouth secret","๐Ÿคซ":"shush quiet silent","๐Ÿค”":"thinking think","๐Ÿค":"zipper mouth secret","๐Ÿคจ":"raised eyebrow suspicious","๐Ÿ˜":"neutral straight face","๐Ÿ˜‘":"expressionless blank","๐Ÿ˜ถ":"no mouth silent","๐Ÿ˜":"smirk smug","๐Ÿ˜’":"unamified roll","๐Ÿ™„":"eye roll","๐Ÿ˜ฌ":"grimace awkward","๐Ÿคฅ":"lying liar nose","๐Ÿ˜Œ":"relieved relief","๐Ÿ˜”":"pensive sad","๐Ÿ˜ช":"sleepy tired","๐Ÿคค":"drooling drool","๐Ÿ˜ด":"sleeping sleep zzz","๐Ÿ˜ท":"medical mask sick","๐Ÿค’":"thermometer sick fever","๐Ÿค•":"head bandage hurt","๐Ÿคข":"nauseous sick vomit","๐Ÿคฎ":"vomiting sick","๐Ÿคง":"sneeze sick","๐Ÿฅต":"hot fever sweat","๐Ÿฅถ":"cold freeze ice","๐Ÿฅด":"dizzy tipsy","๐Ÿ˜ต":"dizzy confused","๐Ÿคฏ":"exploding head mind blown","๐Ÿค ":"cowboy hat","๐Ÿฅณ":"party celebration","๐Ÿฅธ":"disguise mask","๐Ÿ˜Ž":"sunglasses cool","๐Ÿค“":"nerd geek glasses","๐Ÿง":"monocle detective","๐Ÿ˜•":"confused unsure","๐Ÿ˜Ÿ":"worried concern","๐Ÿ™":"slight frown sad","๐Ÿ˜ฎ":"surprised shock","๐Ÿ˜ฏ":"hushed surprise","๐Ÿ˜ฒ":"astonished amazed","๐Ÿ˜ณ":"flushed embarrassed","๐Ÿฅบ":"pleading puppy eyes","๐Ÿ˜ฆ":"frown sad","๐Ÿ˜ง":"anguish distressed","๐Ÿ˜จ":"fearful afraid","๐Ÿ˜ฐ":"anxious sweat worry","๐Ÿ˜ฅ":"disappointed sad","๐Ÿ˜ข":"cry sad tear","๐Ÿ˜ญ":"sobbing cry tears","๐Ÿ˜ฑ":"scream fear horror","๐Ÿ˜–":"confounded frustrated","๐Ÿ˜ฃ":"persevere struggle","๐Ÿ˜ž":"disappointed sad","๐Ÿ˜“":"downcast sweat","๐Ÿ˜ฉ":"weary tired","๐Ÿ˜ซ":"tired exhausted","๐Ÿฅฑ":"yawn sleepy","๐Ÿ˜ค":"triumph frustrated steam","๐Ÿ˜ก":"angry rage","๐Ÿ˜ ":"angry mad","๐Ÿคฌ":"cursing swear","๐Ÿ˜ˆ":"devil evil grin","๐Ÿ‘ฟ":"devil evil angry","๐Ÿ’€":"skull death","โ˜ ":"skull crossbones danger","๐Ÿ’ฉ":"poop poo","๐Ÿคก":"clown circus","๐Ÿ‘น":"ogre monster","๐Ÿ‘บ":"goblin monster","๐Ÿ‘ป":"ghost halloween","๐Ÿ‘ฝ":"alien ufo","๐Ÿ‘พ":"alien monster space","๐Ÿค–":"robot ai","๐Ÿ’‹":"kiss lips","๐Ÿ‘‹":"wave hand hello bye","โœ‹":"raised hand stop high five","๐Ÿ‘Œ":"ok perfect","๐Ÿค":"pinching small little","๐Ÿคž":"crossed fingers luck","๐ŸคŸ":"love gesture","๐Ÿค˜":"horns rock metal","๐Ÿค™":"call me phone","๐Ÿ‘ˆ":"point left","๐Ÿ‘‰":"point right","๐Ÿ‘†":"point up","๐Ÿ–•":"middle finger fuck","๐Ÿ‘":"thumbs up like","๐Ÿ‘Ž":"thumbs down dislike","โœŠ":"fist raised power","๐Ÿ‘Š":"fist punch","๐Ÿค›":"fist left","๐Ÿคœ":"fist right","๐Ÿ‘":"clap applause","๐Ÿ™Œ":"raised hands celebration","๐Ÿ‘":"open hands","๐Ÿคฒ":"palms together pray","๐Ÿค":"handshake deal agree","๐Ÿ™":"folded hands pray please thank","โœ":"writing hand","๐Ÿ’…":"nail polish care","๐Ÿ‘‚":"ear listen","๐Ÿ‘ƒ":"nose smell","๐Ÿ‘ฃ":"footsteps feet","๐Ÿ‘€":"eyes look","๐Ÿ‘…":"tongue taste","๐Ÿ‘„":"mouth lips"};const Mt={name:"emoji",order:60,css:".te-emoji-popup { position: absolute; z-index: 3000; background: #fff; border: 1px solid #dee2e6; border-radius: .5rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); padding: .4rem; max-width: 290px;}.te-emoji-popup .te-emoji-search { width: 100%; box-sizing: border-box; padding: .3rem .5rem; margin-bottom: .4rem; border: 1px solid #dee2e6; border-radius: .375rem; font-size: .8rem; outline: none;}.te-emoji-popup .te-emoji-search:focus { border-color: #86b7fe; box-shadow: 0 0 0 2px rgba(13,110,253,.15);}.te-emoji-popup .te-emoji-no-result { padding: 1rem; text-align: center; color: #6c757d; font-size: .8rem;}.te-emoji-popup .te-emoji-grid { display: grid; grid-template-columns: repeat(8, 1fr); gap: 2px; max-height: 220px; overflow-y: auto;}.te-emoji-popup .te-emoji-grid button { background: none; border: none; font-size: 1.3rem; padding: .25rem; cursor: pointer; border-radius: .25rem; text-align: center;}.te-emoji-popup .te-emoji-grid button:hover { background: #f0f0f0; }.te-emoji-popup .te-emoji-grid button.hidden { display: none; }",toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Emoji" data-cmd="emoji"><i class="ti ti-mood-smile"></i></button>',init(e){if(!e.features.emoji)return;var t=document.createElement("div");t.className="te-emoji-popup",t.style.display="none",t.innerHTML='<input type="text" class="te-emoji-search" placeholder="Search emoji..." /><div class="te-emoji-grid"></div><div class="te-emoji-no-result" style="display:none">No emoji found</div>';var o=t.querySelector(".te-emoji-grid"),r=t.querySelector(".te-emoji-search"),n=t.querySelector(".te-emoji-no-result");Ht.forEach(function(s){var u=document.createElement("button");u.type="button",u.textContent=s,u.setAttribute("data-emoji",s),u.title=ke[s]||"",o.appendChild(u)}),document.body.appendChild(t);var a=e.wrapper.querySelector('[data-cmd="emoji"]'),i=null;function c(){var s=window.getSelection();s&&s.rangeCount>0?i=s.getRangeAt(0).cloneRange():i=null}function d(){if(i){var s=window.getSelection();s.removeAllRanges(),s.addRange(i)}}function p(){c();var s=a.getBoundingClientRect();t.style.display="block",t.style.visibility="hidden";var u=t.offsetWidth,b=t.offsetHeight,k=window.scrollX,T=window.scrollY,x=window.innerWidth,m=window.innerHeight,v=s.left+k;v+u>k+x-8&&(v=k+x-u-8),v<k+4&&(v=k+4),t.style.left=v+"px";var l=s.bottom+4+T;l+b>T+m-8&&(l=s.top-b-4+T),l<T+4&&(l=T+4),t.style.top=l+"px",t.style.visibility="",r.value="",o.querySelectorAll("button").forEach(function(f){f.classList.remove("hidden")}),n.style.display="none",r.focus()}a&&a.addEventListener("click",function(s){if(t.style.display!=="none"){t.style.display="none";return}p()}),r.addEventListener("input",function(){var s=r.value.trim().toLowerCase(),u=0;o.querySelectorAll("button").forEach(function(b){var k=(ke[b.textContent]||"").toLowerCase(),T=!s||k.indexOf(s)!==-1;b.classList.toggle("hidden",!T),T&&u++}),n.style.display=u?"none":"block"}),r.addEventListener("keydown",function(s){s.key==="Escape"&&(t.style.display="none",e.editor.focus())}),t.addEventListener("mousedown",function(s){var u=s.target.closest&&s.target.closest("[data-emoji]");u&&(s.preventDefault(),e.editor.focus(),d(),document.execCommand("insertHTML",!1,u.textContent),t.style.display="none")}),document.addEventListener("click",function(s){t.style.display!=="none"&&!t.contains(s.target)&&s.target!==a&&(t.style.display="none")})}},Rt={name:"direction",order:61,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Left to Right" data-cmd="ltr"><i class="ti ti-arrow-left"></i> LTR</button><button type="button" class="btn btn-sm btn-light" title="Right to Left" data-cmd="rtl">RTL <i class="ti ti-arrow-right"></i></button>',init(e){e.features.direction&&e.wrapper.querySelectorAll('[data-cmd="ltr"],[data-cmd="rtl"]').forEach(function(t){t.addEventListener("click",function(){var o=t.getAttribute("data-cmd");document.execCommand("formatBlock",!1,"p");var r=window.getSelection();if(r&&r.rangeCount>0){var n=r.anchorNode;n&&n.nodeType===3&&(n=n.parentNode);var a=n&&n.closest&&n.closest("p,h1,h2,h3,h4,h5,h6,div");a&&e.wrapper.contains(a)&&a.setAttribute("dir",o)}e.editor.focus()})})}},Nt={name:"source",order:65,css:".te-source-toggle.active { background: #e7f1ff; border-color: #b6d4fe; }.te-editor.te-source-mode { display: none; }.te-source-textarea { width: 100%; min-height: 200px; border: 1px solid #dee2e6; border-radius: .375rem; padding: .75rem; resize: vertical; font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace; font-size: .85rem; line-height: 1.6; display: none;}",toolbarHTML:'<button type="button" class="btn btn-sm btn-outline-secondary" title="Toggle source" data-cmd="editSource"><i class="ti ti-source-code"></i></button>',init(e){if(!e.features.source)return;var t=e.wrapper.querySelector('[data-cmd="editSource"]');if(!t)return;var o=document.createElement("textarea");o.className="te-source-textarea",o.spellcheck=!1,e.editor.parentNode.insertBefore(o,e.editor);var r=!1;function n(i){if(!i)return"";var c=String(i),d=["p","h1","h2","h3","h4","h5","h6","blockquote","pre","li","tr","thead","tbody","tfoot","table","ul","ol"];return d.forEach(function(p){var s=new RegExp("<"+p+"(\\s[^>]*)?>","gi"),u=new RegExp("</"+p+">","gi");c=c.replace(s,function(b){return`
5
+ `+b}),c=c.replace(u,function(b){return b+`
6
+ `})}),c=c.replace(/\n{2,}/g,`
7
+ `),c.trim()}function a(){if(r=!r,r)o.value=n(e.editor.innerHTML),e.editor.classList.add("te-source-mode"),o.style.display="block",o.focus();else{var i=e.utils.sanitizeHTML?e.utils.sanitizeHTML(o.value,e.options.sanitize||{}):o.value;e.editor.innerHTML=i,e.editor.classList.remove("te-source-mode"),o.style.display="none",e.editor.focus()}t.classList.toggle("active",r);for(var c=e.toolbar.querySelectorAll("[data-cmd], select, input"),d=0;d<c.length;d++)c[d]!==t&&(r?(c[d].setAttribute("disabled","disabled"),c[d].style.opacity=".4",c[d].style.pointerEvents="none"):(c[d].removeAttribute("disabled"),c[d].style.opacity="",c[d].style.pointerEvents=""))}t.addEventListener("click",a)}},Bt={name:"history",order:70,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Undo" data-cmd="undo"><i class="ti ti-arrow-back-up"></i></button><button type="button" class="btn btn-sm btn-light" title="Redo" data-cmd="redo"><i class="ti ti-arrow-forward-up"></i></button><button type="button" class="btn btn-sm btn-light" title="Clear formatting" data-cmd="removeFormat"><i class="ti ti-trash"></i></button>',init(e){}},zt={name:"fullscreen",order:75,css:".te-fullscreen { position: fixed; inset: 0; z-index: 9999;}.te-fullscreen .te-container { max-width: none; display: flex; flex-direction: column; height: 100%;}.te-fullscreen .te-container .te-editor { flex: 1; height: auto !important; min-height: 300px;}.te-fullscreen .te-container .te-toolbar { border-radius: 0;}.te-fullscreen .te-btn-fullscreen { background: #e7f1ff; border-color: #b6d4fe;}",toolbarHTML:'<button type="button" class="btn btn-sm btn-light te-btn-fullscreen" title="Fullscreen" data-cmd="fullscreen"><i class="ti ti-maximize"></i></button>',init(e){if(e.features.fullscreen){var t=e.wrapper.querySelector('[data-cmd="fullscreen"]');t&&t.addEventListener("click",function(){var o=e.wrapper.classList.toggle("te-fullscreen");t.innerHTML=o?'<i class="ti ti-minimize"></i>':'<i class="ti ti-maximize"></i>',e.editor.focus()})}}},It={name:"toolbarCollapse",order:1e3,css:".te-toolbar .btn svg, .te-toolbar .btn i { width: 14px !important; height: 14px !important; vertical-align: middle;}",init(e){}};var _t="te-autosave-";function Dt(e){var t=e.id||e.name||e.className||"";return _t+(t||Math.random().toString(36).slice(2,8))}const Ot={name:"autosave",order:210,css:".te-autosave-badge { font-size: .7rem; padding: 1px 6px; border-radius: 8px; line-height: 1.4; opacity: .6; margin-left: auto;}.te-autosave-badge.saved { background: #d1e7dd; color: #0f5132; }.te-autosave-badge.unsaved { background: #fff3cd; color: #664d03; }",init(e){if(!e.features.autosave)return;var t=Dt(e.textarea);try{var o=localStorage.getItem(t);o&&o!==e.editor.innerHTML&&(e.editor.innerHTML=o)}catch{}var r=document.createElement("span");r.className="te-autosave-badge saved",r.textContent="Saved";var n=e.wrapper.querySelector(".te-status-right");n&&(n.style.display="inline-flex",n.style.alignItems="center",n.style.gap="8px",n.appendChild(r));function a(d){r.textContent=d?"Saved":"Unsaved",r.className="te-autosave-badge "+(d?"saved":"unsaved")}var i=null;function c(){a(!1),i&&clearTimeout(i),i=setTimeout(function(){try{localStorage.setItem(t,e.editor.innerHTML),a(!0)}catch{}},500)}e.editor.addEventListener("input",c),e.editor.addEventListener("paste",c),e.editor.addEventListener("blur",function(){try{localStorage.removeItem(t)}catch{}})}};var ie=/(?:https?:\/\/|www\.)[^\s<>"'()]+(?:\.[^\s<>"'()]+)*/gi;const jt={name:"autoLinkify",order:1,init(e){if(e.features.autoLinkify!==!1){var t=e.editor;t.addEventListener("paste",function(o){var r=o.clipboardData&&o.clipboardData.getData("text/plain")||"";if(r&&(r=r.trim(),ie.test(r))){ie.lastIndex=0;var n=r.match(ie)[0],a=n.indexOf("://")===-1?"https://"+n:n,i=e.utils.isSafeUrl?e.utils.isSafeUrl(a,e.options.urlSchemes||["http","https","mailto","tel"]):!0;if(i){o.preventDefault(),o.stopImmediatePropagation();var c='<p><a href="'+a.replace(/"/g,"&quot;")+'" target="_blank" rel="noopener noreferrer">'+n.replace(/</g,"&lt;").replace(/>/g,"&gt;")+"</a></p>";document.execCommand("insertHTML",!1,c)}}},!0)}}},Pt={name:"caseTransform",order:31,toolbarHTML:'<select class="te-case form-select form-select-sm" title="Change case"> <option value="">Case</option> <option value="upper">UPPERCASE</option> <option value="lower">lowercase</option> <option value="title">Title Case</option> <option value="sentence">Sentence case</option></select>',init(e){if(e.features.caseTransform!==!1){var t=e.wrapper.querySelector(".te-case");t&&(t.addEventListener("mousedown",function(){e.saveSel()}),t.addEventListener("change",function(){var o=t.value;if(t.value="",!!o){e.restoreSel();var r=window.getSelection();if(!(!r||r.isCollapsed||!r.rangeCount)){var n=r.toString();if(n){var a;switch(o){case"upper":a=n.toUpperCase();break;case"lower":a=n.toLowerCase();break;case"title":a=n.toLowerCase().replace(/\b\w/g,function(i){return i.toUpperCase()});break;case"sentence":a=n.charAt(0).toUpperCase()+n.slice(1).toLowerCase().replace(/([.!?]\s+)(\w)/g,function(i){return i.toUpperCase()});break;default:return}document.execCommand("insertText",!1,a),e.editor.focus()}}}}))}}},Ut={name:"shortcutsHelp",order:90,css:".te-shortcuts-table { width: 100%; border-collapse: collapse; font-size: .875rem; }.te-shortcuts-table th, .te-shortcuts-table td { padding: .4rem .75rem; border-bottom: 1px solid #e9ecef; text-align: left; color: #000; }.te-shortcuts-table th { background: #f8f9fa; font-weight: 600; }.te-shortcuts-table kbd { display: inline-block; padding: 2px 6px; font-size: .75rem; font-family: monospace; background: #f0f0f0; border: 1px solid #d0d0d0; border-radius: 3px; color: #000; }",toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Keyboard shortcuts" data-cmd="shortcutsHelp"><i class="ti ti-help-circle"></i></button>',modalHTML:'<div class="te-shortcuts-modal te-modal" aria-hidden="true"> <div class="te-modal-backdrop" data-te-close></div> <div class="te-modal-dialog"> <div class="te-modal-header"> <h5 class="te-modal-title m-0">Keyboard Shortcuts</h5> <button type="button" class="btn-close" data-te-close aria-label="Close"></button> </div> <div class="te-modal-body"> <table class="te-shortcuts-table"> <thead><tr><th>Shortcut</th><th>Action</th></tr></thead> <tbody> <tr><td><kbd>Ctrl</kbd> + <kbd>B</kbd></td><td>Bold</td></tr> <tr><td><kbd>Ctrl</kbd> + <kbd>I</kbd></td><td>Italic</td></tr> <tr><td><kbd>Ctrl</kbd> + <kbd>U</kbd></td><td>Underline</td></tr> <tr><td><kbd>Ctrl</kbd> + <kbd>S</kbd></td><td>Strikethrough</td></tr> <tr><td><kbd>Ctrl</kbd> + <kbd>Z</kbd></td><td>Undo</td></tr> <tr><td><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Z</kbd></td><td>Redo</td></tr> <tr><td><kbd>Ctrl</kbd> + <kbd>Y</kbd></td><td>Redo</td></tr> <tr><td><kbd>Ctrl</kbd> + <kbd>K</kbd></td><td>Insert link</td></tr> <tr><td><kbd>Tab</kbd></td><td>Indent list item</td></tr> <tr><td><kbd>Shift</kbd> + <kbd>Tab</kbd></td><td>Outdent list item</td></tr> </tbody> </table> </div> </div></div>',init(e){if(e.features.shortcutsHelp!==!1){var t=e.wrapper.querySelector('[data-cmd="shortcutsHelp"]');t&&t.addEventListener("click",function(){var o=e.wrapper.querySelector(".te-shortcuts-modal");o&&o.classList.add("is-open")})}}},Ft={name:"floatingToolbar",order:58,css:".te-float-toolbar { position: fixed; display: none; z-index: 3100; background: #fff; border: 1px solid #dee2e6; border-radius: .375rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); padding: .2rem; gap: 2px; align-items: center; white-space: nowrap;}.te-float-toolbar .btn { padding: .2rem .4rem !important; font-size: .75rem !important; line-height: 1 !important;}.te-float-toolbar .btn i,.te-float-toolbar .btn svg { width: 13px !important; height: 13px !important; pointer-events: none;}.te-float-link-input { position: fixed; display: none; z-index: 3101; background: #fff; border: 1px solid #dee2e6; border-radius: .375rem; box-shadow: 0 6px 20px rgba(0,0,0,.15); padding: .35rem; gap: .25rem; align-items: center; white-space: nowrap;}.te-float-link-input input { width: 220px; padding: .2rem .4rem; font-size: .8rem; border: 1px solid #dee2e6; border-radius: .25rem; outline: none;}.te-float-link-input input:focus { border-color: #86b7fe; box-shadow: 0 0 0 2px rgba(13,110,253,.15);}.te-float-link-input .btn { padding: .2rem .5rem !important; font-size: .75rem !important; line-height: 1 !important;}",init(e){if(!e.features.floatingToolbar)return;var t=e.editor,o=document.createElement("div");o.className="te-float-toolbar",o.innerHTML='<button type="button" class="btn btn-sm btn-light" data-te-float="bold" title="Bold"><i class="ti ti-bold"></i></button><button type="button" class="btn btn-sm btn-light" data-te-float="italic" title="Italic"><i class="ti ti-italic"></i></button><button type="button" class="btn btn-sm btn-light" data-te-float="underline" title="Underline"><i class="ti ti-underline"></i></button><span class="te-divider-v" style="display:inline-block;width:1px;height:14px;background:#dee2e6;margin:0 2px;vertical-align:middle"></span><button type="button" class="btn btn-sm btn-light te-float-fore" title="Text color" style="position:relative;padding:.15rem .35rem!important;min-width:22px;text-align:center"><span class="te-float-cp" style="display:block;font-size:.8rem;line-height:1">A<span style="display:block;height:2px;border-radius:1px;margin-top:1px;background:#000"></span></span><input type="color" class="te-float-fore-input" value="#000000" style="position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer;border:none;padding:0"></button><button type="button" class="btn btn-sm btn-light te-float-back" title="Background color" style="position:relative;padding:.15rem .35rem!important;min-width:22px;text-align:center"><span class="te-float-cp" style="display:block;font-size:.8rem;line-height:1">A<span style="display:block;height:2px;border-radius:1px;margin-top:1px;background:#ffff00"></span></span><input type="color" class="te-float-back-input" value="#ffff00" style="position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer;border:none;padding:0"></button><span class="te-divider-v" style="display:inline-block;width:1px;height:14px;background:#dee2e6;margin:0 2px;vertical-align:middle"></span><button type="button" class="btn btn-sm btn-light" data-te-float="link" title="Insert link"><i class="ti ti-link"></i></button><span class="te-divider-v" style="display:inline-block;width:1px;height:14px;background:#dee2e6;margin:0 2px;vertical-align:middle"></span><button type="button" class="btn btn-sm btn-light" data-te-float="removeFormat" title="Clear formatting"><i class="ti ti-clear-formatting"></i></button>',document.body.appendChild(o);var r=document.createElement("div");r.className="te-float-link-input",r.innerHTML='<input type="url" class="te-float-link-url" placeholder="https://example.com" /><button type="button" class="btn btn-sm btn-primary" data-te-float-link="apply">Apply</button><button type="button" class="btn btn-sm btn-light" data-te-float-link="cancel">Cancel</button>',document.body.appendChild(r);var n=o.querySelector(".te-float-fore-input"),a=o.querySelector(".te-float-back-input");n&&n.addEventListener("change",function(){t.focus(),s(),document.execCommand("foreColor",!1,n.value);var x=o.querySelector(".te-float-fore .te-float-cp");x&&(x.style.color=n.value),b()}),a&&a.addEventListener("change",function(){t.focus(),s();try{document.execCommand("hiliteColor",!1,a.value)}catch{document.execCommand("backColor",!1,a.value)}var x=o.querySelector(".te-float-back .te-float-cp span:last-child");x&&(x.style.background=a.value),b()});var i=null,c=!1,d=null;function p(){var x=window.getSelection();x&&x.rangeCount>0?d=x.getRangeAt(0).cloneRange():d=null}function s(){if(d){var x=window.getSelection();x.removeAllRanges(),x.addRange(d)}}function u(x,m,v){var l=o.offsetWidth||100,f=o.offsetHeight||30,S=t.getBoundingClientRect(),E=x-l/2;E<S.left&&(E=S.left),E+l>S.right&&(E=S.right-l);var q=v?v.top-S.top:m-S.top,H=v?S.bottom-v.bottom:S.bottom-m,B;q>=f+8?B=(v?v.top:m)-f-8:H>=f+8?B=(v?v.bottom:m)+8:B=q>H?S.top+2:S.bottom-f-2,o.style.left=E+"px",o.style.top=B+"px"}function b(){c=!1,r.style.display="none",o.style.display="none"}function k(x,m,v){c=!0,o.style.display="flex",u(x,m,v),p()}function T(){p();var x=t.getBoundingClientRect(),m=o.getBoundingClientRect();r.style.display="flex",r.style.visibility="hidden";var v=r.offsetWidth||320,l=r.offsetHeight||32,f=m.left+m.width/2-v/2;f<x.left&&(f=x.left),f+v>x.right&&(f=x.right-v),r.style.left=f+"px";var S=window.innerHeight-m.bottom;r.style.top=(S>=l+4?m.bottom+4:m.top-l-4)+"px",r.style.visibility="",r.querySelector(".te-float-link-url").value="",r.querySelector(".te-float-link-url").focus()}t.addEventListener("mouseup",function(x){if(t.contentEditable==="true"){i&&clearTimeout(i);var m=window.getSelection();if(!m||m.isCollapsed||!m.toString().trim()){b();return}if(!t.contains(m.anchorNode)||!t.contains(m.focusNode)){b();return}var v=m.getRangeAt(0),l=v.getBoundingClientRect(),f=l.left+l.width/2;k(f,0,l)}}),t.addEventListener("mousedown",function(){i&&clearTimeout(i),i=setTimeout(function(){b()},200)}),t.addEventListener("keydown",function(){b()}),t.addEventListener("scroll",function(){c&&b()}),o.addEventListener("mousedown",function(x){x.preventDefault();var m=x.target.closest("[data-te-float]");if(m){var v=m.getAttribute("data-te-float");if(v){if(v==="link"){T();return}t.focus();var l=window.getSelection();!l||l.rangeCount===0||(document.execCommand(v,!1,void 0),b())}}}),r.addEventListener("mousedown",function(x){x.preventDefault();var m=x.target.closest("[data-te-float-link]");if(m){var v=m.getAttribute("data-te-float-link");if(v==="cancel"){b();return}if(v==="apply"){var l=r.querySelector(".te-float-link-url").value.trim();if(!l)return;t.focus(),s(),!/^https?:\/\//i.test(l)&&!/^mailto:/i.test(l)&&!/^tel:/i.test(l)&&(l="https://"+l),document.execCommand("createLink",!1,l),b()}}}),r.addEventListener("keydown",function(x){if(x.key==="Enter"){x.preventDefault();var m=r.querySelector(".te-float-link-url").value.trim();if(!m)return;t.focus(),s(),!/^https?:\/\//i.test(m)&&!/^mailto:/i.test(m)&&!/^tel:/i.test(m)&&(m="https://"+m),document.execCommand("createLink",!1,m),b()}x.key==="Escape"&&b()}),document.addEventListener("mousedown",function(x){c&&!o.contains(x.target)&&!r.contains(x.target)&&x.target!==t&&!t.contains(x.target)&&b()})}},Wt={name:"darkMode",order:59,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Toggle dark mode" data-cmd="toggleDark"><i class="ti ti-moon"></i></button>',css:".te-container.te-dark { color-scheme: dark;}.te-container.te-dark .te-toolbar { background: #1e1e1e; border-color: #444;}.te-container.te-dark .te-toolbar .btn { color: #ccc; border-color: #555; background: #2a2a2a;}.te-container.te-dark .te-toolbar .btn:hover { background: #333; color: #fff;}.te-container.te-dark .te-toolbar .btn.active { background: #0d6efd; color: #fff; border-color: #0d6efd;}.te-container.te-dark .te-editor { background: #121212; border-color: #444; color: #e0e0e0;}.te-container.te-dark .te-editor:focus { box-shadow: inset 0 0 0 2px rgba(13,110,253,.5);}.te-container.te-dark .te-editor[placeholder]:empty:before { color: #666;}.te-container.te-dark .te-divider { background: #444;}.te-container.te-dark .te-status { color: #999;}.te-container.te-dark .te-modal-dialog { background: #1e1e1e; color: #e0e0e0; box-shadow: 0 20px 60px rgba(0,0,0,.5);}.te-container.te-dark .te-modal-header,.te-container.te-dark .te-modal-footer { background: #2a2a2a; border-color: #444;}.te-container.te-dark .te-modal-header .te-modal-title { color: #e0e0e0;}.te-container.te-dark .te-modal-body { color: #e0e0e0;}.te-container.te-dark .btn-close { filter: invert(1);}.te-container.te-dark .te-modal .btn-primary { background: #555; border-color: #555; color: #fff;}.te-container.te-dark .te-modal .btn-primary:hover { background: #777; border-color: #777;}.te-container.te-dark .te-modal .btn-outline-secondary { color: #ccc; border-color: #555;}.te-container.te-dark .te-modal .btn-outline-secondary:hover { background: #333; border-color: #777;}.te-container.te-dark .te-modal .btn-outline-danger { color: #e57373; border-color: #e57373;}.te-container.te-dark .te-modal .btn-outline-danger:hover { background: #C1272D; border-color: #C1272D; color: #fff;}.te-container.te-dark .form-control { background: #2a2a2a; border-color: #555; color: #e0e0e0;}.te-container.te-dark .form-select { background: #2a2a2a; border-color: #555; color: #e0e0e0;}.te-container.te-dark .te-table-tools { background: #1e1e1e; border-color: #444;}.te-container.te-dark .te-table-tools .btn { color: #ccc; border-color: #555; background: #2a2a2a;}.te-container.te-dark .te-table-tools .tt-label { color: #999;}.te-container.te-dark .te-image-tools { background: #1e1e1e; border-color: #444;}.te-container.te-dark .te-image-tools .btn { color: #ccc; border-color: #555; background: #2a2a2a;}.te-container.te-dark .te-float-toolbar { background: #1e1e1e; border-color: #444;}.te-container.te-dark .te-float-toolbar .btn { color: #ccc; border-color: #555; background: #2a2a2a;}.te-container.te-dark .te-hr-popup { background: #1e1e1e; border-color: #444;}.te-container.te-dark .te-hr-popup .btn { color: #ccc; border-color: #555; background: #2a2a2a;}",init(e){if(e.features.darkMode){var t=e.wrapper.querySelector('[data-cmd="toggleDark"]');t&&t.addEventListener("click",function(){var o=e.wrapper.querySelector(".te-container");if(o){var r=o.classList.toggle("te-dark"),n=t.querySelector(".ti");n&&(n.className="ti "+(r?"ti-sun":"ti-moon")),t.classList.toggle("active",r)}})}}};var Se="te-shortcut-map",le={Bold:{key:"b",ctrl:!0,shift:!1},Italic:{key:"i",ctrl:!0,shift:!1},Underline:{key:"u",ctrl:!0,shift:!1},Strike:{key:"s",ctrl:!0,shift:!1},Undo:{key:"z",ctrl:!0,shift:!1},Redo:{key:"z",ctrl:!0,shift:!0},RedoAlt:{key:"y",ctrl:!0,shift:!1},Link:{key:"k",ctrl:!0,shift:!1}};function Jt(){try{var e=localStorage.getItem(Se);if(e)return JSON.parse(e)}catch{}return JSON.parse(JSON.stringify(le))}function Le(e){try{localStorage.setItem(Se,JSON.stringify(e))}catch{}}function xe(e){return String(e).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;")}const Xt={name:"shortcutCustomizer",order:6,toolbarHTML:'<button type="button" class="btn btn-sm btn-light" title="Customize shortcuts" data-cmd="customizeShortcuts"><i class="ti ti-edit"></i></button>',modalHTML:'<div class="te-modal" data-te-modal="shortcutCustomizer"> <div class="te-modal-backdrop" data-te-close></div> <div class="te-modal-dialog" style="width:420px"> <div class="te-modal-header"><strong>Customize Shortcuts</strong><button type="button" class="btn-close" data-te-close></button></div> <div class="te-modal-body te-shortcut-body"></div> <div class="te-modal-footer"> <button type="button" class="btn btn-sm btn-secondary" data-te-sc-reset>Reset</button> <button type="button" class="btn btn-sm btn-secondary" data-te-close>Close</button> <button type="button" class="btn btn-sm btn-primary" data-te-shortcut-save>Save</button> </div> </div></div>',css:'.te-shortcut-body table { width: 100%; border-collapse: collapse; }.te-shortcut-body td, .te-shortcut-body th { padding: 4px 8px; border-bottom: 1px solid #dee2e6; text-align: left; font-size: .85rem; }.te-shortcut-body th { font-weight: 600; color: #495057; }.te-shortcut-body input[type="text"] { width: 40px; padding: 2px 6px; border: 1px solid #dee2e6; border-radius: 3px; font-size: .85rem; }.te-shortcut-body input[type="text"]:focus { outline: none; border-color: #86b7fe; box-shadow: 0 0 0 2px rgba(13,110,253,.25); }.te-shortcut-body label { font-size: .8rem; margin-left: 4px; }',init(e){if(e.features.shortcutCustomizer){var t=e.wrapper.querySelector('[data-cmd="customizeShortcuts"]');t&&(t.addEventListener("click",function(){var o=e.wrapper.querySelector('[data-te-modal="shortcutCustomizer"]');if(o){var r=o.querySelector(".te-shortcut-body");if(r){for(var n=Jt(),a=["Bold","Italic","Underline","Strike","Undo","Redo","RedoAlt","Link"],i="<table><tr><th>Action</th><th>Shortcut</th></tr>",c=0;c<a.length;c++){var d=a[c],p=n[d]||{key:"",ctrl:!0,shift:!1},s=d==="RedoAlt"?"Redo (alt)":d;i+="<tr><td>"+s+'</td><td>Ctrl <input type="checkbox" data-ctrl="'+d+'" '+(p.ctrl?"checked":"")+' /> Shift <input type="checkbox" data-shift="'+d+'" '+(p.shift?"checked":"")+' /> <input type="text" class="te-sc-input" data-action="'+d+'" value="'+xe(p.key)+'" placeholder="key" maxlength="1" /></td></tr>'}i+="</table>",r.innerHTML=i,o.classList.add("is-open")}}}),e.wrapper.addEventListener("click",function(o){var r=o.target.closest("[data-te-shortcut-save]");if(r){var n=e.wrapper.querySelector('[data-te-modal="shortcutCustomizer"]');if(n){var a={};n.querySelectorAll(".te-sc-input").forEach(function(i){var c=i.getAttribute("data-action"),d=i.value.trim().toLowerCase(),p=n.querySelector('[data-ctrl="'+c+'"]').checked,s=n.querySelector('[data-shift="'+c+'"]').checked;d&&(a[c]={key:d,ctrl:p,shift:s})}),Le(a),n.classList.remove("is-open")}}}),e.wrapper.addEventListener("click",function(o){var r=o.target.closest("[data-te-sc-reset]");if(r){var n=e.wrapper.querySelector('[data-te-modal="shortcutCustomizer"]');if(n){Le(JSON.parse(JSON.stringify(le)));for(var a=n.querySelector(".te-shortcut-body"),i=["Bold","Italic","Underline","Strike","Undo","Redo","RedoAlt","Link"],c="<table><tr><th>Action</th><th>Shortcut</th></tr>",d=0;d<i.length;d++){var p=i[d],s=le[p],u=p==="RedoAlt"?"Redo (alt)":p;c+="<tr><td>"+u+'</td><td>Ctrl <input type="checkbox" data-ctrl="'+p+'" '+(s.ctrl?"checked":"")+' /> Shift <input type="checkbox" data-shift="'+p+'" '+(s.shift?"checked":"")+' /> <input type="text" class="te-sc-input" data-action="'+p+'" value="'+xe(s.key)+'" placeholder="key" maxlength="1" /></td></tr>'}c+="</table>",a&&(a.innerHTML=c)}}}))}}};function Kt(e){e.register("block",Oe),e.register("inline",je),e.register("pre",Pe),e.register("inlineCode",Ue),e.register("subSuper",Fe),e.register("keyboardShortcuts",Ke),e.register("readOnly",$e),e.register("linkTooltip",Ye),e.register("emojiAutocomplete",Ze),e.register("statusBar",Qe),e.register("codeBlock",tt),e.register("mediaEmbed",rt),e.register("dragDrop",ot),e.register("pastePlain",nt),e.register("findReplace",at),e.register("indent",it),e.register("list",st),e.register("lineHeight",dt),e.register("fontSize",ut),e.register("fontFamily",ft),e.register("specialChars",mt),e.register("colors",gt),e.register("tableBg",vt),e.register("align",ht),e.register("markdown",yt),e.register("link",wt),e.register("image",kt),e.register("imageProps",St),e.register("imageTools",Lt),e.register("iframe",xt),e.register("table",Et),e.register("tableTools",Tt),e.register("hr",At),e.register("unlink",qt),e.register("emoji",Mt),e.register("direction",Rt),e.register("source",Nt),e.register("history",Bt),e.register("fullscreen",zt),e.register("toolbarCollapse",It),e.register("autosave",Ot),e.register("autoLinkify",jt),e.register("caseTransform",Pt),e.register("shortcutsHelp",Ut),e.register("floatingToolbar",Ft),e.register("darkMode",Wt),e.register("shortcutCustomizer",Xt)}const se=new Z;Kt(se),se.injectAllCSS(),(function(){if(typeof document>"u"||document.querySelector('link[href*="tabler-icons"]'))return;const t=document.createElement("link");t.rel="stylesheet",t.href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3/dist/tabler-icons.min.css",document.head.appendChild(t)})();const ee={pluginManager:se,instances:[],onBrowseImage:null,onUploadImage:null,setBrowseImage(e){this.onBrowseImage=e},attach(e,t){const o=typeof e=="string"?document.querySelector(e):e;if(!o||String(o.tagName).toUpperCase()!=="TEXTAREA"&&!(o.matches&&o.matches("textarea[data-tulih-editor]")))return;const r=o.nextElementSibling;if(!(r&&r.querySelector&&r.querySelector(".te-editor")))return new pe(o,t,ee)},create(e,t){return this.attach(e,t)}};return typeof document<"u"&&document.addEventListener("DOMContentLoaded",()=>{document.querySelectorAll("textarea[data-tulih-editor]").forEach(t=>{ee.attach(t)})}),ee.Editor=pe,ee.PluginManager=Z,ee}));
8
+ //# sourceMappingURL=tulih-editor.umd.js.map