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.
- package/README.md +249 -0
- package/dist/alien-editor.js +2103 -0
- package/dist/alien-editor.umd.cjs +2 -0
- package/dist/index.d.ts +8 -0
- package/dist/nuxt.cjs +1 -0
- package/dist/nuxt.js +17 -0
- package/dist/src/components/AlienEditor.vue.d.ts +20 -0
- package/dist/src/components/blocks/BlockList.vue.d.ts +2 -0
- package/dist/src/components/blocks/BlockWrapper.vue.d.ts +21 -0
- package/dist/src/components/blocks/ButtonBlock.vue.d.ts +6 -0
- package/dist/src/components/blocks/CodeBlock.vue.d.ts +6 -0
- package/dist/src/components/blocks/DividerBlock.vue.d.ts +6 -0
- package/dist/src/components/blocks/HeadingBlock.vue.d.ts +8 -0
- package/dist/src/components/blocks/ImageBlock.vue.d.ts +8 -0
- package/dist/src/components/blocks/ListBlock.vue.d.ts +6 -0
- package/dist/src/components/blocks/ModuleBlock.vue.d.ts +8 -0
- package/dist/src/components/blocks/TextBlock.vue.d.ts +8 -0
- package/dist/src/components/blocks/VideoBlock.vue.d.ts +6 -0
- package/dist/src/components/modals/ImageUrlModal.vue.d.ts +2 -0
- package/dist/src/components/modals/LinkModal.vue.d.ts +2 -0
- package/dist/src/components/toolbar/AlienToolbar.vue.d.ts +2 -0
- package/dist/src/components/toolbar/ColorPicker.vue.d.ts +2 -0
- package/dist/src/components/toolbar/ModeToggle.vue.d.ts +2 -0
- package/dist/src/components/toolbar/ModuleDropdown.vue.d.ts +2 -0
- package/dist/src/components/toolbar/ToolbarButton.vue.d.ts +26 -0
- package/dist/src/composables/useBlocks.d.ts +13 -0
- package/dist/src/composables/useDragDrop.d.ts +16 -0
- package/dist/src/composables/useEditorState.d.ts +191 -0
- package/dist/src/composables/useFormatting.d.ts +14 -0
- package/dist/src/composables/useHistory.d.ts +9 -0
- package/dist/src/composables/useParser.d.ts +4 -0
- package/dist/src/composables/useSelection.d.ts +8 -0
- package/dist/src/composables/useSerializer.d.ts +7 -0
- package/dist/src/types/index.d.ts +116 -0
- package/dist/src/utils/tailwindMap.d.ts +12 -0
- package/dist/style.css +1 -0
- 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,"&").replace(/</g,"<").replace(/>/g,">");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,"&").replace(/"/g,""").replace(/</g,"<").replace(/>/g,">")}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"}})});
|
package/dist/index.d.ts
ADDED
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
|
+
};
|