alien-editor 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/README.md +249 -0
  2. package/dist/alien-editor.js +2103 -0
  3. package/dist/alien-editor.umd.cjs +2 -0
  4. package/dist/index.d.ts +8 -0
  5. package/dist/nuxt.cjs +1 -0
  6. package/dist/nuxt.js +17 -0
  7. package/dist/src/components/AlienEditor.vue.d.ts +20 -0
  8. package/dist/src/components/blocks/BlockList.vue.d.ts +2 -0
  9. package/dist/src/components/blocks/BlockWrapper.vue.d.ts +21 -0
  10. package/dist/src/components/blocks/ButtonBlock.vue.d.ts +6 -0
  11. package/dist/src/components/blocks/CodeBlock.vue.d.ts +6 -0
  12. package/dist/src/components/blocks/DividerBlock.vue.d.ts +6 -0
  13. package/dist/src/components/blocks/HeadingBlock.vue.d.ts +8 -0
  14. package/dist/src/components/blocks/ImageBlock.vue.d.ts +8 -0
  15. package/dist/src/components/blocks/ListBlock.vue.d.ts +6 -0
  16. package/dist/src/components/blocks/ModuleBlock.vue.d.ts +8 -0
  17. package/dist/src/components/blocks/TextBlock.vue.d.ts +8 -0
  18. package/dist/src/components/blocks/VideoBlock.vue.d.ts +6 -0
  19. package/dist/src/components/modals/ImageUrlModal.vue.d.ts +2 -0
  20. package/dist/src/components/modals/LinkModal.vue.d.ts +2 -0
  21. package/dist/src/components/toolbar/AlienToolbar.vue.d.ts +2 -0
  22. package/dist/src/components/toolbar/ColorPicker.vue.d.ts +2 -0
  23. package/dist/src/components/toolbar/ModeToggle.vue.d.ts +2 -0
  24. package/dist/src/components/toolbar/ModuleDropdown.vue.d.ts +2 -0
  25. package/dist/src/components/toolbar/ToolbarButton.vue.d.ts +26 -0
  26. package/dist/src/composables/useBlocks.d.ts +13 -0
  27. package/dist/src/composables/useDragDrop.d.ts +16 -0
  28. package/dist/src/composables/useEditorState.d.ts +191 -0
  29. package/dist/src/composables/useFormatting.d.ts +14 -0
  30. package/dist/src/composables/useHistory.d.ts +9 -0
  31. package/dist/src/composables/useParser.d.ts +4 -0
  32. package/dist/src/composables/useSelection.d.ts +8 -0
  33. package/dist/src/composables/useSerializer.d.ts +7 -0
  34. package/dist/src/types/index.d.ts +116 -0
  35. package/dist/src/utils/tailwindMap.d.ts +12 -0
  36. package/dist/style.css +1 -0
  37. package/package.json +53 -0
@@ -0,0 +1,2 @@
1
+ (function(I,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(I=typeof globalThis<"u"?globalThis:I||self,e(I.AlienEditor={},I.Vue))})(this,function(I,e){"use strict";function Y(){const l=e.ref([]),t=e.ref("edit"),o=e.ref(null),n=e.ref(null);return{blocks:l,mode:t,activeBlockId:o,savedRange:n}}const Z=100;function G(l){const t=e.ref([]),o=e.ref([]);function n(){return{blocks:JSON.parse(JSON.stringify(l.value)),timestamp:Date.now()}}function i(){t.value.push(n()),t.value.length>Z&&t.value.shift(),o.value=[]}function f(){t.value.length&&(o.value.push(n()),l.value=t.value.pop().blocks)}function u(){o.value.length&&(t.value.push(n()),l.value=o.value.pop().blocks)}function m(){return t.value.length>0}function c(){return o.value.length>0}return{pushSnapshot:i,undo:f,redo:u,canUndo:m,canRedo:c}}function _(l){function t(){if(typeof window>"u")return;const u=window.getSelection();u&&u.rangeCount>0&&(l.value=u.getRangeAt(0).cloneRange())}function o(){if(typeof window>"u"||!l.value)return;const u=window.getSelection();u&&(u.removeAllRanges(),u.addRange(l.value))}function n(){if(typeof window>"u")return null;const u=window.getSelection();return u&&u.rangeCount>0?u.getRangeAt(0):null}function i(){if(typeof window>"u")return!0;const u=window.getSelection();return!u||u.isCollapsed}function f(){if(typeof window>"u")return null;const u=window.getSelection();return u&&u.rangeCount>0?u.toString():null}return{saveSelection:t,restoreSelection:o,getRange:n,isCollapsed:i,getSelectedText:f}}let Q=0;function ee(){return`ae-${Date.now()}-${++Q}`}function R(l,t={}){const o=ee();switch(l){case"paragraph":return{id:o,type:"paragraph",html:"",align:"left",classes:[],...t};case"blockquote":return{id:o,type:"blockquote",html:"",align:"left",classes:[],...t};case"heading":return{id:o,type:"heading",level:2,html:"",align:"left",classes:[],...t};case"ordered-list":return{id:o,type:"ordered-list",items:[""],...t};case"unordered-list":return{id:o,type:"unordered-list",items:[""],...t};case"image":return{id:o,type:"image",src:"",alt:"",classes:[],...t};case"video":return{id:o,type:"video",src:"",classes:[],...t};case"code":return{id:o,type:"code",code:"",language:"plaintext",...t};case"divider":return{id:o,type:"divider",classes:[],...t};case"button":return{id:o,type:"button",label:"Button",href:"#",classes:["inline-block","px-4","py-2","bg-blue-600","text-white","rounded"],...t};case"module":return{id:o,type:"module",html:"",...t};default:return{id:o,type:"paragraph",html:"",align:"left",classes:[]}}}function te(l,t){function o(m,c,r={}){t();const d=l.value.findIndex(p=>p.id===m),s=R(c,r);return l.value.splice(d+1,0,s),s.id}function n(m,c,r={}){t();const d=R(c,r);return l.value.splice(m,0,d),d.id}function i(m){const c=l.value.findIndex(r=>r.id===m);c!==-1&&(t(),l.value.splice(c,1))}function f(m,c){const r=l.value.findIndex(p=>p.id===m),d=l.value.findIndex(p=>p.id===c);if(r===-1||d===-1||r===d)return;t();const[s]=l.value.splice(r,1);l.value.splice(d,0,s)}function u(m,c){const r=l.value.find(d=>d.id===m);r&&Object.assign(r,c)}return{addBlockAfter:o,addBlockAt:n,removeBlock:i,moveBlock:f,updateBlock:u,createDefaultBlock:R}}function oe(l,t){const o=e.ref({draggedId:null,overId:null});function n(c,r){o.value.draggedId=c,r.dataTransfer&&(r.dataTransfer.effectAllowed="move",r.dataTransfer.setData("text/plain",c))}function i(c,r){r.preventDefault(),r.dataTransfer&&(r.dataTransfer.dropEffect="move"),o.value.draggedId&&o.value.draggedId!==c&&(o.value.overId=c)}function f(){o.value.overId=null}function u(c){const{draggedId:r}=o.value;r&&r!==c&&t(r,c),o.value={draggedId:null,overId:null}}function m(){o.value={draggedId:null,overId:null}}return{dragState:o,onDragStart:n,onDragOver:i,onDragLeave:f,onDrop:u,onDragEnd:m}}function v(l){return l==="left"?"":`text-${l}`}function T(l){const t=l.filter(Boolean);return t.length?` class="${t.join(" ")}"`:""}function P(l){switch(l.type){case"paragraph":{const t=l,o=[v(t.align),...t.classes].filter(Boolean);return`<p${T(o)}>${t.html||""}</p>`}case"blockquote":{const t=l,o=["border-l-4","border-gray-300","pl-4","italic",v(t.align),...t.classes].filter(Boolean);return`<blockquote${T(o)}>${t.html||""}</blockquote>`}case"heading":{const t=l,o=[v(t.align),...t.classes].filter(Boolean);return`<h${t.level}${T(o)}>${t.html||""}</h${t.level}>`}case"ordered-list":return`<ol class="list-decimal list-inside">${l.items.map(n=>`<li>${n}</li>`).join("")}</ol>`;case"unordered-list":return`<ul class="list-disc list-inside">${l.items.map(n=>`<li>${n}</li>`).join("")}</ul>`;case"image":{const t=l,o=t.classes.filter(Boolean);return t.src?`<img src="${j(t.src)}" alt="${j(t.alt)}"${T(o)} />`:""}case"video":{const t=l;return t.src?`<video src="${j(t.src)}" controls class="w-full"></video>`:""}case"code":{const t=l,o=t.code.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;");return`<pre class="bg-gray-900 text-gray-100 p-4 rounded overflow-x-auto"><code class="language-${j(t.language)}">${o}</code></pre>`}case"divider":{const o=["border-t","border-gray-300","my-4",...l.classes].filter(Boolean);return`<hr${T(o)} />`}case"button":{const t=l,o=t.classes.filter(Boolean);return`<a href="${j(t.href)}"${T(o)}>${t.label||"Button"}</a>`}case"module":return l.html||"";default:return""}}function j(l){return l.replace(/&/g,"&amp;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function ne(){function l(t){return t.map(o=>P(o)).filter(Boolean).join(`
2
+ `)}return{serialize:l,serializeBlock:P}}let le=0;function N(){return`ae-p-${Date.now()}-${++le}`}function F(l){return l.classList.contains("text-center")?"center":l.classList.contains("text-right")?"right":l.classList.contains("text-justify")?"justify":"left"}function A(l,t=[]){const o=["text-left","text-center","text-right","text-justify"];return Array.from(l.classList).filter(n=>![...o,...t].includes(n))}function re(){function l(t){var u,m,c;if(!t||!t.trim())return[];if(typeof window>"u"||typeof DOMParser>"u")return[{id:N(),type:"paragraph",html:t,align:"left",classes:[]}];const n=new DOMParser().parseFromString(`<body>${t}</body>`,"text/html"),i=Array.from(n.body.childNodes),f=[];for(const r of i){if(r.nodeType===Node.TEXT_NODE){const p=(u=r.textContent)==null?void 0:u.trim();p&&f.push({id:N(),type:"paragraph",html:p,align:"left",classes:[]});continue}const d=r,s=(m=d.tagName)==null?void 0:m.toLowerCase();switch(!0){case s==="p":{f.push({id:N(),type:"paragraph",html:d.innerHTML,align:F(d),classes:A(d)});break}case/^h[1-6]$/.test(s):{const p=parseInt(s[1]);f.push({id:N(),type:"heading",level:p,html:d.innerHTML,align:F(d),classes:A(d)});break}case s==="blockquote":{f.push({id:N(),type:"blockquote",html:d.innerHTML,align:F(d),classes:A(d,["border-l-4","border-gray-300","pl-4","italic"])});break}case s==="ul":{const p=Array.from(d.querySelectorAll(":scope > li")).map(b=>b.innerHTML);f.push({id:N(),type:"unordered-list",items:p.length?p:[""]});break}case s==="ol":{const p=Array.from(d.querySelectorAll(":scope > li")).map(b=>b.innerHTML);f.push({id:N(),type:"ordered-list",items:p.length?p:[""]});break}case s==="img":{f.push({id:N(),type:"image",src:d.getAttribute("src")||"",alt:d.getAttribute("alt")||"",classes:A(d)});break}case s==="video":{f.push({id:N(),type:"video",src:d.getAttribute("src")||"",classes:A(d,["w-full"])});break}case s==="pre":{const p=d.querySelector("code"),b=(p==null?void 0:p.className.replace("language-",""))||"plaintext",x=document.createElement("div");x.innerHTML=(p==null?void 0:p.innerHTML)||"",f.push({id:N(),type:"code",code:x.textContent||"",language:b});break}case s==="hr":{f.push({id:N(),type:"divider",classes:A(d,["border-t","border-gray-300","my-4"])});break}case(s==="a"&&((c=d.dataset)==null?void 0:c.alienBlock)==="button"):{f.push({id:N(),type:"button",label:d.textContent||"Button",href:d.getAttribute("href")||"#",classes:Array.from(d.classList)});break}default:f.push({id:N(),type:"module",html:d.outerHTML})}}return f}return{parse:l}}const L={bold:"font-bold",italic:"italic",underline:"underline",strikethrough:"line-through",fontSizes:{xs:"text-xs",sm:"text-sm",base:"text-base",lg:"text-lg",xl:"text-xl","2xl":"text-2xl","3xl":"text-3xl","4xl":"text-4xl","5xl":"text-5xl"},fontWeights:{thin:"font-thin",light:"font-light",normal:"font-normal",medium:"font-medium",semibold:"font-semibold",bold:"font-bold",extrabold:"font-extrabold",black:"font-black"},headingDefaults:{1:"text-5xl font-bold",2:"text-4xl font-bold",3:"text-3xl font-semibold",4:"text-2xl font-semibold",5:"text-xl font-medium",6:"text-lg font-medium"},align:{left:"text-left",center:"text-center",right:"text-right",justify:"text-justify"}};function K(l){const{restoreSelection:t,getRange:o,isCollapsed:n}=_(l);function i(w){let k=w;for(;k;){if(k.contentEditable==="true"){k.dispatchEvent(new Event("input",{bubbles:!0}));return}k=k.parentNode}}function f(w){t();const k=o();if(!k||n())return;const E=k.extractContents(),B=document.createElement("span");B.className=w,B.appendChild(E),k.insertNode(B);const y=document.createRange();y.selectNodeContents(B);const a=window.getSelection();return a==null||a.removeAllRanges(),a==null||a.addRange(y),i(B),B}function u(w){t();const k=o();if(!k)return null;let E=k.commonAncestorContainer.nodeType===Node.TEXT_NODE?k.commonAncestorContainer.parentElement:k.commonAncestorContainer;for(;E&&E.contentEditable!=="true";){const B=E;if(B.tagName==="SPAN"&&B.classList.contains(w))return B;E=E.parentNode}return null}function m(w){const k=u(w);if(k){const E=k.parentNode;for(;k.firstChild;)E.insertBefore(k.firstChild,k);E.removeChild(k),E.normalize(),i(E)}else f(w)}function c(){m(L.bold)}function r(){m(L.italic)}function d(){m(L.underline)}function s(){m(L.strikethrough)}function p(w){u(`text-${w}`)||f(`text-${w}`)}function b(w){f(`font-${w}`)}function x(w){f(w)}function S(w,k){t();const E=o();if(!E)return;const B=document.createElement("a");B.href=w,B.className="text-blue-600 underline hover:text-blue-800",B.target="_blank",B.rel="noopener noreferrer",n()||E.deleteContents(),B.textContent=k||w,E.insertNode(B);const y=document.createRange();y.setStartAfter(B),y.collapse(!0);const a=window.getSelection();a==null||a.removeAllRanges(),a==null||a.addRange(y),i(B)}function M(w){return u(w)!==null}return{wrapSelectionWithClass:f,toggleClass:m,applyBold:c,applyItalic:r,applyUnderline:d,applyStrikethrough:s,applyFontSize:p,applyFontWeight:b,applyColor:x,insertLink:S,isActive:M}}const ae=["title","disabled"],V=e.defineComponent({__name:"ToolbarButton",props:{title:{},active:{type:Boolean},disabled:{type:Boolean}},emits:["action"],setup(l){return(t,o)=>(e.openBlock(),e.createElementBlock("button",{class:e.normalizeClass(["ae-toolbar-btn inline-flex items-center justify-center w-8 h-8 rounded text-sm transition-colors",[l.active?"bg-gray-800 text-white":"text-gray-600 hover:bg-gray-100 hover:text-gray-900",l.disabled?"opacity-40 cursor-not-allowed":"cursor-pointer"]]),title:l.title,disabled:l.disabled,onMousedown:o[0]||(o[0]=e.withModifiers(n=>t.$emit("action"),["prevent"]))},[e.renderSlot(t.$slots,"default")],42,ae))}}),ie={key:0,class:"ae-color-picker relative"},se={class:"p-2 border-b border-gray-100"},de={class:"max-h-48 overflow-y-auto py-1"},ce=["onMousedown"],pe={class:"text-gray-700"},fe={class:"text-gray-400 text-xs ml-auto"},ue={key:0,class:"px-3 py-2 text-sm text-gray-400 text-center"},me=e.defineComponent({__name:"ColorPicker",setup(l){const t=e.inject("alienEditor"),o=K(t.savedRange),n=e.ref(!1),i=e.ref(""),f=e.computed(()=>t.colors.filter(r=>r.title.toLowerCase().includes(i.value.toLowerCase())||r.key.toLowerCase().includes(i.value.toLowerCase())));function u(r){o.applyColor(r.class),n.value=!1,i.value=""}function m(){n.value=!n.value,n.value&&(i.value="")}function c(){n.value=!1}return(r,d)=>e.unref(t).colors.length?(e.openBlock(),e.createElementBlock("div",ie,[e.createElementVNode("button",{class:"ae-toolbar-btn inline-flex items-center gap-1 px-2 h-8 rounded text-sm text-gray-600 hover:bg-gray-100 hover:text-gray-900 transition-colors",title:"Text color",onMousedown:e.withModifiers(m,["prevent"])},[...d[3]||(d[3]=[e.createElementVNode("span",{class:"text-xs font-medium"},"A",-1),e.createElementVNode("span",{class:"text-gray-400"},"▾",-1)])],32),n.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"ae-color-dropdown absolute top-full left-0 mt-1 w-52 bg-white border border-gray-200 rounded-lg shadow-lg z-50",onMousedown:d[2]||(d[2]=e.withModifiers(()=>{},["stop"]))},[e.createElementVNode("div",se,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":d[0]||(d[0]=s=>i.value=s),type:"text",placeholder:"Search colors...",class:"w-full text-sm border border-gray-200 rounded px-2 py-1 outline-none focus:border-blue-400",onMousedown:d[1]||(d[1]=e.withModifiers(()=>{},["stop"]))},null,544),[[e.vModelText,i.value]])]),e.createElementVNode("ul",de,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.value,s=>(e.openBlock(),e.createElementBlock("li",{key:s.key,class:"flex items-center gap-2 px-3 py-1.5 cursor-pointer hover:bg-gray-50 text-sm",onMousedown:e.withModifiers(p=>u(s),["prevent"])},[e.createElementVNode("span",{class:e.normalizeClass(["font-bold text-base",s.class])},"A",2),e.createElementVNode("span",pe,e.toDisplayString(s.title),1),e.createElementVNode("span",fe,e.toDisplayString(s.key),1)],40,ce))),128)),f.value.length===0?(e.openBlock(),e.createElementBlock("li",ue," No colors found ")):e.createCommentVNode("",!0)])],32)):e.createCommentVNode("",!0),n.value?(e.openBlock(),e.createElementBlock("div",{key:1,class:"fixed inset-0 z-40",onMousedown:c},null,32)):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)}}),ge={key:0,class:"ae-module-dropdown relative"},be={class:"p-2 border-b border-gray-100"},ke={class:"max-h-60 overflow-y-auto py-1"},xe=["onMousedown"],ye={class:"w-8 h-8 rounded bg-gray-100 flex items-center justify-center text-gray-500 text-xs flex-shrink-0 mt-0.5"},he={class:"text-sm font-medium text-gray-800"},we={class:"text-xs text-gray-400"},Be={key:0,class:"px-3 py-2 text-sm text-gray-400 text-center"},Ee=e.defineComponent({__name:"ModuleDropdown",setup(l){const t=e.inject("alienEditor"),o=e.ref(!1),n=e.ref(""),i=e.computed(()=>t.modules.filter(c=>c.title.toLowerCase().includes(n.value.toLowerCase())||c.key.toLowerCase().includes(n.value.toLowerCase())));function f(c){var d;const r=t.activeBlockId.value;if(r)t.addBlockAfter(r,"module",{html:c.module});else{const s=t.blocks.value,p=((d=s[s.length-1])==null?void 0:d.id)??"";p?t.addBlockAfter(p,"module",{html:c.module}):t.addBlockAt(0,"module",{html:c.module})}o.value=!1,n.value=""}function u(){o.value=!o.value,o.value&&(n.value="")}function m(){o.value=!1}return(c,r)=>e.unref(t).modules.length?(e.openBlock(),e.createElementBlock("div",ge,[e.createElementVNode("button",{class:"ae-toolbar-btn inline-flex items-center gap-1 px-2 h-8 rounded text-sm text-gray-600 hover:bg-gray-100 hover:text-gray-900 transition-colors",title:"Insert module",onMousedown:e.withModifiers(u,["prevent"])},[...r[3]||(r[3]=[e.createElementVNode("span",{class:"text-xs font-medium"},"{ }",-1),e.createElementVNode("span",{class:"text-gray-400"},"▾",-1)])],32),o.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"ae-module-dropdown-panel absolute top-full left-0 mt-1 w-60 bg-white border border-gray-200 rounded-lg shadow-lg z-50",onMousedown:r[2]||(r[2]=e.withModifiers(()=>{},["stop"]))},[e.createElementVNode("div",be,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":r[0]||(r[0]=d=>n.value=d),type:"text",placeholder:"Search modules...",class:"w-full text-sm border border-gray-200 rounded px-2 py-1 outline-none focus:border-blue-400",onMousedown:r[1]||(r[1]=e.withModifiers(()=>{},["stop"]))},null,544),[[e.vModelText,n.value]])]),e.createElementVNode("ul",ke,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.value,d=>(e.openBlock(),e.createElementBlock("li",{key:d.key,class:"flex items-start gap-2 px-3 py-2 cursor-pointer hover:bg-gray-50",onMousedown:e.withModifiers(s=>f(d),["prevent"])},[e.createElementVNode("div",ye,e.toDisplayString(d.key.slice(0,2).toUpperCase()),1),e.createElementVNode("div",null,[e.createElementVNode("p",he,e.toDisplayString(d.title),1),e.createElementVNode("p",we,e.toDisplayString(d.key),1)])],40,xe))),128)),i.value.length===0?(e.openBlock(),e.createElementBlock("li",Be," No modules found ")):e.createCommentVNode("",!0)])],32)):e.createCommentVNode("",!0),o.value?(e.openBlock(),e.createElementBlock("div",{key:1,class:"fixed inset-0 z-40",onMousedown:m},null,32)):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)}}),Ne={class:"ae-mode-toggle flex rounded-md border border-gray-200 overflow-hidden"},Ve=["title","onMousedown"],Me=e.defineComponent({__name:"ModeToggle",setup(l){const t=e.inject("alienEditor"),o=[{key:"edit",label:"Edit",title:"Edit mode"},{key:"code",label:"Code",title:"View raw HTML"},{key:"preview",label:"Preview",title:"Preview rendered output"}];return(n,i)=>(e.openBlock(),e.createElementBlock("div",Ne,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(o,f=>e.createElementVNode("button",{key:f.key,class:e.normalizeClass(["px-3 py-1 text-xs font-medium transition-colors",e.unref(t).mode.value===f.key?"bg-gray-800 text-white":"text-gray-600 hover:bg-gray-100"]),title:f.title,onMousedown:e.withModifiers(u=>e.unref(t).mode.value=f.key,["prevent"])},e.toDisplayString(f.label),43,Ve)),64))]))}}),$e={class:"relative"},Ce=["onMousedown"],Ie={class:"relative"},Se=["onMousedown"],Le={class:"relative"},Te=["onMousedown"],Ae={class:"relative"},De=["onMousedown"],je={class:"ml-auto"},Ue=e.defineComponent({__name:"AlienToolbar",setup(l){const t=e.inject("alienEditor"),o=K(t.savedRange),n=e.ref(!1),i=[{type:"paragraph",label:"Paragraph"},{type:"heading",label:"Heading"},{type:"unordered-list",label:"Bullet List"},{type:"ordered-list",label:"Numbered List"},{type:"blockquote",label:"Blockquote"},{type:"code",label:"Code Block"},{type:"image",label:"Image"},{type:"video",label:"Video"},{type:"button",label:"Button"},{type:"divider",label:"Divider"}];function f(y){var g;const a=t.activeBlockId.value;if(a)t.addBlockAfter(a,y);else{const $=t.blocks.value,z=(g=$[$.length-1])==null?void 0:g.id;z?t.addBlockAfter(z,y):t.addBlockAt(0,y)}n.value=!1}const u=e.ref(!1),m=[1,2,3,4,5,6];function c(y){const a=t.activeBlockId.value;if(!a)return;const g=t.blocks.value.find($=>$.id===a);(g==null?void 0:g.type)==="heading"?t.updateBlock(a,{level:y}):(t.pushSnapshot(),t.updateBlock(a,{type:"heading",level:y,html:(g==null?void 0:g.html)??""})),u.value=!1}const r=e.ref(!1),d=Object.entries(L.fontSizes),s=e.ref(!1),p=Object.entries(L.fontWeights);function b(y){const a=t.activeBlockId.value;a&&t.updateBlock(a,{align:y})}function x(){t.saveSelection(),t.showLinkModal.value=!0}function S(){const y=t.activeBlockId.value;y?t.addBlockAfter(y,"image"):t.addBlockAt(t.blocks.value.length,"image")}function M(){const y=t.activeBlockId.value;y?t.addBlockAfter(y,"divider"):t.addBlockAt(t.blocks.value.length,"divider")}const w=e.computed(()=>t.activeBlockId.value?t.blocks.value.find(y=>y.id===t.activeBlockId.value)??null:null),k=e.computed(()=>{var y;return((y=w.value)==null?void 0:y.align)??"left"}),E=e.computed(()=>t.mode.value==="edit");function B(){n.value=!1,u.value=!1,r.value=!1,s.value=!1}return(y,a)=>(e.openBlock(),e.createElementBlock("div",{class:"ae-toolbar flex items-center gap-0.5 flex-wrap px-2 py-1.5 border-b border-gray-200 bg-white sticky top-0 z-20",onMouseleave:B},[E.value?(e.openBlock(),e.createElementBlock(e.Fragment,{key:0},[e.createVNode(V,{title:"Bold (Ctrl+B)",onAction:a[0]||(a[0]=g=>e.unref(o).applyBold())},{default:e.withCtx(()=>[...a[18]||(a[18]=[e.createElementVNode("strong",null,"B",-1)])]),_:1}),e.createVNode(V,{title:"Italic (Ctrl+I)",onAction:a[1]||(a[1]=g=>e.unref(o).applyItalic())},{default:e.withCtx(()=>[...a[19]||(a[19]=[e.createElementVNode("em",null,"I",-1)])]),_:1}),e.createVNode(V,{title:"Underline",onAction:a[2]||(a[2]=g=>e.unref(o).applyUnderline())},{default:e.withCtx(()=>[...a[20]||(a[20]=[e.createElementVNode("span",{class:"underline"},"U",-1)])]),_:1}),e.createVNode(V,{title:"Strikethrough",onAction:a[3]||(a[3]=g=>e.unref(o).applyStrikethrough())},{default:e.withCtx(()=>[...a[21]||(a[21]=[e.createElementVNode("span",{class:"line-through"},"S",-1)])]),_:1}),a[35]||(a[35]=e.createElementVNode("div",{class:"ae-divider-v w-px h-5 bg-gray-200 mx-1"},null,-1)),e.createElementVNode("div",$e,[e.createElementVNode("button",{class:"ae-toolbar-btn inline-flex items-center gap-1 px-2 h-8 rounded text-sm text-gray-600 hover:bg-gray-100 transition-colors",title:"Heading level",onMousedown:a[4]||(a[4]=e.withModifiers(g=>{u.value=!u.value,r.value=!1,s.value=!1,n.value=!1},["prevent"]))},[...a[22]||(a[22]=[e.createTextVNode(" H ",-1),e.createElementVNode("span",{class:"text-gray-400 text-xs"},"▾",-1)])],32),u.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"absolute top-full left-0 mt-1 bg-white border border-gray-200 rounded-lg shadow-lg z-50 py-1 min-w-[100px]",onMousedown:a[5]||(a[5]=e.withModifiers(()=>{},["stop"]))},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(m,g=>e.createElementVNode("button",{key:g,class:"w-full text-left px-3 py-1.5 text-sm hover:bg-gray-50 flex items-center gap-2",onMousedown:e.withModifiers($=>c(g),["prevent"])},[e.createElementVNode("span",{class:e.normalizeClass([e.unref(L).headingDefaults[g],"leading-tight"])},"H"+e.toDisplayString(g),3)],40,Ce)),64))],32)):e.createCommentVNode("",!0)]),e.createElementVNode("div",Ie,[e.createElementVNode("button",{class:"ae-toolbar-btn inline-flex items-center gap-1 px-2 h-8 rounded text-sm text-gray-600 hover:bg-gray-100 transition-colors",title:"Font size",onMousedown:a[6]||(a[6]=e.withModifiers(g=>{r.value=!r.value,u.value=!1,s.value=!1,n.value=!1},["prevent"]))},[...a[23]||(a[23]=[e.createTextVNode(" Size ",-1),e.createElementVNode("span",{class:"text-gray-400 text-xs"},"▾",-1)])],32),r.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"absolute top-full left-0 mt-1 bg-white border border-gray-200 rounded-lg shadow-lg z-50 py-1 min-w-[120px]",onMousedown:a[7]||(a[7]=e.withModifiers(()=>{},["stop"]))},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(d),([g])=>(e.openBlock(),e.createElementBlock("button",{key:g,class:e.normalizeClass(["w-full text-left px-3 py-1 hover:bg-gray-50",`text-${g}`]),onMousedown:e.withModifiers($=>e.unref(o).applyFontSize(g),["prevent"])},e.toDisplayString(g),43,Se))),128))],32)):e.createCommentVNode("",!0)]),e.createElementVNode("div",Le,[e.createElementVNode("button",{class:"ae-toolbar-btn inline-flex items-center gap-1 px-2 h-8 rounded text-sm text-gray-600 hover:bg-gray-100 transition-colors",title:"Font weight",onMousedown:a[8]||(a[8]=e.withModifiers(g=>{s.value=!s.value,u.value=!1,r.value=!1,n.value=!1},["prevent"]))},[...a[24]||(a[24]=[e.createTextVNode(" Weight ",-1),e.createElementVNode("span",{class:"text-gray-400 text-xs"},"▾",-1)])],32),s.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"absolute top-full left-0 mt-1 bg-white border border-gray-200 rounded-lg shadow-lg z-50 py-1 min-w-[130px]",onMousedown:a[9]||(a[9]=e.withModifiers(()=>{},["stop"]))},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(p),([g])=>(e.openBlock(),e.createElementBlock("button",{key:g,class:e.normalizeClass(["w-full text-left px-3 py-1 hover:bg-gray-50 text-sm",`font-${g}`]),onMousedown:e.withModifiers($=>e.unref(o).applyFontWeight(g),["prevent"])},e.toDisplayString(g),43,Te))),128))],32)):e.createCommentVNode("",!0)]),a[36]||(a[36]=e.createElementVNode("div",{class:"ae-divider-v w-px h-5 bg-gray-200 mx-1"},null,-1)),e.createVNode(V,{title:"Align left",active:k.value==="left",onAction:a[10]||(a[10]=g=>b("left"))},{default:e.withCtx(()=>[...a[25]||(a[25]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"currentColor"},[e.createElementVNode("rect",{x:"0",y:"1",width:"14",height:"2",rx:"1"}),e.createElementVNode("rect",{x:"0",y:"5",width:"10",height:"2",rx:"1"}),e.createElementVNode("rect",{x:"0",y:"9",width:"14",height:"2",rx:"1"}),e.createElementVNode("rect",{x:"0",y:"13",width:"8",height:"2",rx:"1"})],-1)])]),_:1},8,["active"]),e.createVNode(V,{title:"Align center",active:k.value==="center",onAction:a[11]||(a[11]=g=>b("center"))},{default:e.withCtx(()=>[...a[26]||(a[26]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"currentColor"},[e.createElementVNode("rect",{x:"0",y:"1",width:"14",height:"2",rx:"1"}),e.createElementVNode("rect",{x:"2",y:"5",width:"10",height:"2",rx:"1"}),e.createElementVNode("rect",{x:"0",y:"9",width:"14",height:"2",rx:"1"}),e.createElementVNode("rect",{x:"3",y:"13",width:"8",height:"2",rx:"1"})],-1)])]),_:1},8,["active"]),e.createVNode(V,{title:"Align right",active:k.value==="right",onAction:a[12]||(a[12]=g=>b("right"))},{default:e.withCtx(()=>[...a[27]||(a[27]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"currentColor"},[e.createElementVNode("rect",{x:"0",y:"1",width:"14",height:"2",rx:"1"}),e.createElementVNode("rect",{x:"4",y:"5",width:"10",height:"2",rx:"1"}),e.createElementVNode("rect",{x:"0",y:"9",width:"14",height:"2",rx:"1"}),e.createElementVNode("rect",{x:"6",y:"13",width:"8",height:"2",rx:"1"})],-1)])]),_:1},8,["active"]),e.createVNode(V,{title:"Justify",active:k.value==="justify",onAction:a[13]||(a[13]=g=>b("justify"))},{default:e.withCtx(()=>[...a[28]||(a[28]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"currentColor"},[e.createElementVNode("rect",{x:"0",y:"1",width:"14",height:"2",rx:"1"}),e.createElementVNode("rect",{x:"0",y:"5",width:"14",height:"2",rx:"1"}),e.createElementVNode("rect",{x:"0",y:"9",width:"14",height:"2",rx:"1"}),e.createElementVNode("rect",{x:"0",y:"13",width:"14",height:"2",rx:"1"})],-1)])]),_:1},8,["active"]),a[37]||(a[37]=e.createElementVNode("div",{class:"ae-divider-v w-px h-5 bg-gray-200 mx-1"},null,-1)),e.createVNode(V,{title:"Insert link",onAction:x},{default:e.withCtx(()=>[...a[29]||(a[29]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e.createElementVNode("path",{d:"M10 13a5 5 0 007.54.54l3-3a5 5 0 00-7.07-7.07l-1.72 1.71"}),e.createElementVNode("path",{d:"M14 11a5 5 0 00-7.54-.54l-3 3a5 5 0 007.07 7.07l1.71-1.71"})],-1)])]),_:1}),e.createVNode(V,{title:"Insert image",onAction:S},{default:e.withCtx(()=>[...a[30]||(a[30]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e.createElementVNode("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2",ry:"2"}),e.createElementVNode("circle",{cx:"8.5",cy:"8.5",r:"1.5"}),e.createElementVNode("polyline",{points:"21 15 16 10 5 21"})],-1)])]),_:1}),e.createVNode(V,{title:"Insert divider",onAction:M},{default:e.withCtx(()=>[...a[31]||(a[31]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 14 14",fill:"currentColor"},[e.createElementVNode("rect",{x:"0",y:"6",width:"14",height:"2",rx:"1"})],-1)])]),_:1}),e.createElementVNode("div",Ae,[e.createElementVNode("button",{class:"ae-toolbar-btn inline-flex items-center gap-1 px-2 h-8 rounded text-sm text-gray-600 hover:bg-gray-100 transition-colors",title:"Insert block",onMousedown:a[14]||(a[14]=e.withModifiers(g=>{n.value=!n.value,u.value=!1,r.value=!1,s.value=!1},["prevent"]))},[...a[32]||(a[32]=[e.createTextVNode(" + Block ",-1),e.createElementVNode("span",{class:"text-gray-400 text-xs"},"▾",-1)])],32),n.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"absolute top-full left-0 mt-1 bg-white border border-gray-200 rounded-lg shadow-lg z-50 py-1 min-w-[150px]",onMousedown:a[15]||(a[15]=e.withModifiers(()=>{},["stop"]))},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(i,g=>e.createElementVNode("button",{key:g.type,class:"w-full text-left px-3 py-1.5 text-sm hover:bg-gray-50",onMousedown:e.withModifiers($=>f(g.type),["prevent"])},e.toDisplayString(g.label),41,De)),64))],32)):e.createCommentVNode("",!0)]),a[38]||(a[38]=e.createElementVNode("div",{class:"ae-divider-v w-px h-5 bg-gray-200 mx-1"},null,-1)),e.createVNode(me),e.createVNode(Ee),a[39]||(a[39]=e.createElementVNode("div",{class:"ae-divider-v w-px h-5 bg-gray-200 mx-1"},null,-1)),e.createVNode(V,{title:"Undo (Ctrl+Z)",disabled:!e.unref(t).canUndo(),onAction:a[16]||(a[16]=g=>e.unref(t).undo())},{default:e.withCtx(()=>[...a[33]||(a[33]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e.createElementVNode("polyline",{points:"9 14 4 9 9 4"}),e.createElementVNode("path",{d:"M20 20v-7a4 4 0 00-4-4H4"})],-1)])]),_:1},8,["disabled"]),e.createVNode(V,{title:"Redo (Ctrl+Y)",disabled:!e.unref(t).canRedo(),onAction:a[17]||(a[17]=g=>e.unref(t).redo())},{default:e.withCtx(()=>[...a[34]||(a[34]=[e.createElementVNode("svg",{width:"14",height:"14",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor","stroke-width":"2"},[e.createElementVNode("polyline",{points:"15 14 20 9 15 4"}),e.createElementVNode("path",{d:"M4 20v-7a4 4 0 014-4h12"})],-1)])]),_:1},8,["disabled"]),a[40]||(a[40]=e.createElementVNode("div",{class:"ae-divider-v w-px h-5 bg-gray-200 mx-1"},null,-1))],64)):e.createCommentVNode("",!0),e.createElementVNode("div",je,[e.createVNode(Me)])],32))}}),ze={key:0,class:"ae-drop-indicator absolute top-0 left-0 right-0 h-0.5 bg-blue-500 z-10 pointer-events-none"},He={class:"ae-block-controls absolute left-0 top-1/2 -translate-y-1/2 -translate-x-full pr-1 opacity-0 group-hover:opacity-100 transition-opacity flex flex-col gap-0.5"},Re={class:"ae-block-content"},ve={class:"ae-block-actions absolute right-0 top-1/2 -translate-y-1/2 translate-x-full pl-1 opacity-0 group-hover:opacity-100 transition-opacity flex flex-col gap-0.5"},Fe=e.defineComponent({__name:"BlockWrapper",props:{block:{}},setup(l){const t=e.inject("alienEditor");return(o,n)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ae-block-wrapper group relative",{"ae-block--drag-over":e.unref(t).dragState.value.overId===l.block.id,"ae-block--dragging":e.unref(t).dragState.value.draggedId===l.block.id}]),onDragover:n[5]||(n[5]=i=>e.unref(t).onDragOver(l.block.id,i)),onDragleave:n[6]||(n[6]=i=>e.unref(t).onDragLeave()),onDrop:n[7]||(n[7]=e.withModifiers(i=>e.unref(t).onDrop(l.block.id),["prevent"]))},[e.unref(t).dragState.value.overId===l.block.id?(e.openBlock(),e.createElementBlock("div",ze)):e.createCommentVNode("",!0),e.createElementVNode("div",He,[e.createElementVNode("button",{class:"ae-drag-handle cursor-grab active:cursor-grabbing w-5 h-6 flex items-center justify-center text-gray-400 hover:text-gray-600 rounded hover:bg-gray-100",draggable:"true",title:"Drag to reorder",onMousedown:n[0]||(n[0]=e.withModifiers(()=>{},["stop"])),onDragstart:n[1]||(n[1]=i=>e.unref(t).onDragStart(l.block.id,i)),onDragend:n[2]||(n[2]=i=>e.unref(t).onDragEnd())},[...n[8]||(n[8]=[e.createStaticVNode('<svg width="10" height="16" viewBox="0 0 10 16" fill="currentColor"><circle cx="3" cy="3" r="1.5"></circle><circle cx="7" cy="3" r="1.5"></circle><circle cx="3" cy="8" r="1.5"></circle><circle cx="7" cy="8" r="1.5"></circle><circle cx="3" cy="13" r="1.5"></circle><circle cx="7" cy="13" r="1.5"></circle></svg>',1)])],32)]),e.createElementVNode("div",Re,[e.renderSlot(o.$slots,"default")]),e.createElementVNode("div",ve,[e.createElementVNode("button",{class:"ae-btn-add w-6 h-6 flex items-center justify-center text-gray-400 hover:text-green-600 hover:bg-green-50 rounded text-lg leading-none",title:"Add block below",onMousedown:n[3]||(n[3]=e.withModifiers(i=>e.unref(t).addBlockAfter(l.block.id,"paragraph"),["prevent"]))}," + ",32),e.createElementVNode("button",{class:"ae-btn-delete w-6 h-6 flex items-center justify-center text-gray-400 hover:text-red-600 hover:bg-red-50 rounded text-sm leading-none",title:"Delete block",onMousedown:n[4]||(n[4]=e.withModifiers(i=>e.unref(t).removeBlock(l.block.id),["prevent"]))}," × ",32)])],34))}}),Ke=e.defineComponent({__name:"TextBlock",props:{block:{}},setup(l){const t=l,o=e.inject("alienEditor"),n=e.ref(null);let i=null,f=!1;e.onMounted(()=>{n.value&&n.value.innerHTML!==t.block.html&&(n.value.innerHTML=t.block.html)}),e.watch(()=>t.block.html,r=>{n.value&&!f&&n.value.innerHTML!==r&&(n.value.innerHTML=r)});function u(){n.value&&(f=!0,o.updateBlock(t.block.id,{html:n.value.innerHTML}),f=!1,i&&clearTimeout(i),i=setTimeout(()=>{o.pushSnapshot()},500))}function m(r){var d;if(r.key==="Enter"&&!r.shiftKey){r.preventDefault();const s=o.addBlockAfter(t.block.id,"paragraph");e.nextTick(()=>{const p=document.querySelector(`[data-block-id="${s}"]`);p==null||p.focus()});return}if(r.key==="Backspace"&&((d=n.value)==null?void 0:d.innerHTML)===""){r.preventDefault();const s=o.blocks.value,p=s.findIndex(x=>x.id===t.block.id),b=p>0?s[p-1].id:null;o.removeBlock(t.block.id),b&&e.nextTick(()=>{const x=document.querySelector(`[data-block-id="${b}"]`);x==null||x.focus()})}}function c(){o.activeBlockId.value=t.block.id}return(r,d)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(l.block.type==="blockquote"?"blockquote":"p"),{ref_key:"el",ref:n,"data-block-id":l.block.id,"data-placeholder":e.unref(o).placeholder||"Type something...",contenteditable:"true",spellcheck:"true",class:e.normalizeClass(["ae-text-block outline-none min-h-[1.5em] w-full",[l.block.align!=="left"?`text-${l.block.align}`:"",...l.block.classes,l.block.type==="blockquote"?"border-l-4 border-gray-300 pl-4 italic text-gray-600":""]]),onInput:u,onKeydown:m,onFocus:c,onMousedown:d[0]||(d[0]=s=>e.unref(o).saveSelection()),onKeyup:d[1]||(d[1]=s=>e.unref(o).saveSelection())},null,40,["data-block-id","data-placeholder","class"]))}}),qe={class:"ae-heading-block"},Oe={class:"ae-heading-level-selector flex gap-1 mb-1 opacity-0 focus-within:opacity-100 hover:opacity-100 transition-opacity"},_e=["onMousedown"],Pe=e.defineComponent({__name:"HeadingBlock",props:{block:{}},setup(l){const t=l,o=e.inject("alienEditor"),n=e.ref(null);let i=null,f=!1;const u={1:"text-5xl font-bold",2:"text-4xl font-bold",3:"text-3xl font-semibold",4:"text-2xl font-semibold",5:"text-xl font-medium",6:"text-lg font-medium"};e.onMounted(()=>{n.value&&n.value.innerHTML!==t.block.html&&(n.value.innerHTML=t.block.html)}),e.watch(()=>t.block.html,s=>{n.value&&!f&&n.value.innerHTML!==s&&(n.value.innerHTML=s)});function m(){n.value&&(f=!0,o.updateBlock(t.block.id,{html:n.value.innerHTML}),f=!1,i&&clearTimeout(i),i=setTimeout(()=>o.pushSnapshot(),500))}function c(s){var p;if(s.key==="Enter"&&!s.shiftKey){s.preventDefault();const b=o.addBlockAfter(t.block.id,"paragraph");e.nextTick(()=>{const x=document.querySelector(`[data-block-id="${b}"]`);x==null||x.focus()})}if(s.key==="Backspace"&&((p=n.value)==null?void 0:p.innerHTML)===""){s.preventDefault();const b=o.blocks.value,x=b.findIndex(M=>M.id===t.block.id),S=x>0?b[x-1].id:null;o.removeBlock(t.block.id),S&&e.nextTick(()=>{const M=document.querySelector(`[data-block-id="${S}"]`);M==null||M.focus()})}}function r(){o.activeBlockId.value=t.block.id}function d(s){o.pushSnapshot(),o.updateBlock(t.block.id,{level:s})}return(s,p)=>(e.openBlock(),e.createElementBlock("div",qe,[e.createElementVNode("div",Oe,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList([1,2,3,4,5,6],b=>e.createElementVNode("button",{key:b,class:e.normalizeClass(["text-xs px-1.5 py-0.5 rounded border transition-colors",l.block.level===b?"bg-gray-800 text-white border-gray-800":"border-gray-300 text-gray-500 hover:border-gray-500"]),onMousedown:e.withModifiers(x=>d(b),["prevent"])}," H"+e.toDisplayString(b),43,_e)),64))]),(e.openBlock(),e.createBlock(e.resolveDynamicComponent(`h${l.block.level}`),{ref_key:"el",ref:n,"data-block-id":l.block.id,"data-placeholder":`Heading ${l.block.level}`,contenteditable:"true",spellcheck:"true",class:e.normalizeClass(["ae-heading-content outline-none min-h-[1.2em] w-full",[u[l.block.level],l.block.align!=="left"?`text-${l.block.align}`:"",...l.block.classes]]),onInput:m,onKeydown:c,onFocus:r,onMousedown:p[0]||(p[0]=b=>e.unref(o).saveSelection()),onKeyup:p[1]||(p[1]=b=>e.unref(o).saveSelection())},null,40,["data-block-id","data-placeholder","class"]))]))}}),We=["onInput","onKeydown"],Je=e.defineComponent({__name:"ListBlock",props:{block:{}},setup(l){const t=l,o=e.inject("alienEditor"),n=e.ref([]);function i(c,r){c&&(n.value[r]=c)}function f(c,r){const d=r.target,s=[...t.block.items];s[c]=d.innerHTML,o.updateBlock(t.block.id,{items:s})}function u(c,r){const d=t.block.items;if(r.key==="Enter"&&!r.shiftKey){r.preventDefault(),o.pushSnapshot();const s=[...d];s.splice(c+1,0,""),o.updateBlock(t.block.id,{items:s}),e.nextTick(()=>{var p;(p=n.value[c+1])==null||p.focus()});return}if(r.key==="Backspace"){const s=r.target;if(s.innerHTML===""&&d.length>1){r.preventDefault(),o.pushSnapshot();const p=[...d];p.splice(c,1),o.updateBlock(t.block.id,{items:p}),e.nextTick(()=>{var x;const b=Math.max(0,c-1);(x=n.value[b])==null||x.focus()})}else if(s.innerHTML===""&&d.length===1){r.preventDefault(),o.pushSnapshot();const p=o.addBlockAfter(t.block.id,"paragraph");o.removeBlock(t.block.id),e.nextTick(()=>{const b=document.querySelector(`[data-block-id="${p}"]`);b==null||b.focus()})}}}function m(){o.activeBlockId.value=t.block.id}return(c,r)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(l.block.type==="ordered-list"?"ol":"ul"),{class:e.normalizeClass(["ae-list-block pl-6",l.block.type==="ordered-list"?"list-decimal":"list-disc"])},{default:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(l.block.items,(d,s)=>(e.openBlock(),e.createElementBlock("li",{key:s,ref_for:!0,ref:p=>i(p,s),contenteditable:"true",spellcheck:"true",class:"outline-none min-h-[1.5em]","data-placeholder":"List item",onInput:p=>f(s,p),onKeydown:p=>u(s,p),onFocus:m,onMousedown:r[0]||(r[0]=p=>e.unref(o).saveSelection()),onKeyup:r[1]||(r[1]=p=>e.unref(o).saveSelection())},null,40,We))),128))]),_:1},8,["class"]))}}),Xe={class:"ae-image-block"},Ye={key:0,class:"relative group/img"},Ze=["src","alt"],Ge={class:"absolute inset-0 bg-black/0 group-hover/img:bg-black/20 transition-colors rounded flex items-center justify-center gap-2 opacity-0 group-hover/img:opacity-100"},Qe=["value"],et={key:1,class:"ae-image-empty border-2 border-dashed border-gray-300 rounded-lg p-8 flex flex-col items-center gap-3 bg-gray-50"},tt={class:"flex gap-2"},ot={key:0,class:"w-full flex gap-2"},nt=e.defineComponent({__name:"ImageBlock",props:{block:{}},setup(l){const t=l,o=e.inject("alienEditor"),n=e.ref(""),i=e.ref(null),f=e.ref(!1);function u(s){var x;const p=(x=s.target.files)==null?void 0:x[0];if(!p)return;o.onUpload(p);const b=URL.createObjectURL(p);o.updateBlock(t.block.id,{src:b,alt:p.name}),o.pushSnapshot()}function m(){const s=n.value.trim();s&&(o.pushSnapshot(),o.updateBlock(t.block.id,{src:s}),f.value=!1,n.value="")}function c(s){s.key==="Enter"&&m(),s.key==="Escape"&&(f.value=!1,n.value="")}function r(s){o.updateBlock(t.block.id,{alt:s.target.value})}function d(){o.pushSnapshot(),o.updateBlock(t.block.id,{src:""})}return(s,p)=>(e.openBlock(),e.createElementBlock("div",Xe,[l.block.src?(e.openBlock(),e.createElementBlock("div",Ye,[e.createElementVNode("img",{src:l.block.src,alt:l.block.alt,class:e.normalizeClass(["max-w-full rounded",l.block.classes])},null,10,Ze),e.createElementVNode("div",Ge,[e.createElementVNode("button",{class:"bg-white text-gray-700 text-xs px-2 py-1 rounded shadow hover:bg-gray-100",onMousedown:e.withModifiers(d,["prevent"])}," Replace ",32)]),e.createElementVNode("input",{type:"text",value:l.block.alt,placeholder:"Alt text (optional)",class:"mt-1 w-full text-sm text-gray-500 border-0 border-b border-gray-200 outline-none focus:border-gray-400 bg-transparent",onChange:r,onMousedown:p[0]||(p[0]=e.withModifiers(()=>{},["stop"]))},null,40,Qe)])):(e.openBlock(),e.createElementBlock("div",et,[p[5]||(p[5]=e.createElementVNode("svg",{class:"w-10 h-10 text-gray-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z"})],-1)),p[6]||(p[6]=e.createElementVNode("p",{class:"text-sm text-gray-500"},"Upload an image or paste a URL",-1)),e.createElementVNode("div",tt,[e.createElementVNode("button",{class:"text-sm px-3 py-1.5 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors",onMousedown:p[1]||(p[1]=e.withModifiers(b=>{var x;return(x=i.value)==null?void 0:x.click()},["prevent"]))}," Upload file ",32),e.createElementVNode("button",{class:"text-sm px-3 py-1.5 border border-gray-300 rounded hover:bg-gray-100 transition-colors",onMousedown:p[2]||(p[2]=e.withModifiers(b=>f.value=!f.value,["prevent"]))}," Paste URL ",32)]),f.value?(e.openBlock(),e.createElementBlock("div",ot,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":p[3]||(p[3]=b=>n.value=b),type:"url",placeholder:"https://example.com/image.jpg",class:"flex-1 text-sm border border-gray-300 rounded px-3 py-1.5 outline-none focus:border-blue-500",onKeydown:c,onMousedown:p[4]||(p[4]=e.withModifiers(()=>{},["stop"]))},null,544),[[e.vModelText,n.value]]),e.createElementVNode("button",{class:"text-sm px-3 py-1.5 bg-blue-600 text-white rounded hover:bg-blue-700",onMousedown:e.withModifiers(m,["prevent"])}," Insert ",32)])):e.createCommentVNode("",!0),e.createElementVNode("input",{ref_key:"fileInput",ref:i,type:"file",accept:"image/*",class:"hidden",onChange:u},null,544)]))]))}}),lt={class:"ae-video-block"},rt={key:0,class:"relative group/vid"},at=["src"],it={key:1,class:"ae-video-empty border-2 border-dashed border-gray-300 rounded-lg p-8 flex flex-col items-center gap-3 bg-gray-50"},st={class:"w-full flex gap-2"},dt=e.defineComponent({__name:"VideoBlock",props:{block:{}},setup(l){const t=l,o=e.inject("alienEditor"),n=e.ref("");function i(){const m=n.value.trim();m&&(o.pushSnapshot(),o.updateBlock(t.block.id,{src:m}),n.value="")}function f(m){m.key==="Enter"&&i()}function u(){o.pushSnapshot(),o.updateBlock(t.block.id,{src:""})}return(m,c)=>(e.openBlock(),e.createElementBlock("div",lt,[l.block.src?(e.openBlock(),e.createElementBlock("div",rt,[e.createElementVNode("video",{src:l.block.src,controls:"",class:e.normalizeClass(["w-full rounded",l.block.classes])},null,10,at),e.createElementVNode("button",{class:"absolute top-2 right-2 bg-red-600 text-white text-xs px-2 py-1 rounded opacity-0 group-hover/vid:opacity-100 transition-opacity",onMousedown:e.withModifiers(u,["prevent"])}," Remove ",32)])):(e.openBlock(),e.createElementBlock("div",it,[c[2]||(c[2]=e.createElementVNode("svg",{class:"w-10 h-10 text-gray-400",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24"},[e.createElementVNode("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"1.5",d:"M15 10l4.553-2.069A1 1 0 0121 8.87v6.26a1 1 0 01-1.447.894L15 14M5 18h8a2 2 0 002-2V8a2 2 0 00-2-2H5a2 2 0 00-2 2v8a2 2 0 002 2z"})],-1)),c[3]||(c[3]=e.createElementVNode("p",{class:"text-sm text-gray-500"},"Paste a video URL",-1)),e.createElementVNode("div",st,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":c[0]||(c[0]=r=>n.value=r),type:"url",placeholder:"https://example.com/video.mp4",class:"flex-1 text-sm border border-gray-300 rounded px-3 py-1.5 outline-none focus:border-blue-500",onKeydown:f,onMousedown:c[1]||(c[1]=e.withModifiers(()=>{},["stop"]))},null,544),[[e.vModelText,n.value]]),e.createElementVNode("button",{class:"text-sm px-3 py-1.5 bg-blue-600 text-white rounded hover:bg-blue-700",onMousedown:e.withModifiers(i,["prevent"])}," Insert ",32)])]))]))}}),ct={class:"ae-code-block bg-gray-900 rounded-lg overflow-hidden"},pt={class:"flex items-center justify-between px-4 py-2 bg-gray-800 border-b border-gray-700"},ft=["value"],ut=["value"],mt=["value"],gt=e.defineComponent({__name:"CodeBlock",props:{block:{}},setup(l){const t=l,o=e.inject("alienEditor"),n=["plaintext","javascript","typescript","html","css","scss","python","ruby","php","java","go","rust","c","cpp","json","yaml","markdown","bash","shell","sql"];function i(m){o.updateBlock(t.block.id,{code:m.target.value})}function f(m){o.pushSnapshot(),o.updateBlock(t.block.id,{language:m.target.value})}function u(){o.activeBlockId.value=t.block.id}return(m,c)=>(e.openBlock(),e.createElementBlock("div",ct,[e.createElementVNode("div",pt,[e.createElementVNode("select",{value:l.block.language,class:"bg-transparent text-gray-300 text-xs outline-none cursor-pointer",onChange:f,onMousedown:c[0]||(c[0]=e.withModifiers(()=>{},["stop"]))},[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList(n,r=>e.createElementVNode("option",{key:r,value:r,class:"bg-gray-800"},e.toDisplayString(r),9,ut)),64))],40,ft),c[2]||(c[2]=e.createElementVNode("div",{class:"flex gap-1.5"},[e.createElementVNode("div",{class:"w-3 h-3 rounded-full bg-red-500 opacity-70"}),e.createElementVNode("div",{class:"w-3 h-3 rounded-full bg-yellow-500 opacity-70"}),e.createElementVNode("div",{class:"w-3 h-3 rounded-full bg-green-500 opacity-70"})],-1))]),e.createElementVNode("textarea",{value:l.block.code,class:"w-full bg-gray-900 text-gray-100 font-mono text-sm p-4 outline-none resize-none min-h-[120px] leading-relaxed",placeholder:"// Enter your code here...",spellcheck:"false",autocomplete:"off",autocorrect:"off",autocapitalize:"off",onInput:i,onFocus:u,onMousedown:c[1]||(c[1]=e.withModifiers(()=>{},["stop"]))},null,40,mt)]))}}),bt=e.defineComponent({__name:"DividerBlock",props:{block:{}},setup(l){return(t,o)=>(e.openBlock(),e.createElementBlock("hr",{class:e.normalizeClass(["ae-divider border-t border-gray-300 my-2 w-full",l.block.classes])},null,2))}}),kt={class:"ae-button-block"},xt={key:0,class:"flex flex-col gap-2 p-3 border border-gray-200 rounded-lg bg-gray-50"},yt={class:"flex gap-2"},ht={class:"flex gap-2 justify-end"},wt={key:1,class:"flex items-center gap-2"},Bt=["href"],Et=e.defineComponent({__name:"ButtonBlock",props:{block:{}},setup(l){const t=l,o=e.inject("alienEditor"),n=e.ref(!1),i=e.ref(t.block.label),f=e.ref(t.block.href);function u(){i.value=t.block.label,f.value=t.block.href,n.value=!0}function m(){o.pushSnapshot(),o.updateBlock(t.block.id,{label:i.value,href:f.value}),n.value=!1}function c(){n.value=!1}function r(d){d.key==="Enter"&&m(),d.key==="Escape"&&c()}return(d,s)=>(e.openBlock(),e.createElementBlock("div",kt,[n.value?(e.openBlock(),e.createElementBlock("div",xt,[e.createElementVNode("div",yt,[e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":s[0]||(s[0]=p=>i.value=p),type:"text",placeholder:"Button label",class:"flex-1 text-sm border border-gray-300 rounded px-3 py-1.5 outline-none focus:border-blue-500",onKeydown:r,onMousedown:s[1]||(s[1]=e.withModifiers(()=>{},["stop"]))},null,544),[[e.vModelText,i.value]]),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":s[2]||(s[2]=p=>f.value=p),type:"url",placeholder:"https://...",class:"flex-1 text-sm border border-gray-300 rounded px-3 py-1.5 outline-none focus:border-blue-500",onKeydown:r,onMousedown:s[3]||(s[3]=e.withModifiers(()=>{},["stop"]))},null,544),[[e.vModelText,f.value]])]),e.createElementVNode("div",ht,[e.createElementVNode("button",{class:"text-sm px-3 py-1 border border-gray-300 rounded hover:bg-gray-100",onMousedown:e.withModifiers(c,["prevent"])}," Cancel ",32),e.createElementVNode("button",{class:"text-sm px-3 py-1 bg-blue-600 text-white rounded hover:bg-blue-700",onMousedown:e.withModifiers(m,["prevent"])}," Save ",32)])])):(e.openBlock(),e.createElementBlock("div",wt,[e.createElementVNode("a",{href:l.block.href,class:e.normalizeClass(["inline-block",l.block.classes.length?l.block.classes:["px-4","py-2","bg-blue-600","text-white","rounded","hover:bg-blue-700","transition-colors"]]),onClick:s[4]||(s[4]=e.withModifiers(()=>{},["prevent"]))},e.toDisplayString(l.block.label),11,Bt),e.createElementVNode("button",{class:"text-xs text-gray-400 hover:text-gray-600 underline",onMousedown:e.withModifiers(u,["prevent"])}," Edit ",32)]))]))}}),Nt=e.defineComponent({__name:"ModuleBlock",props:{block:{}},setup(l){const t=l,o=e.inject("alienEditor"),n=e.ref(null);let i=null,f=!1;e.onMounted(()=>{n.value&&n.value.innerHTML!==t.block.html&&(n.value.innerHTML=t.block.html)}),e.watch(()=>t.block.html,c=>{n.value&&!f&&n.value.innerHTML!==c&&(n.value.innerHTML=c)});function u(){n.value&&(f=!0,o.updateBlock(t.block.id,{html:n.value.innerHTML}),f=!1,i&&clearTimeout(i),i=setTimeout(()=>{o.pushSnapshot()},500))}function m(){o.activeBlockId.value=t.block.id}return(c,r)=>(e.openBlock(),e.createElementBlock("div",{ref_key:"el",ref:n,class:"ae-module-block outline-none",contenteditable:"true",spellcheck:"true",onInput:u,onFocus:m,onMousedown:r[0]||(r[0]=d=>e.unref(o).saveSelection()),onKeyup:r[1]||(r[1]=d=>e.unref(o).saveSelection())},null,544))}}),Vt={class:"ae-block-list"},Mt=e.defineComponent({__name:"BlockList",setup(l){const t=e.inject("alienEditor");return(o,n)=>(e.openBlock(),e.createElementBlock("div",Vt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(t).blocks.value,i=>(e.openBlock(),e.createBlock(Fe,{key:i.id,block:i},{default:e.withCtx(()=>[i.type==="paragraph"||i.type==="blockquote"?(e.openBlock(),e.createBlock(Ke,{key:0,block:i},null,8,["block"])):i.type==="heading"?(e.openBlock(),e.createBlock(Pe,{key:1,block:i},null,8,["block"])):i.type==="ordered-list"||i.type==="unordered-list"?(e.openBlock(),e.createBlock(Je,{key:2,block:i},null,8,["block"])):i.type==="image"?(e.openBlock(),e.createBlock(nt,{key:3,block:i},null,8,["block"])):i.type==="video"?(e.openBlock(),e.createBlock(dt,{key:4,block:i},null,8,["block"])):i.type==="code"?(e.openBlock(),e.createBlock(gt,{key:5,block:i},null,8,["block"])):i.type==="divider"?(e.openBlock(),e.createBlock(bt,{key:6,block:i},null,8,["block"])):i.type==="button"?(e.openBlock(),e.createBlock(Et,{key:7,block:i},null,8,["block"])):i.type==="module"?(e.openBlock(),e.createBlock(Nt,{key:8,block:i},null,8,["block"])):e.createCommentVNode("",!0)]),_:2},1032,["block"]))),128))]))}}),$t={class:"space-y-3"},Ct={class:"flex gap-3 justify-end mt-6"},It=["disabled"],St=e.defineComponent({__name:"LinkModal",setup(l){const t=e.inject("alienEditor"),o=K(t.savedRange),n=e.ref(""),i=e.ref("");e.watch(t.showLinkModal,c=>{c&&(n.value="",i.value="")});function f(){n.value.trim()&&(t.linkModalCallback.value?t.linkModalCallback.value(n.value.trim(),i.value.trim()):(t.pushSnapshot(),o.insertLink(n.value.trim(),i.value.trim())),u())}function u(){t.showLinkModal.value=!1,n.value="",i.value=""}function m(c){c.key==="Enter"&&f(),c.key==="Escape"&&u()}return(c,r)=>(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[e.unref(t).showLinkModal.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"ae-modal-overlay fixed inset-0 bg-black/50 flex items-center justify-center z-[9999]",onMousedown:e.withModifiers(u,["self"])},[e.createElementVNode("div",{class:"ae-modal bg-white rounded-xl shadow-2xl p-6 w-full max-w-md mx-4",onMousedown:r[2]||(r[2]=e.withModifiers(()=>{},["stop"]))},[r[5]||(r[5]=e.createElementVNode("h3",{class:"text-lg font-semibold text-gray-900 mb-4"},"Insert Link",-1)),e.createElementVNode("div",$t,[e.createElementVNode("div",null,[r[3]||(r[3]=e.createElementVNode("label",{class:"block text-sm font-medium text-gray-700 mb-1"},"URL",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":r[0]||(r[0]=d=>n.value=d),type:"url",placeholder:"https://example.com",class:"w-full border border-gray-300 rounded-lg px-3 py-2 text-sm outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500",onKeydown:m},null,544),[[e.vModelText,n.value]])]),e.createElementVNode("div",null,[r[4]||(r[4]=e.createElementVNode("label",{class:"block text-sm font-medium text-gray-700 mb-1"},"Link text (optional)",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":r[1]||(r[1]=d=>i.value=d),type:"text",placeholder:"Leave empty to use URL as text",class:"w-full border border-gray-300 rounded-lg px-3 py-2 text-sm outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500",onKeydown:m},null,544),[[e.vModelText,i.value]])])]),e.createElementVNode("div",Ct,[e.createElementVNode("button",{class:"px-4 py-2 text-sm border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors",onClick:u}," Cancel "),e.createElementVNode("button",{class:"px-4 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors",disabled:!n.value.trim(),onClick:f}," Insert Link ",8,It)])],32)],32)):e.createCommentVNode("",!0)]))}}),Lt={class:"flex gap-3 justify-end mt-6"},Tt=["disabled"],At=e.defineComponent({__name:"ImageUrlModal",setup(l){const t=e.inject("alienEditor"),o=e.ref("");e.watch(t.showImageUrlModal,u=>{u&&(o.value="")});function n(){if(o.value.trim()){if(t.imageUrlCallback.value)t.imageUrlCallback.value(o.value.trim());else{const u=t.activeBlockId.value;u?t.addBlockAfter(u,"image",{src:o.value.trim()}):t.addBlockAt(t.blocks.value.length,"image",{src:o.value.trim()})}i()}}function i(){t.showImageUrlModal.value=!1,o.value=""}function f(u){u.key==="Enter"&&n(),u.key==="Escape"&&i()}return(u,m)=>(e.openBlock(),e.createBlock(e.Teleport,{to:"body"},[e.unref(t).showImageUrlModal.value?(e.openBlock(),e.createElementBlock("div",{key:0,class:"ae-modal-overlay fixed inset-0 bg-black/50 flex items-center justify-center z-[9999]",onMousedown:e.withModifiers(i,["self"])},[e.createElementVNode("div",{class:"ae-modal bg-white rounded-xl shadow-2xl p-6 w-full max-w-md mx-4",onMousedown:m[1]||(m[1]=e.withModifiers(()=>{},["stop"]))},[m[3]||(m[3]=e.createElementVNode("h3",{class:"text-lg font-semibold text-gray-900 mb-4"},"Insert Image URL",-1)),e.createElementVNode("div",null,[m[2]||(m[2]=e.createElementVNode("label",{class:"block text-sm font-medium text-gray-700 mb-1"},"Image URL",-1)),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":m[0]||(m[0]=c=>o.value=c),type:"url",placeholder:"https://example.com/image.jpg",class:"w-full border border-gray-300 rounded-lg px-3 py-2 text-sm outline-none focus:border-blue-500 focus:ring-1 focus:ring-blue-500",onKeydown:f},null,544),[[e.vModelText,o.value]])]),e.createElementVNode("div",Lt,[e.createElementVNode("button",{class:"px-4 py-2 text-sm border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors",onClick:i}," Cancel "),e.createElementVNode("button",{class:"px-4 py-2 text-sm bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors",disabled:!o.value.trim(),onClick:n}," Insert Image ",8,Tt)])],32)],32)):e.createCommentVNode("",!0)]))}}),Dt={class:"alien-editor ae-root border border-gray-200 rounded-xl bg-white shadow-sm"},jt={key:0,class:"ae-edit-area min-h-[300px] px-8 py-6"},Ut={key:1,class:"ae-code-mode bg-gray-950 min-h-[300px] p-6"},zt=["value"],Ht={key:2,class:"ae-preview-mode min-h-[300px] px-8 py-6 prose prose-gray max-w-none"},Rt=["innerHTML"],vt={key:1,class:"text-gray-400 italic"},W=e.defineComponent({__name:"AlienEditor",props:{modelValue:{default:""},placeholder:{default:"Start writing..."},colors:{default:()=>[]},modules:{default:()=>[]}},emits:["update:modelValue","upload"],setup(l,{emit:t}){const o=l,n=t,{blocks:i,mode:f,activeBlockId:u,savedRange:m}=Y(),{pushSnapshot:c,undo:r,redo:d,canUndo:s,canRedo:p}=G(i),{saveSelection:b,restoreSelection:x}=_(m),{addBlockAfter:S,addBlockAt:M,removeBlock:w,moveBlock:k,updateBlock:E}=te(i,c),{dragState:B,onDragStart:y,onDragOver:a,onDragLeave:g,onDrop:$,onDragEnd:z}=oe(i,k),{serialize:Kt}=ne(),{parse:q}=re(),qt=e.ref(!1),Ot=e.ref(!1),_t=e.ref(null),Pt=e.ref(null),U=e.computed(()=>Kt(i.value)),H=e.ref("");let D=null;e.watch(f,(h,C)=>{h==="code"?H.value=U.value:C==="code"&&(D&&(clearTimeout(D),D=null),i.value=q(H.value))});function Wt(h){const C=h.target.value;H.value=C,D&&clearTimeout(D),D=setTimeout(()=>{c(),i.value=q(C)},300)}let O=!1;function J(h){const C=q(h);i.value=C}e.onMounted(()=>{J(o.modelValue||""),O=!0}),e.watch(U,h=>{O&&n("update:modelValue",h)}),e.watch(()=>o.modelValue,h=>{if(!O)return;const C=U.value;h!==C&&J(h||"")});function X(h){(h.ctrlKey||h.metaKey)&&h.key==="z"&&!h.shiftKey&&(h.preventDefault(),r()),(h.ctrlKey||h.metaKey)&&(h.key==="y"||h.shiftKey&&h.key==="z")&&(h.preventDefault(),d())}e.onMounted(()=>document.addEventListener("keydown",X)),e.onUnmounted(()=>document.removeEventListener("keydown",X));const Jt={blocks:i,mode:f,activeBlockId:u,savedRange:m,colors:o.colors,modules:o.modules,placeholder:o.placeholder,pushSnapshot:c,undo:r,redo:d,canUndo:s,canRedo:p,updateBlock:E,addBlockAfter:S,addBlockAt:M,removeBlock:w,moveBlock:k,saveSelection:b,restoreSelection:x,onUpload:h=>n("upload",h),showLinkModal:qt,showImageUrlModal:Ot,linkModalCallback:_t,imageUrlCallback:Pt,dragState:B,onDragStart:y,onDragOver:a,onDragLeave:g,onDrop:$,onDragEnd:z};return e.provide("alienEditor",Jt),(h,C)=>(e.openBlock(),e.createElementBlock("div",Dt,[e.createVNode(Ue),e.unref(f)==="edit"?(e.openBlock(),e.createElementBlock("div",jt,[e.createVNode(Mt)])):e.unref(f)==="code"?(e.openBlock(),e.createElementBlock("div",Ut,[e.createElementVNode("textarea",{class:"w-full bg-transparent text-green-400 font-mono text-sm leading-relaxed resize-y outline-none min-h-[276px] whitespace-pre",value:H.value,onInput:Wt,spellcheck:"false",autocomplete:"off",autocorrect:"off",autocapitalize:"off"},null,40,zt)])):(e.openBlock(),e.createElementBlock("div",Ht,[U.value?(e.openBlock(),e.createElementBlock("div",{key:0,innerHTML:U.value},null,8,Rt)):(e.openBlock(),e.createElementBlock("p",vt,"Nothing to preview yet."))])),e.createVNode(St),e.createVNode(At)]))}}),Ft={install(l){l.component("AlienEditor",W)}};I.AlienEditor=W,I.default=Ft,Object.defineProperties(I,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
@@ -0,0 +1,8 @@
1
+ import { App } from 'vue';
2
+ import { default as AlienEditor } from './src/components/AlienEditor.vue';
3
+ export { AlienEditor };
4
+ export * from './src/types/index';
5
+ declare const _default: {
6
+ install(app: App): void;
7
+ };
8
+ export default _default;
package/dist/nuxt.cjs ADDED
@@ -0,0 +1 @@
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const e=require("@nuxt/kit"),t=e.defineNuxtModule({meta:{name:"alien-editor",configKey:"alienEditor"},setup(){e.addComponent({name:"AlienEditor",export:"AlienEditor",filePath:"alien-editor"})}});exports.default=t;
package/dist/nuxt.js ADDED
@@ -0,0 +1,17 @@
1
+ import { defineNuxtModule as e, addComponent as t } from "@nuxt/kit";
2
+ const o = e({
3
+ meta: {
4
+ name: "alien-editor",
5
+ configKey: "alienEditor"
6
+ },
7
+ setup() {
8
+ t({
9
+ name: "AlienEditor",
10
+ export: "AlienEditor",
11
+ filePath: "alien-editor"
12
+ });
13
+ }
14
+ });
15
+ export {
16
+ o as default
17
+ };
@@ -0,0 +1,20 @@
1
+ import { ColorOption, ModuleOption } from '../types';
2
+ type __VLS_Props = {
3
+ modelValue?: string;
4
+ placeholder?: string;
5
+ colors?: ColorOption[];
6
+ modules?: ModuleOption[];
7
+ };
8
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
9
+ "update:modelValue": (value: string) => any;
10
+ upload: (file: File) => any;
11
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
12
+ "onUpdate:modelValue"?: ((value: string) => any) | undefined;
13
+ onUpload?: ((file: File) => any) | undefined;
14
+ }>, {
15
+ placeholder: string;
16
+ modelValue: string;
17
+ colors: ColorOption[];
18
+ modules: ModuleOption[];
19
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
20
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
+ export default _default;
@@ -0,0 +1,21 @@
1
+ import { Block } from '../../types';
2
+ type __VLS_Props = {
3
+ block: Block;
4
+ };
5
+ declare function __VLS_template(): {
6
+ attrs: Partial<{}>;
7
+ slots: {
8
+ default?(_: {}): any;
9
+ };
10
+ refs: {};
11
+ rootEl: HTMLDivElement;
12
+ };
13
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
14
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
15
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
16
+ export default _default;
17
+ type __VLS_WithTemplateSlots<T, S> = T & {
18
+ new (): {
19
+ $slots: S;
20
+ };
21
+ };
@@ -0,0 +1,6 @@
1
+ import { ButtonBlock } from '../../types';
2
+ type __VLS_Props = {
3
+ block: ButtonBlock;
4
+ };
5
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
6
+ export default _default;
@@ -0,0 +1,6 @@
1
+ import { CodeBlock } from '../../types';
2
+ type __VLS_Props = {
3
+ block: CodeBlock;
4
+ };
5
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
6
+ export default _default;
@@ -0,0 +1,6 @@
1
+ import { DividerBlock } from '../../types';
2
+ type __VLS_Props = {
3
+ block: DividerBlock;
4
+ };
5
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLHRElement>;
6
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import { HeadingBlock } from '../../types';
2
+ type __VLS_Props = {
3
+ block: HeadingBlock;
4
+ };
5
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
6
+ el: unknown;
7
+ }, HTMLDivElement>;
8
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import { ImageBlock } from '../../types';
2
+ type __VLS_Props = {
3
+ block: ImageBlock;
4
+ };
5
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
6
+ fileInput: HTMLInputElement;
7
+ }, HTMLDivElement>;
8
+ export default _default;
@@ -0,0 +1,6 @@
1
+ import { OrderedListBlock, UnorderedListBlock } from '../../types';
2
+ type __VLS_Props = {
3
+ block: OrderedListBlock | UnorderedListBlock;
4
+ };
5
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
6
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import { ModuleBlock } from '../../types';
2
+ type __VLS_Props = {
3
+ block: ModuleBlock;
4
+ };
5
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
6
+ el: HTMLDivElement;
7
+ }, HTMLDivElement>;
8
+ export default _default;
@@ -0,0 +1,8 @@
1
+ import { ParagraphBlock, BlockquoteBlock } from '../../types';
2
+ type __VLS_Props = {
3
+ block: ParagraphBlock | BlockquoteBlock;
4
+ };
5
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
6
+ el: unknown;
7
+ }, any>;
8
+ export default _default;
@@ -0,0 +1,6 @@
1
+ import { VideoBlock } from '../../types';
2
+ type __VLS_Props = {
3
+ block: VideoBlock;
4
+ };
5
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
6
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
+ export default _default;
@@ -0,0 +1,2 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, any>;
2
+ export default _default;
@@ -0,0 +1,26 @@
1
+ type __VLS_Props = {
2
+ title?: string;
3
+ active?: boolean;
4
+ disabled?: boolean;
5
+ };
6
+ declare function __VLS_template(): {
7
+ attrs: Partial<{}>;
8
+ slots: {
9
+ default?(_: {}): any;
10
+ };
11
+ refs: {};
12
+ rootEl: HTMLButtonElement;
13
+ };
14
+ type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
15
+ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
16
+ action: () => any;
17
+ }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
18
+ onAction?: (() => any) | undefined;
19
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLButtonElement>;
20
+ declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
21
+ export default _default;
22
+ type __VLS_WithTemplateSlots<T, S> = T & {
23
+ new (): {
24
+ $slots: S;
25
+ };
26
+ };
@@ -0,0 +1,13 @@
1
+ import { Ref } from 'vue';
2
+ import { Block, BlockType } from '../types';
3
+ declare function generateId(): string;
4
+ declare function createDefaultBlock(type: BlockType, overrides?: Partial<Block>): Block;
5
+ export declare function useBlocks(blocks: Ref<Block[]>, pushSnapshot: () => void): {
6
+ addBlockAfter: (afterId: string, type: BlockType, overrides?: Partial<Block>) => string;
7
+ addBlockAt: (index: number, type: BlockType, overrides?: Partial<Block>) => string;
8
+ removeBlock: (id: string) => void;
9
+ moveBlock: (fromId: string, toId: string) => void;
10
+ updateBlock: (id: string, patch: Partial<Block>) => void;
11
+ createDefaultBlock: typeof createDefaultBlock;
12
+ };
13
+ export { createDefaultBlock, generateId };
@@ -0,0 +1,16 @@
1
+ import { Ref } from 'vue';
2
+ import { Block, DragState } from '../types';
3
+ export declare function useDragDrop(blocks: Ref<Block[]>, moveBlock: (fromId: string, toId: string) => void): {
4
+ dragState: Ref<{
5
+ draggedId: string | null;
6
+ overId: string | null;
7
+ }, DragState | {
8
+ draggedId: string | null;
9
+ overId: string | null;
10
+ }>;
11
+ onDragStart: (blockId: string, event: DragEvent) => void;
12
+ onDragOver: (blockId: string, event: DragEvent) => void;
13
+ onDragLeave: () => void;
14
+ onDrop: (targetId: string) => void;
15
+ onDragEnd: () => void;
16
+ };
@@ -0,0 +1,191 @@
1
+ import { Block, EditorMode } from '../types';
2
+ export declare function useEditorState(): {
3
+ blocks: import('vue').Ref<({
4
+ type: "paragraph";
5
+ html: string;
6
+ align: import('../types').TextAlign;
7
+ classes: string[];
8
+ id: string;
9
+ } | {
10
+ type: "blockquote";
11
+ html: string;
12
+ align: import('../types').TextAlign;
13
+ classes: string[];
14
+ id: string;
15
+ } | {
16
+ type: "heading";
17
+ level: import('../types').HeadingLevel;
18
+ html: string;
19
+ align: import('../types').TextAlign;
20
+ classes: string[];
21
+ id: string;
22
+ } | {
23
+ type: "ordered-list";
24
+ items: string[];
25
+ id: string;
26
+ } | {
27
+ type: "unordered-list";
28
+ items: string[];
29
+ id: string;
30
+ } | {
31
+ type: "image";
32
+ src: string;
33
+ alt: string;
34
+ classes: string[];
35
+ id: string;
36
+ } | {
37
+ type: "video";
38
+ src: string;
39
+ classes: string[];
40
+ id: string;
41
+ } | {
42
+ type: "code";
43
+ code: string;
44
+ language: string;
45
+ id: string;
46
+ } | {
47
+ type: "divider";
48
+ classes: string[];
49
+ id: string;
50
+ } | {
51
+ type: "button";
52
+ label: string;
53
+ href: string;
54
+ classes: string[];
55
+ id: string;
56
+ } | {
57
+ type: "module";
58
+ html: string;
59
+ id: string;
60
+ })[], Block[] | ({
61
+ type: "paragraph";
62
+ html: string;
63
+ align: import('../types').TextAlign;
64
+ classes: string[];
65
+ id: string;
66
+ } | {
67
+ type: "blockquote";
68
+ html: string;
69
+ align: import('../types').TextAlign;
70
+ classes: string[];
71
+ id: string;
72
+ } | {
73
+ type: "heading";
74
+ level: import('../types').HeadingLevel;
75
+ html: string;
76
+ align: import('../types').TextAlign;
77
+ classes: string[];
78
+ id: string;
79
+ } | {
80
+ type: "ordered-list";
81
+ items: string[];
82
+ id: string;
83
+ } | {
84
+ type: "unordered-list";
85
+ items: string[];
86
+ id: string;
87
+ } | {
88
+ type: "image";
89
+ src: string;
90
+ alt: string;
91
+ classes: string[];
92
+ id: string;
93
+ } | {
94
+ type: "video";
95
+ src: string;
96
+ classes: string[];
97
+ id: string;
98
+ } | {
99
+ type: "code";
100
+ code: string;
101
+ language: string;
102
+ id: string;
103
+ } | {
104
+ type: "divider";
105
+ classes: string[];
106
+ id: string;
107
+ } | {
108
+ type: "button";
109
+ label: string;
110
+ href: string;
111
+ classes: string[];
112
+ id: string;
113
+ } | {
114
+ type: "module";
115
+ html: string;
116
+ id: string;
117
+ })[]>;
118
+ mode: import('vue').Ref<EditorMode, EditorMode>;
119
+ activeBlockId: import('vue').Ref<string | null, string | null>;
120
+ savedRange: import('vue').Ref<{
121
+ readonly commonAncestorContainer: Node;
122
+ cloneContents: () => DocumentFragment;
123
+ cloneRange: () => Range;
124
+ collapse: (toStart?: boolean) => void;
125
+ compareBoundaryPoints: (how: number, sourceRange: Range) => number;
126
+ comparePoint: (node: Node, offset: number) => number;
127
+ createContextualFragment: (string: string) => DocumentFragment;
128
+ deleteContents: () => void;
129
+ detach: () => void;
130
+ extractContents: () => DocumentFragment;
131
+ getBoundingClientRect: () => DOMRect;
132
+ getClientRects: () => DOMRectList;
133
+ insertNode: (node: Node) => void;
134
+ intersectsNode: (node: Node) => boolean;
135
+ isPointInRange: (node: Node, offset: number) => boolean;
136
+ selectNode: (node: Node) => void;
137
+ selectNodeContents: (node: Node) => void;
138
+ setEnd: (node: Node, offset: number) => void;
139
+ setEndAfter: (node: Node) => void;
140
+ setEndBefore: (node: Node) => void;
141
+ setStart: (node: Node, offset: number) => void;
142
+ setStartAfter: (node: Node) => void;
143
+ setStartBefore: (node: Node) => void;
144
+ surroundContents: (newParent: Node) => void;
145
+ toString: () => string;
146
+ readonly START_TO_START: 0;
147
+ readonly START_TO_END: 1;
148
+ readonly END_TO_END: 2;
149
+ readonly END_TO_START: 3;
150
+ readonly collapsed: boolean;
151
+ readonly endContainer: Node;
152
+ readonly endOffset: number;
153
+ readonly startContainer: Node;
154
+ readonly startOffset: number;
155
+ } | null, Range | {
156
+ readonly commonAncestorContainer: Node;
157
+ cloneContents: () => DocumentFragment;
158
+ cloneRange: () => Range;
159
+ collapse: (toStart?: boolean) => void;
160
+ compareBoundaryPoints: (how: number, sourceRange: Range) => number;
161
+ comparePoint: (node: Node, offset: number) => number;
162
+ createContextualFragment: (string: string) => DocumentFragment;
163
+ deleteContents: () => void;
164
+ detach: () => void;
165
+ extractContents: () => DocumentFragment;
166
+ getBoundingClientRect: () => DOMRect;
167
+ getClientRects: () => DOMRectList;
168
+ insertNode: (node: Node) => void;
169
+ intersectsNode: (node: Node) => boolean;
170
+ isPointInRange: (node: Node, offset: number) => boolean;
171
+ selectNode: (node: Node) => void;
172
+ selectNodeContents: (node: Node) => void;
173
+ setEnd: (node: Node, offset: number) => void;
174
+ setEndAfter: (node: Node) => void;
175
+ setEndBefore: (node: Node) => void;
176
+ setStart: (node: Node, offset: number) => void;
177
+ setStartAfter: (node: Node) => void;
178
+ setStartBefore: (node: Node) => void;
179
+ surroundContents: (newParent: Node) => void;
180
+ toString: () => string;
181
+ readonly START_TO_START: 0;
182
+ readonly START_TO_END: 1;
183
+ readonly END_TO_END: 2;
184
+ readonly END_TO_START: 3;
185
+ readonly collapsed: boolean;
186
+ readonly endContainer: Node;
187
+ readonly endOffset: number;
188
+ readonly startContainer: Node;
189
+ readonly startOffset: number;
190
+ } | null>;
191
+ };
@@ -0,0 +1,14 @@
1
+ import { Ref } from 'vue';
2
+ export declare function useFormatting(savedRange: Ref<Range | null>): {
3
+ wrapSelectionWithClass: (className: string) => HTMLSpanElement | undefined;
4
+ toggleClass: (className: string) => void;
5
+ applyBold: () => void;
6
+ applyItalic: () => void;
7
+ applyUnderline: () => void;
8
+ applyStrikethrough: () => void;
9
+ applyFontSize: (sizeKey: string) => void;
10
+ applyFontWeight: (weightKey: string) => void;
11
+ applyColor: (colorClass: string) => void;
12
+ insertLink: (href: string, text: string) => void;
13
+ isActive: (className: string) => boolean;
14
+ };
@@ -0,0 +1,9 @@
1
+ import { Ref } from 'vue';
2
+ import { Block } from '../types';
3
+ export declare function useHistory(blocks: Ref<Block[]>): {
4
+ pushSnapshot: () => void;
5
+ undo: () => void;
6
+ redo: () => void;
7
+ canUndo: () => boolean;
8
+ canRedo: () => boolean;
9
+ };