@improba/page-builder 0.1.0 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +26 -26
- package/dist/index.cjs +5 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.js +2588 -3070
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
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("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}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
|
-
`));
|
|
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=`
|
|
1
|
+
"use strict";var Pn=Object.defineProperty;var Vn=(t,o,n)=>o in t?Pn(t,o,{enumerable:!0,configurable:!0,writable:!0,value:n}):t[o]=n;var je=(t,o,n)=>Vn(t,typeof o!="symbol"?o+"":o,n);Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue");class Qe extends Error{constructor(n,r,l={}){super(r);je(this,"code");je(this,"details");this.name="PageBuilderError",this.code=n,this.details=l.details??{},this.cause=l.cause}}function Rn(t){return t instanceof Qe}function j(t,o,n={}){return new Qe(t,o,n)}function Lt(t){return t instanceof Error?t.message:String(t)}const X=new Map;function $n(){const t=[...X.keys()];return t.length>0?t.join(", "):"(none)"}function Ce(t){return t.trim()}function Xe(t,o){return j("DUPLICATE_COMPONENT",o,{details:{componentName:t}})}function et(t,o){const n=Ce(t.name),r=n===t.name?t:{...t,name:n};if(!n)throw j("INVALID_PAGE_DATA",`[PageBuilder] Cannot ${o} a component without a name.`);if(!r.component)throw j("INVALID_PAGE_DATA",`[PageBuilder] Component "${n}" is missing a Vue component instance.`);return r}function Ln(t){const o=et(t,"register"),n=o.name;if(X.has(n))throw Xe(n,`[PageBuilder] Component "${n}" is already registered. Use replaceComponent() to override.`);X.set(n,o)}function At(t){const o=t.map(r=>et(r,"register")),n=new Set;for(const r of o){if(n.has(r.name))throw Xe(r.name,`[PageBuilder] Component "${r.name}" appears multiple times in the registration batch.`);if(n.add(r.name),X.has(r.name))throw Xe(r.name,`[PageBuilder] Component "${r.name}" is already registered. Use replaceComponent() to override.`)}for(const r of o)X.set(r.name,r)}function An(t){const o=et(t,"replace"),n=o.name;X.set(n,o)}function Mn(t){return X.delete(Ce(t))}function de(t){return X.get(Ce(t))}function Mt(t){const o=Ce(t),n=X.get(o);if(!n)throw j("MISSING_COMPONENT",`[PageBuilder] Component "${o}" is not registered. Available: ${$n()}`,{details:{componentName:o,availableComponents:[...X.keys()]}});return n.component}function On(){return[...X.values()]}function Ot(){const t=new Map;for(const o of X.values()){if(o.hidden)continue;const n=t.get(o.category)??[];n.push(o),t.set(o.category,n)}return t}function zn(t){return X.has(Ce(t))}function Un(){X.clear()}const Kn={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"}},zt=e.defineComponent({__name:"PbColumn",props:{gap:{type:String,default:"16px"},padding:{type:String,default:"0"},align:{type:String,default:"stretch"}},setup(t){const o=t,n=e.computed(()=>({display:"flex",flexDirection:"column",gap:o.gap,padding:o.padding,alignItems:o.align,width:"100%"}));return(r,l)=>(e.openBlock(),e.createElementBlock("div",{style:e.normalizeStyle(n.value)},[e.renderSlot(r.$slots,"default")],4))}}),Hn={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"}},Ut=e.defineComponent({__name:"PbRow",props:{gap:{type:String,default:"16px"},wrap:{type:Boolean,default:!0},justify:{type:String,default:"flex-start"}},setup(t){const o=t,n=e.computed(()=>({display:"flex",flexDirection:"row",gap:o.gap,flexWrap:o.wrap?"wrap":"nowrap",justifyContent:o.justify,width:"100%"}));return(r,l)=>(e.openBlock(),e.createElementBlock("div",{style:e.normalizeStyle(n.value)},[e.renderSlot(r.$slots,"default")],4))}}),It=new Set(["div","p","span","h1","h2","h3","h4","h5","h6","section","article","blockquote"]),jn=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"]),Fn=new Set(["base","embed","form","iframe","input","link","math","meta","noscript","object","script","style","svg","template","textarea"]),Wn=new Set(["_blank","_parent","_self","_top"]),Gn=new Set(["nofollow","noopener","noreferrer","sponsored","ugc"]),Yn=/^data:image\/(?:avif|bmp|gif|jpe?g|png|webp);base64,[a-z0-9+/=\s]+$/i;function tt(t){return t.replace(/[\u0000-\u001F\u007F]/g,"")}function qn(t){return tt(t).replace(/\s+/g,"")}function Kt(t){const o=t.toLowerCase().split(/\s+/).filter(Boolean).filter(n=>Gn.has(n));return Array.from(new Set(o)).join(" ")}function Xn(t){const o=Kt(t??""),n=new Set(o.split(/\s+/).filter(Boolean));return n.add("noopener"),n.add("noreferrer"),Array.from(n).join(" ")}function Zn(){var t;if(typeof document<"u"&&typeof((t=document.implementation)==null?void 0:t.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 Jn(t){return t.replaceAll("&","&").replaceAll("<","<").replaceAll(">",">").replaceAll('"',""").replaceAll("'","'")}function Qn(t,o){const n=o.tagName.toLowerCase();for(const r of Array.from(t.attributes)){const l=r.name.toLowerCase(),a=tt(r.value).trim();if(!(a.length===0||l.startsWith("on"))){if(l==="title"){o.setAttribute("title",a);continue}if(n==="a"){if(l==="href"){const i=Z(a,"link");i.length>0&&o.setAttribute("href",i);continue}if(l==="target"){const i=a.toLowerCase();Wn.has(i)&&o.setAttribute("target",i);continue}if(l==="rel"){const i=Kt(a);i.length>0&&o.setAttribute("rel",i)}}}}n==="a"&&o.getAttribute("target")==="_blank"&&o.setAttribute("rel",Xn(o.getAttribute("rel")))}function Ze(t,o,n){for(const r of Array.from(t.childNodes)){if(r.nodeType===3){o.appendChild(n.createTextNode(r.textContent??""));continue}if(r.nodeType!==1)continue;const l=r,a=l.tagName.toLowerCase();if(Fn.has(a))continue;if(!jn.has(a)){const u=n.createDocumentFragment();Ze(l,u,n),o.appendChild(u);continue}const i=n.createElement(a);if(Qn(l,i),Ze(l,i,n),a==="a"&&!i.getAttribute("href")){const u=n.createDocumentFragment();for(;i.firstChild;)u.appendChild(i.firstChild);o.appendChild(u);continue}o.appendChild(i)}}function nt(t){const o=typeof t=="string"?t:"";if(o.length===0)return"";const n=Zn();if(!n)return Jn(o);const r=n.createElement("div");r.innerHTML=o;const l=n.createElement("div");return Ze(r,l,n),l.innerHTML}function ot(t,o="div"){const n=typeof o=="string"?o.trim().toLowerCase():"div",r=It.has(n)?n:"div";if(typeof t!="string")return r;const l=t.trim().toLowerCase();return It.has(l)?l:r}function Z(t,o){const n=tt(t).trim();if(n.length===0)return"";const r=qn(n).toLowerCase(),l=r.match(/^([a-z][a-z0-9+.-]*):/i),a=l==null?void 0:l[1];return!a||a==="http"||a==="https"||o==="link"&&(a==="mailto"||a==="tel")||o==="media"&&a==="blob"||(o==="media"||o==="background")&&a==="data"&&Yn.test(r)?n:""}const eo={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"}},Ht=e.defineComponent({__name:"PbText",props:{content:{type:String,default:""},tag:{type:String,default:"div"}},setup(t){const o=t,n=e.computed(()=>ot(o.tag)),r=e.computed(()=>nt(o.content));return(l,a)=>(e.openBlock(),e.createBlock(e.resolveDynamicComponent(n.value),{innerHTML:r.value},null,8,["innerHTML"]))}}),to=["src","alt"],no={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"}},jt=e.defineComponent({__name:"PbImage",props:{src:{type:String,required:!0},alt:{type:String,default:""},width:{type:String,default:"100%"},objectFit:{type:String,default:"cover"}},setup(t){const o=t,n=e.computed(()=>({width:o.width,objectFit:o.objectFit,display:"block",maxWidth:"100%"})),r=e.computed(()=>Z(o.src,"media"));return(l,a)=>r.value?(e.openBlock(),e.createElementBlock("img",{key:0,src:r.value,alt:t.alt,style:e.normalizeStyle(n.value),loading:"lazy"},null,12,to)):e.createCommentVNode("",!0)}}),oo=["src","poster","controls","autoplay","muted","loop"],ro={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}},Ft=e.defineComponent({__name:"PbVideo",props:{src:{},poster:{default:""},width:{default:"100%"},controls:{type:Boolean,default:!0},autoplay:{type:Boolean,default:!1},muted:{type:Boolean,default:!1},loop:{type:Boolean,default:!1}},setup(t){const o=t,n=e.computed(()=>({width:o.width,maxWidth:"100%",display:"block"})),r=e.computed(()=>Z(o.src,"media")),l=e.computed(()=>{var a;return(a=o.poster)!=null&&a.trim()?Z(o.poster,"media"):void 0});return(a,i)=>r.value?(e.openBlock(),e.createElementBlock("video",{key:0,src:r.value,poster:l.value,controls:t.controls,autoplay:t.autoplay,muted:t.muted,loop:t.loop,style:e.normalizeStyle(n.value),playsinline:""},null,12,oo)):e.createCommentVNode("",!0)}}),ao={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"}},Wt=e.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(t){const o=t,n=e.computed(()=>Z(o.backgroundImage,"background")),r=e.computed(()=>n.value?`url("${n.value.replace(/["\\]/g,"\\$&")}")`:void 0),l=e.computed(()=>({width:"100%",backgroundColor:o.backgroundColor,backgroundImage:r.value,backgroundSize:"cover",backgroundPosition:"center",padding:o.padding})),a=e.computed(()=>({maxWidth:o.maxWidth,margin:"0 auto",width:"100%"}));return(i,u)=>(e.openBlock(),e.createElementBlock("section",{style:e.normalizeStyle(l.value)},[e.createElementVNode("div",{style:e.normalizeStyle(a.value)},[e.renderSlot(i.$slots,"default")],4)],4))}}),lo={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"}},Gt=e.defineComponent({__name:"PbContainer",props:{maxWidth:{type:String,default:"100%"},padding:{type:String,default:"0 24px"}},setup(t){const o=t,n=e.computed(()=>({maxWidth:o.maxWidth,margin:"0 auto",padding:o.padding,width:"100%",boxSizing:"border-box"}));return(r,l)=>(e.openBlock(),e.createElementBlock("div",{style:e.normalizeStyle(n.value)},[e.renderSlot(r.$slots,"default")],4))}});function pe(t,o){return{...t,component:o}}const Yt=[pe(Kn,zt),pe(Hn,Ut),pe(eo,Ht),pe(no,jt),pe(ro,Ft),pe(ao,Wt),pe(lo,Gt)],io=new Set(["draft","published","archived"]),Dt=200,Ct=5e3;function Ie(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function $(t,o,n){t.errors.push({path:o,message:n})}function so(t,o,n){if(t.tag===void 0)return;if(typeof t.tag!="string"||t.tag.trim()===""){$(n,`${o}.tag`,"PbText props.tag must be a non-empty string.");return}const r=t.tag.trim().toLowerCase();ot(t.tag)!==r&&$(n,`${o}.tag`,"PbText props.tag must be one of: div, p, span, h1, h2, h3, h4, h5, h6, section, article, blockquote.")}function co(t,o,n){if(typeof t.src!="string"||t.src.trim()===""){$(n,`${o}.src`,"PbImage props.src must be a non-empty string.");return}Z(t.src,"media")===""&&$(n,`${o}.src`,"PbImage props.src contains an unsafe URL.")}function uo(t,o,n){if(typeof t.src!="string"||t.src.trim()===""){$(n,`${o}.src`,"PbVideo props.src must be a non-empty string.");return}Z(t.src,"media")===""&&$(n,`${o}.src`,"PbVideo props.src contains an unsafe URL.");const r=t.poster;r!=null&&r!==""&&(typeof r!="string"?$(n,`${o}.poster`,"PbVideo props.poster must be a string."):r.trim()!==""&&Z(r,"media")===""&&$(n,`${o}.poster`,"PbVideo props.poster contains an unsafe URL."))}function fo(t,o,n){const r=t.backgroundImage;if(!(r==null||r==="")){if(typeof r!="string"){$(n,`${o}.backgroundImage`,"PbSection props.backgroundImage must be a string.");return}r.trim()!==""&&Z(r,"background")===""&&$(n,`${o}.backgroundImage`,"PbSection props.backgroundImage contains an unsafe URL.")}}function po(t,o,n,r){if(t==="PbText"){so(o,n,r);return}if(t==="PbImage"){co(o,n,r);return}if(t==="PbVideo"){uo(o,n,r);return}t==="PbSection"&&fo(o,n,r)}function $e(t,o,n,r=0){if(r>Dt){n.depthGuardTriggered||($(n,o,`Maximum node depth (${String(Dt)}) exceeded during validation.`),n.depthGuardTriggered=!0);return}if(n.visitedNodeCount>=Ct){n.sizeGuardTriggered||($(n,o,`Maximum node count (${String(Ct)}) exceeded during validation.`),n.sizeGuardTriggered=!0);return}if(!Ie(t)){$(n,o,"Node must be an object.");return}if(n.seenNodes.has(t)){$(n,o,"Cycle detected in node tree.");return}n.seenNodes.add(t),n.visitedNodeCount++;const l=t.id,a=t.name,i=t.slot,u=t.props,p=t.children,g=t.readonly;if(!(typeof l=="number"&&Number.isInteger(l))||l<=0?$(n,`${o}.id`,"id must be a positive integer."):(n.seenIds.has(l)&&$(n,`${o}.id`,`Duplicate node id "${l}" found.`),n.seenIds.add(l),l>n.maxObservedId&&(n.maxObservedId=l)),(typeof a!="string"||a.trim()==="")&&$(n,`${o}.name`,"name must be a non-empty string."),i===null||typeof i=="string"||$(n,`${o}.slot`,"slot must be a string or null."),Ie(u)?typeof a=="string"&&po(a,u,`${o}.props`,n):$(n,`${o}.props`,"props must be an object."),!Array.isArray(p)){$(n,`${o}.children`,"children must be an array.");return}g===void 0||typeof g=="boolean"||$(n,`${o}.readonly`,"readonly must be a boolean when provided.");for(let k=0;k<p.length&&!n.sizeGuardTriggered;k++)$e(p[k],`${o}.children[${k}]`,n,r+1)}function De(t,o="node"){const n={errors:[],seenIds:new Set,seenNodes:new WeakSet,maxObservedId:0,visitedNodeCount:0,depthGuardTriggered:!1,sizeGuardTriggered:!1};return $e(t,o,n),{isValid:n.errors.length===0,errors:n.errors}}function rt(t){const o={errors:[],seenIds:new Set,seenNodes:new WeakSet,maxObservedId:0,visitedNodeCount:0,depthGuardTriggered:!1,sizeGuardTriggered:!1};if(!Ie(t))return $(o,"pageData","pageData must be an object."),{isValid:!1,errors:o.errors};const{meta:n,content:r,layout:l,maxId:a,variables:i}=t;if(Ie(n)?((typeof n.id!="string"||n.id.trim()==="")&&$(o,"meta.id","meta.id must be a non-empty string."),(typeof n.name!="string"||n.name.trim()==="")&&$(o,"meta.name","meta.name must be a non-empty string."),typeof n.url!="string"||n.url.trim()===""?$(o,"meta.url","meta.url must be a non-empty string."):Z(n.url,"link")===""&&$(o,"meta.url","meta.url contains an unsafe URL."),(typeof n.status!="string"||!io.has(n.status))&&$(o,"meta.status","meta.status must be one of: draft, published, archived."),n.updatedAt===void 0||typeof n.updatedAt=="string"||$(o,"meta.updatedAt","meta.updatedAt must be a string when provided."),n.createdAt===void 0||typeof n.createdAt=="string"||$(o,"meta.createdAt","meta.createdAt must be a string when provided.")):$(o,"meta","meta must be an object."),$e(r,"content",o),$e(l,"layout",o),!(typeof a=="number"&&Number.isInteger(a))||a<0?$(o,"maxId","maxId must be a non-negative integer."):a<o.maxObservedId&&$(o,"maxId",`maxId (${String(a)}) must be greater than or equal to the maximum node id (${String(o.maxObservedId)}).`),!Ie(i))$(o,"variables","variables must be an object.");else for(const[u,p]of Object.entries(i))typeof p!="string"&&$(o,`variables.${u}`,"Variable values must be strings.");return{isValid:o.errors.length===0,errors:o.errors}}const Le="en",at={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 mo(t,o){return o?t.replace(/\{(\w+)\}/g,(n,r)=>{const l=o[r];return l===void 0?n:String(l)}):t}function qt(...t){const o={};for(const n of t)if(n)for(const[r,l]of Object.entries(n))o[r]={...o[r]??{},...l};return o}function Xt(t){const o=t.fallbackLocale??"en",n=t.dictionary[t.locale]??{},r=t.dictionary[o]??{},l=n[t.key]??r[t.key]??t.key;return mo(l,t.params)}function lt(t,o,n="en"){const r=typeof t=="function"?t:()=>t,l=typeof o=="function"?o:()=>o;return(a,i)=>Xt({locale:r(),dictionary:l(),key:a,params:i,fallbackLocale:n})}const Zt=Symbol("pageBuilderI18nOptions"),Jt=Symbol("pageBuilderI18n"),go={locale:e.computed(()=>Le),t:lt(Le,at)};function ee(){return e.inject(Jt,go)}function Me(t){return Array.isArray(t.children)?t.children:[]}function Qt(t,o){const n=Number.isFinite(t)?Math.trunc(t):0;return Math.max(0,Math.min(n,o))}function en(t){try{return structuredClone(t)}catch(o){throw j("INVALID_NODE","[PageBuilder] Failed to clone node tree. Ensure the tree is serializable and acyclic.",{cause:o})}}function A(t,o){if(t.id===o)return t;for(const n of Me(t)){const r=A(n,o);if(r)return r}}function G(t,o){const n=Me(t);for(let r=0;r<n.length;r++){if(n[r].id===o)return{parent:t,index:r};const l=G(n[r],o);if(l)return l}}function tn(t,o){const n=G(t,o);if(n)return n.parent.children.splice(n.index,1)[0]}function it(t,o,n,r,l="default"){const a=A(t,o);if(!a)return!1;Array.isArray(a.children)||(a.children=[]);const i=Qt(r,a.children.length),u={...n,slot:l};return a.children.splice(i,0,u),!0}function nn(t,o,n,r,l="default"){const a=G(t,o);if(!a)return!1;const i=Me(a.parent),[u]=i.splice(a.index,1);if(!u)return!1;if(it(t,n,u,r,l))return!0;const g=Qt(a.index,i.length);return i.splice(g,0,u),!1}function on(t,o,n={}){return{id:t,name:o,slot:n.slot??"default",props:n.props??{},children:n.children??[],readonly:n.readonly}}function st(t,o,n=0){const r=new WeakSet;function l(a,i){if(r.has(a))return!0;if(r.add(a),o(a,i)===!1)return!1;for(const u of Me(a))if(l(u,i+1)===!1)return!1;return!0}return l(t,n)}function vo(t){let o=0;return st(t,()=>{o++}),o}function ve(t){let o=t.id;return st(t,n=>{Number.isFinite(n.id)&&n.id>o&&(o=n.id)}),o}function rn(t,o){if(!t||typeof t!="object"||Array.isArray(t))return{};const n=o&&typeof o=="object"&&!Array.isArray(o)?o:{},r={};for(const[l,a]of Object.entries(t))typeof a=="string"?r[l]=a.replace(/\{\{\s*(\w+)\s*\}\}/g,(i,u)=>n[u]??`{{ ${u} }}`):r[l]=a;return r}const bo={key:1,class:"ipb-error-boundary",role:"alert"},ho={class:"ipb-error-boundary__message"},yo={key:0,class:"ipb-error-boundary__details"},_o=e.defineComponent({__name:"ErrorBoundary",props:{fallbackMessage:{default:"Something went wrong while rendering this section."},showDetailsInDev:{type:Boolean,default:!1},diagnosticContext:{default:"ErrorBoundary"}},setup(t){const o=t,n=e.ref(!1),r=e.ref(null),l=e.ref(""),a=e.computed(()=>!1),i=e.computed(()=>r.value?r.value instanceof Error?r.value.message:String(r.value):""),u=e.computed(()=>[i.value,l.value].filter(p=>!!p).join(`
|
|
2
|
+
`));return e.onErrorCaptured((p,g,k)=>(n.value=!0,r.value=p,l.value=k,o.diagnosticContext,j("RENDER_FAILURE",`[PageBuilder] ${o.diagnosticContext} captured a render error: ${Lt(p)}`,{cause:p,details:{info:k}}),!1)),(p,g)=>n.value?(e.openBlock(),e.createElementBlock("div",bo,[e.createElementVNode("p",ho,e.toDisplayString(t.fallbackMessage),1),a.value&&u.value?(e.openBlock(),e.createElementBlock("pre",yo," "+e.toDisplayString(u.value)+`
|
|
3
|
+
`,1)):e.createCommentVNode("",!0)])):e.renderSlot(p.$slots,"default",{key:0},void 0,!0)}}),H=(t,o)=>{const n=t.__vccOpts||t;for(const[r,l]of o)n[r]=l;return n},an=H(_o,[["__scopeId","data-v-5b429c0c"]]),wo={key:0,class:"ipb-node-renderer__invalid",role:"alert"},ko=e.defineComponent({__name:"NodeRenderer",props:{node:{type:Object,required:!0},variables:{type:Object,default:()=>({})},markNodes:{type:Boolean,default:!1}},setup(t){const o=t,n=new Set;function r(f,b,d){n.has(f)||(n.add(f),j("RENDER_FAILURE",b,{details:d}),void 0)}function l(f){if(typeof f!="object"||f===null||Array.isArray(f))return!1;const b=f;return typeof b.id!="number"||!Number.isFinite(b.id)||typeof b.name!="string"||b.name.trim().length===0||!(b.slot===null||typeof b.slot=="string")||typeof b.props!="object"||b.props===null||Array.isArray(b.props)?!1:Array.isArray(b.children)}function a(f){return!f||typeof f!="object"||Array.isArray(f)?{}:Object.fromEntries(Object.entries(f).filter(b=>typeof b[1]=="string"))}const i=e.computed(()=>l(o.node)?o.node:(r("invalid-node","[PageBuilder] NodeRenderer received an invalid node payload.",{node:o.node}),null)),u=e.computed(()=>a(o.variables)),p=e.defineComponent({name:"NodeRenderCrash",props:{error:{type:null,required:!0}},setup(f){return()=>{throw f.error instanceof Error?f.error:new Error(String(f.error))}}}),g=e.computed(()=>{if(!i.value)return{component:p,error:j("INVALID_NODE","[PageBuilder] Cannot render node because its payload is invalid.")};try{return{component:Mt(i.value.name),error:null}}catch(f){return r(`missing-component:${i.value.name}`,`[PageBuilder] Component "${i.value.name}" could not be resolved.`,{nodeId:i.value.id}),{component:p,error:f}}}),k=e.computed(()=>g.value.component),v=e.computed(()=>{if(g.value.error!==null)return{error:g.value.error};if(!i.value)return{error:j("INVALID_NODE","[PageBuilder] Cannot render props for an invalid node payload.")};try{return rn(i.value.props,u.value)}catch(f){return r(`prop-interpolation:${i.value.id}`,`[PageBuilder] Failed to interpolate props for node "${i.value.name}".`,{nodeId:i.value.id}),{error:f}}}),D=e.computed(()=>!o.markNodes||!i.value?{}:{"data-ipb-node-id":String(i.value.id),"data-ipb-component":i.value.name}),E=e.computed(()=>({...v.value,...D.value})),C=e.computed(()=>{const f={};if(!i.value)return f;for(const b of i.value.children){if(!l(b)){r(`invalid-child:${i.value.id}`,`[PageBuilder] Ignoring invalid child node while rendering "${i.value.name}".`,{parentNodeId:i.value.id});continue}const d=b.slot??"default";f[d]||(f[d]=[]),f[d].push(b)}return f});return(f,b)=>{const d=e.resolveComponent("NodeRenderer",!0);return i.value?(e.openBlock(),e.createBlock(an,{key:1,"fallback-message":"This block could not be rendered.","show-details-in-dev":!0,"diagnostic-context":"NodeRenderer"},{default:e.withCtx(()=>[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(k.value),e.normalizeProps(e.guardReactiveProps(E.value)),e.createSlots({_:2},[e.renderList(C.value,(s,y)=>({name:y,fn:e.withCtx(()=>[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(s,x=>(e.openBlock(),e.createBlock(d,{key:x.id,node:x,variables:u.value,"mark-nodes":t.markNodes},null,8,["node","variables","mark-nodes"]))),128))])}))]),1040))]),_:1})):(e.openBlock(),e.createElementBlock("div",wo," This block is invalid and could not be rendered. "))}}}),dt=H(ko,[["__scopeId","data-v-40a28160"]]),No={class:"ipb-page-reader"},Eo={key:1,class:"ipb-page-reader__invalid",role:"alert"},xo=e.defineComponent({__name:"PageReader",props:{pageData:{type:Object,required:!0}},setup(t){const o=t,n=e.computed(()=>rt(o.pageData)),r=e.computed(()=>De(o.pageData.content,"content")),l=e.computed(()=>De(o.pageData.layout,"layout")),a=new Set;function i(k,v,D){a.has(k)||(a.add(k),j("INVALID_PAGE_DATA",v,{details:D}),void 0)}e.watch(n,k=>{k.isValid||i("invalid-page-data","[PageReader] Invalid pageData payload detected. Rendering continues with degraded behavior.",{errors:k.errors})},{immediate:!0});function u(k){return typeof k=="object"&&k!==null&&!Array.isArray(k)}const p=e.computed(()=>{const k=o.pageData.variables;return!k||typeof k!="object"||Array.isArray(k)?(i("invalid-variables-shape","[PageReader] Invalid variables payload. Falling back to an empty variable map."),{}):(Object.values(k).some(D=>typeof D!="string")&&i("invalid-variables-values","[PageReader] Variables payload contains non-string values. Invalid entries were ignored."),Object.fromEntries(Object.entries(k).filter(D=>typeof D[1]=="string")))}),g=e.computed(()=>{if(!u(o.pageData.content)||!r.value.isValid)return i("invalid-content","[PageReader] Invalid content node. Nothing can be rendered.",{errors:r.value.errors}),null;if(!u(o.pageData.layout)||!l.value.isValid)return i("invalid-layout","[PageReader] Invalid layout node. Falling back to content-only rendering.",{errors:l.value.errors}),o.pageData.content;const k={...o.pageData.content,slot:o.pageData.content.slot??"default"},v=Array.isArray(o.pageData.layout.children)?o.pageData.layout.children:[];return{...o.pageData.layout,children:[...v,k]}});return(k,v)=>(e.openBlock(),e.createElementBlock("div",No,[g.value?(e.openBlock(),e.createBlock(an,{key:0,"fallback-message":"This page could not be fully rendered.","show-details-in-dev":!0,"diagnostic-context":"PageReader"},{default:e.withCtx(()=>[e.createVNode(dt,{node:g.value,variables:p.value},null,8,["node","variables"])]),_:1})):(e.openBlock(),e.createElementBlock("div",Eo," This page data is invalid and cannot be rendered safely. "))]))}}),ln=H(xo,[["__scopeId","data-v-d9bf9b29"]]),ke={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"}},sn=Symbol("pageBuilder"),dn=Symbol("editor"),Oe=Symbol("nodeTree"),ze=Symbol("dragDrop");function Q(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Io(t){return typeof t=="number"&&Number.isInteger(t)&&t>0}function Je(t){return typeof t=="number"&&Number.isInteger(t)&&t>=0}function St(t,o,n){return{id:t,name:o,slot:n,props:{},children:[]}}function ge(t,o=new WeakSet){return!Q(t)||o.has(t)||(o.add(t),!Io(t.id))||typeof t.name!="string"||t.name.trim().length===0||!(t.slot===null||typeof t.slot=="string")||!Q(t.props)||!Array.isArray(t.children)||typeof t.readonly<"u"&&typeof t.readonly!="boolean"?!1:t.children.every(n=>ge(n,o))}function Do(t){if(!Q(t))return{};const o={};for(const[n,r]of Object.entries(t))typeof r=="string"&&(o[n]=r);return o}function Co(t){const o=[],n=St(1,"PbSection",null),r=St(100,"PbContainer",null),l=Q(t)?t:{};let a=n;ge(l.content)?a=structuredClone(l.content):o.push("content node is invalid");let i=r;ge(l.layout)?i=structuredClone(l.layout):o.push("layout node is invalid");const u=l.maxId,p=Math.max(ve(a),ve(i)),g=Je(u),k=g?Math.max(Math.trunc(u),p):p;g||o.push("maxId is invalid");const v=Do(l.variables);Q(l.variables)||o.push("variables map is invalid");const D=Q(l.meta)?l.meta:{};Q(l.meta)||o.push("meta object is invalid");const E={meta:{id:typeof D.id=="string"?D.id:"unknown-page",name:typeof D.name=="string"?D.name:"Untitled page",url:typeof D.url=="string"?D.url:"/",status:D.status==="draft"||D.status==="published"||D.status==="archived"?D.status:"draft",updatedAt:typeof D.updatedAt=="string"?D.updatedAt:void 0,createdAt:typeof D.createdAt=="string"?D.createdAt:void 0},content:a,layout:i,maxId:k,variables:v};return o.length>0&&(j("INVALID_PAGE_DATA",`[PageBuilder] Invalid page data detected. Falling back to safe defaults for: ${o.join(", ")}.`),void 0),E}function Tt(t){let o;try{o=JSON.parse(t)}catch(r){throw j("INVALID_SNAPSHOT","[PageBuilder] Snapshot JSON is invalid.",{cause:r,details:{snapshotPreview:t.slice(0,200)}})}if(!Q(o)||!ge(o.content)||!ge(o.layout)||!Je(o.maxId))throw j("INVALID_SNAPSHOT","[PageBuilder] Snapshot payload shape is invalid.",{details:{contentValid:Q(o)?ge(o.content):!1,layoutValid:Q(o)?ge(o.layout):!1,maxIdValid:Q(o)?Je(o.maxId):!1}});const n=Math.max(Math.trunc(o.maxId),ve(o.content),ve(o.layout));return{content:o.content,layout:o.layout,maxId:n}}function cn(t){const{initialData:o,mode:n="read"}=t,r=Co(o),l=e.ref(n),a=e.ref(r.meta),i=e.ref(r.content),u=e.ref(r.layout),p=e.ref(r.maxId),g=e.ref(r.variables),k=e.ref(!1),v=e.computed(()=>({meta:a.value,content:i.value,layout:u.value,maxId:p.value,variables:g.value})),D=C({content:r.content,layout:r.layout});function E(I){return JSON.stringify(I)}function C(I){return JSON.stringify(I)}function f(){k.value=C({content:i.value,layout:u.value})!==D}function b(I){l.value=I}function d(I){i.value=I,p.value=Math.max(p.value,ve(I)),f()}function s(I){u.value=I,p.value=Math.max(p.value,ve(I)),f()}function y(){return p.value++,p.value}function x(){return E({content:i.value,layout:u.value,maxId:p.value})}function B(I){try{const L=Tt(I);i.value=L.content,u.value=L.layout,p.value=L.maxId,f()}catch(L){throw j("INVALID_SNAPSHOT","[PageBuilder] Unable to restore snapshot.",{cause:L,details:{reason:Lt(L)}})}}function T(){const I=Tt(JSON.stringify({content:r.content,layout:r.layout,maxId:r.maxId}));i.value=structuredClone(I.content),u.value=structuredClone(I.layout),p.value=I.maxId,g.value=structuredClone(r.variables),k.value=!1}return{mode:l,pageData:v,content:i,layout:u,maxId:p,variables:g,isDirty:k,setMode:b,updateContent:d,updateLayout:s,nextId:y,getSnapshot:x,restoreSnapshot:B,reset:T}}function un(t={}){const{initialSnapshot:o,initialLabel:n="Initial state"}=t,r=o?[{timestamp:Date.now(),label:n,snapshot:o}]:[];let l=o??null;const a=e.reactive({selectedNodeId:null,hoveredNodeId:null,leftDrawerOpen:!0,rightDrawerOpen:!1,history:r,historyIndex:r.length>0?0:-1,isDirty:!1,canvasScale:1,viewport:"desktop"}),i=e.computed(()=>a.historyIndex>0),u=e.computed(()=>a.historyIndex<a.history.length-1);function p(s){a.selectedNodeId=s,s!==null&&(a.rightDrawerOpen=!0)}function g(s){a.hoveredNodeId=s}function k(){a.leftDrawerOpen=!a.leftDrawerOpen}function v(){a.rightDrawerOpen=!a.rightDrawerOpen}function D(s){a.viewport=s}function E(){var y;if(l===null||a.historyIndex<0){a.isDirty=!1;return}const s=(y=a.history[a.historyIndex])==null?void 0:y.snapshot;a.isDirty=s!==l}function C(s,y=n){l=s,a.history=[{timestamp:Date.now(),label:y,snapshot:s}],a.historyIndex=0,a.isDirty=!1}function f(s,y){var B;if(l===null){C(y);return}((B=a.history[a.historyIndex])==null?void 0:B.snapshot)!==y&&(a.historyIndex<a.history.length-1&&a.history.splice(a.historyIndex+1),a.history.push({timestamp:Date.now(),label:s,snapshot:y}),a.historyIndex=a.history.length-1,E())}function b(){var s;if(i.value)return a.historyIndex--,E(),(s=a.history[a.historyIndex])==null?void 0:s.snapshot}function d(){var s;if(u.value)return a.historyIndex++,E(),(s=a.history[a.historyIndex])==null?void 0:s.snapshot}return{...e.toRefs(a),canUndo:i,canRedo:u,selectNode:p,hoverNode:g,toggleLeftDrawer:k,toggleRightDrawer:v,setViewport:D,setHistoryBaseline:C,pushHistory:f,undo:b,redo:d}}function fn({content:t,nextId:o,onUpdate:n,onSnapshot:r}){function l(f,b){const d=e.toRaw(t.value),s=JSON.stringify(d),y=en(d);return b(y)===!1||JSON.stringify(y)===s?!1:(n(y),r==null||r(f),!0)}function a(f,b,d,s="default",y){let x=null;return!l(`Add ${b}`,T=>{if(!A(T,f))return!1;x=o();const L=on(x,b,{slot:s,props:y});return it(T,f,L,d,s)})||x===null?null:x}function i(f){l("Delete node",b=>{tn(b,f)})}function u(f,b,d,s="default"){l("Move node",y=>nn(y,f,b,d,s))}function p(f,b){l("Update props",d=>{const s=A(d,f);s&&(s.props={...s.props,...b})})}function g(f){l("Duplicate node",b=>{const d=A(b,f);if(!d)return;const s=G(b,f);if(!s)return;const y=C(d);s.parent.children.splice(s.index+1,0,y)})}function k(f){const b=A(t.value,f);if(!b||b.readonly)return!1;const d=G(t.value,f);return d?d.index>0:!1}function v(f){const b=A(t.value,f);if(!b||b.readonly)return!1;const d=G(t.value,f);return d?d.index<d.parent.children.length-1:!1}function D(f){k(f)&&l("Move node up",b=>{const d=G(b,f);if(!d||d.index<=0)return;const[s]=d.parent.children.splice(d.index,1);d.parent.children.splice(d.index-1,0,s)})}function E(f){v(f)&&l("Move node down",b=>{const d=G(b,f);if(!d||d.index>=d.parent.children.length-1)return;const[s]=d.parent.children.splice(d.index,1);d.parent.children.splice(d.index+1,0,s)})}function C(f){return{...f,id:o(),props:{...f.props},children:f.children.map(b=>C(b))}}return{addNode:a,deleteNode:i,moveNodeTo:u,updateNodeProps:p,duplicateNode:g,canMoveNodeUp:k,canMoveNodeDown:v,moveNodeUp:D,moveNodeDown:E}}const pn="default";function Pe(){return{isDragging:!1,sourceNodeId:null,sourceComponentName:null,isNewComponent:!1,dropTargetId:null,dropIndex:0,dropSlot:pn}}function mn(){const t=e.ref(Pe());function o(){t.value=Pe()}function n(u){t.value={...Pe(),isDragging:!0,sourceNodeId:u}}function r(u){t.value={...Pe(),isDragging:!0,sourceComponentName:u,isNewComponent:!0}}function l(u,p,g=pn){t.value.isDragging&&(t.value.dropTargetId=u,t.value.dropIndex=p,t.value.dropSlot=g)}function a(){const u={...t.value};return o(),u}function i(){o()}return{dragState:t,startDragExisting:n,startDragNew:r,updateDropTarget:l,endDrag:a,cancelDrag:i}}const So=["aria-label"],To=["aria-label"],Bo=["disabled","aria-label","title"],Po=["disabled","aria-label","title"],Vo=["aria-label"],Ro=["title","aria-label","aria-pressed","data-viewport-preset","onClick","onKeydown"],$o={key:0,class:"ipb-toolbar__custom-size"},Lo={class:"ipb-toolbar__size-control"},Ao=["aria-label","value"],Mo={class:"ipb-toolbar__size-control"},Oo=["aria-label","value"],zo={key:1,class:"ipb-toolbar__viewport-size","aria-live":"polite"},Uo=["aria-label"],Ko=["aria-label"],Ho=["aria-label","title"],Fe=240,We=320,Ge=3840,Ye=4320,jo=e.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(t,{emit:o}){const n=t,r=o,{t:l}=ee(),a={desktop:"toolbar.viewport.desktop",tablet:"toolbar.viewport.tablet",mobile:"toolbar.viewport.mobile",custom:"toolbar.viewport.custom"},i=["desktop","tablet","mobile","custom"],u=e.ref(new Map);function p(d){return l(a[d])}function g(d){return l("toolbar.viewport.switchAriaLabel",{viewport:p(d)})}function k(d,s){const y=s instanceof HTMLButtonElement?s:s&&"$el"in s&&s.$el instanceof HTMLButtonElement?s.$el:null;if(y){u.value.set(d,y);return}u.value.delete(d)}function v(d){return i.indexOf(d)}function D(d){var s;(s=u.value.get(d))==null||s.focus()}function E(d,s){const y=v(s);if(y<0||d.key!=="ArrowLeft"&&d.key!=="ArrowRight"&&d.key!=="ArrowUp"&&d.key!=="ArrowDown"&&d.key!=="Home"&&d.key!=="End")return;d.preventDefault();let x=y;d.key==="ArrowLeft"||d.key==="ArrowUp"?x=(y-1+i.length)%i.length:d.key==="ArrowRight"||d.key==="ArrowDown"?x=(y+1)%i.length:d.key==="Home"?x=0:d.key==="End"&&(x=i.length-1);const B=i[x];r("viewport-change",B),e.nextTick(()=>{D(B)})}function C(d,s,y){return Math.max(s,Math.min(y,d))}function f(d){if(!d.trim())return null;const s=Number(d);return Number.isFinite(s)?Math.round(s):null}function b(d,s){const y=f(s);if(y===null)return;const x=C(d==="width"?y:n.customViewportWidth,Fe,Ge),B=C(d==="height"?y:n.customViewportHeight,We,Ye);r("custom-viewport-change",{width:x,height:B})}return(d,s)=>(e.openBlock(),e.createElementBlock("header",{class:"ipb-toolbar",role:"toolbar","aria-label":e.unref(l)("toolbar.aria.toolbar")},[e.createElementVNode("div",{class:"ipb-toolbar__left",role:"group","aria-label":e.unref(l)("toolbar.aria.historyControls")},[e.createElementVNode("button",{type:"button",class:"ipb-toolbar__btn",disabled:!t.canUndo,"aria-label":e.unref(l)("toolbar.undo.ariaLabel"),title:e.unref(l)("toolbar.undo.title"),"aria-keyshortcuts":"Control+Z Meta+Z",onClick:s[0]||(s[0]=y=>d.$emit("undo"))}," ↩ ",8,Bo),e.createElementVNode("button",{type:"button",class:"ipb-toolbar__btn",disabled:!t.canRedo,"aria-label":e.unref(l)("toolbar.redo.ariaLabel"),title:e.unref(l)("toolbar.redo.title"),"aria-keyshortcuts":"Control+Y Meta+Y Control+Shift+Z Meta+Shift+Z",onClick:s[1]||(s[1]=y=>d.$emit("redo"))}," ↪ ",8,Po)],8,To),e.createElementVNode("div",{class:"ipb-toolbar__center",role:"group","aria-label":e.unref(l)("toolbar.aria.viewportControls")},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(ke),(y,x)=>(e.openBlock(),e.createElementBlock("button",{key:x,ref_for:!0,ref:B=>k(x,B),type:"button",class:e.normalizeClass(["ipb-toolbar__btn",{"ipb-toolbar__btn--active":t.viewport===x}]),title:p(x),"aria-label":g(x),"aria-pressed":t.viewport===x?"true":"false","data-viewport-preset":x,onClick:B=>d.$emit("viewport-change",x),onKeydown:B=>E(B,x)},e.toDisplayString(p(x)),43,Ro))),128)),t.viewport==="custom"?(e.openBlock(),e.createElementBlock("div",$o,[e.createElementVNode("label",Lo,[e.createElementVNode("span",null,e.toDisplayString(e.unref(l)("toolbar.viewport.width.short")),1),e.createElementVNode("input",{class:"ipb-toolbar__size-input",type:"number",inputmode:"numeric","aria-label":e.unref(l)("toolbar.viewport.width.ariaLabel"),min:Fe,max:Ge,value:t.customViewportWidth,onInput:s[2]||(s[2]=y=>b("width",y.target.value))},null,40,Ao)]),e.createElementVNode("label",Mo,[e.createElementVNode("span",null,e.toDisplayString(e.unref(l)("toolbar.viewport.height.short")),1),e.createElementVNode("input",{class:"ipb-toolbar__size-input",type:"number",inputmode:"numeric","aria-label":e.unref(l)("toolbar.viewport.height.ariaLabel"),min:We,max:Ye,value:t.customViewportHeight,onInput:s[3]||(s[3]=y=>b("height",y.target.value))},null,40,Oo)])])):e.createCommentVNode("",!0),t.activeViewportWidth!==null&&t.activeViewportHeight!==null?(e.openBlock(),e.createElementBlock("span",zo,e.toDisplayString(t.activeViewportWidth)+"×"+e.toDisplayString(t.activeViewportHeight),1)):e.createCommentVNode("",!0)],8,Vo),e.createElementVNode("div",{class:"ipb-toolbar__right",role:"group","aria-label":e.unref(l)("toolbar.aria.saveControls")},[t.isDirty?(e.openBlock(),e.createElementBlock("span",{key:0,class:"ipb-toolbar__dirty-indicator",role:"status","aria-label":e.unref(l)("toolbar.aria.unsavedChanges")}," ● ",8,Ko)):e.createCommentVNode("",!0),e.createElementVNode("button",{type:"button",class:"ipb-toolbar__btn ipb-toolbar__btn--primary","aria-label":e.unref(l)("toolbar.save.ariaLabel"),title:e.unref(l)("toolbar.save.title"),"aria-keyshortcuts":"Control+S Meta+S",onClick:s[4]||(s[4]=y=>d.$emit("save"))},e.toDisplayString(e.unref(l)("toolbar.save")),9,Ho)],8,Uo)],8,So))}}),Fo=H(jo,[["__scopeId","data-v-7086d88b"]]);function Wo(t,o){const n=de(t.name);return!n||n.slots.length===0?[]:n.slots.filter(r=>{const l=r.allowedComponents;return!l||l.length===0||l.includes(o)})}function se(t,o,n){const r=Wo(t,n);if(r.length===0)return null;if(o){const a=r.find(i=>i.name===o);if(a)return a.name}const l=r.find(a=>a.name==="default");return(l==null?void 0:l.name)??r[0].name}function Ve(t){return Number.isFinite(t)?Math.trunc(t):0}function gn(t){return`ipb-node-${t}`}function vn(t,o={}){const n=o.createKey??(a=>gn(a.id)),r=[],l=[{node:t,depth:0,parentId:null}];for(;l.length>0;){const a=l.pop();if(!a)break;const i=r.length;r.push({node:a.node,id:a.node.id,key:n(a.node),depth:a.depth,index:i,parentId:a.parentId});for(let u=a.node.children.length-1;u>=0;u--)l.push({node:a.node.children[u],depth:a.depth+1,parentId:a.node.id})}return r}function bn(t,o,n,r=0){const l=Math.max(0,Ve(t)),a=Math.max(0,Ve(n)),i=Math.max(0,Ve(r));if(l===0||a===0)return{start:0,end:0,size:0,total:l};const u=l-1,p=Math.min(Math.max(Ve(o),0),u),g=Math.max(0,p-i),k=Math.min(l,p+a+i);return{start:g,end:k,size:Math.max(0,k-g),total:l}}function Go(t,o,n,r=0){const l=bn(t.length,o,n,r);return{rows:t.slice(l.start,l.end),range:l}}function Yo(t){const o=[],n=new Map,r=new Map;for(let l=0;l<t.length;l++){const a=t[l];o[l]=a.key,n.has(a.key)||n.set(a.key,l),r.has(a.id)||r.set(a.id,l)}return{keyByIndex:o,indexByKey:n,indexByNodeId:r}}const qo={class:"ipb-tree-panel"},Xo=["aria-label"],Zo=["onDragover","onDrop"],Jo={key:0,class:"ipb-tree-panel__drop-line","data-drop-zone":"above","aria-hidden":"true"},Qo=["data-node-id","draggable","aria-selected","aria-level","aria-readonly","tabindex","onClick","onDragstart"],er={class:"ipb-tree-panel__name"},tr={class:"ipb-tree-panel__id"},nr={key:0,class:"ipb-tree-panel__readonly"},or={key:1,class:"ipb-tree-panel__drop-line","data-drop-zone":"below","aria-hidden":"true"},rr=e.defineComponent({__name:"TreePanel",props:{content:{type:Object,required:!0},selectedNodeId:{type:Number,default:null}},emits:["select"],setup(t,{emit:o}){const n=t,r=o,{t:l}=ee(),a=e.inject(Oe,null),i=e.inject(ze,null),u=e.ref(!1),p=e.ref(null),g=e.ref(null),k=e.computed(()=>n.content.id);function v(m,N,w="on"){var re,ce;const V=(ce=(re=m.target)==null?void 0:re.closest)==null?void 0:ce.call(re,"[data-drop-zone]"),M=V==null?void 0:V.getAttribute("data-drop-zone");if(M==="above")return"above";if(M==="below")return"below";if(!N)return w;const O=N.getBoundingClientRect(),J=m.clientY-O.top,q=O.height/3;return J<q?"above":J>2*q?"below":"on"}function D(m,N){const w=A(n.content,m);if(!w)return null;const V=w.slot??"default",M=G(n.content,m);if(!M){const J=n.content.id,q=N==="above"?0:n.content.children.length;return{parentId:J,index:q,slot:"default"}}const O=N==="above"?M.index:M.index+1;return{parentId:M.parent.id,index:O,slot:V}}function E(m,N){return m.id===N?!0:m.children.some(w=>E(w,N))}function C(m){var N;return m.sourceComponentName?m.sourceComponentName:m.sourceNodeId===null?null:((N=A(n.content,m.sourceNodeId))==null?void 0:N.name)??null}function f(m,N){if(m.sourceNodeId===N)return!1;const w=C(m);if(!w)return!1;const V=A(n.content,N);if(!V||V.readonly)return!1;if(!m.isNewComponent&&m.sourceNodeId!==null){const M=A(n.content,m.sourceNodeId);if(!M||M.readonly||E(M,N))return!1}return se(V,"default",w)!==null}function b(m,N,w){const V=C(m);if(!V)return!1;const M=A(n.content,N);if(!M||M.readonly||se(M,w,V)===null)return!1;if(!m.isNewComponent&&m.sourceNodeId!==null){const O=A(n.content,m.sourceNodeId);if(!O||O.readonly||E(O,N))return!1}return!0}const d=e.computed(()=>vn(n.content).map(m=>({id:m.id,key:m.key,name:m.node.name,depth:m.depth,readonly:!!m.node.readonly}))),s=e.ref(new Map);function y(m,N){const w=N instanceof HTMLButtonElement?N:N&&"$el"in N&&N.$el instanceof HTMLButtonElement?N.$el:null;if(w){s.value.set(m,w);return}s.value.delete(m)}function x(m){if(!(m instanceof HTMLElement))return null;const N=m.dataset.nodeId;if(!N)return null;const w=Number(N);return Number.isInteger(w)?w:null}function B(m=!0){if(d.value.length===0)return-1;if(n.selectedNodeId!==null){const N=d.value.findIndex(w=>w.id===n.selectedNodeId);if(N>=0)return N}return m?0:-1}function T(m){var N;(N=s.value.get(m))==null||N.focus()}function I(m){const N=d.value[m];N&&(r("select",N.id),e.nextTick(()=>{T(N.id)}))}function L(m){var w;const N=B();return((w=d.value[N])==null?void 0:w.id)===m}const Y=e.computed(()=>!!(a&&i)),U=m=>!!(i!=null&&i.dragState.value.isDragging&&p.value===m&&g.value==="on"),F=m=>!!(i!=null&&i.dragState.value.isDragging&&p.value===m&&g.value==="above"),oe=m=>!!(i!=null&&i.dragState.value.isDragging&&p.value===m&&g.value==="below");function te(m){return!Y.value||m.readonly?!1:m.id!==k.value}function Ne(m,N){!i||!te(m)||(u.value=!1,i.startDragExisting(m.id),N.dataTransfer&&(N.dataTransfer.effectAllowed="move",N.dataTransfer.setData("application/x-ipb-node-id",String(m.id)),N.dataTransfer.setData("text/plain",String(m.id))))}function be(m,N){if(!i||!i.dragState.value.isDragging)return;const w=i.dragState.value,V=v(N,s.value.get(m.id));if(V==="on"){if(!f(w,m.id))return;N.preventDefault(),N.dataTransfer&&(N.dataTransfer.dropEffect=w.isNewComponent?"copy":"move"),p.value=m.id,g.value="on",i.updateDropTarget(m.id,0,"default");return}const M=D(m.id,V);!M||!b(w,M.parentId,M.slot)||(N.preventDefault(),N.dataTransfer&&(N.dataTransfer.dropEffect=w.isNewComponent?"copy":"move"),p.value=m.id,g.value=V,i.updateDropTarget(M.parentId,M.index,M.slot))}function he(m,N){var Se,ye;if(N.preventDefault(),!a||!i||!i.dragState.value.isDragging)return;const w=i.dragState.value,M=(p.value===m.id&&g.value?g.value:null)??v(N,s.value.get(m.id),"on");if(M==="on"){const _e=A(n.content,m.id);if(!_e||!f(w,m.id)){i.cancelDrag();return}const le=C(w),Te=le?se(_e,"default",le)??"default":"default";if(w.isNewComponent&&w.sourceComponentName){const Be=(Se=de(w.sourceComponentName))==null?void 0:Se.defaultProps,xe=a.addNode(m.id,w.sourceComponentName,0,Te,Be);u.value=!0,i.endDrag(),xe!==null&&r("select",xe);return}if(w.sourceNodeId===null)return;a.moveNodeTo(w.sourceNodeId,m.id,0,Te),u.value=!0,i.endDrag(),r("select",w.sourceNodeId);return}const O=D(m.id,M);if(!O||!b(w,O.parentId,O.slot)){i.cancelDrag();return}const J=A(n.content,O.parentId),q=C(w),re=J&&q?se(J,O.slot,q)??O.slot:O.slot;if(w.isNewComponent&&w.sourceComponentName){const _e=(ye=de(w.sourceComponentName))==null?void 0:ye.defaultProps,le=a.addNode(O.parentId,w.sourceComponentName,O.index,re,_e);u.value=!0,i.endDrag(),le!==null&&r("select",le);return}if(w.sourceNodeId===null)return;let ce=O.index;const Ee=G(n.content,w.sourceNodeId);Ee&&Ee.parent.id===O.parentId&&Ee.index<O.index&&(ce=O.index-1),a.moveNodeTo(w.sourceNodeId,O.parentId,ce,re),u.value=!0,i.endDrag(),r("select",w.sourceNodeId)}function h(){p.value=null,g.value=null,!u.value&&(i!=null&&i.dragState.value.isDragging)&&i.cancelDrag()}function R(m){if(d.value.length===0)return;const N=x(m.target),w=N===null?B():d.value.findIndex(V=>V.id===N);if(!(w<0)){if(m.key==="ArrowDown"){m.preventDefault();const V=Math.min(d.value.length-1,w+1);I(V);return}if(m.key==="ArrowUp"){m.preventDefault();const V=Math.max(0,w-1);I(V);return}if(m.key==="Home"){m.preventDefault(),I(0);return}if(m.key==="End"){m.preventDefault(),I(d.value.length-1);return}(m.key==="Enter"||m.key===" ")&&(m.preventDefault(),I(w))}}return e.watch(()=>n.selectedNodeId,m=>{m!==null&&e.nextTick(()=>{T(m)})}),(m,N)=>(e.openBlock(),e.createElementBlock("div",qo,[e.createElementVNode("div",{class:"ipb-tree-panel__list",role:"tree","aria-label":e.unref(l)("treePanel.ariaLabel"),onKeydown:R},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.value,w=>(e.openBlock(),e.createElementBlock("div",{key:w.key,class:"ipb-tree-panel__row-wrapper",onDragover:V=>be(w,V),onDrop:V=>he(w,V)},[F(w.id)?(e.openBlock(),e.createElementBlock("div",Jo)):e.createCommentVNode("",!0),e.createElementVNode("button",{ref_for:!0,ref:V=>y(w.id,V),type:"button",class:e.normalizeClass(["ipb-tree-panel__item",{"ipb-tree-panel__item--selected":t.selectedNodeId===w.id,"ipb-tree-panel__item--readonly":w.readonly,"ipb-tree-panel__item--drop-target":U(w.id),"ipb-tree-panel__item--draggable":te(w)}]),style:e.normalizeStyle({paddingInlineStart:`${w.depth*16+8}px`}),"data-node-id":w.id,draggable:te(w),role:"treeitem","aria-selected":t.selectedNodeId===w.id?"true":"false","aria-level":w.depth+1,"aria-readonly":w.readonly?"true":"false",tabindex:L(w.id)?0:-1,onClick:V=>r("select",w.id),onDragstart:V=>Ne(w,V),onDragend:h},[e.createElementVNode("span",er,e.toDisplayString(w.name),1),e.createElementVNode("span",tr,"#"+e.toDisplayString(w.id),1),w.readonly?(e.openBlock(),e.createElementBlock("span",nr,e.toDisplayString(e.unref(l)("treePanel.readonly")),1)):e.createCommentVNode("",!0)],46,Qo),oe(w.id)?(e.openBlock(),e.createElementBlock("div",or)):e.createCommentVNode("",!0)],40,Zo))),128))],40,Xo)]))}}),ar=H(rr,[["__scopeId","data-v-f50f228d"]]),lr=["aria-label"],ir={class:"ipb-left-drawer__header"},sr={class:"ipb-left-drawer__title",id:"ipb-left-drawer-title"},dr=["aria-label","aria-expanded"],cr={class:"ipb-left-drawer__section"},ur={class:"ipb-left-drawer__section-title",id:"ipb-left-drawer-components-title"},fr={class:"ipb-left-drawer__search",role:"search"},pr=["placeholder","aria-label"],mr={class:"ipb-left-drawer__category-title"},gr=["aria-label"],vr=["title","aria-label","onClick","onDragstart"],br={class:"ipb-left-drawer__component-icon","aria-hidden":"true"},hr={class:"ipb-left-drawer__component-label"},yr={key:0,class:"ipb-left-drawer__empty"},_r={key:0,class:"ipb-left-drawer__section ipb-left-drawer__section--tree"},wr={class:"ipb-left-drawer__section-header"},kr={class:"ipb-left-drawer__section-title"},Nr=["aria-expanded","aria-label"],Er=["aria-label"],me="ipb-left-drawer-content",Bt="ipb-left-drawer-tree-panel",xr=e.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(t,{emit:o}){const n=t,r=o,l=e.computed(()=>Ot()),{t:a}=ee(),i=e.ref(""),u=e.ref(!0),p=e.ref(null),g=e.ref(null),k=e.ref(null),v=e.ref(!1),D=e.computed(()=>{const T=i.value.trim().toLowerCase();if(!T)return l.value;const I=new Map;for(const[L,Y]of l.value){const U=Y.filter(F=>[F.name,F.label,F.description??"",L,F.category].some(te=>te.toLowerCase().includes(T)));U.length>0&&I.set(L,U)}return I});function E(T,I){I.dataTransfer&&(I.dataTransfer.effectAllowed="copy",I.dataTransfer.setData("application/x-ipb-component",T),I.dataTransfer.setData("text/plain",T)),r("dragStart",T)}function C(){r("dragEnd")}function f(T){r("add",T)}function b(){u.value=!u.value}function d(){const T=p.value;return T?T.querySelector(`#${me} button:not([disabled]), #${me} input:not([disabled]), #${me} select:not([disabled]), #${me} textarea:not([disabled]), #${me} [tabindex]:not([tabindex="-1"])`):null}function s(){var T,I;(T=k.value)==null||T.focus(),document.activeElement!==k.value&&((I=d())==null||I.focus())}function y(){v.value=!n.open,r("toggle")}function x(T){return a("leftDrawer.category.ariaLabel",{category:T})}function B(T){return a("leftDrawer.component.dragAriaLabel",{label:T})}return e.watch(()=>n.open,(T,I)=>{var L;if(T&&!I&&v.value&&e.nextTick(()=>{s()}),!T&&I){const Y=document.activeElement;Y instanceof HTMLElement&&((L=p.value)!=null&&L.contains(Y))&&e.nextTick(()=>{var U;(U=g.value)==null||U.focus()})}T!==I&&(v.value=!1)}),(T,I)=>(e.openBlock(),e.createElementBlock("aside",{ref_key:"drawerRef",ref:p,class:e.normalizeClass(["ipb-left-drawer",{"ipb-left-drawer--open":t.open}]),"aria-label":e.unref(a)("leftDrawer.aria.componentPalette"),role:"complementary"},[e.createElementVNode("div",ir,[e.createElementVNode("span",sr,e.toDisplayString(e.unref(a)("leftDrawer.title")),1),e.createElementVNode("button",{ref_key:"drawerToggleRef",ref:g,type:"button",class:"ipb-left-drawer__toggle","aria-label":e.unref(a)("leftDrawer.toggle.ariaLabel"),"aria-expanded":t.open?"true":"false","aria-controls":me,onClick:y},e.toDisplayString(t.open?"◀":"▶"),9,dr)]),t.open?(e.openBlock(),e.createElementBlock("div",{key:0,id:me,class:"ipb-left-drawer__content",role:"region","aria-labelledby":"ipb-left-drawer-title"},[e.createElementVNode("div",cr,[e.createElementVNode("h3",ur,e.toDisplayString(e.unref(a)("leftDrawer.section.components")),1),e.createElementVNode("div",fr,[e.withDirectives(e.createElementVNode("input",{ref_key:"searchInputRef",ref:k,"onUpdate:modelValue":I[0]||(I[0]=L=>i.value=L),type:"search",class:"ipb-left-drawer__search-input",placeholder:e.unref(a)("leftDrawer.search.placeholder"),"aria-label":e.unref(a)("leftDrawer.search.ariaLabel")},null,8,pr),[[e.vModelText,i.value]])]),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(D.value,([L,Y])=>(e.openBlock(),e.createElementBlock("div",{key:L,class:"ipb-left-drawer__category"},[e.createElementVNode("h4",mr,e.toDisplayString(L),1),e.createElementVNode("div",{class:"ipb-left-drawer__component-list",role:"group","aria-label":x(L)},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(Y,U=>(e.openBlock(),e.createElementBlock("button",{key:U.name,type:"button",class:"ipb-left-drawer__component-item",draggable:"true",title:U.description,"aria-label":B(U.label),"aria-keyshortcuts":"Enter Space",onClick:F=>f(U.name),onDragstart:F=>E(U.name,F),onDragend:C},[e.createElementVNode("span",br,e.toDisplayString(U.icon??"◻"),1),e.createElementVNode("span",hr,e.toDisplayString(U.label),1)],40,vr))),128))],8,gr)]))),128)),D.value.size===0?(e.openBlock(),e.createElementBlock("p",yr,e.toDisplayString(e.unref(a)("leftDrawer.empty")),1)):e.createCommentVNode("",!0)]),t.content?(e.openBlock(),e.createElementBlock("div",_r,[e.createElementVNode("div",wr,[e.createElementVNode("h3",kr,e.toDisplayString(e.unref(a)("leftDrawer.section.tree")),1),e.createElementVNode("button",{type:"button",class:"ipb-left-drawer__section-toggle","aria-expanded":u.value?"true":"false","aria-controls":Bt,"aria-label":e.unref(a)("leftDrawer.tree.toggle.ariaLabel"),onClick:b},e.toDisplayString(u.value?"−":"+"),9,Nr)]),u.value?(e.openBlock(),e.createElementBlock("div",{key:0,id:Bt,role:"region","aria-label":e.unref(a)("treePanel.ariaLabel")},[e.createVNode(ar,{content:t.content,"selected-node-id":t.selectedNodeId,onSelect:I[1]||(I[1]=L=>r("select",L))},null,8,["content","selected-node-id"])],8,Er)):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)],10,lr))}}),Ir=H(xr,[["__scopeId","data-v-2bb04ccb"]]),Dr=["value","placeholder"],Cr=e.defineComponent({__name:"PropTextEditor",props:{modelValue:{type:[String,Number,Boolean],default:""},placeholder:{type:String,default:""}},emits:["update:modelValue"],setup(t,{emit:o}){const n=t,r=o;function l(a){r("update:modelValue",a.target.value)}return(a,i)=>(e.openBlock(),e.createElementBlock("input",{class:"ipb-prop-editor ipb-prop-editor--text",type:"text",value:String(n.modelValue??""),placeholder:t.placeholder,onInput:l},null,40,Dr))}}),Re=H(Cr,[["__scopeId","data-v-f48156f6"]]),Sr=["value","min","max"],Tr=e.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(t,{emit:o}){const n=t,r=o,l=e.computed(()=>typeof n.modelValue=="number"?String(n.modelValue):typeof n.modelValue=="string"?n.modelValue:"");function a(i){const u=i.target.value.trim();if(u===""){r("update:modelValue",void 0);return}const p=Number(u);r("update:modelValue",Number.isNaN(p)?void 0:p)}return(i,u)=>(e.openBlock(),e.createElementBlock("input",{class:"ipb-prop-editor ipb-prop-editor--number",type:"number",value:l.value,min:t.min,max:t.max,onInput:a},null,40,Sr))}}),Br=H(Tr,[["__scopeId","data-v-11786ace"]]),Pr=["checked"],Vr=e.defineComponent({inheritAttrs:!1,__name:"PropBooleanEditor",props:{modelValue:{type:Boolean,default:!1}},emits:["update:modelValue"],setup(t,{emit:o}){const n=o;function r(u){n("update:modelValue",u.target.checked)}const{t:l}=ee(),a=e.useAttrs(),i=e.computed(()=>{const{class:u,style:p,...g}=a;return g});return(u,p)=>(e.openBlock(),e.createElementBlock("label",{class:e.normalizeClass(["ipb-prop-editor ipb-prop-editor--boolean",e.unref(a).class]),style:e.normalizeStyle(e.unref(a).style)},[e.createElementVNode("input",e.mergeProps(i.value,{type:"checkbox",checked:t.modelValue,onChange:r}),null,16,Pr),e.createElementVNode("span",null,e.toDisplayString(t.modelValue?e.unref(l)("propBoolean.enabled"):e.unref(l)("propBoolean.disabled")),1)],6))}}),Rr=H(Vr,[["__scopeId","data-v-cfba94a9"]]),$r=["value"],Lr={key:0,value:""},Ar=["value"],Mr=e.defineComponent({__name:"PropSelectEditor",props:{modelValue:{type:[String,Number,Boolean],default:void 0},options:{type:Array,default:()=>[]}},emits:["update:modelValue"],setup(t,{emit:o}){const n=t,r=o,l=e.computed(()=>{if(!n.options||n.options.length===0)return"";const u=n.options.findIndex(p=>p.value===n.modelValue);return u>=0?String(u):"0"});function a(u){const p=u.target.value;if(p===""||!n.options){r("update:modelValue",void 0);return}const g=n.options[Number(p)];r("update:modelValue",g==null?void 0:g.value)}const{t:i}=ee();return(u,p)=>(e.openBlock(),e.createElementBlock("select",{class:"ipb-prop-editor ipb-prop-editor--select",value:l.value,onChange:a},[!t.options||t.options.length===0?(e.openBlock(),e.createElementBlock("option",Lr,e.toDisplayString(e.unref(i)("propSelect.noOptions")),1)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(t.options??[],(g,k)=>(e.openBlock(),e.createElementBlock("option",{key:`${g.label}-${k}`,value:String(k)},e.toDisplayString(g.label),9,Ar))),128))],40,$r))}}),Or=H(Mr,[["__scopeId","data-v-8c477cbd"]]),zr=["value"],Ur=["value"],Kr=e.defineComponent({inheritAttrs:!1,__name:"PropColorEditor",props:{modelValue:{type:String,default:""}},emits:["update:modelValue"],setup(t,{emit:o}){const n=t,r=o,l=e.computed(()=>{const g=n.modelValue.trim();return/^#[0-9a-fA-F]{6}$/.test(g)?g:/^#[0-9a-fA-F]{3}$/.test(g)?`#${g.slice(1).split("").map(v=>`${v}${v}`).join("")}`:"#000000"});function a(g){r("update:modelValue",g.target.value)}function i(g){r("update:modelValue",g.target.value)}const u=e.useAttrs(),p=e.computed(()=>{const{class:g,style:k,...v}=u;return v});return(g,k)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ipb-prop-editor ipb-prop-editor--color",e.unref(u).class]),style:e.normalizeStyle(e.unref(u).style)},[e.createElementVNode("input",e.mergeProps(p.value,{class:"ipb-prop-editor__picker",type:"color",value:l.value,onInput:a}),null,16,zr),e.createElementVNode("input",e.mergeProps(p.value,{class:"ipb-prop-editor__text",type:"text",value:t.modelValue,placeholder:"#000000",onInput:i}),null,16,Ur)],6))}}),Hr=H(Kr,[["__scopeId","data-v-b0f904c5"]]),jr=["aria-label"],Fr=["aria-label","title"],Wr=["aria-label","title"],Gr=["aria-label","title"],Yr=["aria-label","title"],qr=["aria-label","title"],Xr=["aria-label","data-placeholder"],Zr=e.defineComponent({inheritAttrs:!1,__name:"RichTextEditor",props:{modelValue:{type:String,default:""},placeholder:{type:String,default:"Type text..."}},emits:["update:modelValue"],setup(t,{emit:o}){const n=t,r=o,l=e.ref(null),a=e.ref("");function i(d){return typeof d!="string"?"":nt(d)}function u(d){const s=l.value;if(!s)return;const y=i(d);s.innerHTML!==y&&(s.innerHTML=y),a.value=y}function p(){const d=l.value;if(!d)return;const s=i(d.innerHTML);d.innerHTML!==s&&(d.innerHTML=s),s!==a.value&&(a.value=s,r("update:modelValue",s))}function g(){var d;(d=l.value)==null||d.focus()}function k(d,s){typeof document.execCommand=="function"&&document.execCommand(d,!1,s)}function v(d){g(),k(d),p()}function D(){g();const d=window.prompt(E("richText.prompt.enterUrl"),E("richText.prompt.defaultUrl"));if(!d)return;const s=Z(d,"link");s&&(k("createLink",s),p())}e.onMounted(()=>{u(i(n.modelValue))}),e.watch(()=>n.modelValue,d=>{u(i(d))});const{t:E}=ee(),C=e.useAttrs(),f=e.computed(()=>{const{class:d,style:s,...y}=C;return y}),b=e.computed(()=>{const d=C["aria-labelledby"],s=C["aria-label"];if(!(d||s))return E("richText.aria.editor")});return(d,s)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ipb-richtext-editor",e.unref(C).class]),style:e.normalizeStyle(e.unref(C).style)},[e.createElementVNode("div",{class:"ipb-richtext-editor__toolbar",role:"toolbar","aria-label":e.unref(E)("richText.aria.toolbar")},[e.createElementVNode("button",{type:"button","data-command":"bold","aria-label":e.unref(E)("richText.action.bold"),title:e.unref(E)("richText.action.bold"),onClick:s[0]||(s[0]=y=>v("bold"))},[...s[4]||(s[4]=[e.createElementVNode("strong",null,"B",-1)])],8,Fr),e.createElementVNode("button",{type:"button","data-command":"italic","aria-label":e.unref(E)("richText.action.italic"),title:e.unref(E)("richText.action.italic"),onClick:s[1]||(s[1]=y=>v("italic"))},[...s[5]||(s[5]=[e.createElementVNode("em",null,"I",-1)])],8,Wr),e.createElementVNode("button",{type:"button","data-command":"ul","aria-label":e.unref(E)("richText.action.unorderedList"),title:e.unref(E)("richText.action.unorderedList"),onClick:s[2]||(s[2]=y=>v("insertUnorderedList"))}," UL ",8,Gr),e.createElementVNode("button",{type:"button","data-command":"ol","aria-label":e.unref(E)("richText.action.orderedList"),title:e.unref(E)("richText.action.orderedList"),onClick:s[3]||(s[3]=y=>v("insertOrderedList"))}," OL ",8,Yr),e.createElementVNode("button",{type:"button","data-command":"link","aria-label":e.unref(E)("richText.action.link"),title:e.unref(E)("richText.action.link"),onClick:D},e.toDisplayString(e.unref(E)("richText.action.link")),9,qr)],8,jr),e.createElementVNode("div",e.mergeProps(f.value,{ref_key:"editorRef",ref:l,class:"ipb-richtext-editor__content",contenteditable:"true",role:"textbox","aria-multiline":"true","aria-label":b.value,"data-placeholder":t.placeholder,onInput:p,onBlur:p}),null,16,Xr)],6))}}),Jr=H(Zr,[["__scopeId","data-v-d9cdfb46"]]),Qr={class:"ipb-media-picker__controls"},ea=["value","placeholder"],ta=["disabled"],na={class:"ipb-media-picker__preview"},oa=["src","alt"],ra={key:1,class:"ipb-media-picker__empty"},aa=e.defineComponent({inheritAttrs:!1,__name:"MediaPicker",props:{modelValue:{type:String,default:""}},emits:["update:modelValue","upload"],setup(t,{emit:o}){const n=t,r=o,l=e.computed(()=>n.modelValue.trim()),a=e.computed(()=>Z(l.value,"media")),i=e.computed(()=>l.value.length>0),u=e.computed(()=>a.value.length>0);function p(C){const f=C.target.value;r("update:modelValue",Z(f,"media"))}function g(){r("update:modelValue","")}function k(){r("upload")}const{t:v}=ee(),D=e.useAttrs(),E=e.computed(()=>{const{class:C,style:f,...b}=D;return b});return(C,f)=>(e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(["ipb-media-picker",e.unref(D).class]),style:e.normalizeStyle(e.unref(D).style)},[e.createElementVNode("div",Qr,[e.createElementVNode("input",e.mergeProps(E.value,{class:"ipb-media-picker__input",type:"url",value:t.modelValue,placeholder:e.unref(v)("mediaPicker.input.placeholder"),onInput:p}),null,16,ea),e.createElementVNode("button",{class:"ipb-media-picker__btn",type:"button",disabled:!i.value,onClick:g},e.toDisplayString(e.unref(v)("mediaPicker.clear")),9,ta),e.createElementVNode("button",{class:"ipb-media-picker__btn",type:"button",onClick:k},e.toDisplayString(e.unref(v)("mediaPicker.upload")),1)]),e.createElementVNode("div",na,[i.value&&u.value?(e.openBlock(),e.createElementBlock("img",{key:0,class:"ipb-media-picker__image",src:a.value,alt:e.unref(v)("mediaPicker.preview.alt")},null,8,oa)):(e.openBlock(),e.createElementBlock("p",ra,e.toDisplayString(e.unref(v)("mediaPicker.empty")),1))])],6))}}),Pt=H(aa,[["__scopeId","data-v-743fe73e"]]),la=Re,ia={text:Re,textarea:Re,richtext:Jr,number:Br,boolean:Rr,select:Or,color:Hr,image:Pt,url:Pt,json:Re},sa=["aria-label"],da={class:"ipb-right-drawer__header"},ca={class:"ipb-right-drawer__title",id:"ipb-right-drawer-title"},ua=["aria-label","aria-expanded"],fa={class:"ipb-right-drawer__section"},pa={class:"ipb-right-drawer__section-title"},ma={key:0,class:"ipb-right-drawer__description"},ga={class:"ipb-right-drawer__section"},va={class:"ipb-right-drawer__section-subtitle"},ba=["data-prop-key"],ha=["id"],ya={class:"ipb-right-drawer__actions"},_a=["aria-label"],wa=["disabled","aria-label"],ka={key:1,class:"ipb-right-drawer__empty"},ie="ipb-right-drawer-content",Na=e.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(t,{emit:o}){const n=t,r=o,{t:l}=ee(),a=e.ref(null),i=e.ref(null),u=e.ref(!1),p=e.computed(()=>n.selectedNodeId===null?null:A(n.content,n.selectedNodeId)??null),g=e.computed(()=>p.value?de(p.value.name)??null:null);function k(s){return p.value?p.value.props[s.key]??s.defaultValue??"":s.defaultValue??""}function v(s){return ia[s]??la}function D(s){var x,B;const y=k(s);return s.type==="number"?{modelValue:y,min:(x=s.validation)==null?void 0:x.min,max:(B=s.validation)==null?void 0:B.max}:s.type==="select"?{modelValue:y,options:s.options??[]}:s.type==="image"||s.type==="url"?{modelValue:y}:s.type==="text"||s.type==="textarea"||s.type==="richtext"||s.type==="json"?{modelValue:y,placeholder:s.label}:{modelValue:y}}function E(s,y){p.value&&r("update-props",p.value.id,{[s]:y})}function C(s){return`ipb-right-drawer-prop-label-${s}`}function f(){const s=a.value;return s?s.querySelector(`#${ie} input:not([disabled]), #${ie} select:not([disabled]), #${ie} textarea:not([disabled]), #${ie} button:not([disabled]), #${ie} [contenteditable]:not([contenteditable="false"]), #${ie} [tabindex]:not([tabindex="-1"])`):null}function b(){var s;(s=f())==null||s.focus()}function d(){u.value=!n.open,r("toggle")}return e.watch(()=>n.open,(s,y)=>{var x;if(s&&!y&&u.value&&e.nextTick(()=>{b()}),!s&&y){const B=document.activeElement;B instanceof HTMLElement&&((x=a.value)!=null&&x.contains(B))&&e.nextTick(()=>{var T;(T=i.value)==null||T.focus()})}s!==y&&(u.value=!1)}),(s,y)=>(e.openBlock(),e.createElementBlock("aside",{ref_key:"drawerRef",ref:a,class:e.normalizeClass(["ipb-right-drawer",{"ipb-right-drawer--open":t.open}]),role:"complementary","aria-label":e.unref(l)("rightDrawer.aria.componentProperties")},[e.createElementVNode("div",da,[e.createElementVNode("span",ca,e.toDisplayString(e.unref(l)("rightDrawer.title")),1),e.createElementVNode("button",{ref_key:"drawerToggleRef",ref:i,type:"button",class:"ipb-right-drawer__toggle","aria-label":e.unref(l)("rightDrawer.toggle.ariaLabel"),"aria-expanded":t.open?"true":"false","aria-controls":ie,onClick:d},e.toDisplayString(t.open?"▶":"◀"),9,ua)]),t.open&&p.value&&g.value?(e.openBlock(),e.createElementBlock("div",{key:0,id:ie,class:"ipb-right-drawer__content",role:"region","aria-labelledby":"ipb-right-drawer-title"},[e.createElementVNode("div",fa,[e.createElementVNode("h3",pa,e.toDisplayString(g.value.label),1),g.value.description?(e.openBlock(),e.createElementBlock("p",ma,e.toDisplayString(g.value.description),1)):e.createCommentVNode("",!0)]),e.createElementVNode("div",ga,[e.createElementVNode("h4",va,e.toDisplayString(e.unref(l)("rightDrawer.section.properties")),1),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(g.value.editableProps,x=>(e.openBlock(),e.createElementBlock("div",{key:x.key,class:"ipb-right-drawer__prop","data-prop-key":x.key},[e.createElementVNode("label",{id:C(x.key),class:"ipb-right-drawer__prop-label"},e.toDisplayString(x.label),9,ha),(e.openBlock(),e.createBlock(e.resolveDynamicComponent(v(x.type)),e.mergeProps({class:"ipb-right-drawer__prop-editor"},{ref_for:!0},D(x),{"aria-labelledby":C(x.key),"onUpdate:modelValue":B=>E(x.key,B)}),null,16,["aria-labelledby","onUpdate:modelValue"]))],8,ba))),128))]),e.createElementVNode("div",ya,[e.createElementVNode("button",{type:"button",class:"ipb-right-drawer__btn","aria-label":e.unref(l)("rightDrawer.actions.duplicate.ariaLabel"),onClick:y[0]||(y[0]=x=>r("duplicate",p.value.id))},e.toDisplayString(e.unref(l)("rightDrawer.actions.duplicate")),9,_a),e.createElementVNode("button",{type:"button",class:"ipb-right-drawer__btn ipb-right-drawer__btn--danger",disabled:p.value.readonly,"aria-label":e.unref(l)("rightDrawer.actions.delete.ariaLabel"),onClick:y[1]||(y[1]=x=>r("delete",p.value.id))},e.toDisplayString(e.unref(l)("rightDrawer.actions.delete")),9,wa)])])):t.open?(e.openBlock(),e.createElementBlock("div",ka,[e.createElementVNode("p",null,e.toDisplayString(e.unref(l)("rightDrawer.empty")),1)])):e.createCommentVNode("",!0)],10,sa))}}),Ea=H(Na,[["__scopeId","data-v-a25cd890"]]),hn="@improba/page-builder/iframe-bridge",yn=1;function ct(t,o,n){return{namespace:hn,version:yn,sessionToken:n,channel:t,payload:o}}function xa(){var t,o;if(typeof((t=globalThis.crypto)==null?void 0:t.randomUUID)=="function")return globalThis.crypto.randomUUID();if(typeof((o=globalThis.crypto)==null?void 0:o.getRandomValues)=="function"){const n=new Uint8Array(16);return globalThis.crypto.getRandomValues(n),Array.from(n,r=>r.toString(16).padStart(2,"0")).join("")}return`${Date.now().toString(36)}-${Math.random().toString(36).slice(2,12)}`}function _n(t){return ct("lifecycle",{state:"ready"},t)}function wn(t,o){return ct("pointer",t,o)}function kn(t,o){return ct("keydown",t,o)}function Ae(t){return!!t&&typeof t=="object"}function Ia(t){if(!Ae(t))return null;const o=t.interaction,n=t.nodeId;if(o!=="hover"&&o!=="select"&&o!=="context"||n!==null&&typeof n!="number"||typeof n=="number"&&!Number.isInteger(n))return null;const r=n;if(o==="context"){const l=t.clientX,a=t.clientY;return typeof l!="number"||typeof a!="number"?null:{interaction:o,nodeId:r,clientX:l,clientY:a}}return{interaction:o,nodeId:r}}function Da(t){return!Ae(t)||typeof t.key!="string"||typeof t.code!="string"||typeof t.ctrlKey!="boolean"||typeof t.metaKey!="boolean"||typeof t.shiftKey!="boolean"||typeof t.altKey!="boolean"||typeof t.defaultPrevented!="boolean"||typeof t.isEditable!="boolean"?null:{key:t.key,code:t.code,ctrlKey:t.ctrlKey,metaKey:t.metaKey,shiftKey:t.shiftKey,altKey:t.altKey,defaultPrevented:t.defaultPrevented,isEditable:t.isEditable}}function Ca(t,o={}){if(!Ae(t)||t.namespace!==hn||t.version!==yn||t.channel!=="keydown"&&t.channel!=="pointer"&&t.channel!=="lifecycle")return null;const n=t.sessionToken,r=typeof n=="string"&&n.length>0;if(o.expectedSessionToken){if(!r||n!==o.expectedSessionToken)return null}else if(!r&&!o.allowLegacyNoSessionToken)return null;const l=r?n:"";if(t.channel==="lifecycle")return!Ae(t.payload)||t.payload.state!=="ready"?null:_n(l);if(t.channel==="pointer"){const i=Ia(t.payload);return i?wn(i,l):null}const a=Da(t.payload);return a?kn(a,l):null}function Sa(t){const o=n=>{var l,a,i;if(n.source!==t.expectedSource||n.origin!==t.expectedOrigin)return;const r=Ca(n.data,{expectedSessionToken:t.expectedSessionToken,allowLegacyNoSessionToken:t.allowLegacyNoSessionToken??!t.expectedSessionToken});if(r){if(r.channel==="lifecycle"){(l=t.onReady)==null||l.call(t);return}if(r.channel==="pointer"){(a=t.onPointer)==null||a.call(t,r.payload);return}(i=t.onKeydown)==null||i.call(t,r.payload)}};return t.hostWindow.addEventListener("message",o),{dispose:()=>{t.hostWindow.removeEventListener("message",o)}}}function Ta(t){return{postReady:()=>{t.targetWindow.postMessage(_n(t.sessionToken),t.targetOrigin)},postPointer:o=>{t.targetWindow.postMessage(wn(o,t.sessionToken),t.targetOrigin)},postKeydown:o=>{t.targetWindow.postMessage(kn(o,t.sessionToken),t.targetOrigin)}}}function Ba(t){if(t.defaultPrevented||t.isEditable)return!1;const o=t.ctrlKey||t.metaKey,n=t.key.toLowerCase(),r=t.code.toLowerCase();return o&&(n==="z"||n==="y"||n==="s")?!0:(n==="delete"||n==="backspace"||r==="delete"||r==="backspace")&&!t.ctrlKey&&!t.metaKey&&!t.altKey}function Pa(t){const o=i=>{t.bridge.postPointer({interaction:"select",nodeId:t.resolveNodeId(i.target)})},n=i=>{t.bridge.postPointer({interaction:"hover",nodeId:t.resolveNodeId(i.target)})},r=()=>{t.bridge.postPointer({interaction:"hover",nodeId:null})},l=i=>{i.preventDefault(),t.bridge.postPointer({interaction:"context",nodeId:t.resolveNodeId(i.target),clientX:i.clientX,clientY:i.clientY})},a=i=>{const u={key:i.key,code:i.code,ctrlKey:i.ctrlKey,metaKey:i.metaKey,shiftKey:i.shiftKey,altKey:i.altKey,defaultPrevented:i.defaultPrevented,isEditable:t.isEditableTarget(i.target)||t.isEditableTarget(t.frameDocument.activeElement)};Ba(u)&&i.preventDefault(),t.bridge.postKeydown(u)};return t.contentRoot.addEventListener("click",o),t.contentRoot.addEventListener("mousemove",n),t.contentRoot.addEventListener("mouseleave",r),t.contentRoot.addEventListener("contextmenu",l),t.frameDocument.addEventListener("keydown",a),t.bridge.postReady(),()=>{t.contentRoot.removeEventListener("click",o),t.contentRoot.removeEventListener("mousemove",n),t.contentRoot.removeEventListener("mouseleave",r),t.contentRoot.removeEventListener("contextmenu",l),t.frameDocument.removeEventListener("keydown",a)}}const Va=["aria-label"],Ra=["disabled","data-action","aria-disabled","onClick"],$a=e.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(t,{emit:o}){const n=t,r=o,{t:l}=ee(),a=e.computed(()=>({top:`${n.y}px`,left:`${n.x}px`})),i=e.computed(()=>[{key:"duplicate",label:l("contextMenu.duplicate")},{key:"move-up",label:l("contextMenu.moveUp"),disabled:!n.canMoveUp},{key:"move-down",label:l("contextMenu.moveDown"),disabled:!n.canMoveDown},{key:"delete",label:l("contextMenu.delete"),danger:!0,disabled:!n.canDelete}]);function u(f,b){b||r("action",f)}const p=e.ref(null),g=e.ref(null);function k(){return p.value?Array.from(p.value.querySelectorAll(".ipb-node-context-menu__item")).filter(f=>!f.disabled):[]}function v(){const[f]=k();f==null||f.focus()}function D(){g.value instanceof HTMLElement&&g.value.focus(),g.value=null}function E(f){var y,x,B,T;if(f.key==="Escape"){f.preventDefault(),r("close");return}if(f.key==="Tab"){f.preventDefault(),r("close");return}const b=k();if(b.length===0)return;const d=document.activeElement instanceof HTMLButtonElement?document.activeElement:null,s=d?b.indexOf(d):-1;if(f.key==="ArrowDown"){f.preventDefault();const I=s<0?0:(s+1)%b.length;(y=b[I])==null||y.focus();return}if(f.key==="ArrowUp"){f.preventDefault();const I=s<0?b.length-1:(s-1+b.length)%b.length;(x=b[I])==null||x.focus();return}if(f.key==="Home"){f.preventDefault(),(B=b[0])==null||B.focus();return}f.key==="End"&&(f.preventDefault(),(T=b[b.length-1])==null||T.focus())}function C(f){var d;const b=f.relatedTarget;if(!(b instanceof Node)){r("close");return}(d=p.value)!=null&&d.contains(b)||r("close")}return e.watch(()=>n.open,f=>{if(f){g.value=document.activeElement instanceof HTMLElement?document.activeElement:null,e.nextTick(()=>{v()});return}D()},{immediate:!0}),e.onBeforeUnmount(()=>{D()}),(f,b)=>t.open?(e.openBlock(),e.createElementBlock("div",{key:0,ref_key:"menuRootRef",ref:p,class:"ipb-node-context-menu",style:e.normalizeStyle(a.value),role:"menu","aria-label":e.unref(l)("contextMenu.ariaLabel"),"aria-orientation":"vertical",tabindex:"-1",onClick:b[0]||(b[0]=e.withModifiers(()=>{},["stop"])),onContextmenu:b[1]||(b[1]=e.withModifiers(()=>{},["prevent"])),onKeydown:E,onFocusout:C},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(i.value,d=>(e.openBlock(),e.createElementBlock("button",{key:d.key,type:"button",class:e.normalizeClass(["ipb-node-context-menu__item",{"ipb-node-context-menu__item--danger":d.danger}]),disabled:d.disabled,"data-action":d.key,role:"menuitem","aria-disabled":d.disabled?"true":void 0,onClick:s=>u(d.key,d.disabled)},e.toDisplayString(d.label),11,Ra))),128))],44,Va)):e.createCommentVNode("",!0)}}),La=H($a,[["__scopeId","data-v-7a59845f"]]),Aa=["title"],qe="ipb-iframe-canvas-content",Vt="ipb-iframe-canvas-base-style",Ma=240,Oa=320,za=e.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(t,{emit:o}){const n=t,r=o,l=e.inject(Oe,null),a=e.inject(ze,null),{t:i}=ee(),u=e.ref(null),p=e.ref(null),g=e.ref(null),k=e.ref(!1),v=e.ref(null),D=e.ref(null),E=e.ref(null),C=e.ref(null),f=e.ref(null),b=e.ref(null),d=e.ref({width:0,height:0}),s=e.ref(!1),y=e.ref(null),x=e.ref(null),B=e.ref(null),T=e.ref(!1),I=e.ref(null),L=e.ref(0),Y=e.ref(0),U=e.ref(!1),F=e.ref(!1),oe=e.ref(!1),te=e.computed(()=>{if(n.viewport==="custom")return{width:Math.max(Ma,Math.round(n.viewportWidth??ke.desktop.width)),height:Math.max(Oa,Math.round(n.viewportHeight??ke.desktop.height))};const c=ke[n.viewport];return{width:c.width,height:c.height}}),Ne=e.computed(()=>({width:`min(100%, ${te.value.width}px)`,height:`${te.value.height}px`})),be=e.computed(()=>y.value?{top:`${y.value.top}px`,left:`${y.value.left}px`,width:`${y.value.width}px`,height:`${y.value.height}px`}:null),he=e.computed(()=>x.value&&n.hoveredNodeId!==n.selectedNodeId?{top:`${x.value.top}px`,left:`${x.value.left}px`,width:`${x.value.width}px`,height:`${x.value.height}px`}:null),h=e.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 R(c){return!c||typeof c!="object"?!1:c.nodeType===1}function m(c){if(c===null)return null;const _=Number(c);return Number.isInteger(_)?_:null}function N(c){if(!R(c))return null;const _=c.closest("[data-ipb-node-id]");return m((_==null?void 0:_.getAttribute("data-ipb-node-id"))??null)}function w(c){return c===null||!v.value?null:v.value.querySelector(`[data-ipb-node-id="${c}"]`)}function V(c){var z,W;if(!c||!v.value)return null;const _=c.getBoundingClientRect(),S=v.value.getBoundingClientRect(),P=((z=E.value)==null?void 0:z.scrollY)??0,K=((W=E.value)==null?void 0:W.scrollX)??0;return{top:_.top-S.top+P,left:_.left-S.left+K,width:_.width,height:_.height}}function M(c,_){return Math.max(0,Math.min(c,_))}function O(c,_){return c.id===_?!0:c.children.some(S=>O(S,_))}function J(c){var _;return c.sourceComponentName?c.sourceComponentName:c.sourceNodeId===null?null:((_=A(n.content,c.sourceNodeId))==null?void 0:_.name)??null}function q(c,_){const S=J(_);if(!S)return null;const P=c===null?null:A(n.content,c);if(P&&!P.readonly){const z=se(P,"default",S);if(z)return{targetId:P.id,index:P.children.length,slot:z}}if(c!==null){const z=G(n.content,c);if(z&&!z.parent.readonly){const W=z.parent.children[z.index],ae=se(z.parent,(W==null?void 0:W.slot)??"default",S);if(ae)return{targetId:z.parent.id,index:z.index+1,slot:ae}}}if(n.content.readonly)return null;const K=se(n.content,"default",S);return K?{targetId:n.content.id,index:n.content.children.length,slot:K}:null}function re(c,_,S,P){const K=A(n.content,c),z=G(n.content,c),W=A(n.content,_);if(!K||!z||K.readonly)return{valid:!1};if(!W||W.readonly)return{valid:!1};if(c===_)return{valid:!1};if(O(K,_))return{valid:!1};const ae=se(W,S,K.name);if(!ae)return{valid:!1};const xt=W.children.length;return z.parent.id===_&&z.index<P?{valid:!0,index:M(P-1,xt),slot:ae}:{valid:!0,index:M(P,xt),slot:ae}}function ce(c){if(c.getElementById(Vt))return;const _=c.createElement("style");_.id=Vt,_.textContent=`
|
|
4
4
|
html, body {
|
|
5
5
|
margin: 0;
|
|
6
6
|
padding: 0;
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
background: #fff;
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
#${
|
|
15
|
+
#${qe} {
|
|
16
16
|
position: relative;
|
|
17
17
|
width: 100%;
|
|
18
18
|
max-width: 100%;
|
|
@@ -29,5 +29,5 @@
|
|
|
29
29
|
[data-ipb-component="PbRow"] {
|
|
30
30
|
min-height: 80px;
|
|
31
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;
|
|
32
|
+
`,c.head.appendChild(_)}function Ee(c){if(!c.body)return null;ce(c);let _=c.getElementById(qe);return _||(_=c.createElement("div"),_.id=qe,c.body.innerHTML="",c.body.appendChild(_)),_}function Se(){v.value&&e.render(e.h(dt,{node:n.content,variables:n.variables,markNodes:!0}),v.value)}function ye(){v.value&&e.render(null,v.value)}function _e(){if(!v.value)return;v.value.querySelectorAll("[data-ipb-node-id]").forEach(_=>{const S=m(_.getAttribute("data-ipb-node-id")),P=S===null?null:A(n.content,S);_.draggable=!!(P&&!P.readonly&&P.id!==n.content.id)})}function le(){y.value=V(w(n.selectedNodeId)),x.value=V(w(n.hoveredNodeId));const c=a?a.dragState.value.dropTargetId:null;B.value=c===null?null:V(w(c))}function Te(){return p.value?{width:Math.round(p.value.clientWidth),height:Math.round(p.value.clientHeight)}:{width:0,height:0}}function Be(){const c=Te();s.value&&c.width===d.value.width&&c.height===d.value.height||(d.value=c,s.value=!0,r("viewport-size-change",c))}function xe(){le(),Be()}function ut(){var c;(c=b.value)==null||c.disconnect(),b.value=null}function xn(){if(ut(),typeof ResizeObserver>"u"||!p.value||!v.value)return;const c=new ResizeObserver(()=>{xe()});c.observe(p.value),c.observe(v.value),b.value=c}async function ue(){await e.nextTick(),Se(),await e.nextTick(),_e(),le(),Be()}function fe(){B.value=null}function ne(){T.value=!1,I.value=null}function In(){ne(),r("select",null),r("hover",null)}function ft(c){c.stopPropagation(),ne();const _=N(c.target);r("select",_)}function pt(c){const _=N(c.target);_!==n.hoveredNodeId&&r("hover",_)}function mt(){r("hover",null)}function gt(c){if(!a)return;const _=N(c.target);if(_===null)return;const S=A(n.content,_);if(!S||S.readonly||S.id===n.content.id){c.preventDefault();return}a.startDragExisting(_),c.dataTransfer&&(c.dataTransfer.effectAllowed="move",c.dataTransfer.setData("text/plain",String(_)))}function vt(c){if(!a||!a.dragState.value.isDragging)return;const _=N(c.target),S=q(_,a.dragState.value);if(!S){fe();return}c.preventDefault(),a.updateDropTarget(S.targetId,S.index,S.slot),B.value=V(w(S.targetId)),c.dataTransfer&&(c.dataTransfer.dropEffect=a.dragState.value.isNewComponent?"copy":"move")}function bt(c){if(!v.value)return;const _=c.relatedTarget;_&&typeof _=="object"&&"nodeType"in _&&v.value.contains(_)||fe()}function ht(c){var z;if(c.preventDefault(),!a||!l||!a.dragState.value.isDragging){fe();return}const _=N(c.target),S=q(_,a.dragState.value);if(!S){a.cancelDrag(),fe();return}a.updateDropTarget(S.targetId,S.index,S.slot);const P=a.endDrag();if(fe(),P.dropTargetId===null)return;if(P.isNewComponent&&P.sourceComponentName){const W=(z=de(P.sourceComponentName))==null?void 0:z.defaultProps,ae=l.addNode(P.dropTargetId,P.sourceComponentName,P.dropIndex,P.dropSlot,W);ae!==null&&r("select",ae);return}if(P.sourceNodeId===null)return;const K=re(P.sourceNodeId,P.dropTargetId,P.dropSlot,P.dropIndex);K.valid&&(l.moveNodeTo(P.sourceNodeId,P.dropTargetId,K.index,K.slot),r("select",P.sourceNodeId))}function yt(){a!=null&&a.dragState.value.isDragging&&a.cancelDrag(),fe()}function _t(c){const _=A(n.content,c);if(_!=null&&_.readonly){U.value=!1,F.value=!1,oe.value=!1;return}const S=G(n.content,c);if(!S){U.value=!1,F.value=!1,oe.value=!1;return}U.value=!0,F.value=S.index>0,oe.value=S.index<S.parent.children.length-1}function wt(c){var z,W;c.preventDefault(),c.stopPropagation();const _=N(c.target);if(_===null||!v.value){ne();return}const S=v.value.getBoundingClientRect(),P=((z=E.value)==null?void 0:z.scrollY)??0,K=((W=E.value)==null?void 0:W.scrollX)??0;L.value=c.clientX-S.left+K,Y.value=c.clientY-S.top+P,I.value=_,_t(_),T.value=!0,r("select",_)}function Dn(c){I.value!==null&&(r("context-action",{action:c,nodeId:I.value}),ne())}function Cn(c){if(!R(c))return!1;const _=c.tagName.toLowerCase();return _==="input"||_==="textarea"||_==="select"?!0:!!c.closest('[contenteditable]:not([contenteditable="false"])')}function Sn(c){var K,z;if(c.interaction==="hover"){c.nodeId!==n.hoveredNodeId&&r("hover",c.nodeId);return}if(c.interaction==="select"){ne(),r("select",c.nodeId);return}if(c.interaction!=="context")return;if(c.nodeId===null||!v.value){ne();return}const _=v.value.getBoundingClientRect(),S=((K=E.value)==null?void 0:K.scrollY)??0,P=((z=E.value)==null?void 0:z.scrollX)??0;L.value=c.clientX-_.left+P,Y.value=c.clientY-_.top+S,I.value=c.nodeId,_t(c.nodeId),T.value=!0,r("select",c.nodeId)}function Tn(c){c.key==="Escape"&&ne(),r("iframe-keydown",{...c,preventDefault:()=>{}})}function kt(c){try{return c.location.origin}catch{return window.location.origin}}function Nt(){var c,_;(c=C.value)==null||c.call(C),C.value=null,(_=f.value)==null||_.call(f),f.value=null}function Bn(){const c=E.value,_=D.value,S=v.value;if(!c||!_||!S)return;Nt();const P=xa(),K=Sa({hostWindow:window,expectedSource:window,expectedOrigin:kt(window),expectedSessionToken:P,onReady:()=>{ue()},onPointer:Sn,onKeydown:Tn}),z=Ta({targetWindow:window,targetOrigin:kt(window),sessionToken:P});C.value=()=>K.dispose(),f.value=Pa({frameDocument:_,contentRoot:S,bridge:z,resolveNodeId:N,isEditableTarget:Cn})}function we(){xe()}function Ue(){ut(),Nt(),v.value&&(v.value.removeEventListener("click",ft),v.value.removeEventListener("contextmenu",wt),v.value.removeEventListener("mousemove",pt),v.value.removeEventListener("mouseleave",mt),v.value.removeEventListener("dragstart",gt),v.value.removeEventListener("dragover",vt),v.value.removeEventListener("dragleave",bt),v.value.removeEventListener("drop",ht),v.value.removeEventListener("dragend",yt)),!k.value&&E.value&&(E.value.removeEventListener("scroll",we),E.value.removeEventListener("resize",we))}function Et(){v.value&&(k.value?(v.value.addEventListener("click",ft),v.value.addEventListener("contextmenu",wt),v.value.addEventListener("mousemove",pt),v.value.addEventListener("mouseleave",mt)):Bn(),v.value.addEventListener("dragstart",gt),v.value.addEventListener("dragover",vt),v.value.addEventListener("dragleave",bt),v.value.addEventListener("drop",ht),v.value.addEventListener("dragend",yt),!k.value&&E.value&&(E.value.addEventListener("scroll",we),E.value.addEventListener("resize",we)),xn())}function Ke(){k.value=!0,e.nextTick().then(()=>{g.value&&(Ue(),ye(),D.value=null,E.value=null,v.value=g.value,Et(),ue())})}function He(){const c=u.value;if(!c){Ke();return}const _=c.contentDocument,S=c.contentWindow;if(!_||!S){Ke();return}const P=Ee(_);if(!P){Ke();return}Ue(),ye(),k.value=!1,D.value=_,E.value=S,v.value=P,Et(),ue()}return e.watch(()=>[n.selectedNodeId,n.hoveredNodeId],()=>{ue()},{immediate:!0}),e.watch(()=>[n.viewport,n.viewportWidth,n.viewportHeight],()=>{ue()}),e.watch(()=>n.content,()=>{I.value!==null&&!A(n.content,I.value)&&ne(),ue()},{deep:!0}),e.watch(()=>n.variables,()=>{ue()},{deep:!0}),e.watch(()=>(a==null?void 0:a.dragState.value.isDragging)??!1,c=>{c||fe()}),e.onMounted(()=>{var c;window.addEventListener("resize",we),(c=u.value)==null||c.addEventListener("load",He),He()}),e.onBeforeUnmount(()=>{var c;window.removeEventListener("resize",we),(c=u.value)==null||c.removeEventListener("load",He),Ue(),ye()}),(c,_)=>(e.openBlock(),e.createElementBlock("main",{class:"ipb-canvas",onClick:In,onContextmenu:e.withModifiers(ne,["prevent"])},[e.createElementVNode("div",{class:"ipb-canvas__viewport",style:e.normalizeStyle(Ne.value)},[e.createElementVNode("div",{ref_key:"stageRef",ref:p,class:"ipb-iframe-canvas__stage"},[k.value?(e.openBlock(),e.createElementBlock("div",{key:1,ref_key:"fallbackContentRef",ref:g,id:"ipb-iframe-canvas-content",class:"ipb-iframe-canvas__fallback"},null,512)):(e.openBlock(),e.createElementBlock("iframe",{key:0,ref_key:"iframeRef",ref:u,class:"ipb-iframe-canvas__frame",title:e.unref(i)("iframeCanvas.title"),sandbox:"allow-same-origin"},null,8,Aa)),h.value?(e.openBlock(),e.createElementBlock("div",{key:2,class:"ipb-canvas__overlay ipb-canvas__overlay--drop",style:e.normalizeStyle(h.value)},null,4)):e.createCommentVNode("",!0),he.value?(e.openBlock(),e.createElementBlock("div",{key:3,class:"ipb-canvas__overlay ipb-canvas__overlay--hovered",style:e.normalizeStyle(he.value)},null,4)):e.createCommentVNode("",!0),be.value?(e.openBlock(),e.createElementBlock("div",{key:4,class:"ipb-canvas__overlay ipb-canvas__overlay--selected",style:e.normalizeStyle(be.value)},null,4)):e.createCommentVNode("",!0),e.createVNode(La,{open:T.value,x:L.value,y:Y.value,"can-delete":U.value,"can-move-up":F.value,"can-move-down":oe.value,onAction:Dn,onClose:ne},null,8,["open","x","y","can-delete","can-move-up","can-move-down"])],512)],4)],32))}}),Ua=H(za,[["__scopeId","data-v-3d599a49"]]),Ka={class:"ipb-page-editor"},Ha={class:"ipb-page-editor__body"},ja=e.defineComponent({__name:"PageEditor",props:{pageData:{type:Object,required:!0}},emits:["save","change"],setup(t,{emit:o}){const n=t,r=o,l=cn({initialData:n.pageData,mode:"edit"}),a=un({initialSnapshot:l.getSnapshot()}),i=mn(),u=fn({content:l.content,nextId:l.nextId,onUpdate:h=>{l.updateContent(h),r("change",h)},onSnapshot:h=>{a.pushHistory(h,l.getSnapshot())}}),p=e.ref(1024),g=e.ref(768),k=e.ref(null),v=e.ref(null);function D(){r("save",{content:l.content.value,layout:l.layout.value,maxId:l.maxId.value})}function E(h){if(!h)return!1;try{l.restoreSnapshot(h);const R=a.selectedNodeId.value;return R!==null&&!A(l.content.value,R)&&a.selectNode(null),r("change",l.content.value),!0}catch(R){return j("INVALID_SNAPSHOT","[PageBuilder] Failed to apply history snapshot. Undo/redo step was skipped.",{cause:R,details:{snapshotPreview:h.slice(0,200)}}),!1}}function C(){E(a.undo())}function f(){E(a.redo())}function b(h){const R=A(l.content.value,h);!R||R.readonly||u.deleteNode(h)}function d(h){A(l.content.value,h)&&u.duplicateNode(h)}function s(h){const R=A(l.content.value,h);!R||R.readonly||u.canMoveNodeUp(h)&&u.moveNodeUp(h)}function y(h){const R=A(l.content.value,h);!R||R.readonly||u.canMoveNodeDown(h)&&u.moveNodeDown(h)}function x(h){if(h.action==="duplicate"){d(h.nodeId);return}if(h.action==="delete"){b(h.nodeId);return}if(h.action==="move-up"){s(h.nodeId);return}h.action==="move-down"&&y(h.nodeId)}function B(h){if(!h||typeof h!="object"||!("nodeType"in h)||h.nodeType!==1)return!1;const R=h,m=R.tagName.toLowerCase();return m==="input"||m==="textarea"||m==="select"?!0:!!R.closest('[contenteditable]:not([contenteditable="false"])')}function T(){const h=a.selectedNodeId.value;h!==null&&b(h)}function I(h){if(h.defaultPrevented||h.isEditable)return;const R=h.ctrlKey||h.metaKey,m=h.key.toLowerCase(),N=h.code.toLowerCase();if(R&&m==="z"){h.preventDefault(),h.shiftKey?f():C();return}if(R&&m==="y"){h.preventDefault(),f();return}if(R&&m==="s"){h.preventDefault(),D();return}(m==="delete"||m==="backspace"||N==="delete"||N==="backspace")&&!h.ctrlKey&&!h.metaKey&&!h.altKey&&(h.preventDefault(),T())}function L(h){I({key:h.key,code:h.code,ctrlKey:h.ctrlKey,metaKey:h.metaKey,shiftKey:h.shiftKey,altKey:h.altKey,defaultPrevented:h.defaultPrevented,isEditable:B(h.target)||B(document.activeElement),preventDefault:()=>h.preventDefault()})}function Y(h){I(h)}function U(h){const R=ke[h];return h==="custom"?{width:p.value,height:g.value}:{width:R.width,height:R.height}}function F(h){if(h==="custom"&&a.viewport.value!=="custom")if(k.value!==null&&v.value!==null)p.value=k.value,g.value=v.value;else{const R=U(a.viewport.value);p.value=R.width,g.value=R.height}a.setViewport(h)}function oe(h){p.value=h.width,g.value=h.height,a.viewport.value!=="custom"&&a.setViewport("custom")}function te(h){k.value=h.width,v.value=h.height}function Ne(h){i.startDragNew(h)}function be(){i.cancelDrag()}function he(h){var J;const R=a.selectedNodeId.value,m=R!==null?A(l.content.value,R):void 0;let N=l.content.value.id,w=l.content.value.children.length,V="default";if(R!==null&&m){const q=G(l.content.value,R);q?(N=q.parent.id,w=q.index+1,V=m.slot??"default"):(N=m.id,w=m.children.length)}const M=(J=de(h))==null?void 0:J.defaultProps,O=u.addNode(N,h,w,V,M);O!==null&&a.selectNode(O)}return e.onMounted(()=>{window.addEventListener("keydown",L)}),e.onUnmounted(()=>{window.removeEventListener("keydown",L)}),e.provide(sn,l),e.provide(dn,a),e.provide(Oe,u),e.provide(ze,i),(h,R)=>(e.openBlock(),e.createElementBlock("div",Ka,[e.createVNode(Fo,{"can-undo":e.unref(a).canUndo.value,"can-redo":e.unref(a).canRedo.value,"is-dirty":e.unref(l).isDirty.value,viewport:e.unref(a).viewport.value,"custom-viewport-width":p.value,"custom-viewport-height":g.value,"active-viewport-width":k.value,"active-viewport-height":v.value,onUndo:C,onRedo:f,onSave:D,onViewportChange:F,onCustomViewportChange:oe},null,8,["can-undo","can-redo","is-dirty","viewport","custom-viewport-width","custom-viewport-height","active-viewport-width","active-viewport-height"]),e.createElementVNode("div",Ha,[e.createVNode(Ir,{open:e.unref(a).leftDrawerOpen.value,content:e.unref(l).content.value,"selected-node-id":e.unref(a).selectedNodeId.value,onToggle:e.unref(a).toggleLeftDrawer,onSelect:e.unref(a).selectNode,onAdd:he,onDragStart:Ne,onDragEnd:be},null,8,["open","content","selected-node-id","onToggle","onSelect"]),e.createVNode(Ua,{content:e.unref(l).content.value,variables:e.unref(l).variables.value,"selected-node-id":e.unref(a).selectedNodeId.value,"hovered-node-id":e.unref(a).hoveredNodeId.value,viewport:e.unref(a).viewport.value,"viewport-width":e.unref(a).viewport.value==="custom"?p.value:null,"viewport-height":e.unref(a).viewport.value==="custom"?g.value:null,onSelect:e.unref(a).selectNode,onHover:e.unref(a).hoverNode,onContextAction:x,onIframeKeydown:Y,onViewportSizeChange:te},null,8,["content","variables","selected-node-id","hovered-node-id","viewport","viewport-width","viewport-height","onSelect","onHover"]),e.createVNode(Ea,{open:e.unref(a).rightDrawerOpen.value,"selected-node-id":e.unref(a).selectedNodeId.value,content:e.unref(l).content.value,onToggle:e.unref(a).toggleRightDrawer,onUpdateProps:e.unref(u).updateNodeProps,onDelete:b,onDuplicate:d},null,8,["open","selected-node-id","content","onToggle","onUpdateProps"])])]))}}),Nn=H(ja,[["__scopeId","data-v-2a96c483"]]),Fa={key:0,class:"ipb-page-builder__warning",role:"alert"},Wa=e.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(t){const o=t,n=new Set;function r(E,C,f){n.has(E)||(n.add(E),j("INVALID_PAGE_DATA",C,{details:f}),void 0)}const l=e.computed(()=>o.pageData),a=e.computed(()=>o.mode==="read"||o.mode==="edit"?o.mode:(r("invalid-mode",`[PageBuilder] Unknown mode "${String(o.mode)}". Falling back to "read".`,{mode:o.mode}),"read")),i=e.computed(()=>rt(l.value)),u=e.computed(()=>{const E=De(l.value.content,"content"),C=De(l.value.layout,"layout");return E.isValid&&C.isValid}),p=e.computed(()=>a.value==="edit"&&!u.value),g=e.inject(Zt,null),k=e.computed(()=>o.locale??(g==null?void 0:g.locale)??Le),v=e.computed(()=>qt(at,g==null?void 0:g.messages,o.messages)),D=lt(()=>k.value,()=>v.value);return e.watch(i,E=>{E.isValid||r("invalid-page-data","[PageBuilder] Invalid pageData payload detected. Rendering continues with degraded behavior.",{errors:E.errors})},{immediate:!0}),e.provide(Jt,{locale:k,t:D}),(E,C)=>(e.openBlock(),e.createElementBlock(e.Fragment,null,[p.value?(e.openBlock(),e.createElementBlock("div",Fa,e.toDisplayString(e.unref(D)("pageBuilder.warning.invalidEditMode")),1)):e.createCommentVNode("",!0),a.value==="read"||p.value?(e.openBlock(),e.createBlock(ln,{key:1,"page-data":l.value},null,8,["page-data"])):(e.openBlock(),e.createBlock(Nn,{key:2,"page-data":l.value,onSave:C[0]||(C[0]=f=>E.$emit("save",f)),onChange:C[1]||(C[1]=f=>E.$emit("change",f))},null,8,["page-data"]))],64))}}),En=H(Wa,[["__scopeId","data-v-84b8d079"]]),Rt=new WeakSet;function $t(t){const o=[];for(const n of t){const r=n.name.trim(),l=de(r);if(!l){o.push(n);continue}if(l.component!==n.component)throw j("DUPLICATE_COMPONENT",`[PageBuilder] Component "${r}" is already registered with a different implementation.`,{details:{componentName:r}})}o.length>0&&At(o)}const Ga={install(t,o={}){if(Rt.has(t))return;Rt.add(t);const{components:n=[],registerBuiltIn:r=!0,globalName:l="PageBuilder",locale:a,messages:i}=o;t.provide(Zt,{locale:a,messages:i}),r&&$t(Yt),n.length>0&&$t(n),l!==!1&&t.component(l,En)}},Ya={type:Object};exports.DEFAULT_LOCALE=Le;exports.DRAG_DROP_KEY=ze;exports.EDITOR_KEY=dn;exports.NODE_TREE_KEY=Oe;exports.NodeRenderer=dt;exports.PAGE_BUILDER_KEY=sn;exports.PageBuilder=En;exports.PageBuilderError=Qe;exports.PageBuilderPlugin=Ga;exports.PageEditor=Nn;exports.PageReader=ln;exports.PbColumn=zt;exports.PbContainer=Gt;exports.PbImage=jt;exports.PbRow=Ut;exports.PbSection=Wt;exports.PbText=Ht;exports.PbVideo=Ft;exports.VIEWPORT_PRESETS=ke;exports.builderOptionsPropType=Ya;exports.builtInComponents=Yt;exports.clearRegistry=Un;exports.cloneTree=en;exports.computeWindowRange=bn;exports.countNodes=vo;exports.createNode=on;exports.createStableNodeKey=gn;exports.createTranslator=lt;exports.createVirtualTreeIndexMaps=Yo;exports.defaultTranslations=at;exports.findNodeById=A;exports.findParent=G;exports.flattenTree=vn;exports.getComponent=de;exports.getComponentsByCategory=Ot;exports.getMaxId=ve;exports.getRegisteredComponents=On;exports.hasComponent=zn;exports.insertNode=it;exports.interpolateProps=rn;exports.isPageBuilderError=Rn;exports.mergeTranslations=qt;exports.moveNode=nn;exports.normalizeSafeHtmlTag=ot;exports.registerComponent=Ln;exports.registerComponents=At;exports.removeNode=tn;exports.replaceComponent=An;exports.resolveComponent=Mt;exports.sanitizeRichTextHtml=nt;exports.sanitizeUrlByKind=Z;exports.sliceWindow=Go;exports.translate=Xt;exports.unregisterComponent=Mn;exports.useDragDrop=mn;exports.useEditor=un;exports.useNodeTree=fn;exports.usePageBuilder=cn;exports.usePageBuilderI18n=ee;exports.validateNode=De;exports.validatePageData=rt;exports.walkTree=st;
|
|
33
33
|
//# sourceMappingURL=index.cjs.map
|