@improba/page-builder 0.1.0 → 0.2.0

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