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.
- package/LICENSE +21 -0
- package/README.md +331 -0
- package/dist/tulih-editor.css +1 -0
- package/dist/tulih-editor.es.js +3051 -0
- package/dist/tulih-editor.es.js.map +1 -0
- package/dist/tulih-editor.umd.js +8 -0
- package/dist/tulih-editor.umd.js.map +1 -0
- package/dist/types/core/Editor.d.ts +20 -0
- package/dist/types/core/PluginManager.d.ts +22 -0
- package/dist/types/core/helpers.d.ts +22 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/plugins/align.d.ts +3 -0
- package/dist/types/plugins/autoLinkify.d.ts +3 -0
- package/dist/types/plugins/autosave.d.ts +3 -0
- package/dist/types/plugins/block.d.ts +3 -0
- package/dist/types/plugins/caseTransform.d.ts +3 -0
- package/dist/types/plugins/codeBlock.d.ts +3 -0
- package/dist/types/plugins/colors.d.ts +3 -0
- package/dist/types/plugins/darkMode.d.ts +3 -0
- package/dist/types/plugins/direction.d.ts +3 -0
- package/dist/types/plugins/dragDrop.d.ts +3 -0
- package/dist/types/plugins/emoji.d.ts +3 -0
- package/dist/types/plugins/emojiAutocomplete.d.ts +3 -0
- package/dist/types/plugins/findReplace.d.ts +3 -0
- package/dist/types/plugins/floatingToolbar.d.ts +3 -0
- package/dist/types/plugins/fontFamily.d.ts +3 -0
- package/dist/types/plugins/fontSize.d.ts +3 -0
- package/dist/types/plugins/fullscreen.d.ts +3 -0
- package/dist/types/plugins/history.d.ts +3 -0
- package/dist/types/plugins/hr.d.ts +3 -0
- package/dist/types/plugins/iframe.d.ts +3 -0
- package/dist/types/plugins/image.d.ts +3 -0
- package/dist/types/plugins/imageProps.d.ts +3 -0
- package/dist/types/plugins/imageTools.d.ts +3 -0
- package/dist/types/plugins/indent.d.ts +3 -0
- package/dist/types/plugins/index.d.ts +2 -0
- package/dist/types/plugins/inline.d.ts +3 -0
- package/dist/types/plugins/inlineCode.d.ts +3 -0
- package/dist/types/plugins/keyboardShortcuts.d.ts +3 -0
- package/dist/types/plugins/lineHeight.d.ts +3 -0
- package/dist/types/plugins/link.d.ts +3 -0
- package/dist/types/plugins/linkTooltip.d.ts +3 -0
- package/dist/types/plugins/list.d.ts +3 -0
- package/dist/types/plugins/markdown.d.ts +3 -0
- package/dist/types/plugins/mediaEmbed.d.ts +3 -0
- package/dist/types/plugins/pasteImage.d.ts +3 -0
- package/dist/types/plugins/pastePlain.d.ts +3 -0
- package/dist/types/plugins/pre.d.ts +3 -0
- package/dist/types/plugins/readOnly.d.ts +3 -0
- package/dist/types/plugins/shortcutCustomizer.d.ts +3 -0
- package/dist/types/plugins/shortcutsHelp.d.ts +3 -0
- package/dist/types/plugins/source.d.ts +3 -0
- package/dist/types/plugins/specialChars.d.ts +3 -0
- package/dist/types/plugins/statusBar.d.ts +3 -0
- package/dist/types/plugins/subSuper.d.ts +3 -0
- package/dist/types/plugins/table.d.ts +3 -0
- package/dist/types/plugins/tableBg.d.ts +3 -0
- package/dist/types/plugins/tableTools.d.ts +3 -0
- package/dist/types/plugins/toolbarCollapse.d.ts +3 -0
- package/dist/types/plugins/unlink.d.ts +3 -0
- package/dist/types/plugins/wordCount.d.ts +3 -0
- package/dist/types/types.d.ts +226 -0
- package/package.json +66 -0
- package/src/core/Editor.ts +460 -0
- package/src/core/PluginManager.ts +140 -0
- package/src/core/helpers.ts +209 -0
- package/src/css.d.ts +2 -0
- package/src/index.ts +87 -0
- package/src/plugins/align.ts +72 -0
- package/src/plugins/autoLinkify.ts +34 -0
- package/src/plugins/autosave.ts +69 -0
- package/src/plugins/block.ts +32 -0
- package/src/plugins/caseTransform.ts +54 -0
- package/src/plugins/codeBlock.ts +93 -0
- package/src/plugins/colors.ts +68 -0
- package/src/plugins/darkMode.ts +123 -0
- package/src/plugins/direction.ts +30 -0
- package/src/plugins/dragDrop.ts +68 -0
- package/src/plugins/emoji.ts +188 -0
- package/src/plugins/emojiAutocomplete.ts +183 -0
- package/src/plugins/findReplace.ts +229 -0
- package/src/plugins/floatingToolbar.ts +258 -0
- package/src/plugins/fontFamily.ts +41 -0
- package/src/plugins/fontSize.ts +32 -0
- package/src/plugins/fullscreen.ts +36 -0
- package/src/plugins/history.ts +14 -0
- package/src/plugins/hr.ts +118 -0
- package/src/plugins/iframe.ts +88 -0
- package/src/plugins/image.ts +107 -0
- package/src/plugins/imageProps.ts +119 -0
- package/src/plugins/imageTools.ts +344 -0
- package/src/plugins/indent.ts +29 -0
- package/src/plugins/index.ts +101 -0
- package/src/plugins/inline.ts +17 -0
- package/src/plugins/inlineCode.ts +21 -0
- package/src/plugins/keyboardShortcuts.ts +92 -0
- package/src/plugins/lineHeight.ts +40 -0
- package/src/plugins/link.ts +344 -0
- package/src/plugins/linkTooltip.ts +63 -0
- package/src/plugins/list.ts +141 -0
- package/src/plugins/markdown.ts +61 -0
- package/src/plugins/mediaEmbed.ts +44 -0
- package/src/plugins/pasteImage.ts +61 -0
- package/src/plugins/pastePlain.ts +43 -0
- package/src/plugins/pre.ts +11 -0
- package/src/plugins/readOnly.ts +46 -0
- package/src/plugins/shortcutCustomizer.ts +125 -0
- package/src/plugins/shortcutsHelp.ts +51 -0
- package/src/plugins/source.ts +77 -0
- package/src/plugins/specialChars.ts +64 -0
- package/src/plugins/statusBar.ts +85 -0
- package/src/plugins/subSuper.ts +20 -0
- package/src/plugins/table.ts +166 -0
- package/src/plugins/tableBg.ts +11 -0
- package/src/plugins/tableTools.ts +475 -0
- package/src/plugins/toolbarCollapse.ts +14 -0
- package/src/plugins/unlink.ts +29 -0
- package/src/plugins/wordCount.ts +34 -0
- package/src/styles/base.css +258 -0
- package/src/styles/editor.css +309 -0
- package/src/styles/index.css +6 -0
- 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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")}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,""")+'" alt="'+y.replace(/"/g,""")+'" 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,"<").replace(/>/g,">")+"</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,""")+'" alt="'+(c.name||"").replace(/"/g,""")+'" 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">↑</button><button type="button" class="btn btn-sm btn-primary te-fr-next" title="Next">↓</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">×</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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""),w='<a href="'+f.replace(/"/g,""")+'"'+(E?' target="_blank"':"")+(B?' rel="'+B.replace(/"/g,""")+'"':"")+">"+_+"</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,""")+'"';a&&(d+=' width="'+a.replace(/"/g,""")+'"'),i&&(d+=' height="'+i.replace(/"/g,""")+'"');var p=e.options&&e.options.iframeSandbox||"",s=e.options&&e.options.iframeAllow||"";p&&(d+=' sandbox="'+p.replace(/"/g,""")+'"'),s&&(d+=' allow="'+s.replace(/"/g,""")+'"');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 × 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,""")+'" target="_blank" rel="noopener noreferrer">'+n.replace(/</g,"<").replace(/>/g,">")+"</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,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")}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
|