@improba/page-builder 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/dist/index.cjs ADDED
@@ -0,0 +1,33 @@
1
+ "use strict";var Kn=Object.defineProperty;var Fn=(n,o,r)=>o in n?Kn(n,o,{enumerable:!0,configurable:!0,writable:!0,value:r}):n[o]=r;var lt=(n,o,r)=>Fn(n,typeof o!="symbol"?o+"":o,r);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("vue");class bt extends Error{constructor(r,e,a={}){super(e);lt(this,"code");lt(this,"details");this.name="PageBuilderError",this.code=r,this.details=a.details??{},this.cause=a.cause}}function Gt(n){return n instanceof bt}function K(n,o,r={}){return new bt(n,o,r)}function vt(n){return n instanceof Error?n.message:String(n)}function De(n,o,r){const e=Gt(o)?o:K("UNKNOWN",vt(o),{cause:o,details:r}),a=r?{...e.details,...r}:e.details;console.error(`[PageBuilder][${n}] ${e.message}`,{code:e.code,details:a,cause:e.cause})}const J=new Map;function Gn(){const n=[...J.keys()];return n.length>0?n.join(", "):"(none)"}function Re(n){return n.trim()}function ft(n,o){return K("DUPLICATE_COMPONENT",o,{details:{componentName:n}})}function ht(n,o){const r=Re(n.name),e=r===n.name?n:{...n,name:r};if(!r)throw K("INVALID_PAGE_DATA",`[PageBuilder] Cannot ${o} a component without a name.`);if(!e.component)throw K("INVALID_PAGE_DATA",`[PageBuilder] Component "${r}" is missing a Vue component instance.`);return e}function $n(n){const o=ht(n,"register"),r=o.name;if(J.has(r))throw ft(r,`[PageBuilder] Component "${r}" is already registered. Use replaceComponent() to override.`);J.set(r,o)}function $t(n){const o=n.map(e=>ht(e,"register")),r=new Set;for(const e of o){if(r.has(e.name))throw ft(e.name,`[PageBuilder] Component "${e.name}" appears multiple times in the registration batch.`);if(r.add(e.name),J.has(e.name))throw ft(e.name,`[PageBuilder] Component "${e.name}" is already registered. Use replaceComponent() to override.`)}for(const e of o)J.set(e.name,e)}function qn(n){const o=ht(n,"replace"),r=o.name;J.set(r,o)}function Yn(n){return J.delete(Re(n))}function fe(n){return J.get(Re(n))}function qt(n){const o=Re(n),r=J.get(o);if(!r)throw K("MISSING_COMPONENT",`[PageBuilder] Component "${o}" is not registered. Available: ${Gn()}`,{details:{componentName:o,availableComponents:[...J.keys()]}});return r.component}function Xn(){return[...J.values()]}function Yt(){const n=new Map;for(const o of J.values()){if(o.hidden)continue;const r=n.get(o.category)??[];r.push(o),n.set(o.category,r)}return n}function Zn(n){return J.has(Re(n))}function Jn(){J.clear()}const Xt={name:"PbColumn",label:"Column",description:"Vertical flex container for stacking components.",category:"layout",icon:"⬜",component:{},slots:[{name:"default",label:"Content"}],editableProps:[{key:"gap",label:"Gap",type:"text",defaultValue:"16px"},{key:"padding",label:"Padding",type:"text",defaultValue:"0"},{key:"align",label:"Align Items",type:"select",defaultValue:"stretch",options:[{label:"Stretch",value:"stretch"},{label:"Start",value:"flex-start"},{label:"Center",value:"center"},{label:"End",value:"flex-end"}]}],defaultProps:{gap:"16px",padding:"0",align:"stretch"}},Qn=t.defineComponent({__name:"PbColumn",props:{gap:{type:String,default:"16px"},padding:{type:String,default:"0"},align:{type:String,default:"stretch"}},setup(n,{expose:o}){o();const r=n,e=t.computed(()=>({display:"flex",flexDirection:"column",gap:r.gap,padding:r.padding,alignItems:r.align,width:"100%"})),a={builderOptions:Xt,props:r,style:e};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}}),U=(n,o)=>{const r=n.__vccOpts||n;for(const[e,a]of o)r[e]=a;return r};function er(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("div",{style:t.normalizeStyle(e.style)},[t.renderSlot(n.$slots,"default")],4)}const Zt=U(Qn,[["render",er],["__file","/app/src/built-in/PbColumn.vue"]]),Jt={name:"PbRow",label:"Row",description:"Horizontal flex container for side-by-side components.",category:"layout",icon:"⬛",component:{},slots:[{name:"default",label:"Content"}],editableProps:[{key:"gap",label:"Gap",type:"text",defaultValue:"16px"},{key:"wrap",label:"Wrap",type:"boolean",defaultValue:!0},{key:"justify",label:"Justify",type:"select",defaultValue:"flex-start",options:[{label:"Start",value:"flex-start"},{label:"Center",value:"center"},{label:"End",value:"flex-end"},{label:"Space Between",value:"space-between"},{label:"Space Around",value:"space-around"}]}],defaultProps:{gap:"16px",wrap:!0,justify:"flex-start"}},tr=t.defineComponent({__name:"PbRow",props:{gap:{type:String,default:"16px"},wrap:{type:Boolean,default:!0},justify:{type:String,default:"flex-start"}},setup(n,{expose:o}){o();const r=n,e=t.computed(()=>({display:"flex",flexDirection:"row",gap:r.gap,flexWrap:r.wrap?"wrap":"nowrap",justifyContent:r.justify,width:"100%"})),a={builderOptions:Jt,props:r,style:e};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}});function nr(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("div",{style:t.normalizeStyle(e.style)},[t.renderSlot(n.$slots,"default")],4)}const Qt=U(tr,[["render",nr],["__file","/app/src/built-in/PbRow.vue"]]),Lt=new Set(["div","p","span","h1","h2","h3","h4","h5","h6","section","article","blockquote"]),rr=new Set(["a","b","blockquote","br","code","div","em","h1","h2","h3","h4","h5","h6","i","li","ol","p","pre","s","span","strong","u","ul"]),or=new Set(["base","embed","form","iframe","input","link","math","meta","noscript","object","script","style","svg","template","textarea"]),ar=new Set(["_blank","_parent","_self","_top"]),ir=new Set(["nofollow","noopener","noreferrer","sponsored","ugc"]),lr=/^data:image\/(?:avif|bmp|gif|jpe?g|png|webp);base64,[a-z0-9+/=\s]+$/i;function _t(n){return n.replace(/[\u0000-\u001F\u007F]/g,"")}function dr(n){return _t(n).replace(/\s+/g,"")}function en(n){const o=n.toLowerCase().split(/\s+/).filter(Boolean).filter(r=>ir.has(r));return Array.from(new Set(o)).join(" ")}function sr(n){const o=en(n??""),r=new Set(o.split(/\s+/).filter(Boolean));return r.add("noopener"),r.add("noreferrer"),Array.from(r).join(" ")}function cr(){var n;if(typeof document<"u"&&typeof((n=document.implementation)==null?void 0:n.createHTMLDocument)=="function")return document.implementation.createHTMLDocument("");if(typeof DOMParser<"u"){const o=new DOMParser().parseFromString("<!doctype html><html><body></body></html>","text/html");if(o!=null&&o.body)return o}return null}function ur(n){return n.replaceAll("&","&amp;").replaceAll("<","&lt;").replaceAll(">","&gt;").replaceAll('"',"&quot;").replaceAll("'","&#39;")}function pr(n,o){const r=o.tagName.toLowerCase();for(const e of Array.from(n.attributes)){const a=e.name.toLowerCase(),l=_t(e.value).trim();if(!(l.length===0||a.startsWith("on"))){if(a==="title"){o.setAttribute("title",l);continue}if(r==="a"){if(a==="href"){const i=Q(l,"link");i.length>0&&o.setAttribute("href",i);continue}if(a==="target"){const i=l.toLowerCase();ar.has(i)&&o.setAttribute("target",i);continue}if(a==="rel"){const i=en(l);i.length>0&&o.setAttribute("rel",i)}}}}r==="a"&&o.getAttribute("target")==="_blank"&&o.setAttribute("rel",sr(o.getAttribute("rel")))}function mt(n,o,r){for(const e of Array.from(n.childNodes)){if(e.nodeType===3){o.appendChild(r.createTextNode(e.textContent??""));continue}if(e.nodeType!==1)continue;const a=e,l=a.tagName.toLowerCase();if(or.has(l))continue;if(!rr.has(l)){const d=r.createDocumentFragment();mt(a,d,r),o.appendChild(d);continue}const i=r.createElement(l);if(pr(a,i),mt(a,i,r),l==="a"&&!i.getAttribute("href")){const d=r.createDocumentFragment();for(;i.firstChild;)d.appendChild(i.firstChild);o.appendChild(d);continue}o.appendChild(i)}}function yt(n){const o=typeof n=="string"?n:"";if(o.length===0)return"";const r=cr();if(!r)return ur(o);const e=r.createElement("div");e.innerHTML=o;const a=r.createElement("div");return mt(e,a,r),a.innerHTML}function wt(n,o="div"){const r=typeof o=="string"?o.trim().toLowerCase():"div",e=Lt.has(r)?r:"div";if(typeof n!="string")return e;const a=n.trim().toLowerCase();return Lt.has(a)?a:e}function Q(n,o){const r=_t(n).trim();if(r.length===0)return"";const e=dr(r).toLowerCase(),a=e.match(/^([a-z][a-z0-9+.-]*):/i),l=a==null?void 0:a[1];return!l||l==="http"||l==="https"||o==="link"&&(l==="mailto"||l==="tel")||o==="media"&&l==="blob"||(o==="media"||o==="background")&&l==="data"&&lr.test(e)?r:""}const tn={name:"PbText",label:"Text",description:"A text block with HTML support.",category:"content",icon:"T",component:{},slots:[],editableProps:[{key:"content",label:"Content",type:"richtext",defaultValue:"<p>Enter text here</p>"},{key:"tag",label:"HTML Tag",type:"select",defaultValue:"div",options:[{label:"div",value:"div"},{label:"p",value:"p"},{label:"span",value:"span"},{label:"h1",value:"h1"},{label:"h2",value:"h2"},{label:"h3",value:"h3"}]}],defaultProps:{content:"<p>Enter text here</p>",tag:"div"}},fr=t.defineComponent({__name:"PbText",props:{content:{type:String,default:""},tag:{type:String,default:"div"}},setup(n,{expose:o}){o();const r=n,e=t.computed(()=>wt(r.tag)),a=t.computed(()=>yt(r.content)),l={builderOptions:tn,props:r,safeTag:e,safeHtmlContent:a};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}});function mr(n,o,r,e,a,l){return t.openBlock(),t.createBlock(t.resolveDynamicComponent(e.safeTag),{innerHTML:e.safeHtmlContent},null,8,["innerHTML"])}const nn=U(fr,[["render",mr],["__file","/app/src/built-in/PbText.vue"]]),rn={name:"PbImage",label:"Image",description:"Displays an image with optional alt text.",category:"media",icon:"🖼",component:{},slots:[],editableProps:[{key:"src",label:"Image URL",type:"image",required:!0},{key:"alt",label:"Alt Text",type:"text",defaultValue:""},{key:"width",label:"Width",type:"text",defaultValue:"100%"},{key:"objectFit",label:"Object Fit",type:"select",defaultValue:"cover",options:[{label:"Cover",value:"cover"},{label:"Contain",value:"contain"},{label:"Fill",value:"fill"},{label:"None",value:"none"}]}],defaultProps:{src:"",alt:"",width:"100%",objectFit:"cover"}},gr=t.defineComponent({__name:"PbImage",props:{src:{type:String,required:!0},alt:{type:String,default:""},width:{type:String,default:"100%"},objectFit:{type:String,default:"cover"}},setup(n,{expose:o}){o();const r=n,e=t.computed(()=>({width:r.width,objectFit:r.objectFit,display:"block",maxWidth:"100%"})),a=t.computed(()=>Q(r.src,"media")),l={builderOptions:rn,props:r,style:e,safeSrc:a};return Object.defineProperty(l,"__isScriptSetup",{enumerable:!1,value:!0}),l}}),br=["src","alt"];function vr(n,o,r,e,a,l){return e.safeSrc?(t.openBlock(),t.createElementBlock("img",{key:0,src:e.safeSrc,alt:r.alt,style:t.normalizeStyle(e.style),loading:"lazy"},null,12,br)):t.createCommentVNode("v-if",!0)}const on=U(gr,[["render",vr],["__file","/app/src/built-in/PbImage.vue"]]),an={name:"PbVideo",label:"Vidéo",description:"Affiche une vidéo avec URL, poster optionnel et options de lecture.",category:"media",icon:"🎬",component:{},slots:[],editableProps:[{key:"src",label:"URL de la vidéo",type:"url",required:!0},{key:"poster",label:"Image de couverture (poster)",type:"image"},{key:"width",label:"Largeur",type:"text",defaultValue:"100%"},{key:"controls",label:"Afficher les contrôles",type:"boolean",defaultValue:!0},{key:"autoplay",label:"Lecture automatique",type:"boolean",defaultValue:!1},{key:"muted",label:"Muet",type:"boolean",defaultValue:!1},{key:"loop",label:"Boucle",type:"boolean",defaultValue:!1}],defaultProps:{src:"",poster:"",width:"100%",controls:!0,autoplay:!1,muted:!1,loop:!1}},hr=t.defineComponent({__name:"PbVideo",props:{src:{type:String,required:!0},poster:{type:String,required:!1,default:""},width:{type:String,required:!1,default:"100%"},controls:{type:Boolean,required:!1,default:!0},autoplay:{type:Boolean,required:!1,default:!1},muted:{type:Boolean,required:!1,default:!1},loop:{type:Boolean,required:!1,default:!1}},setup(n,{expose:o}){o();const r=n,e=t.computed(()=>({width:r.width,maxWidth:"100%",display:"block"})),a=t.computed(()=>Q(r.src,"media")),l=t.computed(()=>{var d;return(d=r.poster)!=null&&d.trim()?Q(r.poster,"media"):void 0}),i={builderOptions:an,props:r,style:e,safeSrc:a,safePoster:l};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}}),_r=["src","poster","controls","autoplay","muted","loop"];function yr(n,o,r,e,a,l){return e.safeSrc?(t.openBlock(),t.createElementBlock("video",{key:0,src:e.safeSrc,poster:e.safePoster,controls:r.controls,autoplay:r.autoplay,muted:r.muted,loop:r.loop,style:t.normalizeStyle(e.style),playsinline:""},null,12,_r)):t.createCommentVNode("v-if",!0)}const ln=U(hr,[["render",yr],["__file","/app/src/built-in/PbVideo.vue"]]),dn={name:"PbSection",label:"Section",description:"A full-width section with optional background.",category:"layout",icon:"▬",component:{},slots:[{name:"default",label:"Content"}],editableProps:[{key:"backgroundColor",label:"Background Color",type:"color",defaultValue:"transparent"},{key:"backgroundImage",label:"Background Image",type:"image"},{key:"padding",label:"Padding",type:"text",defaultValue:"48px 24px"},{key:"maxWidth",label:"Max Content Width",type:"text",defaultValue:"1200px"}],defaultProps:{backgroundColor:"transparent",padding:"48px 24px",maxWidth:"1200px"}},wr=t.defineComponent({__name:"PbSection",props:{backgroundColor:{type:String,default:"transparent"},backgroundImage:{type:String,default:""},padding:{type:String,default:"48px 24px"},maxWidth:{type:String,default:"1200px"}},setup(n,{expose:o}){o();const r=n,e=t.computed(()=>Q(r.backgroundImage,"background")),a=t.computed(()=>e.value?`url("${e.value.replace(/["\\]/g,"\\$&")}")`:void 0),l=t.computed(()=>({width:"100%",backgroundColor:r.backgroundColor,backgroundImage:a.value,backgroundSize:"cover",backgroundPosition:"center",padding:r.padding})),i=t.computed(()=>({maxWidth:r.maxWidth,margin:"0 auto",width:"100%"})),d={builderOptions:dn,props:r,safeBackgroundImage:e,cssBackgroundImage:a,outerStyle:l,innerStyle:i};return Object.defineProperty(d,"__isScriptSetup",{enumerable:!1,value:!0}),d}});function kr(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("section",{style:t.normalizeStyle(e.outerStyle)},[t.createElementVNode("div",{style:t.normalizeStyle(e.innerStyle)},[t.renderSlot(n.$slots,"default")],4)],4)}const sn=U(wr,[["render",kr],["__file","/app/src/built-in/PbSection.vue"]]),cn={name:"PbContainer",label:"Container",description:"A centered container with max width.",category:"layout",icon:"☐",component:{},slots:[{name:"default",label:"Content"}],editableProps:[{key:"maxWidth",label:"Max Width",type:"text",defaultValue:"100%"},{key:"padding",label:"Padding",type:"text",defaultValue:"0 24px"}],defaultProps:{maxWidth:"100%",padding:"0 24px"}},Nr=t.defineComponent({__name:"PbContainer",props:{maxWidth:{type:String,default:"100%"},padding:{type:String,default:"0 24px"}},setup(n,{expose:o}){o();const r=n,e=t.computed(()=>({maxWidth:r.maxWidth,margin:"0 auto",padding:r.padding,width:"100%",boxSizing:"border-box"})),a={builderOptions:cn,props:r,style:e};return Object.defineProperty(a,"__isScriptSetup",{enumerable:!1,value:!0}),a}});function Er(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("div",{style:t.normalizeStyle(e.style)},[t.renderSlot(n.$slots,"default")],4)}const un=U(Nr,[["render",Er],["__file","/app/src/built-in/PbContainer.vue"]]);function ve(n,o){return{...n,component:o}}const pn=[ve(Xt,Zt),ve(Jt,Qt),ve(tn,nn),ve(rn,on),ve(an,ln),ve(dn,sn),ve(cn,un)],xr=new Set(["draft","published","archived"]),Mt=200,Ot=5e3;function Ve(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function A(n,o,r){n.errors.push({path:o,message:r})}function Ir(n,o,r){if(n.tag===void 0)return;if(typeof n.tag!="string"||n.tag.trim()===""){A(r,`${o}.tag`,"PbText props.tag must be a non-empty string.");return}const e=n.tag.trim().toLowerCase();wt(n.tag)!==e&&A(r,`${o}.tag`,"PbText props.tag must be one of: div, p, span, h1, h2, h3, h4, h5, h6, section, article, blockquote.")}function Dr(n,o,r){if(typeof n.src!="string"||n.src.trim()===""){A(r,`${o}.src`,"PbImage props.src must be a non-empty string.");return}Q(n.src,"media")===""&&A(r,`${o}.src`,"PbImage props.src contains an unsafe URL.")}function Sr(n,o,r){if(typeof n.src!="string"||n.src.trim()===""){A(r,`${o}.src`,"PbVideo props.src must be a non-empty string.");return}Q(n.src,"media")===""&&A(r,`${o}.src`,"PbVideo props.src contains an unsafe URL.");const e=n.poster;e!=null&&e!==""&&(typeof e!="string"?A(r,`${o}.poster`,"PbVideo props.poster must be a string."):e.trim()!==""&&Q(e,"media")===""&&A(r,`${o}.poster`,"PbVideo props.poster contains an unsafe URL."))}function Cr(n,o,r){const e=n.backgroundImage;if(!(e==null||e==="")){if(typeof e!="string"){A(r,`${o}.backgroundImage`,"PbSection props.backgroundImage must be a string.");return}e.trim()!==""&&Q(e,"background")===""&&A(r,`${o}.backgroundImage`,"PbSection props.backgroundImage contains an unsafe URL.")}}function Tr(n,o,r,e){if(n==="PbText"){Ir(o,r,e);return}if(n==="PbImage"){Dr(o,r,e);return}if(n==="PbVideo"){Sr(o,r,e);return}n==="PbSection"&&Cr(o,r,e)}function Ue(n,o,r,e=0){if(e>Mt){r.depthGuardTriggered||(A(r,o,`Maximum node depth (${String(Mt)}) exceeded during validation.`),r.depthGuardTriggered=!0);return}if(r.visitedNodeCount>=Ot){r.sizeGuardTriggered||(A(r,o,`Maximum node count (${String(Ot)}) exceeded during validation.`),r.sizeGuardTriggered=!0);return}if(!Ve(n)){A(r,o,"Node must be an object.");return}if(r.seenNodes.has(n)){A(r,o,"Cycle detected in node tree.");return}r.seenNodes.add(n),r.visitedNodeCount++;const a=n.id,l=n.name,i=n.slot,d=n.props,p=n.children,v=n.readonly;if(!(typeof a=="number"&&Number.isInteger(a))||a<=0?A(r,`${o}.id`,"id must be a positive integer."):(r.seenIds.has(a)&&A(r,`${o}.id`,`Duplicate node id "${a}" found.`),r.seenIds.add(a),a>r.maxObservedId&&(r.maxObservedId=a)),(typeof l!="string"||l.trim()==="")&&A(r,`${o}.name`,"name must be a non-empty string."),i===null||typeof i=="string"||A(r,`${o}.slot`,"slot must be a string or null."),Ve(d)?typeof l=="string"&&Tr(l,d,`${o}.props`,r):A(r,`${o}.props`,"props must be an object."),!Array.isArray(p)){A(r,`${o}.children`,"children must be an array.");return}v===void 0||typeof v=="boolean"||A(r,`${o}.readonly`,"readonly must be a boolean when provided.");for(let h=0;h<p.length&&!r.sizeGuardTriggered;h++)Ue(p[h],`${o}.children[${h}]`,r,e+1)}function Be(n,o="node"){const r={errors:[],seenIds:new Set,seenNodes:new WeakSet,maxObservedId:0,visitedNodeCount:0,depthGuardTriggered:!1,sizeGuardTriggered:!1};return Ue(n,o,r),{isValid:r.errors.length===0,errors:r.errors}}function kt(n){const o={errors:[],seenIds:new Set,seenNodes:new WeakSet,maxObservedId:0,visitedNodeCount:0,depthGuardTriggered:!1,sizeGuardTriggered:!1};if(!Ve(n))return A(o,"pageData","pageData must be an object."),{isValid:!1,errors:o.errors};const{meta:r,content:e,layout:a,maxId:l,variables:i}=n;if(Ve(r)?((typeof r.id!="string"||r.id.trim()==="")&&A(o,"meta.id","meta.id must be a non-empty string."),(typeof r.name!="string"||r.name.trim()==="")&&A(o,"meta.name","meta.name must be a non-empty string."),typeof r.url!="string"||r.url.trim()===""?A(o,"meta.url","meta.url must be a non-empty string."):Q(r.url,"link")===""&&A(o,"meta.url","meta.url contains an unsafe URL."),(typeof r.status!="string"||!xr.has(r.status))&&A(o,"meta.status","meta.status must be one of: draft, published, archived."),r.updatedAt===void 0||typeof r.updatedAt=="string"||A(o,"meta.updatedAt","meta.updatedAt must be a string when provided."),r.createdAt===void 0||typeof r.createdAt=="string"||A(o,"meta.createdAt","meta.createdAt must be a string when provided.")):A(o,"meta","meta must be an object."),Ue(e,"content",o),Ue(a,"layout",o),!(typeof l=="number"&&Number.isInteger(l))||l<0?A(o,"maxId","maxId must be a non-negative integer."):l<o.maxObservedId&&A(o,"maxId",`maxId (${String(l)}) must be greater than or equal to the maximum node id (${String(o.maxObservedId)}).`),!Ve(i))A(o,"variables","variables must be an object.");else for(const[d,p]of Object.entries(i))typeof p!="string"&&A(o,`variables.${d}`,"Variable values must be strings.");return{isValid:o.errors.length===0,errors:o.errors}}const We="en",Nt={en:{"toolbar.undo.title":"Undo (Ctrl/Cmd+Z)","toolbar.undo.ariaLabel":"Undo","toolbar.redo.title":"Redo (Ctrl/Cmd+Y or Shift+Ctrl/Cmd+Z)","toolbar.redo.ariaLabel":"Redo","toolbar.save":"Save","toolbar.save.title":"Save (Ctrl/Cmd+S)","toolbar.save.ariaLabel":"Save page","toolbar.aria.toolbar":"Editor toolbar","toolbar.aria.historyControls":"History controls","toolbar.aria.viewportControls":"Viewport controls","toolbar.aria.saveControls":"Save controls","toolbar.aria.unsavedChanges":"Unsaved changes","toolbar.viewport.desktop":"Desktop","toolbar.viewport.tablet":"Tablet","toolbar.viewport.mobile":"Mobile","toolbar.viewport.custom":"Custom","toolbar.viewport.switchAriaLabel":"Switch viewport to {viewport}","toolbar.viewport.width.short":"W","toolbar.viewport.height.short":"H","toolbar.viewport.width.ariaLabel":"Custom viewport width","toolbar.viewport.height.ariaLabel":"Custom viewport height","leftDrawer.title":"Components","leftDrawer.aria.componentPalette":"Component palette","leftDrawer.toggle.ariaLabel":"Toggle component drawer","leftDrawer.section.components":"Components","leftDrawer.search.placeholder":"Search components...","leftDrawer.search.ariaLabel":"Search components","leftDrawer.category.ariaLabel":"{category} components","leftDrawer.component.dragAriaLabel":"Add or drag {label}","leftDrawer.empty":"No matching components","leftDrawer.section.tree":"Tree","leftDrawer.tree.toggle.ariaLabel":"Toggle node tree","rightDrawer.title":"Properties","rightDrawer.aria.componentProperties":"Component properties","rightDrawer.toggle.ariaLabel":"Toggle properties drawer","rightDrawer.section.properties":"Properties","rightDrawer.actions.duplicate":"Duplicate","rightDrawer.actions.duplicate.ariaLabel":"Duplicate selected component","rightDrawer.actions.delete":"Delete","rightDrawer.actions.delete.ariaLabel":"Delete selected component","rightDrawer.empty":"Select a component to edit its properties.","treePanel.ariaLabel":"Node tree","treePanel.readonly":"readonly","contextMenu.ariaLabel":"Node context menu","contextMenu.duplicate":"Duplicate","contextMenu.moveUp":"Move up","contextMenu.moveDown":"Move down","contextMenu.delete":"Delete","iframeCanvas.title":"Editor canvas","propBoolean.enabled":"Enabled","propBoolean.disabled":"Disabled","propSelect.noOptions":"No options","mediaPicker.input.placeholder":"https://example.com/image.jpg","mediaPicker.clear":"Clear","mediaPicker.upload":"Upload","mediaPicker.preview.alt":"Media preview","mediaPicker.empty":"Paste an image URL to preview.","richText.action.link":"Link","richText.action.bold":"Bold","richText.action.italic":"Italic","richText.action.unorderedList":"Bulleted list","richText.action.orderedList":"Numbered list","richText.aria.toolbar":"Rich text formatting toolbar","richText.aria.editor":"Rich text editor","richText.prompt.enterUrl":"Enter URL","richText.prompt.defaultUrl":"https://","pageBuilder.warning.invalidEditMode":"Invalid `pageData` for edit mode. Rendering in read mode."}};function Pr(n,o){return o?n.replace(/\{(\w+)\}/g,(r,e)=>{const a=o[e];return a===void 0?r:String(a)}):n}function fn(...n){const o={};for(const r of n)if(r)for(const[e,a]of Object.entries(r))o[e]={...o[e]??{},...a};return o}function mn(n){const o=n.fallbackLocale??"en",r=n.dictionary[n.locale]??{},e=n.dictionary[o]??{},a=r[n.key]??e[n.key]??n.key;return Pr(a,n.params)}function Et(n,o,r="en"){const e=typeof n=="function"?n:()=>n,a=typeof o=="function"?o:()=>o;return(l,i)=>mn({locale:e(),dictionary:a(),key:l,params:i,fallbackLocale:r})}const gn=Symbol("pageBuilderI18nOptions"),bn=Symbol("pageBuilderI18n"),Vr={locale:t.computed(()=>We),t:Et(We,Nt)};function ne(){return t.inject(bn,Vr)}function Fe(n){return Array.isArray(n.children)?n.children:[]}function vn(n,o){const r=Number.isFinite(n)?Math.trunc(n):0;return Math.max(0,Math.min(r,o))}function hn(n){try{return structuredClone(n)}catch(o){throw K("INVALID_NODE","[PageBuilder] Failed to clone node tree. Ensure the tree is serializable and acyclic.",{cause:o})}}function M(n,o){if(n.id===o)return n;for(const r of Fe(n)){const e=M(r,o);if(e)return e}}function G(n,o){const r=Fe(n);for(let e=0;e<r.length;e++){if(r[e].id===o)return{parent:n,index:e};const a=G(r[e],o);if(a)return a}}function _n(n,o){const r=G(n,o);if(r)return r.parent.children.splice(r.index,1)[0]}function xt(n,o,r,e,a="default"){const l=M(n,o);if(!l)return!1;Array.isArray(l.children)||(l.children=[]);const i=vn(e,l.children.length),d={...r,slot:a};return l.children.splice(i,0,d),!0}function yn(n,o,r,e,a="default"){const l=G(n,o);if(!l)return!1;const i=Fe(l.parent),[d]=i.splice(l.index,1);if(!d)return!1;if(xt(n,r,d,e,a))return!0;const v=vn(l.index,i.length);return i.splice(v,0,d),!1}function wn(n,o,r={}){return{id:n,name:o,slot:r.slot??"default",props:r.props??{},children:r.children??[],readonly:r.readonly}}function It(n,o,r=0){const e=new WeakSet;function a(l,i){if(e.has(l))return!0;if(e.add(l),o(l,i)===!1)return!1;for(const d of Fe(l))if(a(d,i+1)===!1)return!1;return!0}return a(n,r)}function Br(n){let o=0;return It(n,()=>{o++}),o}function ye(n){let o=n.id;return It(n,r=>{Number.isFinite(r.id)&&r.id>o&&(o=r.id)}),o}function kn(n,o){if(!n||typeof n!="object"||Array.isArray(n))return{};const r=o&&typeof o=="object"&&!Array.isArray(o)?o:{},e={};for(const[a,l]of Object.entries(n))typeof l=="string"?e[a]=l.replace(/\{\{\s*(\w+)\s*\}\}/g,(i,d)=>r[d]??`{{ ${d} }}`):e[a]=l;return e}const Rr=t.defineComponent({__name:"ErrorBoundary",props:{fallbackMessage:{type:String,required:!1,default:"Something went wrong while rendering this section."},showDetailsInDev:{type:Boolean,required:!1,default:!1},diagnosticContext:{type:String,required:!1,default:"ErrorBoundary"}},setup(n,{expose:o}){o();const r=n,e=t.ref(!1),a=t.ref(null),l=t.ref(""),i=t.computed(()=>r.showDetailsInDev),d=t.computed(()=>a.value?a.value instanceof Error?a.value.message:String(a.value):""),p=t.computed(()=>[d.value,l.value].filter(h=>!!h).join(`
2
+ `));t.onErrorCaptured((h,N,c)=>(e.value=!0,a.value=h,l.value=c,De(r.diagnosticContext,K("RENDER_FAILURE",`[PageBuilder] ${r.diagnosticContext} captured a render error: ${vt(h)}`,{cause:h,details:{info:c}})),!1));const v={props:r,hasError:e,capturedError:a,errorInfo:l,shouldShowDetails:i,errorDetails:d,errorDebugText:p};return Object.defineProperty(v,"__isScriptSetup",{enumerable:!1,value:!0}),v}}),Ar={key:1,class:"ipb-error-boundary",role:"alert"},Lr={class:"ipb-error-boundary__message"},Mr={key:0,class:"ipb-error-boundary__details"};function Or(n,o,r,e,a,l){return e.hasError?(t.openBlock(),t.createElementBlock("div",Ar,[t.createElementVNode("p",Lr,t.toDisplayString(r.fallbackMessage),1),e.shouldShowDetails&&e.errorDebugText?(t.openBlock(),t.createElementBlock("pre",Mr," "+t.toDisplayString(e.errorDebugText)+`
3
+ `,1)):t.createCommentVNode("v-if",!0)])):t.renderSlot(n.$slots,"default",{key:0},void 0,!0)}const Nn=U(Rr,[["render",Or],["__scopeId","data-v-c285f22f"],["__file","/app/src/components/shared/ErrorBoundary.vue"]]),zr=t.defineComponent({__name:"NodeRenderer",props:{node:{type:Object,required:!0},variables:{type:Object,default:()=>({})},markNodes:{type:Boolean,default:!1}},setup(n,{expose:o}){o();const r=n,e=new Set;function a(u,g,m){e.has(u)||(e.add(u),De("NodeRenderer",K("RENDER_FAILURE",g,{details:m})))}function l(u){if(typeof u!="object"||u===null||Array.isArray(u))return!1;const g=u;return typeof g.id!="number"||!Number.isFinite(g.id)||typeof g.name!="string"||g.name.trim().length===0||!(g.slot===null||typeof g.slot=="string")||typeof g.props!="object"||g.props===null||Array.isArray(g.props)?!1:Array.isArray(g.children)}function i(u){return!u||typeof u!="object"||Array.isArray(u)?{}:Object.fromEntries(Object.entries(u).filter(g=>typeof g[1]=="string"))}const d=t.computed(()=>l(r.node)?r.node:(a("invalid-node","[PageBuilder] NodeRenderer received an invalid node payload.",{node:r.node}),null)),p=t.computed(()=>i(r.variables)),v=t.defineComponent({name:"NodeRenderCrash",props:{error:{type:null,required:!0}},setup(u){return()=>{throw u.error instanceof Error?u.error:new Error(String(u.error))}}}),h=t.computed(()=>{if(!d.value)return{component:v,error:K("INVALID_NODE","[PageBuilder] Cannot render node because its payload is invalid.")};try{return{component:qt(d.value.name),error:null}}catch(u){return a(`missing-component:${d.value.name}`,`[PageBuilder] Component "${d.value.name}" could not be resolved.`,{nodeId:d.value.id}),{component:v,error:u}}}),N=t.computed(()=>h.value.component),c=t.computed(()=>{if(h.value.error!==null)return{error:h.value.error};if(!d.value)return{error:K("INVALID_NODE","[PageBuilder] Cannot render props for an invalid node payload.")};try{return kn(d.value.props,p.value)}catch(u){return a(`prop-interpolation:${d.value.id}`,`[PageBuilder] Failed to interpolate props for node "${d.value.name}".`,{nodeId:d.value.id}),{error:u}}}),C=t.computed(()=>!r.markNodes||!d.value?{}:{"data-ipb-node-id":String(d.value.id),"data-ipb-component":d.value.name}),I=t.computed(()=>({...c.value,...C.value})),w=t.computed(()=>{const u={};if(!d.value)return u;for(const g of d.value.children){if(!l(g)){a(`invalid-child:${d.value.id}`,`[PageBuilder] Ignoring invalid child node while rendering "${d.value.name}".`,{parentNodeId:d.value.id});continue}const m=g.slot??"default";u[m]||(u[m]=[]),u[m].push(g)}return u}),E={props:r,reportedDiagnostics:e,reportOnce:a,isNodeObject:l,sanitizeVariables:i,safeNode:d,safeVariables:p,NodeRenderCrash:v,resolutionResult:h,resolvedComponent:N,resolvedProps:c,markerAttrs:C,renderedAttrs:I,slotGroups:w,ErrorBoundary:Nn};return Object.defineProperty(E,"__isScriptSetup",{enumerable:!1,value:!0}),E}}),jr={key:0,class:"ipb-node-renderer__invalid",role:"alert"};function Hr(n,o,r,e,a,l){const i=t.resolveComponent("NodeRenderer",!0);return e.safeNode?(t.openBlock(),t.createBlock(e.ErrorBoundary,{key:1,"fallback-message":"This block could not be rendered.","show-details-in-dev":!0,"diagnostic-context":"NodeRenderer"},{default:t.withCtx(()=>[(t.openBlock(),t.createBlock(t.resolveDynamicComponent(e.resolvedComponent),t.normalizeProps(t.guardReactiveProps(e.renderedAttrs)),t.createSlots({_:2},[t.renderList(e.slotGroups,(d,p)=>({name:p,fn:t.withCtx(()=>[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(d,v=>(t.openBlock(),t.createBlock(i,{key:v.id,node:v,variables:e.safeVariables,"mark-nodes":r.markNodes},null,8,["node","variables","mark-nodes"]))),128))])}))]),1040))]),_:1})):(t.openBlock(),t.createElementBlock("div",jr," This block is invalid and could not be rendered. "))}const Dt=U(zr,[["render",Hr],["__scopeId","data-v-ea251e83"],["__file","/app/src/components/reader/NodeRenderer.vue"]]),Ur=t.defineComponent({__name:"PageReader",props:{pageData:{type:Object,required:!0}},setup(n,{expose:o}){o();const r=n,e=t.computed(()=>kt(r.pageData)),a=t.computed(()=>Be(r.pageData.content,"content")),l=t.computed(()=>Be(r.pageData.layout,"layout")),i=new Set;function d(c,C,I){i.has(c)||(i.add(c),De("PageReader",K("INVALID_PAGE_DATA",C,{details:I})))}t.watch(e,c=>{c.isValid||d("invalid-page-data","[PageReader] Invalid pageData payload detected. Rendering continues with degraded behavior.",{errors:c.errors})},{immediate:!0});function p(c){return typeof c=="object"&&c!==null&&!Array.isArray(c)}const v=t.computed(()=>{const c=r.pageData.variables;return!c||typeof c!="object"||Array.isArray(c)?(d("invalid-variables-shape","[PageReader] Invalid variables payload. Falling back to an empty variable map."),{}):(Object.values(c).some(I=>typeof I!="string")&&d("invalid-variables-values","[PageReader] Variables payload contains non-string values. Invalid entries were ignored."),Object.fromEntries(Object.entries(c).filter(I=>typeof I[1]=="string")))}),h=t.computed(()=>{if(!p(r.pageData.content)||!a.value.isValid)return d("invalid-content","[PageReader] Invalid content node. Nothing can be rendered.",{errors:a.value.errors}),null;if(!p(r.pageData.layout)||!l.value.isValid)return d("invalid-layout","[PageReader] Invalid layout node. Falling back to content-only rendering.",{errors:l.value.errors}),r.pageData.content;const c={...r.pageData.content,slot:r.pageData.content.slot??"default"},C=Array.isArray(r.pageData.layout.children)?r.pageData.layout.children:[];return{...r.pageData.layout,children:[...C,c]}}),N={props:r,pageValidationResult:e,contentValidationResult:a,layoutValidationResult:l,reportedDiagnostics:i,reportOnce:d,isNodeObject:p,safeVariables:v,readerRoot:h,NodeRenderer:Dt,ErrorBoundary:Nn};return Object.defineProperty(N,"__isScriptSetup",{enumerable:!1,value:!0}),N}}),Wr={class:"ipb-page-reader"},Kr={key:1,class:"ipb-page-reader__invalid",role:"alert"};function Fr(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("div",Wr,[e.readerRoot?(t.openBlock(),t.createBlock(e.ErrorBoundary,{key:0,"fallback-message":"This page could not be fully rendered.","show-details-in-dev":!0,"diagnostic-context":"PageReader"},{default:t.withCtx(()=>[t.createVNode(e.NodeRenderer,{node:e.readerRoot,variables:e.safeVariables},null,8,["node","variables"])]),_:1})):(t.openBlock(),t.createElementBlock("div",Kr," This page data is invalid and cannot be rendered safely. "))])}const En=U(Ur,[["render",Fr],["__scopeId","data-v-2928bf3c"],["__file","/app/src/components/reader/PageReader.vue"]]),Ie={desktop:{width:1440,height:900,label:"Desktop"},tablet:{width:768,height:1024,label:"Tablet"},mobile:{width:375,height:812,label:"Mobile"},custom:{width:0,height:0,label:"Custom"}},xn=Symbol("pageBuilder"),In=Symbol("editor"),Ge=Symbol("nodeTree"),$e=Symbol("dragDrop");function te(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function Gr(n){return typeof n=="number"&&Number.isInteger(n)&&n>0}function gt(n){return typeof n=="number"&&Number.isInteger(n)&&n>=0}function zt(n,o,r){return{id:n,name:o,slot:r,props:{},children:[]}}function _e(n,o=new WeakSet){return!te(n)||o.has(n)||(o.add(n),!Gr(n.id))||typeof n.name!="string"||n.name.trim().length===0||!(n.slot===null||typeof n.slot=="string")||!te(n.props)||!Array.isArray(n.children)||typeof n.readonly<"u"&&typeof n.readonly!="boolean"?!1:n.children.every(r=>_e(r,o))}function $r(n){if(!te(n))return{};const o={};for(const[r,e]of Object.entries(n))typeof e=="string"&&(o[r]=e);return o}function qr(n){const o=[],r=zt(1,"PbSection",null),e=zt(100,"PbContainer",null),a=te(n)?n:{};let l=r;_e(a.content)?l=structuredClone(a.content):o.push("content node is invalid");let i=e;_e(a.layout)?i=structuredClone(a.layout):o.push("layout node is invalid");const d=a.maxId,p=Math.max(ye(l),ye(i)),v=gt(d),h=v?Math.max(Math.trunc(d),p):p;v||o.push("maxId is invalid");const N=$r(a.variables);te(a.variables)||o.push("variables map is invalid");const c=te(a.meta)?a.meta:{};te(a.meta)||o.push("meta object is invalid");const C={meta:{id:typeof c.id=="string"?c.id:"unknown-page",name:typeof c.name=="string"?c.name:"Untitled page",url:typeof c.url=="string"?c.url:"/",status:c.status==="draft"||c.status==="published"||c.status==="archived"?c.status:"draft",updatedAt:typeof c.updatedAt=="string"?c.updatedAt:void 0,createdAt:typeof c.createdAt=="string"?c.createdAt:void 0},content:l,layout:i,maxId:h,variables:N};return o.length>0&&De("usePageBuilder.sanitizeInitialData",K("INVALID_PAGE_DATA",`[PageBuilder] Invalid page data detected. Falling back to safe defaults for: ${o.join(", ")}.`),{issues:o}),C}function jt(n){let o;try{o=JSON.parse(n)}catch(e){throw K("INVALID_SNAPSHOT","[PageBuilder] Snapshot JSON is invalid.",{cause:e,details:{snapshotPreview:n.slice(0,200)}})}if(!te(o)||!_e(o.content)||!_e(o.layout)||!gt(o.maxId))throw K("INVALID_SNAPSHOT","[PageBuilder] Snapshot payload shape is invalid.",{details:{contentValid:te(o)?_e(o.content):!1,layoutValid:te(o)?_e(o.layout):!1,maxIdValid:te(o)?gt(o.maxId):!1}});const r=Math.max(Math.trunc(o.maxId),ye(o.content),ye(o.layout));return{content:o.content,layout:o.layout,maxId:r}}function Dn(n){const{initialData:o,mode:r="read"}=n,e=qr(o),a=t.ref(r),l=t.ref(e.meta),i=t.ref(e.content),d=t.ref(e.layout),p=t.ref(e.maxId),v=t.ref(e.variables),h=t.ref(!1),N=t.computed(()=>({meta:l.value,content:i.value,layout:d.value,maxId:p.value,variables:v.value})),c=I({content:e.content,layout:e.layout});function C(T){return JSON.stringify(T)}function I(T){return JSON.stringify(T)}function w(){h.value=I({content:i.value,layout:d.value})!==c}function E(T){a.value=T}function u(T){i.value=T,p.value=Math.max(p.value,ye(T)),w()}function g(T){d.value=T,p.value=Math.max(p.value,ye(T)),w()}function m(){return p.value++,p.value}function b(){return C({content:i.value,layout:d.value,maxId:p.value})}function S(T){try{const D=jt(T);i.value=D.content,d.value=D.layout,p.value=D.maxId,w()}catch(D){throw K("INVALID_SNAPSHOT","[PageBuilder] Unable to restore snapshot.",{cause:D,details:{reason:vt(D)}})}}function B(){const T=jt(JSON.stringify({content:e.content,layout:e.layout,maxId:e.maxId}));i.value=structuredClone(T.content),d.value=structuredClone(T.layout),p.value=T.maxId,v.value=structuredClone(e.variables),h.value=!1}return{mode:a,pageData:N,content:i,layout:d,maxId:p,variables:v,isDirty:h,setMode:E,updateContent:u,updateLayout:g,nextId:m,getSnapshot:b,restoreSnapshot:S,reset:B}}function Sn(n={}){const{initialSnapshot:o,initialLabel:r="Initial state"}=n,e=o?[{timestamp:Date.now(),label:r,snapshot:o}]:[];let a=o??null;const l=t.reactive({selectedNodeId:null,hoveredNodeId:null,leftDrawerOpen:!0,rightDrawerOpen:!1,history:e,historyIndex:e.length>0?0:-1,isDirty:!1,canvasScale:1,viewport:"desktop"}),i=t.computed(()=>l.historyIndex>0),d=t.computed(()=>l.historyIndex<l.history.length-1);function p(g){l.selectedNodeId=g,g!==null&&(l.rightDrawerOpen=!0)}function v(g){l.hoveredNodeId=g}function h(){l.leftDrawerOpen=!l.leftDrawerOpen}function N(){l.rightDrawerOpen=!l.rightDrawerOpen}function c(g){l.viewport=g}function C(){var m;if(a===null||l.historyIndex<0){l.isDirty=!1;return}const g=(m=l.history[l.historyIndex])==null?void 0:m.snapshot;l.isDirty=g!==a}function I(g,m=r){a=g,l.history=[{timestamp:Date.now(),label:m,snapshot:g}],l.historyIndex=0,l.isDirty=!1}function w(g,m){var S;if(a===null){I(m);return}((S=l.history[l.historyIndex])==null?void 0:S.snapshot)!==m&&(l.historyIndex<l.history.length-1&&l.history.splice(l.historyIndex+1),l.history.push({timestamp:Date.now(),label:g,snapshot:m}),l.historyIndex=l.history.length-1,C())}function E(){var g;if(i.value)return l.historyIndex--,C(),(g=l.history[l.historyIndex])==null?void 0:g.snapshot}function u(){var g;if(d.value)return l.historyIndex++,C(),(g=l.history[l.historyIndex])==null?void 0:g.snapshot}return{...t.toRefs(l),canUndo:i,canRedo:d,selectNode:p,hoverNode:v,toggleLeftDrawer:h,toggleRightDrawer:N,setViewport:c,setHistoryBaseline:I,pushHistory:w,undo:E,redo:u}}function Cn({content:n,nextId:o,onUpdate:r,onSnapshot:e}){function a(w,E){const u=t.toRaw(n.value),g=JSON.stringify(u),m=hn(u);return E(m)===!1||JSON.stringify(m)===g?!1:(r(m),e==null||e(w),!0)}function l(w,E,u,g="default",m){let b=null;return!a(`Add ${E}`,B=>{if(!M(B,w))return!1;b=o();const D=wn(b,E,{slot:g,props:m});return xt(B,w,D,u,g)})||b===null?null:b}function i(w){a("Delete node",E=>{_n(E,w)})}function d(w,E,u,g="default"){a("Move node",m=>yn(m,w,E,u,g))}function p(w,E){a("Update props",u=>{const g=M(u,w);g&&(g.props={...g.props,...E})})}function v(w){a("Duplicate node",E=>{const u=M(E,w);if(!u)return;const g=G(E,w);if(!g)return;const m=I(u);g.parent.children.splice(g.index+1,0,m)})}function h(w){const E=M(n.value,w);if(!E||E.readonly)return!1;const u=G(n.value,w);return u?u.index>0:!1}function N(w){const E=M(n.value,w);if(!E||E.readonly)return!1;const u=G(n.value,w);return u?u.index<u.parent.children.length-1:!1}function c(w){h(w)&&a("Move node up",E=>{const u=G(E,w);if(!u||u.index<=0)return;const[g]=u.parent.children.splice(u.index,1);u.parent.children.splice(u.index-1,0,g)})}function C(w){N(w)&&a("Move node down",E=>{const u=G(E,w);if(!u||u.index>=u.parent.children.length-1)return;const[g]=u.parent.children.splice(u.index,1);u.parent.children.splice(u.index+1,0,g)})}function I(w){return{...w,id:o(),props:{...w.props},children:w.children.map(E=>I(E))}}return{addNode:l,deleteNode:i,moveNodeTo:d,updateNodeProps:p,duplicateNode:v,canMoveNodeUp:h,canMoveNodeDown:N,moveNodeUp:c,moveNodeDown:C}}const Tn="default";function Oe(){return{isDragging:!1,sourceNodeId:null,sourceComponentName:null,isNewComponent:!1,dropTargetId:null,dropIndex:0,dropSlot:Tn}}function Pn(){const n=t.ref(Oe());function o(){n.value=Oe()}function r(d){n.value={...Oe(),isDragging:!0,sourceNodeId:d}}function e(d){n.value={...Oe(),isDragging:!0,sourceComponentName:d,isNewComponent:!0}}function a(d,p,v=Tn){n.value.isDragging&&(n.value.dropTargetId=d,n.value.dropIndex=p,n.value.dropSlot=v)}function l(){const d={...n.value};return o(),d}function i(){o()}return{dragState:n,startDragExisting:r,startDragNew:e,updateDropTarget:a,endDrag:l,cancelDrag:i}}const dt=240,st=320,ct=3840,ut=4320,Yr=t.defineComponent({__name:"EditorToolbar",props:{canUndo:{type:Boolean,default:!1},canRedo:{type:Boolean,default:!1},isDirty:{type:Boolean,default:!1},viewport:{type:String,default:"desktop"},customViewportWidth:{type:Number,default:1024},customViewportHeight:{type:Number,default:768},activeViewportWidth:{type:Number,default:null},activeViewportHeight:{type:Number,default:null}},emits:["undo","redo","save","viewport-change","custom-viewport-change"],setup(n,{expose:o,emit:r}){o();const e=n,a=r,{t:l}=ne(),i={desktop:"toolbar.viewport.desktop",tablet:"toolbar.viewport.tablet",mobile:"toolbar.viewport.mobile",custom:"toolbar.viewport.custom"},d=["desktop","tablet","mobile","custom"],p=t.ref(new Map);function v(m){return l(i[m])}function h(m){return l("toolbar.viewport.switchAriaLabel",{viewport:v(m)})}function N(m,b){const S=b instanceof HTMLButtonElement?b:b&&"$el"in b&&b.$el instanceof HTMLButtonElement?b.$el:null;if(S){p.value.set(m,S);return}p.value.delete(m)}function c(m){return d.indexOf(m)}function C(m){var b;(b=p.value.get(m))==null||b.focus()}function I(m,b){const S=c(b);if(S<0||m.key!=="ArrowLeft"&&m.key!=="ArrowRight"&&m.key!=="ArrowUp"&&m.key!=="ArrowDown"&&m.key!=="Home"&&m.key!=="End")return;m.preventDefault();let B=S;m.key==="ArrowLeft"||m.key==="ArrowUp"?B=(S-1+d.length)%d.length:m.key==="ArrowRight"||m.key==="ArrowDown"?B=(S+1)%d.length:m.key==="Home"?B=0:m.key==="End"&&(B=d.length-1);const T=d[B];a("viewport-change",T),t.nextTick(()=>{C(T)})}function w(m,b,S){return Math.max(b,Math.min(S,m))}function E(m){if(!m.trim())return null;const b=Number(m);return Number.isFinite(b)?Math.round(b):null}function u(m,b){const S=E(b);if(S===null)return;const B=w(m==="width"?S:e.customViewportWidth,dt,ct),T=w(m==="height"?S:e.customViewportHeight,st,ut);a("custom-viewport-change",{width:B,height:T})}const g={MIN_VIEWPORT_WIDTH:dt,MIN_VIEWPORT_HEIGHT:st,MAX_VIEWPORT_WIDTH:ct,MAX_VIEWPORT_HEIGHT:ut,props:e,emit:a,t:l,VIEWPORT_LABEL_KEYS:i,VIEWPORT_ORDER:d,viewportButtonRefs:p,getViewportLabel:v,getViewportSwitchAriaLabel:h,setViewportButtonRef:N,getViewportIndex:c,focusViewportButton:C,handleViewportKeydown:I,clampViewportSize:w,parseViewportSize:E,updateCustomViewportSize:u,get VIEWPORT_PRESETS(){return Ie}};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}}),Xr=["aria-label"],Zr=["aria-label"],Jr=["disabled","aria-label","title"],Qr=["disabled","aria-label","title"],eo=["aria-label"],to=["title","aria-label","aria-pressed","data-viewport-preset","onClick","onKeydown"],no={key:0,class:"ipb-toolbar__custom-size"},ro={class:"ipb-toolbar__size-control"},oo=["aria-label","value"],ao={class:"ipb-toolbar__size-control"},io=["aria-label","value"],lo={key:1,class:"ipb-toolbar__viewport-size","aria-live":"polite"},so=["aria-label"],co=["aria-label"],uo=["aria-label","title"];function po(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("header",{class:"ipb-toolbar",role:"toolbar","aria-label":e.t("toolbar.aria.toolbar")},[t.createElementVNode("div",{class:"ipb-toolbar__left",role:"group","aria-label":e.t("toolbar.aria.historyControls")},[t.createElementVNode("button",{type:"button",class:"ipb-toolbar__btn",disabled:!r.canUndo,"aria-label":e.t("toolbar.undo.ariaLabel"),title:e.t("toolbar.undo.title"),"aria-keyshortcuts":"Control+Z Meta+Z",onClick:o[0]||(o[0]=i=>n.$emit("undo"))}," ↩ ",8,Jr),t.createElementVNode("button",{type:"button",class:"ipb-toolbar__btn",disabled:!r.canRedo,"aria-label":e.t("toolbar.redo.ariaLabel"),title:e.t("toolbar.redo.title"),"aria-keyshortcuts":"Control+Y Meta+Y Control+Shift+Z Meta+Shift+Z",onClick:o[1]||(o[1]=i=>n.$emit("redo"))}," ↪ ",8,Qr)],8,Zr),t.createElementVNode("div",{class:"ipb-toolbar__center",role:"group","aria-label":e.t("toolbar.aria.viewportControls")},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.VIEWPORT_PRESETS,(i,d)=>(t.openBlock(),t.createElementBlock("button",{key:d,ref_for:!0,ref:p=>e.setViewportButtonRef(d,p),type:"button",class:t.normalizeClass(["ipb-toolbar__btn",{"ipb-toolbar__btn--active":r.viewport===d}]),title:e.getViewportLabel(d),"aria-label":e.getViewportSwitchAriaLabel(d),"aria-pressed":r.viewport===d?"true":"false","data-viewport-preset":d,onClick:p=>n.$emit("viewport-change",d),onKeydown:p=>e.handleViewportKeydown(p,d)},t.toDisplayString(e.getViewportLabel(d)),43,to))),128)),r.viewport==="custom"?(t.openBlock(),t.createElementBlock("div",no,[t.createElementVNode("label",ro,[t.createElementVNode("span",null,t.toDisplayString(e.t("toolbar.viewport.width.short")),1),t.createElementVNode("input",{class:"ipb-toolbar__size-input",type:"number",inputmode:"numeric","aria-label":e.t("toolbar.viewport.width.ariaLabel"),min:e.MIN_VIEWPORT_WIDTH,max:e.MAX_VIEWPORT_WIDTH,value:r.customViewportWidth,onInput:o[2]||(o[2]=i=>e.updateCustomViewportSize("width",i.target.value))},null,40,oo)]),t.createElementVNode("label",ao,[t.createElementVNode("span",null,t.toDisplayString(e.t("toolbar.viewport.height.short")),1),t.createElementVNode("input",{class:"ipb-toolbar__size-input",type:"number",inputmode:"numeric","aria-label":e.t("toolbar.viewport.height.ariaLabel"),min:e.MIN_VIEWPORT_HEIGHT,max:e.MAX_VIEWPORT_HEIGHT,value:r.customViewportHeight,onInput:o[3]||(o[3]=i=>e.updateCustomViewportSize("height",i.target.value))},null,40,io)])])):t.createCommentVNode("v-if",!0),r.activeViewportWidth!==null&&r.activeViewportHeight!==null?(t.openBlock(),t.createElementBlock("span",lo,t.toDisplayString(r.activeViewportWidth)+"×"+t.toDisplayString(r.activeViewportHeight),1)):t.createCommentVNode("v-if",!0)],8,eo),t.createElementVNode("div",{class:"ipb-toolbar__right",role:"group","aria-label":e.t("toolbar.aria.saveControls")},[r.isDirty?(t.openBlock(),t.createElementBlock("span",{key:0,class:"ipb-toolbar__dirty-indicator",role:"status","aria-label":e.t("toolbar.aria.unsavedChanges")}," ● ",8,co)):t.createCommentVNode("v-if",!0),t.createElementVNode("button",{type:"button",class:"ipb-toolbar__btn ipb-toolbar__btn--primary","aria-label":e.t("toolbar.save.ariaLabel"),title:e.t("toolbar.save.title"),"aria-keyshortcuts":"Control+S Meta+S",onClick:o[4]||(o[4]=i=>n.$emit("save"))},t.toDisplayString(e.t("toolbar.save")),9,uo)],8,so)],8,Xr)}const fo=U(Yr,[["render",po],["__scopeId","data-v-fa6dcc09"],["__file","/app/src/components/editor/EditorToolbar.vue"]]);function mo(n,o){const r=fe(n.name);return!r||r.slots.length===0?[]:r.slots.filter(e=>{const a=e.allowedComponents;return!a||a.length===0||a.includes(o)})}function pe(n,o,r){const e=mo(n,r);if(e.length===0)return null;if(o){const l=e.find(i=>i.name===o);if(l)return l.name}const a=e.find(l=>l.name==="default");return(a==null?void 0:a.name)??e[0].name}function ze(n){return Number.isFinite(n)?Math.trunc(n):0}function Vn(n){return`ipb-node-${n}`}function Bn(n,o={}){const r=o.createKey??(l=>Vn(l.id)),e=[],a=[{node:n,depth:0,parentId:null}];for(;a.length>0;){const l=a.pop();if(!l)break;const i=e.length;e.push({node:l.node,id:l.node.id,key:r(l.node),depth:l.depth,index:i,parentId:l.parentId});for(let d=l.node.children.length-1;d>=0;d--)a.push({node:l.node.children[d],depth:l.depth+1,parentId:l.node.id})}return e}function Rn(n,o,r,e=0){const a=Math.max(0,ze(n)),l=Math.max(0,ze(r)),i=Math.max(0,ze(e));if(a===0||l===0)return{start:0,end:0,size:0,total:a};const d=a-1,p=Math.min(Math.max(ze(o),0),d),v=Math.max(0,p-i),h=Math.min(a,p+l+i);return{start:v,end:h,size:Math.max(0,h-v),total:a}}function go(n,o,r,e=0){const a=Rn(n.length,o,r,e);return{rows:n.slice(a.start,a.end),range:a}}function bo(n){const o=[],r=new Map,e=new Map;for(let a=0;a<n.length;a++){const l=n[a];o[a]=l.key,r.has(l.key)||r.set(l.key,a),e.has(l.id)||e.set(l.id,a)}return{keyByIndex:o,indexByKey:r,indexByNodeId:e}}const vo=t.defineComponent({__name:"TreePanel",props:{content:{type:Object,required:!0},selectedNodeId:{type:Number,default:null}},emits:["select"],setup(n,{expose:o,emit:r}){o();const e=n,a=r,{t:l}=ne(),i=t.inject(Ge,null),d=t.inject($e,null),p=t.ref(!1),v=t.ref(null),h=t.ref(null),N=t.computed(()=>e.content.id);function c(f,k,x="on"){var re,le;const O=(le=(re=f.target)==null?void 0:re.closest)==null?void 0:le.call(re,"[data-drop-zone]"),L=O==null?void 0:O.getAttribute("data-drop-zone");if(L==="above")return"above";if(L==="below")return"below";if(!k)return x;const z=k.getBoundingClientRect(),X=f.clientY-z.top,Z=z.height/3;return X<Z?"above":X>2*Z?"below":"on"}function C(f,k){const x=M(e.content,f);if(!x)return null;const O=x.slot??"default",L=G(e.content,f);if(!L){const X=e.content.id,Z=k==="above"?0:e.content.children.length;return{parentId:X,index:Z,slot:"default"}}const z=k==="above"?L.index:L.index+1;return{parentId:L.parent.id,index:z,slot:O}}function I(f,k){return f.id===k?!0:f.children.some(x=>I(x,k))}function w(f){var k;return f.sourceComponentName?f.sourceComponentName:f.sourceNodeId===null?null:((k=M(e.content,f.sourceNodeId))==null?void 0:k.name)??null}function E(f,k){if(f.sourceNodeId===k)return!1;const x=w(f);if(!x)return!1;const O=M(e.content,k);if(!O||O.readonly)return!1;if(!f.isNewComponent&&f.sourceNodeId!==null){const L=M(e.content,f.sourceNodeId);if(!L||L.readonly||I(L,k))return!1}return pe(O,"default",x)!==null}function u(f,k,x){const O=w(f);if(!O)return!1;const L=M(e.content,k);if(!L||L.readonly||pe(L,x,O)===null)return!1;if(!f.isNewComponent&&f.sourceNodeId!==null){const z=M(e.content,f.sourceNodeId);if(!z||z.readonly||I(z,k))return!1}return!0}const g=t.computed(()=>Bn(e.content).map(f=>({id:f.id,key:f.key,name:f.node.name,depth:f.depth,readonly:!!f.node.readonly}))),m=t.ref(new Map);function b(f,k){const x=k instanceof HTMLButtonElement?k:k&&"$el"in k&&k.$el instanceof HTMLButtonElement?k.$el:null;if(x){m.value.set(f,x);return}m.value.delete(f)}function S(f){if(!(f instanceof HTMLElement))return null;const k=f.dataset.nodeId;if(!k)return null;const x=Number(k);return Number.isInteger(x)?x:null}function B(f=!0){if(g.value.length===0)return-1;if(e.selectedNodeId!==null){const k=g.value.findIndex(x=>x.id===e.selectedNodeId);if(k>=0)return k}return f?0:-1}function T(f){var k;(k=m.value.get(f))==null||k.focus()}function D(f){const k=g.value[f];k&&(a("select",k.id),t.nextTick(()=>{T(k.id)}))}function j(f){var x;const k=B();return((x=g.value[k])==null?void 0:x.id)===f}const $=t.computed(()=>!!(i&&d)),q=f=>!!(d!=null&&d.dragState.value.isDragging&&v.value===f&&h.value==="on"),Y=f=>!!(d!=null&&d.dragState.value.isDragging&&v.value===f&&h.value==="above"),ee=f=>!!(d!=null&&d.dragState.value.isDragging&&v.value===f&&h.value==="below");function oe(f){return!$.value||f.readonly?!1:f.id!==N.value}function me(f,k){!d||!oe(f)||(p.value=!1,d.startDragExisting(f.id),k.dataTransfer&&(k.dataTransfer.effectAllowed="move",k.dataTransfer.setData("application/x-ipb-node-id",String(f.id)),k.dataTransfer.setData("text/plain",String(f.id))))}function Se(f,k){if(!d||!d.dragState.value.isDragging)return;const x=d.dragState.value,O=c(k,m.value.get(f.id));if(O==="on"){if(!E(x,f.id))return;k.preventDefault(),k.dataTransfer&&(k.dataTransfer.dropEffect=x.isNewComponent?"copy":"move"),v.value=f.id,h.value="on",d.updateDropTarget(f.id,0,"default");return}const L=C(f.id,O);!L||!u(x,L.parentId,L.slot)||(k.preventDefault(),k.dataTransfer&&(k.dataTransfer.dropEffect=x.isNewComponent?"copy":"move"),v.value=f.id,h.value=O,d.updateDropTarget(L.parentId,L.index,L.slot))}function Ce(f,k){var ge,Te;if(k.preventDefault(),!i||!d||!d.dragState.value.isDragging)return;const x=d.dragState.value,L=(v.value===f.id&&h.value?h.value:null)??c(k,m.value.get(f.id),"on");if(L==="on"){const de=M(e.content,f.id);if(!de||!E(x,f.id)){d.cancelDrag();return}const se=w(x),Ne=se?pe(de,"default",se)??"default":"default";if(x.isNewComponent&&x.sourceComponentName){const Pe=(ge=fe(x.sourceComponentName))==null?void 0:ge.defaultProps,Ee=i.addNode(f.id,x.sourceComponentName,0,Ne,Pe);p.value=!0,d.endDrag(),Ee!==null&&a("select",Ee);return}if(x.sourceNodeId===null)return;i.moveNodeTo(x.sourceNodeId,f.id,0,Ne),p.value=!0,d.endDrag(),a("select",x.sourceNodeId);return}const z=C(f.id,L);if(!z||!u(x,z.parentId,z.slot)){d.cancelDrag();return}const X=M(e.content,z.parentId),Z=w(x),re=X&&Z?pe(X,z.slot,Z)??z.slot:z.slot;if(x.isNewComponent&&x.sourceComponentName){const de=(Te=fe(x.sourceComponentName))==null?void 0:Te.defaultProps,se=i.addNode(z.parentId,x.sourceComponentName,z.index,re,de);p.value=!0,d.endDrag(),se!==null&&a("select",se);return}if(x.sourceNodeId===null)return;let le=z.index;const ke=G(e.content,x.sourceNodeId);ke&&ke.parent.id===z.parentId&&ke.index<z.index&&(le=z.index-1),i.moveNodeTo(x.sourceNodeId,z.parentId,le,re),p.value=!0,d.endDrag(),a("select",x.sourceNodeId)}function we(){v.value=null,h.value=null,!p.value&&(d!=null&&d.dragState.value.isDragging)&&d.cancelDrag()}function _(f){if(g.value.length===0)return;const k=S(f.target),x=k===null?B():g.value.findIndex(O=>O.id===k);if(!(x<0)){if(f.key==="ArrowDown"){f.preventDefault();const O=Math.min(g.value.length-1,x+1);D(O);return}if(f.key==="ArrowUp"){f.preventDefault();const O=Math.max(0,x-1);D(O);return}if(f.key==="Home"){f.preventDefault(),D(0);return}if(f.key==="End"){f.preventDefault(),D(g.value.length-1);return}(f.key==="Enter"||f.key===" ")&&(f.preventDefault(),D(x))}}t.watch(()=>e.selectedNodeId,f=>{f!==null&&t.nextTick(()=>{T(f)})});const R={props:e,emit:a,t:l,nodeTree:i,dragDrop:d,dropHandled:p,dropTargetRowId:v,dropZone:h,rootId:N,getDropZoneFromEvent:c,getSiblingDropTarget:C,isNodeInSubtree:I,getDraggedComponentName:w,isValidDropTarget:E,isValidSiblingDropTarget:u,rows:g,rowButtonRefs:m,setRowButtonRef:b,getRowIdFromEventTarget:S,getActiveRowIndex:B,focusRowById:T,selectRowByIndex:D,isRowTabStop:j,canDragDrop:$,isDropTargetOn:q,isDropTargetAbove:Y,isDropTargetBelow:ee,isRowDraggable:oe,handleTreeDragStart:me,handleTreeDragOver:Se,handleTreeDrop:Ce,handleTreeDragEnd:we,handleTreeKeydown:_};return Object.defineProperty(R,"__isScriptSetup",{enumerable:!1,value:!0}),R}}),ho={class:"ipb-tree-panel"},_o=["aria-label"],yo=["onDragover","onDrop"],wo={key:0,class:"ipb-tree-panel__drop-line","data-drop-zone":"above","aria-hidden":"true"},ko=["data-node-id","draggable","aria-selected","aria-level","aria-readonly","tabindex","onClick","onDragstart"],No={class:"ipb-tree-panel__name"},Eo={class:"ipb-tree-panel__id"},xo={key:0,class:"ipb-tree-panel__readonly"},Io={key:1,class:"ipb-tree-panel__drop-line","data-drop-zone":"below","aria-hidden":"true"};function Do(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("div",ho,[t.createElementVNode("div",{class:"ipb-tree-panel__list",role:"tree","aria-label":e.t("treePanel.ariaLabel"),onKeydown:e.handleTreeKeydown},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.rows,i=>(t.openBlock(),t.createElementBlock("div",{key:i.key,class:"ipb-tree-panel__row-wrapper",onDragover:d=>e.handleTreeDragOver(i,d),onDrop:d=>e.handleTreeDrop(i,d)},[e.isDropTargetAbove(i.id)?(t.openBlock(),t.createElementBlock("div",wo)):t.createCommentVNode("v-if",!0),t.createElementVNode("button",{ref_for:!0,ref:d=>e.setRowButtonRef(i.id,d),type:"button",class:t.normalizeClass(["ipb-tree-panel__item",{"ipb-tree-panel__item--selected":r.selectedNodeId===i.id,"ipb-tree-panel__item--readonly":i.readonly,"ipb-tree-panel__item--drop-target":e.isDropTargetOn(i.id),"ipb-tree-panel__item--draggable":e.isRowDraggable(i)}]),style:t.normalizeStyle({paddingInlineStart:`${i.depth*16+8}px`}),"data-node-id":i.id,draggable:e.isRowDraggable(i),role:"treeitem","aria-selected":r.selectedNodeId===i.id?"true":"false","aria-level":i.depth+1,"aria-readonly":i.readonly?"true":"false",tabindex:e.isRowTabStop(i.id)?0:-1,onClick:d=>e.emit("select",i.id),onDragstart:d=>e.handleTreeDragStart(i,d),onDragend:e.handleTreeDragEnd},[t.createElementVNode("span",No,t.toDisplayString(i.name),1),t.createElementVNode("span",Eo,"#"+t.toDisplayString(i.id),1),i.readonly?(t.openBlock(),t.createElementBlock("span",xo,t.toDisplayString(e.t("treePanel.readonly")),1)):t.createCommentVNode("v-if",!0)],46,ko),e.isDropTargetBelow(i.id)?(t.openBlock(),t.createElementBlock("div",Io)):t.createCommentVNode("v-if",!0)],40,yo))),128))],40,_o)])}const So=U(vo,[["render",Do],["__scopeId","data-v-3fdd09e6"],["__file","/app/src/components/editor/TreePanel.vue"]]),xe="ipb-left-drawer-content",Co="ipb-left-drawer-tree-panel",To=t.defineComponent({__name:"LeftDrawer",props:{open:{type:Boolean,default:!0},content:{type:Object,default:null},selectedNodeId:{type:Number,default:null}},emits:["toggle","dragStart","dragEnd","add","select"],setup(n,{expose:o,emit:r}){o();const e=n,a=r,l=t.computed(()=>Yt()),{t:i}=ne(),d=t.ref(""),p=t.ref(!0),v=t.ref(null),h=t.ref(null),N=t.ref(null),c=t.ref(!1),C=t.computed(()=>{const D=d.value.trim().toLowerCase();if(!D)return l.value;const j=new Map;for(const[$,q]of l.value){const Y=q.filter(ee=>[ee.name,ee.label,ee.description??"",$,ee.category].some(me=>me.toLowerCase().includes(D)));Y.length>0&&j.set($,Y)}return j});function I(D,j){j.dataTransfer&&(j.dataTransfer.effectAllowed="copy",j.dataTransfer.setData("application/x-ipb-component",D),j.dataTransfer.setData("text/plain",D)),a("dragStart",D)}function w(){a("dragEnd")}function E(D){a("add",D)}function u(){p.value=!p.value}function g(){const D=v.value;return D?D.querySelector(`#${xe} button:not([disabled]), #${xe} input:not([disabled]), #${xe} select:not([disabled]), #${xe} textarea:not([disabled]), #${xe} [tabindex]:not([tabindex="-1"])`):null}function m(){var D,j;(D=N.value)==null||D.focus(),document.activeElement!==N.value&&((j=g())==null||j.focus())}function b(){c.value=!e.open,a("toggle")}function S(D){return i("leftDrawer.category.ariaLabel",{category:D})}function B(D){return i("leftDrawer.component.dragAriaLabel",{label:D})}t.watch(()=>e.open,(D,j)=>{var $;if(D&&!j&&c.value&&t.nextTick(()=>{m()}),!D&&j){const q=document.activeElement;q instanceof HTMLElement&&(($=v.value)!=null&&$.contains(q))&&t.nextTick(()=>{var Y;(Y=h.value)==null||Y.focus()})}D!==j&&(c.value=!1)});const T={props:e,emit:a,categorizedComponents:l,t:i,searchQuery:d,treeOpen:p,DRAWER_CONTENT_ID:xe,TREE_PANEL_REGION_ID:Co,drawerRef:v,drawerToggleRef:h,searchInputRef:N,focusContentOnNextOpen:c,filteredCategorizedComponents:C,handleDragStart:I,handleDragEnd:w,handleComponentAdd:E,toggleTree:u,getFirstFocusableDrawerControl:g,focusDrawerContent:m,handleDrawerToggle:b,getCategoryAriaLabel:S,getDragAriaLabel:B,TreePanel:So};return Object.defineProperty(T,"__isScriptSetup",{enumerable:!1,value:!0}),T}}),Po=["aria-label"],Vo={class:"ipb-left-drawer__header"},Bo={class:"ipb-left-drawer__title",id:"ipb-left-drawer-title"},Ro=["aria-label","aria-expanded"],Ao={class:"ipb-left-drawer__section"},Lo={class:"ipb-left-drawer__section-title",id:"ipb-left-drawer-components-title"},Mo={class:"ipb-left-drawer__search",role:"search"},Oo=["placeholder","aria-label"],zo={class:"ipb-left-drawer__category-title"},jo=["aria-label"],Ho=["title","aria-label","onClick","onDragstart"],Uo={class:"ipb-left-drawer__component-icon","aria-hidden":"true"},Wo={class:"ipb-left-drawer__component-label"},Ko={key:0,class:"ipb-left-drawer__empty"},Fo={key:0,class:"ipb-left-drawer__section ipb-left-drawer__section--tree"},Go={class:"ipb-left-drawer__section-header"},$o={class:"ipb-left-drawer__section-title"},qo=["aria-expanded","aria-label"],Yo=["aria-label"];function Xo(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("aside",{ref:"drawerRef",class:t.normalizeClass(["ipb-left-drawer",{"ipb-left-drawer--open":r.open}]),"aria-label":e.t("leftDrawer.aria.componentPalette"),role:"complementary"},[t.createElementVNode("div",Vo,[t.createElementVNode("span",Bo,t.toDisplayString(e.t("leftDrawer.title")),1),t.createElementVNode("button",{ref:"drawerToggleRef",type:"button",class:"ipb-left-drawer__toggle","aria-label":e.t("leftDrawer.toggle.ariaLabel"),"aria-expanded":r.open?"true":"false","aria-controls":e.DRAWER_CONTENT_ID,onClick:e.handleDrawerToggle},t.toDisplayString(r.open?"◀":"▶"),9,Ro)]),r.open?(t.openBlock(),t.createElementBlock("div",{key:0,id:e.DRAWER_CONTENT_ID,class:"ipb-left-drawer__content",role:"region","aria-labelledby":"ipb-left-drawer-title"},[t.createElementVNode("div",Ao,[t.createElementVNode("h3",Lo,t.toDisplayString(e.t("leftDrawer.section.components")),1),t.createElementVNode("div",Mo,[t.withDirectives(t.createElementVNode("input",{ref:"searchInputRef","onUpdate:modelValue":o[0]||(o[0]=i=>e.searchQuery=i),type:"search",class:"ipb-left-drawer__search-input",placeholder:e.t("leftDrawer.search.placeholder"),"aria-label":e.t("leftDrawer.search.ariaLabel")},null,8,Oo),[[t.vModelText,e.searchQuery]])]),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.filteredCategorizedComponents,([i,d])=>(t.openBlock(),t.createElementBlock("div",{key:i,class:"ipb-left-drawer__category"},[t.createElementVNode("h4",zo,t.toDisplayString(i),1),t.createElementVNode("div",{class:"ipb-left-drawer__component-list",role:"group","aria-label":e.getCategoryAriaLabel(i)},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(d,p=>(t.openBlock(),t.createElementBlock("button",{key:p.name,type:"button",class:"ipb-left-drawer__component-item",draggable:"true",title:p.description,"aria-label":e.getDragAriaLabel(p.label),"aria-keyshortcuts":"Enter Space",onClick:v=>e.handleComponentAdd(p.name),onDragstart:v=>e.handleDragStart(p.name,v),onDragend:e.handleDragEnd},[t.createElementVNode("span",Uo,t.toDisplayString(p.icon??"◻"),1),t.createElementVNode("span",Wo,t.toDisplayString(p.label),1)],40,Ho))),128))],8,jo)]))),128)),e.filteredCategorizedComponents.size===0?(t.openBlock(),t.createElementBlock("p",Ko,t.toDisplayString(e.t("leftDrawer.empty")),1)):t.createCommentVNode("v-if",!0)]),r.content?(t.openBlock(),t.createElementBlock("div",Fo,[t.createElementVNode("div",Go,[t.createElementVNode("h3",$o,t.toDisplayString(e.t("leftDrawer.section.tree")),1),t.createElementVNode("button",{type:"button",class:"ipb-left-drawer__section-toggle","aria-expanded":e.treeOpen?"true":"false","aria-controls":e.TREE_PANEL_REGION_ID,"aria-label":e.t("leftDrawer.tree.toggle.ariaLabel"),onClick:e.toggleTree},t.toDisplayString(e.treeOpen?"−":"+"),9,qo)]),e.treeOpen?(t.openBlock(),t.createElementBlock("div",{key:0,id:e.TREE_PANEL_REGION_ID,role:"region","aria-label":e.t("treePanel.ariaLabel")},[t.createVNode(e.TreePanel,{content:r.content,"selected-node-id":r.selectedNodeId,onSelect:o[1]||(o[1]=i=>e.emit("select",i))},null,8,["content","selected-node-id"])],8,Yo)):t.createCommentVNode("v-if",!0)])):t.createCommentVNode("v-if",!0)])):t.createCommentVNode("v-if",!0)],10,Po)}const Zo=U(To,[["render",Xo],["__scopeId","data-v-32b2016a"],["__file","/app/src/components/editor/LeftDrawer.vue"]]),Jo=t.defineComponent({__name:"PropTextEditor",props:{modelValue:{type:[String,Number,Boolean],default:""},placeholder:{type:String,default:""}},emits:["update:modelValue"],setup(n,{expose:o,emit:r}){o();const e=n,a=r;function l(d){a("update:modelValue",d.target.value)}const i={props:e,emit:a,handleInput:l};return Object.defineProperty(i,"__isScriptSetup",{enumerable:!1,value:!0}),i}}),Qo=["value","placeholder"];function ea(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("input",{class:"ipb-prop-editor ipb-prop-editor--text",type:"text",value:String(e.props.modelValue??""),placeholder:r.placeholder,onInput:e.handleInput},null,40,Qo)}const He=U(Jo,[["render",ea],["__scopeId","data-v-85eee1e0"],["__file","/app/src/components/editor/prop-editors/PropTextEditor.vue"]]),ta=t.defineComponent({__name:"PropNumberEditor",props:{modelValue:{type:[String,Number],default:void 0},min:{type:Number,default:void 0},max:{type:Number,default:void 0}},emits:["update:modelValue"],setup(n,{expose:o,emit:r}){o();const e=n,a=r,l=t.computed(()=>typeof e.modelValue=="number"?String(e.modelValue):typeof e.modelValue=="string"?e.modelValue:"");function i(p){const v=p.target.value.trim();if(v===""){a("update:modelValue",void 0);return}const h=Number(v);a("update:modelValue",Number.isNaN(h)?void 0:h)}const d={props:e,emit:a,inputValue:l,handleInput:i};return Object.defineProperty(d,"__isScriptSetup",{enumerable:!1,value:!0}),d}}),na=["value","min","max"];function ra(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("input",{class:"ipb-prop-editor ipb-prop-editor--number",type:"number",value:e.inputValue,min:r.min,max:r.max,onInput:e.handleInput},null,40,na)}const oa=U(ta,[["render",ra],["__scopeId","data-v-5ad594ed"],["__file","/app/src/components/editor/prop-editors/PropNumberEditor.vue"]]),aa=t.defineComponent({inheritAttrs:!1,__name:"PropBooleanEditor",props:{modelValue:{type:Boolean,default:!1}},emits:["update:modelValue"],setup(n,{expose:o,emit:r}){o();const e=r;function a(v){e("update:modelValue",v.target.checked)}const{t:l}=ne(),i=t.useAttrs(),d=t.computed(()=>{const{class:v,style:h,...N}=i;return N}),p={emit:e,handleChange:a,t:l,attrs:i,checkboxAttrs:d};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}}),ia=["checked"];function la(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("label",{class:t.normalizeClass(["ipb-prop-editor ipb-prop-editor--boolean",e.attrs.class]),style:t.normalizeStyle(e.attrs.style)},[t.createElementVNode("input",t.mergeProps(e.checkboxAttrs,{type:"checkbox",checked:r.modelValue,onChange:e.handleChange}),null,16,ia),t.createElementVNode("span",null,t.toDisplayString(r.modelValue?e.t("propBoolean.enabled"):e.t("propBoolean.disabled")),1)],6)}const da=U(aa,[["render",la],["__scopeId","data-v-264db8de"],["__file","/app/src/components/editor/prop-editors/PropBooleanEditor.vue"]]),sa=t.defineComponent({__name:"PropSelectEditor",props:{modelValue:{type:[String,Number,Boolean],default:void 0},options:{type:Array,default:()=>[]}},emits:["update:modelValue"],setup(n,{expose:o,emit:r}){o();const e=n,a=r,l=t.computed(()=>{if(!e.options||e.options.length===0)return"";const v=e.options.findIndex(h=>h.value===e.modelValue);return v>=0?String(v):"0"});function i(v){const h=v.target.value;if(h===""||!e.options){a("update:modelValue",void 0);return}const N=e.options[Number(h)];a("update:modelValue",N==null?void 0:N.value)}const{t:d}=ne(),p={props:e,emit:a,selectedIndex:l,handleChange:i,t:d};return Object.defineProperty(p,"__isScriptSetup",{enumerable:!1,value:!0}),p}}),ca=["value"],ua={key:0,value:""},pa=["value"];function fa(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("select",{class:"ipb-prop-editor ipb-prop-editor--select",value:e.selectedIndex,onChange:e.handleChange},[!r.options||r.options.length===0?(t.openBlock(),t.createElementBlock("option",ua,t.toDisplayString(e.t("propSelect.noOptions")),1)):t.createCommentVNode("v-if",!0),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(r.options??[],(i,d)=>(t.openBlock(),t.createElementBlock("option",{key:`${i.label}-${d}`,value:String(d)},t.toDisplayString(i.label),9,pa))),128))],40,ca)}const ma=U(sa,[["render",fa],["__scopeId","data-v-565c4e19"],["__file","/app/src/components/editor/prop-editors/PropSelectEditor.vue"]]),ga=t.defineComponent({inheritAttrs:!1,__name:"PropColorEditor",props:{modelValue:{type:String,default:""}},emits:["update:modelValue"],setup(n,{expose:o,emit:r}){o();const e=n,a=r,l=t.computed(()=>{const N=e.modelValue.trim();return/^#[0-9a-fA-F]{6}$/.test(N)?N:/^#[0-9a-fA-F]{3}$/.test(N)?`#${N.slice(1).split("").map(C=>`${C}${C}`).join("")}`:"#000000"});function i(N){a("update:modelValue",N.target.value)}function d(N){a("update:modelValue",N.target.value)}const p=t.useAttrs(),v=t.computed(()=>{const{class:N,style:c,...C}=p;return C}),h={props:e,emit:a,pickerValue:l,handlePickerInput:i,handleTextInput:d,attrs:p,inputAttrs:v};return Object.defineProperty(h,"__isScriptSetup",{enumerable:!1,value:!0}),h}}),ba=["value"],va=["value"];function ha(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(["ipb-prop-editor ipb-prop-editor--color",e.attrs.class]),style:t.normalizeStyle(e.attrs.style)},[t.createElementVNode("input",t.mergeProps(e.inputAttrs,{class:"ipb-prop-editor__picker",type:"color",value:e.pickerValue,onInput:e.handlePickerInput}),null,16,ba),t.createElementVNode("input",t.mergeProps(e.inputAttrs,{class:"ipb-prop-editor__text",type:"text",value:r.modelValue,placeholder:"#000000",onInput:e.handleTextInput}),null,16,va)],6)}const _a=U(ga,[["render",ha],["__scopeId","data-v-57860a2c"],["__file","/app/src/components/editor/prop-editors/PropColorEditor.vue"]]),ya=t.defineComponent({inheritAttrs:!1,__name:"RichTextEditor",props:{modelValue:{type:String,default:""},placeholder:{type:String,default:"Type text..."}},emits:["update:modelValue"],setup(n,{expose:o,emit:r}){o();const e=n,a=r,l=t.ref(null),i=t.ref("");function d(m){return typeof m!="string"?"":yt(m)}function p(m){const b=l.value;if(!b)return;const S=d(m);b.innerHTML!==S&&(b.innerHTML=S),i.value=S}function v(){const m=l.value;if(!m)return;const b=d(m.innerHTML);m.innerHTML!==b&&(m.innerHTML=b),b!==i.value&&(i.value=b,a("update:modelValue",b))}function h(){var m;(m=l.value)==null||m.focus()}function N(m,b){typeof document.execCommand=="function"&&document.execCommand(m,!1,b)}function c(m){h(),N(m),v()}function C(){h();const m=window.prompt(I("richText.prompt.enterUrl"),I("richText.prompt.defaultUrl"));if(!m)return;const b=Q(m,"link");b&&(N("createLink",b),v())}t.onMounted(()=>{p(d(e.modelValue))}),t.watch(()=>e.modelValue,m=>{p(d(m))});const{t:I}=ne(),w=t.useAttrs(),E=t.computed(()=>{const{class:m,style:b,...S}=w;return S}),u=t.computed(()=>{const m=w["aria-labelledby"],b=w["aria-label"];if(!(m||b))return I("richText.aria.editor")}),g={props:e,emit:a,editorRef:l,lastEmittedValue:i,getSanitizedHtml:d,syncEditorHtml:p,emitCurrentHtml:v,focusEditor:h,executeCommand:N,runCommand:c,insertLink:C,t:I,attrs:w,contentAttrs:E,editorAriaLabel:u};return Object.defineProperty(g,"__isScriptSetup",{enumerable:!1,value:!0}),g}}),wa=["aria-label"],ka=["aria-label","title"],Na=["aria-label","title"],Ea=["aria-label","title"],xa=["aria-label","title"],Ia=["aria-label","title"],Da=["aria-label","data-placeholder"];function Sa(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(["ipb-richtext-editor",e.attrs.class]),style:t.normalizeStyle(e.attrs.style)},[t.createElementVNode("div",{class:"ipb-richtext-editor__toolbar",role:"toolbar","aria-label":e.t("richText.aria.toolbar")},[t.createElementVNode("button",{type:"button","data-command":"bold","aria-label":e.t("richText.action.bold"),title:e.t("richText.action.bold"),onClick:o[0]||(o[0]=i=>e.runCommand("bold"))},[...o[4]||(o[4]=[t.createElementVNode("strong",null,"B",-1)])],8,ka),t.createElementVNode("button",{type:"button","data-command":"italic","aria-label":e.t("richText.action.italic"),title:e.t("richText.action.italic"),onClick:o[1]||(o[1]=i=>e.runCommand("italic"))},[...o[5]||(o[5]=[t.createElementVNode("em",null,"I",-1)])],8,Na),t.createElementVNode("button",{type:"button","data-command":"ul","aria-label":e.t("richText.action.unorderedList"),title:e.t("richText.action.unorderedList"),onClick:o[2]||(o[2]=i=>e.runCommand("insertUnorderedList"))}," UL ",8,Ea),t.createElementVNode("button",{type:"button","data-command":"ol","aria-label":e.t("richText.action.orderedList"),title:e.t("richText.action.orderedList"),onClick:o[3]||(o[3]=i=>e.runCommand("insertOrderedList"))}," OL ",8,xa),t.createElementVNode("button",{type:"button","data-command":"link","aria-label":e.t("richText.action.link"),title:e.t("richText.action.link"),onClick:e.insertLink},t.toDisplayString(e.t("richText.action.link")),9,Ia)],8,wa),t.createElementVNode("div",t.mergeProps(e.contentAttrs,{ref:"editorRef",class:"ipb-richtext-editor__content",contenteditable:"true",role:"textbox","aria-multiline":"true","aria-label":e.editorAriaLabel,"data-placeholder":r.placeholder,onInput:e.emitCurrentHtml,onBlur:e.emitCurrentHtml}),null,16,Da)],6)}const Ca=U(ya,[["render",Sa],["__scopeId","data-v-3bf126f9"],["__file","/app/src/components/editor/prop-editors/RichTextEditor.vue"]]),Ta=t.defineComponent({inheritAttrs:!1,__name:"MediaPicker",props:{modelValue:{type:String,default:""}},emits:["update:modelValue","upload"],setup(n,{expose:o,emit:r}){o();const e=n,a=r,l=t.computed(()=>e.modelValue.trim()),i=t.computed(()=>Q(l.value,"media")),d=t.computed(()=>l.value.length>0),p=t.computed(()=>i.value.length>0);function v(E){const u=E.target.value;a("update:modelValue",Q(u,"media"))}function h(){a("update:modelValue","")}function N(){a("upload")}const{t:c}=ne(),C=t.useAttrs(),I=t.computed(()=>{const{class:E,style:u,...g}=C;return g}),w={props:e,emit:a,rawValue:l,safePreviewUrl:i,hasValue:d,canPreview:p,handleInput:v,handleClear:h,handleUploadPlaceholder:N,t:c,attrs:C,inputAttrs:I};return Object.defineProperty(w,"__isScriptSetup",{enumerable:!1,value:!0}),w}}),Pa={class:"ipb-media-picker__controls"},Va=["value","placeholder"],Ba=["disabled"],Ra={class:"ipb-media-picker__preview"},Aa=["src","alt"],La={key:1,class:"ipb-media-picker__empty"};function Ma(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("div",{class:t.normalizeClass(["ipb-media-picker",e.attrs.class]),style:t.normalizeStyle(e.attrs.style)},[t.createElementVNode("div",Pa,[t.createElementVNode("input",t.mergeProps(e.inputAttrs,{class:"ipb-media-picker__input",type:"url",value:r.modelValue,placeholder:e.t("mediaPicker.input.placeholder"),onInput:e.handleInput}),null,16,Va),t.createElementVNode("button",{class:"ipb-media-picker__btn",type:"button",disabled:!e.hasValue,onClick:e.handleClear},t.toDisplayString(e.t("mediaPicker.clear")),9,Ba),t.createElementVNode("button",{class:"ipb-media-picker__btn",type:"button",onClick:e.handleUploadPlaceholder},t.toDisplayString(e.t("mediaPicker.upload")),1)]),t.createElementVNode("div",Ra,[e.hasValue&&e.canPreview?(t.openBlock(),t.createElementBlock("img",{key:0,class:"ipb-media-picker__image",src:e.safePreviewUrl,alt:e.t("mediaPicker.preview.alt")},null,8,Aa)):(t.openBlock(),t.createElementBlock("p",La,t.toDisplayString(e.t("mediaPicker.empty")),1))])],6)}const Ht=U(Ta,[["render",Ma],["__scopeId","data-v-68f678e9"],["__file","/app/src/components/editor/prop-editors/MediaPicker.vue"]]),Oa=He,za={text:He,textarea:He,richtext:Ca,number:oa,boolean:da,select:ma,color:_a,image:Ht,url:Ht,json:He},he="ipb-right-drawer-content",ja=t.defineComponent({__name:"RightDrawer",props:{open:{type:Boolean,default:!1},selectedNodeId:{type:Number,default:null},content:{type:Object,required:!0}},emits:["toggle","update-props","delete","duplicate"],setup(n,{expose:o,emit:r}){o();const e=n,a=r,{t:l}=ne(),i=t.ref(null),d=t.ref(null),p=t.ref(!1),v=t.computed(()=>e.selectedNodeId===null?null:M(e.content,e.selectedNodeId)??null),h=t.computed(()=>v.value?fe(v.value.name)??null:null);function N(b){return v.value?v.value.props[b.key]??b.defaultValue??"":b.defaultValue??""}function c(b){return za[b]??Oa}function C(b){var B,T;const S=N(b);return b.type==="number"?{modelValue:S,min:(B=b.validation)==null?void 0:B.min,max:(T=b.validation)==null?void 0:T.max}:b.type==="select"?{modelValue:S,options:b.options??[]}:b.type==="image"||b.type==="url"?{modelValue:S}:b.type==="text"||b.type==="textarea"||b.type==="richtext"||b.type==="json"?{modelValue:S,placeholder:b.label}:{modelValue:S}}function I(b,S){v.value&&a("update-props",v.value.id,{[b]:S})}function w(b){return`ipb-right-drawer-prop-label-${b}`}function E(){const b=i.value;return b?b.querySelector(`#${he} input:not([disabled]), #${he} select:not([disabled]), #${he} textarea:not([disabled]), #${he} button:not([disabled]), #${he} [contenteditable]:not([contenteditable="false"]), #${he} [tabindex]:not([tabindex="-1"])`):null}function u(){var b;(b=E())==null||b.focus()}function g(){p.value=!e.open,a("toggle")}t.watch(()=>e.open,(b,S)=>{var B;if(b&&!S&&p.value&&t.nextTick(()=>{u()}),!b&&S){const T=document.activeElement;T instanceof HTMLElement&&((B=i.value)!=null&&B.contains(T))&&t.nextTick(()=>{var D;(D=d.value)==null||D.focus()})}b!==S&&(p.value=!1)});const m={props:e,emit:a,t:l,drawerRef:i,drawerToggleRef:d,focusContentOnNextOpen:p,selectedNode:v,componentDef:h,getPropValue:N,getEditorComponent:c,getEditorBindings:C,handlePropUpdate:I,DRAWER_CONTENT_ID:he,getPropLabelId:w,getFirstFocusableContentControl:E,focusDrawerContent:u,handleDrawerToggle:g};return Object.defineProperty(m,"__isScriptSetup",{enumerable:!1,value:!0}),m}}),Ha=["aria-label"],Ua={class:"ipb-right-drawer__header"},Wa={class:"ipb-right-drawer__title",id:"ipb-right-drawer-title"},Ka=["aria-label","aria-expanded"],Fa={class:"ipb-right-drawer__section"},Ga={class:"ipb-right-drawer__section-title"},$a={key:0,class:"ipb-right-drawer__description"},qa={class:"ipb-right-drawer__section"},Ya={class:"ipb-right-drawer__section-subtitle"},Xa=["data-prop-key"],Za=["id"],Ja={class:"ipb-right-drawer__actions"},Qa=["aria-label"],ei=["disabled","aria-label"],ti={key:1,class:"ipb-right-drawer__empty"};function ni(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("aside",{ref:"drawerRef",class:t.normalizeClass(["ipb-right-drawer",{"ipb-right-drawer--open":r.open}]),role:"complementary","aria-label":e.t("rightDrawer.aria.componentProperties")},[t.createElementVNode("div",Ua,[t.createElementVNode("span",Wa,t.toDisplayString(e.t("rightDrawer.title")),1),t.createElementVNode("button",{ref:"drawerToggleRef",type:"button",class:"ipb-right-drawer__toggle","aria-label":e.t("rightDrawer.toggle.ariaLabel"),"aria-expanded":r.open?"true":"false","aria-controls":e.DRAWER_CONTENT_ID,onClick:e.handleDrawerToggle},t.toDisplayString(r.open?"▶":"◀"),9,Ka)]),r.open&&e.selectedNode&&e.componentDef?(t.openBlock(),t.createElementBlock("div",{key:0,id:e.DRAWER_CONTENT_ID,class:"ipb-right-drawer__content",role:"region","aria-labelledby":"ipb-right-drawer-title"},[t.createElementVNode("div",Fa,[t.createElementVNode("h3",Ga,t.toDisplayString(e.componentDef.label),1),e.componentDef.description?(t.openBlock(),t.createElementBlock("p",$a,t.toDisplayString(e.componentDef.description),1)):t.createCommentVNode("v-if",!0)]),t.createElementVNode("div",qa,[t.createElementVNode("h4",Ya,t.toDisplayString(e.t("rightDrawer.section.properties")),1),t.createCommentVNode(" Property editors will be rendered here based on editableProps "),(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.componentDef.editableProps,i=>(t.openBlock(),t.createElementBlock("div",{key:i.key,class:"ipb-right-drawer__prop","data-prop-key":i.key},[t.createElementVNode("label",{id:e.getPropLabelId(i.key),class:"ipb-right-drawer__prop-label"},t.toDisplayString(i.label),9,Za),(t.openBlock(),t.createBlock(t.resolveDynamicComponent(e.getEditorComponent(i.type)),t.mergeProps({class:"ipb-right-drawer__prop-editor"},{ref_for:!0},e.getEditorBindings(i),{"aria-labelledby":e.getPropLabelId(i.key),"onUpdate:modelValue":d=>e.handlePropUpdate(i.key,d)}),null,16,["aria-labelledby","onUpdate:modelValue"]))],8,Xa))),128))]),t.createElementVNode("div",Ja,[t.createElementVNode("button",{type:"button",class:"ipb-right-drawer__btn","aria-label":e.t("rightDrawer.actions.duplicate.ariaLabel"),onClick:o[0]||(o[0]=i=>e.emit("duplicate",e.selectedNode.id))},t.toDisplayString(e.t("rightDrawer.actions.duplicate")),9,Qa),t.createElementVNode("button",{type:"button",class:"ipb-right-drawer__btn ipb-right-drawer__btn--danger",disabled:e.selectedNode.readonly,"aria-label":e.t("rightDrawer.actions.delete.ariaLabel"),onClick:o[1]||(o[1]=i=>e.emit("delete",e.selectedNode.id))},t.toDisplayString(e.t("rightDrawer.actions.delete")),9,ei)])])):r.open?(t.openBlock(),t.createElementBlock("div",ti,[t.createElementVNode("p",null,t.toDisplayString(e.t("rightDrawer.empty")),1)])):t.createCommentVNode("v-if",!0)],10,Ha)}const ri=U(ja,[["render",ni],["__scopeId","data-v-77af2668"],["__file","/app/src/components/editor/RightDrawer.vue"]]),An="@improba/page-builder/iframe-bridge",Ln=1;function St(n,o,r){return{namespace:An,version:Ln,sessionToken:r,channel:n,payload:o}}function oi(){var n,o;if(typeof((n=globalThis.crypto)==null?void 0:n.randomUUID)=="function")return globalThis.crypto.randomUUID();if(typeof((o=globalThis.crypto)==null?void 0:o.getRandomValues)=="function"){const r=new Uint8Array(16);return globalThis.crypto.getRandomValues(r),Array.from(r,e=>e.toString(16).padStart(2,"0")).join("")}return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,12)}`}function Mn(n){return St("lifecycle",{state:"ready"},n)}function On(n,o){return St("pointer",n,o)}function zn(n,o){return St("keydown",n,o)}function Ke(n){return!!n&&typeof n=="object"}function ai(n){if(!Ke(n))return null;const o=n.interaction,r=n.nodeId;if(o!=="hover"&&o!=="select"&&o!=="context"||r!==null&&typeof r!="number"||typeof r=="number"&&!Number.isInteger(r))return null;const e=r;if(o==="context"){const a=n.clientX,l=n.clientY;return typeof a!="number"||typeof l!="number"?null:{interaction:o,nodeId:e,clientX:a,clientY:l}}return{interaction:o,nodeId:e}}function ii(n){return!Ke(n)||typeof n.key!="string"||typeof n.code!="string"||typeof n.ctrlKey!="boolean"||typeof n.metaKey!="boolean"||typeof n.shiftKey!="boolean"||typeof n.altKey!="boolean"||typeof n.defaultPrevented!="boolean"||typeof n.isEditable!="boolean"?null:{key:n.key,code:n.code,ctrlKey:n.ctrlKey,metaKey:n.metaKey,shiftKey:n.shiftKey,altKey:n.altKey,defaultPrevented:n.defaultPrevented,isEditable:n.isEditable}}function li(n,o={}){if(!Ke(n)||n.namespace!==An||n.version!==Ln||n.channel!=="keydown"&&n.channel!=="pointer"&&n.channel!=="lifecycle")return null;const r=n.sessionToken,e=typeof r=="string"&&r.length>0;if(o.expectedSessionToken){if(!e||r!==o.expectedSessionToken)return null}else if(!e&&!o.allowLegacyNoSessionToken)return null;const a=e?r:"";if(n.channel==="lifecycle")return!Ke(n.payload)||n.payload.state!=="ready"?null:Mn(a);if(n.channel==="pointer"){const i=ai(n.payload);return i?On(i,a):null}const l=ii(n.payload);return l?zn(l,a):null}function di(n){const o=r=>{var a,l,i;if(r.source!==n.expectedSource||r.origin!==n.expectedOrigin)return;const e=li(r.data,{expectedSessionToken:n.expectedSessionToken,allowLegacyNoSessionToken:n.allowLegacyNoSessionToken??!n.expectedSessionToken});if(e){if(e.channel==="lifecycle"){(a=n.onReady)==null||a.call(n);return}if(e.channel==="pointer"){(l=n.onPointer)==null||l.call(n,e.payload);return}(i=n.onKeydown)==null||i.call(n,e.payload)}};return n.hostWindow.addEventListener("message",o),{dispose:()=>{n.hostWindow.removeEventListener("message",o)}}}function si(n){return{postReady:()=>{n.targetWindow.postMessage(Mn(n.sessionToken),n.targetOrigin)},postPointer:o=>{n.targetWindow.postMessage(On(o,n.sessionToken),n.targetOrigin)},postKeydown:o=>{n.targetWindow.postMessage(zn(o,n.sessionToken),n.targetOrigin)}}}function ci(n){if(n.defaultPrevented||n.isEditable)return!1;const o=n.ctrlKey||n.metaKey,r=n.key.toLowerCase(),e=n.code.toLowerCase();return o&&(r==="z"||r==="y"||r==="s")?!0:(r==="delete"||r==="backspace"||e==="delete"||e==="backspace")&&!n.ctrlKey&&!n.metaKey&&!n.altKey}function ui(n){const o=i=>{n.bridge.postPointer({interaction:"select",nodeId:n.resolveNodeId(i.target)})},r=i=>{n.bridge.postPointer({interaction:"hover",nodeId:n.resolveNodeId(i.target)})},e=()=>{n.bridge.postPointer({interaction:"hover",nodeId:null})},a=i=>{i.preventDefault(),n.bridge.postPointer({interaction:"context",nodeId:n.resolveNodeId(i.target),clientX:i.clientX,clientY:i.clientY})},l=i=>{const d={key:i.key,code:i.code,ctrlKey:i.ctrlKey,metaKey:i.metaKey,shiftKey:i.shiftKey,altKey:i.altKey,defaultPrevented:i.defaultPrevented,isEditable:n.isEditableTarget(i.target)||n.isEditableTarget(n.frameDocument.activeElement)};ci(d)&&i.preventDefault(),n.bridge.postKeydown(d)};return n.contentRoot.addEventListener("click",o),n.contentRoot.addEventListener("mousemove",r),n.contentRoot.addEventListener("mouseleave",e),n.contentRoot.addEventListener("contextmenu",a),n.frameDocument.addEventListener("keydown",l),n.bridge.postReady(),()=>{n.contentRoot.removeEventListener("click",o),n.contentRoot.removeEventListener("mousemove",r),n.contentRoot.removeEventListener("mouseleave",e),n.contentRoot.removeEventListener("contextmenu",a),n.frameDocument.removeEventListener("keydown",l)}}const pi=t.defineComponent({__name:"NodeContextMenu",props:{open:{type:Boolean,default:!1},x:{type:Number,default:0},y:{type:Number,default:0},canDelete:{type:Boolean,default:!0},canMoveUp:{type:Boolean,default:!1},canMoveDown:{type:Boolean,default:!1}},emits:["action","close"],setup(n,{expose:o,emit:r}){o();const e=n,a=r,{t:l}=ne(),i=t.computed(()=>({top:`${e.y}px`,left:`${e.x}px`})),d=t.computed(()=>[{key:"duplicate",label:l("contextMenu.duplicate")},{key:"move-up",label:l("contextMenu.moveUp"),disabled:!e.canMoveUp},{key:"move-down",label:l("contextMenu.moveDown"),disabled:!e.canMoveDown},{key:"delete",label:l("contextMenu.delete"),danger:!0,disabled:!e.canDelete}]);function p(u,g){g||a("action",u)}const v=t.ref(null),h=t.ref(null);function N(){return v.value?Array.from(v.value.querySelectorAll(".ipb-node-context-menu__item")).filter(u=>!u.disabled):[]}function c(){const[u]=N();u==null||u.focus()}function C(){h.value instanceof HTMLElement&&h.value.focus(),h.value=null}function I(u){var S,B,T,D;if(u.key==="Escape"){u.preventDefault(),a("close");return}if(u.key==="Tab"){u.preventDefault(),a("close");return}const g=N();if(g.length===0)return;const m=document.activeElement instanceof HTMLButtonElement?document.activeElement:null,b=m?g.indexOf(m):-1;if(u.key==="ArrowDown"){u.preventDefault();const j=b<0?0:(b+1)%g.length;(S=g[j])==null||S.focus();return}if(u.key==="ArrowUp"){u.preventDefault();const j=b<0?g.length-1:(b-1+g.length)%g.length;(B=g[j])==null||B.focus();return}if(u.key==="Home"){u.preventDefault(),(T=g[0])==null||T.focus();return}u.key==="End"&&(u.preventDefault(),(D=g[g.length-1])==null||D.focus())}function w(u){var m;const g=u.relatedTarget;if(!(g instanceof Node)){a("close");return}(m=v.value)!=null&&m.contains(g)||a("close")}t.watch(()=>e.open,u=>{if(u){h.value=document.activeElement instanceof HTMLElement?document.activeElement:null,t.nextTick(()=>{c()});return}C()},{immediate:!0}),t.onBeforeUnmount(()=>{C()});const E={props:e,emit:a,t:l,menuStyle:i,menuItems:d,handleAction:p,menuRootRef:v,previousFocusedElement:h,getFocusableItems:N,focusFirstMenuItem:c,restorePreviousFocus:C,handleMenuKeydown:I,handleMenuFocusOut:w};return Object.defineProperty(E,"__isScriptSetup",{enumerable:!1,value:!0}),E}}),fi=["aria-label"],mi=["disabled","data-action","aria-disabled","onClick"];function gi(n,o,r,e,a,l){return r.open?(t.openBlock(),t.createElementBlock("div",{key:0,ref:"menuRootRef",class:"ipb-node-context-menu",style:t.normalizeStyle(e.menuStyle),role:"menu","aria-label":e.t("contextMenu.ariaLabel"),"aria-orientation":"vertical",tabindex:"-1",onClick:o[0]||(o[0]=t.withModifiers(()=>{},["stop"])),onContextmenu:o[1]||(o[1]=t.withModifiers(()=>{},["prevent"])),onKeydown:e.handleMenuKeydown,onFocusout:e.handleMenuFocusOut},[(t.openBlock(!0),t.createElementBlock(t.Fragment,null,t.renderList(e.menuItems,i=>(t.openBlock(),t.createElementBlock("button",{key:i.key,type:"button",class:t.normalizeClass(["ipb-node-context-menu__item",{"ipb-node-context-menu__item--danger":i.danger}]),disabled:i.disabled,"data-action":i.key,role:"menuitem","aria-disabled":i.disabled?"true":void 0,onClick:d=>e.handleAction(i.key,i.disabled)},t.toDisplayString(i.label),11,mi))),128))],44,fi)):t.createCommentVNode("v-if",!0)}const bi=U(pi,[["render",gi],["__scopeId","data-v-89c3623e"],["__file","/app/src/components/editor/NodeContextMenu.vue"]]),je="ipb-iframe-canvas-content",pt="ipb-iframe-canvas-base-style",Ut=240,Wt=320,vi=t.defineComponent({__name:"IframeCanvas",props:{content:{type:Object,required:!0},variables:{type:Object,default:()=>({})},selectedNodeId:{type:Number,default:null},hoveredNodeId:{type:Number,default:null},viewport:{type:String,default:"desktop"},viewportWidth:{type:Number,default:null},viewportHeight:{type:Number,default:null}},emits:["select","hover","context-action","iframe-keydown","viewport-size-change"],setup(n,{expose:o,emit:r}){o();const e=n,a=r,l=t.inject(Ge,null),i=t.inject($e,null),{t:d}=ne(),p=t.ref(null),v=t.ref(null),h=t.ref(null),N=t.ref(!1),c=t.ref(null),C=t.ref(null),I=t.ref(null),w=t.ref(null),E=t.ref(null),u=t.ref(null),g=t.ref({width:0,height:0}),m=t.ref(!1),b=t.ref(null),S=t.ref(null),B=t.ref(null),T=t.ref(!1),D=t.ref(null),j=t.ref(0),$=t.ref(0),q=t.ref(!1),Y=t.ref(!1),ee=t.ref(!1),oe=t.computed(()=>{if(e.viewport==="custom")return{width:Math.max(Ut,Math.round(e.viewportWidth??Ie.desktop.width)),height:Math.max(Wt,Math.round(e.viewportHeight??Ie.desktop.height))};const s=Ie[e.viewport];return{width:s.width,height:s.height}}),me=t.computed(()=>({width:`min(100%, ${oe.value.width}px)`,height:`${oe.value.height}px`})),Se=t.computed(()=>b.value?{top:`${b.value.top}px`,left:`${b.value.left}px`,width:`${b.value.width}px`,height:`${b.value.height}px`}:null),Ce=t.computed(()=>S.value&&e.hoveredNodeId!==e.selectedNodeId?{top:`${S.value.top}px`,left:`${S.value.left}px`,width:`${S.value.width}px`,height:`${S.value.height}px`}:null),we=t.computed(()=>B.value?{top:`${B.value.top}px`,left:`${B.value.left}px`,width:`${B.value.width}px`,height:`${B.value.height}px`}:null);function _(s){return!s||typeof s!="object"?!1:s.nodeType===1}function R(s){if(s===null)return null;const y=Number(s);return Number.isInteger(y)?y:null}function f(s){if(!_(s))return null;const y=s.closest("[data-ipb-node-id]");return R((y==null?void 0:y.getAttribute("data-ipb-node-id"))??null)}function k(s){return s===null||!c.value?null:c.value.querySelector(`[data-ipb-node-id="${s}"]`)}function x(s){var H,F;if(!s||!c.value)return null;const y=s.getBoundingClientRect(),P=c.value.getBoundingClientRect(),V=((H=I.value)==null?void 0:H.scrollY)??0,W=((F=I.value)==null?void 0:F.scrollX)??0;return{top:y.top-P.top+V,left:y.left-P.left+W,width:y.width,height:y.height}}function O(s,y){return Math.max(0,Math.min(s,y))}function L(s,y){return s.id===y?!0:s.children.some(P=>L(P,y))}function z(s){var y;return s.sourceComponentName?s.sourceComponentName:s.sourceNodeId===null?null:((y=M(e.content,s.sourceNodeId))==null?void 0:y.name)??null}function X(s,y){const P=z(y);if(!P)return null;const V=s===null?null:M(e.content,s);if(V&&!V.readonly){const H=pe(V,"default",P);if(H)return{targetId:V.id,index:V.children.length,slot:H}}if(s!==null){const H=G(e.content,s);if(H&&!H.parent.readonly){const F=H.parent.children[H.index],ie=pe(H.parent,(F==null?void 0:F.slot)??"default",P);if(ie)return{targetId:H.parent.id,index:H.index+1,slot:ie}}}if(e.content.readonly)return null;const W=pe(e.content,"default",P);return W?{targetId:e.content.id,index:e.content.children.length,slot:W}:null}function Z(s,y,P,V){const W=M(e.content,s),H=G(e.content,s),F=M(e.content,y);if(!W||!H||W.readonly)return{valid:!1};if(!F||F.readonly)return{valid:!1};if(s===y)return{valid:!1};if(L(W,y))return{valid:!1};const ie=pe(F,P,W.name);if(!ie)return{valid:!1};const At=F.children.length;return H.parent.id===y&&H.index<V?{valid:!0,index:O(V-1,At),slot:ie}:{valid:!0,index:O(V,At),slot:ie}}function re(s){if(s.getElementById(pt))return;const y=s.createElement("style");y.id=pt,y.textContent=`
4
+ html, body {
5
+ margin: 0;
6
+ padding: 0;
7
+ min-height: 100%;
8
+ overflow-x: hidden;
9
+ }
10
+
11
+ body {
12
+ background: #fff;
13
+ }
14
+
15
+ #${je} {
16
+ position: relative;
17
+ width: 100%;
18
+ max-width: 100%;
19
+ min-height: 100%;
20
+ overflow-x: hidden;
21
+ box-sizing: border-box;
22
+ }
23
+
24
+ /* Minimum size for layout containers so empty columns/rows remain droppable in the editor */
25
+ [data-ipb-component="PbColumn"] {
26
+ min-width: 80px;
27
+ min-height: 80px;
28
+ }
29
+ [data-ipb-component="PbRow"] {
30
+ min-height: 80px;
31
+ }
32
+ `,s.head.appendChild(y)}function le(s){if(!s.body)return null;re(s);let y=s.getElementById(je);return y||(y=s.createElement("div"),y.id=je,s.body.innerHTML="",s.body.appendChild(y)),y}function ke(){c.value&&t.render(t.h(Dt,{node:e.content,variables:e.variables,markNodes:!0}),c.value)}function ge(){c.value&&t.render(null,c.value)}function Te(){if(!c.value)return;c.value.querySelectorAll("[data-ipb-node-id]").forEach(y=>{const P=R(y.getAttribute("data-ipb-node-id")),V=P===null?null:M(e.content,P);y.draggable=!!(V&&!V.readonly&&V.id!==e.content.id)})}function de(){b.value=x(k(e.selectedNodeId)),S.value=x(k(e.hoveredNodeId));const s=i?i.dragState.value.dropTargetId:null;B.value=s===null?null:x(k(s))}function se(){return v.value?{width:Math.round(v.value.clientWidth),height:Math.round(v.value.clientHeight)}:{width:0,height:0}}function Ne(){const s=se();m.value&&s.width===g.value.width&&s.height===g.value.height||(g.value=s,m.value=!0,a("viewport-size-change",s))}function Pe(){de(),Ne()}function Ee(){var s;(s=u.value)==null||s.disconnect(),u.value=null}function Ct(){if(Ee(),typeof ResizeObserver>"u"||!v.value||!c.value)return;const s=new ResizeObserver(()=>{Pe()});s.observe(v.value),s.observe(c.value),u.value=s}async function ce(){await t.nextTick(),ke(),await t.nextTick(),Te(),de(),Ne()}function ue(){B.value=null}function ae(){T.value=!1,D.value=null}function Un(){ae(),a("select",null),a("hover",null)}function qe(s){s.stopPropagation(),ae();const y=f(s.target);a("select",y)}function Ye(s){const y=f(s.target);y!==e.hoveredNodeId&&a("hover",y)}function Xe(){a("hover",null)}function Ze(s){if(!i)return;const y=f(s.target);if(y===null)return;const P=M(e.content,y);if(!P||P.readonly||P.id===e.content.id){s.preventDefault();return}i.startDragExisting(y),s.dataTransfer&&(s.dataTransfer.effectAllowed="move",s.dataTransfer.setData("text/plain",String(y)))}function Je(s){if(!i||!i.dragState.value.isDragging)return;const y=f(s.target),P=X(y,i.dragState.value);if(!P){ue();return}s.preventDefault(),i.updateDropTarget(P.targetId,P.index,P.slot),B.value=x(k(P.targetId)),s.dataTransfer&&(s.dataTransfer.dropEffect=i.dragState.value.isNewComponent?"copy":"move")}function Qe(s){if(!c.value)return;const y=s.relatedTarget;y&&typeof y=="object"&&"nodeType"in y&&c.value.contains(y)||ue()}function et(s){var H;if(s.preventDefault(),!i||!l||!i.dragState.value.isDragging){ue();return}const y=f(s.target),P=X(y,i.dragState.value);if(!P){i.cancelDrag(),ue();return}i.updateDropTarget(P.targetId,P.index,P.slot);const V=i.endDrag();if(ue(),V.dropTargetId===null)return;if(V.isNewComponent&&V.sourceComponentName){const F=(H=fe(V.sourceComponentName))==null?void 0:H.defaultProps,ie=l.addNode(V.dropTargetId,V.sourceComponentName,V.dropIndex,V.dropSlot,F);ie!==null&&a("select",ie);return}if(V.sourceNodeId===null)return;const W=Z(V.sourceNodeId,V.dropTargetId,V.dropSlot,V.dropIndex);W.valid&&(l.moveNodeTo(V.sourceNodeId,V.dropTargetId,W.index,W.slot),a("select",V.sourceNodeId))}function tt(){i!=null&&i.dragState.value.isDragging&&i.cancelDrag(),ue()}function nt(s){const y=M(e.content,s);if(y!=null&&y.readonly){q.value=!1,Y.value=!1,ee.value=!1;return}const P=G(e.content,s);if(!P){q.value=!1,Y.value=!1,ee.value=!1;return}q.value=!0,Y.value=P.index>0,ee.value=P.index<P.parent.children.length-1}function rt(s){var H,F;s.preventDefault(),s.stopPropagation();const y=f(s.target);if(y===null||!c.value){ae();return}const P=c.value.getBoundingClientRect(),V=((H=I.value)==null?void 0:H.scrollY)??0,W=((F=I.value)==null?void 0:F.scrollX)??0;j.value=s.clientX-P.left+W,$.value=s.clientY-P.top+V,D.value=y,nt(y),T.value=!0,a("select",y)}function Wn(s){D.value!==null&&(a("context-action",{action:s,nodeId:D.value}),ae())}function Tt(s){if(!_(s))return!1;const y=s.tagName.toLowerCase();return y==="input"||y==="textarea"||y==="select"?!0:!!s.closest('[contenteditable]:not([contenteditable="false"])')}function Pt(s){var W,H;if(s.interaction==="hover"){s.nodeId!==e.hoveredNodeId&&a("hover",s.nodeId);return}if(s.interaction==="select"){ae(),a("select",s.nodeId);return}if(s.interaction!=="context")return;if(s.nodeId===null||!c.value){ae();return}const y=c.value.getBoundingClientRect(),P=((W=I.value)==null?void 0:W.scrollY)??0,V=((H=I.value)==null?void 0:H.scrollX)??0;j.value=s.clientX-y.left+V,$.value=s.clientY-y.top+P,D.value=s.nodeId,nt(s.nodeId),T.value=!0,a("select",s.nodeId)}function Vt(s){s.key==="Escape"&&ae(),a("iframe-keydown",{...s,preventDefault:()=>{}})}function ot(s){try{return s.location.origin}catch{return window.location.origin}}function at(){var s,y;(s=w.value)==null||s.call(w),w.value=null,(y=E.value)==null||y.call(E),E.value=null}function Bt(){const s=I.value,y=C.value,P=c.value;if(!s||!y||!P)return;at();const V=oi(),W=di({hostWindow:window,expectedSource:window,expectedOrigin:ot(window),expectedSessionToken:V,onReady:()=>{ce()},onPointer:Pt,onKeydown:Vt}),H=si({targetWindow:window,targetOrigin:ot(window),sessionToken:V});w.value=()=>W.dispose(),E.value=ui({frameDocument:y,contentRoot:P,bridge:H,resolveNodeId:f,isEditableTarget:Tt})}function be(){Pe()}function Ae(){Ee(),at(),c.value&&(c.value.removeEventListener("click",qe),c.value.removeEventListener("contextmenu",rt),c.value.removeEventListener("mousemove",Ye),c.value.removeEventListener("mouseleave",Xe),c.value.removeEventListener("dragstart",Ze),c.value.removeEventListener("dragover",Je),c.value.removeEventListener("dragleave",Qe),c.value.removeEventListener("drop",et),c.value.removeEventListener("dragend",tt)),!N.value&&I.value&&(I.value.removeEventListener("scroll",be),I.value.removeEventListener("resize",be))}function it(){c.value&&(N.value?(c.value.addEventListener("click",qe),c.value.addEventListener("contextmenu",rt),c.value.addEventListener("mousemove",Ye),c.value.addEventListener("mouseleave",Xe)):Bt(),c.value.addEventListener("dragstart",Ze),c.value.addEventListener("dragover",Je),c.value.addEventListener("dragleave",Qe),c.value.addEventListener("drop",et),c.value.addEventListener("dragend",tt),!N.value&&I.value&&(I.value.addEventListener("scroll",be),I.value.addEventListener("resize",be)),Ct())}function Le(){N.value=!0,t.nextTick().then(()=>{h.value&&(Ae(),ge(),C.value=null,I.value=null,c.value=h.value,it(),ce())})}function Me(){const s=p.value;if(!s){Le();return}const y=s.contentDocument,P=s.contentWindow;if(!y||!P){Le();return}const V=le(y);if(!V){Le();return}Ae(),ge(),N.value=!1,C.value=y,I.value=P,c.value=V,it(),ce()}t.watch(()=>[e.selectedNodeId,e.hoveredNodeId],()=>{ce()},{immediate:!0}),t.watch(()=>[e.viewport,e.viewportWidth,e.viewportHeight],()=>{ce()}),t.watch(()=>e.content,()=>{D.value!==null&&!M(e.content,D.value)&&ae(),ce()},{deep:!0}),t.watch(()=>e.variables,()=>{ce()},{deep:!0}),t.watch(()=>(i==null?void 0:i.dragState.value.isDragging)??!1,s=>{s||ue()}),t.onMounted(()=>{var s;window.addEventListener("resize",be),(s=p.value)==null||s.addEventListener("load",Me),Me()}),t.onBeforeUnmount(()=>{var s;window.removeEventListener("resize",be),(s=p.value)==null||s.removeEventListener("load",Me),Ae(),ge()});const Rt={props:e,emit:a,IFRAME_CONTENT_ROOT_ID:je,IFRAME_BASE_STYLE_ID:pt,MIN_VIEWPORT_WIDTH:Ut,MIN_VIEWPORT_HEIGHT:Wt,nodeTree:l,dragDrop:i,t:d,iframeRef:p,stageRef:v,fallbackContentRef:h,useFallbackDom:N,contentRef:c,iframeDocumentRef:C,iframeWindowRef:I,teardownBridgeParentRef:w,teardownBridgeDomRef:E,resizeObserverRef:u,currentViewportSize:g,hasViewportSizeReport:m,selectedRect:b,hoveredRect:S,dropRect:B,contextMenuOpen:T,contextMenuNodeId:D,contextMenuX:j,contextMenuY:$,canDeleteFromMenu:q,canMoveUpFromMenu:Y,canMoveDownFromMenu:ee,resolvedViewportDimensions:oe,canvasStyle:me,selectedOverlayStyle:Se,hoveredOverlayStyle:Ce,dropOverlayStyle:we,isElementTarget:_,parseNodeId:R,getNodeIdFromEventTarget:f,findMarkedElement:k,getOverlayRect:x,clampIndex:O,isNodeInSubtree:L,getDraggedComponentName:z,resolveDropLocation:X,canMoveNode:Z,ensureIframeBaseStyle:re,ensureIframeContentRoot:le,renderIframeNodeTree:ke,unmountIframeNodeTree:ge,syncDraggableMarkers:Te,syncOverlayRects:de,getStageViewportSize:se,syncViewportSize:Ne,handleCanvasResize:Pe,disconnectResizeObserver:Ee,setupResizeObserver:Ct,syncOverlayRectsAfterRender:ce,clearDropTargetOverlay:ue,hideContextMenu:ae,handleCanvasClick:Un,handleContentClick:qe,handleContentMouseMove:Ye,handleContentMouseLeave:Xe,handleContentDragStart:Ze,handleContentDragOver:Je,handleContentDragLeave:Qe,handleContentDrop:et,handleContentDragEnd:tt,updateContextMenuCapabilities:nt,handleContentContextMenu:rt,handleContextMenuAction:Wn,isEditableTarget:Tt,handleBridgePointer:Pt,handleBridgeKeydown:Vt,getWindowOrigin:ot,teardownIframeBridge:at,setupIframeBridge:Bt,handleWindowResize:be,teardownIframeListeners:Ae,setupIframeListeners:it,initializeFallbackContent:Le,initializeIframeDocument:Me,NodeContextMenu:bi};return Object.defineProperty(Rt,"__isScriptSetup",{enumerable:!1,value:!0}),Rt}}),hi={ref:"stageRef",class:"ipb-iframe-canvas__stage"},_i=["title"],yi={key:1,ref:"fallbackContentRef",id:"ipb-iframe-canvas-content",class:"ipb-iframe-canvas__fallback"};function wi(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("main",{class:"ipb-canvas",onClick:e.handleCanvasClick,onContextmenu:t.withModifiers(e.hideContextMenu,["prevent"])},[t.createElementVNode("div",{class:"ipb-canvas__viewport",style:t.normalizeStyle(e.canvasStyle)},[t.createElementVNode("div",hi,[e.useFallbackDom?(t.openBlock(),t.createElementBlock("div",yi,null,512)):(t.openBlock(),t.createElementBlock("iframe",{key:0,ref:"iframeRef",class:"ipb-iframe-canvas__frame",title:e.t("iframeCanvas.title"),sandbox:"allow-same-origin"},null,8,_i)),e.dropOverlayStyle?(t.openBlock(),t.createElementBlock("div",{key:2,class:"ipb-canvas__overlay ipb-canvas__overlay--drop",style:t.normalizeStyle(e.dropOverlayStyle)},null,4)):t.createCommentVNode("v-if",!0),e.hoveredOverlayStyle?(t.openBlock(),t.createElementBlock("div",{key:3,class:"ipb-canvas__overlay ipb-canvas__overlay--hovered",style:t.normalizeStyle(e.hoveredOverlayStyle)},null,4)):t.createCommentVNode("v-if",!0),e.selectedOverlayStyle?(t.openBlock(),t.createElementBlock("div",{key:4,class:"ipb-canvas__overlay ipb-canvas__overlay--selected",style:t.normalizeStyle(e.selectedOverlayStyle)},null,4)):t.createCommentVNode("v-if",!0),t.createVNode(e.NodeContextMenu,{open:e.contextMenuOpen,x:e.contextMenuX,y:e.contextMenuY,"can-delete":e.canDeleteFromMenu,"can-move-up":e.canMoveUpFromMenu,"can-move-down":e.canMoveDownFromMenu,onAction:e.handleContextMenuAction,onClose:e.hideContextMenu},null,8,["open","x","y","can-delete","can-move-up","can-move-down"])],512)],4)],32)}const ki=U(vi,[["render",wi],["__scopeId","data-v-11905b62"],["__file","/app/src/components/editor/IframeCanvas.vue"]]),Ni=t.defineComponent({__name:"PageEditor",props:{pageData:{type:Object,required:!0}},emits:["save","change"],setup(n,{expose:o,emit:r}){o();const e=n,a=r,l=Dn({initialData:e.pageData,mode:"edit"}),i=Sn({initialSnapshot:l.getSnapshot()}),d=Pn(),p=Cn({content:l.content,nextId:l.nextId,onUpdate:_=>{l.updateContent(_),a("change",_)},onSnapshot:_=>{i.pushHistory(_,l.getSnapshot())}}),v=t.ref(1024),h=t.ref(768),N=t.ref(null),c=t.ref(null);function C(){a("save",{content:l.content.value,layout:l.layout.value,maxId:l.maxId.value})}function I(_){if(!_)return!1;try{l.restoreSnapshot(_);const R=i.selectedNodeId.value;return R!==null&&!M(l.content.value,R)&&i.selectNode(null),a("change",l.content.value),!0}catch(R){return De("PageEditor.restoreSnapshotAndEmit",K("INVALID_SNAPSHOT","[PageBuilder] Failed to apply history snapshot. Undo/redo step was skipped.",{cause:R,details:{snapshotPreview:_.slice(0,200)}})),!1}}function w(){I(i.undo())}function E(){I(i.redo())}function u(_){const R=M(l.content.value,_);!R||R.readonly||p.deleteNode(_)}function g(_){M(l.content.value,_)&&p.duplicateNode(_)}function m(_){const R=M(l.content.value,_);!R||R.readonly||p.canMoveNodeUp(_)&&p.moveNodeUp(_)}function b(_){const R=M(l.content.value,_);!R||R.readonly||p.canMoveNodeDown(_)&&p.moveNodeDown(_)}function S(_){if(_.action==="duplicate"){g(_.nodeId);return}if(_.action==="delete"){u(_.nodeId);return}if(_.action==="move-up"){m(_.nodeId);return}_.action==="move-down"&&b(_.nodeId)}function B(_){if(!_||typeof _!="object"||!("nodeType"in _)||_.nodeType!==1)return!1;const R=_,f=R.tagName.toLowerCase();return f==="input"||f==="textarea"||f==="select"?!0:!!R.closest('[contenteditable]:not([contenteditable="false"])')}function T(){const _=i.selectedNodeId.value;_!==null&&u(_)}function D(_){if(_.defaultPrevented||_.isEditable)return;const R=_.ctrlKey||_.metaKey,f=_.key.toLowerCase(),k=_.code.toLowerCase();if(R&&f==="z"){_.preventDefault(),_.shiftKey?E():w();return}if(R&&f==="y"){_.preventDefault(),E();return}if(R&&f==="s"){_.preventDefault(),C();return}(f==="delete"||f==="backspace"||k==="delete"||k==="backspace")&&!_.ctrlKey&&!_.metaKey&&!_.altKey&&(_.preventDefault(),T())}function j(_){D({key:_.key,code:_.code,ctrlKey:_.ctrlKey,metaKey:_.metaKey,shiftKey:_.shiftKey,altKey:_.altKey,defaultPrevented:_.defaultPrevented,isEditable:B(_.target)||B(document.activeElement),preventDefault:()=>_.preventDefault()})}function $(_){D(_)}function q(_){const R=Ie[_];return _==="custom"?{width:v.value,height:h.value}:{width:R.width,height:R.height}}function Y(_){if(_==="custom"&&i.viewport.value!=="custom")if(N.value!==null&&c.value!==null)v.value=N.value,h.value=c.value;else{const R=q(i.viewport.value);v.value=R.width,h.value=R.height}i.setViewport(_)}function ee(_){v.value=_.width,h.value=_.height,i.viewport.value!=="custom"&&i.setViewport("custom")}function oe(_){N.value=_.width,c.value=_.height}function me(_){d.startDragNew(_)}function Se(){d.cancelDrag()}function Ce(_){var X;const R=i.selectedNodeId.value,f=R!==null?M(l.content.value,R):void 0;let k=l.content.value.id,x=l.content.value.children.length,O="default";if(R!==null&&f){const Z=G(l.content.value,R);Z?(k=Z.parent.id,x=Z.index+1,O=f.slot??"default"):(k=f.id,x=f.children.length)}const L=(X=fe(_))==null?void 0:X.defaultProps,z=p.addNode(k,_,x,O,L);z!==null&&i.selectNode(z)}t.onMounted(()=>{window.addEventListener("keydown",j)}),t.onUnmounted(()=>{window.removeEventListener("keydown",j)}),t.provide(xn,l),t.provide(In,i),t.provide(Ge,p),t.provide($e,d);const we={props:e,emit:a,pb:l,editor:i,dragDrop:d,nodeTree:p,customViewportWidth:v,customViewportHeight:h,activeViewportWidth:N,activeViewportHeight:c,handleSave:C,restoreSnapshotAndEmit:I,handleUndo:w,handleRedo:E,handleDeleteNode:u,handleDuplicateNode:g,handleMoveNodeUp:m,handleMoveNodeDown:b,handleNodeContextAction:S,isEditableTarget:B,handleDeleteSelected:T,handleShortcut:D,handleEditorKeydown:j,handleIframeKeydown:$,getViewportDimensions:q,handleViewportChange:Y,handleCustomViewportChange:ee,handleViewportSizeChange:oe,handlePaletteDragStart:me,handlePaletteDragEnd:Se,handlePaletteAdd:Ce,EditorToolbar:fo,LeftDrawer:Zo,RightDrawer:ri,IframeCanvas:ki};return Object.defineProperty(we,"__isScriptSetup",{enumerable:!1,value:!0}),we}}),Ei={class:"ipb-page-editor"},xi={class:"ipb-page-editor__body"};function Ii(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock("div",Ei,[t.createVNode(e.EditorToolbar,{"can-undo":e.editor.canUndo.value,"can-redo":e.editor.canRedo.value,"is-dirty":e.pb.isDirty.value,viewport:e.editor.viewport.value,"custom-viewport-width":e.customViewportWidth,"custom-viewport-height":e.customViewportHeight,"active-viewport-width":e.activeViewportWidth,"active-viewport-height":e.activeViewportHeight,onUndo:e.handleUndo,onRedo:e.handleRedo,onSave:e.handleSave,onViewportChange:e.handleViewportChange,onCustomViewportChange:e.handleCustomViewportChange},null,8,["can-undo","can-redo","is-dirty","viewport","custom-viewport-width","custom-viewport-height","active-viewport-width","active-viewport-height"]),t.createElementVNode("div",xi,[t.createVNode(e.LeftDrawer,{open:e.editor.leftDrawerOpen.value,content:e.pb.content.value,"selected-node-id":e.editor.selectedNodeId.value,onToggle:e.editor.toggleLeftDrawer,onSelect:e.editor.selectNode,onAdd:e.handlePaletteAdd,onDragStart:e.handlePaletteDragStart,onDragEnd:e.handlePaletteDragEnd},null,8,["open","content","selected-node-id","onToggle","onSelect"]),t.createVNode(e.IframeCanvas,{content:e.pb.content.value,variables:e.pb.variables.value,"selected-node-id":e.editor.selectedNodeId.value,"hovered-node-id":e.editor.hoveredNodeId.value,viewport:e.editor.viewport.value,"viewport-width":e.editor.viewport.value==="custom"?e.customViewportWidth:null,"viewport-height":e.editor.viewport.value==="custom"?e.customViewportHeight:null,onSelect:e.editor.selectNode,onHover:e.editor.hoverNode,onContextAction:e.handleNodeContextAction,onIframeKeydown:e.handleIframeKeydown,onViewportSizeChange:e.handleViewportSizeChange},null,8,["content","variables","selected-node-id","hovered-node-id","viewport","viewport-width","viewport-height","onSelect","onHover"]),t.createVNode(e.RightDrawer,{open:e.editor.rightDrawerOpen.value,"selected-node-id":e.editor.selectedNodeId.value,content:e.pb.content.value,onToggle:e.editor.toggleRightDrawer,onUpdateProps:e.nodeTree.updateNodeProps,onDelete:e.handleDeleteNode,onDuplicate:e.handleDuplicateNode},null,8,["open","selected-node-id","content","onToggle","onUpdateProps"])])])}const jn=U(Ni,[["render",Ii],["__scopeId","data-v-0589f51d"],["__file","/app/src/components/editor/PageEditor.vue"]]),Di=t.defineComponent({__name:"PageBuilder",props:{pageData:{type:Object,required:!0},mode:{type:String,default:"read"},locale:{type:String,default:void 0},messages:{type:Object,default:void 0}},emits:["save","change"],setup(n,{expose:o}){o();const r=n,e=new Set;function a(w,E,u){e.has(w)||(e.add(w),De("PageBuilder",K("INVALID_PAGE_DATA",E,{details:u})))}const l=t.computed(()=>r.pageData),i=t.computed(()=>r.mode==="read"||r.mode==="edit"?r.mode:(a("invalid-mode",`[PageBuilder] Unknown mode "${String(r.mode)}". Falling back to "read".`,{mode:r.mode}),"read")),d=t.computed(()=>kt(l.value)),p=t.computed(()=>{const w=Be(l.value.content,"content"),E=Be(l.value.layout,"layout");return w.isValid&&E.isValid}),v=t.computed(()=>i.value==="edit"&&!p.value),h=t.inject(gn,null),N=t.computed(()=>r.locale??(h==null?void 0:h.locale)??We),c=t.computed(()=>fn(Nt,h==null?void 0:h.messages,r.messages)),C=Et(()=>N.value,()=>c.value);t.watch(d,w=>{w.isValid||a("invalid-page-data","[PageBuilder] Invalid pageData payload detected. Rendering continues with degraded behavior.",{errors:w.errors})},{immediate:!0}),t.provide(bn,{locale:N,t:C});const I={props:r,reportedDiagnostics:e,reportOnce:a,pageData:l,mode:i,pageValidationResult:d,canRenderEditor:p,showEditModeFallback:v,pluginI18nOptions:h,resolvedLocale:N,mergedMessages:c,t:C,PageReader:En,PageEditor:jn};return Object.defineProperty(I,"__isScriptSetup",{enumerable:!1,value:!0}),I}}),Si={key:0,class:"ipb-page-builder__warning",role:"alert"};function Ci(n,o,r,e,a,l){return t.openBlock(),t.createElementBlock(t.Fragment,null,[e.showEditModeFallback?(t.openBlock(),t.createElementBlock("div",Si,t.toDisplayString(e.t("pageBuilder.warning.invalidEditMode")),1)):t.createCommentVNode("v-if",!0),e.mode==="read"||e.showEditModeFallback?(t.openBlock(),t.createBlock(e.PageReader,{key:1,"page-data":e.pageData},null,8,["page-data"])):(t.openBlock(),t.createBlock(e.PageEditor,{key:2,"page-data":e.pageData,onSave:o[0]||(o[0]=i=>n.$emit("save",i)),onChange:o[1]||(o[1]=i=>n.$emit("change",i))},null,8,["page-data"]))],64)}const Hn=U(Di,[["render",Ci],["__scopeId","data-v-4b06ebe0"],["__file","/app/src/components/PageBuilder.vue"]]),Kt=new WeakSet;function Ft(n){const o=[];for(const r of n){const e=r.name.trim(),a=fe(e);if(!a){o.push(r);continue}if(a.component!==r.component)throw K("DUPLICATE_COMPONENT",`[PageBuilder] Component "${e}" is already registered with a different implementation.`,{details:{componentName:e}})}o.length>0&&$t(o)}const Ti={install(n,o={}){if(Kt.has(n))return;Kt.add(n);const{components:r=[],registerBuiltIn:e=!0,globalName:a="PageBuilder",locale:l,messages:i}=o;n.provide(gn,{locale:l,messages:i}),e&&Ft(pn),r.length>0&&Ft(r),a!==!1&&n.component(a,Hn)}},Pi={type:Object};exports.DEFAULT_LOCALE=We;exports.DRAG_DROP_KEY=$e;exports.EDITOR_KEY=In;exports.NODE_TREE_KEY=Ge;exports.NodeRenderer=Dt;exports.PAGE_BUILDER_KEY=xn;exports.PageBuilder=Hn;exports.PageBuilderError=bt;exports.PageBuilderPlugin=Ti;exports.PageEditor=jn;exports.PageReader=En;exports.PbColumn=Zt;exports.PbContainer=un;exports.PbImage=on;exports.PbRow=Qt;exports.PbSection=sn;exports.PbText=nn;exports.PbVideo=ln;exports.VIEWPORT_PRESETS=Ie;exports.builderOptionsPropType=Pi;exports.builtInComponents=pn;exports.clearRegistry=Jn;exports.cloneTree=hn;exports.computeWindowRange=Rn;exports.countNodes=Br;exports.createNode=wn;exports.createStableNodeKey=Vn;exports.createTranslator=Et;exports.createVirtualTreeIndexMaps=bo;exports.defaultTranslations=Nt;exports.findNodeById=M;exports.findParent=G;exports.flattenTree=Bn;exports.getComponent=fe;exports.getComponentsByCategory=Yt;exports.getMaxId=ye;exports.getRegisteredComponents=Xn;exports.hasComponent=Zn;exports.insertNode=xt;exports.interpolateProps=kn;exports.isPageBuilderError=Gt;exports.mergeTranslations=fn;exports.moveNode=yn;exports.normalizeSafeHtmlTag=wt;exports.registerComponent=$n;exports.registerComponents=$t;exports.removeNode=_n;exports.replaceComponent=qn;exports.resolveComponent=qt;exports.sanitizeRichTextHtml=yt;exports.sanitizeUrlByKind=Q;exports.sliceWindow=go;exports.translate=mn;exports.unregisterComponent=Yn;exports.useDragDrop=Pn;exports.useEditor=Sn;exports.useNodeTree=Cn;exports.usePageBuilder=Dn;exports.usePageBuilderI18n=ne;exports.validateNode=Be;exports.validatePageData=kt;exports.walkTree=It;
33
+ //# sourceMappingURL=index.cjs.map